diff --git a/reactos/lib/shell32/Makefile.in b/reactos/lib/shell32/Makefile.in new file mode 100644 index 00000000000..393750a5cbc --- /dev/null +++ b/reactos/lib/shell32/Makefile.in @@ -0,0 +1,92 @@ +EXTRADEFS = -D_SHELL32_ -DCOM_NO_WINDOWS_H +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = shell32.dll +IMPORTS = shlwapi comctl32 user32 gdi32 advapi32 kernel32 +DELAYIMPORTS = ole32 +EXTRALIBS = -luuid $(LIBUNICODE) + +C_SRCS = \ + authors.c \ + autocomplete.c \ + brsfolder.c \ + changenotify.c \ + classes.c \ + clipboard.c \ + control.c \ + cpanelfolder.c \ + dataobject.c \ + debughlp.c \ + dialogs.c \ + dragdrophelper.c \ + enumidlist.c \ + folders.c \ + iconcache.c \ + memorystream.c \ + pidl.c \ + regsvr.c \ + shell32_main.c \ + shelllink.c \ + shellole.c \ + shellord.c \ + shellpath.c \ + shellreg.c \ + shellstring.c \ + shfldr_desktop.c \ + shfldr_fs.c \ + shfldr_mycomp.c \ + shlexec.c \ + shlfileop.c \ + shlfolder.c \ + shlfsbind.c \ + shlmenu.c \ + shlview.c \ + shpolicy.c \ + shv_bg_cmenu.c \ + shv_item_cmenu.c \ + ros-systray.c + +RC_SRCS = shres.rc +RC_BINSRC = shres.rc +RC_BINARIES = \ + cdrom.ico \ + desktop.ico \ + document.ico \ + drive.ico \ + floppy.ico \ + folder.ico \ + folder_open.ico \ + mycomputer.ico \ + netdrive.ico \ + netdrive2.ico \ + ramdisk.ico + +C_SRCS16 = shell.c +RC_SRCS16 = version16.rc +SPEC_SRCS16 = shell.spec + +SUBDIRS = tests + +@MAKE_DLL_RULES@ + +# Special rules for 16-bit resource files + +version16.res: version16.rc + $(LDPATH) $(RC16) $(RC16FLAGS) -fo$@ $(SRCDIR)/version16.rc + +shell.spec.c: shell.spec version16.res + $(WINEBUILD) $(DEFS) $(DLLFLAGS) -o $@ --main-module $(MODULE) --res version16.res --dll $(SRCDIR)/shell.spec + +authors.c: $(TOPSRCDIR)/AUTHORS + (LC_ALL=C; export LC_ALL; echo 'const char * const SHELL_Authors[] = {' && \ + sed -e '1,2d' -e 's/\(.*\)/ \"\1\",/' $(TOPSRCDIR)/AUTHORS && \ + echo ' 0 };') >$@ || ($(RM) $@ && false) + +depend: authors.c + +clean:: + $(RM) authors.c + +### Dependencies: diff --git a/reactos/lib/shell32/Makefile.ros-template b/reactos/lib/shell32/Makefile.ros-template new file mode 100644 index 00000000000..45570a3d639 --- /dev/null +++ b/reactos/lib/shell32/Makefile.ros-template @@ -0,0 +1,30 @@ +# $Id: Makefile.ros-template 11910 2004-12-03 23:37:44Z blight $ + +TARGET_NAME = shell32 + +TARGET_OBJECTS = @C_SRCS@ + +TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ + +TARGET_SDKLIBS = wine.a @IMPORTS@ ole32.a wine_uuid.a ntdll.a + +TARGET_BASE = $(TARGET_BASE_LIB_SHELL32) + +TARGET_RC_SRCS = @RC_SRCS@ +TARGET_RC_BINSRC = @RC_BINSRC@ +TARGET_RC_BINARIES = @RC_BINARIES@ + +TARGET_CLEAN = authors.c + +default: all + +authors.c: +ifeq ($(HOST),mingw32-linux) + echo 'const char * const SHELL_Authors[] = { "Copyright 1993-2004 WINE team", "Copyright 1998-2004 ReactOS team", 0 };' > authors.c +else + echo const char * const SHELL_Authors[] = { "Copyright 1993-2004 WINE team", "Copyright 1998-2004 ReactOS team", 0 }; > authors.c +endif + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/shell32/autocomplete.c b/reactos/lib/shell32/autocomplete.c new file mode 100644 index 00000000000..bca20030cf6 --- /dev/null +++ b/reactos/lib/shell32/autocomplete.c @@ -0,0 +1,646 @@ +/* + * AutoComplete interfaces implementation. + * + * Copyright 2004 Maxime Bellengé + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Implemented: + - ACO_AUTOAPPEND style + - ACO_AUTOSUGGEST style + - ACO_UPDOWNKEYDROPSLIST style + + - Handle pwzsRegKeyPath and pwszQuickComplete in Init + + TODO: + - implement ACO_SEARCH style + - implement ACO_FILTERPREFIXES style + - implement ACO_USETAB style + - implement ACO_RTLREADING style + + */ +#include "config.h" + +#include +#include +#include + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "undocshell.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" + +#include "pidl.h" +#include "shlguid.h" +#include "shlobj.h" +#include "shldisp.h" +#include "debughlp.h" + +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +typedef struct +{ + IAutoCompleteVtbl *lpVtbl; + IAutoComplete2Vtbl *lpvtblAutoComplete2; + DWORD ref; + BOOL enabled; + HWND hwndEdit; + HWND hwndListBox; + WNDPROC wpOrigEditProc; + WNDPROC wpOrigLBoxProc; + WCHAR *txtbackup; + WCHAR *quickComplete; + IEnumString *enumstr; + AUTOCOMPLETEOPTIONS options; +} IAutoCompleteImpl; + +static struct IAutoCompleteVtbl acvt; +static struct IAutoComplete2Vtbl ac2vt; + +#define _IAutoComplete2_Offset ((int)(&(((IAutoCompleteImpl*)0)->lpvtblAutoComplete2))) +#define _ICOM_THIS_From_IAutoComplete2(class, name) class* This = (class*)(((char*)name)-_IAutoComplete2_Offset); + +/* + converts This to a interface pointer +*/ +#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl) +#define _IAutoComplete2_(This) (IAutoComplete2*)&(This->lpvtblAutoComplete2) + +static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +static LRESULT APIENTRY ACLBoxSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +/************************************************************************** + * IAutoComplete_Constructor + */ +HRESULT WINAPI IAutoComplete_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +{ + IAutoCompleteImpl *lpac; + + if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown)) + return CLASS_E_NOAGGREGATION; + + lpac = (IAutoCompleteImpl*)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(IAutoCompleteImpl)); + if (!lpac) + return E_OUTOFMEMORY; + + lpac->ref = 1; + lpac->lpVtbl = &acvt; + lpac->lpvtblAutoComplete2 = &ac2vt; + lpac->enabled = TRUE; + lpac->enumstr = NULL; + lpac->options = ACO_AUTOAPPEND; + lpac->wpOrigEditProc = NULL; + lpac->hwndListBox = NULL; + lpac->txtbackup = NULL; + lpac->quickComplete = NULL; + + if (!SUCCEEDED (IUnknown_QueryInterface (_IUnknown_ (lpac), riid, ppv))) { + IUnknown_Release (_IUnknown_ (lpac)); + return E_NOINTERFACE; + } + + TRACE("-- (%p)->\n",lpac); + + return S_OK; +} + +/************************************************************************** + * AutoComplete_QueryInterface + */ +static HRESULT WINAPI IAutoComplete_fnQueryInterface( + IAutoComplete * iface, + REFIID riid, + LPVOID *ppvObj) +{ + IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface; + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n", This, shdebugstr_guid(riid), ppvObj); + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown)) + { + *ppvObj = This; + } + else if(IsEqualIID(riid, &IID_IAutoComplete)) + { + *ppvObj = (IAutoComplete*)This; + } + else if(IsEqualIID(riid, &IID_IAutoComplete2)) + { + *ppvObj = _IAutoComplete2_ (This); + } + + if (*ppvObj) + { + IAutoComplete_AddRef((IAutoComplete*)*ppvObj); + TRACE("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +/****************************************************************************** + * IAutoComplete_fnAddRef + */ +static ULONG WINAPI IAutoComplete_fnAddRef( + IAutoComplete * iface) +{ + IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface; + + TRACE("(%p)->(%lu)\n",This,This->ref); + return ++(This->ref); +} + +/****************************************************************************** + * IAutoComplete_fnRelease + */ +static ULONG WINAPI IAutoComplete_fnRelease( + IAutoComplete * iface) +{ + IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface; + + TRACE("(%p)->(%lu)\n",This,This->ref); + + if (!--(This->ref)) { + TRACE(" destroying IAutoComplete(%p)\n",This); + if (This->quickComplete) + HeapFree(GetProcessHeap(), 0, This->quickComplete); + if (This->txtbackup) + HeapFree(GetProcessHeap(), 0, This->txtbackup); + if (This->hwndListBox) + DestroyWindow(This->hwndListBox); + if (This->enumstr) + IEnumString_Release(This->enumstr); + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return This->ref; +} + +/****************************************************************************** + * IAutoComplete_fnEnable + */ +static HRESULT WINAPI IAutoComplete_fnEnable( + IAutoComplete * iface, + BOOL fEnable) +{ + IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface; + + HRESULT hr = S_OK; + + TRACE("(%p)->(%s)\n", This, (fEnable)?"true":"false"); + + This->enabled = fEnable; + + return hr; +} + +/****************************************************************************** + * IAutoComplete_fnInit + */ +static HRESULT WINAPI IAutoComplete_fnInit( + IAutoComplete * iface, + HWND hwndEdit, + IUnknown *punkACL, + LPCOLESTR pwzsRegKeyPath, + LPCOLESTR pwszQuickComplete) +{ + IAutoCompleteImpl *This = (IAutoCompleteImpl *)iface; + static const WCHAR lbName[] = {'L','i','s','t','B','o','x',0}; + + TRACE("(%p)->(0x%08lx, %p, %s, %s)\n", + This, (long)hwndEdit, punkACL, debugstr_w(pwzsRegKeyPath), debugstr_w(pwszQuickComplete)); + + if (This->options & ACO_AUTOSUGGEST) TRACE(" ACO_AUTOSUGGEST\n"); + if (This->options & ACO_AUTOAPPEND) TRACE(" ACO_AUTOAPPEND\n"); + if (This->options & ACO_SEARCH) FIXME(" ACO_SEARCH not supported\n"); + if (This->options & ACO_FILTERPREFIXES) FIXME(" ACO_FILTERPREFIXES not supported\n"); + if (This->options & ACO_USETAB) FIXME(" ACO_USETAB not supported\n"); + if (This->options & ACO_UPDOWNKEYDROPSLIST) TRACE(" ACO_UPDOWNKEYDROPSLIST\n"); + if (This->options & ACO_RTLREADING) FIXME(" ACO_RTLREADING not supported\n"); + + This->hwndEdit = hwndEdit; + + if (!SUCCEEDED (IUnknown_QueryInterface (punkACL, &IID_IEnumString, (LPVOID*)&This->enumstr))) { + TRACE("No IEnumString interface\n"); + return E_NOINTERFACE; + } + + This->wpOrigEditProc = (WNDPROC) SetWindowLongPtrW( hwndEdit, GWLP_WNDPROC, (LONG_PTR) ACEditSubclassProc); + SetWindowLongPtrW( hwndEdit, GWLP_USERDATA, (LONG_PTR)This); + + if (This->options & ACO_AUTOSUGGEST) { + HWND hwndParent; + + hwndParent = GetParent(This->hwndEdit); + + /* FIXME : The listbox should be resizable with the mouse. WS_THICKFRAME looks ugly */ + This->hwndListBox = CreateWindowExW(0, lbName, NULL, + WS_BORDER | WS_CHILD | WS_VSCROLL | LBS_HASSTRINGS | LBS_NOTIFY | LBS_NOINTEGRALHEIGHT, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + hwndParent, NULL, + (HINSTANCE)GetWindowLongPtrW( hwndParent, GWLP_HINSTANCE ), NULL); + + if (This->hwndListBox) { + This->wpOrigLBoxProc = (WNDPROC) SetWindowLongPtrW( This->hwndListBox, GWLP_WNDPROC, (LONG_PTR) ACLBoxSubclassProc); + SetWindowLongPtrW( This->hwndListBox, GWLP_USERDATA, (LONG_PTR)This); + } + } + + if (pwzsRegKeyPath) { + WCHAR *key; + WCHAR result[MAX_PATH]; + WCHAR *value; + HKEY hKey = 0; + LONG res; + LONG len; + + /* pwszRegKeyPath contains the key as well as the value, so we split */ + key = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlenW(pwzsRegKeyPath)+1)*sizeof(WCHAR)); + strcpyW(key, pwzsRegKeyPath); + value = strrchrW(key, '\\'); + *value = 0; + value++; + /* Now value contains the value and buffer the key */ + res = RegOpenKeyExW(HKEY_CURRENT_USER, key, 0, KEY_READ, &hKey); + if (res != ERROR_SUCCESS) { + /* if the key is not found, MSDN states we must seek in HKEY_LOCAL_MACHINE */ + res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &hKey); + } + if (res == ERROR_SUCCESS) { + res = RegQueryValueW(hKey, value, result, &len); + if (res == ERROR_SUCCESS) { + This->quickComplete = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len*sizeof(WCHAR)); + strcpyW(This->quickComplete, result); + } + RegCloseKey(hKey); + } + HeapFree(GetProcessHeap(), 0, key); + } + + if ((pwszQuickComplete) && (!This->quickComplete)) { + This->quickComplete = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlenW(pwszQuickComplete)+1)*sizeof(WCHAR)); + lstrcpyW(This->quickComplete, pwszQuickComplete); + } + + return S_OK; +} + +/************************************************************************** + * IAutoComplete_fnVTable + */ +static IAutoCompleteVtbl acvt = +{ + IAutoComplete_fnQueryInterface, + IAutoComplete_fnAddRef, + IAutoComplete_fnRelease, + IAutoComplete_fnInit, + IAutoComplete_fnEnable, +}; + +/************************************************************************** + * AutoComplete2_QueryInterface + */ +static HRESULT WINAPI IAutoComplete2_fnQueryInterface( + IAutoComplete2 * iface, + REFIID riid, + LPVOID *ppvObj) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj); + + return IAutoComplete_QueryInterface((IAutoComplete*)This, riid, ppvObj); +} + +/****************************************************************************** + * IAutoComplete2_fnAddRef + */ +static ULONG WINAPI IAutoComplete2_fnAddRef( + IAutoComplete2 * iface) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl,iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IAutoComplete2_AddRef((IAutoComplete*)This); +} + +/****************************************************************************** + * IAutoComplete2_fnRelease + */ +static ULONG WINAPI IAutoComplete2_fnRelease( + IAutoComplete2 * iface) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl,iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IAutoComplete_Release((IAutoComplete*)This); +} + +/****************************************************************************** + * IAutoComplete2_fnEnable + */ +static HRESULT WINAPI IAutoComplete2_fnEnable( + IAutoComplete2 * iface, + BOOL fEnable) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE ("(%p)->(%s)\n", This, (fEnable)?"true":"false"); + + return IAutoComplete_Enable((IAutoComplete*)This, fEnable); +} + +/****************************************************************************** + * IAutoComplete2_fnInit + */ +static HRESULT WINAPI IAutoComplete2_fnInit( + IAutoComplete2 * iface, + HWND hwndEdit, + IUnknown *punkACL, + LPCOLESTR pwzsRegKeyPath, + LPCOLESTR pwszQuickComplete) +{ + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE("(%p)\n", This); + + return IAutoComplete_Init((IAutoComplete*)This, hwndEdit, punkACL, pwzsRegKeyPath, pwszQuickComplete); +} + +/************************************************************************** + * IAutoComplete_fnGetOptions + */ +static HRESULT WINAPI IAutoComplete2_fnGetOptions( + IAutoComplete2 * iface, + DWORD *pdwFlag) +{ + HRESULT hr = S_OK; + + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE("(%p) -> (%p)\n", This, pdwFlag); + + *pdwFlag = This->options; + + return hr; +} + +/************************************************************************** + * IAutoComplete_fnSetOptions + */ +static HRESULT WINAPI IAutoComplete2_fnSetOptions( + IAutoComplete2 * iface, + DWORD dwFlag) +{ + HRESULT hr = S_OK; + + _ICOM_THIS_From_IAutoComplete2(IAutoCompleteImpl, iface); + + TRACE("(%p) -> (0x%lx)\n", This, dwFlag); + + This->options = dwFlag; + + return hr; +} + +/************************************************************************** + * IAutoComplete2_fnVTable + */ +static IAutoComplete2Vtbl ac2vt = +{ + IAutoComplete2_fnQueryInterface, + IAutoComplete2_fnAddRef, + IAutoComplete2_fnRelease, + IAutoComplete2_fnInit, + IAutoComplete2_fnEnable, + /* IAutoComplete2 */ + IAutoComplete2_fnSetOptions, + IAutoComplete2_fnGetOptions, +}; + +/* + Window procedure for autocompletion + */ +static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + IAutoCompleteImpl *This = (IAutoCompleteImpl *)GetWindowLongPtrW(hwnd, GWLP_USERDATA); + LPOLESTR strs; + HRESULT hr; + WCHAR hwndText[255]; + WCHAR *hwndQCText; + RECT r; + BOOL control, filled, displayall = FALSE; + int cpt, height, sel; + + if (!This->enabled) return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam); + + switch (uMsg) + { + case CB_SHOWDROPDOWN: + ShowWindow(This->hwndListBox, SW_HIDE); + break; + case WM_KILLFOCUS: + if ((This->options && ACO_AUTOSUGGEST) && + ((HWND)wParam != This->hwndListBox)) + { + ShowWindow(This->hwndListBox, SW_HIDE); + } + break; + case WM_KEYUP: + + GetWindowTextW( hwnd, (LPWSTR)hwndText, 255); + + switch(wParam) { + case VK_RETURN: + /* If quickComplete is set and control is pressed, replace the string */ + control = GetKeyState(VK_CONTROL) & 0x8000; + if (control && This->quickComplete) { + hwndQCText = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + (lstrlenW(This->quickComplete)+lstrlenW(hwndText))*sizeof(WCHAR)); + sel = sprintfW(hwndQCText, This->quickComplete, hwndText); + SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)hwndQCText); + SendMessageW(hwnd, EM_SETSEL, 0, sel); + HeapFree(GetProcessHeap(), 0, hwndQCText); + } + + ShowWindow(This->hwndListBox, SW_HIDE); + return 0; + case VK_LEFT: + case VK_RIGHT: + return 0; + case VK_UP: + case VK_DOWN: + /* Two cases here : + - if the listbox is not visible, displays it + with all the entries if the style ACO_UPDOWNKEYDROPSLIST + is present but does not select anything. + - if the listbox is visible, change the selection + */ + if ( (This->options & (ACO_AUTOSUGGEST | ACO_UPDOWNKEYDROPSLIST)) + && (!IsWindowVisible(This->hwndListBox) && (! *hwndText)) ) + { + /* We must dispays all the entries */ + displayall = TRUE; + } else { + if (IsWindowVisible(This->hwndListBox)) { + int count; + + count = SendMessageW(This->hwndListBox, LB_GETCOUNT, 0, 0); + /* Change the selection */ + sel = SendMessageW(This->hwndListBox, LB_GETCURSEL, 0, 0); + if (wParam == VK_UP) + sel = ((sel-1)<0)?count-1:sel-1; + else + sel = ((sel+1)>= count)?-1:sel+1; + SendMessageW(This->hwndListBox, LB_SETCURSEL, sel, 0); + if (sel != -1) { + WCHAR *msg; + int len; + + len = SendMessageW(This->hwndListBox, LB_GETTEXTLEN, sel, (LPARAM)NULL); + msg = (WCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (len+1)*sizeof(WCHAR)); + SendMessageW(This->hwndListBox, LB_GETTEXT, sel, (LPARAM)msg); + SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)msg); + SendMessageW(hwnd, EM_SETSEL, lstrlenW(msg), lstrlenW(msg)); + HeapFree(GetProcessHeap(), 0, msg); + } else { + SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)This->txtbackup); + SendMessageW(hwnd, EM_SETSEL, lstrlenW(This->txtbackup), lstrlenW(This->txtbackup)); + } + } + return 0; + } + break; + case VK_BACK: + case VK_DELETE: + if ((! *hwndText) && (This->options & ACO_AUTOSUGGEST)) { + ShowWindow(This->hwndListBox, SW_HIDE); + return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam); + } + if (This->options & ACO_AUTOAPPEND) { + DWORD b; + SendMessageW(hwnd, EM_GETSEL, (WPARAM)&b, (LPARAM)NULL); + if (b>1) { + hwndText[b-1] = '\0'; + } else { + hwndText[0] = '\0'; + SetWindowTextW(hwnd, hwndText); + } + } + break; + default: + ; + } + + SendMessageW(This->hwndListBox, LB_RESETCONTENT, 0, 0); + + HeapFree(GetProcessHeap(), 0, This->txtbackup); + This->txtbackup = (WCHAR*) HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, (lstrlenW(hwndText)+1)*sizeof(WCHAR)); + lstrcpyW(This->txtbackup, hwndText); + + /* Returns if there is no text to search and we doesn't want to display all the entries */ + if ((!displayall) && (! *hwndText) ) + break; + + IEnumString_Reset(This->enumstr); + filled = FALSE; + for(cpt = 0;;) { + hr = IEnumString_Next(This->enumstr, 1, &strs, NULL); + if (hr != S_OK) + break; + + if ((LPWSTR)strstrW(strs, hwndText) == strs) { + + if (This->options & ACO_AUTOAPPEND) { + SetWindowTextW(hwnd, strs); + SendMessageW(hwnd, EM_SETSEL, lstrlenW(hwndText), lstrlenW(strs)); + break; + } + + if (This->options & ACO_AUTOSUGGEST) { + SendMessageW(This->hwndListBox, LB_ADDSTRING, 0, (LPARAM)strs); + filled = TRUE; + cpt++; + } + } + } + + if (This->options & ACO_AUTOSUGGEST) { + if (filled) { + height = SendMessageW(This->hwndListBox, LB_GETITEMHEIGHT, 0, 0); + SendMessageW(This->hwndListBox, LB_CARETOFF, 0, 0); + GetWindowRect(hwnd, &r); + SetParent(This->hwndListBox, HWND_DESKTOP); + /* It seems that Windows XP displays 7 lines at most + and otherwise displays a vertical scroll bar */ + SetWindowPos(This->hwndListBox, HWND_TOP, + r.left, r.bottom + 1, r.right - r.left, min(height * 7, height*(cpt+1)), + SWP_SHOWWINDOW ); + } else { + ShowWindow(This->hwndListBox, SW_HIDE); + } + } + + break; + default: + return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam); + + } + + return 0; +} + +static LRESULT APIENTRY ACLBoxSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + IAutoCompleteImpl *This = (IAutoCompleteImpl *)GetWindowLongPtrW(hwnd, GWLP_USERDATA); + WCHAR *msg; + int sel = -1, len; + + switch (uMsg) { + case WM_MOUSEMOVE: + sel = SendMessageW(hwnd, LB_ITEMFROMPOINT, 0, lParam); + SendMessageW(hwnd, LB_SETCURSEL, (WPARAM)sel, (LPARAM)0); + break; + case WM_LBUTTONDOWN: + len = SendMessageW(This->hwndListBox, LB_GETTEXTLEN, sel, (LPARAM)NULL); + msg = (WCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (len+1)*sizeof(WCHAR)); + sel = (INT)SendMessageW(hwnd, LB_GETCURSEL, 0, 0); + SendMessageW(hwnd, LB_GETTEXT, sel, (LPARAM)msg); + SendMessageW(This->hwndEdit, WM_SETTEXT, 0, (LPARAM)msg); + SendMessageW(This->hwndEdit, EM_SETSEL, 0, lstrlenW(msg)); + ShowWindow(hwnd, SW_HIDE); + HeapFree(GetProcessHeap(), 0, msg); + break; + default: + return CallWindowProcW(This->wpOrigLBoxProc, hwnd, uMsg, wParam, lParam); + } + return 0; +} diff --git a/reactos/lib/shell32/brsfolder.c b/reactos/lib/shell32/brsfolder.c new file mode 100644 index 00000000000..cfce80ce132 --- /dev/null +++ b/reactos/lib/shell32/brsfolder.c @@ -0,0 +1,517 @@ +/* + * Copyright 1999 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * FIXME: + * - many memory leaks + * - many flags unimplemented + */ + +#include +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "wine/debug.h" +#include "undocshell.h" +#include "shlguid.h" +#include "pidl.h" +#include "shell32_main.h" +#include "shellapi.h" +#include "shresdef.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +static HWND hwndTreeView; +static LPBROWSEINFOW lpBrowseInfo; +static LPITEMIDLIST pidlRet; + +static void FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent, IEnumIDList* lpe); +static HTREEITEM InsertTreeViewItem(IShellFolder * lpsf, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlParent, IEnumIDList* pEnumIL, HTREEITEM hParent); + +#define SUPPORTEDFLAGS (BIF_STATUSTEXT | \ + BIF_BROWSEFORCOMPUTER | \ + BIF_RETURNFSANCESTORS | \ + BIF_RETURNONLYFSDIRS | \ + BIF_BROWSEINCLUDEFILES) + +static inline DWORD BrowseFlagsToSHCONTF(UINT ulFlags) +{ + return SHCONTF_FOLDERS | (ulFlags & BIF_BROWSEINCLUDEFILES ? SHCONTF_NONFOLDERS : 0); +} + +static void InitializeTreeView(HWND hwndParent, LPCITEMIDLIST root) +{ + HIMAGELIST hImageList; + IShellFolder * lpsf; + HRESULT hr; + IEnumIDList * pEnumIL = NULL; + LPITEMIDLIST parentofroot; + parentofroot = ILClone(root); + ILRemoveLastID(parentofroot); + + hwndTreeView = GetDlgItem (hwndParent, IDD_TREEVIEW); + Shell_GetImageList(NULL, &hImageList); + + TRACE("dlg=%p tree=%p\n", hwndParent, hwndTreeView ); + + if (hImageList && hwndTreeView) + TreeView_SetImageList(hwndTreeView, hImageList, 0); + + if (_ILIsDesktop (root)) { + hr = SHGetDesktopFolder(&lpsf); + } else { + IShellFolder * lpsfdesktop; + + hr = SHGetDesktopFolder(&lpsfdesktop); + if (SUCCEEDED(hr)) { + hr = IShellFolder_BindToObject(lpsfdesktop, parentofroot, 0,(REFIID)&IID_IShellFolder,(LPVOID *)&lpsf); + IShellFolder_Release(lpsfdesktop); + } + } + if (SUCCEEDED(hr)) + { + IShellFolder * pSFRoot; + if (_ILIsPidlSimple(root)) + { + pSFRoot = lpsf; + IShellFolder_AddRef(pSFRoot); + } + else + hr = IShellFolder_BindToObject(lpsf,ILFindLastID(root),0,&IID_IShellFolder,(LPVOID *)&pSFRoot); + if (SUCCEEDED(hr)) + { + hr = IShellFolder_EnumObjects( + pSFRoot, + hwndParent, + BrowseFlagsToSHCONTF(lpBrowseInfo->ulFlags), + &pEnumIL); + IShellFolder_Release(pSFRoot); + } + } + + if (SUCCEEDED(hr) && hwndTreeView) + { + TreeView_DeleteAllItems(hwndTreeView); + TreeView_Expand(hwndTreeView, + InsertTreeViewItem(lpsf, _ILIsPidlSimple(root) ? root : ILFindLastID(root), parentofroot, pEnumIL, TVI_ROOT), + TVE_EXPAND); + } + + if (SUCCEEDED(hr)) + IShellFolder_Release(lpsf); + + TRACE("done\n"); +} + +static int GetIcon(LPITEMIDLIST lpi, UINT uFlags) +{ + SHFILEINFOW sfi; + SHGetFileInfoW((LPCWSTR)lpi, 0 ,&sfi, sizeof(SHFILEINFOW), uFlags); + return sfi.iIcon; +} + +static void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, LPTVITEMW lpTV_ITEM) +{ + LPITEMIDLIST pidlDesktop = NULL; + + TRACE("%p %p\n",lpifq, lpTV_ITEM); + + if (!lpifq) + { + pidlDesktop = _ILCreateDesktop(); + lpifq = pidlDesktop; + } + + lpTV_ITEM->iImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON); + lpTV_ITEM->iSelectedImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON); + + if (pidlDesktop) + ILFree(pidlDesktop); + + return; +} + +typedef struct tagID +{ + LPSHELLFOLDER lpsfParent; + LPITEMIDLIST lpi; + LPITEMIDLIST lpifq; + IEnumIDList* pEnumIL; +} TV_ITEMDATA, *LPTV_ITEMDATA; + +static BOOL GetName(LPSHELLFOLDER lpsf, LPCITEMIDLIST lpi, DWORD dwFlags, LPWSTR lpFriendlyName) +{ + BOOL bSuccess=TRUE; + STRRET str; + + TRACE("%p %p %lx %p\n", lpsf, lpi, dwFlags, lpFriendlyName); + if (SUCCEEDED(IShellFolder_GetDisplayNameOf(lpsf, lpi, dwFlags, &str))) + { + if (FAILED(StrRetToStrNW(lpFriendlyName, MAX_PATH, &str, lpi))) + { + bSuccess = FALSE; + } + } + else + bSuccess = FALSE; + + TRACE("-- %s\n", debugstr_w(lpFriendlyName)); + return bSuccess; +} + +static HTREEITEM InsertTreeViewItem(IShellFolder * lpsf, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlParent, IEnumIDList* pEnumIL, HTREEITEM hParent) +{ + TVITEMW tvi; + TVINSERTSTRUCTW tvins; + WCHAR szBuff[MAX_PATH]; + LPTV_ITEMDATA lptvid=0; + + tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; + + tvi.cChildren= pEnumIL ? 1 : 0; + tvi.mask |= TVIF_CHILDREN; + + if (!(lptvid = (LPTV_ITEMDATA)SHAlloc(sizeof(TV_ITEMDATA)))) + return NULL; + + if (!GetName(lpsf, pidl, SHGDN_NORMAL, szBuff)) + return NULL; + + tvi.pszText = szBuff; + tvi.cchTextMax = MAX_PATH; + tvi.lParam = (LPARAM)lptvid; + + IShellFolder_AddRef(lpsf); + lptvid->lpsfParent = lpsf; + lptvid->lpi = ILClone(pidl); + lptvid->lpifq = pidlParent ? ILCombine(pidlParent, pidl) : ILClone(pidl); + lptvid->pEnumIL = pEnumIL; + GetNormalAndSelectedIcons(lptvid->lpifq, &tvi); + + tvins.u.item = tvi; + tvins.hInsertAfter = NULL; + tvins.hParent = hParent; + + return (HTREEITEM)TreeView_InsertItemW(hwndTreeView, &tvins); +} + +static void FillTreeView(IShellFolder * lpsf, LPITEMIDLIST pidl, HTREEITEM hParent, IEnumIDList* lpe) +{ + HTREEITEM hPrev = 0; + LPITEMIDLIST pidlTemp = 0; + ULONG ulFetched; + HRESULT hr; + HWND hwnd=GetParent(hwndTreeView); + + TRACE("%p %p %x\n",lpsf, pidl, (INT)hParent); + SetCapture(GetParent(hwndTreeView)); + SetCursor(LoadCursorA(0, (LPSTR)IDC_WAIT)); + + while (NOERROR == IEnumIDList_Next(lpe,1,&pidlTemp,&ulFetched)) + { + ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER; + IEnumIDList* pEnumIL = NULL; + IShellFolder* pSFChild = NULL; + IShellFolder_GetAttributesOf(lpsf, 1, (LPCITEMIDLIST*)&pidlTemp, &ulAttrs); + if (ulAttrs & SFGAO_FOLDER) + { + hr = IShellFolder_BindToObject(lpsf,pidlTemp,NULL,&IID_IShellFolder,(LPVOID*)&pSFChild); + if (SUCCEEDED(hr)) + { + hr = IShellFolder_EnumObjects(pSFChild, hwnd, BrowseFlagsToSHCONTF(lpBrowseInfo->ulFlags), &pEnumIL); + if (SUCCEEDED(hr)) + { + if ((IEnumIDList_Skip(pEnumIL, 1) != S_OK) || FAILED(IEnumIDList_Reset(pEnumIL))) + { + IEnumIDList_Release(pEnumIL); + pEnumIL = NULL; + } + } + IShellFolder_Release(pSFChild); + } + } + + if (!(hPrev = InsertTreeViewItem(lpsf, pidlTemp, pidl, pEnumIL, hParent))) + goto Done; + SHFree(pidlTemp); /* Finally, free the pidl that the shell gave us... */ + pidlTemp=NULL; + } + +Done: + ReleaseCapture(); + SetCursor(LoadCursorW(0, (LPWSTR)IDC_ARROW)); + + if (pidlTemp) + SHFree(pidlTemp); +} + +static inline BOOL PIDLIsType(LPCITEMIDLIST pidl, PIDLTYPE type) +{ + LPPIDLDATA data = _ILGetDataPointer(pidl); + if (!data) + return FALSE; + return (data->type == type); +} + +static void BrsFolder_CheckValidSelection(HWND hWndTree, LPTV_ITEMDATA lptvid) +{ + LPCITEMIDLIST pidl = lptvid->lpi; + BOOL bEnabled = TRUE; + DWORD dwAttributes; + if ((lpBrowseInfo->ulFlags & BIF_BROWSEFORCOMPUTER) && + !PIDLIsType(pidl, PT_COMP)) + bEnabled = FALSE; + if (lpBrowseInfo->ulFlags & BIF_RETURNFSANCESTORS) + { + dwAttributes = SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM; + if (FAILED(IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1, (LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes)) || + !dwAttributes) + bEnabled = FALSE; + } + if (lpBrowseInfo->ulFlags & BIF_RETURNONLYFSDIRS) + { + dwAttributes = SFGAO_FOLDER | SFGAO_FILESYSTEM; + if (FAILED(IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1, (LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes)) || + (dwAttributes != (SFGAO_FOLDER | SFGAO_FILESYSTEM))) + bEnabled = FALSE; + } + SendMessageW(hWndTree, BFFM_ENABLEOK, 0, (LPARAM)bEnabled); +} + +static LRESULT MsgNotify(HWND hWnd, UINT CtlID, LPNMHDR lpnmh) +{ + NMTREEVIEWW *pnmtv = (NMTREEVIEWW *)lpnmh; + LPTV_ITEMDATA lptvid; /* Long pointer to TreeView item data */ + IShellFolder * lpsf2=0; + + + TRACE("%p %x %p msg=%x\n", hWnd, CtlID, lpnmh, pnmtv->hdr.code); + + switch (pnmtv->hdr.idFrom) + { case IDD_TREEVIEW: + switch (pnmtv->hdr.code) + { + case TVN_DELETEITEMA: + case TVN_DELETEITEMW: + TRACE("TVN_DELETEITEMA/W\n"); + lptvid=(LPTV_ITEMDATA)pnmtv->itemOld.lParam; + IShellFolder_Release(lptvid->lpsfParent); + if (lptvid->pEnumIL) + IEnumIDList_Release(lptvid->pEnumIL); + SHFree(lptvid->lpi); + SHFree(lptvid->lpifq); + SHFree(lptvid); + break; + + case TVN_ITEMEXPANDINGA: + case TVN_ITEMEXPANDINGW: + { + TRACE("TVN_ITEMEXPANDINGA/W\n"); + if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE)) + break; + + lptvid=(LPTV_ITEMDATA)pnmtv->itemNew.lParam; + if (SUCCEEDED(IShellFolder_BindToObject(lptvid->lpsfParent, lptvid->lpi,0,(REFIID)&IID_IShellFolder,(LPVOID *)&lpsf2))) + { FillTreeView( lpsf2, lptvid->lpifq, pnmtv->itemNew.hItem, lptvid->pEnumIL); + } + TreeView_SortChildren(hwndTreeView, pnmtv->itemNew.hItem, FALSE); + } + break; + case TVN_SELCHANGEDA: + case TVN_SELCHANGEDW: + lptvid=(LPTV_ITEMDATA)pnmtv->itemNew.lParam; + pidlRet = lptvid->lpifq; + if (lpBrowseInfo->lpfn) + (lpBrowseInfo->lpfn)(hWnd, BFFM_SELCHANGED, (LPARAM)pidlRet, lpBrowseInfo->lParam); + BrsFolder_CheckValidSelection(hWnd, lptvid); + break; + + default: + WARN("unhandled (%d)\n", pnmtv->hdr.code); + break; + } + break; + + default: + break; + } + + return 0; +} + + +/************************************************************************* + * BrsFolderDlgProc32 (not an exported API function) + */ +static INT_PTR CALLBACK BrsFolderDlgProc(HWND hWnd, UINT msg, WPARAM wParam, + LPARAM lParam ) +{ + TRACE("hwnd=%p msg=%04x 0x%08x 0x%08lx\n", hWnd, msg, wParam, lParam ); + + switch(msg) + { case WM_INITDIALOG: + pidlRet = NULL; + lpBrowseInfo = (LPBROWSEINFOW) lParam; + if (lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS) + FIXME("flags %x not implemented\n", lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS); + if (lpBrowseInfo->lpszTitle) { + SetWindowTextW(GetDlgItem(hWnd, IDD_TITLE), lpBrowseInfo->lpszTitle); + } else { + ShowWindow(GetDlgItem(hWnd, IDD_TITLE), SW_HIDE); + } + if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT)) + ShowWindow(GetDlgItem(hWnd, IDD_STATUS), SW_HIDE); + + InitializeTreeView(hWnd, lpBrowseInfo->pidlRoot); + + if (lpBrowseInfo->lpfn) + (lpBrowseInfo->lpfn)(hWnd, BFFM_INITIALIZED, 0, lpBrowseInfo->lParam); + + return TRUE; + + case WM_NOTIFY: + MsgNotify( hWnd, (UINT)wParam, (LPNMHDR)lParam); + break; + + case WM_COMMAND: + switch (wParam) + { case IDOK: + pdump ( pidlRet ); + if (lpBrowseInfo->pszDisplayName) + SHGetPathFromIDListW(pidlRet, lpBrowseInfo->pszDisplayName); + EndDialog(hWnd, (DWORD) ILClone(pidlRet)); + return TRUE; + + case IDCANCEL: + EndDialog(hWnd, 0); + return TRUE; + } + break; + case BFFM_SETSTATUSTEXTA: + TRACE("Set status %s\n", debugstr_a((LPSTR)lParam)); + SetWindowTextA(GetDlgItem(hWnd, IDD_STATUS), (LPSTR)lParam); + break; + case BFFM_SETSTATUSTEXTW: + TRACE("Set status %s\n", debugstr_w((LPWSTR)lParam)); + SetWindowTextW(GetDlgItem(hWnd, IDD_STATUS), (LPWSTR)lParam); + break; + case BFFM_ENABLEOK: + TRACE("Enable %ld\n", lParam); + EnableWindow(GetDlgItem(hWnd, 1), (lParam)?TRUE:FALSE); + break; + case BFFM_SETOKTEXT: /* unicode only */ + TRACE("Set OK text %s\n", debugstr_w((LPWSTR)wParam)); + SetWindowTextW(GetDlgItem(hWnd, 1), (LPWSTR)wParam); + break; + case BFFM_SETSELECTIONA: + if (wParam) + FIXME("Set selection %s\n", debugstr_a((LPSTR)lParam)); + else + FIXME("Set selection %p\n", (void*)lParam); + break; + case BFFM_SETSELECTIONW: + if (wParam) + FIXME("Set selection %s\n", debugstr_w((LPWSTR)lParam)); + else + FIXME("Set selection %p\n", (void*)lParam); + break; + case BFFM_SETEXPANDED: /* unicode only */ + if (wParam) + FIXME("Set expanded %s\n", debugstr_w((LPWSTR)lParam)); + else + FIXME("Set expanded %p\n", (void*)lParam); + break; + } + return FALSE; +} + +static const WCHAR swBrowseTempName[] = {'S','H','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0}; + +/************************************************************************* + * SHBrowseForFolderA [SHELL32.@] + * SHBrowseForFolder [SHELL32.@] + */ +LPITEMIDLIST WINAPI SHBrowseForFolderA (LPBROWSEINFOA lpbi) +{ + BROWSEINFOW bi; + LPITEMIDLIST lpid; + INT len; + + TRACE("(%p{lpszTitle=%s,owner=%p})\n", lpbi, + lpbi ? debugstr_a(lpbi->lpszTitle) : NULL, lpbi ? lpbi->hwndOwner : NULL); + + if (!lpbi) + return NULL; + + bi.hwndOwner = lpbi->hwndOwner; + bi.pidlRoot = lpbi->pidlRoot; + if (lpbi->pszDisplayName) + { + /*lpbi->pszDisplayName is assumed to be MAX_PATH (MSDN) */ + bi.pszDisplayName = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpbi->pszDisplayName, -1, bi.pszDisplayName, MAX_PATH); + } + else + bi.pszDisplayName = NULL; + + if (lpbi->lpszTitle) + { + len = MultiByteToWideChar(CP_ACP, 0, lpbi->lpszTitle, -1, NULL, 0); + bi.lpszTitle = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpbi->lpszTitle, -1, (LPWSTR)bi.lpszTitle, len); + } + else + bi.lpszTitle = NULL; + + bi.ulFlags = lpbi->ulFlags; + bi.lpfn = lpbi->lpfn; + bi.lParam = lpbi->lParam; + bi.iImage = lpbi->iImage; + lpid = (LPITEMIDLIST) DialogBoxParamW(shell32_hInstance, + swBrowseTempName, lpbi->hwndOwner, + BrsFolderDlgProc, (INT)&bi); + if (bi.pszDisplayName) + { + WideCharToMultiByte(CP_ACP, 0, bi.pszDisplayName, -1, lpbi->pszDisplayName, MAX_PATH, 0, NULL); + HeapFree(GetProcessHeap(), 0, bi.pszDisplayName); + } + if (bi.lpszTitle) + { + HeapFree(GetProcessHeap(), 0, (LPVOID)bi.lpszTitle); + } + lpbi->iImage = bi.iImage; + return lpid; +} + + +/************************************************************************* + * SHBrowseForFolderW [SHELL32.@] + */ +LPITEMIDLIST WINAPI SHBrowseForFolderW (LPBROWSEINFOW lpbi) +{ + TRACE("((%p->{lpszTitle=%s,owner=%p})\n", lpbi, + lpbi ? debugstr_w(lpbi->lpszTitle) : NULL, lpbi ? lpbi->hwndOwner : 0); + + if (!lpbi) + return NULL; + + return (LPITEMIDLIST) DialogBoxParamW(shell32_hInstance, + swBrowseTempName, lpbi->hwndOwner, + BrsFolderDlgProc, (INT)lpbi); +} diff --git a/reactos/lib/shell32/changenotify.c b/reactos/lib/shell32/changenotify.c new file mode 100644 index 00000000000..e252cf44c31 --- /dev/null +++ b/reactos/lib/shell32/changenotify.c @@ -0,0 +1,484 @@ +/* + * shell change notification + * + * Copyright 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#include "windef.h" +#include "winbase.h" +#include "wine/debug.h" +#include "wingdi.h" +#include "pidl.h" +#include "shell32_main.h" +#include "undocshell.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +static CRITICAL_SECTION SHELL32_ChangenotifyCS; +static CRITICAL_SECTION_DEBUG critsect_debug = +{ + 0, 0, &SHELL32_ChangenotifyCS, + { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, + 0, 0, { 0, (DWORD)(__FILE__ ": SHELL32_ChangenotifyCS") } +}; +static CRITICAL_SECTION SHELL32_ChangenotifyCS = { &critsect_debug, -1, 0, 0, 0, 0 }; + +typedef SHChangeNotifyEntry *LPNOTIFYREGISTER; + +/* internal list of notification clients (internal) */ +typedef struct _NOTIFICATIONLIST +{ + struct _NOTIFICATIONLIST *next; + struct _NOTIFICATIONLIST *prev; + HWND hwnd; /* window to notify */ + DWORD uMsg; /* message to send */ + LPNOTIFYREGISTER apidl; /* array of entries to watch*/ + UINT cidl; /* number of pidls in array */ + LONG wEventMask; /* subscribed events */ + LONG wSignalledEvent; /* event that occurred */ + DWORD dwFlags; /* client flags */ + LPCITEMIDLIST pidlSignaled; /*pidl of the path that caused the signal*/ + +} NOTIFICATIONLIST, *LPNOTIFICATIONLIST; + +static NOTIFICATIONLIST *head, *tail; + +#define SHCNE_NOITEMEVENTS ( \ + SHCNE_ASSOCCHANGED ) + +#define SHCNE_ONEITEMEVENTS ( \ + SHCNE_ATTRIBUTES | SHCNE_CREATE | SHCNE_DELETE | SHCNE_DRIVEADD | \ + SHCNE_DRIVEADDGUI | SHCNE_DRIVEREMOVED | SHCNE_FREESPACE | \ + SHCNE_MEDIAINSERTED | SHCNE_MEDIAREMOVED | SHCNE_MKDIR | \ + SHCNE_NETSHARE | SHCNE_NETUNSHARE | SHCNE_RMDIR | \ + SHCNE_SERVERDISCONNECT | SHCNE_UPDATEDIR | SHCNE_UPDATEIMAGE ) + +#define SHCNE_TWOITEMEVENTS ( \ + SHCNE_RENAMEFOLDER | SHCNE_RENAMEITEM | SHCNE_UPDATEITEM ) + +/* for dumping events */ +static const char * DumpEvent( LONG event ) +{ + if( event == SHCNE_ALLEVENTS ) + return "SHCNE_ALLEVENTS"; +#define DUMPEV(x) ,( event & SHCNE_##x )? #x " " : "" + return wine_dbg_sprintf( "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s" + DUMPEV(RENAMEITEM) + DUMPEV(CREATE) + DUMPEV(DELETE) + DUMPEV(MKDIR) + DUMPEV(RMDIR) + DUMPEV(MEDIAINSERTED) + DUMPEV(MEDIAREMOVED) + DUMPEV(DRIVEREMOVED) + DUMPEV(DRIVEADD) + DUMPEV(NETSHARE) + DUMPEV(NETUNSHARE) + DUMPEV(ATTRIBUTES) + DUMPEV(UPDATEDIR) + DUMPEV(UPDATEITEM) + DUMPEV(SERVERDISCONNECT) + DUMPEV(UPDATEIMAGE) + DUMPEV(DRIVEADDGUI) + DUMPEV(RENAMEFOLDER) + DUMPEV(FREESPACE) + DUMPEV(EXTENDED_EVENT) + DUMPEV(ASSOCCHANGED) + DUMPEV(INTERRUPT) + ); +#undef DUMPEV +} + +static const char * NodeName(LPNOTIFICATIONLIST item) +{ + const char *str; + WCHAR path[MAX_PATH]; + + if(SHGetPathFromIDListW(item->apidl[0].pidl, path )) + str = wine_dbg_sprintf("%s", debugstr_w(path)); + else + str = wine_dbg_sprintf("" ); + return str; +} + +static void AddNode(LPNOTIFICATIONLIST item) +{ + TRACE("item %p\n", item ); + + /* link items */ + item->prev = tail; + item->next = NULL; + if( tail ) + tail->next = item; + else + head = item; + tail = item; +} + +static LPNOTIFICATIONLIST FindNode( HANDLE hitem ) +{ + LPNOTIFICATIONLIST ptr; + for( ptr = head; ptr; ptr = ptr->next ) + if( ptr == (LPNOTIFICATIONLIST) hitem ) + return ptr; + return NULL; +} + +static void DeleteNode(LPNOTIFICATIONLIST item) +{ + UINT i; + + TRACE("item=%p prev=%p next=%p\n", item, item->prev, item->next); + + /* remove item from list */ + if( item->prev ) + item->prev->next = item->next; + else + head = item->next; + if( item->next ) + item->next->prev = item->prev; + else + tail = item->prev; + + /* free the item */ + for (i=0; icidl; i++) + SHFree((LPITEMIDLIST)item->apidl[i].pidl); + SHFree(item->apidl); + SHFree(item); +} + +void InitChangeNotifications(void) +{ +} + +void FreeChangeNotifications(void) +{ + TRACE("\n"); + + EnterCriticalSection(&SHELL32_ChangenotifyCS); + + while( head ) + DeleteNode( head ); + + LeaveCriticalSection(&SHELL32_ChangenotifyCS); + + DeleteCriticalSection(&SHELL32_ChangenotifyCS); +} + +/************************************************************************* + * SHChangeNotifyRegister [SHELL32.2] + * + */ +ULONG WINAPI +SHChangeNotifyRegister( + HWND hwnd, + int fSources, + LONG wEventMask, + UINT uMsg, + int cItems, + SHChangeNotifyEntry *lpItems) +{ + LPNOTIFICATIONLIST item; + int i; + + item = SHAlloc(sizeof(NOTIFICATIONLIST)); + + TRACE("(%p,0x%08x,0x%08lx,0x%08x,%d,%p) item=%p\n", + hwnd, fSources, wEventMask, uMsg, cItems, lpItems, item); + + item->next = NULL; + item->prev = NULL; + item->cidl = cItems; + item->apidl = SHAlloc(sizeof(SHChangeNotifyEntry) * cItems); + for(i=0;iapidl[i].pidl = ILClone(lpItems[i].pidl); + item->apidl[i].fRecursive = lpItems[i].fRecursive; + } + item->hwnd = hwnd; + item->uMsg = uMsg; + item->wEventMask = wEventMask; + item->wSignalledEvent = 0; + item->dwFlags = fSources; + + TRACE("new node: %s\n", NodeName( item )); + + EnterCriticalSection(&SHELL32_ChangenotifyCS); + + AddNode(item); + + LeaveCriticalSection(&SHELL32_ChangenotifyCS); + + return (ULONG)item; +} + +/************************************************************************* + * SHChangeNotifyDeregister [SHELL32.4] + */ +BOOL WINAPI SHChangeNotifyDeregister(ULONG hNotify) +{ + LPNOTIFICATIONLIST node; + + TRACE("(0x%08lx)\n", hNotify); + + EnterCriticalSection(&SHELL32_ChangenotifyCS); + + node = FindNode((HANDLE)hNotify); + if( node ) + DeleteNode(node); + + LeaveCriticalSection(&SHELL32_ChangenotifyCS); + + return node?TRUE:FALSE; +} + +/************************************************************************* + * SHChangeNotifyUpdateEntryList [SHELL32.5] + */ +BOOL WINAPI SHChangeNotifyUpdateEntryList(DWORD unknown1, DWORD unknown2, + DWORD unknown3, DWORD unknown4) +{ + FIXME("(0x%08lx, 0x%08lx, 0x%08lx, 0x%08lx)\n", + unknown1, unknown2, unknown3, unknown4); + + return -1; +} + +static BOOL should_notify( LPCITEMIDLIST changed, LPCITEMIDLIST watched, BOOL sub ) +{ + TRACE("%p %p %d\n", changed, watched, sub ); + if ( !watched ) + return FALSE; + if (ILIsEqual( watched, changed ) ) + return TRUE; + if( sub && ILIsParent( watched, changed, FALSE ) ) + return TRUE; + return FALSE; +} + +/************************************************************************* + * SHChangeNotify [SHELL32.@] + */ +void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2) +{ + LPCITEMIDLIST Pidls[2]; + LPNOTIFICATIONLIST ptr; + UINT typeFlag = uFlags & SHCNF_TYPE; + + Pidls[0] = NULL; + Pidls[1] = NULL; + + TRACE("(0x%08lx,0x%08x,%p,%p):stub.\n", wEventId, uFlags, dwItem1, dwItem2); + + if( ( wEventId & SHCNE_NOITEMEVENTS ) && ( dwItem1 || dwItem2 ) ) + { + TRACE("dwItem1 and dwItem2 are not zero, but should be\n"); + dwItem1 = 0; + dwItem2 = 0; + return; + } + else if( ( wEventId & SHCNE_ONEITEMEVENTS ) && dwItem2 ) + { + TRACE("dwItem2 is not zero, but should be\n"); + dwItem2 = 0; + return; + } + + if( ( ( wEventId & SHCNE_NOITEMEVENTS ) && + ( wEventId & ~SHCNE_NOITEMEVENTS ) ) || + ( ( wEventId & SHCNE_ONEITEMEVENTS ) && + ( wEventId & ~SHCNE_ONEITEMEVENTS ) ) || + ( ( wEventId & SHCNE_TWOITEMEVENTS ) && + ( wEventId & ~SHCNE_TWOITEMEVENTS ) ) ) + { + WARN("mutually incompatible events listed\n"); + return; + } + + /* convert paths in IDLists*/ + switch (typeFlag) + { + case SHCNF_PATHA: + if (dwItem1) Pidls[0] = SHSimpleIDListFromPathA((LPCSTR)dwItem1); + if (dwItem2) Pidls[1] = SHSimpleIDListFromPathA((LPCSTR)dwItem2); + break; + case SHCNF_PATHW: + if (dwItem1) Pidls[0] = SHSimpleIDListFromPathW((LPCWSTR)dwItem1); + if (dwItem2) Pidls[1] = SHSimpleIDListFromPathW((LPCWSTR)dwItem2); + break; + case SHCNF_IDLIST: + Pidls[0] = (LPCITEMIDLIST)dwItem1; + Pidls[1] = (LPCITEMIDLIST)dwItem2; + break; + case SHCNF_PRINTERA: + case SHCNF_PRINTERW: + FIXME("SHChangeNotify with (uFlags & SHCNF_PRINTER)\n"); + return; + case SHCNF_DWORD: + default: + FIXME("unknown type %08x\n",typeFlag); + return; + } + + { + WCHAR path[MAX_PATH]; + + if( Pidls[0] && SHGetPathFromIDListW(Pidls[0], path )) + TRACE("notify %08lx on item1 = %s\n", wEventId, debugstr_w(path)); + + if( Pidls[1] && SHGetPathFromIDListW(Pidls[1], path )) + TRACE("notify %08lx on item2 = %s\n", wEventId, debugstr_w(path)); + } + + EnterCriticalSection(&SHELL32_ChangenotifyCS); + + /* loop through the list */ + for( ptr = head; ptr; ptr = ptr->next ) + { + BOOL notify; + DWORD i; + + notify = FALSE; + + TRACE("trying %p\n", ptr); + + for( i=0; (icidl) && !notify ; i++ ) + { + LPCITEMIDLIST pidl = ptr->apidl[i].pidl; + BOOL subtree = ptr->apidl[i].fRecursive; + + if (wEventId & ptr->wEventMask) + { + if( !pidl ) /* all ? */ + notify = TRUE; + else if( wEventId & SHCNE_NOITEMEVENTS ) + notify = TRUE; + else if( wEventId & ( SHCNE_ONEITEMEVENTS | SHCNE_TWOITEMEVENTS ) ) + notify = should_notify( Pidls[0], pidl, subtree ); + else if( wEventId & SHCNE_TWOITEMEVENTS ) + notify = should_notify( Pidls[1], pidl, subtree ); + } + } + + if( !notify ) + continue; + + ptr->pidlSignaled = ILClone(Pidls[0]); + + TRACE("notifying %s, event %s(%lx) before\n", NodeName( ptr ), DumpEvent( + wEventId ),wEventId ); + + ptr->wSignalledEvent |= wEventId; + + if (ptr->dwFlags & SHCNRF_NewDelivery) + SendMessageA(ptr->hwnd, ptr->uMsg, (WPARAM) ptr, (LPARAM) GetCurrentProcessId()); + else + SendMessageA(ptr->hwnd, ptr->uMsg, (WPARAM)Pidls, wEventId); + + TRACE("notifying %s, event %s(%lx) after\n", NodeName( ptr ), DumpEvent( + wEventId ),wEventId ); + + } + TRACE("notify Done\n"); + LeaveCriticalSection(&SHELL32_ChangenotifyCS); + + /* if we allocated it, free it. The ANSI flag is also set in its Unicode sibling. */ + if ((typeFlag & SHCNF_PATHA) || (typeFlag & SHCNF_PRINTERA)) + { + if (Pidls[0]) SHFree((LPITEMIDLIST)Pidls[0]); + if (Pidls[1]) SHFree((LPITEMIDLIST)Pidls[1]); + } +} + +/************************************************************************* + * NTSHChangeNotifyRegister [SHELL32.640] + * NOTES + * Idlist is an array of structures and Count specifies how many items in the array + * (usually just one I think). + */ +DWORD WINAPI NTSHChangeNotifyRegister( + HWND hwnd, + LONG events1, + LONG events2, + DWORD msg, + int count, + SHChangeNotifyEntry *idlist) +{ + FIXME("(%p,0x%08lx,0x%08lx,0x%08lx,0x%08x,%p):semi stub.\n", + hwnd,events1,events2,msg,count,idlist); + + return (DWORD) SHChangeNotifyRegister(hwnd, events1, events2, msg, count, idlist); +} + +/************************************************************************* + * SHChangeNotification_Lock [SHELL32.644] + */ +HANDLE WINAPI SHChangeNotification_Lock( + HANDLE hChange, + DWORD dwProcessId, + LPITEMIDLIST **lppidls, + LPLONG lpwEventId) +{ + DWORD i; + LPNOTIFICATIONLIST node; + LPCITEMIDLIST *idlist; + + TRACE("%p %08lx %p %p\n", hChange, dwProcessId, lppidls, lpwEventId); + + /* EnterCriticalSection(&SHELL32_ChangenotifyCS); */ + + node = FindNode( hChange ); + if( node ) + { + idlist = SHAlloc( sizeof(LPCITEMIDLIST *) * node->cidl ); + for(i=0; icidl; i++) + idlist[i] = (LPCITEMIDLIST)node->pidlSignaled; + *lpwEventId = node->wSignalledEvent; + *lppidls = (LPITEMIDLIST*)idlist; + node->wSignalledEvent = 0; + } + else + ERR("Couldn't find %p\n", hChange ); + + /* LeaveCriticalSection(&SHELL32_ChangenotifyCS); */ + + return (HANDLE) node; +} + +/************************************************************************* + * SHChangeNotification_Unlock [SHELL32.645] + */ +BOOL WINAPI SHChangeNotification_Unlock ( HANDLE hLock) +{ + TRACE("\n"); + return 1; +} + +/************************************************************************* + * NTSHChangeNotifyDeregister [SHELL32.641] + */ +DWORD WINAPI NTSHChangeNotifyDeregister(ULONG x1) +{ + FIXME("(0x%08lx):semi stub.\n",x1); + + return SHChangeNotifyDeregister( x1 ); +} diff --git a/reactos/lib/shell32/classes.c b/reactos/lib/shell32/classes.c new file mode 100644 index 00000000000..9c56a5b557f --- /dev/null +++ b/reactos/lib/shell32/classes.c @@ -0,0 +1,380 @@ +/* + * file type mapping + * (HKEY_CLASSES_ROOT - Stuff) + * + * Copyright 1998, 1999, 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include +#include "wine/debug.h" +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wingdi.h" +#include "winuser.h" + +#include "shlobj.h" +#include "shell32_main.h" +#include "shlguid.h" +#include "shresdef.h" +#include "shlwapi.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +#define MAX_EXTENSION_LENGTH 20 + +BOOL HCR_MapTypeToValueW(LPCWSTR szExtension, LPWSTR szFileType, DWORD len, BOOL bPrependDot) +{ + HKEY hkey; + WCHAR szTemp[MAX_EXTENSION_LENGTH + 2]; + + TRACE("%s %p\n", debugstr_w(szExtension), debugstr_w(szFileType)); + + /* added because we do not want to have double dots */ + if (szExtension[0] == '.') + bPrependDot = 0; + + if (bPrependDot) + szTemp[0] = '.'; + + lstrcpynW(szTemp + (bPrependDot?1:0), szExtension, MAX_EXTENSION_LENGTH); + + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szTemp, 0, 0x02000000, &hkey)) + { + return FALSE; + } + + if (RegQueryValueW(hkey, NULL, szFileType, &len)) + { + RegCloseKey(hkey); + return FALSE; + } + + RegCloseKey(hkey); + + TRACE("--UE;\n} %s\n", debugstr_w(szFileType)); + + return TRUE; +} + +BOOL HCR_MapTypeToValueA(LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL bPrependDot) +{ + HKEY hkey; + char szTemp[MAX_EXTENSION_LENGTH + 2]; + + TRACE("%s %p\n", szExtension, szFileType); + + /* added because we do not want to have double dots */ + if (szExtension[0] == '.') + bPrependDot = 0; + + if (bPrependDot) + szTemp[0] = '.'; + + lstrcpynA(szTemp + (bPrependDot?1:0), szExtension, MAX_EXTENSION_LENGTH); + + if (RegOpenKeyExA(HKEY_CLASSES_ROOT, szTemp, 0, 0x02000000, &hkey)) + { + return FALSE; + } + + if (RegQueryValueA(hkey, NULL, szFileType, &len)) + { + RegCloseKey(hkey); + return FALSE; + } + + RegCloseKey(hkey); + + TRACE("--UE;\n} %s\n", szFileType); + + return TRUE; +} + + +BOOL HCR_GetExecuteCommandW( HKEY hkeyClass, LPCWSTR szClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len ) +{ + static const WCHAR swShell[] = {'\\','s','h','e','l','l','\\',0}; + static const WCHAR swCommand[] = {'\\','c','o','m','m','a','n','d',0}; + BOOL ret = FALSE; + + TRACE("%p %s %s %p\n", hkeyClass, debugstr_w(szClass), debugstr_w(szVerb), szDest); + + if (szClass) + RegOpenKeyExW(HKEY_CLASSES_ROOT, szClass, 0, 0x02000000, &hkeyClass); + + if (hkeyClass) + { + WCHAR sTemp[MAX_PATH]; + lstrcpyW(sTemp, swShell); + lstrcatW(sTemp, szVerb); + lstrcatW(sTemp, swCommand); + + ret = (ERROR_SUCCESS == SHGetValueW(hkeyClass, sTemp, NULL, NULL, szDest, &len)); + + if (szClass) + RegCloseKey(hkeyClass); + } + + TRACE("-- %s\n", debugstr_w(szDest) ); + return ret; +} + +/*************************************************************************************** +* HCR_GetDefaultIcon [internal] +* +* Gets the icon for a filetype +*/ +static BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey) +{ + char xriid[50]; + sprintf( xriid, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + riid->Data1, riid->Data2, riid->Data3, + riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3], + riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] ); + + TRACE("%s\n",xriid ); + + return !RegOpenKeyExA(HKEY_CLASSES_ROOT, xriid, 0, KEY_READ, hkey); +} + +static BOOL HCR_RegGetDefaultIconW(HKEY hkey, LPWSTR szDest, DWORD len, LPDWORD dwNr) +{ + DWORD dwType; + WCHAR sTemp[MAX_PATH]; + WCHAR sNum[5]; + + if (!RegQueryValueExW(hkey, NULL, 0, &dwType, (LPBYTE)szDest, &len)) + { + if (dwType == REG_EXPAND_SZ) + { + ExpandEnvironmentStringsW(szDest, sTemp, MAX_PATH); + lstrcpynW(szDest, sTemp, len); + } + if (ParseFieldW (szDest, 2, sNum, 5)) + *dwNr = atoiW(sNum); + else + *dwNr=0; /* sometimes the icon number is missing */ + ParseFieldW (szDest, 1, szDest, len); + return TRUE; + } + return FALSE; +} + +static BOOL HCR_RegGetDefaultIconA(HKEY hkey, LPSTR szDest, DWORD len, LPDWORD dwNr) +{ + DWORD dwType; + char sTemp[MAX_PATH]; + char sNum[5]; + + if (!RegQueryValueExA(hkey, NULL, 0, &dwType, szDest, &len)) + { + if (dwType == REG_EXPAND_SZ) + { + ExpandEnvironmentStringsA(szDest, sTemp, MAX_PATH); + lstrcpynA(szDest, sTemp, len); + } + if (ParseFieldA (szDest, 2, sNum, 5)) + *dwNr=atoi(sNum); + else + *dwNr=0; /* sometimes the icon number is missing */ + ParseFieldA (szDest, 1, szDest, len); + return TRUE; + } + return FALSE; +} + +BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, LPDWORD dwNr) +{ + static const WCHAR swDefaultIcon[] = {'\\','D','e','f','a','u','l','t','I','c','o','n',0}; + HKEY hkey; + WCHAR sTemp[MAX_PATH]; + BOOL ret = FALSE; + + TRACE("%s\n",debugstr_w(szClass) ); + + lstrcpynW(sTemp, szClass, MAX_PATH); + lstrcatW(sTemp, swDefaultIcon); + + if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, sTemp, 0, 0x02000000, &hkey)) + { + ret = HCR_RegGetDefaultIconW(hkey, szDest, len, dwNr); + RegCloseKey(hkey); + } + TRACE("-- %s %li\n", debugstr_w(szDest), *dwNr ); + return ret; +} + +BOOL HCR_GetDefaultIconA(LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr) +{ + HKEY hkey; + char sTemp[MAX_PATH]; + BOOL ret = FALSE; + + TRACE("%s\n",szClass ); + + sprintf(sTemp, "%s\\DefaultIcon",szClass); + + if (!RegOpenKeyExA(HKEY_CLASSES_ROOT, sTemp, 0, 0x02000000, &hkey)) + { + ret = HCR_RegGetDefaultIconA(hkey, szDest, len, dwNr); + RegCloseKey(hkey); + } + TRACE("-- %s %li\n", szDest, *dwNr ); + return ret; +} + +BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, LPDWORD dwNr) +{ + HKEY hkey; + BOOL ret = FALSE; + + if (HCR_RegOpenClassIDKey(riid, &hkey)) + { + ret = HCR_RegGetDefaultIconW(hkey, szDest, len, dwNr); + RegCloseKey(hkey); + } + TRACE("-- %s %li\n", debugstr_w(szDest), *dwNr ); + return ret; +} + +/*************************************************************************************** +* HCR_GetClassName [internal] +* +* Gets the name of a registered class +*/ +static const WCHAR swEmpty[] = {0}; + +BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len) +{ + HKEY hkey; + BOOL ret = FALSE; + DWORD buflen = len; + + szDest[0] = 0; + if (HCR_RegOpenClassIDKey(riid, &hkey)) + { + if (!RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len)) + { + ret = TRUE; + } + RegCloseKey(hkey); + } + + if (!ret || !szDest[0]) + { + if(IsEqualIID(riid, &CLSID_ShellDesktop)) + { + if (LoadStringW(shell32_hInstance, IDS_DESKTOP, szDest, buflen)) + ret = TRUE; + } + else if (IsEqualIID(riid, &CLSID_MyComputer)) + { + if(LoadStringW(shell32_hInstance, IDS_MYCOMPUTER, szDest, buflen)) + ret = TRUE; + } + } + TRACE("-- %s\n", debugstr_w(szDest)); + return ret; +} + +BOOL HCR_GetClassNameA(REFIID riid, LPSTR szDest, DWORD len) +{ HKEY hkey; + BOOL ret = FALSE; + DWORD buflen = len; + + szDest[0] = 0; + if (HCR_RegOpenClassIDKey(riid, &hkey)) + { + if (!RegQueryValueExA(hkey,"",0,NULL,szDest,&len)) + { + ret = TRUE; + } + RegCloseKey(hkey); + } + + if (!ret || !szDest[0]) + { + if(IsEqualIID(riid, &CLSID_ShellDesktop)) + { + if (LoadStringA(shell32_hInstance, IDS_DESKTOP, szDest, buflen)) + ret = TRUE; + } + else if (IsEqualIID(riid, &CLSID_MyComputer)) + { + if(LoadStringA(shell32_hInstance, IDS_MYCOMPUTER, szDest, buflen)) + ret = TRUE; + } + } + + TRACE("-- %s\n", szDest); + + return ret; +} + +/*************************************************************************************** +* HCR_GetFolderAttributes [internal] +* +* gets the folder attributes of a class +* +* FIXME +* verify the defaultvalue for *szDest +*/ +BOOL HCR_GetFolderAttributes (REFIID riid, LPDWORD szDest) +{ HKEY hkey; + char xriid[60]; + DWORD attributes; + DWORD len = 4; + + sprintf( xriid, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + riid->Data1, riid->Data2, riid->Data3, + riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3], + riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] ); + TRACE("%s\n",xriid ); + + if (!szDest) return FALSE; + *szDest = SFGAO_FOLDER|SFGAO_FILESYSTEM; + + strcat (xriid, "\\ShellFolder"); + + if (RegOpenKeyExA(HKEY_CLASSES_ROOT,xriid,0,KEY_READ,&hkey)) + { + return FALSE; + } + + if (RegQueryValueExA(hkey,"Attributes",0,NULL,(LPBYTE)&attributes,&len)) + { + RegCloseKey(hkey); + return FALSE; + } + + RegCloseKey(hkey); + + TRACE("-- 0x%08lx\n", attributes); + + *szDest = attributes; + + return TRUE; +} diff --git a/reactos/lib/shell32/clipboard.c b/reactos/lib/shell32/clipboard.c new file mode 100644 index 00000000000..fe0d1bd20d7 --- /dev/null +++ b/reactos/lib/shell32/clipboard.c @@ -0,0 +1,270 @@ +/* + * clipboard helper functions + * + * Copyright 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * NOTES: + * + * For copy & paste functions within contextmenus does the shell use + * the OLE clipboard functions in combination with dataobjects. + * The OLE32.DLL gets loaded with LoadLibrary + * + * - a right mousebutton-copy sets the following formats: + * classic: + * Shell IDList Array + * Prefered Drop Effect + * Shell Object Offsets + * HDROP + * FileName + * ole: + * OlePrivateData (ClipboardDataObjectInterface) + * + */ + +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wingdi.h" +#include "pidl.h" +#include "undocshell.h" +#include "shell32_main.h" +#include "shlwapi.h" + +#include "wine/unicode.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/************************************************************************** + * RenderHDROP + * + * creates a CF_HDROP structure + */ +HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) +{ + UINT i; + int rootsize = 0,size = 0; + char szRootPath[MAX_PATH]; + char szFileName[MAX_PATH]; + HGLOBAL hGlobal; + DROPFILES *pDropFiles; + int offset; + + TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl); + + /* get the size needed */ + size = sizeof(DROPFILES); + + SHGetPathFromIDListA(pidlRoot, szRootPath); + PathAddBackslashA(szRootPath); + rootsize = strlen(szRootPath); + + for (i=0; ipFiles = sizeof(DROPFILES); + pDropFiles->fWide = FALSE; + + offset = pDropFiles->pFiles; + strcpy(szFileName, szRootPath); + + for (i=0; icidl = cidl; + + /* root pidl */ + offset = sizeof(CIDA) + sizeof (UINT)*(cidl); + pcida->aoffset[0] = offset; /* first element */ + sizePidl = ILGetSize (pidlRoot); + memcpy(((LPBYTE)pcida)+offset, pidlRoot, sizePidl); + offset += sizePidl; + + for(i=0; iaoffset[i+1] = offset; + sizePidl = ILGetSize(apidl[i]); + memcpy(((LPBYTE)pcida)+offset, apidl[i], sizePidl); + offset += sizePidl; + } + + GlobalUnlock(hGlobal); + return hGlobal; +} + +HGLOBAL RenderSHELLIDLISTOFFSET (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) +{ + FIXME("\n"); + return 0; +} + +HGLOBAL RenderFILECONTENTS (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) +{ + FIXME("\n"); + return 0; +} + +HGLOBAL RenderFILEDESCRIPTOR (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) +{ + FIXME("\n"); + return 0; +} + +HGLOBAL RenderFILENAMEA (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) +{ + int size = 0; + char szTemp[MAX_PATH], *szFileName; + LPITEMIDLIST pidl; + HGLOBAL hGlobal; + HRESULT hr; + + TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl); + + /* get path of combined pidl */ + pidl = ILCombine(pidlRoot, apidl[0]); + if (!pidl) + return 0; + + hr = SHELL_GetPathFromIDListA(pidl, szTemp, MAX_PATH); + SHFree(pidl); + if (FAILED(hr)) + return 0; + + size = strlen(szTemp) + 1; + + /* fill the structure */ + hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size); + if(!hGlobal) return hGlobal; + szFileName = (char *)GlobalLock(hGlobal); + memcpy(szFileName, szTemp, size); + GlobalUnlock(hGlobal); + + return hGlobal; +} + +HGLOBAL RenderFILENAMEW (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) +{ + int size = 0; + WCHAR szTemp[MAX_PATH], *szFileName; + LPITEMIDLIST pidl; + HGLOBAL hGlobal; + HRESULT hr; + + TRACE("(%p,%p,%u)\n", pidlRoot, apidl, cidl); + + /* get path of combined pidl */ + pidl = ILCombine(pidlRoot, apidl[0]); + if (!pidl) + return 0; + + hr = SHELL_GetPathFromIDListW(pidl, szTemp, MAX_PATH); + SHFree(pidl); + if (FAILED(hr)) + return 0; + + size = (strlenW(szTemp)+1) * sizeof(WCHAR); + + /* fill the structure */ + hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size); + if(!hGlobal) return hGlobal; + szFileName = (WCHAR *)GlobalLock(hGlobal); + memcpy(szFileName, szTemp, size); + GlobalUnlock(hGlobal); + + return hGlobal; +} + +HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags) +{ + DWORD * pdwFlag; + HGLOBAL hGlobal; + + TRACE("(0x%08lx)\n", dwFlags); + + hGlobal = GlobalAlloc(GHND|GMEM_SHARE, sizeof(DWORD)); + if(!hGlobal) return hGlobal; + pdwFlag = (DWORD*)GlobalLock(hGlobal); + *pdwFlag = dwFlags; + GlobalUnlock(hGlobal); + return hGlobal; +} + +/************************************************************************** + * IsDataInClipboard + * + * checks if there is something in the clipboard we can use + */ +BOOL IsDataInClipboard (HWND hwnd) +{ + BOOL ret = FALSE; + + if (OpenClipboard(hwnd)) + { + if (GetOpenClipboardWindow()) + { + ret = IsClipboardFormatAvailable(CF_TEXT); + } + CloseClipboard(); + } + return ret; +} diff --git a/reactos/lib/shell32/control.c b/reactos/lib/shell32/control.c new file mode 100644 index 00000000000..3d331d2185b --- /dev/null +++ b/reactos/lib/shell32/control.c @@ -0,0 +1,499 @@ +/* Control Panel management + * + * Copyright 2001 Eric Pouech + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "wine/winbase16.h" +#include "wownt32.h" +#include "wine/debug.h" +#include "cpl.h" +#include "wine/unicode.h" + +#define NO_SHLWAPI_REG +#include "shlwapi.h" + +#include "cpanel.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shlctrl); + +CPlApplet* Control_UnloadApplet(CPlApplet* applet) +{ + unsigned i; + CPlApplet* next; + + for (i = 0; i < applet->count; i++) { + if (!applet->info[i].dwSize) continue; + applet->proc(applet->hWnd, CPL_STOP, i, applet->info[i].lData); + } + if (applet->proc) applet->proc(applet->hWnd, CPL_EXIT, 0L, 0L); + FreeLibrary(applet->hModule); + next = applet->next; + HeapFree(GetProcessHeap(), 0, applet); + return next; +} + +CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel) +{ + CPlApplet* applet; + unsigned i; + CPLINFO info; + NEWCPLINFOW newinfo; + + if (!(applet = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*applet)))) + return applet; + + applet->hWnd = hWnd; + + if (!(applet->hModule = LoadLibraryW(cmd))) { + WARN("Cannot load control panel applet %s\n", debugstr_w(cmd)); + goto theError; + } + if (!(applet->proc = (APPLET_PROC)GetProcAddress(applet->hModule, "CPlApplet"))) { + WARN("Not a valid control panel applet %s\n", debugstr_w(cmd)); + goto theError; + } + if (!applet->proc(hWnd, CPL_INIT, 0L, 0L)) { + WARN("Init of applet has failed\n"); + goto theError; + } + if ((applet->count = applet->proc(hWnd, CPL_GETCOUNT, 0L, 0L)) == 0) { + WARN("No subprogram in applet\n"); + goto theError; + } + + applet = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, applet, + sizeof(*applet) + (applet->count - 1) * sizeof(NEWCPLINFOW)); + + for (i = 0; i < applet->count; i++) { + ZeroMemory(&newinfo, sizeof(newinfo)); + newinfo.dwSize = sizeof(NEWCPLINFOA); + applet->info[i].dwSize = sizeof(NEWCPLINFOW); + /* proc is supposed to return a null value upon success for + * CPL_INQUIRE and CPL_NEWINQUIRE + * However, real drivers don't seem to behave like this + * So, use introspection rather than return value + */ + applet->proc(hWnd, CPL_NEWINQUIRE, i, (LPARAM)&newinfo); + if (newinfo.hIcon == 0) { + applet->proc(hWnd, CPL_INQUIRE, i, (LPARAM)&info); + if (info.idIcon == 0 || info.idName == 0) { + WARN("Couldn't get info from sp %u\n", i); + applet->info[i].dwSize = 0; + } else { + /* convert the old data into the new structure */ + applet->info[i].dwFlags = 0; + applet->info[i].dwHelpContext = 0; + applet->info[i].lData = info.lData; + applet->info[i].hIcon = LoadIconW(applet->hModule, + MAKEINTRESOURCEW(info.idIcon)); + LoadStringW(applet->hModule, info.idName, + applet->info[i].szName, sizeof(applet->info[i].szName) / sizeof(WCHAR)); + LoadStringW(applet->hModule, info.idInfo, + applet->info[i].szInfo, sizeof(applet->info[i].szInfo) / sizeof(WCHAR)); + applet->info[i].szHelpFile[0] = '\0'; + } + } + else + { + CopyMemory(&applet->info[i], &newinfo, newinfo.dwSize); + if (newinfo.dwSize != sizeof(NEWCPLINFOW)) + { + applet->info[i].dwSize = sizeof(NEWCPLINFOW); + MultiByteToWideChar(CP_ACP, 0, ((LPNEWCPLINFOA)&newinfo)->szName, + sizeof(((LPNEWCPLINFOA)&newinfo)->szName) / sizeof(CHAR), + applet->info[i].szName, + sizeof(applet->info[i].szName) / sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, ((LPNEWCPLINFOA)&newinfo)->szInfo, + sizeof(((LPNEWCPLINFOA)&newinfo)->szInfo) / sizeof(CHAR), + applet->info[i].szInfo, + sizeof(applet->info[i].szInfo) / sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, ((LPNEWCPLINFOA)&newinfo)->szHelpFile, + sizeof(((LPNEWCPLINFOA)&newinfo)->szHelpFile) / sizeof(CHAR), + applet->info[i].szHelpFile, + sizeof(applet->info[i].szHelpFile) / sizeof(WCHAR)); + } + } + } + + applet->next = panel->first; + panel->first = applet; + + return applet; + + theError: + Control_UnloadApplet(applet); + return NULL; +} + +static void Control_WndProc_Create(HWND hWnd, const CREATESTRUCTA* cs) +{ + CPanel* panel = (CPanel*)cs->lpCreateParams; + + SetWindowLongA(hWnd, 0, (LPARAM)panel); + panel->status = 0; + panel->hWnd = hWnd; +} + +#define XICON 32 +#define XSTEP 128 +#define YICON 32 +#define YSTEP 64 + +static BOOL Control_Localize(const CPanel* panel, unsigned cx, unsigned cy, + CPlApplet** papplet, unsigned* psp) +{ + unsigned i, x = (XSTEP-XICON)/2, y = 0; + CPlApplet* applet; + RECT rc; + + GetClientRect(panel->hWnd, &rc); + for (applet = panel->first; applet; applet = applet->next) { + for (i = 0; i < applet->count; i++) { + if (!applet->info[i].dwSize) continue; + if (x + XSTEP >= rc.right - rc.left) { + x = (XSTEP-XICON)/2; + y += YSTEP; + } + if (cx >= x && cx < x + XICON && cy >= y && cy < y + YSTEP) { + *papplet = applet; + *psp = i; + return TRUE; + } + x += XSTEP; + } + } + return FALSE; +} + +static LRESULT Control_WndProc_Paint(const CPanel* panel, WPARAM wParam) +{ + HDC hdc; + PAINTSTRUCT ps; + RECT rc, txtRect; + unsigned i, x = 0, y = 0; + CPlApplet* applet; + HGDIOBJ hOldFont; + + hdc = (wParam) ? (HDC)wParam : BeginPaint(panel->hWnd, &ps); + hOldFont = SelectObject(hdc, GetStockObject(ANSI_VAR_FONT)); + GetClientRect(panel->hWnd, &rc); + for (applet = panel->first; applet; applet = applet->next) { + for (i = 0; i < applet->count; i++) { + if (x + XSTEP >= rc.right - rc.left) { + x = 0; + y += YSTEP; + } + if (!applet->info[i].dwSize) continue; + DrawIcon(hdc, x + (XSTEP-XICON)/2, y, applet->info[i].hIcon); + txtRect.left = x; + txtRect.right = x + XSTEP; + txtRect.top = y + YICON; + txtRect.bottom = y + YSTEP; + DrawTextW(hdc, applet->info[i].szName, -1, &txtRect, + DT_CENTER | DT_VCENTER); + x += XSTEP; + } + } + SelectObject(hdc, hOldFont); + if (!wParam) EndPaint(panel->hWnd, &ps); + return 0; +} + +static LRESULT Control_WndProc_LButton(CPanel* panel, LPARAM lParam, BOOL up) +{ + unsigned i; + CPlApplet* applet; + + if (Control_Localize(panel, LOWORD(lParam), HIWORD(lParam), &applet, &i)) { + if (up) { + if (panel->clkApplet == applet && panel->clkSP == i) { + applet->proc(applet->hWnd, CPL_DBLCLK, i, applet->info[i].lData); + } + } else { + panel->clkApplet = applet; + panel->clkSP = i; + } + } + return 0; +} + +static LRESULT WINAPI Control_WndProc(HWND hWnd, UINT wMsg, + WPARAM lParam1, LPARAM lParam2) +{ + CPanel* panel = (CPanel*)GetWindowLongA(hWnd, 0); + + if (panel || wMsg == WM_CREATE) { + switch (wMsg) { + case WM_CREATE: + Control_WndProc_Create(hWnd, (CREATESTRUCTA*)lParam2); + return 0; + case WM_DESTROY: + { + CPlApplet* applet = panel->first; + while (applet) + applet = Control_UnloadApplet(applet); + } + PostQuitMessage(0); + break; + case WM_PAINT: + return Control_WndProc_Paint(panel, lParam1); + case WM_LBUTTONUP: + return Control_WndProc_LButton(panel, lParam2, TRUE); + case WM_LBUTTONDOWN: + return Control_WndProc_LButton(panel, lParam2, FALSE); +/* EPP case WM_COMMAND: */ +/* EPP return Control_WndProc_Command(mwi, lParam1, lParam2); */ + } + } + + return DefWindowProcA(hWnd, wMsg, lParam1, lParam2); +} + +static void Control_DoInterface(CPanel* panel, HWND hWnd, HINSTANCE hInst) +{ + WNDCLASSA wc; + MSG msg; + const CHAR* appName = "Wine Control Panel"; + wc.style = CS_HREDRAW|CS_VREDRAW; + wc.lpfnWndProc = Control_WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = sizeof(CPlApplet*); + wc.hInstance = hInst; + wc.hIcon = 0; + wc.hCursor = 0; + wc.hbrBackground = GetStockObject(WHITE_BRUSH); + wc.lpszMenuName = NULL; + wc.lpszClassName = "Shell_Control_WndClass"; + + if (!RegisterClassA(&wc)) return; + + CreateWindowExA(0, wc.lpszClassName, appName, + WS_OVERLAPPEDWINDOW | WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + hWnd, NULL, hInst, panel); + if (!panel->hWnd) return; + + if (!panel->first) { + /* FIXME appName & message should be localized */ + MessageBoxA(panel->hWnd, "Cannot load any applets", appName, MB_OK); + return; + } + + while (GetMessageA(&msg, panel->hWnd, 0, 0)) { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } +} + +static void Control_DoWindow(CPanel* panel, HWND hWnd, HINSTANCE hInst) +{ + HANDLE h; + WIN32_FIND_DATAW fd; + WCHAR buffer[MAX_PATH]; + static const WCHAR wszAllCpl[] = {'*','.','c','p','l',0}; + WCHAR *p; + + GetSystemDirectoryW( buffer, MAX_PATH ); + p = buffer + strlenW(buffer); + *p++ = '\\'; + lstrcpyW(p, wszAllCpl); + + if ((h = FindFirstFileW(buffer, &fd)) != INVALID_HANDLE_VALUE) { + do { + lstrcpyW(p, fd.cFileName); + Control_LoadApplet(hWnd, buffer, panel); + } while (FindNextFileW(h, &fd)); + FindClose(h); + } + + Control_DoInterface(panel, hWnd, hInst); +} + +static void Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd) + /* forms to parse: + * foo.cpl,@sp,str + * foo.cpl,@sp + * foo.cpl,,str + * foo.cpl @sp + * foo.cpl str + * "a path\foo.cpl" + */ +{ + LPWSTR buffer; + LPWSTR beg = NULL; + LPWSTR end; + WCHAR ch; + LPWSTR ptr; + unsigned sp = 0; + LPWSTR extraPmts = NULL; + int quoted = 0; + + buffer = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(wszCmd) + 1) * sizeof(*wszCmd)); + if (!buffer) return; + + end = lstrcpyW(buffer, wszCmd); + + for (;;) { + ch = *end; + if (ch == '"') quoted = !quoted; + if (!quoted && (ch == ' ' || ch == ',' || ch == '\0')) { + *end = '\0'; + if (beg) { + if (*beg == '@') { + sp = atoiW(beg + 1); + } else if (*beg == '\0') { + sp = 0; + } else { + extraPmts = beg; + } + } + if (ch == '\0') break; + beg = end + 1; + if (ch == ' ') while (end[1] == ' ') end++; + } + end++; + } + while ((ptr = StrChrW(buffer, '"'))) + memmove(ptr, ptr+1, lstrlenW(ptr)*sizeof(WCHAR)); + + TRACE("cmd %s, extra %s, sp %d\n", debugstr_w(buffer), debugstr_w(extraPmts), sp); + + Control_LoadApplet(hWnd, buffer, panel); + + if (panel->first) { + CPlApplet* applet = panel->first; + + assert(applet && applet->next == NULL); + if (sp >= applet->count) { + WARN("Out of bounds (%u >= %u), setting to 0\n", sp, applet->count); + sp = 0; + } + if (applet->info[sp].dwSize) { + if (!applet->proc(applet->hWnd, CPL_STARTWPARMSA, sp, (LPARAM)extraPmts)) + applet->proc(applet->hWnd, CPL_DBLCLK, sp, applet->info[sp].lData); + } + Control_UnloadApplet(applet); + } + HeapFree(GetProcessHeap(), 0, buffer); +} + +/************************************************************************* + * Control_RunDLLW [SHELL32.@] + * + */ +void WINAPI Control_RunDLLW(HWND hWnd, HINSTANCE hInst, LPCWSTR cmd, DWORD nCmdShow) +{ + CPanel panel; + + TRACE("(%p, %p, %s, 0x%08lx)\n", + hWnd, hInst, debugstr_w(cmd), nCmdShow); + + memset(&panel, 0, sizeof(panel)); + + if (!cmd || !*cmd) { + Control_DoWindow(&panel, hWnd, hInst); + } else { + Control_DoLaunch(&panel, hWnd, cmd); + } +} + +/************************************************************************* + * Control_RunDLLA [SHELL32.@] + * + */ +void WINAPI Control_RunDLLA(HWND hWnd, HINSTANCE hInst, LPCSTR cmd, DWORD nCmdShow) +{ + DWORD len = MultiByteToWideChar(CP_ACP, 0, cmd, -1, NULL, 0 ); + LPWSTR wszCmd = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (wszCmd && MultiByteToWideChar(CP_ACP, 0, cmd, -1, wszCmd, len )) + { + Control_RunDLLW(hWnd, hInst, wszCmd, nCmdShow); + } + HeapFree(GetProcessHeap(), 0, wszCmd); +} + +/************************************************************************* + * Control_FillCache_RunDLLW [SHELL32.@] + * + */ +HRESULT WINAPI Control_FillCache_RunDLLW(HWND hWnd, HANDLE hModule, DWORD w, DWORD x) +{ + FIXME("%p %p 0x%08lx 0x%08lx stub\n", hWnd, hModule, w, x); + return 0; +} + +/************************************************************************* + * Control_FillCache_RunDLLA [SHELL32.@] + * + */ +HRESULT WINAPI Control_FillCache_RunDLLA(HWND hWnd, HANDLE hModule, DWORD w, DWORD x) +{ + return Control_FillCache_RunDLLW(hWnd, hModule, w, x); +} + + +/************************************************************************* + * RunDLL_CallEntry16 [SHELL32.122] + * the name is probably wrong + */ +void WINAPI RunDLL_CallEntry16( DWORD proc, HWND hwnd, HINSTANCE inst, + LPCSTR cmdline, INT cmdshow ) +{ +#if !defined(__CYGWIN__) && !defined (__MINGW32__) && !defined(_MSC_VER) + WORD args[5]; + SEGPTR cmdline_seg; + + TRACE( "proc %lx hwnd %p inst %p cmdline %s cmdshow %d\n", + proc, hwnd, inst, debugstr_a(cmdline), cmdshow ); + + cmdline_seg = MapLS( cmdline ); + args[4] = HWND_16(hwnd); + args[3] = MapHModuleLS(inst); + args[2] = SELECTOROF(cmdline_seg); + args[1] = OFFSETOF(cmdline_seg); + args[0] = cmdshow; + WOWCallback16Ex( proc, WCB16_PASCAL, sizeof(args), args, NULL ); + UnMapLS( cmdline_seg ); +#else + FIXME( "proc %lx hwnd %p inst %p cmdline %s cmdshow %d\n", + proc, hwnd, inst, debugstr_a(cmdline), cmdshow ); +#endif +} + +/************************************************************************* + * CallCPLEntry16 [SHELL32.166] + * + * called by desk.cpl on "Advanced" with: + * hMod("DeskCp16.Dll"), pFunc("CplApplet"), 0, 1, 0xc, 0 + * + */ +DWORD WINAPI CallCPLEntry16(HMODULE hMod, FARPROC pFunc, DWORD dw3, DWORD dw4, DWORD dw5, DWORD dw6) +{ + FIXME("(%p, %p, %08lx, %08lx, %08lx, %08lx): stub.\n", hMod, pFunc, dw3, dw4, dw5, dw6); + return 0x0deadbee; +} diff --git a/reactos/lib/shell32/cpanel.h b/reactos/lib/shell32/cpanel.h new file mode 100644 index 00000000000..e0a65b9877f --- /dev/null +++ b/reactos/lib/shell32/cpanel.h @@ -0,0 +1,47 @@ +/* Control Panel management + * + * Copyright 2001 Eric Pouech + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_SHELL_CPANEL_H +#define __WINE_SHELL_CPANEL_H + +#include "cpl.h" + +typedef struct CPlApplet { + struct CPlApplet* next; /* linked list */ + HWND hWnd; + unsigned count; /* number of subprograms */ + HMODULE hModule; /* module of loaded applet */ + APPLET_PROC proc; /* entry point address */ + NEWCPLINFOW info[1]; /* array of count information. + * dwSize field is 0 if entry is invalid */ +} CPlApplet; + +typedef struct CPanel { + CPlApplet* first; /* linked list */ + HWND hWnd; + unsigned status; + CPlApplet* clkApplet; + unsigned clkSP; +} CPanel; + + +CPlApplet* Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel); +CPlApplet* Control_UnloadApplet(CPlApplet* applet); + +#endif /* __WINE_SHELL_CPANEL_H */ diff --git a/reactos/lib/shell32/cpanelfolder.c b/reactos/lib/shell32/cpanelfolder.c new file mode 100644 index 00000000000..dfb47454bd1 --- /dev/null +++ b/reactos/lib/shell32/cpanelfolder.c @@ -0,0 +1,1092 @@ +/* + * Control panel folder + * + * Copyright 2003 Martin Fuchs + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wingdi.h" +#include "winuser.h" + +#include "ole2.h" +#include "shlguid.h" + +#include "cpanel.h" +#include "enumidlist.h" +#include "pidl.h" +#include "undocshell.h" +#include "shell32_main.h" +#include "shresdef.h" +#include "shlwapi.h" +#include "shellfolder.h" +#include "wine/debug.h" +#include "debughlp.h" +#include "shfldr.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/*********************************************************************** +* control panel implementation in shell namespace +*/ + +typedef struct { + IShellFolder2Vtbl *lpVtbl; + DWORD ref; + IPersistFolder2Vtbl *lpVtblPersistFolder2; + IShellExecuteHookWVtbl *lpVtblShellExecuteHookW; + IShellExecuteHookAVtbl *lpVtblShellExecuteHookA; + + IUnknown *pUnkOuter; /* used for aggregation */ + + /* both paths are parsible from the desktop */ + LPITEMIDLIST pidlRoot; /* absolute pidl */ + int dwAttributes; /* attributes returned by GetAttributesOf FIXME: use it */ +} ICPanelImpl; + +static IShellFolder2Vtbl vt_ShellFolder2; +static IPersistFolder2Vtbl vt_PersistFolder2; +static IShellExecuteHookWVtbl vt_ShellExecuteHookW; +static IShellExecuteHookAVtbl vt_ShellExecuteHookA; + +#define _IPersistFolder2_Offset ((int)(&(((ICPanelImpl*)0)->lpVtblPersistFolder2))) +#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder2_Offset); + +#define IShellExecuteHookW_Offset ((int)(&(((ICPanelImpl*)0)->lpVtblShellExecuteHookW))) +#define _ICOM_THIS_From_IShellExecuteHookW(class, name) class* This = (class*)(((char*)name)-IShellExecuteHookW_Offset); + +#define IShellExecuteHookA_Offset ((int)(&(((ICPanelImpl*)0)->lpVtblShellExecuteHookA))) +#define _ICOM_THIS_From_IShellExecuteHookA(class, name) class* This = (class*)(((char*)name)-IShellExecuteHookA_Offset); + + +/* + converts This to a interface pointer +*/ +#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl) +#define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl) +#define _IShellFolder2_(This) (IShellFolder2*)&(This->lpVtbl) + +#define _IPersist_(This) (IPersist*)&(This->lpVtblPersistFolder2) +#define _IPersistFolder_(This) (IPersistFolder*)&(This->lpVtblPersistFolder2) +#define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpVtblPersistFolder2) +#define _IShellExecuteHookW_(This) (IShellExecuteHookW*)&(This->lpVtblShellExecuteHookW) +#define _IShellExecuteHookA_(This) (IShellExecuteHookA*)&(This->lpVtblShellExecuteHookA) + +/*********************************************************************** +* IShellFolder [ControlPanel] implementation +*/ + +static shvheader ControlPanelSFHeader[] = { + {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},/*FIXME*/ + {IDS_SHV_COLUMN9, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 200},/*FIXME*/ +}; + +#define CONROLPANELSHELLVIEWCOLUMNS 2 + +/************************************************************************** +* IControlPanel_Constructor +*/ +HRESULT WINAPI IControlPanel_Constructor(IUnknown* pUnkOuter, REFIID riid, LPVOID * ppv) +{ + ICPanelImpl *sf; + + TRACE("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid(riid)); + + if (!ppv) + return E_POINTER; + if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown)) + return CLASS_E_NOAGGREGATION; + + sf = (ICPanelImpl *) LocalAlloc(GMEM_ZEROINIT, sizeof(ICPanelImpl)); + if (!sf) + return E_OUTOFMEMORY; + + sf->ref = 0; + sf->lpVtbl = &vt_ShellFolder2; + sf->lpVtblPersistFolder2 = &vt_PersistFolder2; + sf->lpVtblShellExecuteHookW = &vt_ShellExecuteHookW; + sf->lpVtblShellExecuteHookA = &vt_ShellExecuteHookA; + sf->pidlRoot = _ILCreateControlPanel(); /* my qualified pidl */ + sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_ (sf); + + if (!SUCCEEDED(IUnknown_QueryInterface(_IUnknown_(sf), riid, ppv))) { + IUnknown_Release(_IUnknown_(sf)); + return E_NOINTERFACE; + } + + TRACE("--(%p)\n", sf); + return S_OK; +} + +/************************************************************************** + * ISF_ControlPanel_fnQueryInterface + * + * NOTES supports not IPersist/IPersistFolder + */ +static HRESULT WINAPI ISF_ControlPanel_fnQueryInterface(IShellFolder2 * iface, REFIID riid, LPVOID * ppvObject) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + TRACE("(%p)->(%s,%p)\n", This, shdebugstr_guid(riid), ppvObject); + + *ppvObject = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IShellFolder) || IsEqualIID(riid, &IID_IShellFolder2)) + *ppvObject = This; + else if (IsEqualIID(riid, &IID_IPersist) || + IsEqualIID(riid, &IID_IPersistFolder) || IsEqualIID(riid, &IID_IPersistFolder2)) + *ppvObject = _IPersistFolder2_(This); + else if (IsEqualIID(riid, &IID_IShellExecuteHookW)) + *ppvObject = _IShellExecuteHookW_(This); + else if (IsEqualIID(riid, &IID_IShellExecuteHookA)) + *ppvObject = _IShellExecuteHookA_(This); + + if (*ppvObject) { + IUnknown_AddRef((IUnknown *)(*ppvObject)); + TRACE("-- Interface:(%p)->(%p)\n", ppvObject, *ppvObject); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI ISF_ControlPanel_fnAddRef(IShellFolder2 * iface) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + TRACE("(%p)->(count=%lu)\n", This, This->ref); + + return ++(This->ref); +} + +static ULONG WINAPI ISF_ControlPanel_fnRelease(IShellFolder2 * iface) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + TRACE("(%p)->(count=%lu)\n", This, This->ref); + + if (!--(This->ref)) { + TRACE("-- destroying IShellFolder(%p)\n", This); + if (This->pidlRoot) + SHFree(This->pidlRoot); + LocalFree((HLOCAL) This); + return 0; + } + return This->ref; +} + +/************************************************************************** +* ISF_ControlPanel_fnParseDisplayName +*/ +static HRESULT WINAPI +ISF_ControlPanel_fnParseDisplayName(IShellFolder2 * iface, + HWND hwndOwner, + LPBC pbc, + LPOLESTR lpszDisplayName, + DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + HRESULT hr = E_INVALIDARG; + + FIXME("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", + This, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName), pchEaten, ppidl, pdwAttributes); + + *ppidl = 0; + if (pchEaten) + *pchEaten = 0; + + TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr); + + return hr; +} + +static LPITEMIDLIST _ILCreateCPanelApplet(LPCSTR name, LPCSTR displayName, + LPCSTR comment, int iconIdx) +{ + PIDLCPanelStruct *p; + LPITEMIDLIST pidl; + PIDLDATA tmp; + int size0 = (char*)&tmp.u.cpanel.szName-(char*)&tmp.u.cpanel; + int size = size0; + int l; + + tmp.type = PT_CPLAPPLET; + tmp.u.cpanel.dummy = 0; + tmp.u.cpanel.iconIdx = iconIdx; + + l = strlen(name); + size += l+1; + + tmp.u.cpanel.offsDispName = l+1; + l = strlen(displayName); + size += l+1; + + tmp.u.cpanel.offsComment = tmp.u.cpanel.offsDispName+1+l; + l = strlen(comment); + size += l+1; + + pidl = SHAlloc(size+4); + if (!pidl) + return NULL; + + pidl->mkid.cb = size+2; + memcpy(pidl->mkid.abID, &tmp, 2+size0); + + p = &((PIDLDATA*)pidl->mkid.abID)->u.cpanel; + strcpy(p->szName, name); + strcpy(p->szName+tmp.u.cpanel.offsDispName, displayName); + strcpy(p->szName+tmp.u.cpanel.offsComment, comment); + + *(WORD*)((char*)pidl+(size+2)) = 0; + + pcheck(pidl); + + return pidl; +} + +/************************************************************************** + * _ILGetCPanelPointer() + * gets a pointer to the control panel struct stored in the pidl + */ +static PIDLCPanelStruct* _ILGetCPanelPointer(LPCITEMIDLIST pidl) +{ + LPPIDLDATA pdata = _ILGetDataPointer(pidl); + + if (pdata && pdata->type==PT_CPLAPPLET) + return (PIDLCPanelStruct*)&(pdata->u.cpanel); + + return NULL; +} + + /************************************************************************** + * ISF_ControlPanel_fnEnumObjects + */ +static BOOL SHELL_RegisterCPanelApp(IEnumIDList* list, LPCSTR path) +{ + LPITEMIDLIST pidl; + CPlApplet* applet; + CPanel panel; + CPLINFO info; + unsigned i; + int iconIdx; + + char displayName[MAX_PATH]; + char comment[MAX_PATH]; + + WCHAR wpath[MAX_PATH]; + + MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, MAX_PATH); + + panel.first = NULL; + applet = Control_LoadApplet(0, wpath, &panel); + + if (applet) + { + for(i=0; icount; ++i) + { + WideCharToMultiByte(CP_ACP, 0, applet->info[i].szName, -1, displayName, MAX_PATH, 0, 0); + WideCharToMultiByte(CP_ACP, 0, applet->info[i].szInfo, -1, comment, MAX_PATH, 0, 0); + + applet->proc(0, CPL_INQUIRE, i, (LPARAM)&info); + + if (info.idIcon > 0) + iconIdx = -info.idIcon; /* negative icon index instead of icon number */ + else + iconIdx = 0; + + pidl = _ILCreateCPanelApplet(path, displayName, comment, iconIdx); + + if (pidl) + AddToEnumList(list, pidl); + } + Control_UnloadApplet(applet); + } + return TRUE; +} + +static int SHELL_RegisterRegistryCPanelApps(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath) +{ + char name[MAX_PATH]; + char value[MAX_PATH]; + HKEY hkey; + + int cnt = 0; + + if (RegOpenKeyA(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) + { + int idx = 0; + + for(;; ++idx) + { + DWORD nameLen = MAX_PATH; + DWORD valueLen = MAX_PATH; + + if (RegEnumValueA(hkey, idx, name, &nameLen, NULL, NULL, (LPBYTE)&value, &valueLen) != ERROR_SUCCESS) + break; + + if (SHELL_RegisterCPanelApp(list, value)) + ++cnt; + } + RegCloseKey(hkey); + } + + return cnt; +} + +static int SHELL_RegisterCPanelFolders(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath) +{ + char name[MAX_PATH]; + HKEY hkey; + + int cnt = 0; + + if (RegOpenKeyA(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) + { + int idx = 0; + for(;; ++idx) + { + if (RegEnumKeyA(hkey, idx, name, MAX_PATH) != ERROR_SUCCESS) + break; + + if (*name == '{') + { + LPITEMIDLIST pidl = _ILCreateGuidFromStrA(name); + + if (pidl && AddToEnumList(list, pidl)) + ++cnt; + } + } + + RegCloseKey(hkey); + } + + return cnt; +} + +/************************************************************************** + * CreateCPanelEnumList() + */ +static BOOL CreateCPanelEnumList( + IEnumIDList * iface, + DWORD dwFlags) +{ + CHAR szPath[MAX_PATH]; + WIN32_FIND_DATAA wfd; + HANDLE hFile; + + TRACE("(%p)->(flags=0x%08lx) \n",iface,dwFlags); + + /* enumerate control panel folders folders */ + if (dwFlags & SHCONTF_FOLDERS) + SHELL_RegisterCPanelFolders(iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace"); + + /* enumerate the control panel applets */ + if (dwFlags & SHCONTF_NONFOLDERS) + { + LPSTR p; + + GetSystemDirectoryA(szPath, MAX_PATH); + p = PathAddBackslashA(szPath); + strcpy(p, "*.cpl"); + + TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",iface,debugstr_a(szPath)); + hFile = FindFirstFileA(szPath, &wfd); + + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!(dwFlags & SHCONTF_INCLUDEHIDDEN) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + continue; + + if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + strcpy(p, wfd.cFileName); + SHELL_RegisterCPanelApp((IEnumIDList*)iface, szPath); + } + } while(FindNextFileA(hFile, &wfd)); + FindClose(hFile); + } + + SHELL_RegisterRegistryCPanelApps((IEnumIDList*)iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); + SHELL_RegisterRegistryCPanelApps((IEnumIDList*)iface, HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); + } + return TRUE; +} + +/************************************************************************** +* ISF_ControlPanel_fnEnumObjects +*/ +static HRESULT WINAPI +ISF_ControlPanel_fnEnumObjects(IShellFolder2 * iface, HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + TRACE("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); + + *ppEnumIDList = IEnumIDList_Constructor(); + if (*ppEnumIDList) + CreateCPanelEnumList(*ppEnumIDList, dwFlags); + + TRACE("--(%p)->(new ID List: %p)\n", This, *ppEnumIDList); + + return(*ppEnumIDList) ? S_OK : E_OUTOFMEMORY; +} + +/************************************************************************** +* ISF_ControlPanel_fnBindToObject +*/ +static HRESULT WINAPI +ISF_ControlPanel_fnBindToObject(IShellFolder2 * iface, LPCITEMIDLIST pidl, + LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", This, pidl, pbcReserved, shdebugstr_guid(riid), ppvOut); + + return SHELL32_BindToChild(This->pidlRoot, NULL, pidl, riid, ppvOut); +} + +/************************************************************************** +* ISF_ControlPanel_fnBindToStorage +*/ +static HRESULT WINAPI +ISF_ControlPanel_fnBindToStorage(IShellFolder2 * iface, + LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", This, pidl, pbcReserved, shdebugstr_guid(riid), ppvOut); + + *ppvOut = NULL; + return E_NOTIMPL; +} + +/************************************************************************** +* ISF_ControlPanel_fnCompareIDs +*/ + +static HRESULT WINAPI +ISF_ControlPanel_fnCompareIDs(IShellFolder2 * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + int nReturn; + + TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2); + nReturn = SHELL32_CompareIDs(_IShellFolder_(This), lParam, pidl1, pidl2); + TRACE("-- %i\n", nReturn); + return nReturn; +} + +/************************************************************************** +* ISF_ControlPanel_fnCreateViewObject +*/ +static HRESULT WINAPI +ISF_ControlPanel_fnCreateViewObject(IShellFolder2 * iface, HWND hwndOwner, REFIID riid, LPVOID * ppvOut) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + LPSHELLVIEW pShellView; + HRESULT hr = E_INVALIDARG; + + TRACE("(%p)->(hwnd=%p,%s,%p)\n", This, hwndOwner, shdebugstr_guid(riid), ppvOut); + + if (ppvOut) { + *ppvOut = NULL; + + if (IsEqualIID(riid, &IID_IDropTarget)) { + WARN("IDropTarget not implemented\n"); + hr = E_NOTIMPL; + } else if (IsEqualIID(riid, &IID_IContextMenu)) { + WARN("IContextMenu not implemented\n"); + hr = E_NOTIMPL; + } else if (IsEqualIID(riid, &IID_IShellView)) { + pShellView = IShellView_Constructor((IShellFolder *) iface); + if (pShellView) { + hr = IShellView_QueryInterface(pShellView, riid, ppvOut); + IShellView_Release(pShellView); + } + } + } + TRACE("--(%p)->(interface=%p)\n", This, ppvOut); + return hr; +} + +/************************************************************************** +* ISF_ControlPanel_fnGetAttributesOf +*/ +static HRESULT WINAPI +ISF_ControlPanel_fnGetAttributesOf(IShellFolder2 * iface, UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + HRESULT hr = S_OK; + + TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n", This, cidl, apidl, *rgfInOut); + + if ((!cidl) ||(!apidl) ||(!rgfInOut)) + return E_INVALIDARG; + + if (*rgfInOut == 0) + *rgfInOut = ~0; + + while(cidl > 0 && *apidl) { + pdump(*apidl); + SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut); + apidl++; + cidl--; + } + + TRACE("-- result=0x%08lx\n", *rgfInOut); + return hr; +} + +/************************************************************************** +* ISF_ControlPanel_fnGetUIObjectOf +* +* PARAMETERS +* HWND hwndOwner, //[in ] Parent window for any output +* UINT cidl, //[in ] array size +* LPCITEMIDLIST* apidl, //[in ] simple pidl array +* REFIID riid, //[in ] Requested Interface +* UINT* prgfInOut, //[ ] reserved +* LPVOID* ppvObject) //[out] Resulting Interface +* +*/ +static HRESULT WINAPI +ISF_ControlPanel_fnGetUIObjectOf(IShellFolder2 * iface, + HWND hwndOwner, + UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + LPITEMIDLIST pidl; + IUnknown *pObj = NULL; + HRESULT hr = E_INVALIDARG; + + TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", + This, hwndOwner, cidl, apidl, shdebugstr_guid(riid), prgfInOut, ppvOut); + + if (ppvOut) { + *ppvOut = NULL; + + if (IsEqualIID(riid, &IID_IContextMenu) &&(cidl >= 1)) { + pObj = (LPUNKNOWN) ISvItemCm_Constructor((IShellFolder *) iface, This->pidlRoot, apidl, cidl); + hr = S_OK; + } else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1)) { + pObj = (LPUNKNOWN) IDataObject_Constructor(hwndOwner, This->pidlRoot, apidl, cidl); + hr = S_OK; + } else if (IsEqualIID(riid, &IID_IExtractIconA) &&(cidl == 1)) { + pidl = ILCombine(This->pidlRoot, apidl[0]); + pObj = (LPUNKNOWN) IExtractIconA_Constructor(pidl); + SHFree(pidl); + hr = S_OK; + } else if (IsEqualIID(riid, &IID_IExtractIconW) &&(cidl == 1)) { + pidl = ILCombine(This->pidlRoot, apidl[0]); + pObj = (LPUNKNOWN) IExtractIconW_Constructor(pidl); + SHFree(pidl); + hr = S_OK; + } else if ((IsEqualIID(riid,&IID_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA)) + && (cidl == 1)) { + pidl = ILCombine(This->pidlRoot, apidl[0]); + hr = IShellLink_ConstructFromFile(NULL, riid, pidl,(LPVOID*)&pObj); + SHFree(pidl); + } else { + hr = E_NOINTERFACE; + } + + if (SUCCEEDED(hr) && !pObj) + hr = E_OUTOFMEMORY; + + *ppvOut = pObj; + } + TRACE("(%p)->hr=0x%08lx\n", This, hr); + return hr; +} + +/************************************************************************** +* ISF_ControlPanel_fnGetDisplayNameOf +*/ +static HRESULT WINAPI ISF_ControlPanel_fnGetDisplayNameOf(IShellFolder2 * iface, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + CHAR szPath[MAX_PATH*2]; + PIDLCPanelStruct* pcpanel; + + *szPath = '\0'; + + TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); + pdump(pidl); + + if (!pidl || !strRet) + return E_INVALIDARG; + + pcpanel = _ILGetCPanelPointer(pidl); + + if (pcpanel) { + lstrcpyA(szPath, pcpanel->szName+pcpanel->offsDispName); + + if (!(dwFlags & SHGDN_FORPARSING)) + FIXME("retrieve display name from control panel app\n"); + } + /* take names of special folders only if its only this folder */ + else if (_ILIsSpecialFolder(pidl)) { + BOOL bSimplePidl = _ILIsPidlSimple(pidl); + + if (bSimplePidl) { + _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */ + } else { + FIXME("special pidl\n"); + } + + if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl) { /* go deeper if needed */ + int len = 0; + + PathAddBackslashA(szPath); /*FIXME*/ + len = lstrlenA(szPath); + + if (!SUCCEEDED + (SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_INFOLDER, szPath + len, MAX_PATH - len))) + return E_OUTOFMEMORY; + } + } + + strRet->uType = STRRET_CSTR; + lstrcpynA(strRet->u.cStr, szPath, MAX_PATH); + + TRACE("--(%p)->(%s)\n", This, szPath); + return S_OK; +} + +/************************************************************************** +* ISF_ControlPanel_fnSetNameOf +* Changes the name of a file object or subfolder, possibly changing its item +* identifier in the process. +* +* PARAMETERS +* HWND hwndOwner, //[in ] Owner window for output +* LPCITEMIDLIST pidl, //[in ] simple pidl of item to change +* LPCOLESTR lpszName, //[in ] the items new display name +* DWORD dwFlags, //[in ] SHGNO formatting flags +* LPITEMIDLIST* ppidlOut) //[out] simple pidl returned +*/ +static HRESULT WINAPI ISF_ControlPanel_fnSetNameOf(IShellFolder2 * iface, HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + FIXME("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This, hwndOwner, pidl, debugstr_w(lpName), dwFlags, pPidlOut); + return E_FAIL; +} + +static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultSearchGUID(IShellFolder2 * iface, GUID * pguid) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + FIXME("(%p)\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI ISF_ControlPanel_fnEnumSearches(IShellFolder2 * iface, IEnumExtraSearch ** ppenum) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + FIXME("(%p)\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultColumn(IShellFolder2 * iface, DWORD dwRes, ULONG * pSort, ULONG * pDisplay) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + TRACE("(%p)\n", This); + + if (pSort) *pSort = 0; + if (pDisplay) *pDisplay = 0; + return S_OK; +} +static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultColumnState(IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + TRACE("(%p)\n", This); + + if (!pcsFlags || iColumn >= CONROLPANELSHELLVIEWCOLUMNS) return E_INVALIDARG; + *pcsFlags = ControlPanelSFHeader[iColumn].pcsFlags; + return S_OK; +} +static HRESULT WINAPI ISF_ControlPanel_fnGetDetailsEx(IShellFolder2 * iface, LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI ISF_ControlPanel_fnGetDetailsOf(IShellFolder2 * iface, LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + HRESULT hr; + + TRACE("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd); + + if (!psd || iColumn >= CONROLPANELSHELLVIEWCOLUMNS) + return E_INVALIDARG; + + if (!pidl) { + psd->fmt = ControlPanelSFHeader[iColumn].fmt; + psd->cxChar = ControlPanelSFHeader[iColumn].cxChar; + psd->str.uType = STRRET_CSTR; + LoadStringA(shell32_hInstance, ControlPanelSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH); + return S_OK; + } else { + psd->str.u.cStr[0] = 0x00; + psd->str.uType = STRRET_CSTR; + switch(iColumn) { + case 0: /* name */ + hr = IShellFolder_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); + break; + case 1: /* comment */ + _ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH); + break; + } + hr = S_OK; + } + + return hr; +} +static HRESULT WINAPI ISF_ControlPanel_fnMapColumnToSCID(IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static IShellFolder2Vtbl vt_ShellFolder2 = +{ + + ISF_ControlPanel_fnQueryInterface, + ISF_ControlPanel_fnAddRef, + ISF_ControlPanel_fnRelease, + ISF_ControlPanel_fnParseDisplayName, + ISF_ControlPanel_fnEnumObjects, + ISF_ControlPanel_fnBindToObject, + ISF_ControlPanel_fnBindToStorage, + ISF_ControlPanel_fnCompareIDs, + ISF_ControlPanel_fnCreateViewObject, + ISF_ControlPanel_fnGetAttributesOf, + ISF_ControlPanel_fnGetUIObjectOf, + ISF_ControlPanel_fnGetDisplayNameOf, + ISF_ControlPanel_fnSetNameOf, + + /* ShellFolder2 */ + ISF_ControlPanel_fnGetDefaultSearchGUID, + ISF_ControlPanel_fnEnumSearches, + ISF_ControlPanel_fnGetDefaultColumn, + ISF_ControlPanel_fnGetDefaultColumnState, + ISF_ControlPanel_fnGetDetailsEx, + ISF_ControlPanel_fnGetDetailsOf, + ISF_ControlPanel_fnMapColumnToSCID +}; + +/************************************************************************ + * ICPanel_PersistFolder2_QueryInterface + */ +static HRESULT WINAPI ICPanel_PersistFolder2_QueryInterface(IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObject) +{ + _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface); + + TRACE("(%p)\n", This); + + return IUnknown_QueryInterface(_IUnknown_(This), iid, ppvObject); +} + +/************************************************************************ + * ICPanel_PersistFolder2_AddRef + */ +static ULONG WINAPI ICPanel_PersistFolder2_AddRef(IPersistFolder2 * iface) +{ + _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface); + + TRACE("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_AddRef(_IUnknown_(This)); +} + +/************************************************************************ + * ISFPersistFolder_Release + */ +static ULONG WINAPI ICPanel_PersistFolder2_Release(IPersistFolder2 * iface) +{ + _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface); + + TRACE("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_Release(_IUnknown_(This)); +} + +/************************************************************************ + * ICPanel_PersistFolder2_GetClassID + */ +static HRESULT WINAPI ICPanel_PersistFolder2_GetClassID(IPersistFolder2 * iface, CLSID * lpClassId) +{ + _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface); + + TRACE("(%p)\n", This); + + if (!lpClassId) + return E_POINTER; + *lpClassId = CLSID_ControlPanel; + + return S_OK; +} + +/************************************************************************ + * ICPanel_PersistFolder2_Initialize + * + * NOTES: it makes no sense to change the pidl + */ +static HRESULT WINAPI ICPanel_PersistFolder2_Initialize(IPersistFolder2 * iface, LPCITEMIDLIST pidl) +{ + _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface); + TRACE("(%p)->(%p)\n", This, pidl); + return E_NOTIMPL; +} + +/************************************************************************** + * IPersistFolder2_fnGetCurFolder + */ +static HRESULT WINAPI ICPanel_PersistFolder2_GetCurFolder(IPersistFolder2 * iface, LPITEMIDLIST * pidl) +{ + _ICOM_THIS_From_IPersistFolder2(ICPanelImpl, iface); + + TRACE("(%p)->(%p)\n", This, pidl); + + if (!pidl) + return E_POINTER; + *pidl = ILClone(This->pidlRoot); + return S_OK; +} + +static IPersistFolder2Vtbl vt_PersistFolder2 = +{ + + ICPanel_PersistFolder2_QueryInterface, + ICPanel_PersistFolder2_AddRef, + ICPanel_PersistFolder2_Release, + ICPanel_PersistFolder2_GetClassID, + ICPanel_PersistFolder2_Initialize, + ICPanel_PersistFolder2_GetCurFolder +}; + +HRESULT WINAPI CPanel_GetIconLocationA(LPITEMIDLIST pidl, LPSTR szIconFile, UINT cchMax, int* piIndex) +{ + PIDLCPanelStruct* pcpanel = _ILGetCPanelPointer(pidl); + + if (!pcpanel) + return E_INVALIDARG; + + lstrcpyA(szIconFile, pcpanel->szName); + *piIndex = pcpanel->iconIdx!=-1? pcpanel->iconIdx: 0; + + return S_OK; +} + +HRESULT WINAPI CPanel_GetIconLocationW(LPITEMIDLIST pidl, LPWSTR szIconFile, UINT cchMax, int* piIndex) +{ + PIDLCPanelStruct* pcpanel = _ILGetCPanelPointer(pidl); + + if (!pcpanel) + return E_INVALIDARG; + + MultiByteToWideChar(CP_ACP, 0, pcpanel->szName, -1, szIconFile, cchMax); + *piIndex = pcpanel->iconIdx!=-1? pcpanel->iconIdx: 0; + + return S_OK; +} + + +/************************************************************************** +* IShellExecuteHookW Implementation +*/ + +static HRESULT WINAPI IShellExecuteHookW_fnQueryInterface(IShellExecuteHookW* iface, REFIID riid, void** ppvObject) +{ + _ICOM_THIS_From_IShellExecuteHookW(ICPanelImpl, iface); + + TRACE("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); +} + +static ULONG STDMETHODCALLTYPE IShellExecuteHookW_fnAddRef(IShellExecuteHookW* iface) +{ + _ICOM_THIS_From_IShellExecuteHookW(ICPanelImpl, iface); + + TRACE("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_AddRef(This->pUnkOuter); +} + +static ULONG STDMETHODCALLTYPE IShellExecuteHookW_fnRelease(IShellExecuteHookW* iface) +{ + _ICOM_THIS_From_IShellExecuteHookW(ICPanelImpl, iface); + + TRACE("(%p)\n", This); + + return IUnknown_Release(This->pUnkOuter); +} + +static HRESULT WINAPI IShellExecuteHookW_fnExecute(IShellExecuteHookW* iface, LPSHELLEXECUTEINFOW psei) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + SHELLEXECUTEINFOW sei_tmp; + PIDLCPanelStruct* pcpanel; + WCHAR path[MAX_PATH]; + BOOL ret; + int l; + + TRACE("(%p)->execute(%p)\n", This, psei); + + if (!psei) + return E_INVALIDARG; + + pcpanel = _ILGetCPanelPointer(ILFindLastID(psei->lpIDList)); + + if (!pcpanel) + return E_INVALIDARG; + + path[0] = '\"'; + l = 1 + MultiByteToWideChar(CP_ACP, 0, pcpanel->szName, -1, path+1, MAX_PATH); + + /* pass applet name to Control_RunDLL to distinguish between applets in one .cpl file */ + path[++l] = '"'; + path[++l] = ' '; + + MultiByteToWideChar(CP_ACP, 0, pcpanel->szName+pcpanel->offsDispName, -1, path+l, MAX_PATH); + + memcpy(&sei_tmp, psei, sizeof(sei_tmp)); + sei_tmp.lpFile = path; + sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST; + + ret = ShellExecuteExW(&sei_tmp); + if (ret) + return S_OK; + else + return S_FALSE; +} + +static IShellExecuteHookWVtbl vt_ShellExecuteHookW = +{ + + IShellExecuteHookW_fnQueryInterface, + IShellExecuteHookW_fnAddRef, + IShellExecuteHookW_fnRelease, + + IShellExecuteHookW_fnExecute +}; + + +/************************************************************************** +* IShellExecuteHookA Implementation +*/ + +static HRESULT WINAPI IShellExecuteHookA_fnQueryInterface(IShellExecuteHookA* iface, REFIID riid, void** ppvObject) +{ + _ICOM_THIS_From_IShellExecuteHookA(ICPanelImpl, iface); + + TRACE("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); +} + +static ULONG STDMETHODCALLTYPE IShellExecuteHookA_fnAddRef(IShellExecuteHookA* iface) +{ + _ICOM_THIS_From_IShellExecuteHookA(ICPanelImpl, iface); + + TRACE("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_AddRef(This->pUnkOuter); +} + +static ULONG STDMETHODCALLTYPE IShellExecuteHookA_fnRelease(IShellExecuteHookA* iface) +{ + _ICOM_THIS_From_IShellExecuteHookA(ICPanelImpl, iface); + + TRACE("(%p)\n", This); + + return IUnknown_Release(This->pUnkOuter); +} + +static HRESULT WINAPI IShellExecuteHookA_fnExecute(IShellExecuteHookA* iface, LPSHELLEXECUTEINFOA psei) +{ + ICPanelImpl *This = (ICPanelImpl *)iface; + + SHELLEXECUTEINFOA sei_tmp; + PIDLCPanelStruct* pcpanel; + char path[MAX_PATH]; + BOOL ret; + + TRACE("(%p)->execute(%p)\n", This, psei); + + if (!psei) + return E_INVALIDARG; + + pcpanel = _ILGetCPanelPointer(ILFindLastID(psei->lpIDList)); + + if (!pcpanel) + return E_INVALIDARG; + + path[0] = '\"'; + lstrcpyA(path+1, pcpanel->szName); + + /* pass applet name to Control_RunDLL to distinguish between applets in one .cpl file */ + lstrcatA(path, "\" "); + lstrcatA(path, pcpanel->szName+pcpanel->offsDispName); + + memcpy(&sei_tmp, psei, sizeof(sei_tmp)); + sei_tmp.lpFile = path; + sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST; + + ret = ShellExecuteExA(&sei_tmp); + if (ret) + return S_OK; + else + return S_FALSE; +} + +static IShellExecuteHookAVtbl vt_ShellExecuteHookA = +{ + + IShellExecuteHookA_fnQueryInterface, + IShellExecuteHookA_fnAddRef, + IShellExecuteHookA_fnRelease, + + IShellExecuteHookA_fnExecute +}; diff --git a/reactos/lib/shell32/dataobject.c b/reactos/lib/shell32/dataobject.c new file mode 100644 index 00000000000..e104e5abf2c --- /dev/null +++ b/reactos/lib/shell32/dataobject.c @@ -0,0 +1,458 @@ +/* + * IEnumFORMATETC, IDataObject + * + * selecting and droping objects within the shell and/or common dialogs + * + * Copyright 1998, 1999 + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "windef.h" +#include "wingdi.h" +#include "pidl.h" +#include "winerror.h" +#include "shell32_main.h" +#include "wine/debug.h" +#include "undocshell.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/*********************************************************************** +* IEnumFORMATETC implementation +*/ + +typedef struct +{ + /* IUnknown fields */ + IEnumFORMATETCVtbl *lpVtbl; + DWORD ref; + /* IEnumFORMATETC fields */ + UINT posFmt; + UINT countFmt; + LPFORMATETC pFmt; +} IEnumFORMATETCImpl; + +static HRESULT WINAPI IEnumFORMATETC_fnQueryInterface(LPENUMFORMATETC iface, REFIID riid, LPVOID* ppvObj); +static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface); +static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface); +static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, FORMATETC* rgelt, ULONG* pceltFethed); +static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt); +static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface); +static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum); + +static struct IEnumFORMATETCVtbl efvt = +{ + IEnumFORMATETC_fnQueryInterface, + IEnumFORMATETC_fnAddRef, + IEnumFORMATETC_fnRelease, + IEnumFORMATETC_fnNext, + IEnumFORMATETC_fnSkip, + IEnumFORMATETC_fnReset, + IEnumFORMATETC_fnClone +}; + +LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[]) +{ + IEnumFORMATETCImpl* ef; + DWORD size=cfmt * sizeof(FORMATETC); + + ef=(IEnumFORMATETCImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IEnumFORMATETCImpl)); + + if(ef) + { + ef->ref=1; + ef->lpVtbl=&efvt; + + ef->countFmt = cfmt; + ef->pFmt = SHAlloc (size); + + if (ef->pFmt) + { + memcpy(ef->pFmt, afmt, size); + } + } + + TRACE("(%p)->(%u,%p)\n",ef, cfmt, afmt); + return (LPENUMFORMATETC)ef; +} + +static HRESULT WINAPI IEnumFORMATETC_fnQueryInterface(LPENUMFORMATETC iface, REFIID riid, LPVOID* ppvObj) +{ + IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown)) + { + *ppvObj = This; + } + else if(IsEqualIID(riid, &IID_IEnumFORMATETC)) + { + *ppvObj = (IEnumFORMATETC*)This; + } + + if(*ppvObj) + { + IUnknown_AddRef((IUnknown*)(*ppvObj)); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; + +} + +static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface) +{ + IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; + TRACE("(%p)->(count=%lu)\n",This, This->ref); + return ++(This->ref); +} + +static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface) +{ + IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; + TRACE("(%p)->()\n",This); + + if (!--(This->ref)) + { + TRACE(" destroying IEnumFORMATETC(%p)\n",This); + if (This->pFmt) + { + SHFree (This->pFmt); + } + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->ref; +} + +static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, FORMATETC *rgelt, ULONG *pceltFethed) +{ + IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; + UINT i; + + TRACE("(%p)->(%lu,%p)\n", This, celt, rgelt); + + if(!This->pFmt)return S_FALSE; + if(!rgelt) return E_INVALIDARG; + if (pceltFethed) *pceltFethed = 0; + + for(i = 0; This->posFmt < This->countFmt && celt > i; i++) + { + *rgelt++ = This->pFmt[This->posFmt++]; + } + + if (pceltFethed) *pceltFethed = i; + + return ((i == celt) ? S_OK : S_FALSE); +} + +static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt) +{ + IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; + TRACE("(%p)->(num=%lu)\n", This, celt); + + if((This->posFmt + celt) >= This->countFmt) return S_FALSE; + This->posFmt += celt; + return S_OK; +} + +static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface) +{ + IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; + TRACE("(%p)->()\n", This); + + This->posFmt = 0; + return S_OK; +} + +static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum) +{ + IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; + TRACE("(%p)->(ppenum=%p)\n", This, ppenum); + + if (!ppenum) return E_INVALIDARG; + *ppenum = IEnumFORMATETC_Constructor(This->countFmt, This->pFmt); + if(*ppenum) + IEnumFORMATETC_fnSkip(*ppenum, This->posFmt); + return S_OK; +} + + +/*********************************************************************** +* IDataObject implementation +*/ + +/* number of supported formats */ +#define MAX_FORMATS 4 + +typedef struct +{ + /* IUnknown fields */ + IDataObjectVtbl *lpVtbl; + DWORD ref; + + /* IDataObject fields */ + LPITEMIDLIST pidl; + LPITEMIDLIST * apidl; + UINT cidl; + + FORMATETC pFormatEtc[MAX_FORMATS]; + UINT cfShellIDList; + UINT cfFileNameA; + UINT cfFileNameW; + +} IDataObjectImpl; + +static struct IDataObjectVtbl dtovt; + +/************************************************************************** +* IDataObject_Constructor +*/ +LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPCITEMIDLIST pMyPidl, LPCITEMIDLIST * apidl, UINT cidl) +{ + IDataObjectImpl* dto; + + dto = (IDataObjectImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDataObjectImpl)); + + if (dto) + { + dto->ref = 1; + dto->lpVtbl = &dtovt; + dto->pidl = ILClone(pMyPidl); + dto->apidl = _ILCopyaPidl(apidl, cidl); + dto->cidl = cidl; + + dto->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST); + dto->cfFileNameA = RegisterClipboardFormatA(CFSTR_FILENAMEA); + dto->cfFileNameW = RegisterClipboardFormatA(CFSTR_FILENAMEW); + InitFormatEtc(dto->pFormatEtc[0], dto->cfShellIDList, TYMED_HGLOBAL); + InitFormatEtc(dto->pFormatEtc[1], CF_HDROP, TYMED_HGLOBAL); + InitFormatEtc(dto->pFormatEtc[2], dto->cfFileNameA, TYMED_HGLOBAL); + InitFormatEtc(dto->pFormatEtc[3], dto->cfFileNameW, TYMED_HGLOBAL); + } + + TRACE("(%p)->(apidl=%p cidl=%u)\n",dto, apidl, cidl); + return (LPDATAOBJECT)dto; +} + +/*************************************************************************** +* IDataObject_QueryInterface +*/ +static HRESULT WINAPI IDataObject_fnQueryInterface(LPDATAOBJECT iface, REFIID riid, LPVOID * ppvObj) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ + { + *ppvObj = This; + } + else if(IsEqualIID(riid, &IID_IDataObject)) /*IDataObject*/ + { + *ppvObj = (IDataObject*)This; + } + + if(*ppvObj) + { + IUnknown_AddRef((IUnknown*)*ppvObj); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +/************************************************************************** +* IDataObject_AddRef +*/ +static ULONG WINAPI IDataObject_fnAddRef(LPDATAOBJECT iface) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + TRACE("(%p)->(count=%lu)\n",This, This->ref); + return ++(This->ref); +} + +/************************************************************************** +* IDataObject_Release +*/ +static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + TRACE("(%p)->()\n",This); + + if (!--(This->ref)) + { + TRACE(" destroying IDataObject(%p)\n",This); + _ILFreeaPidl(This->apidl, This->cidl); + ILFree(This->pidl), + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->ref; +} + +/************************************************************************** +* IDataObject_fnGetData +*/ +static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + + char szTemp[256]; + + szTemp[0]=0; + GetClipboardFormatNameA (pformatetcIn->cfFormat, szTemp, 256); + TRACE("(%p)->(%p %p format=%s)\n", This, pformatetcIn, pmedium, szTemp); + + if (pformatetcIn->cfFormat == This->cfShellIDList) + { + if (This->cidl < 1) return(E_UNEXPECTED); + pmedium->u.hGlobal = RenderSHELLIDLIST(This->pidl, This->apidl, This->cidl); + } + else if (pformatetcIn->cfFormat == CF_HDROP) + { + if (This->cidl < 1) return(E_UNEXPECTED); + pmedium->u.hGlobal = RenderHDROP(This->pidl, This->apidl, This->cidl); + } + else if (pformatetcIn->cfFormat == This->cfFileNameA) + { + if (This->cidl < 1) return(E_UNEXPECTED); + pmedium->u.hGlobal = RenderFILENAMEA(This->pidl, This->apidl, This->cidl); + } + else if (pformatetcIn->cfFormat == This->cfFileNameW) + { + if (This->cidl < 1) return(E_UNEXPECTED); + pmedium->u.hGlobal = RenderFILENAMEW(This->pidl, This->apidl, This->cidl); + } + else + { + FIXME("-- expected clipformat not implemented\n"); + return (E_INVALIDARG); + } + if (pmedium->u.hGlobal) + { + pmedium->tymed = TYMED_HGLOBAL; + pmedium->pUnkForRelease = NULL; + return S_OK; + } + return E_OUTOFMEMORY; +} + +static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + UINT i; + + TRACE("(%p)->(fmt=0x%08x tym=0x%08lx)\n", This, pformatetc->cfFormat, pformatetc->tymed); + + if(!(DVASPECT_CONTENT & pformatetc->dwAspect)) + return DV_E_DVASPECT; + + /* check our formats table what we have */ + for (i=0; ipFormatEtc[i].cfFormat == pformatetc->cfFormat) + && (This->pFormatEtc[i].tymed == pformatetc->tymed)) + { + return S_OK; + } + } + + return DV_E_TYMED; +} + +static HRESULT WINAPI IDataObject_fnGetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObject_fnSetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + + TRACE("(%p)->()\n", This); + *ppenumFormatEtc=NULL; + + /* only get data */ + if (DATADIR_GET == dwDirection) + { + *ppenumFormatEtc = IEnumFORMATETC_Constructor(MAX_FORMATS, This->pFormatEtc); + return (*ppenumFormatEtc) ? S_OK : E_FAIL; + } + + return E_NOTIMPL; +} + +static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI IDataObject_fnDUnadvise(LPDATAOBJECT iface, DWORD dwConnection) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI IDataObject_fnEnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise) +{ + IDataObjectImpl *This = (IDataObjectImpl *)iface; + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} + +static struct IDataObjectVtbl dtovt = +{ + IDataObject_fnQueryInterface, + IDataObject_fnAddRef, + IDataObject_fnRelease, + IDataObject_fnGetData, + IDataObject_fnGetDataHere, + IDataObject_fnQueryGetData, + IDataObject_fnGetCanonicalFormatEtc, + IDataObject_fnSetData, + IDataObject_fnEnumFormatEtc, + IDataObject_fnDAdvise, + IDataObject_fnDUnadvise, + IDataObject_fnEnumDAdvise +}; diff --git a/reactos/lib/shell32/debughlp.c b/reactos/lib/shell32/debughlp.c new file mode 100644 index 00000000000..fc43cbb9504 --- /dev/null +++ b/reactos/lib/shell32/debughlp.c @@ -0,0 +1,338 @@ +/* + * Helper functions for debugging + * + * Copyright 1998, 2002 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include "windef.h" +#include "wingdi.h" +#include "pidl.h" +#include "shlguid.h" +#include "shldisp.h" +#include "wine/debug.h" +#include "debughlp.h" +#include "docobj.h" +#include "shell32_main.h" + + +WINE_DEFAULT_DEBUG_CHANNEL(pidl); + +static +LPITEMIDLIST _dbg_ILGetNext(LPCITEMIDLIST pidl) +{ + WORD len; + + if(pidl) + { + len = pidl->mkid.cb; + if (len) + { + return (LPITEMIDLIST) (((LPBYTE)pidl)+len); + } + } + return NULL; +} + +static +BOOL _dbg_ILIsDesktop(LPCITEMIDLIST pidl) +{ + return ( !pidl || (pidl && pidl->mkid.cb == 0x00) ); +} + +static +LPPIDLDATA _dbg_ILGetDataPointer(LPCITEMIDLIST pidl) +{ + if(pidl && pidl->mkid.cb != 0x00) + return (LPPIDLDATA) &(pidl->mkid.abID); + return NULL; +} + +static +LPSTR _dbg_ILGetTextPointer(LPCITEMIDLIST pidl) +{ + LPPIDLDATA pdata =_dbg_ILGetDataPointer(pidl); + + if (pdata) + { + switch (pdata->type) + { + case PT_GUID: + case PT_SHELLEXT: + case PT_YAGUID: + return NULL; + + case PT_DRIVE: + case PT_DRIVE1: + case PT_DRIVE2: + case PT_DRIVE3: + return (LPSTR)&(pdata->u.drive.szDriveName); + + case PT_FOLDER: + case PT_FOLDER1: + case PT_VALUE: + case PT_IESPECIAL1: + case PT_IESPECIAL2: + return (LPSTR)&(pdata->u.file.szNames); + + case PT_WORKGRP: + case PT_COMP: + case PT_NETWORK: + case PT_NETPROVIDER: + case PT_SHARE: + return (LPSTR)&(pdata->u.network.szNames); + } + } + return NULL; +} + +static +LPSTR _dbg_ILGetSTextPointer(LPCITEMIDLIST pidl) +{ + LPPIDLDATA pdata =_dbg_ILGetDataPointer(pidl); + + if (pdata) + { + switch (pdata->type) + { + case PT_FOLDER: + case PT_VALUE: + case PT_IESPECIAL1: + case PT_IESPECIAL2: + return (LPSTR)(pdata->u.file.szNames + strlen (pdata->u.file.szNames) + 1); + + case PT_WORKGRP: + return (LPSTR)(pdata->u.network.szNames + strlen (pdata->u.network.szNames) + 1); + } + } + return NULL; +} + +static +IID* _dbg_ILGetGUIDPointer(LPCITEMIDLIST pidl) +{ + LPPIDLDATA pdata =_ILGetDataPointer(pidl); + + if (pdata) + { + switch (pdata->type) + { + case PT_SHELLEXT: + case PT_GUID: + return &(pdata->u.guid.guid); + } + } + return NULL; +} + +static +DWORD _dbg_ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) +{ + DWORD dwReturn=0; + LPSTR szSrc; + GUID const * riid; + char szTemp[MAX_PATH]; + + if (!pidl) return 0; + + if (szOut) + *szOut = 0; + + if (_dbg_ILIsDesktop(pidl)) + { + /* desktop */ + if (szOut) strncpy(szOut, "Desktop", uOutSize); + dwReturn = strlen ("Desktop"); + } + else if (( szSrc = _dbg_ILGetTextPointer(pidl) )) + { + /* filesystem */ + if (szOut) strncpy(szOut, szSrc, uOutSize); + dwReturn = strlen(szSrc); + } + else if (( riid = _dbg_ILGetGUIDPointer(pidl) )) + { + if (szOut) + sprintf( szOut, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + riid->Data1, riid->Data2, riid->Data3, + riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3], + riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] ); + dwReturn = strlen (szTemp); + } + return dwReturn; +} + + + + +void pdump (LPCITEMIDLIST pidl) +{ + LPCITEMIDLIST pidltemp = pidl; + + if (!TRACE_ON(pidl)) return; + + if (! pidltemp) + { + MESSAGE ("-------- pidl=NULL (Desktop)\n"); + } + else + { + MESSAGE ("-------- pidl=%p\n", pidl); + if (pidltemp->mkid.cb) + { + do + { + DWORD dwAttrib = 0; + LPPIDLDATA pData = _dbg_ILGetDataPointer(pidltemp); + DWORD type = pData->type; + LPSTR szLongName = _dbg_ILGetTextPointer(pidltemp); + LPSTR szShortName = _dbg_ILGetSTextPointer(pidltemp); + char szName[MAX_PATH]; + + _dbg_ILSimpleGetText(pidltemp, szName, MAX_PATH); + if( PT_FOLDER == type || PT_VALUE == type) + dwAttrib = pData->u.file.uFileAttribs; + + MESSAGE ("[%p] size=%04u type=%lx attr=0x%08lx name=\"%s\" (%s,%s)\n", + pidltemp, pidltemp->mkid.cb,type,dwAttrib,szName,debugstr_a(szLongName), debugstr_a(szShortName)); + + pidltemp = _dbg_ILGetNext(pidltemp); + + } while (pidltemp->mkid.cb); + } + else + { + MESSAGE ("empty pidl (Desktop)\n"); + } + pcheck(pidl); + } +} +#define BYTES_PRINTED 32 +BOOL pcheck (LPCITEMIDLIST pidl) +{ + DWORD type, ret=TRUE; + LPCITEMIDLIST pidltemp = pidl; + + if (pidltemp && pidltemp->mkid.cb) + { do + { type = _dbg_ILGetDataPointer(pidltemp)->type; + switch (type) + { case PT_CPLAPPLET: + case PT_GUID: + case PT_SHELLEXT: + case PT_DRIVE: + case PT_DRIVE1: + case PT_DRIVE2: + case PT_DRIVE3: + case PT_FOLDER: + case PT_VALUE: + case PT_FOLDER1: + case PT_WORKGRP: + case PT_COMP: + case PT_NETPROVIDER: + case PT_NETWORK: + case PT_IESPECIAL1: + case PT_YAGUID: + case PT_IESPECIAL2: + case PT_SHARE: + break; + default: + { + char szTemp[BYTES_PRINTED*4 + 1]; + int i; + unsigned char c; + + memset(szTemp, ' ', BYTES_PRINTED*4 + 1); + for ( i = 0; (imkid.cb) && (i>4)>9)? (c>>4)+55 : (c>>4)+48; + szTemp[i*3+1] = ((0x0F&c)>9)? (0x0F&c)+55 : (0x0F&c)+48; + szTemp[i*3+2] = ' '; + szTemp[i+BYTES_PRINTED*3] = (c>=0x20 && c <=0x80) ? c : '.'; + } + szTemp[BYTES_PRINTED*4] = 0x00; + ERR("unknown IDLIST %p [%p] size=%u type=%lx\n%s\n",pidl, pidltemp, pidltemp->mkid.cb,type, szTemp); + ret = FALSE; + } + } + pidltemp = _dbg_ILGetNext(pidltemp); + } while (pidltemp->mkid.cb); + } + return ret; +} + +static char shdebugstr_buf1[100]; +static char shdebugstr_buf2[100]; +static char * shdebugstr_buf = shdebugstr_buf1; + +static struct { + REFIID riid; + char *name; +} InterfaceDesc[] = { + {&IID_IUnknown, "IID_IUnknown"}, + {&IID_IClassFactory, "IID_IClassFactory"}, + {&IID_IShellView, "IID_IShellView"}, + {&IID_IOleCommandTarget, "IID_IOleCommandTarget"}, + {&IID_IDropTarget, "IID_IDropTarget"}, + {&IID_IDropSource, "IID_IDropSource"}, + {&IID_IViewObject, "IID_IViewObject"}, + {&IID_IContextMenu, "IID_IContextMenu"}, + {&IID_IShellExtInit, "IID_IShellExtInit"}, + {&IID_IShellFolder, "IID_IShellFolder"}, + {&IID_IShellFolder2, "IID_IShellFolder2"}, + {&IID_IPersist, "IID_IPersist"}, + {&IID_IPersistFolder, "IID_IPersistFolder"}, + {&IID_IPersistFolder2, "IID_IPersistFolder2"}, + {&IID_IPersistFolder3, "IID_IPersistFolder3"}, + {&IID_IExtractIconA, "IID_IExtractIconA"}, + {&IID_IExtractIconW, "IID_IExtractIconW"}, + {&IID_IDataObject, "IID_IDataObject"}, + {&IID_IAutoComplete, "IID_IAutoComplete"}, + {&IID_IAutoComplete2, "IID_IAutoComplete2"}, + {NULL,NULL}}; + +const char * shdebugstr_guid( const struct _GUID *id ) +{ + int i; + char* name = NULL; + char clsidbuf[100]; + + shdebugstr_buf = (shdebugstr_buf == shdebugstr_buf1) ? shdebugstr_buf2 : shdebugstr_buf1; + + if (!id) { + strcpy (shdebugstr_buf, "(null)"); + } else { + for (i=0;InterfaceDesc[i].riid && !name;i++) { + if (IsEqualIID(InterfaceDesc[i].riid, id)) name = InterfaceDesc[i].name; + } + if (!name) { + if (HCR_GetClassNameA(id, clsidbuf, 100)) + name = clsidbuf; + } + + sprintf( shdebugstr_buf, "\n\t{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x} (%s)", + id->Data1, id->Data2, id->Data3, + id->Data4[0], id->Data4[1], id->Data4[2], id->Data4[3], + id->Data4[4], id->Data4[5], id->Data4[6], id->Data4[7], name ? name : "unknown" ); + } + return shdebugstr_buf; +} diff --git a/reactos/lib/shell32/debughlp.h b/reactos/lib/shell32/debughlp.h new file mode 100644 index 00000000000..d3819ab4583 --- /dev/null +++ b/reactos/lib/shell32/debughlp.h @@ -0,0 +1,35 @@ +/* + * Definitions for debugging + * + * Copyright 1998, 2002 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_SHELL32_DEBUGHLP_H +#define __WINE_SHELL32_DEBUGHLP_H + +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "shlobj.h" + +extern void pdump (LPCITEMIDLIST pidl); +extern BOOL pcheck (LPCITEMIDLIST pidl); +extern const char * shdebugstr_guid( const struct _GUID *id ); + +#endif /* __WINE_SHELL32_DEBUGHLP_H */ diff --git a/reactos/lib/shell32/dialogs.c b/reactos/lib/shell32/dialogs.c new file mode 100644 index 00000000000..d5a31bf86e6 --- /dev/null +++ b/reactos/lib/shell32/dialogs.c @@ -0,0 +1,446 @@ +/* + * common shell dialogs + * + * Copyright 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wingdi.h" +#include "winuser.h" +#include "commdlg.h" +#include "wine/debug.h" + +#include "shellapi.h" +#include "shlobj.h" +#include "shell32_main.h" +#include "shresdef.h" +#include "undocshell.h" + +typedef struct + { + HWND hwndOwner ; + HICON hIcon ; + LPCSTR lpstrDirectory ; + LPCSTR lpstrTitle ; + LPCSTR lpstrDescription ; + UINT uFlags ; + } RUNFILEDLGPARAMS ; + +typedef BOOL (*LPFNOFN) (OPENFILENAMEA *) ; + +WINE_DEFAULT_DEBUG_CHANNEL(shell); +INT_PTR CALLBACK RunDlgProc (HWND, UINT, WPARAM, LPARAM) ; +void FillList (HWND, char *) ; + + +/************************************************************************* + * PickIconDlg [SHELL32.62] + * + */ +BOOL WINAPI PickIconDlg( + HWND hwndOwner, + LPSTR lpstrFile, + DWORD nMaxFile, + LPDWORD lpdwIconIndex) +{ + FIXME("(%p,%s,%08lx,%p):stub.\n", + hwndOwner, lpstrFile, nMaxFile,lpdwIconIndex); + return 0xffffffff; +} + +/************************************************************************* + * RunFileDlg [SHELL32.61] + * + * NOTES + * Original name: RunFileDlg (exported by ordinal) + */ +void WINAPI RunFileDlg( + HWND hwndOwner, + HICON hIcon, + LPCSTR lpstrDirectory, + LPCSTR lpstrTitle, + LPCSTR lpstrDescription, + UINT uFlags) +{ + + RUNFILEDLGPARAMS rfdp; + HRSRC hRes; + LPVOID template; + TRACE("\n"); + + rfdp.hwndOwner = hwndOwner; + rfdp.hIcon = hIcon; + rfdp.lpstrDirectory = lpstrDirectory; + rfdp.lpstrTitle = lpstrTitle; + rfdp.lpstrDescription = lpstrDescription; + rfdp.uFlags = uFlags; + + if(!(hRes = FindResourceA(shell32_hInstance, "SHELL_RUN_DLG", (LPSTR)RT_DIALOG))) + { + MessageBoxA (hwndOwner, "Couldn't find dialog.", "Nix", MB_OK) ; + return; + } + if(!(template = (LPVOID)LoadResource(shell32_hInstance, hRes))) + { + MessageBoxA (hwndOwner, "Couldn't load dialog.", "Nix", MB_OK) ; + return; + } + + DialogBoxIndirectParamA((HINSTANCE)GetWindowLongPtrW( hwndOwner, + GWLP_HINSTANCE ), + template, hwndOwner, RunDlgProc, (LPARAM)&rfdp); + +} + +/* Dialog procedure for RunFileDlg */ +INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) + { + int ic ; + char *psz, szMsg[256] ; + static RUNFILEDLGPARAMS *prfdp = NULL ; + + switch (message) + { + case WM_INITDIALOG : + prfdp = (RUNFILEDLGPARAMS *)lParam ; + SetWindowTextA (hwnd, prfdp->lpstrTitle) ; + SetClassLongA (hwnd, GCL_HICON, (LPARAM)prfdp->hIcon) ; + SendMessageA (GetDlgItem (hwnd, 12297), STM_SETICON, + (WPARAM)LoadIconA (NULL, (LPSTR)IDI_WINLOGO), 0); + FillList (GetDlgItem (hwnd, 12298), NULL) ; + SetFocus (GetDlgItem (hwnd, 12298)) ; + return TRUE ; + + case WM_COMMAND : + switch (LOWORD (wParam)) + { + case IDOK : + { + HWND htxt = NULL ; + if ((ic = GetWindowTextLengthA (htxt = GetDlgItem (hwnd, 12298)))) + { + psz = HeapAlloc( GetProcessHeap(), 0, (ic + 2) ); + GetWindowTextA (htxt, psz, ic + 1) ; + + if (ShellExecuteA(NULL, "open", psz, NULL, NULL, SW_SHOWNORMAL) < (HINSTANCE)33) + { + char *pszSysMsg = NULL ; + FormatMessageA ( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError (), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)&pszSysMsg, 0, NULL + ) ; + sprintf (szMsg, "Error: %s", pszSysMsg) ; + LocalFree ((HLOCAL)pszSysMsg) ; + MessageBoxA (hwnd, szMsg, "Nix", MB_OK | MB_ICONEXCLAMATION) ; + + HeapFree(GetProcessHeap(), 0, psz); + SendMessageA (htxt, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + return TRUE ; + } + FillList (htxt, psz) ; + HeapFree(GetProcessHeap(), 0, psz); + EndDialog (hwnd, 0) ; + } + } + + case IDCANCEL : + EndDialog (hwnd, 0) ; + return TRUE ; + + case 12288 : + { + HMODULE hComdlg = NULL ; + LPFNOFN ofnProc = NULL ; + static char szFName[1024] = "", szFileTitle[256] = "", szInitDir[768] = "" ; + static OPENFILENAMEA ofn = + { + sizeof (OPENFILENAMEA), + NULL, + NULL, + "Executable Files\0*.exe\0All Files\0*.*\0\0\0\0", + NULL, + 0, + 0, + szFName, + 1023, + szFileTitle, + 255, + (LPCSTR)szInitDir, + "Browse", + OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, + 0, + 0, + NULL, + 0, + (LPOFNHOOKPROC)NULL, + NULL + } ; + + ofn.hwndOwner = hwnd ; + + if (NULL == (hComdlg = LoadLibraryExA ("comdlg32", NULL, 0))) + { + MessageBoxA (hwnd, "Unable to display dialog box (LoadLibraryEx) !", "Nix", MB_OK | MB_ICONEXCLAMATION) ; + return TRUE ; + } + + if ((LPFNOFN)NULL == (ofnProc = (LPFNOFN)GetProcAddress (hComdlg, "GetOpenFileNameA"))) + { + MessageBoxA (hwnd, "Unable to display dialog box (GetProcAddress) !", "Nix", MB_OK | MB_ICONEXCLAMATION) ; + return TRUE ; + } + + ofnProc (&ofn) ; + + SetFocus (GetDlgItem (hwnd, IDOK)) ; + SetWindowTextA (GetDlgItem (hwnd, 12298), szFName) ; + SendMessageA (GetDlgItem (hwnd, 12298), CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + SetFocus (GetDlgItem (hwnd, IDOK)) ; + + FreeLibrary (hComdlg) ; + + return TRUE ; + } + } + return TRUE ; + } + return FALSE ; + } + +/* This grabs the MRU list from the registry and fills the combo for the "Run" dialog above */ +void FillList (HWND hCb, char *pszLatest) + { + HKEY hkey ; +/* char szDbgMsg[256] = "" ; */ + char *pszList = NULL, *pszCmd = NULL, cMatch = 0, cMax = 0x60, szIndex[2] = "-" ; + DWORD icList = 0, icCmd = 0 ; + UINT Nix ; + + SendMessageA (hCb, CB_RESETCONTENT, 0, 0) ; + + if (ERROR_SUCCESS != RegCreateKeyExA ( + HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU", + 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL)) + MessageBoxA (hCb, "Unable to open registry key !", "Nix", MB_OK) ; + + RegQueryValueExA (hkey, "MRUList", NULL, NULL, NULL, &icList) ; + + if (icList > 0) + { + pszList = HeapAlloc( GetProcessHeap(), 0, icList) ; + if (ERROR_SUCCESS != RegQueryValueExA (hkey, "MRUList", NULL, NULL, pszList, &icList)) + MessageBoxA (hCb, "Unable to grab MRUList !", "Nix", MB_OK) ; + } + else + { + icList = 1 ; + pszList = HeapAlloc( GetProcessHeap(), 0, icList) ; + pszList[0] = 0 ; + } + + for (Nix = 0 ; Nix < icList - 1 ; Nix++) + { + if (pszList[Nix] > cMax) + cMax = pszList[Nix] ; + + szIndex[0] = pszList[Nix] ; + + if (ERROR_SUCCESS != RegQueryValueExA (hkey, szIndex, NULL, NULL, NULL, &icCmd)) + MessageBoxA (hCb, "Unable to grab size of index", "Nix", MB_OK) ; + if( pszCmd ) + pszCmd = HeapReAlloc(GetProcessHeap(), 0, pszCmd, icCmd) ; + else + pszCmd = HeapAlloc(GetProcessHeap(), 0, icCmd) ; + if (ERROR_SUCCESS != RegQueryValueExA (hkey, szIndex, NULL, NULL, pszCmd, &icCmd)) + MessageBoxA (hCb, "Unable to grab index", "Nix", MB_OK) ; + + if (NULL != pszLatest) + { + if (!strcasecmp (pszCmd, pszLatest)) + { + /* + sprintf (szDbgMsg, "Found existing (%d).\n", Nix) ; + MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ; + */ + SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszCmd) ; + SetWindowTextA (hCb, pszCmd) ; + SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + + cMatch = pszList[Nix] ; + memmove (&pszList[1], pszList, Nix) ; + pszList[0] = cMatch ; + continue ; + } + } + + if (26 != icList - 1 || icList - 2 != Nix || cMatch || NULL == pszLatest) + { + /* + sprintf (szDbgMsg, "Happily appending (%d).\n", Nix) ; + MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ; + */ + SendMessageA (hCb, CB_ADDSTRING, 0, (LPARAM)pszCmd) ; + if (!Nix) + { + SetWindowTextA (hCb, pszCmd) ; + SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + } + + } + else + { + /* + sprintf (szDbgMsg, "Doing loop thing.\n") ; + MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ; + */ + SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszLatest) ; + SetWindowTextA (hCb, pszLatest) ; + SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + + cMatch = pszList[Nix] ; + memmove (&pszList[1], pszList, Nix) ; + pszList[0] = cMatch ; + szIndex[0] = cMatch ; + RegSetValueExA (hkey, szIndex, 0, REG_SZ, pszLatest, strlen (pszLatest) + 1) ; + } + } + + if (!cMatch && NULL != pszLatest) + { + /* + sprintf (szDbgMsg, "Simply inserting (increasing list).\n") ; + MessageBoxA (hCb, szDbgMsg, "Nix", MB_OK) ; + */ + SendMessageA (hCb, CB_INSERTSTRING, 0, (LPARAM)pszLatest) ; + SetWindowTextA (hCb, pszLatest) ; + SendMessageA (hCb, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + + cMatch = ++cMax ; + if( pszList ) + pszList = HeapReAlloc(GetProcessHeap(), 0, pszList, ++icList) ; + else + pszList = HeapAlloc(GetProcessHeap(), 0, ++icList) ; + memmove (&pszList[1], pszList, icList - 1) ; + pszList[0] = cMatch ; + szIndex[0] = cMatch ; + RegSetValueExA (hkey, szIndex, 0, REG_SZ, pszLatest, strlen (pszLatest) + 1) ; + } + + RegSetValueExA (hkey, "MRUList", 0, REG_SZ, pszList, strlen (pszList) + 1) ; + + HeapFree( GetProcessHeap(), 0, pszCmd) ; + HeapFree( GetProcessHeap(), 0, pszList) ; + } + + +/************************************************************************* + * ConfirmDialog [internal] + * + * Put up a confirm box, return TRUE if the user confirmed + */ +static BOOL ConfirmDialog(HWND hWndOwner, UINT PromptId, UINT TitleId) +{ + WCHAR Prompt[256]; + WCHAR Title[256]; + + LoadStringW(shell32_hInstance, PromptId, Prompt, sizeof(Prompt) / sizeof(WCHAR)); + LoadStringW(shell32_hInstance, TitleId, Title, sizeof(Title) / sizeof(WCHAR)); + return MessageBoxW(hWndOwner, Prompt, Title, MB_YESNO|MB_ICONQUESTION) == IDYES; +} + + +/************************************************************************* + * RestartDialogEx [SHELL32.730] + */ + +int WINAPI RestartDialogEx(HWND hWndOwner, LPCWSTR lpwstrReason, DWORD uFlags, DWORD uReason) +{ + TRACE("(%p)\n", hWndOwner); + + /*FIXME: use uReason */ + + if (ConfirmDialog(hWndOwner, IDS_RESTART_PROMPT, IDS_RESTART_TITLE)) + { + HANDLE hToken; + TOKEN_PRIVILEGES npr; + + /* enable shutdown privilege for current process */ + if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) + { + LookupPrivilegeValueA(0, "SeShutdownPrivilege", &npr.Privileges[0].Luid); + npr.PrivilegeCount = 1; + npr.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + AdjustTokenPrivileges(hToken, FALSE, &npr, 0, 0, 0); + CloseHandle(hToken); + } + ExitWindowsEx(EWX_REBOOT, 0); + } + + return 0; +} + + +/************************************************************************* + * RestartDialog [SHELL32.59] + */ + +int WINAPI RestartDialog(HWND hWndOwner, LPCWSTR lpstrReason, DWORD uFlags) +{ + return RestartDialogEx(hWndOwner, lpstrReason, uFlags, 0); +} + + +/************************************************************************* + * ExitWindowsDialog [SHELL32.60] + * + * NOTES + * exported by ordinal + */ +void WINAPI ExitWindowsDialog (HWND hWndOwner) +{ + TRACE("(%p)\n", hWndOwner); + + if (ConfirmDialog(hWndOwner, IDS_SHUTDOWN_PROMPT, IDS_SHUTDOWN_TITLE)) + { + HANDLE hToken; + TOKEN_PRIVILEGES npr; + + /* enable shutdown privilege for current process */ + if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) + { + LookupPrivilegeValueA(0, "SeShutdownPrivilege", &npr.Privileges[0].Luid); + npr.PrivilegeCount = 1; + npr.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + AdjustTokenPrivileges(hToken, FALSE, &npr, 0, 0, 0); + CloseHandle(hToken); + } + ExitWindowsEx(EWX_SHUTDOWN, 0); + } +} diff --git a/reactos/lib/shell32/dragdrophelper.c b/reactos/lib/shell32/dragdrophelper.c new file mode 100644 index 00000000000..e298407674d --- /dev/null +++ b/reactos/lib/shell32/dragdrophelper.c @@ -0,0 +1,186 @@ +/* + * file system folder + * + * Copyright 1997 Marcus Meissner + * Copyright 1998, 1999, 2002 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wingdi.h" +#include "winuser.h" + +#include "objbase.h" +#include "ole2.h" +#include "shlguid.h" +#include "shlobj.h" + +#include "wine/debug.h" +#include "debughlp.h" + +WINE_DEFAULT_DEBUG_CHANNEL (shell); + +/*********************************************************************** +* IDropTargetHelper implementation +*/ + +typedef struct { + IDropTargetHelperVtbl *lpVtbl; + DWORD ref; +} IDropTargetHelperImpl; + +static struct IDropTargetHelperVtbl vt_IDropTargetHelper; + +#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl) +#define _IDropTargetHelper_(This) (IDropTargetHelper*)&(This->lpVtbl) + +/************************************************************************** +* IDropTargetHelper_Constructor +*/ +HRESULT WINAPI IDropTargetHelper_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +{ + IDropTargetHelperImpl *dth; + + TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); + + if (!ppv) + return E_POINTER; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + dth = (IDropTargetHelperImpl *) LocalAlloc (GMEM_ZEROINIT, sizeof (IDropTargetHelperImpl)); + if (!dth) return E_OUTOFMEMORY; + + dth->ref = 0; + dth->lpVtbl = &vt_IDropTargetHelper; + + if (!SUCCEEDED (IUnknown_QueryInterface (_IUnknown_ (dth), riid, ppv))) { + IUnknown_Release (_IUnknown_ (dth)); + return E_NOINTERFACE; + } + + TRACE ("--(%p)\n", dth); + return S_OK; +} + +/************************************************************************** + * IDropTargetHelper_fnQueryInterface + */ +static HRESULT WINAPI IDropTargetHelper_fnQueryInterface (IDropTargetHelper * iface, REFIID riid, LPVOID * ppvObj) +{ + IDropTargetHelperImpl *This = (IDropTargetHelperImpl *)iface; + + TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj); + + *ppvObj = NULL; + + if (IsEqualIID (riid, &IID_IUnknown) || IsEqualIID (riid, &IID_IDropTargetHelper)) { + *ppvObj = This; + } + + if (*ppvObj) { + IUnknown_AddRef ((IUnknown *) (*ppvObj)); + TRACE ("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj); + return S_OK; + } + FIXME ("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI IDropTargetHelper_fnAddRef (IDropTargetHelper * iface) +{ + IDropTargetHelperImpl *This = (IDropTargetHelperImpl *)iface; + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return ++(This->ref); +} + +static ULONG WINAPI IDropTargetHelper_fnRelease (IDropTargetHelper * iface) +{ + IDropTargetHelperImpl *This = (IDropTargetHelperImpl *)iface; + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + if (!--(This->ref)) { + TRACE("-- destroying (%p)\n", This); + LocalFree ((HLOCAL) This); + return 0; + } + return This->ref; +} + +static HRESULT WINAPI IDropTargetHelper_fnDragEnter ( + IDropTargetHelper * iface, + HWND hwndTarget, + IDataObject* pDataObject, + POINT* ppt, + DWORD dwEffect) +{ + IDropTargetHelperImpl *This = (IDropTargetHelperImpl *)iface; + FIXME ("(%p)->(%p %p %p 0x%08lx)\n", This,hwndTarget, pDataObject, ppt, dwEffect); + return E_NOTIMPL; +} + +static HRESULT WINAPI IDropTargetHelper_fnDragLeave (IDropTargetHelper * iface) +{ + IDropTargetHelperImpl *This = (IDropTargetHelperImpl *)iface; + FIXME ("(%p)->()\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI IDropTargetHelper_fnDragOver (IDropTargetHelper * iface, POINT* ppt, DWORD dwEffect) +{ + IDropTargetHelperImpl *This = (IDropTargetHelperImpl *)iface; + FIXME ("(%p)->(%p 0x%08lx)\n", This, ppt, dwEffect); + return E_NOTIMPL; +} + +static HRESULT WINAPI IDropTargetHelper_fnDrop (IDropTargetHelper * iface, IDataObject* pDataObject, POINT* ppt, DWORD dwEffect) +{ + IDropTargetHelperImpl *This = (IDropTargetHelperImpl *)iface; + FIXME ("(%p)->(%p %p 0x%08lx)\n", This, pDataObject, ppt, dwEffect); + return E_NOTIMPL; +} + +static HRESULT WINAPI IDropTargetHelper_fnShow (IDropTargetHelper * iface, BOOL fShow) +{ + IDropTargetHelperImpl *This = (IDropTargetHelperImpl *)iface; + FIXME ("(%p)->(%u)\n", This, fShow); + return E_NOTIMPL; +} + +static IDropTargetHelperVtbl vt_IDropTargetHelper = +{ + IDropTargetHelper_fnQueryInterface, + IDropTargetHelper_fnAddRef, + IDropTargetHelper_fnRelease, + IDropTargetHelper_fnDragEnter, + IDropTargetHelper_fnDragLeave, + IDropTargetHelper_fnDragOver, + IDropTargetHelper_fnDrop, + IDropTargetHelper_fnShow +}; diff --git a/reactos/lib/shell32/enumidlist.c b/reactos/lib/shell32/enumidlist.c new file mode 100644 index 00000000000..ea45a23dbd9 --- /dev/null +++ b/reactos/lib/shell32/enumidlist.c @@ -0,0 +1,376 @@ +/* + * IEnumIDList + * + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "undocshell.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" + +#include "pidl.h" +#include "shlguid.h" +#include "enumidlist.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +typedef struct tagENUMLIST +{ + struct tagENUMLIST *pNext; + LPITEMIDLIST pidl; + +} ENUMLIST, *LPENUMLIST; + +typedef struct +{ + IEnumIDListVtbl *lpVtbl; + DWORD ref; + LPENUMLIST mpFirst; + LPENUMLIST mpLast; + LPENUMLIST mpCurrent; + +} IEnumIDListImpl; + +static struct IEnumIDListVtbl eidlvt; + +/************************************************************************** + * AddToEnumList() + */ +BOOL AddToEnumList( + IEnumIDList * iface, + LPITEMIDLIST pidl) +{ + IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + + LPENUMLIST pNew; + + TRACE("(%p)->(pidl=%p)\n",This,pidl); + + if (!iface || !pidl) + return FALSE; + + pNew = (LPENUMLIST)SHAlloc(sizeof(ENUMLIST)); + if(pNew) + { + /*set the next pointer */ + pNew->pNext = NULL; + pNew->pidl = pidl; + + /*is This the first item in the list? */ + if(!This->mpFirst) + { + This->mpFirst = pNew; + This->mpCurrent = pNew; + } + + if(This->mpLast) + { + /*add the new item to the end of the list */ + This->mpLast->pNext = pNew; + } + + /*update the last item pointer */ + This->mpLast = pNew; + TRACE("-- (%p)->(first=%p, last=%p)\n",This,This->mpFirst,This->mpLast); + return TRUE; + } + return FALSE; +} + +/************************************************************************** + * CreateFolderEnumList() + */ +BOOL CreateFolderEnumList( + IEnumIDList *list, + LPCSTR lpszPath, + DWORD dwFlags) +{ + LPITEMIDLIST pidl=NULL; + WIN32_FIND_DATAA stffile; + HANDLE hFile; + CHAR szPath[MAX_PATH]; + BOOL succeeded = TRUE; + + TRACE("(%p)->(path=%s flags=0x%08lx) \n",list,debugstr_a(lpszPath),dwFlags); + + if(!lpszPath || !lpszPath[0]) return FALSE; + + strcpy(szPath, lpszPath); + PathAddBackslashA(szPath); + strcat(szPath,"*.*"); + + hFile = FindFirstFileA(szPath,&stffile); + if ( hFile != INVALID_HANDLE_VALUE ) + { + BOOL findFinished = FALSE; + + do + { + if ( !(stffile.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) + || (dwFlags & SHCONTF_INCLUDEHIDDEN) ) + { + if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + dwFlags & SHCONTF_FOLDERS && + strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, "..")) + { + pidl = _ILCreateFromFindDataA(&stffile); + succeeded = succeeded && AddToEnumList(list, pidl); + } + else if (!(stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + && dwFlags & SHCONTF_NONFOLDERS) + { + pidl = _ILCreateFromFindDataA(&stffile); + succeeded = succeeded && AddToEnumList(list, pidl); + } + } + if (succeeded) + { + if (!FindNextFileA(hFile, &stffile)) + { + if (GetLastError() == ERROR_NO_MORE_FILES) + findFinished = TRUE; + else + succeeded = FALSE; + } + } + } while (succeeded && !findFinished); + FindClose(hFile); + } + return succeeded; +} + +/************************************************************************** +* DeleteList() +*/ +static BOOL DeleteList( + IEnumIDList * iface) +{ + IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + + LPENUMLIST pDelete; + + TRACE("(%p)->()\n",This); + + while(This->mpFirst) + { pDelete = This->mpFirst; + This->mpFirst = pDelete->pNext; + SHFree(pDelete->pidl); + SHFree(pDelete); + } + This->mpFirst = This->mpLast = This->mpCurrent = NULL; + return TRUE; +} + +/************************************************************************** + * IEnumIDList_Folder_Constructor + * + */ + +IEnumIDList * IEnumIDList_Constructor(void) +{ + IEnumIDListImpl *lpeidl = (IEnumIDListImpl*)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(IEnumIDListImpl)); + + if (lpeidl) + { + lpeidl->ref = 1; + lpeidl->lpVtbl = &eidlvt; + } + TRACE("-- (%p)->()\n",lpeidl); + + return (IEnumIDList*)lpeidl; +} + +/************************************************************************** + * EnumIDList_QueryInterface + */ +static HRESULT WINAPI IEnumIDList_fnQueryInterface( + IEnumIDList * iface, + REFIID riid, + LPVOID *ppvObj) +{ + IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ + { *ppvObj = This; + } + else if(IsEqualIID(riid, &IID_IEnumIDList)) /*IEnumIDList*/ + { *ppvObj = (IEnumIDList*)This; + } + + if(*ppvObj) + { IEnumIDList_AddRef((IEnumIDList*)*ppvObj); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +/****************************************************************************** + * IEnumIDList_fnAddRef + */ +static ULONG WINAPI IEnumIDList_fnAddRef( + IEnumIDList * iface) +{ + IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + TRACE("(%p)->(%lu)\n",This,This->ref); + return ++(This->ref); +} +/****************************************************************************** + * IEnumIDList_fnRelease + */ +static ULONG WINAPI IEnumIDList_fnRelease( + IEnumIDList * iface) +{ + IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + + TRACE("(%p)->(%lu)\n",This,This->ref); + + if (!--(This->ref)) { + TRACE(" destroying IEnumIDList(%p)\n",This); + DeleteList((IEnumIDList*)This); + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->ref; +} + +/************************************************************************** + * IEnumIDList_fnNext + */ + +static HRESULT WINAPI IEnumIDList_fnNext( + IEnumIDList * iface, + ULONG celt, + LPITEMIDLIST * rgelt, + ULONG *pceltFetched) +{ + IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + + ULONG i; + HRESULT hr = S_OK; + LPITEMIDLIST temp; + + TRACE("(%p)->(%ld,%p, %p)\n",This,celt,rgelt,pceltFetched); + +/* It is valid to leave pceltFetched NULL when celt is 1. Some of explorer's + * subsystems actually use it (and so may a third party browser) + */ + if(pceltFetched) + *pceltFetched = 0; + + *rgelt=0; + + if(celt > 1 && !pceltFetched) + { return E_INVALIDARG; + } + + if(celt > 0 && !This->mpCurrent) + { return S_FALSE; + } + + for(i = 0; i < celt; i++) + { if(!(This->mpCurrent)) + break; + + temp = ILClone(This->mpCurrent->pidl); + rgelt[i] = temp; + This->mpCurrent = This->mpCurrent->pNext; + } + if(pceltFetched) + { *pceltFetched = i; + } + + return hr; +} + +/************************************************************************** +* IEnumIDList_fnSkip +*/ +static HRESULT WINAPI IEnumIDList_fnSkip( + IEnumIDList * iface,ULONG celt) +{ + IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + + DWORD dwIndex; + HRESULT hr = S_OK; + + TRACE("(%p)->(%lu)\n",This,celt); + + for(dwIndex = 0; dwIndex < celt; dwIndex++) + { if(!This->mpCurrent) + { hr = S_FALSE; + break; + } + This->mpCurrent = This->mpCurrent->pNext; + } + return hr; +} +/************************************************************************** +* IEnumIDList_fnReset +*/ +static HRESULT WINAPI IEnumIDList_fnReset( + IEnumIDList * iface) +{ + IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + + TRACE("(%p)\n",This); + This->mpCurrent = This->mpFirst; + return S_OK; +} +/************************************************************************** +* IEnumIDList_fnClone +*/ +static HRESULT WINAPI IEnumIDList_fnClone( + IEnumIDList * iface,LPENUMIDLIST * ppenum) +{ + IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + + TRACE("(%p)->() to (%p)->() E_NOTIMPL\n",This,ppenum); + return E_NOTIMPL; +} + +/************************************************************************** + * IEnumIDList_fnVTable + */ +static IEnumIDListVtbl eidlvt = +{ + IEnumIDList_fnQueryInterface, + IEnumIDList_fnAddRef, + IEnumIDList_fnRelease, + IEnumIDList_fnNext, + IEnumIDList_fnSkip, + IEnumIDList_fnReset, + IEnumIDList_fnClone, +}; diff --git a/reactos/lib/shell32/enumidlist.h b/reactos/lib/shell32/enumidlist.h new file mode 100644 index 00000000000..4cb03721d8b --- /dev/null +++ b/reactos/lib/shell32/enumidlist.h @@ -0,0 +1,30 @@ +/* + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __ENUMIDLIST_H__ +#define __ENUMIDLIST_H__ + +#include "shlobj.h" + +/* Creates an IEnumIDList; add LPITEMIDLISTs to it with AddToEnumList. */ +LPENUMIDLIST IEnumIDList_Constructor(void); +BOOL AddToEnumList(IEnumIDList *list, LPITEMIDLIST pidl); + +/* Enumerates the folders and/or files (depending on dwFlags) in lpszPath and + * adds them to the already-created list. + */ +BOOL CreateFolderEnumList(IEnumIDList *list, LPCSTR lpszPath, DWORD dwFlags); + +#endif /* ndef __ENUMIDLIST_H__ */ diff --git a/reactos/lib/shell32/folders.c b/reactos/lib/shell32/folders.c new file mode 100644 index 00000000000..c3664909942 --- /dev/null +++ b/reactos/lib/shell32/folders.c @@ -0,0 +1,560 @@ +/* + * Copyright 1997 Marcus Meissner + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "objbase.h" +#include "undocshell.h" +#include "shlguid.h" +#include "winreg.h" +#include "shlwapi.h" + +#include "wine/debug.h" +#include "wine/unicode.h" + +#include "pidl.h" +#include "shell32_main.h" +#include "shfldr.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/*********************************************************************** +* IExtractIconW implementation +*/ +typedef struct +{ + IExtractIconWVtbl *lpVtbl; + DWORD ref; + IPersistFileVtbl *lpvtblPersistFile; + IExtractIconAVtbl *lpvtblExtractIconA; + LPITEMIDLIST pidl; +} IExtractIconWImpl; + +static struct IExtractIconAVtbl eiavt; +static struct IExtractIconWVtbl eivt; +static struct IPersistFileVtbl pfvt; + +#define _IPersistFile_Offset ((int)(&(((IExtractIconWImpl*)0)->lpvtblPersistFile))) +#define _ICOM_THIS_From_IPersistFile(class, name) class* This = (class*)(((char*)name)-_IPersistFile_Offset); + +#define _IExtractIconA_Offset ((int)(&(((IExtractIconWImpl*)0)->lpvtblExtractIconA))) +#define _ICOM_THIS_From_IExtractIconA(class, name) class* This = (class*)(((char*)name)-_IExtractIconA_Offset); + +/************************************************************************** +* IExtractIconW_Constructor +*/ +IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl) +{ + IExtractIconWImpl* ei; + + TRACE("%p\n", pidl); + + ei = (IExtractIconWImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IExtractIconWImpl)); + ei->ref=1; + ei->lpVtbl = &eivt; + ei->lpvtblPersistFile = &pfvt; + ei->lpvtblExtractIconA = &eiavt; + ei->pidl=ILClone(pidl); + + pdump(pidl); + + TRACE("(%p)\n", ei); + return (IExtractIconW *)ei; +} +/************************************************************************** + * IExtractIconW_QueryInterface + */ +static HRESULT WINAPI IExtractIconW_fnQueryInterface(IExtractIconW *iface, REFIID riid, LPVOID *ppvObj) +{ + IExtractIconWImpl *This = (IExtractIconWImpl *)iface; + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n", This, debugstr_guid(riid), ppvObj); + + *ppvObj = NULL; + + if (IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ + { + *ppvObj = This; + } + else if (IsEqualIID(riid, &IID_IPersistFile)) /*IExtractIcon*/ + { + *ppvObj = (IPersistFile*)&(This->lpvtblPersistFile); + } + else if (IsEqualIID(riid, &IID_IExtractIconA)) /*IExtractIcon*/ + { + *ppvObj = (IExtractIconA*)&(This->lpvtblExtractIconA); + } + else if (IsEqualIID(riid, &IID_IExtractIconW)) /*IExtractIcon*/ + { + *ppvObj = (IExtractIconW*)This; + } + + if(*ppvObj) + { + IExtractIconW_AddRef((IExtractIconW*) *ppvObj); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +/************************************************************************** +* IExtractIconW_AddRef +*/ +static ULONG WINAPI IExtractIconW_fnAddRef(IExtractIconW * iface) +{ + IExtractIconWImpl *This = (IExtractIconWImpl *)iface; + + TRACE("(%p)->(count=%lu)\n",This, This->ref ); + + return ++(This->ref); +} +/************************************************************************** +* IExtractIconW_Release +*/ +static ULONG WINAPI IExtractIconW_fnRelease(IExtractIconW * iface) +{ + IExtractIconWImpl *This = (IExtractIconWImpl *)iface; + + TRACE("(%p)->()\n",This); + + if (!--(This->ref)) + { + TRACE(" destroying IExtractIcon(%p)\n",This); + SHFree(This->pidl); + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->ref; +} + +static HRESULT getIconLocationForFolder(IExtractIconW *iface, UINT uFlags, + LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags) +{ + IExtractIconWImpl *This = (IExtractIconWImpl *)iface; + DWORD dwNr; + WCHAR wszPath[MAX_PATH]; + WCHAR wszCLSIDValue[CHARS_IN_GUID]; + static const WCHAR shellClassInfo[] = { '.','S','h','e','l','l','C','l','a','s','s','I','n','f','o',0 }; + static const WCHAR iconFile[] = { 'I','c','o','n','F','i','l','e',0 }; + static const WCHAR clsid[] = { 'C','L','S','I','D',0 }; + static const WCHAR clsid2[] = { 'C','L','S','I','D','2',0 }; + static const WCHAR iconIndex[] = { 'I','c','o','n','I','n','d','e','x',0 }; + + if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, iconFile, + wszPath, MAX_PATH)) + { + WCHAR wszIconIndex[10]; + SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, iconIndex, + wszIconIndex, 10); + *piIndex = atoiW(wszIconIndex); + } + else if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, clsid, + wszCLSIDValue, CHARS_IN_GUID) && + HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &dwNr)) + { + *piIndex = dwNr; + } + else if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, clsid2, + wszCLSIDValue, CHARS_IN_GUID) && + HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &dwNr)) + { + *piIndex = dwNr; + } + else + { + static const WCHAR folder[] = { 'F','o','l','d','e','r',0 }; + + if (!HCR_GetDefaultIconW(folder, szIconFile, cchMax, &dwNr)) + { + lstrcpynW(szIconFile, swShell32Name, cchMax); + dwNr = 3; + } + *piIndex = (uFlags & GIL_OPENICON) ? dwNr + 1 : dwNr; + } + return S_OK; +} + +WCHAR swShell32Name[MAX_PATH]; + +/************************************************************************** +* IExtractIconW_GetIconLocation +* +* mapping filetype to icon +*/ +static HRESULT WINAPI IExtractIconW_fnGetIconLocation( + IExtractIconW * iface, + UINT uFlags, /* GIL_ flags */ + LPWSTR szIconFile, + UINT cchMax, + int * piIndex, + UINT * pwFlags) /* returned GIL_ flags */ +{ + IExtractIconWImpl *This = (IExtractIconWImpl *)iface; + + char sTemp[MAX_PATH]; + DWORD dwNr; + GUID const * riid; + LPITEMIDLIST pSimplePidl = ILFindLastID(This->pidl); + + TRACE("(%p) (flags=%u %p %u %p %p)\n", This, uFlags, szIconFile, cchMax, piIndex, pwFlags); + + if (pwFlags) + *pwFlags = 0; + + if (_ILIsDesktop(pSimplePidl)) + { + lstrcpynW(szIconFile, swShell32Name, cchMax); + *piIndex = 34; + } + + /* my computer and other shell extensions */ + else if ((riid = _ILGetGUIDPointer(pSimplePidl))) + { + static const WCHAR fmt[] = { 'C','L','S','I','D','\\', + '{','%','0','8','l','x','-','%','0','4','x','-','%','0','4','x','-', + '%','0','2','x','%','0','2','x','-','%','0','2','x', '%','0','2','x', + '%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x','}',0 }; + WCHAR xriid[50]; + + sprintfW(xriid, fmt, + riid->Data1, riid->Data2, riid->Data3, + riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3], + riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]); + + if (HCR_GetDefaultIconW(xriid, szIconFile, cchMax, &dwNr)) + { + *piIndex = dwNr; + } + else + { + lstrcpynW(szIconFile, swShell32Name, cchMax); + *piIndex = 15; + } + } + + else if (_ILIsDrive (pSimplePidl)) + { + static const WCHAR drive[] = { 'D','r','i','v','e',0 }; + + int icon_idx = -1; + + if (_ILGetDrive(pSimplePidl, sTemp, MAX_PATH)) + { + switch(GetDriveTypeA(sTemp)) + { + case DRIVE_REMOVABLE: icon_idx = 5; break; + case DRIVE_CDROM: icon_idx = 11; break; + case DRIVE_REMOTE: icon_idx = 9; break; + case DRIVE_RAMDISK: icon_idx = 12; break; + } + } + + if (icon_idx != -1) + { + lstrcpynW(szIconFile, swShell32Name, cchMax); + *piIndex = icon_idx; + } + else + { + if (HCR_GetDefaultIconW(drive, szIconFile, cchMax, &dwNr)) + { + *piIndex = dwNr; + } + else + { + lstrcpynW(szIconFile, swShell32Name, cchMax); + *piIndex = 8; + } + } + } + else if (_ILIsFolder (pSimplePidl)) + { + getIconLocationForFolder(iface, uFlags, szIconFile, cchMax, piIndex, + pwFlags); + } + else + { + BOOL found = FALSE; + + if (_ILIsCPanelStruct(pSimplePidl)) + { + if (SUCCEEDED(CPanel_GetIconLocationW(pSimplePidl, szIconFile, cchMax, piIndex))) + found = TRUE; + } + else if (_ILGetExtension(pSimplePidl, sTemp, MAX_PATH)) + { + if (HCR_MapTypeToValueA(sTemp, sTemp, MAX_PATH, TRUE) + && HCR_GetDefaultIconA(sTemp, sTemp, MAX_PATH, &dwNr)) + { + if (!lstrcmpA("%1", sTemp)) /* icon is in the file */ + { + SHGetPathFromIDListW(This->pidl, szIconFile); + *piIndex = 0; + } + else + { + MultiByteToWideChar(CP_ACP, 0, sTemp, -1, szIconFile, cchMax); + *piIndex = dwNr; + } + + found = TRUE; + } + else if (!strcasecmp(sTemp, "lnkfile")) + { + /* extract icon from shell shortcut */ + IShellFolder* dsf; + IShellLinkW* psl; + + if (SUCCEEDED(SHGetDesktopFolder(&dsf))) + { + HRESULT hr = IShellFolder_GetUIObjectOf(dsf, NULL, 1, (LPCITEMIDLIST*)&This->pidl, &IID_IShellLinkW, NULL, (LPVOID*)&psl); + + if (SUCCEEDED(hr)) + { + hr = IShellLinkW_GetIconLocation(psl, szIconFile, MAX_PATH, piIndex); + + if (SUCCEEDED(hr) && *szIconFile) + found = TRUE; + + IShellLinkW_Release(psl); + } + + IShellFolder_Release(dsf); + } + } + } + + if (!found) /* default icon */ + { + lstrcpynW(szIconFile, swShell32Name, cchMax); + *piIndex = 0; + } + } + + TRACE("-- %s %x\n", debugstr_w(szIconFile), *piIndex); + return NOERROR; +} + +/************************************************************************** +* IExtractIconW_Extract +*/ +static HRESULT WINAPI IExtractIconW_fnExtract(IExtractIconW * iface, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) +{ + IExtractIconWImpl *This = (IExtractIconWImpl *)iface; + + FIXME("(%p) (file=%p index=%u %p %p size=%u) semi-stub\n", This, debugstr_w(pszFile), nIconIndex, phiconLarge, phiconSmall, nIconSize); + + if (phiconLarge) + *phiconLarge = ImageList_GetIcon(ShellBigIconList, nIconIndex, ILD_TRANSPARENT); + + if (phiconSmall) + *phiconSmall = ImageList_GetIcon(ShellSmallIconList, nIconIndex, ILD_TRANSPARENT); + + return S_OK; +} + +static struct IExtractIconWVtbl eivt = +{ + IExtractIconW_fnQueryInterface, + IExtractIconW_fnAddRef, + IExtractIconW_fnRelease, + IExtractIconW_fnGetIconLocation, + IExtractIconW_fnExtract +}; + +/************************************************************************** +* IExtractIconA_Constructor +*/ +IExtractIconA* IExtractIconA_Constructor(LPCITEMIDLIST pidl) +{ + IExtractIconWImpl *This = (IExtractIconWImpl *)IExtractIconW_Constructor(pidl); + IExtractIconA *eia = (IExtractIconA *)&This->lpvtblExtractIconA; + + TRACE("(%p)->(%p)\n", This, eia); + return eia; +} +/************************************************************************** + * IExtractIconA_QueryInterface + */ +static HRESULT WINAPI IExtractIconA_fnQueryInterface(IExtractIconA * iface, REFIID riid, LPVOID *ppvObj) +{ + _ICOM_THIS_From_IExtractIconA(IExtractIconW, iface); + + return IExtractIconW_QueryInterface(This, riid, ppvObj); +} + +/************************************************************************** +* IExtractIconA_AddRef +*/ +static ULONG WINAPI IExtractIconA_fnAddRef(IExtractIconA * iface) +{ + _ICOM_THIS_From_IExtractIconA(IExtractIconW, iface); + + return IExtractIconW_AddRef(This); +} +/************************************************************************** +* IExtractIconA_Release +*/ +static ULONG WINAPI IExtractIconA_fnRelease(IExtractIconA * iface) +{ + _ICOM_THIS_From_IExtractIconA(IExtractIconW, iface); + + return IExtractIconW_AddRef(This); +} +/************************************************************************** +* IExtractIconA_GetIconLocation +* +* mapping filetype to icon +*/ +static HRESULT WINAPI IExtractIconA_fnGetIconLocation( + IExtractIconA * iface, + UINT uFlags, + LPSTR szIconFile, + UINT cchMax, + int * piIndex, + UINT * pwFlags) +{ + HRESULT ret; + LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, cchMax * sizeof(WCHAR)); + _ICOM_THIS_From_IExtractIconA(IExtractIconW, iface); + + TRACE("(%p) (flags=%u %p %u %p %p)\n", This, uFlags, szIconFile, cchMax, piIndex, pwFlags); + + ret = IExtractIconW_GetIconLocation(This, uFlags, lpwstrFile, cchMax, piIndex, pwFlags); + WideCharToMultiByte(CP_ACP, 0, lpwstrFile, -1, szIconFile, cchMax, NULL, NULL); + HeapFree(GetProcessHeap(), 0, lpwstrFile); + + TRACE("-- %s %x\n", szIconFile, *piIndex); + return ret; +} +/************************************************************************** +* IExtractIconA_Extract +*/ +static HRESULT WINAPI IExtractIconA_fnExtract(IExtractIconA * iface, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) +{ + HRESULT ret; + INT len = MultiByteToWideChar(CP_ACP, 0, pszFile, -1, NULL, 0); + LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + _ICOM_THIS_From_IExtractIconA(IExtractIconW, iface); + + TRACE("(%p) (file=%p index=%u %p %p size=%u)\n", This, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize); + + MultiByteToWideChar(CP_ACP, 0, pszFile, -1, lpwstrFile, len); + ret = IExtractIconW_Extract(This, lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIconSize); + HeapFree(GetProcessHeap(), 0, lpwstrFile); + return ret; +} + +static struct IExtractIconAVtbl eiavt = +{ + IExtractIconA_fnQueryInterface, + IExtractIconA_fnAddRef, + IExtractIconA_fnRelease, + IExtractIconA_fnGetIconLocation, + IExtractIconA_fnExtract +}; + +/************************************************************************ + * IEIPersistFile_QueryInterface (IUnknown) + */ +static HRESULT WINAPI IEIPersistFile_fnQueryInterface( + IPersistFile *iface, + REFIID iid, + LPVOID *ppvObj) +{ + _ICOM_THIS_From_IPersistFile(IExtractIconW, iface); + + return IExtractIconW_QueryInterface(This, iid, ppvObj); +} + +/************************************************************************ + * IEIPersistFile_AddRef (IUnknown) + */ +static ULONG WINAPI IEIPersistFile_fnAddRef( + IPersistFile *iface) +{ + _ICOM_THIS_From_IPersistFile(IExtractIconW, iface); + + return IExtractIconW_AddRef(This); +} + +/************************************************************************ + * IEIPersistFile_Release (IUnknown) + */ +static ULONG WINAPI IEIPersistFile_fnRelease( + IPersistFile *iface) +{ + _ICOM_THIS_From_IPersistFile(IExtractIconW, iface); + + return IExtractIconW_Release(This); +} + +/************************************************************************ + * IEIPersistFile_GetClassID (IPersist) + */ +static HRESULT WINAPI IEIPersistFile_fnGetClassID( + IPersistFile *iface, + LPCLSID lpClassId) +{ + CLSID StdFolderID = { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; + + if (lpClassId==NULL) + return E_POINTER; + + memcpy(lpClassId, &StdFolderID, sizeof(StdFolderID)); + + return S_OK; +} + +/************************************************************************ + * IEIPersistFile_Load (IPersistFile) + */ +static HRESULT WINAPI IEIPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFileName, DWORD dwMode) +{ + _ICOM_THIS_From_IPersistFile(IExtractIconW, iface); + FIXME("%p\n", This); + return E_NOTIMPL; + +} + +static struct IPersistFileVtbl pfvt = +{ + IEIPersistFile_fnQueryInterface, + IEIPersistFile_fnAddRef, + IEIPersistFile_fnRelease, + IEIPersistFile_fnGetClassID, + (void *) 0xdeadbeef /* IEIPersistFile_fnIsDirty */, + IEIPersistFile_fnLoad, + (void *) 0xdeadbeef /* IEIPersistFile_fnSave */, + (void *) 0xdeadbeef /* IEIPersistFile_fnSaveCompleted */, + (void *) 0xdeadbeef /* IEIPersistFile_fnGetCurFile */ +}; diff --git a/reactos/lib/shell32/iconcache.c b/reactos/lib/shell32/iconcache.c new file mode 100644 index 00000000000..68a941d5747 --- /dev/null +++ b/reactos/lib/shell32/iconcache.c @@ -0,0 +1,594 @@ +/* + * shell icon cache (SIC) + * + * Copyright 1998, 1999 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winreg.h" +#include "wine/debug.h" + +#include "shellapi.h" +#include "objbase.h" +#include "shlguid.h" +#include "pidl.h" +#include "shell32_main.h" +#include "undocshell.h" +#include "shlwapi.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/********************** THE ICON CACHE ********************************/ + +#define INVALID_INDEX -1 + +typedef struct +{ + LPWSTR sSourceFile; /* file (not path!) containing the icon */ + DWORD dwSourceIndex; /* index within the file, if it is a resoure ID it will be negated */ + DWORD dwListIndex; /* index within the iconlist */ + DWORD dwFlags; /* GIL_* flags */ + DWORD dwAccessTime; +} SIC_ENTRY, * LPSIC_ENTRY; + +static HDPA sic_hdpa = 0; + +static CRITICAL_SECTION SHELL32_SicCS; +static CRITICAL_SECTION_DEBUG critsect_debug = +{ + 0, 0, &SHELL32_SicCS, + { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, + 0, 0, { 0, (DWORD)(__FILE__ ": SHELL32_SicCS") } +}; +static CRITICAL_SECTION SHELL32_SicCS = { &critsect_debug, -1, 0, 0, 0, 0 }; + +/***************************************************************************** + * SIC_CompareEntries + * + * NOTES + * Callback for DPA_Search + */ +static INT CALLBACK SIC_CompareEntries( LPVOID p1, LPVOID p2, LPARAM lparam) +{ TRACE("%p %p %8lx\n", p1, p2, lparam); + + if (((LPSIC_ENTRY)p1)->dwSourceIndex != ((LPSIC_ENTRY)p2)->dwSourceIndex) /* first the faster one*/ + return 1; + + if (strcmpiW(((LPSIC_ENTRY)p1)->sSourceFile,((LPSIC_ENTRY)p2)->sSourceFile)) + return 1; + + return 0; +} +/***************************************************************************** + * SIC_IconAppend [internal] + * + * NOTES + * appends an icon pair to the end of the cache + */ +static INT SIC_IconAppend (LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallIcon, HICON hBigIcon) +{ LPSIC_ENTRY lpsice; + INT ret, index, index1; + WCHAR path[MAX_PATH]; + TRACE("%s %i %p %p\n", debugstr_w(sSourceFile), dwSourceIndex, hSmallIcon ,hBigIcon); + + lpsice = (LPSIC_ENTRY) SHAlloc (sizeof (SIC_ENTRY)); + + GetFullPathNameW(sSourceFile, MAX_PATH, path, NULL); + lpsice->sSourceFile = HeapAlloc( GetProcessHeap(), 0, (strlenW(path)+1)*sizeof(WCHAR) ); + strcpyW( lpsice->sSourceFile, path ); + + lpsice->dwSourceIndex = dwSourceIndex; + + EnterCriticalSection(&SHELL32_SicCS); + + index = DPA_InsertPtr(sic_hdpa, 0x7fff, lpsice); + if ( INVALID_INDEX == index ) + { + HeapFree(GetProcessHeap(), 0, lpsice->sSourceFile); + SHFree(lpsice); + ret = INVALID_INDEX; + } + else + { + index = ImageList_AddIcon (ShellSmallIconList, hSmallIcon); + index1= ImageList_AddIcon (ShellBigIconList, hBigIcon); + + if (index!=index1) + { + FIXME("iconlists out of sync 0x%x 0x%x\n", index, index1); + } + lpsice->dwListIndex = index; + ret = lpsice->dwListIndex; + } + + LeaveCriticalSection(&SHELL32_SicCS); + return ret; +} +/**************************************************************************** + * SIC_LoadIcon [internal] + * + * NOTES + * gets small/big icon by number from a file + */ +static INT SIC_LoadIcon (LPCWSTR sSourceFile, INT dwSourceIndex) +{ HICON hiconLarge=0; + HICON hiconSmall=0; + +#if defined(__CYGWIN__) || defined (__MINGW32__) || defined(_MSC_VER) + static UINT (WINAPI*PrivateExtractIconExW)(LPCWSTR,int,HICON*,HICON*,UINT) = NULL; + + if (!PrivateExtractIconExW) { + HMODULE hUser32 = GetModuleHandleA("user32"); + PrivateExtractIconExW = (UINT(WINAPI*)(LPCWSTR,int,HICON*,HICON*,UINT)) GetProcAddress(hUser32, "PrivateExtractIconExW"); + } + + if (PrivateExtractIconExW) + PrivateExtractIconExW(sSourceFile, dwSourceIndex, &hiconLarge, &hiconSmall, 1); + else +#endif + { + PrivateExtractIconsW(sSourceFile, dwSourceIndex, 32, 32, &hiconLarge, NULL, 1, 0); + PrivateExtractIconsW(sSourceFile, dwSourceIndex, 16, 16, &hiconSmall, NULL, 1, 0); + } + + if ( !hiconLarge || !hiconSmall) + { + WARN("failure loading icon %i from %s (%p %p)\n", dwSourceIndex, debugstr_w(sSourceFile), hiconLarge, hiconSmall); + return -1; + } + return SIC_IconAppend (sSourceFile, dwSourceIndex, hiconSmall, hiconLarge); +} +/***************************************************************************** + * SIC_GetIconIndex [internal] + * + * Parameters + * sSourceFile [IN] filename of file containing the icon + * index [IN] index/resID (negated) in this file + * + * NOTES + * look in the cache for a proper icon. if not available the icon is taken + * from the file and cached + */ +INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex ) +{ + SIC_ENTRY sice; + INT ret, index = INVALID_INDEX; + WCHAR path[MAX_PATH]; + + TRACE("%s %i\n", debugstr_w(sSourceFile), dwSourceIndex); + + GetFullPathNameW(sSourceFile, MAX_PATH, path, NULL); + sice.sSourceFile = path; + sice.dwSourceIndex = dwSourceIndex; + + EnterCriticalSection(&SHELL32_SicCS); + + if (NULL != DPA_GetPtr (sic_hdpa, 0)) + { + /* search linear from position 0*/ + index = DPA_Search (sic_hdpa, &sice, 0, SIC_CompareEntries, 0, 0); + } + + if ( INVALID_INDEX == index ) + { + ret = SIC_LoadIcon (sSourceFile, dwSourceIndex); + } + else + { + TRACE("-- found\n"); + ret = ((LPSIC_ENTRY)DPA_GetPtr(sic_hdpa, index))->dwListIndex; + } + + LeaveCriticalSection(&SHELL32_SicCS); + return ret; +} +/***************************************************************************** + * SIC_Initialize [internal] + * + * NOTES + * hack to load the resources from the shell32.dll under a different dll name + * will be removed when the resource-compiler is ready + */ +BOOL SIC_Initialize(void) +{ + HICON hSm, hLg; + UINT index; + int cx_small, cy_small; + int cx_large, cy_large; + + cx_small = GetSystemMetrics(SM_CXSMICON); + cy_small = GetSystemMetrics(SM_CYSMICON); + cx_large = GetSystemMetrics(SM_CXICON); + cy_large = GetSystemMetrics(SM_CYICON); + + TRACE("\n"); + + if (sic_hdpa) /* already initialized?*/ + return TRUE; + + sic_hdpa = DPA_Create(16); + + if (!sic_hdpa) + { + return(FALSE); + } + + ShellSmallIconList = ImageList_Create(16,16,ILC_COLOR32|ILC_MASK,0,0x20); + ShellBigIconList = ImageList_Create(32,32,ILC_COLOR32|ILC_MASK,0,0x20); + + ImageList_SetBkColor(ShellSmallIconList, CLR_NONE); + ImageList_SetBkColor(ShellBigIconList, CLR_NONE); + + for (index=1; index<39; index++) + { + hSm = (HICON)LoadImageA(shell32_hInstance, MAKEINTRESOURCEA(index), IMAGE_ICON, cx_small, cy_small, LR_SHARED); + hLg = (HICON)LoadImageA(shell32_hInstance, MAKEINTRESOURCEA(index), IMAGE_ICON, cx_large, cy_large, LR_SHARED); + + if(!hSm) + { + hSm = LoadImageA(shell32_hInstance, MAKEINTRESOURCEA(1), IMAGE_ICON, cx_small, cy_small, LR_SHARED); + hLg = LoadImageA(shell32_hInstance, MAKEINTRESOURCEA(1), IMAGE_ICON, cx_large, cy_large, LR_SHARED); + } + SIC_IconAppend (swShell32Name, index, hSm, hLg); + } + + TRACE("hIconSmall=%p hIconBig=%p\n",ShellSmallIconList, ShellBigIconList); + + return TRUE; +} +/************************************************************************* + * SIC_Destroy + * + * frees the cache + */ +static INT CALLBACK sic_free( LPVOID ptr, LPVOID lparam ) +{ + HeapFree(GetProcessHeap(), 0, ((LPSIC_ENTRY)ptr)->sSourceFile); + SHFree(ptr); + return TRUE; +} + +void SIC_Destroy(void) +{ + TRACE("\n"); + + EnterCriticalSection(&SHELL32_SicCS); + + if (sic_hdpa) DPA_DestroyCallback(sic_hdpa, sic_free, NULL ); + + sic_hdpa = NULL; + ImageList_Destroy(ShellSmallIconList); + ShellSmallIconList = 0; + ImageList_Destroy(ShellBigIconList); + ShellBigIconList = 0; + + LeaveCriticalSection(&SHELL32_SicCS); + DeleteCriticalSection(&SHELL32_SicCS); +} + +/************************************************************************* + * Shell_GetImageList [SHELL32.71] + * + * PARAMETERS + * imglist[1|2] [OUT] pointer which receives imagelist handles + * + */ +BOOL WINAPI Shell_GetImageList(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList) +{ TRACE("(%p,%p)\n",lpBigList,lpSmallList); + if (lpBigList) + { *lpBigList = ShellBigIconList; + } + if (lpSmallList) + { *lpSmallList = ShellSmallIconList; + } + + return TRUE; +} +/************************************************************************* + * PidlToSicIndex [INTERNAL] + * + * PARAMETERS + * sh [IN] IShellFolder + * pidl [IN] + * bBigIcon [IN] + * uFlags [IN] GIL_* + * pIndex [OUT] index within the SIC + * + */ +BOOL PidlToSicIndex ( + IShellFolder * sh, + LPCITEMIDLIST pidl, + BOOL bBigIcon, + UINT uFlags, + int * pIndex) +{ + IExtractIconW *ei; + WCHAR szIconFile[MAX_PATH]; /* file containing the icon */ + INT iSourceIndex; /* index or resID(negated) in this file */ + BOOL ret = FALSE; + UINT dwFlags = 0; + + TRACE("sf=%p pidl=%p %s\n", sh, pidl, bBigIcon?"Big":"Small"); + + if (SUCCEEDED (IShellFolder_GetUIObjectOf(sh, 0, 1, &pidl, &IID_IExtractIconW, 0, (void **)&ei))) + { + if (SUCCEEDED(IExtractIconW_GetIconLocation(ei, uFlags, szIconFile, MAX_PATH, &iSourceIndex, &dwFlags))) + { + *pIndex = SIC_GetIconIndex(szIconFile, iSourceIndex); + ret = TRUE; + } + IExtractIconW_Release(ei); + } + + if (INVALID_INDEX == *pIndex) /* default icon when failed */ + *pIndex = 0; + + return ret; + +} + +/************************************************************************* + * SHMapPIDLToSystemImageListIndex [SHELL32.77] + * + * PARAMETERS + * sh [IN] pointer to an instance of IShellFolder + * pidl [IN] + * pIndex [OUT][OPTIONAL] SIC index for big icon + * + */ +int WINAPI SHMapPIDLToSystemImageListIndex( + IShellFolder *sh, + LPCITEMIDLIST pidl, + int *pIndex) +{ + int Index; + + TRACE("(SF=%p,pidl=%p,%p)\n",sh,pidl,pIndex); + pdump(pidl); + + if (pIndex) + if (!PidlToSicIndex ( sh, pidl, 1, 0, pIndex)) + *pIndex = -1; + + if (!PidlToSicIndex ( sh, pidl, 0, 0, &Index)) + return -1; + + return Index; +} + +/************************************************************************* + * Shell_GetCachedImageIndex [SHELL32.72] + * + */ +INT WINAPI Shell_GetCachedImageIndexA(LPCSTR szPath, INT nIndex, BOOL bSimulateDoc) +{ + INT ret, len; + LPWSTR szTemp; + + WARN("(%s,%08x,%08x) semi-stub.\n",debugstr_a(szPath), nIndex, bSimulateDoc); + + len = MultiByteToWideChar( CP_ACP, 0, szPath, -1, NULL, 0 ); + szTemp = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, szPath, -1, szTemp, len ); + + ret = SIC_GetIconIndex( szTemp, nIndex ); + + HeapFree( GetProcessHeap(), 0, szTemp ); + + return ret; +} + +INT WINAPI Shell_GetCachedImageIndexW(LPCWSTR szPath, INT nIndex, BOOL bSimulateDoc) +{ + WARN("(%s,%08x,%08x) semi-stub.\n",debugstr_w(szPath), nIndex, bSimulateDoc); + + return SIC_GetIconIndex(szPath, nIndex); +} + +INT WINAPI Shell_GetCachedImageIndexAW(LPCVOID szPath, INT nIndex, BOOL bSimulateDoc) +{ if( SHELL_OsIsUnicode()) + return Shell_GetCachedImageIndexW(szPath, nIndex, bSimulateDoc); + return Shell_GetCachedImageIndexA(szPath, nIndex, bSimulateDoc); +} + +/************************************************************************* + * ExtractIconEx [SHELL32.@] + */ +UINT WINAPI ExtractIconExAW(LPCVOID lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons) +{ if (SHELL_OsIsUnicode()) + return ExtractIconExW ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons); + return ExtractIconExA ( lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons); +} + +/************************************************************************* + * ExtractIconExW [SHELL32.@] + * RETURNS + * 0 no icon found + * -1 file is not valid + * or number of icons extracted + */ +UINT WINAPI ExtractIconExW(LPCWSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons) +{ + /* get entry point of undocumented function PrivateExtractIconExW() in user32 */ +#if defined(__CYGWIN__) || defined (__MINGW32__) || defined(_MSC_VER) + static UINT (WINAPI*PrivateExtractIconExW)(LPCWSTR,int,HICON*,HICON*,UINT) = NULL; + + if (!PrivateExtractIconExW) { + HMODULE hUser32 = GetModuleHandleA("user32"); + PrivateExtractIconExW = (UINT(WINAPI*)(LPCWSTR,int,HICON*,HICON*,UINT)) GetProcAddress(hUser32, "PrivateExtractIconExW"); + + if (!PrivateExtractIconExW) + return 0; + } +#endif + + TRACE("%s %i %p %p %i\n", debugstr_w(lpszFile), nIconIndex, phiconLarge, phiconSmall, nIcons); + + return PrivateExtractIconExW(lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons); +} + +/************************************************************************* + * ExtractIconExA [SHELL32.@] + */ +UINT WINAPI ExtractIconExA(LPCSTR lpszFile, INT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIcons) +{ + UINT ret; + INT len = MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, NULL, 0); + LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + + TRACE("%s %i %p %p %i\n", lpszFile, nIconIndex, phiconLarge, phiconSmall, nIcons); + + MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, lpwstrFile, len); + ret = ExtractIconExW (lpwstrFile, nIconIndex, phiconLarge, phiconSmall, nIcons); + HeapFree(GetProcessHeap(), 0, lpwstrFile); + return ret; +} + +/************************************************************************* + * ExtractAssociatedIconA (SHELL32.@) + * + * Return icon for given file (either from file itself or from associated + * executable) and patch parameters if needed. + */ +HICON WINAPI ExtractAssociatedIconA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIcon) +{ + HICON hIcon; + WORD wDummyIcon = 0; + + TRACE("\n"); + + if(lpiIcon == NULL) + lpiIcon = &wDummyIcon; + + hIcon = ExtractIconA(hInst, lpIconPath, *lpiIcon); + + if( hIcon < (HICON)2 ) + { if( hIcon == (HICON)1 ) /* no icons found in given file */ + { char tempPath[0x80]; + HINSTANCE uRet = FindExecutableA(lpIconPath,NULL,tempPath); + + if( uRet > (HINSTANCE)32 && tempPath[0] ) + { strcpy(lpIconPath,tempPath); + hIcon = ExtractIconA(hInst, lpIconPath, *lpiIcon); + if( hIcon > (HICON)2 ) + return hIcon; + } + else hIcon = 0; + } + + if( hIcon == (HICON)1 ) + *lpiIcon = 2; /* MSDOS icon - we found .exe but no icons in it */ + else + *lpiIcon = 6; /* generic icon - found nothing */ + + if (GetModuleFileNameA(hInst, lpIconPath, 0x80)) + { + /* terminate string (GetModuleFileName doesn't do if buffer is too small) */ + lpIconPath[0x80 - 1] = '\0'; + hIcon = LoadIconA( hInst, MAKEINTRESOURCEA(*lpiIcon)); + } + } + return hIcon; +} + +/************************************************************************* + * ExtractAssociatedIconExW (SHELL32.@) + * + * Return icon for given file (either from file itself or from associated + * executable) and patch parameters if needed. + */ +HICON WINAPI ExtractAssociatedIconExW(HINSTANCE hInst, LPWSTR lpIconPath, LPWORD lpiIconIdx, LPWORD lpiIconId) +{ + FIXME("%p %s %p %p): stub\n", hInst, debugstr_w(lpIconPath), lpiIconIdx, lpiIconId); + return 0; +} + +/************************************************************************* + * ExtractAssociatedIconExA (SHELL32.@) + * + * Return icon for given file (either from file itself or from associated + * executable) and patch parameters if needed. + */ +HICON WINAPI ExtractAssociatedIconExA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIconIdx, LPWORD lpiIconId) +{ + HICON ret; + INT len = MultiByteToWideChar( CP_ACP, 0, lpIconPath, -1, NULL, 0 ); + LPWSTR lpwstrFile = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ); + + TRACE("%p %s %p %p)\n", hInst, lpIconPath, lpiIconIdx, lpiIconId); + + MultiByteToWideChar( CP_ACP, 0, lpIconPath, -1, lpwstrFile, len ); + ret = ExtractAssociatedIconExW(hInst, lpwstrFile, lpiIconIdx, lpiIconId); + HeapFree(GetProcessHeap(), 0, lpwstrFile); + return ret; +} + + +/**************************************************************************** + * SHDefExtractIconW [SHELL32.@] + */ +HRESULT WINAPI SHDefExtractIconW(LPCWSTR pszIconFile, int iIndex, UINT uFlags, + HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize) +{ + UINT ret; + HICON hIcons[2]; + WARN("%s %d 0x%08x %p %p %d, semi-stub\n", debugstr_w(pszIconFile), iIndex, uFlags, phiconLarge, phiconSmall, nIconSize); + + ret = PrivateExtractIconsW(pszIconFile, iIndex, nIconSize, nIconSize, hIcons, NULL, 2, LR_DEFAULTCOLOR); + /* FIXME: deal with uFlags parameter which contains GIL_ flags */ + if (ret == 0xFFFFFFFF) + return E_FAIL; + if (ret > 0) { + *phiconLarge = hIcons[0]; + *phiconSmall = hIcons[1]; + return S_OK; + } + return S_FALSE; +} + +/**************************************************************************** + * SHDefExtractIconA [SHELL32.@] + */ +HRESULT WINAPI SHDefExtractIconA(LPCSTR pszIconFile, int iIndex, UINT uFlags, + HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize) +{ + HRESULT ret; + INT len = MultiByteToWideChar(CP_ACP, 0, pszIconFile, -1, NULL, 0); + LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + + TRACE("%s %d 0x%08x %p %p %d\n", pszIconFile, iIndex, uFlags, phiconLarge, phiconSmall, nIconSize); + + MultiByteToWideChar(CP_ACP, 0, pszIconFile, -1, lpwstrFile, len); + ret = SHDefExtractIconW(lpwstrFile, iIndex, uFlags, phiconLarge, phiconSmall, nIconSize); + HeapFree(GetProcessHeap(), 0, lpwstrFile); + return ret; +} diff --git a/reactos/lib/shell32/makefile b/reactos/lib/shell32/makefile new file mode 100644 index 00000000000..263de228b36 --- /dev/null +++ b/reactos/lib/shell32/makefile @@ -0,0 +1,9 @@ +# $Id: makefile 7409 2004-01-02 19:49:47Z gvg $ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = winedll + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/shell32/memorystream.c b/reactos/lib/shell32/memorystream.c new file mode 100644 index 00000000000..33cd883cc4c --- /dev/null +++ b/reactos/lib/shell32/memorystream.c @@ -0,0 +1,296 @@ +/* + * this class implements a pure IStream object + * and can be used for many purposes + * + * the main reason for implementing this was + * a cleaner implementation of IShellLink which + * needs to be able to load lnk's from a IStream + * interface so it was obvious to capsule the file + * access in a IStream to. + * + * Copyright 1999 Juergen Schmied + * Copyright 2003 Mike McCormack 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winuser.h" +#include "wingdi.h" +#include "shlobj.h" +#include "wine/debug.h" +#include "shell32_main.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +static const IStreamVtbl stvt; + +typedef struct +{ + const IStreamVtbl *lpvtst; + DWORD ref; + HANDLE handle; +} ISHFileStream; + +/************************************************************************** + * CreateStreamOnFile() + * + * similar to CreateStreamOnHGlobal + */ +HRESULT CreateStreamOnFile (LPCWSTR pszFilename, DWORD grfMode, IStream ** ppstm) +{ + ISHFileStream* fstr; + HANDLE handle; + DWORD access = GENERIC_READ, creat; + + if( grfMode & STGM_TRANSACTED ) + return E_INVALIDARG; + + if( grfMode & STGM_WRITE ) + access |= GENERIC_WRITE; + if( grfMode & STGM_READWRITE ) + access = GENERIC_WRITE | GENERIC_READ; + + if( grfMode & STGM_CREATE ) + creat = CREATE_ALWAYS; + else + creat = OPEN_EXISTING; + + TRACE("Opening %s\n", debugstr_w(pszFilename) ); + + handle = CreateFileW( pszFilename, access, FILE_SHARE_READ, NULL, creat, 0, NULL ); + if( handle == INVALID_HANDLE_VALUE ) + return HRESULT_FROM_WIN32(GetLastError()); + + fstr = (ISHFileStream*)HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY,sizeof(ISHFileStream)); + if( !fstr ) + return E_OUTOFMEMORY; + fstr->lpvtst=&stvt; + fstr->ref = 1; + fstr->handle = handle; + + (*ppstm) = (IStream*)fstr; + + return S_OK; +} + +/************************************************************************** +* IStream_fnQueryInterface +*/ +static HRESULT WINAPI IStream_fnQueryInterface(IStream *iface, REFIID riid, LPVOID *ppvObj) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IStream)) + { + *ppvObj = This; + } + + if(*ppvObj) + { + IStream_AddRef((IStream*)*ppvObj); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +/************************************************************************** +* IStream_fnAddRef +*/ +static ULONG WINAPI IStream_fnAddRef(IStream *iface) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)->(count=%lu)\n",This, This->ref); + + return ++(This->ref); +} + +/************************************************************************** +* IStream_fnRelease +*/ +static ULONG WINAPI IStream_fnRelease(IStream *iface) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)->()\n",This); + + if (!--(This->ref)) + { + TRACE(" destroying SHFileStream (%p)\n",This); + CloseHandle(This->handle); + HeapFree(GetProcessHeap(),0,This); + } + return This->ref; +} + +static HRESULT WINAPI IStream_fnRead (IStream * iface, void* pv, ULONG cb, ULONG* pcbRead) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)->(%p,0x%08lx,%p)\n",This, pv, cb, pcbRead); + + if ( !pv ) + return STG_E_INVALIDPOINTER; + + if ( ! ReadFile( This->handle, pv, cb, pcbRead, NULL ) ) + return S_FALSE; + + return S_OK; +} + +static HRESULT WINAPI IStream_fnWrite (IStream * iface, const void* pv, ULONG cb, ULONG* pcbWritten) +{ + DWORD dummy_count; + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + if( !pv ) + return STG_E_INVALIDPOINTER; + + /* WriteFile() doesn't allow to specify NULL as write count pointer */ + if (!pcbWritten) + pcbWritten = &dummy_count; + + if( ! WriteFile( This->handle, pv, cb, pcbWritten, NULL ) ) + return E_FAIL; + + return S_OK; +} + +static HRESULT WINAPI IStream_fnSeek (IStream * iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition) +{ + DWORD pos, newposlo, newposhi; + + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + pos = dlibMove.QuadPart; /* FIXME: truncates */ + newposhi = 0; + newposlo = SetFilePointer( This->handle, pos, &newposhi, dwOrigin ); + if( newposlo == INVALID_SET_FILE_POINTER ) + return E_FAIL; + + plibNewPosition->QuadPart = newposlo | ( (LONGLONG)newposhi<<32); + + return S_OK; +} + +static HRESULT WINAPI IStream_fnSetSize (IStream * iface, ULARGE_INTEGER libNewSize) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + if( ! SetFilePointer( This->handle, libNewSize.QuadPart, NULL, FILE_BEGIN ) ) + return E_FAIL; + + if( ! SetEndOfFile( This->handle ) ) + return E_FAIL; + + return S_OK; +} +static HRESULT WINAPI IStream_fnCopyTo (IStream * iface, IStream* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI IStream_fnCommit (IStream * iface, DWORD grfCommitFlags) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI IStream_fnRevert (IStream * iface) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI IStream_fnLockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI IStream_fnUnlockRegion (IStream * iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI IStream_fnStat (IStream * iface, STATSTG* pstatstg, DWORD grfStatFlag) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI IStream_fnClone (IStream * iface, IStream** ppstm) +{ + ISHFileStream *This = (ISHFileStream *)iface; + + TRACE("(%p)\n",This); + + return E_NOTIMPL; +} + +static const IStreamVtbl stvt = +{ + IStream_fnQueryInterface, + IStream_fnAddRef, + IStream_fnRelease, + IStream_fnRead, + IStream_fnWrite, + IStream_fnSeek, + IStream_fnSetSize, + IStream_fnCopyTo, + IStream_fnCommit, + IStream_fnRevert, + IStream_fnLockRegion, + IStream_fnUnlockRegion, + IStream_fnStat, + IStream_fnClone + +}; diff --git a/reactos/lib/shell32/pidl.c b/reactos/lib/shell32/pidl.c new file mode 100644 index 00000000000..9b32239bf33 --- /dev/null +++ b/reactos/lib/shell32/pidl.c @@ -0,0 +1,2233 @@ +/* + * pidl Handling + * + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * NOTES + * a pidl == NULL means desktop and is legal + * + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "objbase.h" +#include "shlguid.h" +#include "winerror.h" +#include "winnls.h" +#include "undocshell.h" +#include "shell32_main.h" +#include "shellapi.h" +#include "shlwapi.h" + +#include "pidl.h" +#include "debughlp.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(pidl); +WINE_DECLARE_DEBUG_CHANNEL(shell); + +/* from comctl32.dll */ +extern LPVOID WINAPI Alloc(INT); +extern BOOL WINAPI Free(LPVOID); + +/************************************************************************* + * ILGetDisplayNameEx [SHELL32.186] + * + * Retrieves the display name of an ItemIDList + * + * PARAMS + * psf [I] Shell Folder to start with, if NULL the desktop is used + * pidl [I] ItemIDList relativ to the psf to get the display name for + * path [O] Filled in with the display name, assumed to be at least MAX_PATH long + * type [I] Type of display name to retrieve + * 0 = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR uses always the desktop as root + * 1 = SHGDN_NORMAL relative to the root folder + * 2 = SHGDN_INFOLDER relative to the root folder, only the last name + * + * RETURNS + * True if the display name could be retrieved successfully, False otherwise + */ +BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type) +{ + BOOL ret = FALSE; + WCHAR wPath[MAX_PATH]; + + TRACE("%p %p %p %ld\n", psf, pidl, path, type); + + if (!pidl || !path) + return FALSE; + + ret = ILGetDisplayNameExW(psf, pidl, wPath, type); + WideCharToMultiByte(CP_ACP, 0, wPath, -1, path, MAX_PATH, NULL, NULL); + TRACE("%p %p %s\n", psf, pidl, debugstr_a(path)); + + return ret; +} + +BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type) +{ + LPSHELLFOLDER psfParent, lsf = psf; + HRESULT ret = NO_ERROR; + LPCITEMIDLIST pidllast; + STRRET strret; + DWORD flag; + + TRACE("%p %p %p %ld\n", psf, pidl, path, type); + + if (!pidl || !path) + return FALSE; + + if (!lsf) + { + ret = SHGetDesktopFolder(&lsf); + if (FAILED(ret)) + return FALSE; + } + + if (type >= 0 && type <= 2) + { + switch (type) + { + case ILGDN_FORPARSING: + flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR; + break; + case ILGDN_NORMAL: + flag = SHGDN_NORMAL; + break; + case ILGDN_INFOLDER: + flag = SHGDN_INFOLDER; + break; + default: + FIXME("Unknown type parameter = %lx\n", type); + flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR; + break; + } + if (!*(const WORD*)pidl || type == ILGDN_FORPARSING) + { + ret = IShellFolder_GetDisplayNameOf(lsf, pidl, flag, &strret); + if (SUCCEEDED(ret)) + { + ret = StrRetToStrNW(path, MAX_PATH, &strret, pidl); + } + } + else + { + ret = SHBindToParent(pidl, &IID_IShellFolder, (LPVOID*)&psfParent, &pidllast); + if (SUCCEEDED(ret)) + { + ret = IShellFolder_GetDisplayNameOf(psfParent, pidllast, flag, &strret); + if (SUCCEEDED(ret)) + { + ret = StrRetToStrNW(path, MAX_PATH, &strret, pidllast); + } + IShellFolder_Release(psfParent); + } + } + } + + TRACE("%p %p %s\n", psf, pidl, debugstr_w(path)); + + if (!psf) + IShellFolder_Release(lsf); + return SUCCEEDED(ret); +} + +BOOL WINAPI ILGetDisplayNameEx(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPVOID path, DWORD type) +{ + TRACE_(shell)("%p %p %p %ld\n", psf, pidl, path, type); + if (SHELL_OsIsUnicode()) + return ILGetDisplayNameExW(psf, pidl, path, type); + return ILGetDisplayNameExA(psf, pidl, path, type); +} + +/************************************************************************* + * ILGetDisplayName [SHELL32.15] + */ +BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl, LPVOID path) +{ + TRACE_(shell)("%p %p\n", pidl, path); + if (SHELL_OsIsUnicode()) + return ILGetDisplayNameExW(NULL, pidl, path, ILGDN_FORPARSING); + return ILGetDisplayNameExA(NULL, pidl, path, ILGDN_FORPARSING); +} + +/************************************************************************* + * ILFindLastID [SHELL32.16] + * + * NOTES + * observed: pidl=Desktop return=pidl + */ +LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl) +{ + LPCITEMIDLIST pidlLast = pidl; + + TRACE("(pidl=%p)\n",pidl); + + if (!pidl) + return NULL; + + while (pidl->mkid.cb) + { + pidlLast = pidl; + pidl = ILGetNext(pidl); + } + return (LPITEMIDLIST)pidlLast; +} +/************************************************************************* + * ILRemoveLastID [SHELL32.17] + * + * NOTES + * when pidl=Desktop return=FALSE + */ +BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl) +{ + TRACE_(shell)("pidl=%p\n",pidl); + + if (!pidl || !pidl->mkid.cb) + return 0; + ILFindLastID(pidl)->mkid.cb = 0; + return 1; +} + +/************************************************************************* + * ILClone [SHELL32.18] + * + * NOTES + * duplicate an idlist + */ +LPITEMIDLIST WINAPI ILClone (LPCITEMIDLIST pidl) +{ DWORD len; + LPITEMIDLIST newpidl; + + if (!pidl) + return NULL; + + len = ILGetSize(pidl); + newpidl = (LPITEMIDLIST)SHAlloc(len); + if (newpidl) + memcpy(newpidl,pidl,len); + + TRACE("pidl=%p newpidl=%p\n",pidl, newpidl); + pdump(pidl); + + return newpidl; +} +/************************************************************************* + * ILCloneFirst [SHELL32.19] + * + * NOTES + * duplicates the first idlist of a complex pidl + */ +LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl) +{ DWORD len; + LPITEMIDLIST pidlNew = NULL; + + TRACE("pidl=%p \n",pidl); + pdump(pidl); + + if (pidl) + { + len = pidl->mkid.cb; + pidlNew = (LPITEMIDLIST) SHAlloc (len+2); + if (pidlNew) + { + memcpy(pidlNew,pidl,len+2); /* 2 -> mind a desktop pidl */ + + if (len) + ILGetNext(pidlNew)->mkid.cb = 0x00; + } + } + TRACE("-- newpidl=%p\n",pidlNew); + + return pidlNew; +} + +/************************************************************************* + * ILLoadFromStream (SHELL32.26) + * + * NOTES + * the first two bytes are the len, the pidl is following then + */ +HRESULT WINAPI ILLoadFromStream (IStream * pStream, LPITEMIDLIST * ppPidl) +{ WORD wLen = 0; + DWORD dwBytesRead; + HRESULT ret = E_FAIL; + + + TRACE_(shell)("%p %p\n", pStream , ppPidl); + + if (*ppPidl) + { SHFree(*ppPidl); + *ppPidl = NULL; + } + + IStream_AddRef (pStream); + + if (SUCCEEDED(IStream_Read(pStream, (LPVOID)&wLen, 2, &dwBytesRead))) + { + TRACE("PIDL length is %d\n", wLen); + if (wLen != 0) { + *ppPidl = SHAlloc (wLen); + if (SUCCEEDED(IStream_Read(pStream, *ppPidl , wLen, &dwBytesRead))) { + TRACE("Stream read OK\n"); + ret = S_OK; + } else { + WARN("reading pidl failed\n"); + SHFree(*ppPidl); + *ppPidl = NULL; + } + } else { + *ppPidl = NULL; + ret = S_OK; + } + } + + /* we are not yet fully compatible */ + if (*ppPidl && !pcheck(*ppPidl)) + { + WARN("Check failed\n"); + SHFree(*ppPidl); + *ppPidl = NULL; + } + + + IStream_Release (pStream); + TRACE("done\n"); + return ret; +} + +/************************************************************************* + * ILSaveToStream (SHELL32.27) + * + * NOTES + * the first two bytes are the len, the pidl is following then + */ +HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl) +{ + LPCITEMIDLIST pidl; + WORD wLen = 0; + HRESULT ret = E_FAIL; + + TRACE_(shell)("%p %p\n", pStream, pPidl); + + IStream_AddRef (pStream); + + pidl = pPidl; + while (pidl->mkid.cb) + { + wLen += sizeof(WORD) + pidl->mkid.cb; + pidl = ILGetNext(pidl); + } + + if (SUCCEEDED(IStream_Write(pStream, (LPVOID)&wLen, 2, NULL))) + { + if (SUCCEEDED(IStream_Write(pStream, pPidl, wLen, NULL))) + { ret = S_OK; + } + } + IStream_Release (pStream); + + return ret; +} + +/************************************************************************* + * SHILCreateFromPath [SHELL32.28] + * + * Create an ItemIDList from a path + * + * PARAMS + * path [I] + * ppidl [O] + * attributes [I/O] requested attributes on call and actual attributes when + * the function returns + * + * RETURNS + * NO_ERROR if successful, or an OLE errer code otherwise + * + * NOTES + * Wrapper for IShellFolder_ParseDisplayName(). + */ +HRESULT WINAPI SHILCreateFromPathA(LPCSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) +{ + LPSHELLFOLDER sf; + WCHAR lpszDisplayName[MAX_PATH]; + DWORD pchEaten; + HRESULT ret = E_FAIL; + + TRACE_(shell)("%s %p 0x%08lx\n", path, ppidl, attributes ? *attributes : 0); + + if (!MultiByteToWideChar(CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH)) + lpszDisplayName[MAX_PATH-1] = 0; + + if (SUCCEEDED (SHGetDesktopFolder(&sf))) + { + ret = IShellFolder_ParseDisplayName(sf, 0, NULL, lpszDisplayName, &pchEaten, ppidl, attributes); + IShellFolder_Release(sf); + } + return ret; +} + +HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) +{ + LPSHELLFOLDER sf; + DWORD pchEaten; + HRESULT ret = E_FAIL; + + TRACE_(shell)("%s %p 0x%08lx\n", debugstr_w(path), ppidl, attributes ? *attributes : 0); + + if (SUCCEEDED (SHGetDesktopFolder(&sf))) + { + ret = IShellFolder_ParseDisplayName(sf, 0, NULL, (LPWSTR)path, &pchEaten, ppidl, attributes); + IShellFolder_Release(sf); + } + return ret; +} + +HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD * attributes) +{ + if ( SHELL_OsIsUnicode()) + return SHILCreateFromPathW (path, ppidl, attributes); + return SHILCreateFromPathA (path, ppidl, attributes); +} + +/************************************************************************* + * SHCloneSpecialIDList [SHELL32.89] + * + * Create an ItemIDList to one of the special folders. + + * PARAMS + * hwndOwner [in] + * nFolder [in] CSIDL_xxxxx + * fCreate [in] Create folder if it does not exist + * + * RETURNS + * Success: The newly created pidl + * Failure: NULL, if inputs are invalid. + * + * NOTES + * exported by ordinal. + * Caller is responsible for deallocating the returned ItemIDList with the + * shells IMalloc interface, aka ILFree. + */ +LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, DWORD nFolder, BOOL fCreate) +{ LPITEMIDLIST ppidl; + TRACE_(shell)("(hwnd=%p,csidl=0x%lx,%s).\n", hwndOwner, nFolder, fCreate ? "T" : "F"); + + if (fCreate) + nFolder |= CSIDL_FLAG_CREATE; + + SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl); + return ppidl; +} + +/************************************************************************* + * ILGlobalClone [SHELL32.20] + * + * Clones an ItemIDList using Alloc. + * + * PARAMS + * pidl [I] ItemIDList to clone + * + * RETURNS + * Newly allocated ItemIDList. + * + * NOTES + * exported by ordinal. + */ +LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl) +{ DWORD len; + LPITEMIDLIST newpidl; + + if (!pidl) + return NULL; + + len = ILGetSize(pidl); + newpidl = (LPITEMIDLIST)Alloc(len); + if (newpidl) + memcpy(newpidl,pidl,len); + + TRACE("pidl=%p newpidl=%p\n",pidl, newpidl); + pdump(pidl); + + return newpidl; +} + +/************************************************************************* + * ILIsEqual [SHELL32.21] + * + */ +BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + char szData1[MAX_PATH]; + char szData2[MAX_PATH]; + + LPCITEMIDLIST pidltemp1 = pidl1; + LPCITEMIDLIST pidltemp2 = pidl2; + + TRACE("pidl1=%p pidl2=%p\n",pidl1, pidl2); + + /* explorer reads from registry directly (StreamMRU), + so we can only check here */ + if ((!pcheck (pidl1)) || (!pcheck (pidl2))) return FALSE; + + pdump (pidl1); + pdump (pidl2); + + if ( (!pidl1) || (!pidl2) ) return FALSE; + + while (pidltemp1->mkid.cb && pidltemp2->mkid.cb) + { + _ILSimpleGetText(pidltemp1, szData1, MAX_PATH); + _ILSimpleGetText(pidltemp2, szData2, MAX_PATH); + + if (strcasecmp ( szData1, szData2 )!=0 ) + return FALSE; + + pidltemp1 = ILGetNext(pidltemp1); + pidltemp2 = ILGetNext(pidltemp2); + } + + if (!pidltemp1->mkid.cb && !pidltemp2->mkid.cb) + { + return TRUE; + } + + return FALSE; +} +/************************************************************************* + * ILIsParent [SHELL32.23] + * + * Verifies that pidlParent is indeed the (immediate) parent of pidlChild. + * + * PARAMS + * pidlParent [I] + * pidlChild [I] + * bImmediate [I] only return true if the parent is the direct parent + * of the child + * + * RETURNS + * True if the parent ItemIDlist is a complete part of the child ItemIdList, + * False otherwise. + * + * NOTES + * parent = a/b, child = a/b/c -> true, c is in folder a/b + * child = a/b/c/d -> false if bImmediate is true, d is not in folder a/b + * child = a/b/c/d -> true if bImmediate is false, d is in a subfolder of a/b + */ +BOOL WINAPI ILIsParent(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL bImmediate) +{ + char szData1[MAX_PATH]; + char szData2[MAX_PATH]; + + LPCITEMIDLIST pParent = pidlParent; + LPCITEMIDLIST pChild = pidlChild; + + TRACE("%p %p %x\n", pidlParent, pidlChild, bImmediate); + + if (!pParent || !pChild) return FALSE; + + while (pParent->mkid.cb && pChild->mkid.cb) + { + _ILSimpleGetText(pParent, szData1, MAX_PATH); + _ILSimpleGetText(pChild, szData2, MAX_PATH); + + if (strcasecmp ( szData1, szData2 )!=0 ) + return FALSE; + + pParent = ILGetNext(pParent); + pChild = ILGetNext(pChild); + } + + if ( pParent->mkid.cb || ! pChild->mkid.cb) /* child shorter or has equal length to parent */ + return FALSE; + + if ( ILGetNext(pChild)->mkid.cb && bImmediate) /* not immediate descent */ + return FALSE; + + return TRUE; +} + +/************************************************************************* + * ILFindChild [SHELL32.24] + * + * Compares elements from pidl1 and pidl2. + * + * PARAMS + * pidl1 [I] + * pidl2 [I] + * + * RETURNS + * pidl1 is desktop pidl2 + * pidl1 shorter pidl2 pointer to first different element of pidl2 + * if there was at least one equal element + * pidl2 shorter pidl1 0 + * pidl2 equal pidl1 pointer to last 0x00-element of pidl2 + * + * NOTES + * exported by ordinal. + */ +LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + char szData1[MAX_PATH]; + char szData2[MAX_PATH]; + + LPCITEMIDLIST pidltemp1 = pidl1; + LPCITEMIDLIST pidltemp2 = pidl2; + LPCITEMIDLIST ret=NULL; + + TRACE("pidl1=%p pidl2=%p\n",pidl1, pidl2); + + /* explorer reads from registry directly (StreamMRU), + so we can only check here */ + if ((!pcheck (pidl1)) || (!pcheck (pidl2))) + return FALSE; + + pdump (pidl1); + pdump (pidl2); + + if ( _ILIsDesktop(pidl1) ) + { + ret = pidl2; + } + else + { + while (pidltemp1->mkid.cb && pidltemp2->mkid.cb) + { + _ILSimpleGetText(pidltemp1, szData1, MAX_PATH); + _ILSimpleGetText(pidltemp2, szData2, MAX_PATH); + + if (strcasecmp(szData1,szData2)) + break; + + pidltemp1 = ILGetNext(pidltemp1); + pidltemp2 = ILGetNext(pidltemp2); + ret = pidltemp2; + } + + if (pidltemp1->mkid.cb) + { + ret = NULL; /* elements of pidl1 left*/ + } + } + TRACE_(shell)("--- %p\n", ret); + return (LPITEMIDLIST)ret; /* pidl 1 is shorter */ +} + +/************************************************************************* + * ILCombine [SHELL32.25] + * + * Concatenates two complex ItemIDLists. + * + * PARAMS + * pidl1 [I] first complex ItemIDLists + * pidl2 [I] complex ItemIDLists to append + * + * RETURNS + * if both pidl's == NULL NULL + * if pidl1 == NULL cloned pidl2 + * if pidl2 == NULL cloned pidl1 + * otherwise new pidl with pidl2 appended to pidl1 + * + * NOTES + * exported by ordinal. + * Does not destroy the passed in ItemIDLists! + */ +LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + DWORD len1,len2; + LPITEMIDLIST pidlNew; + + TRACE("pidl=%p pidl=%p\n",pidl1,pidl2); + + if(!pidl1 && !pidl2) return NULL; + + pdump (pidl1); + pdump (pidl2); + + if(!pidl1) + { + pidlNew = ILClone(pidl2); + return pidlNew; + } + + if(!pidl2) + { + pidlNew = ILClone(pidl1); + return pidlNew; + } + + len1 = ILGetSize(pidl1)-2; + len2 = ILGetSize(pidl2); + pidlNew = SHAlloc(len1+len2); + + if (pidlNew) + { + memcpy(pidlNew,pidl1,len1); + memcpy(((BYTE *)pidlNew)+len1,pidl2,len2); + } + + /* TRACE(pidl,"--new pidl=%p\n",pidlNew);*/ + return pidlNew; +} + +/************************************************************************* + * SHGetRealIDL [SHELL32.98] + * + * NOTES + */ +HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST *pidlReal) +{ + IDataObject* pDataObj; + HRESULT hr = IShellFolder_GetUIObjectOf(lpsf, 0, 1, &pidlSimple, &IID_IDataObject, 0, (LPVOID*)&pDataObj); + + if (SUCCEEDED(hr)) { + STGMEDIUM medium; + FORMATETC fmt; + + fmt.cfFormat = RegisterClipboardFormatA(CFSTR_SHELLIDLIST); + fmt.ptd = NULL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.tymed = TYMED_HGLOBAL; + + hr = IDataObject_GetData(pDataObj, &fmt, &medium); + + IDataObject_Release(pDataObj); + + if (SUCCEEDED(hr)) { + /*assert(pida->cidl==1);*/ + LPIDA pida = (LPIDA)GlobalLock(medium.u.hGlobal); + + LPCITEMIDLIST pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]); + LPCITEMIDLIST pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[1]); + + *pidlReal = ILCombine(pidl_folder, pidl_child); + + if (!*pidlReal) + hr = E_OUTOFMEMORY; + + GlobalUnlock(medium.u.hGlobal); + GlobalFree(medium.u.hGlobal); + } + } + + return hr; +} + +/************************************************************************* + * SHLogILFromFSIL [SHELL32.95] + * + * NOTES + * pild = CSIDL_DESKTOP ret = 0 + * pild = CSIDL_DRIVES ret = 0 + */ +LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl) +{ + FIXME("(pidl=%p)\n",pidl); + + pdump(pidl); + + return 0; +} + +/************************************************************************* + * ILGetSize [SHELL32.152] + * + * Gets the byte size of an ItemIDList including zero terminator + * + * PARAMS + * pidl [I] ItemIDList + * + * RETURNS + * size of pidl in bytes + * + * NOTES + * exported by ordinal + */ +UINT WINAPI ILGetSize(LPCITEMIDLIST pidl) +{ + LPCSHITEMID si = &(pidl->mkid); + UINT len=0; + + if (pidl) + { while (si->cb) + { len += si->cb; + si = (LPCSHITEMID)(((const BYTE*)si)+si->cb); + } + len += 2; + } + TRACE("pidl=%p size=%u\n",pidl, len); + return len; +} + +/************************************************************************* + * ILGetNext [SHELL32.153] + * + * Gets the next ItemID of an ItemIDList + * + * PARAMS + * pidl [I] ItemIDList + * + * RETURNS + * null -> null + * desktop -> null + * simple pidl -> pointer to 0x0000 element + * + * NOTES + * exported by ordinal. + */ +LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl) +{ + WORD len; + + TRACE("%p\n", pidl); + + if(pidl) + { + len = pidl->mkid.cb; + if (len) + { + pidl = (LPCITEMIDLIST) (((const BYTE*)pidl)+len); + TRACE("-- %p\n", pidl); + return (LPITEMIDLIST)pidl; + } + } + return NULL; +} + +/************************************************************************* + * ILAppend [SHELL32.154] + * + * Adds the single ItemID item to the ItemIDList indicated by pidl. + * If bEnd is FALSE, inserts the item in the front of the list, + * otherwise it adds the item to the end. (???) + * + * PARAMS + * pidl [I] ItemIDList to extend + * item [I] ItemID to prepend/append + * bEnd [I] Indicates if the item should be appended + * + * NOTES + * Destroys the passed in idlist! (???) + */ +LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl, LPCITEMIDLIST item, BOOL bEnd) +{ + LPITEMIDLIST idlRet; + + WARN("(pidl=%p,pidl=%p,%08u)semi-stub\n",pidl,item,bEnd); + + pdump (pidl); + pdump (item); + + if (_ILIsDesktop(pidl)) + { + idlRet = ILClone(item); + if (pidl) + SHFree (pidl); + return idlRet; + } + + if (bEnd) + { + idlRet = ILCombine(pidl, item); + } + else + { + idlRet = ILCombine(item, pidl); + } + + SHFree(pidl); + return idlRet; +} + +/************************************************************************* + * ILFree [SHELL32.155] + * + * Frees memory (if not NULL) allocated by SHMalloc allocator + * + * PARAMS + * pidl [I] + * + * NOTES + * exported by ordinal + */ +void WINAPI ILFree(LPITEMIDLIST pidl) +{ + TRACE("(pidl=%p)\n",pidl); + if(pidl) SHFree(pidl); +} + +/************************************************************************* + * ILGlobalFree [SHELL32.156] + * + * Frees memory (if not NULL) allocated by Alloc allocator + * + * PARAMS + * pidl [I] + * + * NOTES + * exported by ordinal. + */ +void WINAPI ILGlobalFree( LPITEMIDLIST pidl) +{ + TRACE("%p\n", pidl); + + if(!pidl) return; + Free(pidl); +} + +/************************************************************************* + * ILCreateFromPathA [SHELL32.189] + * + * Creates a complex ItemIDList from a path and returns it. + * + * PARAMS + * path [I] + * + * RETURNS + * the newly created complex ItemIDList or NULL if failed + * + * NOTES + * exported by ordinal. + */ + +LPITEMIDLIST WINAPI ILCreateFromPathA (LPCSTR path) +{ + LPITEMIDLIST pidlnew = NULL; + + TRACE_(shell)("%s\n", debugstr_a(path)); + + if (SUCCEEDED(SHILCreateFromPathA(path, &pidlnew, NULL))) + return pidlnew; + return NULL; +} + +/************************************************************************* + * ILCreateFromPathW [SHELL32.190] + */ +LPITEMIDLIST WINAPI ILCreateFromPathW (LPCWSTR path) +{ + LPITEMIDLIST pidlnew = NULL; + + TRACE_(shell)("%s\n", debugstr_w(path)); + + if (SUCCEEDED(SHILCreateFromPathW(path, &pidlnew, NULL))) + return pidlnew; + return NULL; +} + +/************************************************************************* + * ILCreateFromPath [SHELL32.157] + */ +LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path) +{ + if ( SHELL_OsIsUnicode()) + return ILCreateFromPathW (path); + return ILCreateFromPathA (path); +} + +/************************************************************************* + * _ILParsePathW [internal] + * + * Creates an ItemIDList from a path and returns it. + * + * PARAMS + * path [I] path to parse and convert into an ItemIDList + * lpFindFile [I] pointer to buffer to initialize the FileSystem + * Bind Data object with + * bBindCtx [I] indicates to create a BindContext and assign a + * FileSystem Bind Data object + * ppidl [O] the newly create ItemIDList + * prgfInOut [I/O] requested attributes on input and actual + * attributes on return + * + * RETURNS + * NO_ERROR on success or an OLE error code + * + * NOTES + * If either lpFindFile is non-NULL or bBindCtx is TRUE, this function + * creates a BindContext object and assigns a FileSystem Bind Data object + * to it, passing the BindContext to IShellFolder_ParseDisplayName. Each + * IShellFolder uses that FileSystem Bind Data object of the BindContext + * to pass data about the current path element to the next object. This + * is used to avoid having to verify the current path element on disk, so + * that creating an ItemIDList from a non-existent path still can work. + */ +static HRESULT WINAPI _ILParsePathW(LPCWSTR path, LPWIN32_FIND_DATAW lpFindFile, + BOOL bBindCtx, LPITEMIDLIST *ppidl, LPDWORD prgfInOut) +{ + LPSHELLFOLDER pSF = NULL; + LPBC pBC = NULL; + HRESULT ret; + + TRACE("%s %p %d (%p)->%p (%p)->0x%lx\n", debugstr_w(path), lpFindFile, bBindCtx, + ppidl, ppidl ? *ppidl : NULL, + prgfInOut, prgfInOut ? *prgfInOut : 0); + + ret = SHGetDesktopFolder(&pSF); + if (FAILED(ret)) + { + return ret; + } + + if (lpFindFile || bBindCtx) + ret = IFileSystemBindData_Constructor(lpFindFile, &pBC); + + if (SUCCEEDED(ret)) + { + ret = IShellFolder_ParseDisplayName(pSF, 0, pBC, (LPOLESTR)path, NULL, ppidl, prgfInOut); + } + + if (pBC) + { + IBindCtx_Release(pBC); + pBC = NULL; + } + + IShellFolder_Release(pSF); + + if (!SUCCEEDED(ret) && ppidl) + *ppidl = NULL; + + TRACE("%s %p 0x%lx\n", debugstr_w(path), ppidl ? *ppidl : NULL, prgfInOut ? *prgfInOut : 0); + + return ret; +} + +/************************************************************************* + * SHSimpleIDListFromPath [SHELL32.162] + * + * Creates a simple ItemIDList from a path and returns it. This function + * does not fail on non-existent paths. + * + * PARAMS + * path [I] path to parse and convert into an ItemIDList + * + * RETURNS + * the newly created simple ItemIDList + * + * NOTES + * Simple in the name does not mean a relative ItemIDList but rather a + * fully qualified list, where only the file name is filled in and the + * directory flag for those ItemID elements this is known about, eg. + * it is not the last element in the ItemIDList or the actual directory + * exists on disk. + * exported by ordinal. + */ +LPITEMIDLIST WINAPI SHSimpleIDListFromPathA(LPCSTR lpszPath) +{ + LPITEMIDLIST pidl = NULL; + LPWSTR wPath = NULL; + int len; + + TRACE("%s\n", debugstr_a(lpszPath)); + + if (lpszPath) + { + len = MultiByteToWideChar(CP_ACP, 0, lpszPath, -1, NULL, 0); + wPath = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpszPath, -1, wPath, len); + } + + _ILParsePathW(wPath, NULL, TRUE, &pidl, NULL); + + if (wPath) HeapFree(GetProcessHeap(), 0, wPath); + TRACE("%s %p\n", debugstr_a(lpszPath), pidl); + return pidl; +} + +LPITEMIDLIST WINAPI SHSimpleIDListFromPathW(LPCWSTR lpszPath) +{ + LPITEMIDLIST pidl = NULL; + + TRACE("%s\n", debugstr_w(lpszPath)); + + _ILParsePathW(lpszPath, NULL, TRUE, &pidl, NULL); + TRACE("%s %p\n", debugstr_w(lpszPath), pidl); + return pidl; +} + +LPITEMIDLIST WINAPI SHSimpleIDListFromPathAW(LPCVOID lpszPath) +{ + if ( SHELL_OsIsUnicode()) + return SHSimpleIDListFromPathW (lpszPath); + return SHSimpleIDListFromPathA (lpszPath); +} + +/************************************************************************* + * SHGetDataFromIDListA [SHELL32.247] + * + * NOTES + * the pidl can be a simple one. since we can't get the path out of the pidl + * we have to take all data from the pidl + */ +HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len) +{ + TRACE_(shell)("sf=%p pidl=%p 0x%04x %p 0x%04x stub\n",psf,pidl,nFormat,dest,len); + + pdump(pidl); + if (!psf || !dest ) return E_INVALIDARG; + + switch (nFormat) + { + case SHGDFIL_FINDDATA: + { + LPSTR filename, shortname; + WIN32_FIND_DATAA * pfd = dest; + + if (_ILIsDrive(pidl)) + return E_INVALIDARG; + + if (len < (int)sizeof(WIN32_FIND_DATAA)) return E_INVALIDARG; + + ZeroMemory(pfd, sizeof (WIN32_FIND_DATAA)); + _ILGetFileDateTime( pidl, &(pfd->ftLastWriteTime)); + pfd->dwFileAttributes = _ILGetFileAttributes(pidl, NULL, 0); + pfd->nFileSizeLow = _ILGetFileSize ( pidl, NULL, 0); + + filename = _ILGetTextPointer(pidl); + shortname = _ILGetSTextPointer(pidl); + + if (filename) + lstrcpynA(pfd->cFileName, filename, MAX_PATH); + else + pfd->cFileName[0] = '\0'; + + if (shortname) + lstrcpynA(pfd->cAlternateFileName, shortname, MAX_PATH); + else + pfd->cAlternateFileName[0] = '\0'; + } + return NOERROR; + + case SHGDFIL_NETRESOURCE: + case SHGDFIL_DESCRIPTIONID: + FIXME_(shell)("SHGDFIL %i stub\n", nFormat); + break; + + default: + ERR_(shell)("Unknown SHGDFIL %i, please report\n", nFormat); + } + + return E_INVALIDARG; +} + +/************************************************************************* + * SHGetDataFromIDListW [SHELL32.248] + * + */ +HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len) +{ + TRACE_(shell)("sf=%p pidl=%p 0x%04x %p 0x%04x stub\n",psf,pidl,nFormat,dest,len); + + pdump(pidl); + + if (! psf || !dest ) return E_INVALIDARG; + + switch (nFormat) + { + case SHGDFIL_FINDDATA: + { + LPSTR filename, shortname; + WIN32_FIND_DATAW * pfd = dest; + + if (_ILIsDrive(pidl)) + return E_INVALIDARG; + + if (len < (int)sizeof(WIN32_FIND_DATAW)) return E_INVALIDARG; + + ZeroMemory(pfd, sizeof (WIN32_FIND_DATAA)); + _ILGetFileDateTime( pidl, &(pfd->ftLastWriteTime)); + pfd->dwFileAttributes = _ILGetFileAttributes(pidl, NULL, 0); + pfd->nFileSizeLow = _ILGetFileSize ( pidl, NULL, 0); + + filename = _ILGetTextPointer(pidl); + shortname = _ILGetSTextPointer(pidl); + + if (!filename) + pfd->cFileName[0] = '\0'; + else if (!MultiByteToWideChar(CP_ACP, 0, filename, -1, pfd->cFileName, MAX_PATH)) + pfd->cFileName[MAX_PATH-1] = 0; + + if (!shortname) + pfd->cAlternateFileName[0] = '\0'; + else if (!MultiByteToWideChar(CP_ACP, 0, shortname, -1, pfd->cAlternateFileName, 14)) + pfd->cAlternateFileName[13] = 0; + } + return NOERROR; + case SHGDFIL_NETRESOURCE: + case SHGDFIL_DESCRIPTIONID: + FIXME_(shell)("SHGDFIL %i stub\n", nFormat); + break; + + default: + ERR_(shell)("Unknown SHGDFIL %i, please report\n", nFormat); + } + + return E_INVALIDARG; +} + +/************************************************************************* + * SHELL_GetPathFromIDListA + */ +HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize) +{ + HRESULT hr = S_OK; + + pszPath[0]=0; + + /* One case is a PIDL rooted at desktop level */ + if (_ILIsValue(pidl) || _ILIsFolder(pidl)) { + hr = SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOP, FALSE); + + if (SUCCEEDED(hr)) + PathAddBackslashA(pszPath); + } + /* The only other valid case is a item ID list beginning at "My Computer" */ + else if (_ILIsMyComputer(pidl)) + pidl = ILGetNext(pidl); + + if (SUCCEEDED(hr)) { + LPSTR txt; + + while(pidl && pidl->mkid.cb) { + if (_ILIsSpecialFolder(pidl)) + {hr = E_INVALIDARG; break;} + + txt = _ILGetTextPointer(pidl); + if (!txt) + {hr = E_INVALIDARG; break;} + + if (lstrlenA(txt) > pidl->mkid.cb) + ERR("pidl %p is borked\n",pidl); + + /* make sure there's enough space for the next segment */ + if ( (lstrlenA(txt) + lstrlenA(pszPath)) > uOutSize) + {hr = E_INVALIDARG; break;} + lstrcatA( pszPath, txt ); + + pidl = ILGetNext(pidl); + if (!pidl) + {hr = E_INVALIDARG; break;} + + if (!pidl->mkid.cb) { + /* We are at the end and successfully converted the complete PIDL. */ + break; + } + + if( (lstrlenA(pszPath) + 1) > uOutSize) + {hr = E_INVALIDARG; break;} + if (!PathAddBackslashA(pszPath)) + {hr = E_INVALIDARG; break;} + } + } else + hr = E_INVALIDARG; + + TRACE_(shell)("-- %s, 0x%08lx\n", pszPath, hr); + return hr; +} + +/************************************************************************* + * SHGetPathFromIDListA [SHELL32.@][NT 4.0: SHELL32.220] + * + * PARAMETERS + * pidl, [IN] pidl + * pszPath [OUT] path + * + * RETURNS + * path from a passed PIDL. + * + * NOTES + * NULL returns FALSE + * desktop pidl gives path to desktop directory back + * special pidls returning FALSE + */ +BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath) +{ + HRESULT hr; + + TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath); + pdump(pidl); + + if (!pidl) + return FALSE; + + hr = SHELL_GetPathFromIDListA(pidl, pszPath, MAX_PATH); + + return SUCCEEDED(hr); +} + +/************************************************************************* + * SHELL_GetPathFromIDListW + */ +HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize) +{ + HRESULT hr = S_OK; + UINT len; + + pszPath[0]=0; + + /* One case is a PIDL rooted at desktop level */ + if (_ILIsValue(pidl) || _ILIsFolder(pidl)) { + hr = SHGetSpecialFolderPathW(0, pszPath, CSIDL_DESKTOP, FALSE); + + if (SUCCEEDED(hr)) + PathAddBackslashW(pszPath); + } + /* The only other valid case is a item ID list beginning at "My Computer" */ + else if (_ILIsMyComputer(pidl)) + pidl = ILGetNext(pidl); + + if (SUCCEEDED(hr)) { + LPSTR txt; + + while(pidl && pidl->mkid.cb) { + if (_ILIsSpecialFolder(pidl)) + {hr = E_INVALIDARG; break;} + + txt = _ILGetTextPointer(pidl); + if (!txt) + {hr = E_INVALIDARG; break;} + + if (lstrlenA(txt) > pidl->mkid.cb) + ERR("pidl %p is borked\n",pidl); + len = MultiByteToWideChar(CP_ACP, 0, txt, -1, NULL, 0); + if ( (lstrlenW(pszPath) + len) > uOutSize ) + {hr = E_INVALIDARG; break;} + + MultiByteToWideChar(CP_ACP, 0, txt, -1, + &pszPath[lstrlenW(pszPath)], len); + + pidl = ILGetNext(pidl); + if (!pidl) + {hr = E_INVALIDARG; break;} + + if (!pidl->mkid.cb) { + /* We are at the end and successfully converted the complete PIDL. */ + break; + } + + if ( (lstrlenW(pszPath) + 1) > uOutSize ) + {hr = E_INVALIDARG; break;} + if (!PathAddBackslashW(pszPath)) + {hr = E_INVALIDARG; break;} + } + } else + hr = E_INVALIDARG; + + TRACE_(shell)("-- %s, 0x%08lx\n", debugstr_w(pszPath), hr); + return hr; +} + +/************************************************************************* + * SHGetPathFromIDListW [SHELL32.@] + */ +BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath) +{ + HRESULT hr; + + TRACE_(shell)("(pidl=%p,%p)\n", pidl, debugstr_w(pszPath)); + pdump(pidl); + + if (!pidl) + return FALSE; + + hr = SHELL_GetPathFromIDListW(pidl, pszPath, MAX_PATH); + + TRACE_(shell)("-- %s, 0x%08lx\n",debugstr_w(pszPath), hr); + return SUCCEEDED(hr); +} + +/************************************************************************* + * SHGetPathFromIDList [SHELL32.@][NT 4.0: SHELL32.219] + */ +BOOL WINAPI SHGetPathFromIDListAW(LPCITEMIDLIST pidl,LPVOID pszPath) +{ + TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath); + + if (SHELL_OsIsUnicode()) + return SHGetPathFromIDListW(pidl,pszPath); + return SHGetPathFromIDListA(pidl,pszPath); +} + +/************************************************************************* + * SHBindToParent [shell version 5.0] + */ +HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast) +{ + IShellFolder * psf; + LPITEMIDLIST pidlChild, pidlParent; + HRESULT hr=E_FAIL; + + TRACE_(shell)("pidl=%p\n", pidl); + pdump(pidl); + + *ppv = NULL; + if (ppidlLast) *ppidlLast = NULL; + + if (_ILIsPidlSimple(pidl)) + { + IShellFolder* desktop; + + /* we are on desktop level */ + hr = SHGetDesktopFolder(&desktop); + + if (SUCCEEDED(hr)) + { + hr = IShellFolder_QueryInterface(desktop, riid, ppv); + + if (SUCCEEDED(hr) && ppidlLast) + *ppidlLast = ILClone(pidl); + + IShellFolder_Release(desktop); + } + } + else + { + pidlChild = ILClone(ILFindLastID(pidl)); + pidlParent = ILClone(pidl); + ILRemoveLastID(pidlParent); + + hr = SHGetDesktopFolder(&psf); + + if (SUCCEEDED(hr)) + hr = IShellFolder_BindToObject(psf, pidlParent, NULL, riid, ppv); + + if (SUCCEEDED(hr) && ppidlLast) + *ppidlLast = pidlChild; + else + ILFree (pidlChild); + + SHFree (pidlParent); + if (psf) IShellFolder_Release(psf); + } + + + TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08lx\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr); + return hr; +} + +/************************************************************************** + * + * internal functions + * + * ### 1. section creating pidls ### + * + ************************************************************************* + */ +LPITEMIDLIST _ILAlloc(PIDLTYPE type, size_t size) +{ + LPITEMIDLIST pidlOut = NULL; + + if((pidlOut = SHAlloc(size + 5))) + { + LPPIDLDATA pData; + LPITEMIDLIST pidlNext; + + ZeroMemory(pidlOut, size + 5); + pidlOut->mkid.cb = size + 3; + + if ((pData = _ILGetDataPointer(pidlOut))) + pData->type = type; + + if ((pidlNext = ILGetNext(pidlOut))) + pidlNext->mkid.cb = 0x00; + TRACE("-- (pidl=%p, size=%u)\n", pidlOut, size); + } + + return pidlOut; +} + +LPITEMIDLIST _ILCreateDesktop() +{ + LPITEMIDLIST ret; + + TRACE("()\n"); + ret = SHAlloc(2); + if (ret) + ret->mkid.cb = 0; + return ret; +} + +LPITEMIDLIST _ILCreateMyComputer() +{ TRACE("()\n"); + return _ILCreateGuid(PT_GUID, &CLSID_MyComputer); +} + +LPITEMIDLIST _ILCreateIExplore() +{ TRACE("()\n"); + return _ILCreateGuid(PT_GUID, &CLSID_Internet); +} + +LPITEMIDLIST _ILCreateControlPanel() +{ + LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = NULL; + + TRACE("()\n"); + if (parent) + { + LPITEMIDLIST cpl = _ILCreateGuid(PT_SHELLEXT, &CLSID_ControlPanel); + + if (cpl) + { + ret = ILCombine(parent, cpl); + SHFree(cpl); + } + SHFree(parent); + } + return ret; +} + +LPITEMIDLIST _ILCreatePrinters() +{ + LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = NULL; + + TRACE("()\n"); + if (parent) + { + LPITEMIDLIST printers = _ILCreateGuid(PT_YAGUID, &CLSID_Printers); + + if (printers) + { + ret = ILCombine(parent, printers); + SHFree(printers); + } + SHFree(parent); + } + return ret; +} + +LPITEMIDLIST _ILCreateNetwork() +{ TRACE("()\n"); + return _ILCreateGuid(PT_GUID, &CLSID_NetworkPlaces); +} + +LPITEMIDLIST _ILCreateBitBucket() +{ TRACE("()\n"); + return _ILCreateGuid(PT_GUID, &CLSID_RecycleBin); +} + +LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid) +{ + LPITEMIDLIST pidlOut; + + if (type == PT_SHELLEXT || type == PT_GUID || type == PT_YAGUID) + { + pidlOut = _ILAlloc(type, sizeof(GUIDStruct)); + if (pidlOut) + { + LPPIDLDATA pData = _ILGetDataPointer(pidlOut); + + memcpy(&(pData->u.guid.guid), guid, sizeof(GUID)); + TRACE("-- create GUID-pidl %s\n", + debugstr_guid(&(pData->u.guid.guid))); + } + } + else + { + WARN("%d: invalid type for GUID\n", type); + pidlOut = NULL; + } + return pidlOut; +} + +LPITEMIDLIST _ILCreateGuidFromStrA(LPCSTR szGUID) +{ + IID iid; + + if (!SUCCEEDED(SHCLSIDFromStringA(szGUID, &iid))) + { + ERR("%s is not a GUID\n", szGUID); + return NULL; + } + return _ILCreateGuid(PT_GUID, &iid); +} + +LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA * stffile ) +{ + char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ + char * pbuff = buff; + size_t len, len1; + LPITEMIDLIST pidl; + PIDLTYPE type; + + if (!stffile) + return NULL; + + TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); + + /* prepare buffer with both names */ + len = strlen (stffile->cFileName) + 1; + memcpy (pbuff, stffile->cFileName, len); + pbuff += len; + + len1 = strlen (stffile->cAlternateFileName)+1; + memcpy (pbuff, stffile->cAlternateFileName, len1); + + type = (stffile->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : + PT_VALUE; + /* FileStruct already has one byte for the first name, so use len - 1 in + * size calculation + */ + if ((pidl = _ILAlloc(type, sizeof(FileStruct) + (len - 1) + len1))) + { + LPPIDLDATA pData; + LPSTR pszDest; + + /* set attributes */ + if ((pData = _ILGetDataPointer(pidl))) + { + pData->type = type; + FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.file.uFileDate,&pData->u.file.uFileTime); + pData->u.file.dwFileSize = stffile->nFileSizeLow; + pData->u.file.uFileAttribs = (WORD)stffile->dwFileAttributes; + } + if ((pszDest = _ILGetTextPointer(pidl))) + { + memcpy(pszDest, buff, len + len1); + TRACE("-- create Value: %s\n",debugstr_a(pszDest)); + } + } + return pidl; +} + +HRESULT _ILCreateFromPathA(LPCSTR szPath, LPITEMIDLIST* ppidl) +{ + HANDLE hFile; + WIN32_FIND_DATAA stffile; + + if (!ppidl) + return E_INVALIDARG; + + hFile = FindFirstFileA(szPath, &stffile); + + if (hFile == INVALID_HANDLE_VALUE) + return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + + FindClose(hFile); + + *ppidl = _ILCreateFromFindDataA(&stffile); + + return *ppidl ? S_OK : E_OUTOFMEMORY; +} + +LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew) +{ + WCHAR sTemp[4]; + LPITEMIDLIST pidlOut; + + sTemp[0]=toupperW(lpszNew[0]); + sTemp[1]=':'; + sTemp[2]='\\'; + sTemp[3]=0x00; + TRACE("(%s)\n",debugstr_w(sTemp)); + + if ((pidlOut = _ILAlloc(PT_DRIVE, sizeof(DriveStruct)))) + { + LPSTR pszDest; + + if ((pszDest = _ILGetTextPointer(pidlOut))) + { + WideCharToMultiByte(CP_ACP, 0, sTemp, sizeof(sTemp)/sizeof(WCHAR), pszDest, sizeof(sTemp)/sizeof(WCHAR), NULL, NULL); + TRACE("-- create Drive: %s\n", debugstr_a(pszDest)); + } + } + return pidlOut; +} + +/************************************************************************** + * _ILGetDrive() + * + * Gets the text for the drive eg. 'c:\' + * + * RETURNS + * strlen (lpszText) + */ +DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize) +{ TRACE("(%p,%p,%u)\n",pidl,pOut,uSize); + + if(_ILIsMyComputer(pidl)) + pidl = ILGetNext(pidl); + + if (pidl && _ILIsDrive(pidl)) + return _ILSimpleGetText(pidl, pOut, uSize); + + return 0; +} + +/************************************************************************** + * + * ### 2. section testing pidls ### + * + ************************************************************************** + * _ILIsDesktop() + * _ILIsMyComputer() + * _ILIsSpecialFolder() + * _ILIsDrive() + * _ILIsFolder() + * _ILIsValue() + * _ILIsPidlSimple() + */ +BOOL _ILIsDesktop(LPCITEMIDLIST pidl) +{ TRACE("(%p)\n",pidl); + return pidl && pidl->mkid.cb ? 0 : 1; +} + +BOOL _ILIsMyComputer(LPCITEMIDLIST pidl) +{ + REFIID iid = _ILGetGUIDPointer(pidl); + + TRACE("(%p)\n",pidl); + + if (iid) + return IsEqualIID(iid, &CLSID_MyComputer); + return FALSE; +} + +BOOL _ILIsSpecialFolder (LPCITEMIDLIST pidl) +{ + LPPIDLDATA lpPData = _ILGetDataPointer(pidl); + TRACE("(%p)\n",pidl); + return (pidl && ( (lpPData && (PT_GUID== lpPData->type || PT_SHELLEXT== lpPData->type)) || + (pidl && pidl->mkid.cb == 0x00) + )); +} + +BOOL _ILIsDrive(LPCITEMIDLIST pidl) +{ LPPIDLDATA lpPData = _ILGetDataPointer(pidl); + TRACE("(%p)\n",pidl); + return (pidl && lpPData && (PT_DRIVE == lpPData->type || + PT_DRIVE1 == lpPData->type || + PT_DRIVE2 == lpPData->type || + PT_DRIVE3 == lpPData->type)); +} + +BOOL _ILIsFolder(LPCITEMIDLIST pidl) +{ LPPIDLDATA lpPData = _ILGetDataPointer(pidl); + TRACE("(%p)\n",pidl); + return (pidl && lpPData && (PT_FOLDER == lpPData->type || PT_FOLDER1 == lpPData->type)); +} + +BOOL _ILIsValue(LPCITEMIDLIST pidl) +{ LPPIDLDATA lpPData = _ILGetDataPointer(pidl); + TRACE("(%p)\n",pidl); + return (pidl && lpPData && PT_VALUE == lpPData->type); +} + +BOOL _ILIsCPanelStruct(LPCITEMIDLIST pidl) +{ LPPIDLDATA lpPData = _ILGetDataPointer(pidl); + TRACE("(%p)\n",pidl); + return (pidl && lpPData && (lpPData->type == 0)); +} + +/************************************************************************** + * _ILIsPidlSimple + */ +BOOL _ILIsPidlSimple ( LPCITEMIDLIST pidl) +{ + BOOL ret = TRUE; + + if(! _ILIsDesktop(pidl)) /* pidl=NULL or mkid.cb=0 */ + { + WORD len = pidl->mkid.cb; + LPCITEMIDLIST pidlnext = (LPCITEMIDLIST) (((const BYTE*)pidl) + len ); + if (pidlnext->mkid.cb) + ret = FALSE; + } + + TRACE("%s\n", ret ? "Yes" : "No"); + return ret; +} + +/************************************************************************** + * + * ### 3. section getting values from pidls ### + */ + + /************************************************************************** + * _ILSimpleGetText + * + * gets the text for the first item in the pidl (eg. simple pidl) + * + * returns the length of the string + */ +DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) +{ + DWORD dwReturn=0; + LPSTR szSrc; + GUID const * riid; + char szTemp[MAX_PATH]; + + TRACE("(%p %p %x)\n",pidl,szOut,uOutSize); + + if (!pidl) return 0; + + if (szOut) + *szOut = 0; + + if (_ILIsDesktop(pidl)) + { + /* desktop */ + if (HCR_GetClassNameA(&CLSID_ShellDesktop, szTemp, MAX_PATH)) + { + if (szOut) + lstrcpynA(szOut, szTemp, uOutSize); + + dwReturn = strlen (szTemp); + } + } + else if (( szSrc = _ILGetTextPointer(pidl) )) + { + /* filesystem */ + if (szOut) + lstrcpynA(szOut, szSrc, uOutSize); + + dwReturn = strlen(szSrc); + } + else if (( riid = _ILGetGUIDPointer(pidl) )) + { + /* special folder */ + if ( HCR_GetClassNameA(riid, szTemp, MAX_PATH) ) + { + if (szOut) + lstrcpynA(szOut, szTemp, uOutSize); + + dwReturn = strlen (szTemp); + } + } + else + { + ERR("-- no text\n"); + } + + TRACE("-- (%p=%s 0x%08lx)\n",szOut,debugstr_a(szOut),dwReturn); + return dwReturn; +} + + /************************************************************************** + * _ILSimpleGetTextW + * + * gets the text for the first item in the pidl (eg. simple pidl) + * + * returns the length of the string + */ +DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize) +{ + DWORD dwReturn; + char szTemp[MAX_PATH]; + + TRACE("(%p %p %x)\n",pidl,szOut,uOutSize); + + dwReturn = _ILSimpleGetText(pidl, szTemp, uOutSize); + + if (!MultiByteToWideChar(CP_ACP, 0, szTemp, -1, szOut, MAX_PATH)) + *szOut = 0; + + TRACE("-- (%p=%s 0x%08lx)\n",szOut,debugstr_w(szOut),dwReturn); + return dwReturn; +} + +/************************************************************************** + * + * ### 4. getting pointers to parts of pidls ### + * + ************************************************************************** + * _ILGetDataPointer() + */ +LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl) +{ + if(pidl && pidl->mkid.cb != 0x00) + return (LPPIDLDATA) &(pidl->mkid.abID); + return NULL; +} + +/************************************************************************** + * _ILGetTextPointer() + * gets a pointer to the long filename string stored in the pidl + */ +LPSTR _ILGetTextPointer(LPCITEMIDLIST pidl) +{/* TRACE(pidl,"(pidl%p)\n", pidl);*/ + + LPPIDLDATA pdata = _ILGetDataPointer(pidl); + + if (pdata) + { + switch (pdata->type) + { + case PT_GUID: + case PT_SHELLEXT: + case PT_YAGUID: + return NULL; + + case PT_DRIVE: + case PT_DRIVE1: + case PT_DRIVE2: + case PT_DRIVE3: + return (LPSTR)&(pdata->u.drive.szDriveName); + + case PT_FOLDER: + case PT_FOLDER1: + case PT_VALUE: + case PT_IESPECIAL1: + case PT_IESPECIAL2: + return (LPSTR)&(pdata->u.file.szNames); + + case PT_WORKGRP: + case PT_COMP: + case PT_NETWORK: + case PT_NETPROVIDER: + case PT_SHARE: + return (LPSTR)&(pdata->u.network.szNames); + } + } + return NULL; +} + +/************************************************************************** + * _ILGetSTextPointer() + * gets a pointer to the short filename string stored in the pidl + */ +LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl) +{/* TRACE(pidl,"(pidl%p)\n", pidl);*/ + + LPPIDLDATA pdata =_ILGetDataPointer(pidl); + + if (pdata) + { + switch (pdata->type) + { + case PT_FOLDER: + case PT_VALUE: + case PT_IESPECIAL1: + case PT_IESPECIAL2: + return (LPSTR)(pdata->u.file.szNames + strlen (pdata->u.file.szNames) + 1); + + case PT_WORKGRP: + return (LPSTR)(pdata->u.network.szNames + strlen (pdata->u.network.szNames) + 1); + } + } + return NULL; +} + +/************************************************************************** + * _ILGetGUIDPointer() + * + * returns reference to guid stored in some pidls + */ +IID* _ILGetGUIDPointer(LPCITEMIDLIST pidl) +{ + LPPIDLDATA pdata =_ILGetDataPointer(pidl); + + TRACE("%p\n", pidl); + + if (pdata) + { + TRACE("pdata->type 0x%04x\n", pdata->type); + switch (pdata->type) + { + case PT_SHELLEXT: + case PT_GUID: + return &(pdata->u.guid.guid); + + default: + TRACE("Unknown pidl type 0x%04x\n", pdata->type); + break; + } + } + return NULL; +} + +/************************************************************************* + * _ILGetFileDateTime + * + * Given the ItemIdList, get the FileTime + * + * PARAMS + * pidl [I] The ItemIDList + * pFt [I] the resulted FILETIME of the file + * + * RETURNS + * True if Successful + * + * NOTES + * + */ +BOOL _ILGetFileDateTime(LPCITEMIDLIST pidl, FILETIME *pFt) +{ + LPPIDLDATA pdata = _ILGetDataPointer(pidl); + + if(! pdata) return FALSE; + + switch (pdata->type) + { + case PT_FOLDER: + case PT_VALUE: + DosDateTimeToFileTime(pdata->u.file.uFileDate, pdata->u.file.uFileTime, pFt); + break; + default: + return FALSE; + } + return TRUE; +} + +BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) +{ + FILETIME ft,lft; + SYSTEMTIME time; + BOOL ret; + + if (_ILGetFileDateTime( pidl, &ft )) { + FileTimeToLocalFileTime(&ft, &lft); + FileTimeToSystemTime (&lft, &time); + ret = GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, pOut, uOutSize); + } else { + pOut[0] = '\0'; + ret = FALSE; + } + return ret; + +} + +/************************************************************************* + * _ILGetFileSize + * + * Given the ItemIdList, get the FileSize + * + * PARAMS + * pidl [I] The ItemIDList + * pOut [I] The buffer to save the result + * uOutsize [I] The size of the buffer + * + * RETURNS + * The FileSize + * + * NOTES + * pOut can be null when no string is needed + * + */ +DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) +{ + LPPIDLDATA pdata = _ILGetDataPointer(pidl); + DWORD dwSize; + + if(! pdata) return 0; + + switch (pdata->type) + { + case PT_VALUE: + dwSize = pdata->u.file.dwFileSize; + if (pOut) StrFormatByteSizeA(dwSize, pOut, uOutSize); + return dwSize; + } + if (pOut) *pOut = 0x00; + return 0; +} + +BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) +{ + char szTemp[MAX_PATH]; + const char * pPoint; + LPCITEMIDLIST pidlTemp=pidl; + + TRACE("pidl=%p\n",pidl); + + if (!pidl) return FALSE; + + pidlTemp = ILFindLastID(pidl); + + if (!_ILIsValue(pidlTemp)) return FALSE; + if (!_ILSimpleGetText(pidlTemp, szTemp, MAX_PATH)) return FALSE; + + pPoint = PathFindExtensionA(szTemp); + + if (! *pPoint) return FALSE; + + pPoint++; + lstrcpynA(pOut, pPoint, uOutSize); + TRACE("%s\n",pOut); + + return TRUE; +} + +/************************************************************************* + * _ILGetFileType + * + * Given the ItemIdList, get the file type description + * + * PARAMS + * pidl [I] The ItemIDList (simple) + * pOut [I] The buffer to save the result + * uOutsize [I] The size of the buffer + * + * RETURNS + * nothing + * + * NOTES + * This function copies as much as possible into the buffer. + */ +void _ILGetFileType(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) +{ + if(_ILIsValue(pidl)) + { + char sTemp[64]; + if(uOutSize > 0) + { + pOut[0] = 0; + } + if (_ILGetExtension (pidl, sTemp, 64)) + { + if (!( HCR_MapTypeToValueA(sTemp, sTemp, 64, TRUE) + && HCR_MapTypeToValueA(sTemp, pOut, uOutSize, FALSE ))) + { + lstrcpynA (pOut, sTemp, uOutSize - 6); + strcat (pOut, "-file"); + } + } + } + else + { + lstrcpynA(pOut, "Folder", uOutSize); + } +} + +/************************************************************************* + * _ILGetFileAttributes + * + * Given the ItemIdList, get the Attrib string format + * + * PARAMS + * pidl [I] The ItemIDList + * pOut [I] The buffer to save the result + * uOutsize [I] The size of the Buffer + * + * RETURNS + * Attributes + * + * FIXME + * return value 0 in case of error is a valid return value + * + */ +DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) +{ + LPPIDLDATA pData = _ILGetDataPointer(pidl); + WORD wAttrib = 0; + int i; + + if(! pData) return 0; + + switch(pData->type) + { + case PT_FOLDER: + case PT_VALUE: + wAttrib = pData->u.file.uFileAttribs; + break; + } + + if(uOutSize >= 6) + { + i=0; + if(wAttrib & FILE_ATTRIBUTE_READONLY) + { + pOut[i++] = 'R'; + } + if(wAttrib & FILE_ATTRIBUTE_HIDDEN) + { + pOut[i++] = 'H'; + } + if(wAttrib & FILE_ATTRIBUTE_SYSTEM) + { + pOut[i++] = 'S'; + } + if(wAttrib & FILE_ATTRIBUTE_ARCHIVE) + { + pOut[i++] = 'A'; + } + if(wAttrib & FILE_ATTRIBUTE_COMPRESSED) + { + pOut[i++] = 'C'; + } + pOut[i] = 0x00; + } + return wAttrib; +} + +/************************************************************************* +* ILFreeaPidl +* +* free a aPidl struct +*/ +void _ILFreeaPidl(LPITEMIDLIST * apidl, UINT cidl) +{ + UINT i; + + if (apidl) + { + for (i = 0; i < cidl; i++) SHFree(apidl[i]); + SHFree(apidl); + } +} + +/************************************************************************* +* ILCopyaPidl +* +* copies an aPidl struct +*/ +LPITEMIDLIST* _ILCopyaPidl(LPCITEMIDLIST * apidlsrc, UINT cidl) +{ + UINT i; + LPITEMIDLIST * apidldest = (LPITEMIDLIST*)SHAlloc(cidl * sizeof(LPITEMIDLIST)); + if(!apidlsrc) return NULL; + + for (i = 0; i < cidl; i++) + apidldest[i] = ILClone(apidlsrc[i]); + + return apidldest; +} + +/************************************************************************* +* _ILCopyCidaToaPidl +* +* creates aPidl from CIDA +*/ +LPITEMIDLIST* _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, LPIDA cida) +{ + UINT i; + LPITEMIDLIST * dst = (LPITEMIDLIST*)SHAlloc(cida->cidl * sizeof(LPITEMIDLIST)); + + if(!dst) return NULL; + + if (pidl) + *pidl = ILClone((LPITEMIDLIST)(&((LPBYTE)cida)[cida->aoffset[0]])); + + for (i = 0; i < cida->cidl; i++) + dst[i] = ILClone((LPITEMIDLIST)(&((LPBYTE)cida)[cida->aoffset[i + 1]])); + + return dst; +} diff --git a/reactos/lib/shell32/pidl.h b/reactos/lib/shell32/pidl.h new file mode 100644 index 00000000000..39584092d66 --- /dev/null +++ b/reactos/lib/shell32/pidl.h @@ -0,0 +1,253 @@ +/* + * internal pidl functions + * + * Copyright 1998 Juergen Schmied + * Copyright 2004 Juan Lang + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * NOTES: + * + * DO NOT use this definitions outside the shell32.dll ! + * + * The contents of a pidl should never used from a application + * directly. + * + * Undocumented: + * MS says: the abID of SHITEMID should be treated as binary data and not + * be interpreted by applications. Applies to everyone but MS itself. + * Word95 interprets the contents of abID (Filesize/Date) so we have to go + * for binary compatibility here. + */ + +#ifndef __WINE_PIDL_H +#define __WINE_PIDL_H + +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "shlobj.h" + +/* +* the pidl does cache fileattributes to speed up SHGetAttributes when +* displaying a big number of files. +* +* a pidl of NULL means the desktop +* +* The structure of the pidl seems to be a union. The first byte of the +* PIDLDATA desribes the type of pidl. +* +* object ! first byte / ! format ! living space +* ! size +* ---------------------------------------------------------------- +* my computer 0x1F/20 guid (2) (usual) +* network 0x1F guid +* bitbucket 0x1F guid +* drive 0x23/25 drive (usual) +* drive 0x25/25 drive (lnk/persistent) +* drive 0x29/25 drive +* shell extension 0x2E guid +* drive 0x2F drive (lnk/persistent) +* folder/file 0x30 folder/file (1) (lnk/persistent) +* folder 0x31 folder (usual) +* valueA 0x32 file (ANSI file name) +* valueW 0x34 file (Unicode file name) +* workgroup 0x41 network (3) +* computer 0x42 network (4) +* net provider 0x46 network +* whole network 0x47 network (5) +* MSITStore 0x61 htmlhlp (7) +* printers/ras connections 0x70 guid +* history/favorites 0xb1 file +* share 0xc3 network (6) +* +* guess: the persistent elements are non tracking +* +* (1) dummy byte is used, attributes are empty +* (2) IID_MyComputer = 20D04FE0L-3AEA-1069-A2D8-08002B30309D +* (3) two strings "workgroup" "Microsoft Network" +* (4) two strings "\\sirius" "Microsoft Network" +* (5) one string "Entire Network" +* (6) two strings "\\sirius\c" "Microsoft Network" +* (7) contains string "mk:@MSITStore:C:\path\file.chm::/path/filename.htm" +* GUID 871C5380-42A0-1069-A2EA-08002B30309D +*/ + +#define PT_CPLAPPLET 0x00 +#define PT_GUID 0x1F +#define PT_DRIVE 0x23 +#define PT_DRIVE2 0x25 +#define PT_DRIVE3 0x29 +#define PT_SHELLEXT 0x2E +#define PT_DRIVE1 0x2F +#define PT_FOLDER1 0x30 +#define PT_FOLDER 0x31 +#define PT_VALUE 0x32 +#define PT_WORKGRP 0x41 +#define PT_COMP 0x42 +#define PT_NETPROVIDER 0x46 +#define PT_NETWORK 0x47 +#define PT_IESPECIAL1 0x61 +#define PT_YAGUID 0x70 /* yet another guid.. */ +#define PT_IESPECIAL2 0xb1 +#define PT_SHARE 0xc3 + +#include "pshpack1.h" +typedef BYTE PIDLTYPE; + +typedef struct tagPIDLCPanelStruct +{ + BYTE dummy; /*01 is 0x00 */ + DWORD iconIdx; /*02 negative icon ID */ + WORD offsDispName; /*06*/ + WORD offsComment; /*08*/ + CHAR szName[1]; /*10*/ /* terminated by 0x00, followed by display name and comment string */ +} PIDLCPanelStruct; + +typedef struct tagGUIDStruct +{ + BYTE dummy; /* offset 01 is unknown */ + GUID guid; /* offset 02 */ +} GUIDStruct; + +typedef struct tagDriveStruct +{ + CHAR szDriveName[20]; /*01*/ + WORD unknown; /*21*/ +} DriveStruct; + +typedef struct tagFileStruct +{ + BYTE dummy; /*01 is 0x00 for files or dirs */ + DWORD dwFileSize; /*02*/ + WORD uFileDate; /*06*/ + WORD uFileTime; /*08*/ + WORD uFileAttribs; /*10*/ + CHAR szNames[1]; /*12*/ + /* Here are coming two strings. The first is the long name. + The second the dos name when needed or just 0x00 */ +} FileStruct; + +typedef struct tagPIDLDATA +{ PIDLTYPE type; /*00*/ + union + { + struct tagGUIDStruct guid; + struct tagDriveStruct drive; + struct tagFileStruct file; + struct + { WORD dummy; /*01*/ + CHAR szNames[1]; /*03*/ + } network; + struct + { WORD dummy; /*01*/ + DWORD dummy1; /*02*/ + CHAR szName[1]; /*06*/ /* terminated by 0x00 0x00 */ + } htmlhelp; + struct tagPIDLCPanelStruct cpanel; + }u; +} PIDLDATA, *LPPIDLDATA; +#include "poppack.h" + +/* + * getting special values from simple pidls + */ +DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); +DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize); +BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); +DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); +BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); +void _ILGetFileType (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); +DWORD _ILGetFileAttributes (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize); + +BOOL _ILGetFileDateTime (LPCITEMIDLIST pidl, FILETIME *ft); +DWORD _ILGetDrive (LPCITEMIDLIST, LPSTR, UINT); + +/* + * testing simple pidls + */ +BOOL _ILIsDesktop (LPCITEMIDLIST pidl); +BOOL _ILIsMyComputer (LPCITEMIDLIST pidl); +BOOL _ILIsDrive (LPCITEMIDLIST pidl); +BOOL _ILIsFolder (LPCITEMIDLIST pidl); +BOOL _ILIsValue (LPCITEMIDLIST pidl); +BOOL _ILIsSpecialFolder (LPCITEMIDLIST pidl); +BOOL _ILIsPidlSimple (LPCITEMIDLIST pidl); +BOOL _ILIsCPanelStruct (LPCITEMIDLIST pidl); + +/* + * simple pidls + */ + +/* Basic PIDL constructor. Allocates size + 5 bytes, where: + * - two bytes are SHITEMID.cb + * - one byte is PIDLDATA.type + * - two bytes are the NULL PIDL terminator + * Sets type of the returned PIDL to type. + */ +LPITEMIDLIST _ILAlloc(PIDLTYPE type, size_t size); + +/* Creates a PIDL with guid format and type type, which must be one of PT_GUID, + * PT_SHELLEXT, or PT_YAGUID. + */ +LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid); + +/* Like _ILCreateGuid, but using the string szGUID. */ +LPITEMIDLIST _ILCreateGuidFromStrA(LPCSTR szGUID); + +/* Commonly used PIDLs representing file system objects. */ +LPITEMIDLIST _ILCreateDesktop (void); +LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA *stffile); +HRESULT _ILCreateFromPathA (LPCSTR szPath, LPITEMIDLIST* ppidl); + +/* Other helpers */ +LPITEMIDLIST _ILCreateMyComputer (void); +LPITEMIDLIST _ILCreateIExplore (void); +LPITEMIDLIST _ILCreateControlPanel (void); +LPITEMIDLIST _ILCreatePrinters (void); +LPITEMIDLIST _ILCreateNetwork (void); +LPITEMIDLIST _ILCreateBitBucket (void); +LPITEMIDLIST _ILCreateDrive (LPCWSTR); + +/* + * helper functions (getting struct-pointer) + */ +LPPIDLDATA _ILGetDataPointer (LPCITEMIDLIST); +LPSTR _ILGetTextPointer (LPCITEMIDLIST); +LPSTR _ILGetSTextPointer (LPCITEMIDLIST); +IID *_ILGetGUIDPointer (LPCITEMIDLIST pidl); + +/* + * debug helper + */ +void pdump (LPCITEMIDLIST pidl); +BOOL pcheck (LPCITEMIDLIST pidl); + +/* + * aPidl helper + */ +void _ILFreeaPidl(LPITEMIDLIST * apidl, UINT cidl); +LPITEMIDLIST * _ILCopyaPidl(LPCITEMIDLIST * apidlsrc, UINT cidl); +LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, LPIDA cida); + +BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type); +BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type); + +HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize); +HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize); + +#endif diff --git a/reactos/lib/shell32/regsvr.c b/reactos/lib/shell32/regsvr.c new file mode 100644 index 00000000000..78ee19b315f --- /dev/null +++ b/reactos/lib/shell32/regsvr.c @@ -0,0 +1,540 @@ +/* + * self-registerable dll functions for shell32.dll +* + * Copyright (C) 2003 John K. Hohm + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winreg.h" +#include "winerror.h" + +#include "ole2.h" +#include "shlguid.h" +#include "shell32_main.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +/* + * Near the bottom of this file are the exported DllRegisterServer and + * DllUnregisterServer, which make all this worthwhile. + */ + +/*********************************************************************** + * interface for self-registering + */ +struct regsvr_interface +{ + IID const *iid; /* NULL for end of list */ + LPCSTR name; /* can be NULL to omit */ + IID const *base_iid; /* can be NULL to omit */ + int num_methods; /* can be <0 to omit */ + CLSID const *ps_clsid; /* can be NULL to omit */ + CLSID const *ps_clsid32; /* can be NULL to omit */ +}; + +static HRESULT register_interfaces(struct regsvr_interface const *list); +static HRESULT unregister_interfaces(struct regsvr_interface const *list); + +struct regsvr_coclass +{ + CLSID const *clsid; /* NULL for end of list */ + LPCSTR name; /* can be NULL to omit */ + LPCSTR ips; /* can be NULL to omit */ + LPCSTR ips32; /* can be NULL to omit */ + LPCSTR ips32_tmodel; /* can be NULL to omit */ + DWORD flags; + LPCSTR clsid_str; /* can be NULL to omit */ + LPCSTR progid; /* can be NULL to omit */ +}; + +/* flags for regsvr_coclass.flags */ +#define SHELLEX_MAYCHANGEDEFAULTMENU 0x00000001 + +static HRESULT register_coclasses(struct regsvr_coclass const *list); +static HRESULT unregister_coclasses(struct regsvr_coclass const *list); + +/*********************************************************************** + * static string constants + */ +static WCHAR const interface_keyname[10] = { + 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; +static WCHAR const base_ifa_keyname[14] = { + 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', + 'e', 0 }; +static WCHAR const num_methods_keyname[11] = { + 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; +static WCHAR const ps_clsid_keyname[15] = { + 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', + 'i', 'd', 0 }; +static WCHAR const ps_clsid32_keyname[17] = { + 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', + 'i', 'd', '3', '2', 0 }; +static WCHAR const clsid_keyname[6] = { + 'C', 'L', 'S', 'I', 'D', 0 }; +static WCHAR const ips_keyname[13] = { + 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', + 0 }; +static WCHAR const ips32_keyname[15] = { + 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', + '3', '2', 0 }; +static WCHAR const progid_keyname[7] = { + 'P', 'r', 'o', 'g', 'I', 'D', 0 }; +static WCHAR const shellex_keyname[8] = { + 's', 'h', 'e', 'l', 'l', 'e', 'x', 0 }; +static WCHAR const mcdm_keyname[21] = { + 'M', 'a', 'y', 'C', 'h', 'a', 'n', 'g', 'e', 'D', 'e', 'f', + 'a', 'u', 'l', 't', 'M', 'e', 'n', 'u', 0 }; +static char const tmodel_valuename[] = "ThreadingModel"; + +/*********************************************************************** + * static helper functions + */ +static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); +static LONG register_key_defvalueW(HKEY base, WCHAR const *name, + WCHAR const *value); +static LONG register_key_defvalueA(HKEY base, WCHAR const *name, + char const *value); +static LONG recursive_delete_key(HKEY key); +static LONG recursive_delete_keyA(HKEY base, char const *name); +static LONG recursive_delete_keyW(HKEY base, WCHAR const *name); + +/*********************************************************************** + * register_interfaces + */ +static HRESULT register_interfaces(struct regsvr_interface const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY interface_key; + + res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->iid; ++list) { + WCHAR buf[39]; + HKEY iid_key; + + StringFromGUID2(list->iid, buf, 39); + res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_interface_key; + + if (list->name) { + res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, + (CONST BYTE*)(list->name), + strlen(list->name) + 1); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + if (list->base_iid) { + register_key_guid(iid_key, base_ifa_keyname, list->base_iid); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + if (0 <= list->num_methods) { + static WCHAR const fmt[3] = { '%', 'd', 0 }; + HKEY key; + + res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &key, NULL); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + + wsprintfW(buf, fmt, list->num_methods); + res = RegSetValueExW(key, NULL, 0, REG_SZ, + (CONST BYTE*)buf, + (lstrlenW(buf) + 1) * sizeof(WCHAR)); + RegCloseKey(key); + + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + if (list->ps_clsid) { + register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + if (list->ps_clsid32) { + register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); + if (res != ERROR_SUCCESS) goto error_close_iid_key; + } + + error_close_iid_key: + RegCloseKey(iid_key); + } + +error_close_interface_key: + RegCloseKey(interface_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + +/*********************************************************************** + * unregister_interfaces + */ +static HRESULT unregister_interfaces(struct regsvr_interface const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY interface_key; + + res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, + KEY_READ | KEY_WRITE, &interface_key); + if (res == ERROR_FILE_NOT_FOUND) return S_OK; + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->iid; ++list) { + WCHAR buf[39]; + + StringFromGUID2(list->iid, buf, 39); + res = recursive_delete_keyW(interface_key, buf); + } + + RegCloseKey(interface_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + +/*********************************************************************** + * register_coclasses + */ +static HRESULT register_coclasses(struct regsvr_coclass const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY coclass_key; + + res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->clsid; ++list) { + WCHAR buf[39]; + HKEY clsid_key; + + StringFromGUID2(list->clsid, buf, 39); + res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + + if (list->name) { + res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, + (CONST BYTE*)(list->name), + strlen(list->name) + 1); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->ips) { + res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->ips32) { + HKEY ips32_key; + + res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, + &ips32_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, + (CONST BYTE*)list->ips32, + lstrlenA(list->ips32) + 1); + if (res == ERROR_SUCCESS && list->ips32_tmodel) + res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, + (CONST BYTE*)list->ips32_tmodel, + strlen(list->ips32_tmodel) + 1); + RegCloseKey(ips32_key); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->flags & SHELLEX_MAYCHANGEDEFAULTMENU) { + HKEY shellex_key, mcdm_key; + + res = RegCreateKeyExW(clsid_key, shellex_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, + &shellex_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + res = RegCreateKeyExW(shellex_key, mcdm_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, + &mcdm_key, NULL); + RegCloseKey(shellex_key); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + RegCloseKey(mcdm_key); + } + + if (list->clsid_str) { + res = register_key_defvalueA(clsid_key, clsid_keyname, + list->clsid_str); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->progid) { + HKEY progid_key; + + res = register_key_defvalueA(clsid_key, progid_keyname, + list->progid); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + res = RegCreateKeyExA(HKEY_CLASSES_ROOT, list->progid, 0, + NULL, 0, KEY_READ | KEY_WRITE, NULL, + &progid_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + res = register_key_defvalueW(progid_key, clsid_keyname, buf); + RegCloseKey(progid_key); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + error_close_clsid_key: + RegCloseKey(clsid_key); + } + +error_close_coclass_key: + RegCloseKey(coclass_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + +/*********************************************************************** + * unregister_coclasses + */ +static HRESULT unregister_coclasses(struct regsvr_coclass const *list) +{ + LONG res = ERROR_SUCCESS; + HKEY coclass_key; + + res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, + KEY_READ | KEY_WRITE, &coclass_key); + if (res == ERROR_FILE_NOT_FOUND) return S_OK; + if (res != ERROR_SUCCESS) goto error_return; + + for (; res == ERROR_SUCCESS && list->clsid; ++list) { + WCHAR buf[39]; + + StringFromGUID2(list->clsid, buf, 39); + res = recursive_delete_keyW(coclass_key, buf); + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + + if (list->progid) { + res = recursive_delete_keyA(HKEY_CLASSES_ROOT, list->progid); + if (res != ERROR_SUCCESS) goto error_close_coclass_key; + } + } + +error_close_coclass_key: + RegCloseKey(coclass_key); +error_return: + return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; +} + +/*********************************************************************** + * regsvr_key_guid + */ +static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) +{ + WCHAR buf[39]; + + StringFromGUID2(guid, buf, 39); + return register_key_defvalueW(base, name, buf); +} + +/*********************************************************************** + * regsvr_key_defvalueW + */ +static LONG register_key_defvalueW( + HKEY base, + WCHAR const *name, + WCHAR const *value) +{ + LONG res; + HKEY key; + + res = RegCreateKeyExW(base, name, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &key, NULL); + if (res != ERROR_SUCCESS) return res; + res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, + (lstrlenW(value) + 1) * sizeof(WCHAR)); + RegCloseKey(key); + return res; +} + +/*********************************************************************** + * regsvr_key_defvalueA + */ +static LONG register_key_defvalueA( + HKEY base, + WCHAR const *name, + char const *value) +{ + LONG res; + HKEY key; + + res = RegCreateKeyExW(base, name, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &key, NULL); + if (res != ERROR_SUCCESS) return res; + res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, + lstrlenA(value) + 1); + RegCloseKey(key); + return res; +} + +/*********************************************************************** + * recursive_delete_key + */ +static LONG recursive_delete_key(HKEY key) +{ + LONG res; + WCHAR subkey_name[MAX_PATH]; + DWORD cName; + HKEY subkey; + + for (;;) { + cName = sizeof(subkey_name) / sizeof(WCHAR); + res = RegEnumKeyExW(key, 0, subkey_name, &cName, + NULL, NULL, NULL, NULL); + if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) { + res = ERROR_SUCCESS; /* presumably we're done enumerating */ + break; + } + res = RegOpenKeyExW(key, subkey_name, 0, + KEY_READ | KEY_WRITE, &subkey); + if (res == ERROR_FILE_NOT_FOUND) continue; + if (res != ERROR_SUCCESS) break; + + res = recursive_delete_key(subkey); + RegCloseKey(subkey); + if (res != ERROR_SUCCESS) break; + } + + if (res == ERROR_SUCCESS) res = RegDeleteKeyW(key, 0); + return res; +} + +/*********************************************************************** + * recursive_delete_keyA + */ +static LONG recursive_delete_keyA(HKEY base, char const *name) +{ + LONG res; + HKEY key; + + res = RegOpenKeyExA(base, name, 0, KEY_READ | KEY_WRITE, &key); + if (res == ERROR_FILE_NOT_FOUND) return ERROR_SUCCESS; + if (res != ERROR_SUCCESS) return res; + res = recursive_delete_key(key); + RegCloseKey(key); + return res; +} + +/*********************************************************************** + * recursive_delete_keyW + */ +static LONG recursive_delete_keyW(HKEY base, WCHAR const *name) +{ + LONG res; + HKEY key; + + res = RegOpenKeyExW(base, name, 0, KEY_READ | KEY_WRITE, &key); + if (res == ERROR_FILE_NOT_FOUND) return ERROR_SUCCESS; + if (res != ERROR_SUCCESS) return res; + res = recursive_delete_key(key); + RegCloseKey(key); + return res; +} + +/*********************************************************************** + * coclass list + */ +static GUID const CLSID_Desktop = { + 0x00021400, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} }; + +static GUID const CLSID_Shortcut = { + 0x00021401, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} }; + +static struct regsvr_coclass const coclass_list[] = { + { &CLSID_Desktop, + "Desktop", + NULL, + "shell32.dll", + "Apartment" + }, + { &CLSID_MyComputer, + "My Computer", + NULL, + "shell32.dll", + "Apartment" + }, + { &CLSID_Shortcut, + "Shortcut", + NULL, + "shell32.dll", + "Apartment", + SHELLEX_MAYCHANGEDEFAULTMENU + }, + { &CLSID_AutoComplete, + "AutoComplete", + NULL, + "shell32.dll", + "Apartment", + }, + { NULL } /* list terminator */ +}; + +/*********************************************************************** + * interface list + */ + +static struct regsvr_interface const interface_list[] = { + { NULL } /* list terminator */ +}; + +/*********************************************************************** + * DllRegisterServer (SHELL32.@) + */ +HRESULT WINAPI SHELL32_DllRegisterServer() +{ + HRESULT hr; + + TRACE("\n"); + + hr = register_coclasses(coclass_list); + if (SUCCEEDED(hr)) + hr = register_interfaces(interface_list); + if (SUCCEEDED(hr)) + hr = SHELL_RegisterShellFolders(); + return hr; +} + +/*********************************************************************** + * DllUnregisterServer (SHELL32.@) + */ +HRESULT WINAPI SHELL32_DllUnregisterServer() +{ + HRESULT hr; + + TRACE("\n"); + + hr = unregister_coclasses(coclass_list); + if (SUCCEEDED(hr)) + hr = unregister_interfaces(interface_list); + return hr; +} diff --git a/reactos/lib/shell32/ros-systray.c b/reactos/lib/shell32/ros-systray.c new file mode 100644 index 00000000000..4bce51b1998 --- /dev/null +++ b/reactos/lib/shell32/ros-systray.c @@ -0,0 +1,80 @@ +/* + * Copyright 2004 Martin Fuchs + * + * Pass on icon notification messages to the systray implementation + * in the currently running shell. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "shellapi.h" + + + /* copy data structure for tray notifications */ +typedef struct TrayNotifyCDS_Dummy { + DWORD cookie; + DWORD notify_code; + DWORD nicon_data[1]; // placeholder for NOTIFYICONDATA structure +} TrayNotifyCDS_Dummy; + + /* The only difference between Shell_NotifyIconA and Shell_NotifyIconW is the call to SendMessageA/W. */ +static BOOL SHELL_NotifyIcon(DWORD dwMessage, void* pnid, HWND nid_hwnd, int nid_size, BOOL unicode) +{ + HWND hwnd; + COPYDATASTRUCT data; + + BOOL ret = FALSE; + int len = sizeof(TrayNotifyCDS_Dummy)-sizeof(DWORD)+nid_size; + + TrayNotifyCDS_Dummy* pnotify_data = (TrayNotifyCDS_Dummy*) alloca(len); + + pnotify_data->cookie = 1; + pnotify_data->notify_code = dwMessage; + memcpy(&pnotify_data->nicon_data, pnid, nid_size); + + data.dwData = 1; + data.cbData = len; + data.lpData = pnotify_data; + + for(hwnd=0; hwnd=FindWindowExW(0, hwnd, L"Shell_TrayWnd", NULL); ) + if ((unicode?SendMessageW:SendMessageA)(hwnd, WM_COPYDATA, (WPARAM)nid_hwnd, (LPARAM)&data)) + ret = TRUE; + + return ret; +} + + +/************************************************************************* + * Shell_NotifyIcon [SHELL32.296] + * Shell_NotifyIconA [SHELL32.297] + */ +BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid) +{ + return SHELL_NotifyIcon(dwMessage, pnid, pnid->hWnd, pnid->cbSize, FALSE); +} + +/************************************************************************* + * Shell_NotifyIconW [SHELL32.298] + */ +BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW pnid) +{ + return SHELL_NotifyIcon(dwMessage, pnid, pnid->hWnd, pnid->cbSize, TRUE); +} diff --git a/reactos/lib/shell32/shell.c b/reactos/lib/shell32/shell.c new file mode 100644 index 00000000000..ed2b07e7b96 --- /dev/null +++ b/reactos/lib/shell32/shell.c @@ -0,0 +1,659 @@ +/* + * Shell Library Functions + * + * Copyright 1998 Marcus Meissner + * Copyright 2000 Juergen Schmied + * Copyright 2002 Eric Pouech + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" +#include "wownt32.h" +#include "dlgs.h" +#include "shellapi.h" +#include "winuser.h" +#include "wingdi.h" +#include "shlobj.h" +#include "shlwapi.h" +#include "ddeml.h" + +#include "wine/winbase16.h" +#include "wine/winuser16.h" +#include "shell32_main.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); +WINE_DECLARE_DEBUG_CHANNEL(exec); + + +typedef struct { /* structure for dropped files */ + WORD wSize; + POINT16 ptMousePos; + BOOL16 fInNonClientArea; + /* memory block with filenames follows */ +} DROPFILESTRUCT16, *LPDROPFILESTRUCT16; + +static const char* lpstrMsgWndCreated = "OTHERWINDOWCREATED"; +static const char* lpstrMsgWndDestroyed = "OTHERWINDOWDESTROYED"; +static const char* lpstrMsgShellActivate = "ACTIVATESHELLWINDOW"; + +static HWND SHELL_hWnd = 0; +static HHOOK SHELL_hHook = 0; +static UINT uMsgWndCreated = 0; +static UINT uMsgWndDestroyed = 0; +static UINT uMsgShellActivate = 0; +HINSTANCE16 SHELL_hInstance = 0; +HINSTANCE SHELL_hInstance32; +static int SHELL_Attach = 0; + +/*********************************************************************** + * DllEntryPoint [SHELL.101] + * + * Initialization code for shell.dll. Automatically loads the + * 32-bit shell32.dll to allow thunking up to 32-bit code. + * + * RETURNS + * Success: TRUE. Initialization completed successfully. + * Failure: FALSE. + */ +BOOL WINAPI SHELL_DllEntryPoint(DWORD Reason, HINSTANCE16 hInst, + WORD ds, WORD HeapSize, DWORD res1, WORD res2) +{ + TRACE("(%08lx, %04x, %04x, %04x, %08lx, %04x)\n", + Reason, hInst, ds, HeapSize, res1, res2); + + switch(Reason) + { + case DLL_PROCESS_ATTACH: + if (SHELL_Attach++) break; + SHELL_hInstance = hInst; + if(!SHELL_hInstance32) + { + if(!(SHELL_hInstance32 = LoadLibraryA("shell32.dll"))) + { + ERR("Could not load sibling shell32.dll\n"); + return FALSE; + } + } + break; + + case DLL_PROCESS_DETACH: + if(!--SHELL_Attach) + { + SHELL_hInstance = 0; + if(SHELL_hInstance32) + FreeLibrary(SHELL_hInstance32); + } + break; + } + return TRUE; +} + +/************************************************************************* + * DragAcceptFiles [SHELL.9] + */ +void WINAPI DragAcceptFiles16(HWND16 hWnd, BOOL16 b) +{ + DragAcceptFiles(HWND_32(hWnd), b); +} + +/************************************************************************* + * DragQueryFile [SHELL.11] + */ +UINT16 WINAPI DragQueryFile16( + HDROP16 hDrop, + WORD wFile, + LPSTR lpszFile, + WORD wLength) +{ + LPSTR lpDrop; + UINT i = 0; + LPDROPFILESTRUCT16 lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop); + + TRACE("(%04x, %x, %p, %u)\n", hDrop,wFile,lpszFile,wLength); + + if(!lpDropFileStruct) goto end; + + lpDrop = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize; + + while (i++ < wFile) + { + while (*lpDrop++); /* skip filename */ + if (!*lpDrop) + { + i = (wFile == 0xFFFF) ? i : 0; + goto end; + } + } + + i = strlen(lpDrop); + i++; + if (!lpszFile ) goto end; /* needed buffer size */ + i = (wLength > i) ? i : wLength; + lstrcpynA (lpszFile, lpDrop, i); +end: + GlobalUnlock16(hDrop); + return i; +} + +/************************************************************************* + * DragFinish [SHELL.12] + */ +void WINAPI DragFinish16(HDROP16 h) +{ + TRACE("\n"); + GlobalFree16((HGLOBAL16)h); +} + + +/************************************************************************* + * DragQueryPoint [SHELL.13] + */ +BOOL16 WINAPI DragQueryPoint16(HDROP16 hDrop, POINT16 *p) +{ + LPDROPFILESTRUCT16 lpDropFileStruct; + BOOL16 bRet; + TRACE("\n"); + lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop); + + memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT16)); + bRet = lpDropFileStruct->fInNonClientArea; + + GlobalUnlock16(hDrop); + return bRet; +} + +/************************************************************************* + * FindExecutable (SHELL.21) + */ +HINSTANCE16 WINAPI FindExecutable16( LPCSTR lpFile, LPCSTR lpDirectory, + LPSTR lpResult ) +{ return HINSTANCE_16(FindExecutableA( lpFile, lpDirectory, lpResult )); +} + +/************************************************************************* + * AboutDlgProc (SHELL.33) + */ +BOOL16 WINAPI AboutDlgProc16( HWND16 hWnd, UINT16 msg, WPARAM16 wParam, + LPARAM lParam ) +{ return (BOOL16)AboutDlgProc( HWND_32(hWnd), msg, wParam, lParam ); +} + + +/************************************************************************* + * ShellAbout (SHELL.22) + */ +BOOL16 WINAPI ShellAbout16( HWND16 hWnd, LPCSTR szApp, LPCSTR szOtherStuff, + HICON16 hIcon ) +{ return ShellAboutA( HWND_32(hWnd), szApp, szOtherStuff, HICON_32(hIcon) ); +} + +/************************************************************************* + * InternalExtractIcon [SHELL.39] + * + * This abortion is called directly by Progman + */ +HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance, + LPCSTR lpszExeFileName, UINT16 nIconIndex, WORD n ) +{ + HGLOBAL16 hRet = 0; + HICON16 *RetPtr = NULL; + OFSTRUCT ofs; + + TRACE("(%04x,file %s,start %d,extract %d\n", + hInstance, lpszExeFileName, nIconIndex, n); + + if (!n) + return 0; + + hRet = GlobalAlloc16(GMEM_FIXED | GMEM_ZEROINIT, sizeof(*RetPtr) * n); + RetPtr = (HICON16*)GlobalLock16(hRet); + + if (nIconIndex == (UINT16)-1) /* get number of icons */ + { + RetPtr[0] = PrivateExtractIconsA(ofs.szPathName, 0, 0, 0, NULL, NULL, 0, LR_DEFAULTCOLOR); + } + else + { + UINT ret; + HICON *icons; + + icons = HeapAlloc(GetProcessHeap(), 0, n * sizeof(*icons)); + ret = PrivateExtractIconsA(ofs.szPathName, nIconIndex, + GetSystemMetrics(SM_CXICON), + GetSystemMetrics(SM_CYICON), + icons, NULL, n, LR_DEFAULTCOLOR); + if ((ret != 0xffffffff) && ret) + { + int i; + for (i = 0; i < n; i++) RetPtr[i] = HICON_16(icons[i]); + } + else + { + GlobalFree16(hRet); + hRet = 0; + } + HeapFree(GetProcessHeap(), 0, icons); + } + return hRet; +} + +/************************************************************************* + * ExtractIcon (SHELL.34) + */ +HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName, + UINT16 nIconIndex ) +{ TRACE("\n"); + return HICON_16(ExtractIconA(HINSTANCE_32(hInstance), lpszExeFileName, nIconIndex)); +} + +/************************************************************************* + * ExtractIconEx (SHELL.40) + */ +HICON16 WINAPI ExtractIconEx16( + LPCSTR lpszFile, INT16 nIconIndex, HICON16 *phiconLarge, + HICON16 *phiconSmall, UINT16 nIcons +) { + HICON *ilarge,*ismall; + UINT16 ret; + int i; + + if (phiconLarge) + ilarge = (HICON*)HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON)); + else + ilarge = NULL; + if (phiconSmall) + ismall = (HICON*)HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON)); + else + ismall = NULL; + ret = HICON_16(ExtractIconExA(lpszFile,nIconIndex,ilarge,ismall,nIcons)); + if (ilarge) { + for (i=0;i 1 ) /* found key */ + { + LPSTR lpKey; + *lpend = '\0'; + lpKey = SHELL_FindString(lpEnv, lpstr+1); + if( lpKey ) /* found key value */ + { + int l = strlen(lpKey); + + if( l > length - (lpbstr - lpBuffer) - 1 ) + { + WARN("-- Env subst aborted - string too short\n"); + *lpend = '%'; + break; + } + strcpy(lpbstr, lpKey); + lpbstr += l; + } + else break; + *lpend = '%'; + lpstr = lpend + 1; + } + else break; /* back off and whine */ + + continue; + } + + *lpbstr++ = *lpstr++; + } + + *lpbstr = '\0'; + if( lpstr - str == strlen(str) ) + { + strncpy(str, lpBuffer, length); + length = 1; + } + else + length = 0; + + TRACE("-- return %s\n", str); + + OemToCharA(str,str); + HeapFree( GetProcessHeap(), 0, lpBuffer); + + /* Return str length in the LOWORD + * and 1 in HIWORD if subst was successful. + */ + return (DWORD)MAKELONG(strlen(str), length); +} + +/************************************************************************* + * SHELL_HookProc + * + * 32-bit version of the system-wide WH_SHELL hook. + */ +static LRESULT WINAPI SHELL_HookProc(INT code, WPARAM wParam, LPARAM lParam) +{ + TRACE("%i, %x, %08lx\n", code, wParam, lParam ); + + if (SHELL_hWnd) + { + switch( code ) + { + case HSHELL_WINDOWCREATED: + PostMessageA( SHELL_hWnd, uMsgWndCreated, wParam, 0 ); + break; + case HSHELL_WINDOWDESTROYED: + PostMessageA( SHELL_hWnd, uMsgWndDestroyed, wParam, 0 ); + break; + case HSHELL_ACTIVATESHELLWINDOW: + PostMessageA( SHELL_hWnd, uMsgShellActivate, wParam, 0 ); + break; + } + } + return CallNextHookEx( SHELL_hHook, code, wParam, lParam ); +} + +/************************************************************************* + * ShellHookProc [SHELL.103] + * System-wide WH_SHELL hook. + */ +LRESULT WINAPI ShellHookProc16(INT16 code, WPARAM16 wParam, LPARAM lParam) +{ + return SHELL_HookProc( code, wParam, lParam ); +} + +/************************************************************************* + * RegisterShellHook [SHELL.102] + */ +BOOL WINAPI RegisterShellHook16(HWND16 hWnd, UINT16 uAction) +{ + TRACE("%04x [%u]\n", hWnd, uAction ); + + switch( uAction ) + { + case 2: /* register hWnd as a shell window */ + if( !SHELL_hHook ) + { + SHELL_hHook = SetWindowsHookExA( WH_SHELL, SHELL_HookProc, + GetModuleHandleA("shell32.dll"), 0 ); + if ( SHELL_hHook ) + { + uMsgWndCreated = RegisterWindowMessageA( lpstrMsgWndCreated ); + uMsgWndDestroyed = RegisterWindowMessageA( lpstrMsgWndDestroyed ); + uMsgShellActivate = RegisterWindowMessageA( lpstrMsgShellActivate ); + } + else + WARN("-- unable to install ShellHookProc()!\n"); + } + + if ( SHELL_hHook ) + return ((SHELL_hWnd = HWND_32(hWnd)) != 0); + break; + + default: + WARN("-- unknown code %i\n", uAction ); + SHELL_hWnd = 0; /* just in case */ + } + return FALSE; +} + + +/*********************************************************************** + * DriveType (SHELL.262) + */ +UINT16 WINAPI DriveType16( UINT16 drive ) +{ + UINT ret; + char path[] = "A:\\"; + path[0] += drive; + ret = GetDriveTypeA(path); + switch(ret) /* some values are not supported in Win16 */ + { + case DRIVE_CDROM: + ret = DRIVE_REMOTE; + break; + case DRIVE_NO_ROOT_DIR: + ret = DRIVE_UNKNOWN; + break; + } + return ret; +} + + +/* 0 and 1 are valid rootkeys in win16 shell.dll and are used by + * some programs. Do not remove those cases. -MM + */ +static inline void fix_win16_hkey( HKEY *hkey ) +{ + if (*hkey == 0 || *hkey == (HKEY)1) *hkey = HKEY_CLASSES_ROOT; +} + +/****************************************************************************** + * RegOpenKey [SHELL.1] + */ +DWORD WINAPI RegOpenKey16( HKEY hkey, LPCSTR name, PHKEY retkey ) +{ + fix_win16_hkey( &hkey ); + return RegOpenKeyA( hkey, name, retkey ); +} + +/****************************************************************************** + * RegCreateKey [SHELL.2] + */ +DWORD WINAPI RegCreateKey16( HKEY hkey, LPCSTR name, PHKEY retkey ) +{ + fix_win16_hkey( &hkey ); + return RegCreateKeyA( hkey, name, retkey ); +} + +/****************************************************************************** + * RegCloseKey [SHELL.3] + */ +DWORD WINAPI RegCloseKey16( HKEY hkey ) +{ + fix_win16_hkey( &hkey ); + return RegCloseKey( hkey ); +} + +/****************************************************************************** + * RegDeleteKey [SHELL.4] + */ +DWORD WINAPI RegDeleteKey16( HKEY hkey, LPCSTR name ) +{ + fix_win16_hkey( &hkey ); + return RegDeleteKeyA( hkey, name ); +} + +/****************************************************************************** + * RegSetValue [SHELL.5] + */ +DWORD WINAPI RegSetValue16( HKEY hkey, LPCSTR name, DWORD type, LPCSTR data, DWORD count ) +{ + fix_win16_hkey( &hkey ); + return RegSetValueA( hkey, name, type, data, count ); +} + +/****************************************************************************** + * RegQueryValue [SHELL.6] + * + * NOTES + * Is this HACK still applicable? + * + * HACK + * The 16bit RegQueryValue doesn't handle selectorblocks anyway, so we just + * mask out the high 16 bit. This (not so much incidently) hopefully fixes + * Aldus FH4) + */ +DWORD WINAPI RegQueryValue16( HKEY hkey, LPCSTR name, LPSTR data, LPDWORD count +) +{ + fix_win16_hkey( &hkey ); + if (count) *count &= 0xffff; + return RegQueryValueA( hkey, name, data, count ); +} + +/****************************************************************************** + * RegEnumKey [SHELL.7] + */ +DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD index, LPSTR name, DWORD name_len ) +{ + fix_win16_hkey( &hkey ); + return RegEnumKeyA( hkey, index, name, name_len ); +} + +/************************************************************************* + * SHELL_Execute16 [Internal] + */ +static UINT SHELL_Execute16(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, + LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out) +{ + UINT ret; + char sCmd[MAX_PATH]; + WideCharToMultiByte(CP_ACP, 0, lpCmd, -1, sCmd, MAX_PATH, NULL, NULL); + ret = WinExec16(sCmd, (UINT16)psei->nShow); + psei_out->hInstApp = HINSTANCE_32(ret); + return ret; +} + +/************************************************************************* + * ShellExecute [SHELL.20] + */ +HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation, + LPCSTR lpFile, LPCSTR lpParameters, + LPCSTR lpDirectory, INT16 iShowCmd ) +{ + SHELLEXECUTEINFOW seiW; + WCHAR *wVerb = NULL, *wFile = NULL, *wParameters = NULL, *wDirectory = NULL; + HANDLE hProcess = 0; + + seiW.lpVerb = lpOperation ? __SHCloneStrAtoW(&wVerb, lpOperation) : NULL; + seiW.lpFile = lpFile ? __SHCloneStrAtoW(&wFile, lpFile) : NULL; + seiW.lpParameters = lpParameters ? __SHCloneStrAtoW(&wParameters, lpParameters) : NULL; + seiW.lpDirectory = lpDirectory ? __SHCloneStrAtoW(&wDirectory, lpDirectory) : NULL; + + seiW.cbSize = sizeof(seiW); + seiW.fMask = 0; + seiW.hwnd = HWND_32(hWnd); + seiW.nShow = iShowCmd; + seiW.lpIDList = 0; + seiW.lpClass = 0; + seiW.hkeyClass = 0; + seiW.dwHotKey = 0; + seiW.hProcess = hProcess; + + ShellExecuteExW32 (&seiW, SHELL_Execute16); + + if (wVerb) SHFree(wVerb); + if (wFile) SHFree(wFile); + if (wParameters) SHFree(wParameters); + if (wDirectory) SHFree(wDirectory); + + return HINSTANCE_16(seiW.hInstApp); +} diff --git a/reactos/lib/shell32/shell.spec b/reactos/lib/shell32/shell.spec new file mode 100644 index 00000000000..ca3f8625b76 --- /dev/null +++ b/reactos/lib/shell32/shell.spec @@ -0,0 +1,45 @@ + 1 pascal RegOpenKey(long str ptr) RegOpenKey16 + 2 pascal RegCreateKey(long str ptr) RegCreateKey16 + 3 pascal RegCloseKey(long) RegCloseKey16 + 4 pascal RegDeleteKey(long str) RegDeleteKey16 + 5 pascal RegSetValue(long str long str long) RegSetValue16 + 6 pascal RegQueryValue(long str ptr ptr) RegQueryValue16 + 7 pascal RegEnumKey(long long ptr long) RegEnumKey16 + 9 pascal -ret16 DragAcceptFiles(word word) DragAcceptFiles16 + 11 pascal -ret16 DragQueryFile(word s_word ptr s_word) DragQueryFile16 + 12 pascal -ret16 DragFinish(word) DragFinish16 + 13 pascal -ret16 DragQueryPoint(word ptr) DragQueryPoint16 + 20 pascal -ret16 ShellExecute(word str str str str s_word) ShellExecute16 + 21 pascal -ret16 FindExecutable(str str ptr) FindExecutable16 + 22 pascal -ret16 ShellAbout(word ptr ptr word) ShellAbout16 + 33 pascal -ret16 AboutDlgProc(word word word long) AboutDlgProc16 + 34 pascal -ret16 ExtractIcon(word str s_word) ExtractIcon16 + 36 pascal -ret16 ExtractAssociatedIcon(word ptr ptr) ExtractAssociatedIcon16 + 37 pascal DoEnvironmentSubst(ptr word) DoEnvironmentSubst16 + 38 pascal FindEnvironmentString(ptr) FindEnvironmentString16 + 39 pascal -ret16 InternalExtractIcon(word ptr s_word word) InternalExtractIcon16 + 40 pascal -ret16 ExtractIconEx(str word ptr ptr word) ExtractIconEx16 +# 98 stub SHL3216_THUNKDATA16 +# 99 stub SHL1632_THUNKDATA16 + +#100 4 0550 HERETHARBETYGARS exported, shared data +#101 8 010e FINDEXEDLGPROC exported, shared data +101 pascal DllEntryPoint(long word word word long word) SHELL_DllEntryPoint + +102 pascal -ret16 RegisterShellHook(word word) RegisterShellHook16 +103 pascal ShellHookProc(word word long) ShellHookProc16 + +157 stub RESTARTDIALOG +# 166 PICKICONDLG + +262 pascal -ret16 DriveType(long) DriveType16 + +# 263 SH16TO32DRIVEIOCTL +# 264 SH16TO32INT2526 +# 300 SHGETFILEINFO +# 400 SHFORMATDRIVE +401 stub SHCHECKDRIVE +# 402 _RUNDLLCHECKDRIVE + +# 8 WEP +#32 WCI diff --git a/reactos/lib/shell32/shell32.spec b/reactos/lib/shell32/shell32.spec new file mode 100644 index 00000000000..e7dc10f4d81 --- /dev/null +++ b/reactos/lib/shell32/shell32.spec @@ -0,0 +1,441 @@ +# Functions exported by the Win95 shell32.dll +# (these need to have these exact ordinals, for some +# win95 and winNT dlls import shell32.dll by ordinal) +# This list was updated to dll version 4.72 + + 2 stdcall SHChangeNotifyRegister(long long long long long ptr) + 4 stdcall SHChangeNotifyDeregister (long) + 5 stdcall SHChangeNotifyUpdateEntryList (long long long long) + 9 stub PifMgr_OpenProperties + 10 stub PifMgr_GetProperties + 11 stub PifMgr_SetProperties + 13 stub PifMgr_CloseProperties + 15 stdcall ILGetDisplayName(ptr ptr) + 16 stdcall ILFindLastID(ptr) + 17 stdcall ILRemoveLastID(ptr) + 18 stdcall ILClone(ptr) + 19 stdcall ILCloneFirst (ptr) + 20 stdcall ILGlobalClone (ptr) + 21 stdcall ILIsEqual (ptr ptr) + 23 stdcall ILIsParent (ptr ptr long) + 24 stdcall ILFindChild (ptr ptr) + 25 stdcall ILCombine(ptr ptr) + 26 stdcall ILLoadFromStream (ptr ptr) + 27 stdcall ILSaveToStream(ptr ptr) + 28 stdcall SHILCreateFromPath(ptr ptr ptr) SHILCreateFromPathAW + 29 stdcall PathIsRoot(ptr) PathIsRootAW + 30 stdcall PathBuildRoot(ptr long) PathBuildRootAW + 31 stdcall PathFindExtension(ptr) PathFindExtensionAW + 32 stdcall PathAddBackslash(ptr) PathAddBackslashAW + 33 stdcall PathRemoveBlanks(ptr) PathRemoveBlanksAW + 34 stdcall PathFindFileName(ptr) PathFindFileNameAW + 35 stdcall PathRemoveFileSpec(ptr) PathRemoveFileSpecAW + 36 stdcall PathAppend(ptr ptr) PathAppendAW + 37 stdcall PathCombine(ptr ptr ptr) PathCombineAW + 38 stdcall PathStripPath(ptr)PathStripPathAW + 39 stdcall PathIsUNC (ptr) PathIsUNCAW + 40 stdcall PathIsRelative (ptr) PathIsRelativeAW + 41 stdcall IsLFNDriveA(str) + 42 stdcall IsLFNDriveW(wstr) + 43 stdcall PathIsExe (ptr) PathIsExeAW + 45 stdcall PathFileExists(ptr) PathFileExistsAW + 46 stdcall PathMatchSpec (ptr ptr) PathMatchSpecAW + 47 stdcall PathMakeUniqueName (ptr long ptr ptr ptr)PathMakeUniqueNameAW + 48 stdcall PathSetDlgItemPath (long long ptr) PathSetDlgItemPathAW + 49 stdcall PathQualify (ptr) PathQualifyAW + 50 stdcall PathStripToRoot (ptr) PathStripToRootAW + 51 stdcall PathResolve(str long long) PathResolveAW + 52 stdcall PathGetArgs(str) PathGetArgsAW + 53 stdcall DoEnvironmentSubst (long long) DoEnvironmentSubstAW + 54 stdcall DragAcceptFiles(long long) + 55 stdcall PathQuoteSpaces (ptr) PathQuoteSpacesAW + 56 stdcall PathUnquoteSpaces(str) PathUnquoteSpacesAW + 57 stdcall PathGetDriveNumber (str) PathGetDriveNumberAW + 58 stdcall ParseField(str long ptr long) ParseFieldAW + 59 stdcall RestartDialog(long wstr long) + 60 stdcall ExitWindowsDialog(long) + 61 stdcall RunFileDlg(long long long str str long) + 62 stdcall PickIconDlg(long long long long) + 63 stdcall GetFileNameFromBrowse(long long long long str str str) + 64 stdcall DriveType (long) + 65 stub InvalidateDriveType + 66 stdcall IsNetDrive(long) + 67 stdcall Shell_MergeMenus (long long long long long long) + 68 stdcall SHGetSetSettings(ptr long long) + 69 stub SHGetNetResource + 70 stdcall SHCreateDefClassObject(long long long long long) + 71 stdcall Shell_GetImageList(ptr ptr) + 72 stdcall Shell_GetCachedImageIndex(ptr ptr long) Shell_GetCachedImageIndexAW + 73 stdcall SHShellFolderView_Message(long long long) + 74 stdcall SHCreateStdEnumFmtEtc(long ptr ptr) + 75 stdcall PathYetAnotherMakeUniqueName(ptr wstr wstr wstr) + 76 stub DragQueryInfo + 77 stdcall SHMapPIDLToSystemImageListIndex(ptr ptr ptr) + 78 stdcall OleStrToStrN(str long wstr long) OleStrToStrNAW + 79 stdcall StrToOleStrN(wstr long str long) StrToOleStrNAW + 80 stdcall DragFinish(long) + 81 stdcall DragQueryFile(long long ptr long) DragQueryFileA + 82 stdcall DragQueryFileA(long long ptr long) + 83 stdcall CIDLData_CreateFromIDArray(ptr long ptr ptr) + 84 stub SHIsBadInterfacePtr + 85 stdcall OpenRegStream(long str str long) shlwapi.SHOpenRegStreamA + 86 stdcall SHRegisterDragDrop(long ptr) + 87 stdcall SHRevokeDragDrop(long) + 88 stdcall SHDoDragDrop(long ptr ptr long ptr) + 89 stdcall SHCloneSpecialIDList(long long long) + 90 stdcall SHFindFiles(ptr ptr) + 91 stub SHFindComputer + 92 stdcall PathGetShortPath (ptr) PathGetShortPathAW + 93 stdcall Win32CreateDirectory(wstr ptr) Win32CreateDirectoryAW + 94 stdcall Win32RemoveDirectory(wstr) Win32RemoveDirectoryAW + 95 stdcall SHLogILFromFSIL (ptr) + 96 stdcall StrRetToStrN (ptr long ptr ptr) StrRetToStrNAW + 97 stdcall SHWaitForFileToOpen (long long long) + 98 stdcall SHGetRealIDL (ptr ptr ptr) + 99 stdcall SetAppStartingCursor (long long) + 100 stdcall SHRestricted(long) + + 102 stdcall SHCoCreateInstance(wstr ptr long ptr ptr) + 103 stdcall SignalFileOpen(long) + 104 stdcall FileMenu_DeleteAllItems(long) + 105 stdcall FileMenu_DrawItem(long ptr) + 106 stdcall FileMenu_FindSubMenuByPidl(long ptr) + 107 stdcall FileMenu_GetLastSelectedItemPidls(long ptr ptr) + 108 stdcall FileMenu_HandleMenuChar(long long) + 109 stdcall FileMenu_InitMenuPopup (long) + 110 stdcall FileMenu_InsertUsingPidl (long long ptr long long ptr) + 111 stdcall FileMenu_Invalidate (long) + 112 stdcall FileMenu_MeasureItem(long ptr) + 113 stdcall FileMenu_ReplaceUsingPidl (long long ptr long ptr) + 114 stdcall FileMenu_Create (long long long long long) + 115 stdcall FileMenu_AppendItem (long ptr long long long long) FileMenu_AppendItemAW + 116 stdcall FileMenu_TrackPopupMenuEx (long long long long long long) + 117 stdcall FileMenu_DeleteItemByCmd(long long) + 118 stdcall FileMenu_Destroy (long) + 119 stdcall IsLFNDrive(ptr) IsLFNDriveAW + 120 stdcall FileMenu_AbortInitMenu () + 121 stdcall SHFlushClipboard () + 122 stdcall -noname RunDLL_CallEntry16(long long long str long) #name wrong? + 123 stdcall SHFreeUnusedLibraries () + 124 stdcall FileMenu_AppendFilesForPidl(long ptr long) + 125 stdcall FileMenu_AddFilesForPidl(long long long ptr long long ptr) + 126 stdcall SHOutOfMemoryMessageBox (long long long) + 127 stdcall SHWinHelp (long long long long) + 128 stdcall -private DllGetClassObject(long long ptr) SHELL32_DllGetClassObject + 129 stdcall DAD_AutoScroll(long ptr ptr) + 130 stdcall DAD_DragEnter(long) + 131 stdcall DAD_DragEnterEx(long long long) + 132 stdcall DAD_DragLeave() + 133 stdcall DragQueryFileW(long long ptr long) + 134 stdcall DAD_DragMove(long long) + 135 stdcall DragQueryPoint(long ptr) + 136 stdcall DAD_SetDragImage(long long) + 137 stdcall DAD_ShowDragImage (long) + 139 stub Desktop_UpdateBriefcaseOnEvent + 140 stdcall FileMenu_DeleteItemByIndex(long long) + 141 stdcall FileMenu_DeleteItemByFirstID(long long) + 142 stdcall FileMenu_DeleteSeparator(long) + 143 stdcall FileMenu_EnableItemByCmd(long long long) + 144 stdcall FileMenu_GetItemExtent (long long) + 145 stdcall PathFindOnPath (ptr ptr) PathFindOnPathAW + 146 stdcall RLBuildListOfPaths() + 147 stdcall SHCLSIDFromString(long long) SHCLSIDFromStringAW + 149 stdcall SHFind_InitMenuPopup(long long long long) + + 151 stdcall SHLoadOLE (long) + 152 stdcall ILGetSize(ptr) + 153 stdcall ILGetNext(ptr) + 154 stdcall ILAppend (long long long) + 155 stdcall ILFree (ptr) + 156 stdcall ILGlobalFree (ptr) + 157 stdcall ILCreateFromPath (ptr) ILCreateFromPathAW + 158 stdcall PathGetExtension(str long long) PathGetExtensionAW + 159 stdcall PathIsDirectory(ptr)PathIsDirectoryAW + 160 stub SHNetConnectionDialog + 161 stdcall SHRunControlPanel (long long) + 162 stdcall SHSimpleIDListFromPath (ptr) SHSimpleIDListFromPathAW + 163 stdcall StrToOleStr (wstr str) StrToOleStrAW + 164 stdcall Win32DeleteFile(str) Win32DeleteFileAW + 165 stdcall SHCreateDirectory(long ptr) + 166 stdcall CallCPLEntry16(long long long long long long) + 167 stdcall SHAddFromPropSheetExtArray(long long long) + 168 stdcall SHCreatePropSheetExtArray(long str long) + 169 stdcall SHDestroyPropSheetExtArray(long) + 170 stdcall SHReplaceFromPropSheetExtArray(long long long long) + 171 stdcall PathCleanupSpec(ptr ptr) + 172 stdcall SHCreateLinks(long str ptr long ptr) + 173 stdcall SHValidateUNC(long long long) + 174 stdcall SHCreateShellFolderViewEx (ptr ptr) + 175 stdcall SHGetSpecialFolderPath(long long long long) SHGetSpecialFolderPathAW + 176 stdcall SHSetInstanceExplorer (long) + 177 stub DAD_SetDragImageFromListView + 178 stub SHObjectProperties + 179 stub SHGetNewLinkInfoA + 180 stub SHGetNewLinkInfoW + 181 stdcall RegisterShellHook(long long) + 182 varargs ShellMessageBoxW(long long long str long) + 183 varargs ShellMessageBoxA(long long long str long) + 184 stdcall ArrangeWindows(long long long long long) + 185 stub SHHandleDiskFull + 186 stdcall ILGetDisplayNameEx(ptr ptr ptr long) + 187 stub ILGetPseudoNameW + 188 stdcall ShellDDEInit(long) + 189 stdcall ILCreateFromPathA(str) + 190 stdcall ILCreateFromPathW(wstr) + 191 stub SHUpdateImageA + 192 stdcall SHUpdateImageW(wstr long long long) + 193 stub SHHandleUpdateImage + 194 stub SHCreatePropSheetExtArrayEx + 195 stdcall SHFree(ptr) + 196 stdcall SHAlloc(long) + 197 stub SHGlobalDefect + 198 stdcall SHAbortInvokeCommand () + 199 stub SHGetFileIcon + 200 stub SHLocalAlloc + 201 stub SHLocalFree + 202 stub SHLocalReAlloc + 203 stub AddCommasW + 204 stub ShortSizeFormatW + 205 stub Printer_LoadIconsW + 206 stub Link_AddExtraDataSection + 207 stub Link_ReadExtraDataSection + 208 stub Link_RemoveExtraDataSection + 209 stub Int64ToString + 210 stub LargeIntegerToString + 211 stub Printers_GetPidl + 212 stub Printers_AddPrinterPropPages + 213 stub Printers_RegisterWindowW + 214 stub Printers_UnregisterWindow + 215 stub SHStartNetConnectionDialog + 243 stdcall @(long long) shell32_243 + 244 stdcall SHInitRestricted(ptr ptr) + 247 stdcall SHGetDataFromIDListA (ptr ptr long ptr long) + 248 stdcall SHGetDataFromIDListW (ptr ptr long ptr long) + 249 stdcall PathParseIconLocation (ptr) PathParseIconLocationAW + 250 stdcall PathRemoveExtension (ptr) PathRemoveExtensionAW + 251 stdcall PathRemoveArgs (ptr) PathRemoveArgsAW + 256 stdcall @(ptr ptr) SHELL32_256 + 271 stub SheChangeDirA + 272 stub SheChangeDirExA + 273 stub SheChangeDirExW + 274 stdcall SheChangeDirW(wstr) + 275 stub SheConvertPathW + 276 stub SheFullPathA + 277 stub SheFullPathW + 278 stub SheGetCurDrive + 279 stub SheGetDirA + 280 stub SheGetDirExW + 281 stdcall SheGetDirW (long long) + 282 stub SheGetPathOffsetW + 283 stub SheRemoveQuotesA + 284 stub SheRemoveQuotesW + 285 stub SheSetCurDrive + 286 stub SheShortenPathA + 287 stub SheShortenPathW + 288 stdcall ShellAboutA(long str str long) + 289 stdcall ShellAboutW(long wstr wstr long) + 290 stdcall ShellExecuteA(long str str str str long) + 291 stdcall ShellExecuteEx (long) ShellExecuteExAW + 292 stdcall ShellExecuteExA (long) + 293 stdcall ShellExecuteExW (long) + 294 stdcall ShellExecuteW (long wstr wstr wstr wstr long) + 296 stdcall Shell_NotifyIcon(long ptr) Shell_NotifyIconA + 297 stdcall Shell_NotifyIconA(long ptr) + 298 stdcall Shell_NotifyIconW(long ptr) + 299 stub Shl1632_ThunkData32 + 300 stub Shl3216_ThunkData32 + 301 stdcall StrChrA(str long) shlwapi.StrChrA + 302 stdcall StrChrIA(str long) shlwapi.StrChrIA + 303 stdcall StrChrIW(wstr long) shlwapi.StrChrIW + 304 stdcall StrChrW(wstr long) shlwapi.StrChrW + 305 stdcall StrCmpNA(str str long) shlwapi.StrCmpNA + 306 stdcall StrCmpNIA(str str long) shlwapi.StrCmpNIA + 307 stdcall StrCmpNIW(wstr wstr long) shlwapi.StrCmpNIW + 308 stdcall StrCmpNW(wstr wstr long) shlwapi.StrCmpNW + 309 stdcall StrCpyNA (ptr str long) lstrcpynA + 310 stdcall StrCpyNW(wstr wstr long) shlwapi.StrCpyNW + 311 stdcall StrNCmpA(str str long) shlwapi.StrCmpNA + 312 stdcall StrNCmpIA(str str long) shlwapi.StrCmpNIA + 313 stdcall StrNCmpIW(wstr wstr long) shlwapi.StrCmpNIW + 314 stdcall StrNCmpW(wstr wstr long) shlwapi.StrCmpNW + 315 stdcall StrNCpyA (ptr str long) lstrcpynA + 316 stdcall StrNCpyW(wstr wstr long) shlwapi.StrCpyNW + 317 stdcall StrRChrA(str str long) shlwapi.StrRChrA + 318 stdcall StrRChrIA(str str long) shlwapi.StrRChrIA + 319 stdcall StrRChrIW(str str long) shlwapi.StrRChrIW + 320 stdcall StrRChrW(wstr wstr long) shlwapi.StrRChrW + 321 stub StrRStrA + 322 stdcall StrRStrIA(str str str) shlwapi.StrRStrIA + 323 stdcall StrRStrIW(wstr wstr wstr) shlwapi.StrRStrIW + 324 stub StrRStrW + 325 stdcall StrStrA(str str) shlwapi.StrStrA + 326 stdcall StrStrIA(str str) shlwapi.StrStrIA + 327 stdcall StrStrIW(wstr wstr) shlwapi.StrStrIW + 328 stdcall StrStrW(wstr wstr) shlwapi.StrStrW + + 505 stdcall SHRegCloseKey (long) + 506 stdcall SHRegOpenKeyA (long str long) + 507 stdcall SHRegOpenKeyW (long wstr long) + 508 stub SHRegQueryValueA + 509 stdcall SHRegQueryValueExA(long str ptr ptr ptr ptr) + 510 stdcall SHRegQueryValueW (long long long long) + 511 stdcall SHRegQueryValueExW (long wstr ptr ptr ptr ptr) + 512 stdcall SHRegDeleteKeyW (long wstr) + + 520 stdcall -noname SHAllocShared (ptr long long) + 521 stdcall -noname SHLockShared (long long) + 522 stdcall -noname SHUnlockShared (ptr) + 523 stdcall -noname SHFreeShared (long long) + 524 stdcall RealDriveType (long long) + 525 stub RealDriveTypeFlags + + 640 stdcall NTSHChangeNotifyRegister (long long long long long long) + 641 stdcall NTSHChangeNotifyDeregister (long) + + 643 stub SHChangeNotifyReceive + 644 stdcall SHChangeNotification_Lock(long long ptr ptr) + 645 stdcall SHChangeNotification_Unlock(long) + 646 stub SHChangeRegistrationReceive + 647 stub ReceiveAddToRecentDocs + 648 stub SHWaitOp_Operate + + 650 stdcall PathIsSameRoot(ptr ptr)PathIsSameRootAW + +# nt40/win98 + 651 stdcall ReadCabinetState (long long) # OldReadCabinetState + 652 stdcall WriteCabinetState (long) + 653 stdcall PathProcessCommand (long long long long) PathProcessCommandAW + +# win98 + 654 stdcall @(long long)shell32_654 # ReadCabinetState@8 + 660 stdcall FileIconInit(long) + 680 stdcall IsUserAdmin() + +# >= NT5 + 714 stdcall @(ptr)SHELL32_714 # PathIsTemporaryW + 730 stdcall RestartDialogEx(long wstr long long) + +1217 stub FOOBAR1217 # no joke! This is the real name!! + +# +# version 4.0 (win95) +# _WIN32_IE >= 0x0200 +# +@ stdcall CheckEscapesA(str long) +@ stdcall CheckEscapesW(wstr long) +@ stdcall CommandLineToArgvW(wstr ptr) +@ stdcall Control_FillCache_RunDLL(long long long long) Control_FillCache_RunDLLA +@ stdcall Control_FillCache_RunDLLA(long long long long) +@ stdcall Control_FillCache_RunDLLW(long long long long) +@ stdcall Control_RunDLL(ptr ptr str long) Control_RunDLLA +@ stdcall Control_RunDLLA(ptr ptr str long) +@ stdcall Control_RunDLLW(ptr ptr wstr long) +@ stdcall -private DllCanUnloadNow() SHELL32_DllCanUnloadNow +@ stdcall DllInstall(long wstr)SHELL32_DllInstall +@ stdcall -private DllRegisterServer() SHELL32_DllRegisterServer +@ stdcall -private DllUnregisterServer() SHELL32_DllUnregisterServer +@ stdcall DoEnvironmentSubstA(str str) +@ stdcall DoEnvironmentSubstW(wstr wstr) +@ stub DragQueryFileAorW +@ stdcall DuplicateIcon(long long) +@ stdcall ExtractAssociatedIconA(long ptr long) +@ stdcall ExtractAssociatedIconExA(long str long long) +@ stdcall ExtractAssociatedIconExW(long wstr long long) +@ stub ExtractAssociatedIconW +@ stdcall ExtractIconA(long str long) +@ stdcall ExtractIconEx(ptr long ptr ptr long)ExtractIconExAW +@ stdcall ExtractIconExA(str long ptr ptr long) +@ stdcall ExtractIconExW(wstr long ptr ptr long) +@ stdcall ExtractIconW(long wstr long) +@ stub ExtractIconResInfoA +@ stub ExtractIconResInfoW +@ stub ExtractVersionResource16W +@ stub FindExeDlgProc +@ stdcall FindExecutableA(ptr ptr ptr) +@ stdcall FindExecutableW(wstr wstr wstr) +@ stdcall FreeIconList(long) +@ stub InternalExtractIconListA +@ stub InternalExtractIconListW +@ stub OpenAs_RunDLL +@ stub OpenAs_RunDLLA +@ stub OpenAs_RunDLLW +@ stub PrintersGetCommand_RunDLL +@ stub PrintersGetCommand_RunDLLA +@ stub PrintersGetCommand_RunDLLW +@ stub RealShellExecuteA +@ stub RealShellExecuteExA +@ stub RealShellExecuteExW +@ stub RealShellExecuteW +@ stub RegenerateUserEnvironment +@ stdcall SHAddToRecentDocs (long ptr) +@ stdcall SHAppBarMessage(long ptr) +@ stdcall SHBrowseForFolder(ptr) SHBrowseForFolderA +@ stdcall SHBrowseForFolderA(ptr) +@ stdcall SHBrowseForFolderW(ptr) +@ stdcall SHChangeNotify (long long ptr ptr) +@ stdcall SHCreateDirectoryExA(long str ptr) +@ stdcall SHCreateDirectoryExW(long wstr ptr) +@ stub ShellHookProc +@ stub SHEmptyRecycleBinA +@ stub SHEmptyRecycleBinW +@ stdcall SHFileOperation(ptr)SHFileOperationAW +@ stdcall SHFileOperationA(ptr) +@ stdcall SHFileOperationW(ptr) +@ stub SHFormatDrive +@ stdcall SHFreeNameMappings(ptr) +@ stdcall SHGetDesktopFolder(ptr) +@ stdcall SHGetFileInfo(ptr long ptr long long)SHGetFileInfoAW +@ stdcall SHGetFileInfoA(ptr long ptr long long) +@ stdcall SHGetFileInfoW(ptr long ptr long long) +@ stdcall SHGetInstanceExplorer(long) +@ stdcall SHGetMalloc(ptr) +@ stub SHGetNewLinkInfo +@ stdcall SHGetPathFromIDList(ptr ptr)SHGetPathFromIDListAW +@ stdcall SHGetPathFromIDListA(ptr ptr) +@ stdcall SHGetPathFromIDListW(ptr ptr) +@ stdcall SHGetSettings(ptr long) +@ stdcall SHGetSpecialFolderLocation(long long ptr) +@ stdcall SHHelpShortcuts_RunDLL(long long long long) +@ stub SHHelpShortcuts_RunDLLA +@ stub SHHelpShortcuts_RunDLLW +@ stdcall SHLoadInProc(long) +@ stub SHQueryRecycleBinA +@ stub SHQueryRecycleBinW +@ stub SHUpdateRecycleBinIcon +@ stub WOWShellExecute + +# +# version 4.70 (IE3.0) +# _WIN32_IE >= 0x0300 +# + +# +# version 4.71 (IE4.0) +# _WIN32_IE >= 0x0400 +# +@ stdcall DllGetVersion(ptr)SHELL32_DllGetVersion +@ stub SHGetFreeDiskSpace +@ stdcall SHGetSpecialFolderPathA(long ptr long long) +@ stdcall SHGetSpecialFolderPathW(long ptr long long) +# +# version 4.72 (IE4.01) +# _WIN32_IE >= 0x0401 +# no new exports +# + +# +# version 5.00 (Win2K) +# _WIN32_IE >= 0x0500 +# +@ stdcall SHBindToParent(ptr ptr ptr ptr) +@ stdcall SHGetDiskFreeSpaceA(str ptr ptr ptr) kernel32.GetDiskFreeSpaceExA +@ stdcall SHGetDiskFreeSpaceExA(str ptr ptr ptr) kernel32.GetDiskFreeSpaceExA +@ stdcall SHGetDiskFreeSpaceExW(wstr ptr ptr ptr) kernel32.GetDiskFreeSpaceExW +@ stdcall SHGetFolderPathA(long long long long ptr) +@ stdcall SHGetFolderPathW(long long long long ptr) +@ stdcall SHGetFolderLocation(long long long long ptr) + +# version 6.0 (WinXP) +# _WIN32_IE >= 0x600 +@ stdcall SHDefExtractIconA(str long long ptr ptr long) +@ stdcall SHDefExtractIconW(wstr long long ptr ptr long) diff --git a/reactos/lib/shell32/shell32_Ca.rc b/reactos/lib/shell32/shell32_Ca.rc new file mode 100644 index 00000000000..fd2052766ba --- /dev/null +++ b/reactos/lib/shell32/shell32_Ca.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_CATALAN, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Quant a %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "D'Acord", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS ha estat construit per:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_Cn.rc b/reactos/lib/shell32/shell32_Cn.rc new file mode 100644 index 00000000000..edc6be42ade --- /dev/null +++ b/reactos/lib/shell32/shell32_Cn.rc @@ -0,0 +1,63 @@ +/* + * Copyright 2002 Tisheng Chen + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +#pragma code_page(936) + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "šŘÓÚ %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "ȡś¨", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS was brought to you by:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "ĘäČëłĚĐňŁŹÄżÂźŁŹÎÄźţťňŐßInternet×ĘÔ´ĂűŁŹReactOS˝ŤÎŞÄú´ňżŞËüĄŁ", 12289, 36, 11, 182, 18 + LTEXT "´ňżŞ(&O):", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "ȡś¨", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "ČĄĎű", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "äŻŔŔ(&B)...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* columns in the shellview */ +STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +BEGIN + IDS_SHV_COLUMN1 "ÎÄźţ" + IDS_SHV_COLUMN2 "´óĐĄ" + IDS_SHV_COLUMN3 "ŔŕĐÍ" + IDS_SHV_COLUMN4 "Đ޸Ä" + IDS_SHV_COLUMN5 "ĘôĐÔ" + IDS_SHV_COLUMN6 "ĘšÓĂżŐźä" + IDS_SHV_COLUMN7 "ĘŁÓŕżŐźä" + IDS_SHV_COLUMN8 "Name" /*FIXME*/ + IDS_SHV_COLUMN9 "Comments" /*FIXME*/ +END + +#pragma code_page(default) diff --git a/reactos/lib/shell32/shell32_Cs.rc b/reactos/lib/shell32/shell32_Cs.rc new file mode 100644 index 00000000000..94313e85f0b --- /dev/null +++ b/reactos/lib/shell32/shell32_Cs.rc @@ -0,0 +1,181 @@ +/* + * Copyright 1998 Juergen Schmied + * Copyright 2003 Filip Navara + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_CZECH, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "&Vedle sebe", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ikony", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Seznam", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Podrobnosti", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "Z&obrazit" + BEGIN + MENUITEM "&Vedle sebe", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ikony", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Seznam", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Podrobnosti", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Seřadit &ikony" + BEGIN + MENUITEM "Podle &Názvu", 0x30 /* column 0 */ + MENUITEM "Podle &Typu", 0x32 /* column 2 */ + MENUITEM "Podle &Velikosti", 0x31 /* ... */ + MENUITEM "Podle &Data", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Rovnat automaticky", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Zarovnat ikony", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "A&ktualizovat", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "V&ložit", FCIDM_SHVIEW_INSERT + MENUITEM "Vložit zást&upce", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "&Nový" + BEGIN + MENUITEM "Nová &složka", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Nový &zástupce", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "&Vlastnosti", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "P&rozkoumat", FCIDM_SHVIEW_EXPLORE + MENUITEM "O&tevřít", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "Vyj&mout", FCIDM_SHVIEW_CUT + MENUITEM "&Kopírovat", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "Vytvořit zástupc&e", FCIDM_SHVIEW_CREATELINK + MENUITEM "O&dstranit", FCIDM_SHVIEW_DELETE + MENUITEM "&Přejmenovat", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Vlastnosti", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Procházet..." +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Storno", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "O aplikaci %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS je dĄlem:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Zadejte název programu, složky, dokumentu, nebo zdroje v síti Internet a ReactOS jej pro vás otevře.", 12289, 36, 11, 182, 18 + LTEXT "&Otevřít:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Storno", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Procházet...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Plocha" + IDS_MYCOMPUTER "Tento počítač" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "&Vedle sebe" + IDS_VIEW_SMALL "&Ikony" + IDS_VIEW_LIST "&Seznam" + IDS_VIEW_DETAILS "&Podrobnosti" + IDS_SELECT "Vybrat" + IDS_OPEN "Otevřít" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "Nelze vytvořit novou složku protože přistup byl odepřen." + IDS_CREATEFOLDER_CAPTION "Chyba při pokusu vytvořit nový adresář" + IDS_DELETEITEM_CAPTION "Potvrdit odstranění souboru" + IDS_DELETEFOLDER_CAPTION "Potvrdit odstranění adresáře" + IDS_OVERWRITEFILE_CAPTION "Potvrdit přepsání souboru" + IDS_DELETEITEM_TEXT "Opravdu chcete odstranit '%1'?" + IDS_DELETEMULTIPLE_TEXT "Opravdu chcete odstranit těchto %1 položek?" + IDS_OVERWRITEFILE_TEXT "Přejete si přepsat soubor '%1'?" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "Název" + IDS_SHV_COLUMN2 "Velikost" + IDS_SHV_COLUMN3 "Typ" + IDS_SHV_COLUMN4 "Změněno" + IDS_SHV_COLUMN5 "Atributy" + IDS_SHV_COLUMN6 "Velikost" + IDS_SHV_COLUMN7 "Volné místo" + IDS_SHV_COLUMN8 "Jméno" + IDS_SHV_COLUMN9 "Komentář" +END diff --git a/reactos/lib/shell32/shell32_Da.rc b/reactos/lib/shell32/shell32_Da.rc new file mode 100644 index 00000000000..aab26ff23c6 --- /dev/null +++ b/reactos/lib/shell32/shell32_Da.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_DANISH, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Om %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS havde ikke vćret mulig uden hjćlp fra disse personer:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_De.rc b/reactos/lib/shell32/shell32_De.rc new file mode 100644 index 00000000000..f544ddcff6e --- /dev/null +++ b/reactos/lib/shell32/shell32_De.rc @@ -0,0 +1,190 @@ +/* + * Copyright 1998 Juergen Schmied + * Copyright 2004 Henning Gerhardt + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "&Große Symbole", FCIDM_SHVIEW_BIGICON + MENUITEM "&Kleine Symbole", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Liste", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Details", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&Ansicht" + BEGIN + MENUITEM "&Große Symbole", FCIDM_SHVIEW_BIGICON + MENUITEM "&Kleine Symbole", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Liste", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Details", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Symbole anordnen" + BEGIN + MENUITEM "Nach &Name", 0x30 /* column 0 */ + MENUITEM "Nach &Typ", 0x32 /* column 2 */ + MENUITEM "Nach &Größe", 0x31 /* ... */ + MENUITEM "Nach &Datum", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Automatisch anordnen", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Line up Icons", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "Aktualisieren", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Einfügen", FCIDM_SHVIEW_INSERT + MENUITEM "Einfügen als Verweis", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Neu" + BEGIN + MENUITEM "Neues Ver&zeichnis", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Neuer Ver&weis", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "&Eigenschaften", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "E&rkunden", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Öffnen", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "&Ausschneiden", FCIDM_SHVIEW_CUT + MENUITEM "&Kopieren", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "Erstelle Ver&weis", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Löschen", FCIDM_SHVIEW_DELETE + MENUITEM "&Umbenennen", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Eigenschaften", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Nach Verzeichnis durchsuchen" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Abbrechen", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Informationen über %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS wurde Ihnen zur Verfügung gestellt von:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Den Namen eines Programmes, eines Ordners, eines Dokumentes oder einer Internet Ressource eingeben, und ReactOS wird es für Sie öffnen", 12289, 36, 11, 182, 18 + LTEXT "&Öffnen:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Abbrechen", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Durchsuchen...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Desktop" + IDS_MYCOMPUTER "Arbeitsplatz" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "&Große Symbole" + IDS_VIEW_SMALL "&Kleine Symbole" + IDS_VIEW_LIST "&Liste" + IDS_VIEW_DETAILS "&Details" + IDS_SELECT "Auswählen" + IDS_OPEN "Öffnen" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "Es konnte kein neues Verzeichnis erstellt werden: Zugriff verweigert." + IDS_CREATEFOLDER_CAPTION "Es trat ein Fehler beim Erstellen eines neuen Verzeichnisses auf" + IDS_DELETEITEM_CAPTION "Bestätigung: Datei löschen" + IDS_DELETEFOLDER_CAPTION "Bestätigung: Verzeichnis löschen" + IDS_DELETEITEM_TEXT "Sind Sie sich sicher, dass Sie die Datei '%1' löschen möchten ?" + IDS_DELETEMULTIPLE_TEXT "Sind Sie sich sicher, dass Sie diese %1 Dateien löschen möchten ?" + IDS_OVERWRITEFILE_TEXT "Möchten Sie, dass die Datei '%1' überschrieben wird ?" + IDS_OVERWRITEFILE_CAPTION "Bestätigung: Datei überschreiben" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "Datei" + IDS_SHV_COLUMN2 "Größe" + IDS_SHV_COLUMN3 "Typ" + IDS_SHV_COLUMN4 "Geändert" + IDS_SHV_COLUMN5 "Attribute" + IDS_SHV_COLUMN6 "Gesamtgröße" + IDS_SHV_COLUMN7 "Freier Speicher" + IDS_SHV_COLUMN8 "Name" + IDS_SHV_COLUMN9 "Kommentar" +END + +/* message box strings */ +STRINGTABLE DISCARDABLE +{ + IDS_RESTART_TITLE "Neustarten" + IDS_RESTART_PROMPT "Möchten Sie, dass ein simulierter Windows Neustart durchgeführt wird ?" + IDS_SHUTDOWN_TITLE "Anhalten" + IDS_SHUTDOWN_PROMPT "Möchten Sie die aktuelle ReactOS Sitzung beenden ?" +} diff --git a/reactos/lib/shell32/shell32_En.rc b/reactos/lib/shell32/shell32_En.rc new file mode 100644 index 00000000000..a4a5cd06e4e --- /dev/null +++ b/reactos/lib/shell32/shell32_En.rc @@ -0,0 +1,221 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "Lar&ge Icons", FCIDM_SHVIEW_BIGICON + MENUITEM "S&mall Icons", FCIDM_SHVIEW_SMALLICON + MENUITEM "&List", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Details", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&View" + BEGIN + MENUITEM "Lar&ge Icons", FCIDM_SHVIEW_BIGICON + MENUITEM "S&mall Icons", FCIDM_SHVIEW_SMALLICON + MENUITEM "&List", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Details", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Arrange &Icons" + BEGIN + MENUITEM "By &Name", 0x30 /* column 0 */ + MENUITEM "By &Type", 0x32 /* column 2 */ + MENUITEM "By &Size", 0x31 /* ... */ + MENUITEM "By &Date", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Auto Arrange", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Line up Icons", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "Refresh", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Paste", FCIDM_SHVIEW_INSERT + MENUITEM "Paste as Link", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "New" + BEGIN + MENUITEM "New &Folder", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "New &Link", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Properties", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "E&xplore", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Open", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "C&ut", FCIDM_SHVIEW_CUT + MENUITEM "&Copy", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "Create &Link", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Delete", FCIDM_SHVIEW_DELETE + MENUITEM "&Rename", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Properties", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Browse for Folder" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancel", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "About %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS was brought to you by:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Desktop" + IDS_MYCOMPUTER "My Computer" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "Lar&ge Icons" + IDS_VIEW_SMALL "S&mall Icons" + IDS_VIEW_LIST "&List" + IDS_VIEW_DETAILS "&Details" + IDS_SELECT "Select" + IDS_OPEN "Open" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "Can not create new Folder: Permission denied." + IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder" + IDS_DELETEITEM_CAPTION "Confirm file delete" + IDS_DELETEFOLDER_CAPTION "Confirm folder delete" + IDS_DELETEITEM_TEXT "Are you sure you want to delete '%1'?" + IDS_DELETEMULTIPLE_TEXT "Are you sure you want to delete these %1 items?" + IDS_OVERWRITEFILE_TEXT "OverWrite File %1?" + IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "File" + IDS_SHV_COLUMN2 "Size" + IDS_SHV_COLUMN3 "Type" + IDS_SHV_COLUMN4 "Modified" + IDS_SHV_COLUMN5 "Attributes" + IDS_SHV_COLUMN6 "Size" + IDS_SHV_COLUMN7 "Size available" + IDS_SHV_COLUMN8 "Name" + IDS_SHV_COLUMN9 "Comments" +END + +/* message box strings */ +STRINGTABLE DISCARDABLE +{ + IDS_RESTART_TITLE "Restart" + IDS_RESTART_PROMPT "Do you want to restart the system?" + IDS_SHUTDOWN_TITLE "Shutdown" + IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" +} + +/* shell folder path default values */ +STRINGTABLE DISCARDABLE +{ + IDS_PROGRAMS "Start Menu\\Programs" + IDS_PERSONAL "My Documents" + IDS_FAVORITES "Favorites" + IDS_STARTUP "Start Menu\\Programs\\StartUp" + IDS_RECENT "Recent" + IDS_SENDTO "SendTo" + IDS_STARTMENU "Start Menu" + IDS_MYMUSIC "My Documents\\My Music" + IDS_MYVIDEO "My Documents\\My Video" + IDS_DESKTOPDIRECTORY "Desktop" + IDS_NETHOOD "NetHood" + IDS_TEMPLATES "Templates" + IDS_APPDATA "Application Data" + IDS_PRINTHOOD "PrintHood" + IDS_LOCAL_APPDATA "Local Settings\\Application Data" + IDS_INTERNET_CACHE "Temporary Internet Files" + IDS_COOKIES "Cookies" + IDS_HISTORY "History" + IDS_PROGRAM_FILES "Program Files" + IDS_MYPICTURES "My Documents\\My Pictures" + IDS_PROGRAM_FILES_COMMON "Program Files\\Common Files" + IDS_COMMON_DOCUMENTS "Documents" + IDS_ADMINTOOLS "Start Menu\\Programs\\Administrative Tools" + IDS_COMMON_MUSIC "Documents\\My Music" + IDS_COMMON_PICTURES "Documents\\My Pictures" + IDS_COMMON_VIDEO "Documents\\My Video" + IDS_CDBURN_AREA "Local Settings\\Application Data\\Microsoft\\CD Burning" +} diff --git a/reactos/lib/shell32/shell32_Eo.rc b/reactos/lib/shell32/shell32_Eo.rc new file mode 100644 index 00000000000..ce4517770fa --- /dev/null +++ b/reactos/lib/shell32/shell32_Eo.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_ESPERANTO, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Pri %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "Enorde", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS was brought to you by:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_Es.rc b/reactos/lib/shell32/shell32_Es.rc new file mode 100644 index 00000000000..6a89f694378 --- /dev/null +++ b/reactos/lib/shell32/shell32_Es.rc @@ -0,0 +1,190 @@ +/* + * Copyright 1998 Juergen Schmied + * Copyright 2003,2004 José Manuel Ferrer Ortiz + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "Iconos &grandes", FCIDM_SHVIEW_BIGICON + MENUITEM "Iconos &pequeńos", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Detalles", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&Ver" + BEGIN + MENUITEM "Iconos &grandes", FCIDM_SHVIEW_BIGICON + MENUITEM "Iconos &pequeńos", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Detalles", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Ordenar &iconos" + BEGIN + MENUITEM "Por &nombre", 0x30 /* column 0 */ + MENUITEM "Por &tipo", 0x32 /* column 2 */ + MENUITEM "Por t&amańo", 0x31 /* ... */ + MENUITEM "Por &fecha", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Ordenar automáticamente", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Alinear iconos", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "Actualizar", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Pegar", FCIDM_SHVIEW_INSERT + MENUITEM "Pegar acceso directo", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Nuevo" + BEGIN + MENUITEM "Nueva &carpeta", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Nuevo &acceso directo", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Propiedades", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "E&xplorar", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Abrir", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "C&ortar", FCIDM_SHVIEW_CUT + MENUITEM "&Copiar", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "C&rear acceso directo", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Eliminar", FCIDM_SHVIEW_DELETE + MENUITEM "Re&nombrar", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Propiedades", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Explorar carpeta" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "Aceptar", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancelar", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Acerca de %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "Aceptar", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS está disponible gracias a:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Introduzca el nombre de un programa, carpeta, documento o recurso de Internet, y ReactOS lo abrirá para usted.", 12289, 36, 11, 182, 18 + LTEXT "&Abrir:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "Aceptar", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancelar", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Examinar...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Escritorio" + IDS_MYCOMPUTER "Mi PC" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "Iconos &grandes" + IDS_VIEW_SMALL "Iconos &pequeńos" + IDS_VIEW_LIST "&Lista" + IDS_VIEW_DETAILS "&Detalles" + IDS_SELECT "Seleccionar" + IDS_OPEN "Abrir" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "No se puede crear nueva carpeta: Permiso denegado." + IDS_CREATEFOLDER_CAPTION "Error durante la creación de una nueva carpeta" + IDS_DELETEITEM_CAPTION "Confirmar eliminación de archivo" + IDS_DELETEFOLDER_CAPTION "Confirmar eliminación de carpeta" + IDS_DELETEITEM_TEXT "żSeguro que desea eliminar '%1'?" + IDS_DELETEMULTIPLE_TEXT "żSeguro que desea eliminar estos %1 elementos?" + IDS_OVERWRITEFILE_TEXT "żSobreescribir el archivo '%1'?" + IDS_OVERWRITEFILE_CAPTION "Confirmar sobreescritura de archivo" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "Archivo" + IDS_SHV_COLUMN2 "Tamańo" + IDS_SHV_COLUMN3 "Tipo" + IDS_SHV_COLUMN4 "Modificado" + IDS_SHV_COLUMN5 "Atributos" + IDS_SHV_COLUMN6 "Tamańo" + IDS_SHV_COLUMN7 "Tamańo disponible" + IDS_SHV_COLUMN8 "Nombre" + IDS_SHV_COLUMN9 "Comentarios" +END + +/* message box strings */ +STRINGTABLE DISCARDABLE +{ + IDS_RESTART_TITLE "Reiniciar" + IDS_RESTART_PROMPT "żDesea simular un reinicio de Windows?" + IDS_SHUTDOWN_TITLE "Apagar" + IDS_SHUTDOWN_PROMPT "żDesea terminar su sesión ReactOS?" +} diff --git a/reactos/lib/shell32/shell32_Fi.rc b/reactos/lib/shell32/shell32_Fi.rc new file mode 100644 index 00000000000..709aed26e5f --- /dev/null +++ b/reactos/lib/shell32/shell32_Fi.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Tietoja: %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS:n tekijät:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_Fr.rc b/reactos/lib/shell32/shell32_Fr.rc new file mode 100644 index 00000000000..b8cdd92a794 --- /dev/null +++ b/reactos/lib/shell32/shell32_Fr.rc @@ -0,0 +1,224 @@ +/* + * Shell32 + * French language support + * + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "&Grands icônes", FCIDM_SHVIEW_BIGICON + MENUITEM "&Petits icônes", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Liste", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Détails", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&Affichage" + BEGIN + MENUITEM "&Grands icônes", FCIDM_SHVIEW_BIGICON + MENUITEM "&Petits icônes", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Liste", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Détails", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Trier les &icônes" + BEGIN + MENUITEM "Par &nom", 0x30 /* column 0 */ + MENUITEM "Par &type", 0x32 /* column 2 */ + MENUITEM "Par t&aille", 0x31 /* ... */ + MENUITEM "Par &date", 0x33 + MENUITEM SEPARATOR + MENUITEM "T&ri automatique", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Aligner les icônes", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "Rafraîchir", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Coller", FCIDM_SHVIEW_INSERT + MENUITEM "Coller comme un lien", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Nouveau" + BEGIN + MENUITEM "Nouveau d&ossier", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Nouveau &lien", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Propriétés", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "E&xplorer", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Ouvrir", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "C&ouper", FCIDM_SHVIEW_CUT + MENUITEM "&Copier", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "Créer un &lien", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Supprimer", FCIDM_SHVIEW_DELETE + MENUITEM "&Renommer", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Propriétés", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Parcourir" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Annuler", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Ŕ propos de %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS est une réalisation de :", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Entrez le nom d'un programme, d'un dossier, d'un document ou d'une ressource Internet, et ReactOS l'ouvrira pour vous.", 12289, 36, 11, 182, 18 + LTEXT "&Ouvrir :", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Annuler", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Parcourir...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Bureau" + IDS_MYCOMPUTER "Poste de travail" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "&Grands icônes" + IDS_VIEW_SMALL "&Petits icônes" + IDS_VIEW_LIST "&Liste" + IDS_VIEW_DETAILS "&Détails" + IDS_SELECT "Sélectionner" + IDS_OPEN "Ouvrir" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "Impossible de créer le nouveau dossier : permission refusée." + IDS_CREATEFOLDER_CAPTION "Erreur lors de la création du nouveau dossier" + IDS_DELETEITEM_CAPTION "Confirmer la suppression du fichier" + IDS_DELETEFOLDER_CAPTION "Confirmer la suppression du dossier" + IDS_DELETEITEM_TEXT "Ętes-vous sűr de vouloir supprimer '%1'?" + IDS_DELETEMULTIPLE_TEXT "Ętes-vous sűt de vouloir supprimer ces %1 items ?" + IDS_OVERWRITEFILE_TEXT "Écraser le fichier %1?" + IDS_OVERWRITEFILE_CAPTION "Confirmer l'écrasement du fichier" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "Fichier" + IDS_SHV_COLUMN2 "Taille" + IDS_SHV_COLUMN3 "Type" + IDS_SHV_COLUMN4 "Modifié" + IDS_SHV_COLUMN5 "Attributs" + IDS_SHV_COLUMN6 "Capacité" + IDS_SHV_COLUMN7 "Espace disponible" + IDS_SHV_COLUMN8 "Nom" + IDS_SHV_COLUMN9 "Commentaires" +END + +/* message box strings */ +STRINGTABLE DISCARDABLE +{ + IDS_RESTART_TITLE "Redémarrer" + IDS_RESTART_PROMPT "Voulez-vous simuler le redémarrage de Windows?" + IDS_SHUTDOWN_TITLE "Arręter" + IDS_SHUTDOWN_PROMPT "Voulez-vous fermer la session ReactOS?" +} + +/* shell folder path default values */ +STRINGTABLE DISCARDABLE +{ + IDS_PROGRAMS "Menu Démarrer\\Programmes" + IDS_PERSONAL "Mes documents" + IDS_FAVORITES "Favoris" + IDS_STARTUP "Menu Démarrer\\Programmes\\Démarrage" + IDS_RECENT "Recent" + IDS_SENDTO "SendTo" + IDS_STARTMENU "Menu Démarrer" + IDS_MYMUSIC "Mes documents\\Ma musique" + IDS_MYVIDEO "Mes documents\\Mes vidéos" + IDS_DESKTOPDIRECTORY "Bureau" + IDS_NETHOOD "Voisinage Réseau" + IDS_TEMPLATES "Modčles" + IDS_APPDATA "Application Data" + IDS_PRINTHOOD "Voisinage d'impression" + IDS_LOCAL_APPDATA "Local Settings\\Application Data" + IDS_INTERNET_CACHE "Temporary Internet Files" + IDS_COOKIES "Cookies" + IDS_HISTORY "Historique" + IDS_PROGRAM_FILES "Program Files" + IDS_MYPICTURES "Mes documents\\Mes images" + IDS_PROGRAM_FILES_COMMON "Program Files\\Fichiers communs" + IDS_COMMON_DOCUMENTS "Documents" + IDS_ADMINTOOLS "Menu Démarrer\\Programmes\\Outils d'administration" + IDS_COMMON_MUSIC "Documents\\Ma musique" + IDS_COMMON_PICTURES "Documents\\Mes images" + IDS_COMMON_VIDEO "Documents\\Mes vidéos" + IDS_CDBURN_AREA "Local Settings\\Application Data\\Microsoft\\CD Burning" +} diff --git a/reactos/lib/shell32/shell32_Hu.rc b/reactos/lib/shell32/shell32_Hu.rc new file mode 100644 index 00000000000..0de8dcfbc18 --- /dev/null +++ b/reactos/lib/shell32/shell32_Hu.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "A %s-ről" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "A ReactOS-t írták:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_It.rc b/reactos/lib/shell32/shell32_It.rc new file mode 100644 index 00000000000..36ae5fb74c1 --- /dev/null +++ b/reactos/lib/shell32/shell32_It.rc @@ -0,0 +1,191 @@ +/* + * Copyright 1998 Juergen Schmied + * Copyright 2003-2004 Puoti + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "&Icone Grandi", FCIDM_SHVIEW_BIGICON + MENUITEM "&Icone Piccole", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Dettagli", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&Visualizza" + BEGIN + MENUITEM "&Icone Grandi", FCIDM_SHVIEW_BIGICON + MENUITEM "&Icone Piccole", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Dettagli", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Disponi &Icone" + BEGIN + MENUITEM "Per &Nome", 0x30 /* column 0 */ + MENUITEM "Per &Tipo", 0x32 /* column 2 */ + MENUITEM "Per &Dimensione", 0x31 /* ... */ + MENUITEM "Per &Data", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Disponi Automaticamente", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Allinea Icone", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "Aggiorna", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Incolla", FCIDM_SHVIEW_INSERT + MENUITEM "Crea Collegamento", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Nuovo" + BEGIN + MENUITEM "Nuova &Cartella", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Nuovo &Collegamento", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Proprietŕ", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "E&splora", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Apri", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "&Taglia", FCIDM_SHVIEW_CUT + MENUITEM "&Copia", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "&Crea Collegamento", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Cancella", FCIDM_SHVIEW_DELETE + MENUITEM "&Rinomina", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Proprietŕ", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Sfoglia Cartella" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Annulla", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Informazioni su %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS č disponibile grazie a:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Digitare il nome del programma, della cartella, del documento o della risorsa internet, e ReactOS la aprirŕ.", 12289, 36, 11, 182, 18 + LTEXT "&Apri:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Annulla", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Esplora...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Desktop" + IDS_MYCOMPUTER "Risorse del Computer" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "&Icone Grandi" + IDS_VIEW_SMALL "I&cone Piccole" + IDS_VIEW_LIST "&Lista" + IDS_VIEW_DETAILS "&Dettagli" + IDS_SELECT "Selezione" + IDS_OPEN "Apri" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "Impossibile creare la cartella: Accesso negato." + IDS_CREATEFOLDER_CAPTION "Errore durante la creazione della cartella" + IDS_DELETEITEM_CAPTION "Confermare la cancallazione del file" + IDS_DELETEFOLDER_CAPTION "Confermare la cancellazione della cartella" + IDS_DELETEITEM_TEXT "Sei sicuro di voler cancellare '%1'?" + IDS_DELETEMULTIPLE_TEXT "Sei sicuro di voler cancellare questi %1 elementi?" + IDS_OVERWRITEFILE_TEXT "Sovrascrivere il File %1?" + IDS_OVERWRITEFILE_CAPTION "Confermare la sovrascrizione del File" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "File" + IDS_SHV_COLUMN2 "Dimensione" + IDS_SHV_COLUMN3 "Tipo" + IDS_SHV_COLUMN4 "Modificato" + IDS_SHV_COLUMN5 "Attributi" + IDS_SHV_COLUMN6 "Dimensione" + IDS_SHV_COLUMN7 "Dimensione disponibile" + IDS_SHV_COLUMN8 "Nome" + IDS_SHV_COLUMN9 "Commenti" +END + + +/* message box strings */ +STRINGTABLE DISCARDABLE +{ + IDS_RESTART_TITLE "Riavvia" + IDS_RESTART_PROMPT "Vuoi simulare un riavvio do Windows?" + IDS_SHUTDOWN_TITLE "Termina sessione" + IDS_SHUTDOWN_PROMPT "Vuoi terminare la sessione di ReactOS?" +} diff --git a/reactos/lib/shell32/shell32_Ja.rc b/reactos/lib/shell32/shell32_Ja.rc new file mode 100644 index 00000000000..90306a7e09b --- /dev/null +++ b/reactos/lib/shell32/shell32_Ja.rc @@ -0,0 +1,140 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "‘傍‚Čą˛şÝ(&G)", FCIDM_SHVIEW_BIGICON + MENUITEM "Ź‚ł‚Čą˛şÝ(&M)", FCIDM_SHVIEW_SMALLICON + MENUITEM "ˆę——(&L)", FCIDM_SHVIEW_LISTVIEW + MENUITEM "Ú×(&D)", FCIDM_SHVIEW_REPORTVIEW +END + +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "•\\ŽŚ(&V)" + BEGIN + MENUITEM "‘傍‚˘ƒAƒCƒRƒ“(&G)", FCIDM_SHVIEW_BIGICON + MENUITEM "Ź‚ł‚˘ƒAƒCƒRƒ“(&M)", FCIDM_SHVIEW_SMALLICON + MENUITEM "ˆę——(&L)", FCIDM_SHVIEW_LISTVIEW + MENUITEM "Ú×(&D)", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "ƒAƒCƒRƒ“‚ĚŽ—ń(&I)" + BEGIN + MENUITEM "–ź‘O‡(&N)", 0x30 /* column 0 */ + MENUITEM "Ží—ޏ‡(&T)", 0x32 /* column 2 */ + MENUITEM "ƒTƒCƒY‡(&S)", 0x31 /* ... */ + MENUITEM "“ú•t‡(&D)", 0x33 + MENUITEM SEPARATOR + MENUITEM "ƒAƒCƒRƒ“‚ĚŽŠ“ŽŽ—ń(&A)", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "“™ŠÔŠu‚ɐޗń", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "“\\‚č•t‚Ż", FCIDM_SHVIEW_INSERT + MENUITEM "ƒVƒ‡[ƒgƒJƒbƒg‚Ě“\\‚č•t‚Ż", FCIDM_SHVIEW_INSERTLINK + POPUP "V‹KěŹ" + BEGIN + MENUITEM "V‹KƒtƒHƒ‹ƒ_(&F)", 0x7053 + MENUITEM "V‹KƒVƒ‡[ƒgƒJƒbƒg(&L)", 0x7052 + MENUITEM SEPARATOR + END + MENUITEM "ƒvƒƒpƒeƒB", FCIDM_SHVIEW_PROPERTIES + END +END + +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Ř‚čŽć‚č(&U)", FCIDM_SHVIEW_CUT + MENUITEM "ƒRƒs[(&C)", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "ƒVƒ‡[ƒgƒJƒbƒg‚̍쐬(&L)", 0x7051 + MENUITEM "íœ(&D)", FCIDM_SHVIEW_DELETE + MENUITEM "–ź‘O‚Ě•ĎX(&R)", 0x7050 + MENUITEM SEPARATOR + MENUITEM "ƒvƒƒpƒeƒB(&P)", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "ĂŢ˝¸ÄŻĚß" + IDS_MYCOMPUTER "ϲşÝËß­°Ŕ" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "‘傍‚˘ƒAƒCƒRƒ“(&G)" + IDS_VIEW_SMALL "Ź‚ł‚˘ƒAƒCƒRƒ“(&M)" + IDS_VIEW_LIST "ˆę——(&L)" + IDS_VIEW_DETAILS "Ú×(&D)" + IDS_SELECT "‘I‘đ" + IDS_OPEN "ŠJ‚­" +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "%s ‚ɂ‚˘‚Ä" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS was brought to you by:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* columns in the shellview */ +STRINGTABLE DISCARDABLE +BEGIN + IDS_SHV_COLUMN1 "–ź‘O" + IDS_SHV_COLUMN2 "ƒTƒCƒY" + IDS_SHV_COLUMN3 "ƒtƒ@ƒCƒ‹‚ĚŽí—Ţ" + IDS_SHV_COLUMN4 "XV“úŽž" + IDS_SHV_COLUMN5 "‘ސŤ" + IDS_SHV_COLUMN6 "‡ŒvƒTƒCƒY" + IDS_SHV_COLUMN7 "‹ó‚Ť—e—Ę" + IDS_SHV_COLUMN8 "Name" /*FIXME*/ + IDS_SHV_COLUMN9 "Comments" /*FIXME*/ +END diff --git a/reactos/lib/shell32/shell32_Ko.rc b/reactos/lib/shell32/shell32_Ko.rc new file mode 100644 index 00000000000..11975eb7641 --- /dev/null +++ b/reactos/lib/shell32/shell32_Ko.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "%sżĄ °üÇĎżŠ" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "ČŽŔÎ", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS was brought to you by:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_Nl.rc b/reactos/lib/shell32/shell32_Nl.rc new file mode 100644 index 00000000000..2e4975b791c --- /dev/null +++ b/reactos/lib/shell32/shell32_Nl.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_DUTCH, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Info %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS is geschreven door:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_No.rc b/reactos/lib/shell32/shell32_No.rc new file mode 100644 index 00000000000..5a3822f759e --- /dev/null +++ b/reactos/lib/shell32/shell32_No.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_NORWEGIAN, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Om %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS was brought to you by:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_Pl.rc b/reactos/lib/shell32/shell32_Pl.rc new file mode 100644 index 00000000000..75ba80550c5 --- /dev/null +++ b/reactos/lib/shell32/shell32_Pl.rc @@ -0,0 +1,190 @@ +/* + * Copyright 1998 Juergen Schmied + * Copyright 2004 Piotr Caban + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_POLISH, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "&Duże Ikony", FCIDM_SHVIEW_BIGICON + MENUITEM "&Małe Ikony", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Szczegóły", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&Widok" + BEGIN + MENUITEM "&Duże Ikony", FCIDM_SHVIEW_BIGICON + MENUITEM "&Małe Ikony", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Szczegóły", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Rozmieœć &ikony według" + BEGIN + MENUITEM "&Nazwy", 0x30 /* column 0 */ + MENUITEM "&Typu", 0x32 /* column 2 */ + MENUITEM "&Wielkoœci", 0x31 /* ... */ + MENUITEM "&Daty", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Autorozmieszczanie", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "&Wyrównaj ikony", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "&Odœwierz", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "W&klej", FCIDM_SHVIEW_INSERT + MENUITEM "Wklej s&krót", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "&Nowy" + BEGIN + MENUITEM "&Folder", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "&Skrót", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Właœciwoœci", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Eksploruj", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Otwórz", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "&Wytnij", FCIDM_SHVIEW_CUT + MENUITEM "&Kopiuj", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "Utwórz &Skrót", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Usuń", FCIDM_SHVIEW_DELETE + MENUITEM "&Zmień nazwę", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "Wł&aœciwoœci", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Wybierz folder" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Anuluj", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "O %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "Możesz korzystać z ReactOS'a dzięki:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Wpisz nazwę programu, katalogu, dokumentu, a ReactOS otworzy go dla ciebie.", 12289, 36, 11, 182, 18 + LTEXT "&Otwórz:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Anuluj", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Przeglšdaj...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Pulpit" + IDS_MYCOMPUTER "Mój komputer" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "&Duże Ikony" + IDS_VIEW_SMALL "&Małe Ikony" + IDS_VIEW_LIST "&Lista" + IDS_VIEW_DETAILS "&Szczegóły" + IDS_SELECT "Zaznacz" + IDS_OPEN "Otwórz" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "Nie mogę utworzyć nowego katalogu: Brak dostępu." + IDS_CREATEFOLDER_CAPTION "Błšd przy tworzeniu nowego katalogu." + IDS_DELETEITEM_CAPTION "PotwierdŸ usunięcia pliku" + IDS_DELETEFOLDER_CAPTION "PotwierdŸ usunięcie katalogu" + IDS_DELETEITEM_TEXT "Czy jesteœ pewien, że chcesz usunšć '%1'?" + IDS_DELETEMULTIPLE_TEXT "Czy jesteœ pewien, że chcesz usunšć te %1 pliki?" + IDS_OVERWRITEFILE_TEXT "Zastšpić plik %1?" + IDS_OVERWRITEFILE_CAPTION "PotwierdŸ zastšpienie pliku" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "Plik" + IDS_SHV_COLUMN2 "Wielkoœć" + IDS_SHV_COLUMN3 "Typ" + IDS_SHV_COLUMN4 "Modyfikacja" + IDS_SHV_COLUMN5 "Atrybuty" + IDS_SHV_COLUMN6 "Wielkoœć" + IDS_SHV_COLUMN7 "Dostępna wielkoœć" + IDS_SHV_COLUMN8 "Nazwa" + IDS_SHV_COLUMN9 "Komentarz" +END + +/* message box strings */ +STRINGTABLE DISCARDABLE +{ + IDS_RESTART_TITLE "Uruchom ponownie" + IDS_RESTART_PROMPT "Czy chcesz zasymulować zrestartowanie Windowsa?" + IDS_SHUTDOWN_TITLE "Wyłšcz" + IDS_SHUTDOWN_PROMPT "Czy chcesz wyłšczyć sesję ReactOS'a?" +} diff --git a/reactos/lib/shell32/shell32_Pt.rc b/reactos/lib/shell32/shell32_Pt.rc new file mode 100644 index 00000000000..4ff1e595ec3 --- /dev/null +++ b/reactos/lib/shell32/shell32_Pt.rc @@ -0,0 +1,190 @@ +/* + * Copyright 1998 Juergen Schmied + * Copyright 2003 Marcelo Duarte + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_PORTUGUESE, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "Ícones &grandes", FCIDM_SHVIEW_BIGICON + MENUITEM "Ícones &pequenos", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Detalhes", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&Exibir" + BEGIN + MENUITEM "Ícones &grandes", FCIDM_SHVIEW_BIGICON + MENUITEM "Ícones &pequenos", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Detalhes", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "O&rganizar ícones" + BEGIN + MENUITEM "Por &nome", 0x30 /* column 0 */ + MENUITEM "Por &tipo", 0x32 /* column 2 */ + MENUITEM "Por ta&manho", 0x31 /* ... */ + MENUITEM "Por &data", 0x33 + MENUITEM SEPARATOR + MENUITEM "Auto organi&zar", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Alin&har ícones", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "&Atualizar", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Co&lar", FCIDM_SHVIEW_INSERT + MENUITEM "Colar a&talho", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Novo" + BEGIN + MENUITEM "&Pasta", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "&Atalho", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Propriedades", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Explorar", FCIDM_SHVIEW_EXPLORE + MENUITEM "A&brir", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "C&ortar", FCIDM_SHVIEW_CUT + MENUITEM "&Copiar", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "Criar a&talho", FCIDM_SHVIEW_CREATELINK + MENUITEM "E&xcluir", FCIDM_SHVIEW_DELETE + MENUITEM "&Renomear", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Propriedades", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Procurar pasta" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancelar", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Sobre %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS foi disponibilizado por:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Digite o nome do programa, pasta, documento, ou endereço Internet, que o ReactOS irá abrí-lo para vocę.", 12289, 36, 11, 182, 18 + LTEXT "&Abrir:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancelar", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Procurar...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Área de trabalho" + IDS_MYCOMPUTER "Meu computador" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "Ícones &grandes" + IDS_VIEW_SMALL "Ícones &pequenos" + IDS_VIEW_LIST "&Lista" + IDS_VIEW_DETAILS "&Detalhes" + IDS_SELECT "Selecionar" + IDS_OPEN "Abrir" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "Năo pode criar nova pasta: Permissăo negada." + IDS_CREATEFOLDER_CAPTION "Erro durante a criaçăo da nova pasta" + IDS_DELETEITEM_CAPTION "Confirmar exclusăo de arquivo" + IDS_DELETEFOLDER_CAPTION "Confirmar exclusăo de pasta" + IDS_DELETEITEM_TEXT "Vocę tem certeza que deseja excluir '%1'?" + IDS_DELETEMULTIPLE_TEXT "Vocę tem certeza que deseja excluir estes %1 itens?" + IDS_OVERWRITEFILE_TEXT "Sobreescrever arquivo %1?" + IDS_OVERWRITEFILE_CAPTION "Confirmar sobreescrever arquivo" +} + +/* colunas no shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "Arquivo" + IDS_SHV_COLUMN2 "Tamanho" + IDS_SHV_COLUMN3 "Tipo" + IDS_SHV_COLUMN4 "Modificado" + IDS_SHV_COLUMN5 "Atributos" + IDS_SHV_COLUMN6 "Tamanho" + IDS_SHV_COLUMN7 "Disponível" + IDS_SHV_COLUMN8 "Nome" + IDS_SHV_COLUMN9 "Comentários" +END + +/* message box strings */ +STRINGTABLE DISCARDABLE +{ + IDS_RESTART_TITLE "Reiniciar" + IDS_RESTART_PROMPT "Vocę quer simular a reinicializaçăo do Windows?" + IDS_SHUTDOWN_TITLE "Desligar" + IDS_SHUTDOWN_PROMPT "Vocę quer finalizar a sessăo no ReactOS?" +} diff --git a/reactos/lib/shell32/shell32_Ru.rc b/reactos/lib/shell32/shell32_Ru.rc new file mode 100644 index 00000000000..3199802b5f5 --- /dev/null +++ b/reactos/lib/shell32/shell32_Ru.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Î %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "Đŕçđŕáîň÷čęč ReactOS:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Ââĺäčňĺ čě˙ ďđîăđŕěěű, ďŕďęč, äîęóěĺíňŕ čëč đĺńóđń Číňĺđíĺňŕ, č ReactOS îňęđîĺň čő.", 12289, 36, 11, 182, 18 + LTEXT "&Îňęđűňü:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Îňěĺíŕ", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Îá&çîđ...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_Si.rc b/reactos/lib/shell32/shell32_Si.rc new file mode 100644 index 00000000000..97c5387ffb2 --- /dev/null +++ b/reactos/lib/shell32/shell32_Si.rc @@ -0,0 +1,60 @@ +/* + * Copyright 2002-2003 Rok Mandeljc + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "O %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "V redu", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS so ustvarili:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Vnesite ime programa, mape, dokumenta ali spletne strani, in ReactOS ga (jo) bo odprl.", 12289, 36, 11, 182, 18 + LTEXT "&Odpri:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "V redu", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Prekliči", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Pre&brskaj", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* columns in the shellview */ +STRINGTABLE LANGUAGE LANG_SLOVENIAN, SUBLANG_NEUTRAL +BEGIN + IDS_SHV_COLUMN1 "Datoteka" + IDS_SHV_COLUMN2 "Velikost" + IDS_SHV_COLUMN3 "Vrsta" + IDS_SHV_COLUMN4 "Spremenjena" + IDS_SHV_COLUMN5 "Atributi" + IDS_SHV_COLUMN6 "Točna velikost" + IDS_SHV_COLUMN7 "Prosto" + IDS_SHV_COLUMN8 "Name" /*FIXME*/ + IDS_SHV_COLUMN9 "Comments" /*FIXME*/ +END diff --git a/reactos/lib/shell32/shell32_Sk.rc b/reactos/lib/shell32/shell32_Sk.rc new file mode 100644 index 00000000000..e6924503acc --- /dev/null +++ b/reactos/lib/shell32/shell32_Sk.rc @@ -0,0 +1,60 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "O programe %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "Víno pre vás pripravili:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* columns in the shellview */ +STRINGTABLE LANGUAGE LANG_SLOVAK, SUBLANG_NEUTRAL +BEGIN + IDS_SHV_COLUMN1 "Súbor" + IDS_SHV_COLUMN2 "Vežkos" + IDS_SHV_COLUMN3 "Typ" + IDS_SHV_COLUMN4 "Modifikovaný" + IDS_SHV_COLUMN5 "Atribúty" + IDS_SHV_COLUMN6 "Vežkos" + IDS_SHV_COLUMN7 "Vežkos k dispozícii" + IDS_SHV_COLUMN8 "Name" /*FIXME*/ + IDS_SHV_COLUMN9 "Comments" /*FIXME*/ +END diff --git a/reactos/lib/shell32/shell32_Sv.rc b/reactos/lib/shell32/shell32_Sv.rc new file mode 100644 index 00000000000..c4853c28326 --- /dev/null +++ b/reactos/lib/shell32/shell32_Sv.rc @@ -0,0 +1,46 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Om %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS hade inte varit möjligt utan dessa personer:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Skriv namnet pĺ ett program, en mapp eller ett dokument och ReactOS kommer att öppna det för dig.", 12289, 36, 11, 182, 18 + LTEXT "&Öppna:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Avbryt", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Bläddra...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_Uk.rc b/reactos/lib/shell32/shell32_Uk.rc new file mode 100644 index 00000000000..b0cf021d21a --- /dev/null +++ b/reactos/lib/shell32/shell32_Uk.rc @@ -0,0 +1,178 @@ +/* + * Copyright 2004 Ilya Korniyko + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "&Âĺëčęł ˛ęîíęč", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ěŕëł ˛ęîíęč", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Ńďčńîę", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Ďîäđîáčöł", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&Âčăë˙ä" + BEGIN + MENUITEM "&Âĺëčęł ˛ęîíęč", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ěŕëł ˛ęîíęč", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Ńďčńîę", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Ďîäđîáčöł", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "Âďîđ˙äęóâŕňč &˛ęîíęč" + BEGIN + MENUITEM "Çŕ &Íŕçâîţ", 0x30 /* column 0 */ + MENUITEM "Çŕ &Ňčďîě", 0x32 /* column 2 */ + MENUITEM "Çŕ &Đîçěłđîě", 0x31 /* ... */ + MENUITEM "Çŕ &Äŕňîţ", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Ŕâňîěŕňč÷íî", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Âčđłâí˙ňč ˛ęîíęč", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "Îíîâčňč", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Âńňŕâčňč", FCIDM_SHVIEW_INSERT + MENUITEM "Âńňŕâčňč Ďîńčëŕíí˙", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Ńňâîđčňč" + BEGIN + MENUITEM "Íîâŕ &Ňĺęŕ", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Íîâĺ &Ďîńčëŕíí˙", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Âëŕńňčâîńňł", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Ďđîâłäíčę", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Âłäęđčňč", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "Âč&đłçŕňč", FCIDM_SHVIEW_CUT + MENUITEM "&Ęîďł˙", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "&Ńňâîđčňč Ďîńčëŕíí˙", FCIDM_SHVIEW_CREATELINK + MENUITEM "Âč&äŕëčňč", FCIDM_SHVIEW_DELETE + MENUITEM "Ďĺđĺ&éěĺíóâŕňč", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Âëŕńňčâîńňł", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Îăë˙ä äî ňĺęč" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Âłäěłíŕ", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Ďđî %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "Đîçđîáíčęč ReactOS:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Ââĺäłňü łě'˙ ďđîăđŕěč, ňĺęč, äîęóěĺíňó ÷č đĺńóđń ˛íňĺđíĺňó, ł ReactOS âłäęđčş żő.", 12289, 36, 11, 182, 18 + LTEXT "&Âłäęđčňč:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Âłäěłíŕ", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Îăë˙ä...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* + special folders +*/ +STRINGTABLE DISCARDABLE +{ + IDS_DESKTOP "Ńňłëüíčö˙" + IDS_MYCOMPUTER "Ěłé Ęîěď'ţňĺđ" +} + +/* + context menus +*/ +STRINGTABLE DISCARDABLE +{ + IDS_VIEW_LARGE "&Âĺëčęł ˛ęîíęč" + IDS_VIEW_SMALL "&Ěŕëł ˛ęîíęč" + IDS_VIEW_LIST "&Ńďčńîę" + IDS_VIEW_DETAILS "&Ďîäđîáčöł" + IDS_SELECT "Âč&áđŕňč" + IDS_OPEN "Âł&äęđčňč" +} + +STRINGTABLE DISCARDABLE +{ + IDS_CREATEFOLDER_DENIED "Íĺ âäŕëîń˙ ńňâîđčňč íîâó ňĺęó: Âłäěîâŕ ó äîńňóďł." + IDS_CREATEFOLDER_CAPTION "Ďîěčëęŕ ďđč ńňâîđĺííł íîâîż ňĺęč" + IDS_DELETEITEM_CAPTION "Ďłäňâĺđäćĺíí˙ âčëó÷ĺíí˙ ôŕéëó" + IDS_DELETEFOLDER_CAPTION "Ďłäňâĺđäćĺíí˙ âčëó÷ĺíí˙ ňĺęč" + IDS_DELETEITEM_TEXT "Âč âďĺâíĺíł, ůî őî÷ĺňĺ âčëó÷čňč '%1'?" + IDS_DELETEMULTIPLE_TEXT "Âč âďĺâíĺíł, ůî őî÷ĺňĺ âčëó÷čňč öł %1 ĺëĺěĺíňč(łâ)?" + IDS_OVERWRITEFILE_TEXT "Ďĺđĺďčńŕňč Ôŕéë %1?" + IDS_OVERWRITEFILE_CAPTION "Ďłäňâĺđäćĺíí˙ Ďĺđĺçŕďčńó Ôŕéëó" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN + IDS_SHV_COLUMN1 "Ôŕéë" + IDS_SHV_COLUMN2 "Đîçěłđ" + IDS_SHV_COLUMN3 "Ňčď" + IDS_SHV_COLUMN4 "Çěłíĺíî" + IDS_SHV_COLUMN5 "Ŕňđčáóňč" + IDS_SHV_COLUMN6 "Đîçěłđ" + IDS_SHV_COLUMN7 "Âłëüíčé Đîçěłđ" +END diff --git a/reactos/lib/shell32/shell32_Wa.rc b/reactos/lib/shell32/shell32_Wa.rc new file mode 100644 index 00000000000..3984d4b4abf --- /dev/null +++ b/reactos/lib/shell32/shell32_Wa.rc @@ -0,0 +1,51 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_WALON, SUBLANG_DEFAULT + +/* + * Si vos voloz aider avou li ratoűrnaedje des libes programes č walon, + * vos poloz scrîre a l' adresse emile + */ + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Ĺ dfait di %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "I Va", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "ReactOS a estu fwait par:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} diff --git a/reactos/lib/shell32/shell32_Zh.rc b/reactos/lib/shell32/shell32_Zh.rc new file mode 100644 index 00000000000..ddd8143f1e1 --- /dev/null +++ b/reactos/lib/shell32/shell32_Zh.rc @@ -0,0 +1,62 @@ +/* + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL +#pragma code_page(936) /* FIXME: default for CHINESE_TRADITIONAL is 950 */ + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ęPěś %s" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "´_ś¨", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 35, 10, 137, 10 + LTEXT "ReactOS was brought to you by:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "&Open:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +/* columns in the shellview */ +STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL +BEGIN + IDS_SHV_COLUMN1 "™n°¸" + IDS_SHV_COLUMN2 "´óĐĄ" + IDS_SHV_COLUMN3 "îĐÍ" + IDS_SHV_COLUMN4 "ŇŃĐ޸Ä" + IDS_SHV_COLUMN5 "ŒŮĐÔ" + IDS_SHV_COLUMN6 "ĘšÓĂżŐég" + IDS_SHV_COLUMN7 "ĘŁđNżŐég" + IDS_SHV_COLUMN8 "Name" /*FIXME*/ + IDS_SHV_COLUMN9 "Comments" /*FIXME*/ +END + +#pragma code_page(default) diff --git a/reactos/lib/shell32/shell32_main.c b/reactos/lib/shell32/shell32_main.c new file mode 100644 index 00000000000..16ab3d116f1 --- /dev/null +++ b/reactos/lib/shell32/shell32_main.c @@ -0,0 +1,1000 @@ +/* + * Shell basics + * + * Copyright 1998 Marcus Meissner + * Copyright 1998 Juergen Schmied (jsch) * + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include +#include +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" +#include "dlgs.h" +#include "shellapi.h" +#include "winuser.h" +#include "wingdi.h" +#include "shlobj.h" +#include "shlguid.h" +#include "shlwapi.h" + +#include "undocshell.h" +#include "pidl.h" +#include "shell32_main.h" +#include "version.h" + +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +extern const char * const SHELL_Authors[]; + +#define MORE_DEBUG 1 +/************************************************************************* + * CommandLineToArgvW [SHELL32.@] + * + * We must interpret the quotes in the command line to rebuild the argv + * array correctly: + * - arguments are separated by spaces or tabs + * - quotes serve as optional argument delimiters + * '"a b"' -> 'a b' + * - escaped quotes must be converted back to '"' + * '\"' -> '"' + * - an odd number of '\'s followed by '"' correspond to half that number + * of '\' followed by a '"' (extension of the above) + * '\\\"' -> '\"' + * '\\\\\"' -> '\\"' + * - an even number of '\'s followed by a '"' correspond to half that number + * of '\', plus a regular quote serving as an argument delimiter (which + * means it does not appear in the result) + * 'a\\"b c"' -> 'a\b c' + * 'a\\\\"b c"' -> 'a\\b c' + * - '\' that are not followed by a '"' are copied literally + * 'a\b' -> 'a\b' + * 'a\\b' -> 'a\\b' + * + * Note: + * '\t' == 0x0009 + * ' ' == 0x0020 + * '"' == 0x0022 + * '\\' == 0x005c + */ +LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs) +{ + DWORD argc; + HGLOBAL hargv; + LPWSTR *argv; + LPCWSTR cs; + LPWSTR arg,s,d; + LPWSTR cmdline; + int in_quotes,bcount; + + if (*lpCmdline==0) { + /* Return the path to the executable */ + DWORD len, size=16; + + hargv=GlobalAlloc(size, 0); + argv=GlobalLock(hargv); + for (;;) { + len = GetModuleFileNameW(0, (LPWSTR)(argv+1), size-sizeof(LPWSTR)); + if (!len) { + GlobalFree(hargv); + return NULL; + } + if (len < size) break; + size*=2; + hargv=GlobalReAlloc(hargv, size, 0); + argv=GlobalLock(hargv); + } + argv[0]=(LPWSTR)(argv+1); + if (numargs) + *numargs=2; + + return argv; + } + + /* to get a writeable copy */ + argc=0; + bcount=0; + in_quotes=0; + cs=lpCmdline; + while (1) { + if (*cs==0 || ((*cs==0x0009 || *cs==0x0020) && !in_quotes)) { + /* space */ + argc++; + /* skip the remaining spaces */ + while (*cs==0x0009 || *cs==0x0020) { + cs++; + } + if (*cs==0) + break; + bcount=0; + continue; + } else if (*cs==0x005c) { + /* '\', count them */ + bcount++; + } else if ((*cs==0x0022) && ((bcount & 1)==0)) { + /* unescaped '"' */ + in_quotes=!in_quotes; + bcount=0; + } else { + /* a regular character */ + bcount=0; + } + cs++; + } + /* Allocate in a single lump, the string array, and the strings that go with it. + * This way the caller can make a single GlobalFree call to free both, as per MSDN. + */ + hargv=GlobalAlloc(0, argc*sizeof(LPWSTR)+(strlenW(lpCmdline)+1)*sizeof(WCHAR)); + argv=GlobalLock(hargv); + if (!argv) + return NULL; + cmdline=(LPWSTR)(argv+argc); + strcpyW(cmdline, lpCmdline); + + argc=0; + bcount=0; + in_quotes=0; + arg=d=s=cmdline; + while (*s) { + if ((*s==0x0009 || *s==0x0020) && !in_quotes) { + /* Close the argument and copy it */ + *d=0; + argv[argc++]=arg; + + /* skip the remaining spaces */ + do { + s++; + } while (*s==0x0009 || *s==0x0020); + + /* Start with a new argument */ + arg=d=s; + bcount=0; + } else if (*s==0x005c) { + /* '\\' */ + *d++=*s++; + bcount++; + } else if (*s==0x0022) { + /* '"' */ + if ((bcount & 1)==0) { + /* Preceeded by an even number of '\', this is half that + * number of '\', plus a quote which we erase. + */ + d-=bcount/2; + in_quotes=!in_quotes; + s++; + } else { + /* Preceeded by an odd number of '\', this is half that + * number of '\' followed by a '"' + */ + d=d-bcount/2-1; + *d++='"'; + s++; + } + bcount=0; + } else { + /* a regular character */ + *d++=*s++; + bcount=0; + } + } + if (*arg) { + *d='\0'; + argv[argc++]=arg; + } + if (numargs) + *numargs=argc; + + return argv; +} + +/************************************************************************* + * SHGetFileInfoA [SHELL32.@] + * + */ + +DWORD WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, + SHFILEINFOW *psfi, UINT sizeofpsfi, + UINT flags ) +{ + WCHAR szLocation[MAX_PATH], szFullPath[MAX_PATH]; + int iIndex; + DWORD ret = TRUE, dwAttributes = 0; + IShellFolder * psfParent = NULL; + IExtractIconW * pei = NULL; + LPITEMIDLIST pidlLast = NULL, pidl = NULL; + HRESULT hr = S_OK; + BOOL IconNotYetLoaded=TRUE; + + TRACE("(%s fattr=0x%lx sfi=%p(attr=0x%08lx) size=0x%x flags=0x%x)\n", + (flags & SHGFI_PIDL)? "pidl" : debugstr_w(path), dwFileAttributes, psfi, psfi->dwAttributes, sizeofpsfi, flags); + + if ((flags & SHGFI_USEFILEATTRIBUTES) && (flags & (SHGFI_ATTRIBUTES|SHGFI_EXETYPE|SHGFI_PIDL))) + return FALSE; + + /* windows initializes this values regardless of the flags */ + if (psfi != NULL) { + psfi->szDisplayName[0] = '\0'; + psfi->szTypeName[0] = '\0'; + psfi->iIcon = 0; + } + + if (!(flags & SHGFI_PIDL)){ + /* SHGitFileInfo should work with absolute and relative paths */ + if (PathIsRelativeW(path)){ + GetCurrentDirectoryW(MAX_PATH, szLocation); + PathCombineW(szFullPath, szLocation, path); + } else { + lstrcpynW(szFullPath, path, MAX_PATH); + } + } + + if (flags & SHGFI_EXETYPE) { + BOOL status = FALSE; + HANDLE hfile; + DWORD BinaryType; + IMAGE_DOS_HEADER mz_header; + IMAGE_NT_HEADERS nt; + DWORD len; + char magic[4]; + + if (flags != SHGFI_EXETYPE) return 0; + + status = GetBinaryTypeW (szFullPath, &BinaryType); + if (!status) return 0; + if ((BinaryType == SCS_DOS_BINARY) + || (BinaryType == SCS_PIF_BINARY)) return 0x4d5a; + + hfile = CreateFileW( szFullPath, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, 0, 0 ); + if ( hfile == INVALID_HANDLE_VALUE ) return 0; + + /* The next section is adapted from MODULE_GetBinaryType, as we need + * to examine the image header to get OS and version information. We + * know from calling GetBinaryTypeA that the image is valid and either + * an NE or PE, so much error handling can be omitted. + * Seek to the start of the file and read the header information. + */ + + SetFilePointer( hfile, 0, NULL, SEEK_SET ); + ReadFile( hfile, &mz_header, sizeof(mz_header), &len, NULL ); + + SetFilePointer( hfile, mz_header.e_lfanew, NULL, SEEK_SET ); + ReadFile( hfile, magic, sizeof(magic), &len, NULL ); + if ( *(DWORD*)magic == IMAGE_NT_SIGNATURE ) + { + SetFilePointer( hfile, mz_header.e_lfanew, NULL, SEEK_SET ); + ReadFile( hfile, &nt, sizeof(nt), &len, NULL ); + CloseHandle( hfile ); + if (nt.OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI) { + return IMAGE_NT_SIGNATURE + | (nt.OptionalHeader.MajorSubsystemVersion << 24) + | (nt.OptionalHeader.MinorSubsystemVersion << 16); + } + return IMAGE_NT_SIGNATURE; + } + else if ( *(WORD*)magic == IMAGE_OS2_SIGNATURE ) + { + IMAGE_OS2_HEADER ne; + SetFilePointer( hfile, mz_header.e_lfanew, NULL, SEEK_SET ); + ReadFile( hfile, &ne, sizeof(ne), &len, NULL ); + CloseHandle( hfile ); + if (ne.ne_exetyp == 2) return IMAGE_OS2_SIGNATURE + | (ne.ne_expver << 16); + return 0; + } + CloseHandle( hfile ); + return 0; + } + + /* psfi is NULL normally to query EXE type. If it is NULL, none of the + * below makes sense anyway. Windows allows this and just returns FALSE */ + if (psfi == NULL) return FALSE; + + /* translate the path into a pidl only when SHGFI_USEFILEATTRIBUTES + * is not specified. + The pidl functions fail on not existing file names */ + + if (flags & SHGFI_PIDL) { + pidl = ILClone((LPCITEMIDLIST)path); + } else if (!(flags & SHGFI_USEFILEATTRIBUTES)) { + hr = SHILCreateFromPathW(szFullPath, &pidl, &dwAttributes); + } + + if ((flags & SHGFI_PIDL) || !(flags & SHGFI_USEFILEATTRIBUTES)) + { + /* get the parent shellfolder */ + if (pidl) { + hr = SHBindToParent(pidl, &IID_IShellFolder, (LPVOID*)&psfParent, (LPCITEMIDLIST*)&pidlLast); + ILFree(pidl); + } else { + ERR("pidl is null!\n"); + return FALSE; + } + } + + /* get the attributes of the child */ + if (SUCCEEDED(hr) && (flags & SHGFI_ATTRIBUTES)) + { + if (!(flags & SHGFI_ATTR_SPECIFIED)) + { + psfi->dwAttributes = 0xffffffff; + } + IShellFolder_GetAttributesOf(psfParent, 1, (LPCITEMIDLIST*)&pidlLast, &(psfi->dwAttributes)); + } + + /* get the displayname */ + if (SUCCEEDED(hr) && (flags & SHGFI_DISPLAYNAME)) + { + if (flags & SHGFI_USEFILEATTRIBUTES) + { + lstrcpyW (psfi->szDisplayName, PathFindFileNameW(szFullPath)); + } + else + { + STRRET str; + hr = IShellFolder_GetDisplayNameOf(psfParent, pidlLast, SHGDN_INFOLDER, &str); + StrRetToStrNW (psfi->szDisplayName, MAX_PATH, &str, pidlLast); + } + } + + /* get the type name */ + if (SUCCEEDED(hr) && (flags & SHGFI_TYPENAME)) + { + static const WCHAR szFile[] = { 'F','i','l','e',0 }; + static const WCHAR szDashFile[] = { '-','f','i','l','e',0 }; + if (!(flags & SHGFI_USEFILEATTRIBUTES)) + { + char ftype[80]; + _ILGetFileType(pidlLast, ftype, 80); + MultiByteToWideChar(CP_ACP, 0, ftype, -1, psfi->szTypeName, 80 ); + } + else + { + if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + strcatW (psfi->szTypeName, szFile); + else + { + WCHAR sTemp[64]; + lstrcpyW(sTemp,PathFindExtensionW(szFullPath)); + if (!( HCR_MapTypeToValueW(sTemp, sTemp, 64, TRUE) + && HCR_MapTypeToValueW(sTemp, psfi->szTypeName, 80, FALSE ))) + { + lstrcpynW (psfi->szTypeName, sTemp, 64); + strcatW (psfi->szTypeName, szDashFile); + } + } + } + } + + /* ### icons ###*/ + if (flags & SHGFI_LINKOVERLAY) + FIXME("set icon to link, stub\n"); + + if (flags & SHGFI_SELECTED) + FIXME("set icon to selected, stub\n"); + + if (flags & SHGFI_SHELLICONSIZE) + FIXME("set icon to shell size, stub\n"); + + /* get the iconlocation */ + if (SUCCEEDED(hr) && (flags & SHGFI_ICONLOCATION )) + { + UINT uDummy,uFlags; + hr = IShellFolder_GetUIObjectOf(psfParent, 0, 1, (LPCITEMIDLIST*)&pidlLast, &IID_IExtractIconA, &uDummy, (LPVOID*)&pei); + + if (SUCCEEDED(hr)) + { + hr = IExtractIconW_GetIconLocation(pei, (flags & SHGFI_OPENICON)? GIL_OPENICON : 0,szLocation, MAX_PATH, &iIndex, &uFlags); + psfi->iIcon = iIndex; + + if(uFlags != GIL_NOTFILENAME) + lstrcpyW (psfi->szDisplayName, szLocation); + else + ret = FALSE; + + IExtractIconA_Release(pei); + } + } + + /* get icon index (or load icon)*/ + if (SUCCEEDED(hr) && (flags & (SHGFI_ICON | SHGFI_SYSICONINDEX))) + { + + if (flags & SHGFI_USEFILEATTRIBUTES) + { + WCHAR sTemp [MAX_PATH]; + WCHAR * szExt; + DWORD dwNr=0; + + lstrcpynW(sTemp, szFullPath, MAX_PATH); + + if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + psfi->iIcon = 2; + else + { + static const WCHAR p1W[] = {'%','1',0}; + psfi->iIcon = 0; + szExt = (LPWSTR) PathFindExtensionW(sTemp); + if ( szExt && HCR_MapTypeToValueW(szExt, sTemp, MAX_PATH, TRUE) + && HCR_GetDefaultIconW(sTemp, sTemp, MAX_PATH, &dwNr)) + { + if (!lstrcmpW(p1W,sTemp)) /* icon is in the file */ + strcpyW(sTemp, szFullPath); + + if (flags & SHGFI_SYSICONINDEX) + { + psfi->iIcon = SIC_GetIconIndex(sTemp,dwNr); + if (psfi->iIcon == -1) psfi->iIcon = 0; + } + else + { + IconNotYetLoaded=FALSE; + PrivateExtractIconsW(sTemp,dwNr,(flags & SHGFI_SMALLICON) ? + GetSystemMetrics(SM_CXSMICON) : GetSystemMetrics(SM_CXICON), + (flags & SHGFI_SMALLICON) ? GetSystemMetrics(SM_CYSMICON) : + GetSystemMetrics(SM_CYICON), &psfi->hIcon,0,1,0); + psfi->iIcon = dwNr; + } + } + } + } + else + { + if (!(PidlToSicIndex(psfParent, pidlLast, !(flags & SHGFI_SMALLICON), + (flags & SHGFI_OPENICON)? GIL_OPENICON : 0, &(psfi->iIcon)))) + { + ret = FALSE; + } + } + if (ret) + { + ret = (DWORD) ((flags & SHGFI_SMALLICON) ? ShellSmallIconList : ShellBigIconList); + } + } + + /* icon handle */ + if (SUCCEEDED(hr) && (flags & SHGFI_ICON) && IconNotYetLoaded) + psfi->hIcon = ImageList_GetIcon((flags & SHGFI_SMALLICON) ? ShellSmallIconList:ShellBigIconList, psfi->iIcon, ILD_NORMAL); + + if (flags & (SHGFI_UNKNOWN1 | SHGFI_UNKNOWN2 | SHGFI_UNKNOWN3)) + FIXME("unknown attribute!\n"); + + if (psfParent) + IShellFolder_Release(psfParent); + + if (hr != S_OK) + ret = FALSE; + + if(pidlLast) SHFree(pidlLast); +#ifdef MORE_DEBUG + TRACE ("icon=%p index=0x%08x attr=0x%08lx name=%s type=%s ret=0x%08lx\n", + psfi->hIcon, psfi->iIcon, psfi->dwAttributes, debugstr_w(psfi->szDisplayName), debugstr_w(psfi->szTypeName), ret); +#endif + return ret; +} + +/************************************************************************* + * SHGetFileInfoW [SHELL32.@] + */ + +DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, + SHFILEINFOA *psfi, UINT sizeofpsfi, + UINT flags ) +{ + INT len; + LPWSTR temppath; + DWORD ret; + SHFILEINFOW temppsfi; + + if (flags & SHGFI_PIDL) { + /* path contains a pidl */ + temppath = (LPWSTR) path; + } else { + len = MultiByteToWideChar(CP_ACP, 0, path, -1, NULL, 0); + temppath = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, path, -1, temppath, len); + } + + if(psfi && (flags & SHGFI_ATTR_SPECIFIED)) + temppsfi.dwAttributes=psfi->dwAttributes; + + ret = SHGetFileInfoW(temppath, dwFileAttributes, (psfi == NULL)? NULL : &temppsfi, sizeof(temppsfi), flags); + + if (psfi) + { + if(flags & SHGFI_ICON) + psfi->hIcon=temppsfi.hIcon; + if(flags & (SHGFI_SYSICONINDEX|SHGFI_ICON|SHGFI_ICONLOCATION)) + psfi->iIcon=temppsfi.iIcon; + if(flags & SHGFI_ATTRIBUTES) + psfi->dwAttributes=temppsfi.dwAttributes; + if(flags & (SHGFI_DISPLAYNAME|SHGFI_ICONLOCATION)) + WideCharToMultiByte(CP_ACP, 0, temppsfi.szDisplayName, -1, psfi->szDisplayName, sizeof(psfi->szDisplayName), NULL, NULL); + if(flags & SHGFI_TYPENAME) + WideCharToMultiByte(CP_ACP, 0, temppsfi.szTypeName, -1, psfi->szTypeName, sizeof(psfi->szTypeName), NULL, NULL); + } + if(!(flags & SHGFI_PIDL)) HeapFree(GetProcessHeap(), 0, temppath); + return ret; +} + +/************************************************************************* + * SHGetFileInfo [SHELL32.@] + */ +DWORD WINAPI SHGetFileInfoAW( + LPCVOID path, + DWORD dwFileAttributes, + LPVOID psfi, + UINT sizeofpsfi, + UINT flags) +{ + if(SHELL_OsIsUnicode()) + return SHGetFileInfoW(path, dwFileAttributes, psfi, sizeofpsfi, flags ); + return SHGetFileInfoA(path, dwFileAttributes, psfi, sizeofpsfi, flags ); +} + +/************************************************************************* + * DuplicateIcon [SHELL32.@] + */ +HICON WINAPI DuplicateIcon( HINSTANCE hInstance, HICON hIcon) +{ + ICONINFO IconInfo; + HICON hDupIcon = 0; + + TRACE("(%p, %p)\n", hInstance, hIcon); + + if(GetIconInfo(hIcon, &IconInfo)) + { + hDupIcon = CreateIconIndirect(&IconInfo); + + /* clean up hbmMask and hbmColor */ + DeleteObject(IconInfo.hbmMask); + DeleteObject(IconInfo.hbmColor); + } + + return hDupIcon; +} + +/************************************************************************* + * ExtractIconA [SHELL32.@] + */ +HICON WINAPI ExtractIconA(HINSTANCE hInstance, LPCSTR lpszFile, UINT nIconIndex) +{ + HICON ret; + INT len = MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, NULL, 0); + LPWSTR lpwstrFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + + TRACE("%p %s %d\n", hInstance, lpszFile, nIconIndex); + + MultiByteToWideChar(CP_ACP, 0, lpszFile, -1, lpwstrFile, len); + ret = ExtractIconW(hInstance, lpwstrFile, nIconIndex); + HeapFree(GetProcessHeap(), 0, lpwstrFile); + return ret; +} + +/************************************************************************* + * ExtractIconW [SHELL32.@] + */ +HICON WINAPI ExtractIconW(HINSTANCE hInstance, LPCWSTR lpszFile, UINT nIconIndex) +{ + HICON hIcon = NULL; + UINT ret; + UINT cx = GetSystemMetrics(SM_CXICON), cy = GetSystemMetrics(SM_CYICON); + + TRACE("%p %s %d\n", hInstance, debugstr_w(lpszFile), nIconIndex); + + if (nIconIndex == 0xFFFFFFFF) { + ret = PrivateExtractIconsW(lpszFile, 0, cx, cy, NULL, NULL, 0, LR_DEFAULTCOLOR); + if (ret != 0xFFFFFFFF && ret) + return (HICON)ret; + return NULL; + } + else + ret = PrivateExtractIconsW(lpszFile, nIconIndex, cx, cy, &hIcon, NULL, 1, LR_DEFAULTCOLOR); + + if (ret == 0xFFFFFFFF) + return (HICON)1; + else if (ret > 0 && hIcon) + return hIcon; + return NULL; +} + +typedef struct +{ + LPCWSTR szApp; + LPCWSTR szOtherStuff; + HICON hIcon; + HFONT hFont; +} ABOUT_INFO; + +#define IDC_STATIC_TEXT1 100 +#define IDC_STATIC_TEXT2 101 +#define IDC_LISTBOX 99 +#define IDC_WINE_TEXT 98 + +#define DROP_FIELD_TOP (-15) +#define DROP_FIELD_HEIGHT 15 + +static BOOL __get_dropline( HWND hWnd, LPRECT lprect ) +{ HWND hWndCtl = GetDlgItem(hWnd, IDC_WINE_TEXT); + if( hWndCtl ) + { GetWindowRect( hWndCtl, lprect ); + MapWindowPoints( 0, hWnd, (LPPOINT)lprect, 2 ); + lprect->bottom = (lprect->top += DROP_FIELD_TOP); + return TRUE; + } + return FALSE; +} + +/************************************************************************* + * SHAppBarMessage [SHELL32.@] + */ +UINT WINAPI SHAppBarMessage(DWORD msg, PAPPBARDATA data) +{ + int width=data->rc.right - data->rc.left; + int height=data->rc.bottom - data->rc.top; + RECT rec=data->rc; + switch (msg) + { case ABM_GETSTATE: + return ABS_ALWAYSONTOP | ABS_AUTOHIDE; + case ABM_GETTASKBARPOS: + GetWindowRect(data->hWnd, &rec); + data->rc=rec; + return TRUE; + case ABM_ACTIVATE: + SetActiveWindow(data->hWnd); + return TRUE; + case ABM_GETAUTOHIDEBAR: + data->hWnd=GetActiveWindow(); + return TRUE; + case ABM_NEW: + SetWindowPos(data->hWnd,HWND_TOP,rec.left,rec.top, + width,height,SWP_SHOWWINDOW); + return TRUE; + case ABM_QUERYPOS: + GetWindowRect(data->hWnd, &(data->rc)); + return TRUE; + case ABM_REMOVE: + FIXME("ABM_REMOVE broken\n"); + /* FIXME: this is wrong; should it be DestroyWindow instead? */ + /*CloseHandle(data->hWnd);*/ + return TRUE; + case ABM_SETAUTOHIDEBAR: + SetWindowPos(data->hWnd,HWND_TOP,rec.left+1000,rec.top, + width,height,SWP_SHOWWINDOW); + return TRUE; + case ABM_SETPOS: + data->uEdge=(ABE_RIGHT | ABE_LEFT); + SetWindowPos(data->hWnd,HWND_TOP,data->rc.left,data->rc.top, + width,height,SWP_SHOWWINDOW); + return TRUE; + case ABM_WINDOWPOSCHANGED: + return TRUE; + } + return FALSE; +} + +/************************************************************************* + * SHHelpShortcuts_RunDLL [SHELL32.@] + * + */ +DWORD WINAPI SHHelpShortcuts_RunDLL (DWORD dwArg1, DWORD dwArg2, DWORD dwArg3, DWORD dwArg4) +{ FIXME("(%lx, %lx, %lx, %lx) empty stub!\n", + dwArg1, dwArg2, dwArg3, dwArg4); + + return 0; +} + +/************************************************************************* + * SHLoadInProc [SHELL32.@] + * Create an instance of specified object class from within + * the shell process and release it immediately + */ + +HRESULT WINAPI SHLoadInProc (REFCLSID rclsid) +{ + void *ptr = NULL; + + TRACE("%s\n", debugstr_guid(rclsid)); + + CoCreateInstance(rclsid, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown,&ptr); + if(ptr) + { + IUnknown * pUnk = ptr; + IUnknown_Release(pUnk); + return NOERROR; + } + return DISP_E_MEMBERNOTFOUND; +} + +/************************************************************************* + * AboutDlgProc (internal) + */ +INT_PTR CALLBACK AboutDlgProc( HWND hWnd, UINT msg, WPARAM wParam, + LPARAM lParam ) +{ + HWND hWndCtl; + + TRACE("\n"); + + switch(msg) + { + case WM_INITDIALOG: + { + ABOUT_INFO *info = (ABOUT_INFO *)lParam; + WCHAR Template[512], AppTitle[512]; + + if (info) + { + const char* const *pstr = SHELL_Authors; + SendDlgItemMessageW(hWnd, stc1, STM_SETICON,(WPARAM)info->hIcon, 0); + GetWindowTextW( hWnd, Template, sizeof(Template)/sizeof(WCHAR) ); + sprintfW( AppTitle, Template, info->szApp ); + SetWindowTextW( hWnd, AppTitle ); + SetWindowTextW( GetDlgItem(hWnd, IDC_STATIC_TEXT1), info->szApp ); + SetWindowTextW( GetDlgItem(hWnd, IDC_STATIC_TEXT2), info->szOtherStuff ); + hWndCtl = GetDlgItem(hWnd, IDC_LISTBOX); + SendMessageW( hWndCtl, WM_SETREDRAW, 0, 0 ); + SendMessageW( hWndCtl, WM_SETFONT, (WPARAM)info->hFont, 0 ); + while (*pstr) + { + WCHAR name[64]; + /* authors list is in iso-8859-1 format */ + MultiByteToWideChar( 28591, 0, *pstr, -1, name, sizeof(name)/sizeof(WCHAR) ); + SendMessageW( hWndCtl, LB_ADDSTRING, (WPARAM)-1, (LPARAM)name ); + pstr++; + } + SendMessageW( hWndCtl, WM_SETREDRAW, 1, 0 ); + } + } + return 1; + + case WM_PAINT: + { RECT rect; + PAINTSTRUCT ps; + HDC hDC = BeginPaint( hWnd, &ps ); + + if( __get_dropline( hWnd, &rect ) ) { + SelectObject( hDC, GetStockObject( BLACK_PEN ) ); + MoveToEx( hDC, rect.left, rect.top, NULL ); + LineTo( hDC, rect.right, rect.bottom ); + } + EndPaint( hWnd, &ps ); + } + break; + + case WM_COMMAND: + if (wParam == IDOK || wParam == IDCANCEL) + { + EndDialog(hWnd, TRUE); + return TRUE; + } + break; + case WM_CLOSE: + EndDialog(hWnd, TRUE); + break; + } + + return 0; +} + + +/************************************************************************* + * ShellAboutA [SHELL32.288] + */ +BOOL WINAPI ShellAboutA( HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon ) +{ + BOOL ret; + LPWSTR appW = NULL, otherW = NULL; + int len; + + if (szApp) + { + len = MultiByteToWideChar(CP_ACP, 0, szApp, -1, NULL, 0); + appW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, szApp, -1, appW, len); + } + if (szOtherStuff) + { + len = MultiByteToWideChar(CP_ACP, 0, szOtherStuff, -1, NULL, 0); + otherW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, szOtherStuff, -1, otherW, len); + } + + ret = ShellAboutW(hWnd, appW, otherW, hIcon); + + if (otherW) HeapFree(GetProcessHeap(), 0, otherW); + if (appW) HeapFree(GetProcessHeap(), 0, appW); + return ret; +} + + +/************************************************************************* + * ShellAboutW [SHELL32.289] + */ +BOOL WINAPI ShellAboutW( HWND hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff, + HICON hIcon ) +{ + ABOUT_INFO info; + LOGFONTW logFont; + HRSRC hRes; + LPVOID template; + BOOL bRet; + + TRACE("\n"); + + if(!(hRes = FindResourceA(shell32_hInstance, "SHELL_ABOUT_MSGBOX", (LPSTR)RT_DIALOG))) + return FALSE; + if(!(template = (LPVOID)LoadResource(shell32_hInstance, hRes))) + return FALSE; + info.szApp = szApp; + info.szOtherStuff = szOtherStuff; + info.hIcon = hIcon ? hIcon : LoadIconW( 0, (LPWSTR)IDI_WINLOGO ); + + SystemParametersInfoW( SPI_GETICONTITLELOGFONT, 0, &logFont, 0 ); + info.hFont = CreateFontIndirectW( &logFont ); + + bRet = DialogBoxIndirectParamW((HINSTANCE)GetWindowLongPtrW( hWnd, GWLP_HINSTANCE ), + template, hWnd, AboutDlgProc, (LPARAM)&info ); + DeleteObject(info.hFont); + return bRet; +} + +/************************************************************************* + * FreeIconList (SHELL32.@) + */ +void WINAPI FreeIconList( DWORD dw ) +{ FIXME("(%lx): stub\n",dw); +} + + +/************************************************************************* + * ShellDDEInit (SHELL32.@) + */ +void WINAPI ShellDDEInit(BOOL start) +{ + FIXME("stub: %d\n", start); +} + +/*********************************************************************** + * DllGetVersion [SHELL32.@] + * + * Retrieves version information of the 'SHELL32.DLL' + * + * PARAMS + * pdvi [O] pointer to version information structure. + * + * RETURNS + * Success: S_OK + * Failure: E_INVALIDARG + * + * NOTES + * Returns version of a shell32.dll from IE4.01 SP1. + */ + +HRESULT WINAPI SHELL32_DllGetVersion (DLLVERSIONINFO *pdvi) +{ + /* FIXME: shouldn't these values come from the version resource? */ + if (pdvi->cbSize == sizeof(DLLVERSIONINFO) || + pdvi->cbSize == sizeof(DLLVERSIONINFO2)) + { + pdvi->dwMajorVersion = WINE_FILEVERSION_MAJOR; + pdvi->dwMinorVersion = WINE_FILEVERSION_MINOR; + pdvi->dwBuildNumber = WINE_FILEVERSION_BUILD; + pdvi->dwPlatformID = WINE_FILEVERSION_PLATFORMID; + if (pdvi->cbSize == sizeof(DLLVERSIONINFO2)) + { + DLLVERSIONINFO2 *pdvi2 = (DLLVERSIONINFO2 *)pdvi; + + pdvi2->dwFlags = 0; + pdvi2->ullVersion = MAKEDLLVERULL(WINE_FILEVERSION_MAJOR, + WINE_FILEVERSION_MINOR, + WINE_FILEVERSION_BUILD, + WINE_FILEVERSION_PLATFORMID); + } + TRACE("%lu.%lu.%lu.%lu\n", + pdvi->dwMajorVersion, pdvi->dwMinorVersion, + pdvi->dwBuildNumber, pdvi->dwPlatformID); + return S_OK; + } + else + { + WARN("wrong DLLVERSIONINFO size from app\n"); + return E_INVALIDARG; + } +} +/************************************************************************* + * global variables of the shell32.dll + * all are once per process + * + */ +HINSTANCE shell32_hInstance = 0; +HIMAGELIST ShellSmallIconList = 0; +HIMAGELIST ShellBigIconList = 0; + + +/************************************************************************* + * SHELL32 DllMain + * + * NOTES + * calling oleinitialize here breaks sone apps. + */ + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) +{ + TRACE("%p 0x%lx %p\n", hinstDLL, fdwReason, fImpLoad); + + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + shell32_hInstance = hinstDLL; + DisableThreadLibraryCalls(shell32_hInstance); + + /* get full path to this DLL for IExtractIconW_fnGetIconLocation() */ + GetModuleFileNameW(hinstDLL, swShell32Name, MAX_PATH); + swShell32Name[MAX_PATH - 1] = '\0'; + + InitCommonControlsEx(NULL); + + SIC_Initialize(); + InitChangeNotifications(); + break; + + case DLL_PROCESS_DETACH: + shell32_hInstance = 0; + SIC_Destroy(); + FreeChangeNotifications(); + break; + } + return TRUE; +} + +/************************************************************************* + * DllInstall [SHELL32.@] + * + * PARAMETERS + * + * BOOL bInstall - TRUE for install, FALSE for uninstall + * LPCWSTR pszCmdLine - command line (unused by shell32?) + */ + +HRESULT WINAPI SHELL32_DllInstall(BOOL bInstall, LPCWSTR cmdline) +{ + FIXME("(%s, %s): stub!\n", bInstall ? "TRUE":"FALSE", debugstr_w(cmdline)); + + return S_OK; /* indicate success */ +} + +/*********************************************************************** + * DllCanUnloadNow (SHELL32.@) + */ +HRESULT WINAPI SHELL32_DllCanUnloadNow(void) +{ + FIXME("(void): stub\n"); + + return S_FALSE; +} diff --git a/reactos/lib/shell32/shell32_main.h b/reactos/lib/shell32/shell32_main.h new file mode 100644 index 00000000000..378c621e408 --- /dev/null +++ b/reactos/lib/shell32/shell32_main.h @@ -0,0 +1,226 @@ +/* + * internal Shell32 Library definitions + * + * Copyright 1998 Marcus Meissner + * Copyright 1998 Juergen Schmied (jsch) * + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_SHELL_MAIN_H +#define __WINE_SHELL_MAIN_H + +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "commctrl.h" +#include "objbase.h" +#include "docobj.h" +#include "undocshell.h" +#include "shlobj.h" +#include "shellapi.h" +#include "wine/windef16.h" +#include "wine/unicode.h" + +/******************************************* +* global SHELL32.DLL variables +*/ +extern HMODULE huser32; +extern HINSTANCE shell32_hInstance; +extern HIMAGELIST ShellSmallIconList; +extern HIMAGELIST ShellBigIconList; + +BOOL WINAPI Shell_GetImageList(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList); + +/* Iconcache */ +#define INVALID_INDEX -1 +BOOL SIC_Initialize(void); +void SIC_Destroy(void); +BOOL PidlToSicIndex (IShellFolder * sh, LPCITEMIDLIST pidl, BOOL bBigIcon, UINT uFlags, int * pIndex); +INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex ); + +/* Classes Root */ +BOOL HCR_MapTypeToValueW(LPCWSTR szExtension, LPWSTR szFileType, DWORD len, BOOL bPrependDot); +BOOL HCR_GetExecuteCommandW( HKEY hkeyClass, LPCWSTR szClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len ); +BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, LPDWORD dwNr); +BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, LPDWORD dwNr); +BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len); + +/* ANSI versions of above functions, supposed to go away as soon as they are not used anymore */ +BOOL HCR_MapTypeToValueA(LPCSTR szExtension, LPSTR szFileType, DWORD len, BOOL bPrependDot); +BOOL HCR_GetDefaultIconA(LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr); +BOOL HCR_GetClassNameA(REFIID riid, LPSTR szDest, DWORD len); + +BOOL HCR_GetFolderAttributes(REFIID riid, LPDWORD szDest); + +INT_PTR CALLBACK AboutDlgProc(HWND,UINT,WPARAM,LPARAM); +DWORD WINAPI ParseFieldA(LPCSTR src, DWORD nField, LPSTR dst, DWORD len); +DWORD WINAPI ParseFieldW(LPCWSTR src, DWORD nField, LPWSTR dst, DWORD len); + +/**************************************************************************** + * Class constructors + */ +LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPCITEMIDLIST myPidl, LPCITEMIDLIST * apidl, UINT cidl); +LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT, const FORMATETC []); + +LPCLASSFACTORY IClassFactory_Constructor(REFCLSID); +IContextMenu2 * ISvItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl, LPCITEMIDLIST *aPidls, UINT uItemCount); +IContextMenu2 * ISvBgCm_Constructor(LPSHELLFOLDER pSFParent); +LPSHELLVIEW IShellView_Constructor(LPSHELLFOLDER); + +HRESULT WINAPI IFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI IShellLink_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI IShellLink_ConstructFromFile(IUnknown * pUnkOuter, REFIID riid, LPCITEMIDLIST pidl, LPVOID * ppv); +HRESULT WINAPI ISF_Desktop_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI ISF_MyComputer_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI IDropTargetHelper_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV); +HRESULT WINAPI IControlPanel_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI CPanel_GetIconLocationA(LPITEMIDLIST pidl, LPSTR szIconFile, UINT cchMax, int* piIndex); +HRESULT WINAPI CPanel_GetIconLocationW(LPITEMIDLIST pidl, LPWSTR szIconFile, UINT cchMax, int* piIndex); +HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); +HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); + +HRESULT WINAPI IAutoComplete_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); + +LPEXTRACTICONA IExtractIconA_Constructor(LPCITEMIDLIST); +LPEXTRACTICONW IExtractIconW_Constructor(LPCITEMIDLIST); +HRESULT CreateStreamOnFile (LPCWSTR pszFilename, DWORD grfMode, IStream ** ppstm); + +/* FIXME: rename the functions when the shell32.dll has it's own exports namespace */ +HRESULT WINAPI SHELL32_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID * ppv); +HRESULT WINAPI SHELL32_DllCanUnloadNow(void); + + +/* menu merging */ +#define MM_ADDSEPARATOR 0x00000001L +#define MM_SUBMENUSHAVEIDS 0x00000002L +HRESULT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags); + +/* initialisation for FORMATETC */ +#define InitFormatEtc(fe, cf, med) \ + {\ + (fe).cfFormat=cf;\ + (fe).dwAspect=DVASPECT_CONTENT;\ + (fe).ptd=NULL;\ + (fe).tymed=med;\ + (fe).lindex=-1;\ + }; + +#define KeyStateToDropEffect(kst)\ + (((kst) & MK_CONTROL) ?\ + (((kst) & MK_SHIFT) ? DROPEFFECT_LINK : DROPEFFECT_COPY):\ + DROPEFFECT_MOVE) + +HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); +HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); +HGLOBAL RenderSHELLIDLISTOFFSET (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); +HGLOBAL RenderFILECONTENTS (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); +HGLOBAL RenderFILEDESCRIPTOR (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); +HGLOBAL RenderFILENAMEA (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); +HGLOBAL RenderFILENAMEW (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); +HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags); + +/* Change Notification */ +void InitChangeNotifications(void); +void FreeChangeNotifications(void); + +/* file operation */ +#define ASK_DELETE_FILE 1 +#define ASK_DELETE_FOLDER 2 +#define ASK_DELETE_MULTIPLE_ITEM 3 +#define ASK_CREATE_FOLDER 4 +#define ASK_OVERWRITE_FILE 5 + +BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir, BOOL bShowUI); +BOOL SHELL_DeleteFileA(LPCSTR pszFile, BOOL bShowUI); +BOOL SHELL_ConfirmDialog(int nKindOfDialog, LPCSTR szDir); + +/* 16-bit functions */ +void WINAPI DragAcceptFiles16(HWND16 hWnd, BOOL16 b); +UINT16 WINAPI DragQueryFile16(HDROP16 hDrop, WORD wFile, LPSTR lpszFile, WORD wLength); +void WINAPI DragFinish16(HDROP16 h); +BOOL16 WINAPI DragQueryPoint16(HDROP16 hDrop, POINT16 *p); +HINSTANCE16 WINAPI ShellExecute16(HWND16,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT16); +HICON16 WINAPI ExtractIcon16(HINSTANCE16,LPCSTR,UINT16); +HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16,LPSTR,LPWORD); +HICON16 WINAPI ExtractIconEx16 ( LPCSTR, INT16, HICON16 *, HICON16 *, UINT16 ); +HINSTANCE16 WINAPI FindExecutable16(LPCSTR,LPCSTR,LPSTR); +HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16,LPCSTR,UINT16,WORD); +BOOL16 WINAPI ShellAbout16(HWND16,LPCSTR,LPCSTR,HICON16); +BOOL16 WINAPI AboutDlgProc16(HWND16,UINT16,WPARAM16,LPARAM); + +inline static BOOL SHELL_OsIsUnicode(void) +{ + /* if high-bit of version is 0, we are emulating NT */ + return !(GetVersion() & 0x80000000); +} + +#define __SHFreeAndNil(ptr) \ + {\ + SHFree(*ptr); \ + *ptr = NULL; \ + }; +inline static void __SHCloneStrA(char ** target,const char * source) +{ + *target = SHAlloc(strlen(source)+1); + strcpy(*target, source); +} + +inline static void __SHCloneStrWtoA(char ** target, const WCHAR * source) +{ + int len = WideCharToMultiByte(CP_ACP, 0, source, -1, NULL, 0, NULL, NULL); + *target = SHAlloc(len); + WideCharToMultiByte(CP_ACP, 0, source, -1, *target, len, NULL, NULL); +} + +inline static void __SHCloneStrW(WCHAR ** target, const WCHAR * source) +{ + *target = SHAlloc( (strlenW(source)+1) * sizeof(WCHAR) ); + strcpyW(*target, source); +} + +inline static WCHAR * __SHCloneStrAtoW(WCHAR ** target, const char * source) +{ + int len = MultiByteToWideChar(CP_ACP, 0, source, -1, NULL, 0); + *target = SHAlloc(len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, source, -1, *target, len); + return *target; +} + +/* handle conversions */ +#define HICON_16(h32) (LOWORD(h32)) +#define HICON_32(h16) ((HICON)(ULONG_PTR)(h16)) +#define HINSTANCE_32(h16) ((HINSTANCE)(ULONG_PTR)(h16)) +#define HINSTANCE_16(h32) (LOWORD(h32)) + +typedef UINT (*SHELL_ExecuteW32)(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, + LPSHELLEXECUTEINFOW sei, LPSHELLEXECUTEINFOW sei_out); + +BOOL WINAPI ShellExecuteExW32(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc); + +UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, + LPWSTR lpResult, int resultLen, LPWSTR key, WCHAR **env, LPITEMIDLIST pidl, LPCWSTR args); + +extern WCHAR swShell32Name[MAX_PATH]; + +/* Default shell folder value registration */ +HRESULT SHELL_RegisterShellFolders(void); + +#endif diff --git a/reactos/lib/shell32/shell32_xx.rc b/reactos/lib/shell32/shell32_xx.rc new file mode 100644 index 00000000000..b99ea36cf70 --- /dev/null +++ b/reactos/lib/shell32/shell32_xx.rc @@ -0,0 +1,20 @@ +/* Language neutral resources. + * Icons and bitmaps should go in here. + * + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/reactos/lib/shell32/shellfolder.h b/reactos/lib/shell32/shellfolder.h new file mode 100644 index 00000000000..ff29841d9d8 --- /dev/null +++ b/reactos/lib/shell32/shellfolder.h @@ -0,0 +1,68 @@ +/* + * defines helperfunctions to manipulate the contents of a IShellFolder + * + * Copyright 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_SHELLFOLDER_HELP_H +#define __WINE_SHELLFOLDER_HELP_H + +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" + +#include "shlobj.h" + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_GUID(IID_ISFHelper, 0x1fe68efbL, 0x1874, 0x9812, 0x56, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); + +/***************************************************************************** + * ISFHelper interface + */ + +#define INTERFACE ISFHelper +DECLARE_INTERFACE_(ISFHelper,IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** ISFHelper methods ***/ + STDMETHOD(GetUniqueName)(THIS_ LPSTR lpName, UINT uLen) PURE; + STDMETHOD(AddFolder)(THIS_ HWND hwnd, LPCSTR lpName, LPITEMIDLIST * ppidlOut) PURE; + STDMETHOD(DeleteItems)(THIS_ UINT cidl, LPCITEMIDLIST * apidl) PURE; + STDMETHOD(CopyItems)(THIS_ IShellFolder * pSFFrom, UINT cidl, LPCITEMIDLIST * apidl) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define ISFHelper_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define ISFHelper_AddRef(p) (p)->lpVtbl->AddRef(p) +#define ISFHelper_Release(p) (p)->lpVtbl->Release(p) +/*** ISFHelper methods ***/ +#define ISFHelper_GetUniqueName(p,a,b) (p)->lpVtbl->GetUniqueName(p,a,b) +#define ISFHelper_AddFolder(p,a,b,c) (p)->lpVtbl->AddFolder(p,a,b,c) +#define ISFHelper_DeleteItems(p,a,b) (p)->lpVtbl->DeleteItems(p,a,b) +#define ISFHelper_CopyItems(p,a,b,c) (p)->lpVtbl->CopyItems(p,a,b,c) +#endif + +#endif /* __WINE_SHELLFOLDER_HELP_H */ diff --git a/reactos/lib/shell32/shelllink.c b/reactos/lib/shell32/shelllink.c new file mode 100644 index 00000000000..fef4152f3c6 --- /dev/null +++ b/reactos/lib/shell32/shelllink.c @@ -0,0 +1,1825 @@ +/* + * + * Copyright 1997 Marcus Meissner + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * NOTES + * Nearly complete informations about the binary formats + * of .lnk files available at http://www.wotsit.org + * + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#include +#include +#ifdef HAVE_SYS_WAIT_H +# include +#endif + +#define COBJMACROS + +#include "wine/debug.h" +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "winreg.h" + +#include "winuser.h" +#include "wingdi.h" +#include "shlobj.h" +#include "undocshell.h" + +#include "pidl.h" +#include "shell32_main.h" +#include "shlguid.h" +#include "shlwapi.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/* link file formats */ + +/* flag1: lnk elements: simple link has 0x0B */ +#define SCF_PIDL 1 +#define SCF_NORMAL 2 +#define SCF_DESCRIPTION 4 +#define SCF_RELATIVE 8 +#define SCF_WORKDIR 0x10 +#define SCF_ARGS 0x20 +#define SCF_CUSTOMICON 0x40 +#define SCF_UNICODE 0x80 + +#include "pshpack1.h" + +typedef struct _LINK_HEADER +{ + DWORD dwSize; /* 0x00 size of the header - 0x4c */ + GUID MagicGuid; /* 0x04 is CLSID_ShellLink */ + DWORD dwFlags; /* 0x14 describes elements following */ + DWORD dwFileAttr; /* 0x18 attributes of the target file */ + FILETIME Time1; /* 0x1c */ + FILETIME Time2; /* 0x24 */ + FILETIME Time3; /* 0x2c */ + DWORD dwFileLength; /* 0x34 File length */ + DWORD nIcon; /* 0x38 icon number */ + DWORD fStartup; /* 0x3c startup type */ + DWORD wHotKey; /* 0x40 hotkey */ + DWORD Unknown5; /* 0x44 */ + DWORD Unknown6; /* 0x48 */ +} LINK_HEADER, * PLINK_HEADER; + +#define SHLINK_LOCAL 0 +#define SHLINK_REMOTE 1 + +typedef struct _LOCATION_INFO +{ + DWORD dwTotalSize; + DWORD dwHeaderSize; + DWORD dwFlags; + DWORD dwVolTableOfs; + DWORD dwLocalPathOfs; + DWORD dwNetworkVolTableOfs; + DWORD dwFinalPathOfs; +} LOCATION_INFO; + +typedef struct _LOCAL_VOLUME_INFO +{ + DWORD dwSize; + DWORD dwType; + DWORD dwVolSerial; + DWORD dwVolLabelOfs; +} LOCAL_VOLUME_INFO; + +#include "poppack.h" + +static IShellLinkAVtbl slvt; +static IShellLinkWVtbl slvtw; +static IPersistFileVtbl pfvt; +static IPersistStreamVtbl psvt; + +/* IShellLink Implementation */ + +typedef struct +{ + IShellLinkAVtbl *lpVtbl; + DWORD ref; + + IShellLinkWVtbl *lpvtblw; + IPersistFileVtbl *lpvtblPersistFile; + IPersistStreamVtbl *lpvtblPersistStream; + + /* data structures according to the informations in the link */ + LPITEMIDLIST pPidl; + WORD wHotKey; + SYSTEMTIME time1; + SYSTEMTIME time2; + SYSTEMTIME time3; + + DWORD iShowCmd; + LPWSTR sIcoPath; + INT iIcoNdx; + LPWSTR sPath; + LPWSTR sArgs; + LPWSTR sWorkDir; + LPWSTR sDescription; + LPWSTR sPathRel; + + BOOL bDirty; +} IShellLinkImpl; + +#define _IShellLinkW_Offset ((int)(&(((IShellLinkImpl*)0)->lpvtblw))) +#define _ICOM_THIS_From_IShellLinkW(class, name) class* This = (class*)(((char*)name)-_IShellLinkW_Offset) + +#define _IPersistFile_Offset ((int)(&(((IShellLinkImpl*)0)->lpvtblPersistFile))) +#define _ICOM_THIS_From_IPersistFile(class, name) class* This = (class*)(((char*)name)-_IPersistFile_Offset) + +#define _IPersistStream_Offset ((int)(&(((IShellLinkImpl*)0)->lpvtblPersistStream))) +#define _ICOM_THIS_From_IPersistStream(class, name) class* This = (class*)(((char*)name)-_IPersistStream_Offset) + +static HRESULT ShellLink_UpdatePath(LPWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath); + +/* strdup on the process heap */ +inline static LPWSTR HEAP_strdupAtoW( HANDLE heap, DWORD flags, LPCSTR str) +{ + INT len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 ); + LPWSTR p = HeapAlloc( heap, flags, len*sizeof (WCHAR) ); + if( !p ) + return p; + MultiByteToWideChar( CP_ACP, 0, str, -1, p, len ); + return p; +} + + +/************************************************************************** + * IPersistFile_QueryInterface + */ +static HRESULT WINAPI IPersistFile_fnQueryInterface( + IPersistFile* iface, + REFIID riid, + LPVOID *ppvObj) +{ + _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); + + TRACE("(%p)\n",This); + + return IShellLinkA_QueryInterface((IShellLinkA*)This, riid, ppvObj); +} + +/****************************************************************************** + * IPersistFile_AddRef + */ +static ULONG WINAPI IPersistFile_fnAddRef(IPersistFile* iface) +{ + _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellLinkA_AddRef((IShellLinkA*)This); +} +/****************************************************************************** + * IPersistFile_Release + */ +static ULONG WINAPI IPersistFile_fnRelease(IPersistFile* iface) +{ + _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellLinkA_Release((IShellLinkA*)This); +} + +static HRESULT WINAPI IPersistFile_fnGetClassID(IPersistFile* iface, CLSID *pClassID) +{ + _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); + FIXME("(%p)\n",This); + return NOERROR; +} +static HRESULT WINAPI IPersistFile_fnIsDirty(IPersistFile* iface) +{ + _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); + + TRACE("(%p)\n",This); + + if (This->bDirty) + return S_OK; + + return S_FALSE; +} +static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFileName, DWORD dwMode) +{ + _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); + IPersistStream *StreamThis = (IPersistStream *)&This->lpvtblPersistStream; + HRESULT r; + IStream *stm; + + TRACE("(%p, %s)\n",This, debugstr_w(pszFileName)); + + r = CreateStreamOnFile(pszFileName, dwMode, &stm); + if( SUCCEEDED( r ) ) + { + r = IPersistStream_Load(StreamThis, stm); + ShellLink_UpdatePath(This->sPathRel, pszFileName, This->sWorkDir, &This->sPath); + IStream_Release( stm ); + This->bDirty = FALSE; + } + + return r; +} + +static BOOL StartLinkProcessor( LPCOLESTR szLink ) +{ + static const WCHAR szFormat[] = {'w','i','n','e','m','e','n','u','b','u','i','l','d','e','r','.','e','x','e', + ' ','-','r',' ','"','%','s','"',0 }; + LONG len; + LPWSTR buffer; + STARTUPINFOW si; + PROCESS_INFORMATION pi; + + len = sizeof(szFormat) + lstrlenW( szLink ) * sizeof(WCHAR); + buffer = HeapAlloc( GetProcessHeap(), 0, len ); + if( !buffer ) + return FALSE; + + wsprintfW( buffer, szFormat, szLink ); + + TRACE("starting %s\n",debugstr_w(buffer)); + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + if (!CreateProcessW( NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) return FALSE; + + /* wait for a while to throttle the creation of linker processes */ + if( WAIT_OBJECT_0 != WaitForSingleObject( pi.hProcess, 10000 ) ) + WARN("Timed out waiting for shell linker\n"); + + CloseHandle( pi.hProcess ); + CloseHandle( pi.hThread ); + + return TRUE; +} + +static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFileName, BOOL fRemember) +{ + _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); + IPersistStream *StreamThis = (IPersistStream *)&This->lpvtblPersistStream; + HRESULT r; + IStream *stm; + + TRACE("(%p)->(%s)\n",This,debugstr_w(pszFileName)); + + if (!pszFileName || !This->sPath) + return E_FAIL; + + r = CreateStreamOnFile(pszFileName, STGM_READWRITE | STGM_CREATE, &stm); + if( SUCCEEDED( r ) ) + { + r = IPersistStream_Save(StreamThis, stm, FALSE); + IStream_Release( stm ); + + if( SUCCEEDED( r ) ) + { + StartLinkProcessor( pszFileName ); + + This->bDirty = FALSE; + } + else + { + DeleteFileW( pszFileName ); + WARN("Failed to create shortcut %s\n", debugstr_w(pszFileName) ); + } + } + + return r; +} + +static HRESULT WINAPI IPersistFile_fnSaveCompleted(IPersistFile* iface, LPCOLESTR pszFileName) +{ + _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); + FIXME("(%p)->(%s)\n",This,debugstr_w(pszFileName)); + return NOERROR; +} +static HRESULT WINAPI IPersistFile_fnGetCurFile(IPersistFile* iface, LPOLESTR *ppszFileName) +{ + _ICOM_THIS_From_IPersistFile(IShellLinkImpl, iface); + FIXME("(%p)\n",This); + return NOERROR; +} + +static IPersistFileVtbl pfvt = +{ + IPersistFile_fnQueryInterface, + IPersistFile_fnAddRef, + IPersistFile_fnRelease, + IPersistFile_fnGetClassID, + IPersistFile_fnIsDirty, + IPersistFile_fnLoad, + IPersistFile_fnSave, + IPersistFile_fnSaveCompleted, + IPersistFile_fnGetCurFile +}; + +/************************************************************************ + * IPersistStream_QueryInterface + */ +static HRESULT WINAPI IPersistStream_fnQueryInterface( + IPersistStream* iface, + REFIID riid, + VOID** ppvoid) +{ + _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface); + + TRACE("(%p)\n",This); + + return IShellLinkA_QueryInterface((IShellLinkA*)This, riid, ppvoid); +} + +/************************************************************************ + * IPersistStream_Release + */ +static ULONG WINAPI IPersistStream_fnRelease( + IPersistStream* iface) +{ + _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface); + + TRACE("(%p)\n",This); + + return IShellLinkA_Release((IShellLinkA*)This); +} + +/************************************************************************ + * IPersistStream_AddRef + */ +static ULONG WINAPI IPersistStream_fnAddRef( + IPersistStream* iface) +{ + _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface); + + TRACE("(%p)\n",This); + + return IShellLinkA_AddRef((IShellLinkA*)This); +} + +/************************************************************************ + * IPersistStream_GetClassID + * + */ +static HRESULT WINAPI IPersistStream_fnGetClassID( + IPersistStream* iface, + CLSID* pClassID) +{ + _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface); + + TRACE("(%p)\n", This); + + if (pClassID==0) + return E_POINTER; + +/* memcpy(pClassID, &CLSID_???, sizeof(CLSID_???)); */ + + return S_OK; +} + +/************************************************************************ + * IPersistStream_IsDirty (IPersistStream) + */ +static HRESULT WINAPI IPersistStream_fnIsDirty( + IPersistStream* iface) +{ + _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface); + + TRACE("(%p)\n", This); + + return S_OK; +} + + +static HRESULT Stream_LoadString( IStream* stm, BOOL unicode, LPWSTR *pstr ) +{ + DWORD count; + USHORT len; + LPVOID temp; + LPWSTR str; + HRESULT r; + + TRACE("%p\n", stm); + + count = 0; + r = IStream_Read(stm, &len, sizeof(len), &count); + if ( FAILED (r) || ( count != sizeof(len) ) ) + return E_FAIL; + + if( unicode ) + len *= sizeof (WCHAR); + + TRACE("reading %d\n", len); + temp = HeapAlloc(GetProcessHeap(), 0, len+sizeof(WCHAR)); + if( !temp ) + return E_OUTOFMEMORY; + count = 0; + r = IStream_Read(stm, temp, len, &count); + if( FAILED (r) || ( count != len ) ) + { + HeapFree( GetProcessHeap(), 0, temp ); + return E_FAIL; + } + + TRACE("read %s\n", debugstr_an(temp,len)); + + /* convert to unicode if necessary */ + if( !unicode ) + { + count = MultiByteToWideChar( CP_ACP, 0, (LPSTR) temp, len, NULL, 0 ); + str = HeapAlloc( GetProcessHeap(), 0, (count+1)*sizeof (WCHAR) ); + if( str ) + MultiByteToWideChar( CP_ACP, 0, (LPSTR) temp, len, str, count ); + HeapFree( GetProcessHeap(), 0, temp ); + } + else + { + count /= 2; + str = (LPWSTR) temp; + } + str[count] = 0; + + *pstr = str; + + return S_OK; +} + +static HRESULT Stream_LoadLocation( IStream* stm ) +{ + DWORD size; + ULONG count; + HRESULT r; + LOCATION_INFO *loc; + + TRACE("%p\n",stm); + + r = IStream_Read( stm, &size, sizeof(size), &count ); + if( FAILED( r ) ) + return r; + if( count != sizeof(loc->dwTotalSize) ) + return E_FAIL; + + loc = HeapAlloc( GetProcessHeap(), 0, size ); + if( ! loc ) + return E_OUTOFMEMORY; + + r = IStream_Read( stm, &loc->dwHeaderSize, size-sizeof(size), &count ); + if( FAILED( r ) ) + goto end; + if( count != (size - sizeof(size)) ) + { + r = E_FAIL; + goto end; + } + loc->dwTotalSize = size; + + TRACE("Read %ld bytes\n",count); + + /* FIXME: do something useful with it */ + HeapFree( GetProcessHeap(), 0, loc ); + + return S_OK; +end: + HeapFree( GetProcessHeap(), 0, loc ); + return r; +} + +/************************************************************************ + * IPersistStream_Load (IPersistStream) + */ +static HRESULT WINAPI IPersistStream_fnLoad( + IPersistStream* iface, + IStream* stm) +{ + LINK_HEADER hdr; + ULONG dwBytesRead; + BOOL unicode; + WCHAR sTemp[MAX_PATH]; + HRESULT r; + + _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface); + + TRACE("(%p)(%p)\n", This, stm); + + if( !stm ) + return STG_E_INVALIDPOINTER; + + dwBytesRead = 0; + r = IStream_Read(stm, &hdr, sizeof(hdr), &dwBytesRead); + if( FAILED( r ) ) + return r; + + if( dwBytesRead != sizeof(hdr)) + return E_FAIL; + if( hdr.dwSize != sizeof(hdr)) + return E_FAIL; + if( !IsEqualIID(&hdr.MagicGuid, &CLSID_ShellLink) ) + return E_FAIL; + + /* if( hdr.dwFlags & SCF_PIDL ) */ /* FIXME: seems to always have a PIDL */ + { + r = ILLoadFromStream( stm, &This->pPidl ); + if( FAILED( r ) ) + return r; + } + This->wHotKey = (WORD)hdr.wHotKey; + This->iIcoNdx = hdr.nIcon; + FileTimeToSystemTime (&hdr.Time1, &This->time1); + FileTimeToSystemTime (&hdr.Time2, &This->time2); + FileTimeToSystemTime (&hdr.Time3, &This->time3); +#if 1 + GetDateFormatW(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&This->time1, NULL, sTemp, 256); + TRACE("-- time1: %s\n", debugstr_w(sTemp) ); + GetDateFormatW(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&This->time2, NULL, sTemp, 256); + TRACE("-- time1: %s\n", debugstr_w(sTemp) ); + GetDateFormatW(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&This->time3, NULL, sTemp, 256); + TRACE("-- time1: %s\n", debugstr_w(sTemp) ); + pdump (This->pPidl); +#endif + if( hdr.dwFlags & SCF_NORMAL ) + r = Stream_LoadLocation( stm ); + if( FAILED( r ) ) + goto end; + unicode = hdr.dwFlags & SCF_UNICODE; + if( hdr.dwFlags & SCF_DESCRIPTION ) + { + r = Stream_LoadString( stm, unicode, &This->sDescription ); + TRACE("Description -> %s\n",debugstr_w(This->sDescription)); + } + if( FAILED( r ) ) + goto end; + + if( hdr.dwFlags & SCF_RELATIVE ) + { + r = Stream_LoadString( stm, unicode, &This->sPathRel ); + TRACE("Relative Path-> %s\n",debugstr_w(This->sPathRel)); + } + if( FAILED( r ) ) + goto end; + + if( hdr.dwFlags & SCF_WORKDIR ) + { + r = Stream_LoadString( stm, unicode, &This->sWorkDir ); + TRACE("Working Dir -> %s\n",debugstr_w(This->sWorkDir)); + } + if( FAILED( r ) ) + goto end; + + if( hdr.dwFlags & SCF_ARGS ) + { + r = Stream_LoadString( stm, unicode, &This->sArgs ); + TRACE("Working Dir -> %s\n",debugstr_w(This->sArgs)); + } + if( FAILED( r ) ) + goto end; + + if( hdr.dwFlags & SCF_CUSTOMICON ) + { + r = Stream_LoadString( stm, unicode, &This->sIcoPath ); + TRACE("Icon file -> %s\n",debugstr_w(This->sIcoPath)); + } + if( FAILED( r ) ) + goto end; + + TRACE("OK\n"); + + pdump (This->pPidl); + + return S_OK; +end: + return r; +} + +/************************************************************************ + * Stream_WriteString + * + * Helper function for IPersistStream_Save. Writes a unicode string + * with terminating nul byte to a stream, preceded by the its length. + */ +static HRESULT Stream_WriteString( IStream* stm, LPCWSTR str ) +{ + USHORT len = lstrlenW( str ) + 1; + DWORD count; + HRESULT r; + + r = IStream_Write( stm, &len, sizeof(len), &count ); + if( FAILED( r ) ) + return r; + + len *= sizeof(WCHAR); + + r = IStream_Write( stm, str, len, &count ); + if( FAILED( r ) ) + return r; + + return S_OK; +} + +static HRESULT Stream_WriteLocationInfo( IStream* stm, LPCWSTR filename ) +{ + LOCATION_INFO loc; + ULONG count; + + FIXME("writing empty location info\n"); + + memset( &loc, 0, sizeof(loc) ); + loc.dwTotalSize = sizeof(loc) - sizeof(loc.dwTotalSize); + + /* FIXME: fill this in */ + + return IStream_Write( stm, &loc, loc.dwTotalSize, &count ); +} + +/************************************************************************ + * IPersistStream_Save (IPersistStream) + * + * FIXME: makes assumptions about byte order + */ +static HRESULT WINAPI IPersistStream_fnSave( + IPersistStream* iface, + IStream* stm, + BOOL fClearDirty) +{ + static const WCHAR wOpen[] = {'o','p','e','n',0}; + + LINK_HEADER header; + WCHAR exePath[MAX_PATH]; + ULONG count; + HRESULT r; + + _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface); + + TRACE("(%p) %p %x\n", This, stm, fClearDirty); + + *exePath = '\0'; + + if (This->sPath) + { + SHELL_FindExecutable(NULL, This->sPath, wOpen, exePath, MAX_PATH, NULL, NULL, NULL, NULL); + /* + * windows can create lnk files to executables that do not exist yet + * so if the executable does not exist the just trust the path they + * gave us + */ + if( !*exePath ) strcpyW(exePath,This->sPath); + } + + /* if there's no PIDL, generate one */ + if( ! This->pPidl ) This->pPidl = ILCreateFromPathW(exePath); + + memset(&header, 0, sizeof(header)); + header.dwSize = sizeof(header); + memcpy(&header.MagicGuid, &CLSID_ShellLink, sizeof(header.MagicGuid) ); + + header.wHotKey = This->wHotKey; + header.nIcon = This->iIcoNdx; + header.dwFlags = SCF_UNICODE; /* strings are in unicode */ + header.dwFlags |= SCF_NORMAL; /* how do we determine this ? */ + if( This->pPidl ) + header.dwFlags |= SCF_PIDL; + if( This->sDescription ) + header.dwFlags |= SCF_DESCRIPTION; + if( This->sWorkDir ) + header.dwFlags |= SCF_WORKDIR; + if( This->sArgs ) + header.dwFlags |= SCF_ARGS; + if( This->sIcoPath ) + header.dwFlags |= SCF_CUSTOMICON; + + SystemTimeToFileTime ( &This->time1, &header.Time1 ); + SystemTimeToFileTime ( &This->time2, &header.Time2 ); + SystemTimeToFileTime ( &This->time3, &header.Time3 ); + + /* write the Shortcut header */ + r = IStream_Write( stm, &header, sizeof(header), &count ); + if( FAILED( r ) ) + { + ERR("Write failed at %d\n",__LINE__); + return r; + } + + TRACE("Writing pidl \n"); + + /* write the PIDL to the shortcut */ + if( This->pPidl ) + { + r = ILSaveToStream( stm, This->pPidl ); + if( FAILED( r ) ) + { + ERR("Failed to write PIDL at %d\n",__LINE__); + return r; + } + } + + Stream_WriteLocationInfo( stm, exePath ); + + TRACE("Description = %s\n", debugstr_w(This->sDescription)); + if( This->sDescription ) + r = Stream_WriteString( stm, This->sDescription ); + + if( This->sPathRel ) + r = Stream_WriteString( stm, This->sPathRel ); + + if( This->sWorkDir ) + r = Stream_WriteString( stm, This->sWorkDir ); + + if( This->sArgs ) + r = Stream_WriteString( stm, This->sArgs ); + + if( This->sIcoPath ) + r = Stream_WriteString( stm, This->sIcoPath ); + + return S_OK; +} + +/************************************************************************ + * IPersistStream_GetSizeMax (IPersistStream) + */ +static HRESULT WINAPI IPersistStream_fnGetSizeMax( + IPersistStream* iface, + ULARGE_INTEGER* pcbSize) +{ + _ICOM_THIS_From_IPersistStream(IShellLinkImpl, iface); + + TRACE("(%p)\n", This); + + return E_NOTIMPL; +} + +static IPersistStreamVtbl psvt = +{ + IPersistStream_fnQueryInterface, + IPersistStream_fnAddRef, + IPersistStream_fnRelease, + IPersistStream_fnGetClassID, + IPersistStream_fnIsDirty, + IPersistStream_fnLoad, + IPersistStream_fnSave, + IPersistStream_fnGetSizeMax +}; + +/************************************************************************** + * IShellLink_Constructor + */ +HRESULT WINAPI IShellLink_Constructor ( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + IShellLinkImpl * sl; + + TRACE("unkOut=%p riid=%s\n",pUnkOuter, debugstr_guid(riid)); + + *ppv = NULL; + + if(pUnkOuter) return CLASS_E_NOAGGREGATION; + sl = (IShellLinkImpl *) LocalAlloc(GMEM_ZEROINIT,sizeof(IShellLinkImpl)); + if (!sl) return E_OUTOFMEMORY; + + sl->ref = 1; + sl->lpVtbl = &slvt; + sl->lpvtblw = &slvtw; + sl->lpvtblPersistFile = &pfvt; + sl->lpvtblPersistStream = &psvt; + sl->iShowCmd = SW_SHOWNORMAL; + sl->bDirty = FALSE; + + TRACE("(%p)->()\n",sl); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IShellLinkA)) + *ppv = sl; + else if (IsEqualIID(riid, &IID_IShellLinkW)) + *ppv = &(sl->lpvtblw); + else { + LocalFree((HLOCAL)sl); + ERR("E_NOINTERFACE\n"); + return E_NOINTERFACE; + } + + return S_OK; +} + + +static BOOL SHELL_ExistsFileW(LPCWSTR path) +{ + HANDLE hfile = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + + if (hfile != INVALID_HANDLE_VALUE) { + CloseHandle(hfile); + return TRUE; + } else + return FALSE; +} + +/************************************************************************** + * ShellLink_UpdatePath + * update absolute path in sPath using relative path in sPathRel + */ +static HRESULT ShellLink_UpdatePath(LPWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath) +{ + if (!path || !psPath) + return E_INVALIDARG; + + if (!*psPath && sPathRel) { + WCHAR buffer[2*MAX_PATH], abs_path[2*MAX_PATH]; + LPWSTR final = NULL; + + /* first try if [directory of link file] + [relative path] finds an existing file */ + + GetFullPathNameW( path, MAX_PATH*2, buffer, &final ); + if( !final ) + final = buffer; + lstrcpyW(final, sPathRel); + + *abs_path = '\0'; + + if (SHELL_ExistsFileW(buffer)) { + if (!GetFullPathNameW(buffer, MAX_PATH, abs_path, &final)) + lstrcpyW(abs_path, buffer); + } else { + /* try if [working directory] + [relative path] finds an existing file */ + if (sWorkDir) { + lstrcpyW(buffer, sWorkDir); + lstrcpyW(PathAddBackslashW(buffer), sPathRel); + + if (SHELL_ExistsFileW(buffer)) + if (!GetFullPathNameW(buffer, MAX_PATH, abs_path, &final)) + lstrcpyW(abs_path, buffer); + } + } + + /* FIXME: This is even not enough - not all shell links can be resolved using this algorithm. */ + if (!*abs_path) + lstrcpyW(abs_path, sPathRel); + + *psPath = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(abs_path)+1)*sizeof(WCHAR)); + if (!*psPath) + return E_OUTOFMEMORY; + + lstrcpyW(*psPath, abs_path); + } + + return S_OK; +} + +/************************************************************************** + * IShellLink_ConstructFromFile + */ +HRESULT WINAPI IShellLink_ConstructFromFile ( + IUnknown* pUnkOuter, + REFIID riid, + LPCITEMIDLIST pidl, + LPVOID* ppv +) +{ + IShellLinkW* psl; + + HRESULT hr = IShellLink_Constructor(NULL, riid, (LPVOID*)&psl); + + if (SUCCEEDED(hr)) { + IPersistFile* ppf; + + *ppv = NULL; + + hr = IShellLinkW_QueryInterface(psl, &IID_IPersistFile, (LPVOID*)&ppf); + + if (SUCCEEDED(hr)) { + WCHAR path[MAX_PATH]; + + if (SHGetPathFromIDListW(pidl, path)) + hr = IPersistFile_Load(ppf, path, 0); + else + hr = E_FAIL; + + if (SUCCEEDED(hr)) + *ppv = (IUnknown*) psl; + + IPersistFile_Release(ppf); + } + + if (!*ppv) + IShellLinkW_Release(psl); + } + + return hr; +} + +/************************************************************************** + * IShellLinkA_QueryInterface + */ +static HRESULT WINAPI IShellLinkA_fnQueryInterface( IShellLinkA * iface, REFIID riid, LPVOID *ppvObj) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(\n\tIID:\t%s)\n",This,debugstr_guid(riid)); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IShellLinkA)) + { + *ppvObj = This; + } + else if(IsEqualIID(riid, &IID_IShellLinkW)) + { + *ppvObj = (IShellLinkW *)&(This->lpvtblw); + } + else if(IsEqualIID(riid, &IID_IPersistFile)) + { + *ppvObj = (IPersistFile *)&(This->lpvtblPersistFile); + } + else if(IsEqualIID(riid, &IID_IPersistStream)) + { + *ppvObj = (IPersistStream *)&(This->lpvtblPersistStream); + } + + if(*ppvObj) + { + IUnknown_AddRef((IUnknown*)(*ppvObj)); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} +/****************************************************************************** + * IShellLinkA_AddRef + */ +static ULONG WINAPI IShellLinkA_fnAddRef(IShellLinkA * iface) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return ++(This->ref); +} +/****************************************************************************** + * IShellLinkA_Release + */ +static ULONG WINAPI IShellLinkA_fnRelease(IShellLinkA * iface) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + if (--(This->ref)) + return This->ref; + + TRACE("-- destroying IShellLink(%p)\n",This); + + if (This->sIcoPath) + HeapFree(GetProcessHeap(), 0, This->sIcoPath); + + if (This->sArgs) + HeapFree(GetProcessHeap(), 0, This->sArgs); + + if (This->sWorkDir) + HeapFree(GetProcessHeap(), 0, This->sWorkDir); + + if (This->sDescription) + HeapFree(GetProcessHeap(), 0, This->sDescription); + + if (This->sPath) + HeapFree(GetProcessHeap(),0,This->sPath); + + if (This->pPidl) + ILFree(This->pPidl); + + LocalFree((HANDLE)This); + + return 0; +} + +static HRESULT WINAPI IShellLinkA_fnGetPath(IShellLinkA * iface, LPSTR pszFile, + INT cchMaxPath, WIN32_FIND_DATAA *pfd, DWORD fFlags) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%lu)(%s)\n", + This, pszFile, cchMaxPath, pfd, fFlags, debugstr_w(This->sPath)); + + if( cchMaxPath ) + pszFile[0] = 0; + if (This->sPath) + WideCharToMultiByte( CP_ACP, 0, This->sPath, -1, + pszFile, cchMaxPath, NULL, NULL); + + if (pfd) FIXME("(%p): WIN32_FIND_DATA is not yet filled.\n", This); + + return NOERROR; +} + +static HRESULT WINAPI IShellLinkA_fnGetIDList(IShellLinkA * iface, LPITEMIDLIST * ppidl) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(ppidl=%p)\n",This, ppidl); + + *ppidl = ILClone(This->pPidl); + + return NOERROR; +} + +static HRESULT WINAPI IShellLinkA_fnSetIDList(IShellLinkA * iface, LPCITEMIDLIST pidl) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(pidl=%p)\n",This, pidl); + + if (This->pPidl) + ILFree(This->pPidl); + This->pPidl = ILClone (pidl); + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnGetDescription(IShellLinkA * iface, LPSTR pszName,INT cchMaxName) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(%p len=%u)\n",This, pszName, cchMaxName); + + if( cchMaxName ) + pszName[0] = 0; + if( This->sDescription ) + WideCharToMultiByte( CP_ACP, 0, This->sDescription, -1, + pszName, cchMaxName, NULL, NULL); + + return S_OK; +} +static HRESULT WINAPI IShellLinkA_fnSetDescription(IShellLinkA * iface, LPCSTR pszName) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(pName=%s)\n", This, pszName); + + if (This->sDescription) + HeapFree(GetProcessHeap(), 0, This->sDescription); + This->sDescription = HEAP_strdupAtoW( GetProcessHeap(), 0, pszName); + if ( !This->sDescription ) + return E_OUTOFMEMORY; + + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnGetWorkingDirectory(IShellLinkA * iface, LPSTR pszDir,INT cchMaxPath) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(%p len=%u)\n", This, pszDir, cchMaxPath); + + if( cchMaxPath ) + pszDir[0] = 0; + if( This->sWorkDir ) + WideCharToMultiByte( CP_ACP, 0, This->sWorkDir, -1, + pszDir, cchMaxPath, NULL, NULL); + + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnSetWorkingDirectory(IShellLinkA * iface, LPCSTR pszDir) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(dir=%s)\n",This, pszDir); + + if (This->sWorkDir) + HeapFree(GetProcessHeap(), 0, This->sWorkDir); + This->sWorkDir = HEAP_strdupAtoW( GetProcessHeap(), 0, pszDir); + if ( !This->sWorkDir ) + return E_OUTOFMEMORY; + + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnGetArguments(IShellLinkA * iface, LPSTR pszArgs,INT cchMaxPath) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(%p len=%u)\n", This, pszArgs, cchMaxPath); + + if( cchMaxPath ) + pszArgs[0] = 0; + if( This->sArgs ) + WideCharToMultiByte( CP_ACP, 0, This->sArgs, -1, + pszArgs, cchMaxPath, NULL, NULL); + + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnSetArguments(IShellLinkA * iface, LPCSTR pszArgs) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(args=%s)\n",This, pszArgs); + + if (This->sArgs) + HeapFree(GetProcessHeap(), 0, This->sArgs); + This->sArgs = HEAP_strdupAtoW( GetProcessHeap(), 0, pszArgs); + if( !This->sArgs ) + return E_OUTOFMEMORY; + + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnGetHotkey(IShellLinkA * iface, WORD *pwHotkey) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(%p)(0x%08x)\n",This, pwHotkey, This->wHotKey); + + *pwHotkey = This->wHotKey; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnSetHotkey(IShellLinkA * iface, WORD wHotkey) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(hotkey=%x)\n",This, wHotkey); + + This->wHotKey = wHotkey; + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnGetShowCmd(IShellLinkA * iface, INT *piShowCmd) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(%p)\n",This, piShowCmd); + *piShowCmd = This->iShowCmd; + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnSetShowCmd(IShellLinkA * iface, INT iShowCmd) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p) %d\n",This, iShowCmd); + + This->iShowCmd = iShowCmd; + This->bDirty = TRUE; + + return NOERROR; +} + +static HRESULT SHELL_PidlGeticonLocationA(IShellFolder* psf, LPITEMIDLIST pidl, LPSTR pszIconPath, int cchIconPath, int* piIcon) +{ + LPCITEMIDLIST pidlLast; + + HRESULT hr = SHBindToParent(pidl, &IID_IShellFolder, (LPVOID*)&psf, &pidlLast); + + if (SUCCEEDED(hr)) { + IExtractIconA* pei; + + hr = IShellFolder_GetUIObjectOf(psf, 0, 1, (LPCITEMIDLIST*)&pidlLast, &IID_IExtractIconA, NULL, (LPVOID*)&pei); + + if (SUCCEEDED(hr)) { + hr = IExtractIconA_GetIconLocation(pei, 0, pszIconPath, MAX_PATH, piIcon, NULL); + + IExtractIconA_Release(pei); + } + + IShellFolder_Release(psf); + } + + return hr; +} + +static HRESULT WINAPI IShellLinkA_fnGetIconLocation(IShellLinkA * iface, LPSTR pszIconPath,INT cchIconPath,INT *piIcon) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(%p len=%u iicon=%p)\n", This, pszIconPath, cchIconPath, piIcon); + + if (cchIconPath) + pszIconPath[0] = 0; + + if (This->sIcoPath) { + WideCharToMultiByte(CP_ACP, 0, This->sIcoPath, -1, pszIconPath, cchIconPath, NULL, NULL); + *piIcon = This->iIcoNdx; + return S_OK; + } + + if (This->pPidl || This->sPath) { + IShellFolder* pdsk; + + HRESULT hr = SHGetDesktopFolder(&pdsk); + + if (SUCCEEDED(hr)) { + /* first look for an icon using the PIDL (if present) */ + if (This->pPidl) + hr = SHELL_PidlGeticonLocationA(pdsk, This->pPidl, pszIconPath, cchIconPath, piIcon); + else + hr = E_FAIL; + + /* if we couldn't find an icon yet, look for it using the file system path */ + if (FAILED(hr) && This->sPath) { + LPITEMIDLIST pidl; + + hr = IShellFolder_ParseDisplayName(pdsk, 0, NULL, This->sPath, NULL, &pidl, NULL); + + if (SUCCEEDED(hr)) { + hr = SHELL_PidlGeticonLocationA(pdsk, pidl, pszIconPath, cchIconPath, piIcon); + + SHFree(pidl); + } + } + + IShellFolder_Release(pdsk); + } + + return hr; + } else + return E_FAIL; +} + +static HRESULT WINAPI IShellLinkA_fnSetIconLocation(IShellLinkA * iface, LPCSTR pszIconPath,INT iIcon) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + TRACE("(%p)->(path=%s iicon=%u)\n",This, pszIconPath, iIcon); + + if (This->sIcoPath) + HeapFree(GetProcessHeap(), 0, This->sIcoPath); + This->sIcoPath = HEAP_strdupAtoW(GetProcessHeap(), 0, pszIconPath); + if ( !This->sIcoPath ) + return E_OUTOFMEMORY; + + This->iIcoNdx = iIcon; + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkA_fnSetRelativePath(IShellLinkA * iface, LPCSTR pszPathRel, DWORD dwReserved) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + FIXME("(%p)->(path=%s %lx)\n",This, pszPathRel, dwReserved); + + if (This->sPathRel) + HeapFree(GetProcessHeap(), 0, This->sPathRel); + This->sPathRel = HEAP_strdupAtoW(GetProcessHeap(), 0, pszPathRel); + This->bDirty = TRUE; + + return ShellLink_UpdatePath(This->sPathRel, This->sPath, This->sWorkDir, &This->sPath); +} + +static HRESULT WINAPI IShellLinkA_fnResolve(IShellLinkA * iface, HWND hwnd, DWORD fFlags) +{ + HRESULT hr = S_OK; + + IShellLinkImpl *This = (IShellLinkImpl *)iface; + + FIXME("(%p)->(hwnd=%p flags=%lx)\n",This, hwnd, fFlags); + + /*FIXME: use IResolveShellLink interface */ + + if (!This->sPath && This->pPidl) { + WCHAR buffer[MAX_PATH]; + + hr = SHELL_GetPathFromIDListW(This->pPidl, buffer, MAX_PATH); + + if (SUCCEEDED(hr) && *buffer) { + This->sPath = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, (lstrlenW(buffer)+1)*sizeof(WCHAR)); + if (!This->sPath) + return E_OUTOFMEMORY; + + lstrcpyW(This->sPath, buffer); + + This->bDirty = TRUE; + } else + hr = S_OK; /* don't report an error occurred while just caching information */ + } + + if (!This->sIcoPath && This->sPath) { + This->sIcoPath = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, (lstrlenW(This->sPath)+1)*sizeof(WCHAR)); + if (!This->sIcoPath) + return E_OUTOFMEMORY; + + lstrcpyW(This->sIcoPath, This->sPath); + This->iIcoNdx = 0; + + This->bDirty = TRUE; + } + + return hr; +} + +static HRESULT WINAPI IShellLinkA_fnSetPath(IShellLinkA * iface, LPCSTR pszFile) +{ + IShellLinkImpl *This = (IShellLinkImpl *)iface; + char buffer[MAX_PATH]; + LPSTR fname; + + TRACE("(%p)->(path=%s)\n",This, pszFile); + + if (!GetFullPathNameA(pszFile, MAX_PATH, buffer, &fname)) + return E_FAIL; + + if (This->sPath) + HeapFree(GetProcessHeap(), 0, This->sPath); + + This->sPath = HEAP_strdupAtoW(GetProcessHeap(), 0, buffer); + if( !This->sPath ) + return E_OUTOFMEMORY; + + This->bDirty = TRUE; + + return S_OK; +} + +/************************************************************************** +* IShellLink Implementation +*/ + +static IShellLinkAVtbl slvt = +{ + IShellLinkA_fnQueryInterface, + IShellLinkA_fnAddRef, + IShellLinkA_fnRelease, + IShellLinkA_fnGetPath, + IShellLinkA_fnGetIDList, + IShellLinkA_fnSetIDList, + IShellLinkA_fnGetDescription, + IShellLinkA_fnSetDescription, + IShellLinkA_fnGetWorkingDirectory, + IShellLinkA_fnSetWorkingDirectory, + IShellLinkA_fnGetArguments, + IShellLinkA_fnSetArguments, + IShellLinkA_fnGetHotkey, + IShellLinkA_fnSetHotkey, + IShellLinkA_fnGetShowCmd, + IShellLinkA_fnSetShowCmd, + IShellLinkA_fnGetIconLocation, + IShellLinkA_fnSetIconLocation, + IShellLinkA_fnSetRelativePath, + IShellLinkA_fnResolve, + IShellLinkA_fnSetPath +}; + + +/************************************************************************** + * IShellLinkW_fnQueryInterface + */ +static HRESULT WINAPI IShellLinkW_fnQueryInterface( + IShellLinkW * iface, REFIID riid, LPVOID *ppvObj) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + return IShellLinkA_QueryInterface((IShellLinkA*)This, riid, ppvObj); +} + +/****************************************************************************** + * IShellLinkW_fnAddRef + */ +static ULONG WINAPI IShellLinkW_fnAddRef(IShellLinkW * iface) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellLinkA_AddRef((IShellLinkA*)This); +} +/****************************************************************************** + * IShellLinkW_fnRelease + */ + +static ULONG WINAPI IShellLinkW_fnRelease(IShellLinkW * iface) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellLinkA_Release((IShellLinkA*)This); +} + +static HRESULT WINAPI IShellLinkW_fnGetPath(IShellLinkW * iface, LPWSTR pszFile,INT cchMaxPath, WIN32_FIND_DATAW *pfd, DWORD fFlags) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%lu)\n", + This, pszFile, cchMaxPath, pfd, fFlags); + + if( cchMaxPath ) + pszFile[0] = 0; + if( This->sPath ) + lstrcpynW( pszFile, This->sPath, cchMaxPath ); + + if (pfd) FIXME("(%p): WIN32_FIND_DATA is not yet filled.\n", This); + + return NOERROR; +} + +static HRESULT WINAPI IShellLinkW_fnGetIDList(IShellLinkW * iface, LPITEMIDLIST * ppidl) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(ppidl=%p)\n",This, ppidl); + + if( This->pPidl) + *ppidl = ILClone( This->pPidl ); + else + *ppidl = NULL; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnSetIDList(IShellLinkW * iface, LPCITEMIDLIST pidl) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(pidl=%p)\n",This, pidl); + + if( This->pPidl ) + ILFree( This->pPidl ); + This->pPidl = ILClone( pidl ); + if( !This->pPidl ) + return E_FAIL; + + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnGetDescription(IShellLinkW * iface, LPWSTR pszName,INT cchMaxName) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(%p len=%u)\n",This, pszName, cchMaxName); + + if( cchMaxName ) + pszName[0] = 0; + if( This->sDescription ) + lstrcpynW( pszName, This->sDescription, cchMaxName ); + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnSetDescription(IShellLinkW * iface, LPCWSTR pszName) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(desc=%s)\n",This, debugstr_w(pszName)); + + if (This->sDescription) + HeapFree(GetProcessHeap(), 0, This->sDescription); + This->sDescription = HeapAlloc( GetProcessHeap(), 0, + (lstrlenW( pszName )+1)*sizeof(WCHAR) ); + if ( !This->sDescription ) + return E_OUTOFMEMORY; + + lstrcpyW( This->sDescription, pszName ); + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnGetWorkingDirectory(IShellLinkW * iface, LPWSTR pszDir,INT cchMaxPath) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(%p len %u)\n", This, pszDir, cchMaxPath); + + if( cchMaxPath ) + pszDir[0] = 0; + if( This->sWorkDir ) + lstrcpynW( pszDir, This->sWorkDir, cchMaxPath ); + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnSetWorkingDirectory(IShellLinkW * iface, LPCWSTR pszDir) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(dir=%s)\n",This, debugstr_w(pszDir)); + + if (This->sWorkDir) + HeapFree(GetProcessHeap(), 0, This->sWorkDir); + This->sWorkDir = HeapAlloc( GetProcessHeap(), 0, + (lstrlenW( pszDir )+1)*sizeof (WCHAR) ); + if ( !This->sWorkDir ) + return E_OUTOFMEMORY; + lstrcpyW( This->sWorkDir, pszDir ); + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnGetArguments(IShellLinkW * iface, LPWSTR pszArgs,INT cchMaxPath) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(%p len=%u)\n", This, pszArgs, cchMaxPath); + + if( cchMaxPath ) + pszArgs[0] = 0; + if( This->sArgs ) + lstrcpynW( pszArgs, This->sArgs, cchMaxPath ); + + return NOERROR; +} + +static HRESULT WINAPI IShellLinkW_fnSetArguments(IShellLinkW * iface, LPCWSTR pszArgs) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(args=%s)\n",This, debugstr_w(pszArgs)); + + if (This->sArgs) + HeapFree(GetProcessHeap(), 0, This->sArgs); + This->sArgs = HeapAlloc( GetProcessHeap(), 0, + (lstrlenW( pszArgs )+1)*sizeof (WCHAR) ); + if ( !This->sArgs ) + return E_OUTOFMEMORY; + lstrcpyW( This->sArgs, pszArgs ); + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnGetHotkey(IShellLinkW * iface, WORD *pwHotkey) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(%p)\n",This, pwHotkey); + + *pwHotkey=This->wHotKey; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnSetHotkey(IShellLinkW * iface, WORD wHotkey) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(hotkey=%x)\n",This, wHotkey); + + This->wHotKey = wHotkey; + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnGetShowCmd(IShellLinkW * iface, INT *piShowCmd) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(%p)\n",This, piShowCmd); + + *piShowCmd = This->iShowCmd; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnSetShowCmd(IShellLinkW * iface, INT iShowCmd) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + This->iShowCmd = iShowCmd; + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT SHELL_PidlGeticonLocationW(IShellFolder* psf, LPITEMIDLIST pidl, LPWSTR pszIconPath, int cchIconPath, int* piIcon) +{ + LPCITEMIDLIST pidlLast; + + HRESULT hr = SHBindToParent(pidl, &IID_IShellFolder, (LPVOID*)&psf, &pidlLast); + + if (SUCCEEDED(hr)) { + IExtractIconW* pei; + + hr = IShellFolder_GetUIObjectOf(psf, 0, 1, (LPCITEMIDLIST*)&pidlLast, &IID_IExtractIconW, NULL, (LPVOID*)&pei); + + if (SUCCEEDED(hr)) { + hr = IExtractIconW_GetIconLocation(pei, 0, pszIconPath, MAX_PATH, piIcon, NULL); + + IExtractIconW_Release(pei); + } + + IShellFolder_Release(psf); + } + + return hr; +} + +static HRESULT WINAPI IShellLinkW_fnGetIconLocation(IShellLinkW * iface, LPWSTR pszIconPath,INT cchIconPath,INT *piIcon) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(%p len=%u iicon=%p)\n", This, pszIconPath, cchIconPath, piIcon); + + if (cchIconPath) + pszIconPath[0] = 0; + + if (This->sIcoPath) { + lstrcpynW(pszIconPath, This->sIcoPath, cchIconPath); + *piIcon = This->iIcoNdx; + return S_OK; + } + + if (This->pPidl || This->sPath) { + IShellFolder* pdsk; + + HRESULT hr = SHGetDesktopFolder(&pdsk); + + if (SUCCEEDED(hr)) { + /* first look for an icon using the PIDL (if present) */ + if (This->pPidl) + hr = SHELL_PidlGeticonLocationW(pdsk, This->pPidl, pszIconPath, cchIconPath, piIcon); + else + hr = E_FAIL; + + /* if we couldn't find an icon yet, look for it using the file system path */ + if (FAILED(hr) && This->sPath) { + LPITEMIDLIST pidl; + + hr = IShellFolder_ParseDisplayName(pdsk, 0, NULL, This->sPath, NULL, &pidl, NULL); + + if (SUCCEEDED(hr)) { + hr = SHELL_PidlGeticonLocationW(pdsk, pidl, pszIconPath, cchIconPath, piIcon); + + SHFree(pidl); + } + } + + IShellFolder_Release(pdsk); + } + + return hr; + } else + return E_FAIL; +} + +static HRESULT WINAPI IShellLinkW_fnSetIconLocation(IShellLinkW * iface, LPCWSTR pszIconPath,INT iIcon) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(path=%s iicon=%u)\n",This, debugstr_w(pszIconPath), iIcon); + + if (This->sIcoPath) + HeapFree(GetProcessHeap(), 0, This->sIcoPath); + This->sIcoPath = HeapAlloc( GetProcessHeap(), 0, + (lstrlenW( pszIconPath )+1)*sizeof (WCHAR) ); + if ( !This->sIcoPath ) + return E_OUTOFMEMORY; + lstrcpyW( This->sIcoPath, pszIconPath ); + + This->iIcoNdx = iIcon; + This->bDirty = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IShellLinkW_fnSetRelativePath(IShellLinkW * iface, LPCWSTR pszPathRel, DWORD dwReserved) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + TRACE("(%p)->(path=%s %lx)\n",This, debugstr_w(pszPathRel), dwReserved); + + if (This->sPathRel) + HeapFree(GetProcessHeap(), 0, This->sPathRel); + This->sPathRel = HeapAlloc( GetProcessHeap(), 0, + (lstrlenW( pszPathRel )+1) * sizeof (WCHAR) ); + if ( !This->sPathRel ) + return E_OUTOFMEMORY; + lstrcpyW( This->sPathRel, pszPathRel ); + This->bDirty = TRUE; + + return ShellLink_UpdatePath(This->sPathRel, This->sPath, This->sWorkDir, &This->sPath); +} + +static HRESULT WINAPI IShellLinkW_fnResolve(IShellLinkW * iface, HWND hwnd, DWORD fFlags) +{ + HRESULT hr = S_OK; + + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + + FIXME("(%p)->(hwnd=%p flags=%lx)\n",This, hwnd, fFlags); + + /*FIXME: use IResolveShellLink interface */ + + if (!This->sPath && This->pPidl) { + WCHAR buffer[MAX_PATH]; + + hr = SHELL_GetPathFromIDListW(This->pPidl, buffer, MAX_PATH); + + if (SUCCEEDED(hr) && *buffer) { + This->sPath = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, (lstrlenW(buffer)+1)*sizeof(WCHAR)); + if (!This->sPath) + return E_OUTOFMEMORY; + + lstrcpyW(This->sPath, buffer); + + This->bDirty = TRUE; + } else + hr = S_OK; /* don't report an error occurred while just caching information */ + } + + if (!This->sIcoPath && This->sPath) { + This->sIcoPath = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, (lstrlenW(This->sPath)+1)*sizeof(WCHAR)); + if (!This->sIcoPath) + return E_OUTOFMEMORY; + + lstrcpyW(This->sIcoPath, This->sPath); + This->iIcoNdx = 0; + + This->bDirty = TRUE; + } + + return hr; +} + +static HRESULT WINAPI IShellLinkW_fnSetPath(IShellLinkW * iface, LPCWSTR pszFile) +{ + _ICOM_THIS_From_IShellLinkW(IShellLinkImpl, iface); + WCHAR buffer[MAX_PATH]; + LPWSTR fname; + + TRACE("(%p)->(path=%s)\n",This, debugstr_w(pszFile)); + + if (!GetFullPathNameW(pszFile, MAX_PATH, buffer, &fname)) + return E_FAIL; + + if (This->sPath) + HeapFree(GetProcessHeap(), 0, This->sPath); + + This->sPath = HeapAlloc( GetProcessHeap(), 0, + (lstrlenW( buffer )+1) * sizeof (WCHAR) ); + if (!This->sPath) + return E_OUTOFMEMORY; + + lstrcpyW(This->sPath, buffer); + This->bDirty = TRUE; + + return S_OK; +} + +/************************************************************************** +* IShellLinkW Implementation +*/ + +static IShellLinkWVtbl slvtw = +{ + IShellLinkW_fnQueryInterface, + IShellLinkW_fnAddRef, + IShellLinkW_fnRelease, + IShellLinkW_fnGetPath, + IShellLinkW_fnGetIDList, + IShellLinkW_fnSetIDList, + IShellLinkW_fnGetDescription, + IShellLinkW_fnSetDescription, + IShellLinkW_fnGetWorkingDirectory, + IShellLinkW_fnSetWorkingDirectory, + IShellLinkW_fnGetArguments, + IShellLinkW_fnSetArguments, + IShellLinkW_fnGetHotkey, + IShellLinkW_fnSetHotkey, + IShellLinkW_fnGetShowCmd, + IShellLinkW_fnSetShowCmd, + IShellLinkW_fnGetIconLocation, + IShellLinkW_fnSetIconLocation, + IShellLinkW_fnSetRelativePath, + IShellLinkW_fnResolve, + IShellLinkW_fnSetPath +}; diff --git a/reactos/lib/shell32/shellole.c b/reactos/lib/shell32/shellole.c new file mode 100644 index 00000000000..c523ea6b53e --- /dev/null +++ b/reactos/lib/shell32/shellole.c @@ -0,0 +1,802 @@ +/* + * handling of SHELL32.DLL OLE-Objects + * + * Copyright 1997 Marcus Meissner + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "shellapi.h" +#include "wingdi.h" +#include "winuser.h" +#include "shlobj.h" +#include "shlguid.h" +#include "winreg.h" +#include "winerror.h" + +#include "undocshell.h" +#include "wine/unicode.h" +#include "shell32_main.h" + +#include "wine/debug.h" +#include "shlwapi.h" +#include "debughlp.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +extern HRESULT WINAPI IFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); + +const WCHAR sShell32[12] = {'S','H','E','L','L','3','2','.','D','L','L','\0'}; +const WCHAR sOLE32[10] = {'O','L','E','3','2','.','D','L','L','\0'}; + +HINSTANCE hShellOle32 = 0; +/************************************************************************** + * Default ClassFactory types + */ +typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); +IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst); + +/* this table contains all CLSID's of shell32 objects */ +struct { + REFIID riid; + LPFNCREATEINSTANCE lpfnCI; +} InterfaceTable[] = { + {&CLSID_ShellFSFolder, &IFSFolder_Constructor}, + {&CLSID_MyComputer, &ISF_MyComputer_Constructor}, + {&CLSID_ShellDesktop, &ISF_Desktop_Constructor}, + {&CLSID_ShellLink, &IShellLink_Constructor}, + {&CLSID_DragDropHelper, &IDropTargetHelper_Constructor}, + {&CLSID_ControlPanel, &IControlPanel_Constructor}, + {&CLSID_AutoComplete, &IAutoComplete_Constructor}, + {NULL,NULL} +}; + +/************************************************************************* + * SHCoCreateInstance [SHELL32.102] + * + * NOTES + * exported by ordinal + */ + +/* FIXME: this should be SHLWAPI.24 since we can't yet import by ordinal */ + +DWORD WINAPI __SHGUIDToStringW (REFGUID guid, LPWSTR str) +{ + WCHAR sFormat[52] = {'{','%','0','8','l','x','-','%','0','4', + 'x','-','%','0','4','x','-','%','0','2', + 'x','%','0','2','x','-','%','0','2','x', + '%','0','2','x','%','0','2','x','%','0', + '2','x','%','0','2','x','%','0','2','x', + '}','\0'}; + + return wsprintfW ( str, sFormat, + guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] ); + +} + +/************************************************************************/ + +HRESULT WINAPI SHCoCreateInstance( + LPCWSTR aclsid, + const CLSID *clsid, + LPUNKNOWN pUnkOuter, + REFIID refiid, + LPVOID *ppv) +{ + DWORD hres; + IID iid; + CLSID * myclsid = (CLSID*)clsid; + WCHAR sKeyName[MAX_PATH]; + const WCHAR sCLSID[7] = {'C','L','S','I','D','\\','\0'}; + WCHAR sClassID[60]; + const WCHAR sInProcServer32[16] ={'\\','I','n','p','r','o','c','S','e','r','v','e','r','3','2','\0'}; + const WCHAR sLoadWithoutCOM[15] ={'L','o','a','d','W','i','t','h','o','u','t','C','O','M','\0'}; + WCHAR sDllPath[MAX_PATH]; + HKEY hKey; + DWORD dwSize; + BOOLEAN bLoadFromShell32 = FALSE; + BOOLEAN bLoadWithoutCOM = FALSE; + IClassFactory * pcf = NULL; + + if(!ppv) return E_POINTER; + *ppv=NULL; + + /* if the clsid is a string, convert it */ + if (!clsid) + { + if (!aclsid) return REGDB_E_CLASSNOTREG; + SHCLSIDFromStringW(aclsid, &iid); + myclsid = &iid; + } + + TRACE("(%p,%s,unk:%p,%s,%p)\n", + aclsid,shdebugstr_guid(myclsid),pUnkOuter,shdebugstr_guid(refiid),ppv); + + /* we look up the dll path in the registry */ + __SHGUIDToStringW(myclsid, sClassID); + lstrcpyW(sKeyName, sCLSID); + lstrcatW(sKeyName, sClassID); + lstrcatW(sKeyName, sInProcServer32); + + if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_CLASSES_ROOT, sKeyName, 0, KEY_READ, &hKey)) { + dwSize = sizeof(sDllPath); + SHQueryValueExW(hKey, NULL, 0,0, sDllPath, &dwSize ); + + /* if a special registry key is set, we load a shell extension without help of OLE32 */ + bLoadWithoutCOM = (ERROR_SUCCESS == SHQueryValueExW(hKey, sLoadWithoutCOM, 0, 0, 0, 0)); + + /* if the com object is inside shell32, omit use of ole32 */ + bLoadFromShell32 = (0==lstrcmpiW( PathFindFileNameW(sDllPath), sShell32)); + + RegCloseKey (hKey); + } else { + /* since we can't find it in the registry we try internally */ + bLoadFromShell32 = TRUE; + } + + TRACE("WithoutCom=%u FromShell=%u\n", bLoadWithoutCOM, bLoadFromShell32); + + /* now we create a instance */ + if (bLoadFromShell32) { + if (! SUCCEEDED(SHELL32_DllGetClassObject(myclsid, &IID_IClassFactory,(LPVOID*)&pcf))) { + ERR("LoadFromShell failed for CLSID=%s\n", shdebugstr_guid(myclsid)); + } + } else if (bLoadWithoutCOM) { + + /* load a external dll without ole32 */ + HANDLE hLibrary; + typedef HRESULT (CALLBACK *DllGetClassObjectFunc)(REFCLSID clsid, REFIID iid, LPVOID *ppv); + DllGetClassObjectFunc DllGetClassObject; + + if ((hLibrary = LoadLibraryExW(sDllPath, 0, LOAD_WITH_ALTERED_SEARCH_PATH)) == 0) { + ERR("couldn't load InprocServer32 dll %s\n", debugstr_w(sDllPath)); + hres = E_ACCESSDENIED; + goto end; + } else if (!(DllGetClassObject = (DllGetClassObjectFunc)GetProcAddress(hLibrary, "DllGetClassObject"))) { + ERR("couldn't find function DllGetClassObject in %s\n", debugstr_w(sDllPath)); + FreeLibrary( hLibrary ); + hres = E_ACCESSDENIED; + goto end; + } else if (! SUCCEEDED(hres = DllGetClassObject(myclsid, &IID_IClassFactory, (LPVOID*)&pcf))) { + TRACE("GetClassObject failed 0x%08lx\n", hres); + goto end; + } + + } else { + + /* load a external dll in the usual way */ + hres = CoCreateInstance(myclsid, pUnkOuter, CLSCTX_INPROC_SERVER, refiid, ppv); + goto end; + } + + /* here we should have a ClassFactory */ + if (!pcf) return E_ACCESSDENIED; + + hres = IClassFactory_CreateInstance(pcf, pUnkOuter, refiid, ppv); + IClassFactory_Release(pcf); +end: + if(hres!=S_OK) + { + ERR("failed (0x%08lx) to create CLSID:%s IID:%s\n", + hres, shdebugstr_guid(myclsid), shdebugstr_guid(refiid)); + ERR("class not found in registry\n"); + } + + TRACE("-- instance: %p\n",*ppv); + return hres; +} + +/************************************************************************* + * DllGetClassObject [SHELL32.128] + */ +HRESULT WINAPI SHELL32_DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) +{ + HRESULT hres = E_OUTOFMEMORY; + IClassFactory * pcf = NULL; + int i; + + TRACE("CLSID:%s,IID:%s\n",shdebugstr_guid(rclsid),shdebugstr_guid(iid)); + + if (!ppv) return E_INVALIDARG; + *ppv = NULL; + + /* search our internal interface table */ + for(i=0;InterfaceTable[i].riid;i++) { + if(IsEqualIID(InterfaceTable[i].riid, rclsid)) { + TRACE("index[%u]\n", i); + pcf = IDefClF_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL); + } + } + + if (!pcf) { + FIXME("failed for CLSID=%s\n", shdebugstr_guid(rclsid)); + return CLASS_E_CLASSNOTAVAILABLE; + } + + hres = IClassFactory_QueryInterface(pcf, iid, ppv); + IClassFactory_Release(pcf); + + TRACE("-- pointer to class factory: %p\n",*ppv); + return hres; +} + +/************************************************************************* + * SHCLSIDFromString [SHELL32.147] + * + * NOTES + * exported by ordinal + */ +DWORD WINAPI SHCLSIDFromStringA (LPCSTR clsid, CLSID *id) +{ + WCHAR buffer[40]; + TRACE("(%p(%s) %p)\n", clsid, clsid, id); + if (!MultiByteToWideChar( CP_ACP, 0, clsid, -1, buffer, sizeof(buffer)/sizeof(WCHAR) )) + return CO_E_CLASSSTRING; + return CLSIDFromString( buffer, id ); +} +DWORD WINAPI SHCLSIDFromStringW (LPCWSTR clsid, CLSID *id) +{ + TRACE("(%p(%s) %p)\n", clsid, debugstr_w(clsid), id); + return CLSIDFromString((LPWSTR)clsid, id); +} +DWORD WINAPI SHCLSIDFromStringAW (LPVOID clsid, CLSID *id) +{ + if (SHELL_OsIsUnicode()) + return SHCLSIDFromStringW (clsid, id); + return SHCLSIDFromStringA (clsid, id); +} + +/************************************************************************* + * Shell Memory Allocator + */ + +/* set the vtable later */ +static IMallocVtbl VT_Shell_IMalloc32; + +/* this is the static object instance */ +typedef struct { + IMallocVtbl *lpVtbl; + DWORD dummy; +} _ShellMalloc; + +static _ShellMalloc Shell_Malloc = { &VT_Shell_IMalloc32,1}; + +/* this is the global allocator of shell32 */ +static IMalloc * ShellTaskAllocator = NULL; + +/****************************************************************************** + * IShellMalloc_QueryInterface [VTABLE] + */ +static HRESULT WINAPI IShellMalloc_fnQueryInterface(LPMALLOC iface, REFIID refiid, LPVOID *obj) +{ + TRACE("(%s,%p)\n",shdebugstr_guid(refiid),obj); + if (IsEqualIID(refiid, &IID_IUnknown) || IsEqualIID(refiid, &IID_IMalloc)) { + *obj = (LPMALLOC) &Shell_Malloc; + return S_OK; + } + return E_NOINTERFACE; +} + +/****************************************************************************** + * IShellMalloc_AddRefRelease [VTABLE] + */ +static ULONG WINAPI IShellMalloc_fnAddRefRelease(LPMALLOC iface) +{ + return 1; +} + +/****************************************************************************** + * IShellMalloc_Alloc [VTABLE] + */ +static LPVOID WINAPI IShellMalloc_fnAlloc(LPMALLOC iface, DWORD cb) +{ + LPVOID addr; + + addr = (LPVOID) LocalAlloc(GMEM_ZEROINIT, cb); + TRACE("(%p,%ld);\n",addr,cb); + return addr; +} + +/****************************************************************************** + * IShellMalloc_Realloc [VTABLE] + */ +static LPVOID WINAPI IShellMalloc_fnRealloc(LPMALLOC iface, LPVOID pv, DWORD cb) +{ + LPVOID addr; + + if (pv) { + if (cb) { + addr = (LPVOID) LocalReAlloc((HANDLE) pv, cb, GMEM_ZEROINIT | GMEM_MOVEABLE); + } else { + LocalFree((HANDLE) pv); + addr = NULL; + } + } else { + if (cb) { + addr = (LPVOID) LocalAlloc(GMEM_ZEROINIT, cb); + } else { + addr = NULL; + } + } + + TRACE("(%p->%p,%ld)\n",pv,addr,cb); + return addr; +} + +/****************************************************************************** + * IShellMalloc_Free [VTABLE] + */ +static VOID WINAPI IShellMalloc_fnFree(LPMALLOC iface, LPVOID pv) +{ + TRACE("(%p)\n",pv); + LocalFree((HANDLE) pv); +} + +/****************************************************************************** + * IShellMalloc_GetSize [VTABLE] + */ +static DWORD WINAPI IShellMalloc_fnGetSize(LPMALLOC iface, LPVOID pv) +{ + DWORD cb = (DWORD) LocalSize((HANDLE)pv); + TRACE("(%p,%ld)\n", pv, cb); + return cb; +} + +/****************************************************************************** + * IShellMalloc_DidAlloc [VTABLE] + */ +static INT WINAPI IShellMalloc_fnDidAlloc(LPMALLOC iface, LPVOID pv) +{ + TRACE("(%p)\n",pv); + return -1; +} + +/****************************************************************************** + * IShellMalloc_HeapMinimize [VTABLE] + */ +static VOID WINAPI IShellMalloc_fnHeapMinimize(LPMALLOC iface) +{ + TRACE("()\n"); +} + +static IMallocVtbl VT_Shell_IMalloc32 = +{ + IShellMalloc_fnQueryInterface, + IShellMalloc_fnAddRefRelease, + IShellMalloc_fnAddRefRelease, + IShellMalloc_fnAlloc, + IShellMalloc_fnRealloc, + IShellMalloc_fnFree, + IShellMalloc_fnGetSize, + IShellMalloc_fnDidAlloc, + IShellMalloc_fnHeapMinimize +}; + +/************************************************************************* + * SHGetMalloc [SHELL32.@] + * + * Return the shell IMalloc interface. + * + * PARAMS + * lpmal [O] Destination for IMalloc interface. + * + * RETURNS + * Success: S_OK. lpmal contains the shells IMalloc interface. + * Failure. An HRESULT error code. + * + * NOTES + * This function will use CoGetMalloc() if OLE32.DLL is already loaded. + * If not it uses an internal implementation as a fallback. + */ +HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal) +{ + TRACE("(%p)\n", lpmal); + + if (!ShellTaskAllocator) + { + HMODULE hOle32 = GetModuleHandleA("OLE32.DLL"); + /* this is very suspect. we should not being using a different + * allocator from deallocator based on something undeterministic + * like whether ole32 is loaded. as it happens currently, they + * both map to the same allocator deep down, but this could + * change in the future. */ + if(hOle32) { + CoGetMalloc(MEMCTX_TASK, &ShellTaskAllocator); + TRACE("got ole32 IMalloc\n"); + } + if(!ShellTaskAllocator) { + ShellTaskAllocator = (IMalloc* ) &Shell_Malloc; + TRACE("use fallback allocator\n"); + } + } + *lpmal = ShellTaskAllocator; + return S_OK; +} + +/************************************************************************* + * SHAlloc [SHELL32.196] + * + * NOTES + * exported by ordinal + */ +LPVOID WINAPI SHAlloc(DWORD len) +{ + IMalloc * ppv; + LPBYTE ret; + + if (!ShellTaskAllocator) SHGetMalloc(&ppv); + + ret = (LPVOID) IMalloc_Alloc(ShellTaskAllocator, len); + TRACE("%lu bytes at %p\n",len, ret); + return (LPVOID)ret; +} + +/************************************************************************* + * SHFree [SHELL32.195] + * + * NOTES + * exported by ordinal + */ +void WINAPI SHFree(LPVOID pv) +{ + IMalloc * ppv; + + TRACE("%p\n",pv); + if (!ShellTaskAllocator) SHGetMalloc(&ppv); + IMalloc_Free(ShellTaskAllocator, pv); +} + +/************************************************************************* + * SHGetDesktopFolder [SHELL32.@] + */ +HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf) +{ + HRESULT hres = S_OK; + TRACE("\n"); + + if(!psf) return E_INVALIDARG; + *psf = NULL; + hres = ISF_Desktop_Constructor(NULL, &IID_IShellFolder,(LPVOID*)psf); + + TRACE("-- %p->(%p)\n",psf, *psf); + return hres; +} +/************************************************************************** + * Default ClassFactory Implementation + * + * SHCreateDefClassObject + * + * NOTES + * helper function for dll's without a own classfactory + * a generic classfactory is returned + * when the CreateInstance of the cf is called the callback is executed + */ + +typedef struct +{ + IClassFactoryVtbl *lpVtbl; + DWORD ref; + CLSID *rclsid; + LPFNCREATEINSTANCE lpfnCI; + const IID * riidInst; + ULONG * pcRefDll; /* pointer to refcounter in external dll (ugrrr...) */ +} IDefClFImpl; + +static IClassFactoryVtbl dclfvt; + +/************************************************************************** + * IDefClF_fnConstructor + */ + +IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst) +{ + IDefClFImpl* lpclf; + + lpclf = (IDefClFImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDefClFImpl)); + lpclf->ref = 1; + lpclf->lpVtbl = &dclfvt; + lpclf->lpfnCI = lpfnCI; + lpclf->pcRefDll = pcRefDll; + + if (pcRefDll) InterlockedIncrement(pcRefDll); + lpclf->riidInst = riidInst; + + TRACE("(%p)%s\n",lpclf, shdebugstr_guid(riidInst)); + return (LPCLASSFACTORY)lpclf; +} +/************************************************************************** + * IDefClF_fnQueryInterface + */ +static HRESULT WINAPI IDefClF_fnQueryInterface( + LPCLASSFACTORY iface, REFIID riid, LPVOID *ppvObj) +{ + IDefClFImpl *This = (IDefClFImpl *)iface; + + TRACE("(%p)->(%s)\n",This,shdebugstr_guid(riid)); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory)) { + *ppvObj = This; + InterlockedIncrement(&This->ref); + return S_OK; + } + + TRACE("-- E_NOINTERFACE\n"); + return E_NOINTERFACE; +} +/****************************************************************************** + * IDefClF_fnAddRef + */ +static ULONG WINAPI IDefClF_fnAddRef(LPCLASSFACTORY iface) +{ + IDefClFImpl *This = (IDefClFImpl *)iface; + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return InterlockedIncrement(&This->ref); +} +/****************************************************************************** + * IDefClF_fnRelease + */ +static ULONG WINAPI IDefClF_fnRelease(LPCLASSFACTORY iface) +{ + IDefClFImpl *This = (IDefClFImpl *)iface; + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + if (!InterlockedDecrement(&This->ref)) + { + if (This->pcRefDll) InterlockedDecrement(This->pcRefDll); + + TRACE("-- destroying IClassFactory(%p)\n",This); + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->ref; +} +/****************************************************************************** + * IDefClF_fnCreateInstance + */ +static HRESULT WINAPI IDefClF_fnCreateInstance( + LPCLASSFACTORY iface, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject) +{ + IDefClFImpl *This = (IDefClFImpl *)iface; + + TRACE("%p->(%p,%s,%p)\n",This,pUnkOuter,shdebugstr_guid(riid),ppvObject); + + *ppvObject = NULL; + + if ( This->riidInst==NULL || + IsEqualCLSID(riid, This->riidInst) || + IsEqualCLSID(riid, &IID_IUnknown) ) + { + return This->lpfnCI(pUnkOuter, riid, ppvObject); + } + + ERR("unknown IID requested %s\n",shdebugstr_guid(riid)); + return E_NOINTERFACE; +} +/****************************************************************************** + * IDefClF_fnLockServer + */ +static HRESULT WINAPI IDefClF_fnLockServer(LPCLASSFACTORY iface, BOOL fLock) +{ + IDefClFImpl *This = (IDefClFImpl *)iface; + TRACE("%p->(0x%x), not implemented\n",This, fLock); + return E_NOTIMPL; +} + +static IClassFactoryVtbl dclfvt = +{ + IDefClF_fnQueryInterface, + IDefClF_fnAddRef, + IDefClF_fnRelease, + IDefClF_fnCreateInstance, + IDefClF_fnLockServer +}; + +/****************************************************************************** + * SHCreateDefClassObject [SHELL32.70] + */ +HRESULT WINAPI SHCreateDefClassObject( + REFIID riid, + LPVOID* ppv, + LPFNCREATEINSTANCE lpfnCI, /* [in] create instance callback entry */ + LPDWORD pcRefDll, /* [in/out] ref count of the dll */ + REFIID riidInst) /* [in] optional interface to the instance */ +{ + IClassFactory * pcf; + + TRACE("%s %p %p %p %s\n", + shdebugstr_guid(riid), ppv, lpfnCI, pcRefDll, shdebugstr_guid(riidInst)); + + if (! IsEqualCLSID(riid, &IID_IClassFactory) ) return E_NOINTERFACE; + if (! (pcf = IDefClF_fnConstructor(lpfnCI, pcRefDll, riidInst))) return E_OUTOFMEMORY; + *ppv = pcf; + return NOERROR; +} + +/************************************************************************* + * DragAcceptFiles [SHELL32.54] + */ +void WINAPI DragAcceptFiles(HWND hWnd, BOOL b) +{ + LONG exstyle; + + if( !IsWindow(hWnd) ) return; + exstyle = GetWindowLongA(hWnd,GWL_EXSTYLE); + if (b) + exstyle |= WS_EX_ACCEPTFILES; + else + exstyle &= ~WS_EX_ACCEPTFILES; + SetWindowLongA(hWnd,GWL_EXSTYLE,exstyle); +} + +/************************************************************************* + * DragFinish [SHELL32.80] + */ +void WINAPI DragFinish(HDROP h) +{ + TRACE("\n"); + GlobalFree((HGLOBAL)h); +} + +/************************************************************************* + * DragQueryPoint [SHELL32.135] + */ +BOOL WINAPI DragQueryPoint(HDROP hDrop, POINT *p) +{ + DROPFILES *lpDropFileStruct; + BOOL bRet; + + TRACE("\n"); + + lpDropFileStruct = (DROPFILES *) GlobalLock(hDrop); + + *p = lpDropFileStruct->pt; + bRet = lpDropFileStruct->fNC; + + GlobalUnlock(hDrop); + return bRet; +} + +/************************************************************************* + * DragQueryFile [SHELL32.81] + * DragQueryFileA [SHELL32.82] + */ +UINT WINAPI DragQueryFileA( + HDROP hDrop, + UINT lFile, + LPSTR lpszFile, + UINT lLength) +{ + LPSTR lpDrop; + UINT i = 0; + DROPFILES *lpDropFileStruct = (DROPFILES *) GlobalLock(hDrop); + + TRACE("(%p, %x, %p, %u)\n", hDrop,lFile,lpszFile,lLength); + + if(!lpDropFileStruct) goto end; + + lpDrop = (LPSTR) lpDropFileStruct + lpDropFileStruct->pFiles; + + if(lpDropFileStruct->fWide == TRUE) { + LPWSTR lpszFileW = NULL; + + if(lpszFile) { + lpszFileW = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, lLength*sizeof(WCHAR)); + if(lpszFileW == NULL) { + goto end; + } + } + i = DragQueryFileW(hDrop, lFile, lpszFileW, lLength); + + if(lpszFileW) { + WideCharToMultiByte(CP_ACP, 0, lpszFileW, -1, lpszFile, lLength, 0, NULL); + HeapFree(GetProcessHeap(), 0, lpszFileW); + } + goto end; + } + + while (i++ < lFile) + { + while (*lpDrop++); /* skip filename */ + if (!*lpDrop) + { + i = (lFile == 0xFFFFFFFF) ? i : 0; + goto end; + } + } + + i = strlen(lpDrop); + i++; + if (!lpszFile ) goto end; /* needed buffer size */ + i = (lLength > i) ? i : lLength; + lstrcpynA (lpszFile, lpDrop, i); +end: + GlobalUnlock(hDrop); + return i; +} + +/************************************************************************* + * DragQueryFileW [SHELL32.133] + */ +UINT WINAPI DragQueryFileW( + HDROP hDrop, + UINT lFile, + LPWSTR lpszwFile, + UINT lLength) +{ + LPWSTR lpwDrop; + UINT i = 0; + DROPFILES *lpDropFileStruct = (DROPFILES *) GlobalLock(hDrop); + + TRACE("(%p, %x, %p, %u)\n", hDrop,lFile,lpszwFile,lLength); + + if(!lpDropFileStruct) goto end; + + lpwDrop = (LPWSTR) ((LPSTR)lpDropFileStruct + lpDropFileStruct->pFiles); + + if(lpDropFileStruct->fWide == FALSE) { + LPSTR lpszFileA = NULL; + + if(lpszwFile) { + lpszFileA = (LPSTR) HeapAlloc(GetProcessHeap(), 0, lLength); + if(lpszFileA == NULL) { + goto end; + } + } + i = DragQueryFileA(hDrop, lFile, lpszFileA, lLength); + + if(lpszFileA) { + MultiByteToWideChar(CP_ACP, 0, lpszFileA, -1, lpszwFile, lLength); + HeapFree(GetProcessHeap(), 0, lpszFileA); + } + goto end; + } + + i = 0; + while (i++ < lFile) + { + while (*lpwDrop++); /* skip filename */ + if (!*lpwDrop) + { + i = (lFile == 0xFFFFFFFF) ? i : 0; + goto end; + } + } + + i = strlenW(lpwDrop); + i++; + if ( !lpszwFile) goto end; /* needed buffer size */ + + i = (lLength > i) ? i : lLength; + lstrcpynW (lpszwFile, lpwDrop, i); +end: + GlobalUnlock(hDrop); + return i; +} diff --git a/reactos/lib/shell32/shellord.c b/reactos/lib/shell32/shellord.c new file mode 100644 index 00000000000..87ded76318f --- /dev/null +++ b/reactos/lib/shell32/shellord.c @@ -0,0 +1,1550 @@ +/* + * The parameters of many functions changes between different OS versions + * (NT uses Unicode strings, 95 uses ASCII strings) + * + * Copyright 1997 Marcus Meissner + * 1998 Jürgen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include "config.h" + +#include +#include +#include + +#define COBJMACROS + +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wine/debug.h" +#include "winnls.h" + +#include "shellapi.h" +#include "objbase.h" +#include "shlguid.h" +#include "wingdi.h" +#include "winuser.h" +#include "shlobj.h" +#include "shell32_main.h" +#include "undocshell.h" +#include "pidl.h" +#include "shlwapi.h" +#include "commdlg.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); +WINE_DECLARE_DEBUG_CHANNEL(pidl); + +/* FIXME: !!! move CREATEMRULIST and flags to header file !!! */ +/* !!! it is in both here and comctl32undoc.c !!! */ +typedef struct tagCREATEMRULIST +{ + DWORD cbSize; /* size of struct */ + DWORD nMaxItems; /* max no. of items in list */ + DWORD dwFlags; /* see below */ + HKEY hKey; /* root reg. key under which list is saved */ + LPCSTR lpszSubKey; /* reg. subkey */ + PROC lpfnCompare; /* item compare proc */ +} CREATEMRULISTA, *LPCREATEMRULISTA; + +/* dwFlags */ +#define MRUF_STRING_LIST 0 /* list will contain strings */ +#define MRUF_BINARY_LIST 1 /* list will contain binary data */ +#define MRUF_DELAYED_SAVE 2 /* only save list order to reg. is FreeMRUList */ + +extern HANDLE WINAPI CreateMRUListA(LPCREATEMRULISTA lpcml); +extern DWORD WINAPI FreeMRUList(HANDLE hMRUList); +extern INT WINAPI AddMRUData(HANDLE hList, LPCVOID lpData, DWORD cbData); +extern INT WINAPI FindMRUData(HANDLE hList, LPCVOID lpData, DWORD cbData, LPINT lpRegNum); +extern INT WINAPI EnumMRUListA(HANDLE hList, INT nItemPos, LPVOID lpBuffer, DWORD nBufferSize); + + +/* Get a function pointer from a DLL handle */ +#define GET_FUNC(func, module, name, fail) \ + do { \ + if (!func) { \ + if (!SHELL32_h##module && !(SHELL32_h##module = LoadLibraryA(#module ".dll"))) return fail; \ + func = (void*)GetProcAddress(SHELL32_h##module, name); \ + if (!func) return fail; \ + } \ + } while (0) + +/* Function pointers for GET_FUNC macro */ +static HMODULE SHELL32_hshlwapi=NULL; +static HANDLE (WINAPI *pSHAllocShared)(LPCVOID,DWORD,DWORD); +static LPVOID (WINAPI *pSHLockShared)(HANDLE,DWORD); +static BOOL (WINAPI *pSHUnlockShared)(LPVOID); +static BOOL (WINAPI *pSHFreeShared)(HANDLE,DWORD); + + +/************************************************************************* + * ParseFieldA [internal] + * + * copies a field from a ',' delimited string + * + * first field is nField = 1 + */ +DWORD WINAPI ParseFieldA( + LPCSTR src, + DWORD nField, + LPSTR dst, + DWORD len) +{ + WARN("(%s,0x%08lx,%p,%ld) semi-stub.\n",debugstr_a(src),nField,dst,len); + + if (!src || !src[0] || !dst || !len) + return 0; + + /* skip n fields delimited by ',' */ + while (nField > 1) + { + if (*src=='\0') return FALSE; + if (*(src++)==',') nField--; + } + + /* copy part till the next ',' to dst */ + while ( *src!='\0' && *src!=',' && (len--)>0 ) *(dst++)=*(src++); + + /* finalize the string */ + *dst=0x0; + + return TRUE; +} + +/************************************************************************* + * ParseFieldW [internal] + * + * copies a field from a ',' delimited string + * + * first field is nField = 1 + */ +DWORD WINAPI ParseFieldW(LPCWSTR src, DWORD nField, LPWSTR dst, DWORD len) +{ + WARN("(%s,0x%08lx,%p,%ld) semi-stub.\n", debugstr_w(src), nField, dst, len); + + if (!src || !src[0] || !dst || !len) + return 0; + + /* skip n fields delimited by ',' */ + while (nField > 1) + { + if (*src == 0x0) return FALSE; + if (*src++ == ',') nField--; + } + + /* copy part till the next ',' to dst */ + while ( *src != 0x0 && *src != ',' && (len--)>0 ) *(dst++) = *(src++); + + /* finalize the string */ + *dst = 0x0; + + return TRUE; +} + +/************************************************************************* + * ParseField [SHELL32.58] + */ +DWORD WINAPI ParseFieldAW(LPCVOID src, DWORD nField, LPVOID dst, DWORD len) +{ + if (SHELL_OsIsUnicode()) + return ParseFieldW(src, nField, dst, len); + return ParseFieldA(src, nField, dst, len); +} + +/************************************************************************* + * GetFileNameFromBrowse [SHELL32.63] + * + */ +BOOL WINAPI GetFileNameFromBrowse( + HWND hwndOwner, + LPSTR lpstrFile, + DWORD nMaxFile, + LPCSTR lpstrInitialDir, + LPCSTR lpstrDefExt, + LPCSTR lpstrFilter, + LPCSTR lpstrTitle) +{ + HMODULE hmodule; + FARPROC pGetOpenFileNameA; + OPENFILENAMEA ofn; + BOOL ret; + + TRACE("%p, %s, %ld, %s, %s, %s, %s)\n", + hwndOwner, lpstrFile, nMaxFile, lpstrInitialDir, lpstrDefExt, + lpstrFilter, lpstrTitle); + + hmodule = LoadLibraryA("comdlg32.dll"); + if(!hmodule) return FALSE; + pGetOpenFileNameA = GetProcAddress(hmodule, "GetOpenFileNameA"); + if(!pGetOpenFileNameA) + { + FreeLibrary(hmodule); + return FALSE; + } + + memset(&ofn, 0, sizeof(ofn)); + + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = hwndOwner; + ofn.lpstrFilter = lpstrFilter; + ofn.lpstrFile = lpstrFile; + ofn.nMaxFile = nMaxFile; + ofn.lpstrInitialDir = lpstrInitialDir; + ofn.lpstrTitle = lpstrTitle; + ofn.lpstrDefExt = lpstrDefExt; + ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_FILEMUSTEXIST; + ret = pGetOpenFileNameA(&ofn); + + FreeLibrary(hmodule); + return ret; +} + +/************************************************************************* + * SHGetSetSettings [SHELL32.68] + */ +VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet) +{ + if(bSet) + { + FIXME("%p 0x%08lx TRUE\n", lpss, dwMask); + } + else + { + SHGetSettings((LPSHELLFLAGSTATE)lpss,dwMask); + } +} + +/************************************************************************* + * SHGetSettings [SHELL32.@] + * + * NOTES + * the registry path are for win98 (tested) + * and possibly are the same in nt40 + * + */ +VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask) +{ + HKEY hKey; + DWORD dwData; + DWORD dwDataSize = sizeof (DWORD); + + TRACE("(%p 0x%08lx)\n",lpsfs,dwMask); + + if (RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", + 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0)) + return; + + if ( (SSF_SHOWEXTENSIONS & dwMask) && !RegQueryValueExA(hKey, "HideFileExt", 0, 0, (LPBYTE)&dwData, &dwDataSize)) + lpsfs->fShowExtensions = ((dwData == 0) ? 0 : 1); + + if ( (SSF_SHOWINFOTIP & dwMask) && !RegQueryValueExA(hKey, "ShowInfoTip", 0, 0, (LPBYTE)&dwData, &dwDataSize)) + lpsfs->fShowInfoTip = ((dwData == 0) ? 0 : 1); + + if ( (SSF_DONTPRETTYPATH & dwMask) && !RegQueryValueExA(hKey, "DontPrettyPath", 0, 0, (LPBYTE)&dwData, &dwDataSize)) + lpsfs->fDontPrettyPath = ((dwData == 0) ? 0 : 1); + + if ( (SSF_HIDEICONS & dwMask) && !RegQueryValueExA(hKey, "HideIcons", 0, 0, (LPBYTE)&dwData, &dwDataSize)) + lpsfs->fHideIcons = ((dwData == 0) ? 0 : 1); + + if ( (SSF_MAPNETDRVBUTTON & dwMask) && !RegQueryValueExA(hKey, "MapNetDrvBtn", 0, 0, (LPBYTE)&dwData, &dwDataSize)) + lpsfs->fMapNetDrvBtn = ((dwData == 0) ? 0 : 1); + + if ( (SSF_SHOWATTRIBCOL & dwMask) && !RegQueryValueExA(hKey, "ShowAttribCol", 0, 0, (LPBYTE)&dwData, &dwDataSize)) + lpsfs->fShowAttribCol = ((dwData == 0) ? 0 : 1); + + if (((SSF_SHOWALLOBJECTS | SSF_SHOWSYSFILES) & dwMask) && !RegQueryValueExA(hKey, "Hidden", 0, 0, (LPBYTE)&dwData, &dwDataSize)) + { if (dwData == 0) + { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 0; + if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 0; + } + else if (dwData == 1) + { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 1; + if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 0; + } + else if (dwData == 2) + { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 0; + if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 1; + } + } + RegCloseKey (hKey); + + TRACE("-- 0x%04x\n", *(WORD*)lpsfs); +} + +/************************************************************************* + * SHShellFolderView_Message [SHELL32.73] + * + * Send a message to an explorer cabinet window. + * + * PARAMS + * hwndCabinet [I] The window containing the shellview to communicate with + * dwMessage [I] The SFVM message to send + * dwParam [I] Message parameter + * + * RETURNS + * fixme. + * + * NOTES + * Message SFVM_REARRANGE = 1 + * + * This message gets sent when a column gets clicked to instruct the + * shell view to re-sort the item list. dwParam identifies the column + * that was clicked. + */ +LRESULT WINAPI SHShellFolderView_Message( + HWND hwndCabinet, + UINT uMessage, + LPARAM lParam) +{ + FIXME("%p %08x %08lx stub\n",hwndCabinet, uMessage, lParam); + return 0; +} + +/************************************************************************* + * RegisterShellHook [SHELL32.181] + * + * Register a shell hook. + * + * PARAMS + * hwnd [I] Window handle + * dwType [I] Type of hook. + * + * NOTES + * Exported by ordinal + */ +BOOL WINAPI RegisterShellHook( + HWND hWnd, + DWORD dwType) +{ + FIXME("(%p,0x%08lx):stub.\n",hWnd, dwType); + return TRUE; +} + +/************************************************************************* + * ShellMessageBoxW [SHELL32.182] + * + * See ShellMessageBoxA. + */ +int WINAPIV ShellMessageBoxW( + HINSTANCE hInstance, + HWND hWnd, + LPCWSTR lpText, + LPCWSTR lpCaption, + UINT uType, + ...) +{ + WCHAR szText[100],szTitle[100]; + LPCWSTR pszText = szText, pszTitle = szTitle, pszTemp; + va_list args; + int ret; + + va_start(args, uType); + /* wvsprintfA(buf,fmt, args); */ + + TRACE("(%08lx,%08lx,%p,%p,%08x)\n", + (DWORD)hInstance,(DWORD)hWnd,lpText,lpCaption,uType); + + if (!HIWORD(lpCaption)) + LoadStringW(hInstance, (DWORD)lpCaption, szTitle, sizeof(szTitle)/sizeof(szTitle[0])); + else + pszTitle = lpCaption; + + if (!HIWORD(lpText)) + LoadStringW(hInstance, (DWORD)lpText, szText, sizeof(szText)/sizeof(szText[0])); + else + pszText = lpText; + + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, + pszText, 0, 0, (LPWSTR)&pszTemp, 0, &args); + + va_end(args); + + ret = MessageBoxW(hWnd,pszTemp,pszTitle,uType); + LocalFree((HLOCAL)pszTemp); + return ret; +} + +/************************************************************************* + * ShellMessageBoxA [SHELL32.183] + * + * Format and output an error message. + * + * PARAMS + * hInstance [I] Instance handle of message creator + * hWnd [I] Window handle of message creator + * lpText [I] Resource Id of title or LPSTR + * lpCaption [I] Resource Id of title or LPSTR + * uType [I] Type of error message + * + * RETURNS + * A return value from MessageBoxA(). + * + * NOTES + * Exported by ordinal + */ +int WINAPIV ShellMessageBoxA( + HINSTANCE hInstance, + HWND hWnd, + LPCSTR lpText, + LPCSTR lpCaption, + UINT uType, + ...) +{ + char szText[100],szTitle[100]; + LPCSTR pszText = szText, pszTitle = szTitle, pszTemp; + va_list args; + int ret; + + va_start(args, uType); + /* wvsprintfA(buf,fmt, args); */ + + TRACE("(%08lx,%08lx,%p,%p,%08x)\n", + (DWORD)hInstance,(DWORD)hWnd,lpText,lpCaption,uType); + + if (!HIWORD(lpCaption)) + LoadStringA(hInstance, (DWORD)lpCaption, szTitle, sizeof(szTitle)); + else + pszTitle = lpCaption; + + if (!HIWORD(lpText)) + LoadStringA(hInstance, (DWORD)lpText, szText, sizeof(szText)); + else + pszText = lpText; + + FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, + pszText, 0, 0, (LPSTR)&pszTemp, 0, &args); + + va_end(args); + + ret = MessageBoxA(hWnd,pszTemp,pszTitle,uType); + LocalFree((HLOCAL)pszTemp); + return ret; +} + +/************************************************************************* + * SHRegisterDragDrop [SHELL32.86] + * + * NOTES + * exported by ordinal + */ +HRESULT WINAPI SHRegisterDragDrop( + HWND hWnd, + LPDROPTARGET pDropTarget) +{ + FIXME("(%p,%p):stub.\n", hWnd, pDropTarget); + return RegisterDragDrop(hWnd, pDropTarget); +} + +/************************************************************************* + * SHRevokeDragDrop [SHELL32.87] + * + * NOTES + * exported by ordinal + */ +HRESULT WINAPI SHRevokeDragDrop(HWND hWnd) +{ + FIXME("(%p):stub.\n",hWnd); + return RevokeDragDrop(hWnd); +} + +/************************************************************************* + * SHDoDragDrop [SHELL32.88] + * + * NOTES + * exported by ordinal + */ +HRESULT WINAPI SHDoDragDrop( + HWND hWnd, + LPDATAOBJECT lpDataObject, + LPDROPSOURCE lpDropSource, + DWORD dwOKEffect, + LPDWORD pdwEffect) +{ + FIXME("(%p %p %p 0x%08lx %p):stub.\n", + hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect); + return DoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect); +} + +/************************************************************************* + * ArrangeWindows [SHELL32.184] + * + */ +WORD WINAPI ArrangeWindows( + HWND hwndParent, + DWORD dwReserved, + LPCRECT lpRect, + WORD cKids, + CONST HWND * lpKids) +{ + FIXME("(%p 0x%08lx %p 0x%04x %p):stub.\n", + hwndParent, dwReserved, lpRect, cKids, lpKids); + return 0; +} + +/************************************************************************* + * SignalFileOpen [SHELL32.103] + * + * NOTES + * exported by ordinal + */ +DWORD WINAPI +SignalFileOpen (DWORD dwParam1) +{ + FIXME("(0x%08lx):stub.\n", dwParam1); + + return 0; +} + +/************************************************************************* + * SHADD_get_policy - helper function for SHAddToRecentDocs + * + * PARAMETERS + * policy [IN] policy name (null termed string) to find + * type [OUT] ptr to DWORD to receive type + * buffer [OUT] ptr to area to hold data retrieved + * len [IN/OUT] ptr to DWORD holding size of buffer and getting + * length filled + * + * RETURNS + * result of the SHQueryValueEx call + */ +static INT SHADD_get_policy(LPSTR policy, LPDWORD type, LPVOID buffer, LPDWORD len) +{ + HKEY Policy_basekey; + INT ret; + + /* Get the key for the policies location in the registry + */ + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", + 0, KEY_READ, &Policy_basekey)) { + + if (RegOpenKeyExA(HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", + 0, KEY_READ, &Policy_basekey)) { + TRACE("No Explorer Policies location exists. Policy wanted=%s\n", + policy); + *len = 0; + return ERROR_FILE_NOT_FOUND; + } + } + + /* Retrieve the data if it exists + */ + ret = SHQueryValueExA(Policy_basekey, policy, 0, type, buffer, len); + RegCloseKey(Policy_basekey); + return ret; +} + + +/************************************************************************* + * SHADD_compare_mru - helper function for SHAddToRecentDocs + * + * PARAMETERS + * data1 [IN] data being looked for + * data2 [IN] data in MRU + * cbdata [IN] length from FindMRUData call (not used) + * + * RETURNS + * position within MRU list that data was added. + */ +static INT CALLBACK SHADD_compare_mru(LPCVOID data1, LPCVOID data2, DWORD cbData) +{ + return lstrcmpiA(data1, data2); +} + +/************************************************************************* + * SHADD_create_add_mru_data - helper function for SHAddToRecentDocs + * + * PARAMETERS + * mruhandle [IN] handle for created MRU list + * doc_name [IN] null termed pure doc name + * new_lnk_name [IN] null termed path and file name for .lnk file + * buffer [IN/OUT] 2048 byte area to consturct MRU data + * len [OUT] ptr to int to receive space used in buffer + * + * RETURNS + * position within MRU list that data was added. + */ +static INT SHADD_create_add_mru_data(HANDLE mruhandle, LPSTR doc_name, LPSTR new_lnk_name, + LPSTR buffer, INT *len) +{ + LPSTR ptr; + INT wlen; + + /*FIXME: Document: + * RecentDocs MRU data structure seems to be: + * +0h document file name w/ terminating 0h + * +nh short int w/ size of remaining + * +n+2h 02h 30h, or 01h 30h, or 00h 30h - unknown + * +n+4h 10 bytes zeros - unknown + * +n+eh shortcut file name w/ terminating 0h + * +n+e+nh 3 zero bytes - unknown + */ + + /* Create the MRU data structure for "RecentDocs" + */ + ptr = buffer; + lstrcpyA(ptr, doc_name); + ptr += (lstrlenA(buffer) + 1); + wlen= lstrlenA(new_lnk_name) + 1 + 12; + *((short int*)ptr) = wlen; + ptr += 2; /* step past the length */ + *(ptr++) = 0x30; /* unknown reason */ + *(ptr++) = 0; /* unknown, but can be 0x00, 0x01, 0x02 */ + memset(ptr, 0, 10); + ptr += 10; + lstrcpyA(ptr, new_lnk_name); + ptr += (lstrlenA(new_lnk_name) + 1); + memset(ptr, 0, 3); + ptr += 3; + *len = ptr - buffer; + + /* Add the new entry into the MRU list + */ + return AddMRUData(mruhandle, (LPCVOID)buffer, *len); +} + +/************************************************************************* + * SHAddToRecentDocs [SHELL32.@] + * + * PARAMETERS + * uFlags [IN] SHARD_PATH or SHARD_PIDL + * pv [IN] string or pidl, NULL clears the list + * + * NOTES + * exported by name + */ +void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) +{ +/* If list is a string list lpfnCompare has the following prototype + * int CALLBACK MRUCompareString(LPCSTR s1, LPCSTR s2) + * for binary lists the prototype is + * int CALLBACK MRUCompareBinary(LPCVOID data1, LPCVOID data2, DWORD cbData) + * where cbData is the no. of bytes to compare. + * Need to check what return value means identical - 0? + */ + + + UINT olderrormode; + HKEY HCUbasekey; + CHAR doc_name[MAX_PATH]; + CHAR link_dir[MAX_PATH]; + CHAR new_lnk_filepath[MAX_PATH]; + CHAR new_lnk_name[MAX_PATH]; + IMalloc *ppM; + LPITEMIDLIST pidl; + HWND hwnd = 0; /* FIXME: get real window handle */ + INT ret; + DWORD data[64], datalen, type; + + /*FIXME: Document: + * RecentDocs MRU data structure seems to be: + * +0h document file name w/ terminating 0h + * +nh short int w/ size of remaining + * +n+2h 02h 30h, or 01h 30h, or 00h 30h - unknown + * +n+4h 10 bytes zeros - unknown + * +n+eh shortcut file name w/ terminating 0h + * +n+e+nh 3 zero bytes - unknown + */ + + /* See if we need to do anything. + */ + datalen = 64; + ret=SHADD_get_policy( "NoRecentDocsHistory", &type, &data, &datalen); + if ((ret > 0) && (ret != ERROR_FILE_NOT_FOUND)) { + ERR("Error %d getting policy \"NoRecentDocsHistory\"\n", ret); + return; + } + if (ret == ERROR_SUCCESS) { + if (!( (type == REG_DWORD) || + ((type == REG_BINARY) && (datalen == 4)) )) { + ERR("Error policy data for \"NoRecentDocsHistory\" not formated correctly, type=%ld, len=%ld\n", + type, datalen); + return; + } + + TRACE("policy value for NoRecentDocsHistory = %08lx\n", data[0]); + /* now test the actual policy value */ + if ( data[0] != 0) + return; + } + + /* Open key to where the necessary info is + */ + /* FIXME: This should be done during DLL PROCESS_ATTACH (or THREAD_ATTACH) + * and the close should be done during the _DETACH. The resulting + * key is stored in the DLL global data. + */ + if (RegCreateKeyExA(HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", + 0, 0, 0, KEY_READ, 0, &HCUbasekey, 0)) { + ERR("Failed to create 'Software\\Microsoft\\Windows\\CurrentVersion\\Explorer'\n"); + return; + } + + /* Get path to user's "Recent" directory + */ + if(SUCCEEDED(SHGetMalloc(&ppM))) { + if (SUCCEEDED(SHGetSpecialFolderLocation(hwnd, CSIDL_RECENT, + &pidl))) { + SHGetPathFromIDListA(pidl, link_dir); + IMalloc_Free(ppM, pidl); + } + else { + /* serious issues */ + link_dir[0] = 0; + ERR("serious issues 1\n"); + } + IMalloc_Release(ppM); + } + else { + /* serious issues */ + link_dir[0] = 0; + ERR("serious issues 2\n"); + } + TRACE("Users Recent dir %s\n", link_dir); + + /* If no input, then go clear the lists */ + if (!pv) { + /* clear user's Recent dir + */ + + /* FIXME: delete all files in "link_dir" + * + * while( more files ) { + * lstrcpyA(old_lnk_name, link_dir); + * PathAppendA(old_lnk_name, filenam); + * DeleteFileA(old_lnk_name); + * } + */ + FIXME("should delete all files in %s\\ \n", link_dir); + + /* clear MRU list + */ + /* MS Bug ?? v4.72.3612.1700 of shell32 does the delete against + * HKEY_LOCAL_MACHINE version of ...CurrentVersion\Explorer + * and naturally it fails w/ rc=2. It should do it against + * HKEY_CURRENT_USER which is where it is stored, and where + * the MRU routines expect it!!!! + */ + RegDeleteKeyA(HCUbasekey, "RecentDocs"); + RegCloseKey(HCUbasekey); + return; + } + + /* Have data to add, the jobs to be done: + * 1. Add document to MRU list in registry "HKCU\Software\ + * Microsoft\Windows\CurrentVersion\Explorer\RecentDocs". + * 2. Add shortcut to document in the user's Recent directory + * (CSIDL_RECENT). + * 3. Add shortcut to Start menu's Documents submenu. + */ + + /* Get the pure document name from the input + */ + if (uFlags & SHARD_PIDL) { + SHGetPathFromIDListA((LPCITEMIDLIST) pv, doc_name); + } + else { + lstrcpyA(doc_name, (LPCSTR) pv); + } + TRACE("full document name %s\n", doc_name); + PathStripPathA(doc_name); + TRACE("stripped document name %s\n", doc_name); + + + /* *** JOB 1: Update registry for ...\Explorer\RecentDocs list *** */ + + { /* on input needs: + * doc_name - pure file-spec, no path + * link_dir - path to the user's Recent directory + * HCUbasekey - key of ...Windows\CurrentVersion\Explorer" node + * creates: + * new_lnk_name- pure file-spec, no path for new .lnk file + * new_lnk_filepath + * - path and file name of new .lnk file + */ + CREATEMRULISTA mymru; + HANDLE mruhandle; + INT len, pos, bufused, err; + INT i; + DWORD attr; + CHAR buffer[2048]; + CHAR *ptr; + CHAR old_lnk_name[MAX_PATH]; + short int slen; + + mymru.cbSize = sizeof(CREATEMRULISTA); + mymru.nMaxItems = 15; + mymru.dwFlags = MRUF_BINARY_LIST | MRUF_DELAYED_SAVE; + mymru.hKey = HCUbasekey; + mymru.lpszSubKey = "RecentDocs"; + mymru.lpfnCompare = &SHADD_compare_mru; + mruhandle = CreateMRUListA(&mymru); + if (!mruhandle) { + /* MRU failed */ + ERR("MRU processing failed, handle zero\n"); + RegCloseKey(HCUbasekey); + return; + } + len = lstrlenA(doc_name); + pos = FindMRUData(mruhandle, doc_name, len, 0); + + /* Now get the MRU entry that will be replaced + * and delete the .lnk file for it + */ + if ((bufused = EnumMRUListA(mruhandle, (pos == -1) ? 14 : pos, + buffer, 2048)) != -1) { + ptr = buffer; + ptr += (lstrlenA(buffer) + 1); + slen = *((short int*)ptr); + ptr += 2; /* skip the length area */ + if (bufused >= slen + (ptr-buffer)) { + /* buffer size looks good */ + ptr += 12; /* get to string */ + len = bufused - (ptr-buffer); /* get length of buf remaining */ + if ((lstrlenA(ptr) > 0) && (lstrlenA(ptr) <= len-1)) { + /* appears to be good string */ + lstrcpyA(old_lnk_name, link_dir); + PathAppendA(old_lnk_name, ptr); + if (!DeleteFileA(old_lnk_name)) { + if ((attr = GetFileAttributesA(old_lnk_name)) == INVALID_FILE_ATTRIBUTES) { + if ((err = GetLastError()) != ERROR_FILE_NOT_FOUND) { + ERR("Delete for %s failed, err=%d, attr=%08lx\n", + old_lnk_name, err, attr); + } + else { + TRACE("old .lnk file %s did not exist\n", + old_lnk_name); + } + } + else { + ERR("Delete for %s failed, attr=%08lx\n", + old_lnk_name, attr); + } + } + else { + TRACE("deleted old .lnk file %s\n", old_lnk_name); + } + } + } + } + + /* Create usable .lnk file name for the "Recent" directory + */ + wsprintfA(new_lnk_name, "%s.lnk", doc_name); + lstrcpyA(new_lnk_filepath, link_dir); + PathAppendA(new_lnk_filepath, new_lnk_name); + i = 1; + olderrormode = SetErrorMode(SEM_FAILCRITICALERRORS); + while (GetFileAttributesA(new_lnk_filepath) != INVALID_FILE_ATTRIBUTES) { + i++; + wsprintfA(new_lnk_name, "%s (%u).lnk", doc_name, i); + lstrcpyA(new_lnk_filepath, link_dir); + PathAppendA(new_lnk_filepath, new_lnk_name); + } + SetErrorMode(olderrormode); + TRACE("new shortcut will be %s\n", new_lnk_filepath); + + /* Now add the new MRU entry and data + */ + pos = SHADD_create_add_mru_data(mruhandle, doc_name, new_lnk_name, + buffer, &len); + FreeMRUList(mruhandle); + TRACE("Updated MRU list, new doc is position %d\n", pos); + } + + /* *** JOB 2: Create shortcut in user's "Recent" directory *** */ + + { /* on input needs: + * doc_name - pure file-spec, no path + * new_lnk_filepath + * - path and file name of new .lnk file + * uFlags[in] - flags on call to SHAddToRecentDocs + * pv[in] - document path/pidl on call to SHAddToRecentDocs + */ + IShellLinkA *psl = NULL; + IPersistFile *pPf = NULL; + HRESULT hres; + CHAR desc[MAX_PATH]; + WCHAR widelink[MAX_PATH]; + + CoInitialize(0); + + hres = CoCreateInstance( &CLSID_ShellLink, + NULL, + CLSCTX_INPROC_SERVER, + &IID_IShellLinkA, + (LPVOID )&psl); + if(SUCCEEDED(hres)) { + + hres = IShellLinkA_QueryInterface(psl, &IID_IPersistFile, + (LPVOID *)&pPf); + if(FAILED(hres)) { + /* bombed */ + ERR("failed QueryInterface for IPersistFile %08lx\n", hres); + goto fail; + } + + /* Set the document path or pidl */ + if (uFlags & SHARD_PIDL) { + hres = IShellLinkA_SetIDList(psl, (LPCITEMIDLIST) pv); + } else { + hres = IShellLinkA_SetPath(psl, (LPCSTR) pv); + } + if(FAILED(hres)) { + /* bombed */ + ERR("failed Set{IDList|Path} %08lx\n", hres); + goto fail; + } + + lstrcpyA(desc, "Shortcut to "); + lstrcatA(desc, doc_name); + hres = IShellLinkA_SetDescription(psl, desc); + if(FAILED(hres)) { + /* bombed */ + ERR("failed SetDescription %08lx\n", hres); + goto fail; + } + + MultiByteToWideChar(CP_ACP, 0, new_lnk_filepath, -1, + widelink, MAX_PATH); + /* create the short cut */ + hres = IPersistFile_Save(pPf, widelink, TRUE); + if(FAILED(hres)) { + /* bombed */ + ERR("failed IPersistFile::Save %08lx\n", hres); + IPersistFile_Release(pPf); + IShellLinkA_Release(psl); + goto fail; + } + hres = IPersistFile_SaveCompleted(pPf, widelink); + IPersistFile_Release(pPf); + IShellLinkA_Release(psl); + TRACE("shortcut %s has been created, result=%08lx\n", + new_lnk_filepath, hres); + } + else { + ERR("CoCreateInstance failed, hres=%08lx\n", hres); + } + } + + fail: + CoUninitialize(); + + /* all done */ + RegCloseKey(HCUbasekey); + return; +} + +/************************************************************************* + * SHCreateShellFolderViewEx [SHELL32.174] + * + * NOTES + * see IShellFolder::CreateViewObject + */ +HRESULT WINAPI SHCreateShellFolderViewEx( + LPCSFV psvcbi, /* [in] shelltemplate struct */ + IShellView **ppv) /* [out] IShellView pointer */ +{ + IShellView * psf; + HRESULT hRes; + + TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n", + psvcbi->pshf, psvcbi->pidl, psvcbi->pfnCallback, + psvcbi->fvm, psvcbi->psvOuter); + + psf = IShellView_Constructor(psvcbi->pshf); + + if (!psf) + return E_OUTOFMEMORY; + + IShellView_AddRef(psf); + hRes = IShellView_QueryInterface(psf, &IID_IShellView, (LPVOID *)ppv); + IShellView_Release(psf); + + return hRes; +} +/************************************************************************* + * SHWinHelp [SHELL32.127] + * + */ +HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z) +{ FIXME("0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",v,w,x,z); + return 0; +} +/************************************************************************* + * SHRunControlPanel [SHELL32.161] + * + */ +HRESULT WINAPI SHRunControlPanel (DWORD x, DWORD z) +{ FIXME("0x%08lx 0x%08lx stub\n",x,z); + return 0; +} + +static LPUNKNOWN SHELL32_IExplorerInterface=0; +/************************************************************************* + * SHSetInstanceExplorer [SHELL32.176] + * + * NOTES + * Sets the interface + */ +HRESULT WINAPI SHSetInstanceExplorer (LPUNKNOWN lpUnknown) +{ TRACE("%p\n", lpUnknown); + SHELL32_IExplorerInterface = lpUnknown; + return (HRESULT) lpUnknown; +} +/************************************************************************* + * SHGetInstanceExplorer [SHELL32.@] + * + * NOTES + * gets the interface pointer of the explorer and a reference + */ +HRESULT WINAPI SHGetInstanceExplorer (LPUNKNOWN * lpUnknown) +{ TRACE("%p\n", lpUnknown); + + *lpUnknown = SHELL32_IExplorerInterface; + + if (!SHELL32_IExplorerInterface) + return E_FAIL; + + IUnknown_AddRef(SHELL32_IExplorerInterface); + return NOERROR; +} +/************************************************************************* + * SHFreeUnusedLibraries [SHELL32.123] + * + * NOTES + * exported by name + */ +void WINAPI SHFreeUnusedLibraries (void) +{ + FIXME("stub\n"); +} +/************************************************************************* + * DAD_AutoScroll [SHELL32.129] + * + */ +BOOL WINAPI DAD_AutoScroll(HWND hwnd, AUTO_SCROLL_DATA *samples, LPPOINT pt) +{ + FIXME("hwnd = %p %p %p\n",hwnd,samples,pt); + return 0; +} +/************************************************************************* + * DAD_DragEnter [SHELL32.130] + * + */ +BOOL WINAPI DAD_DragEnter(HWND hwnd) +{ + FIXME("hwnd = %p\n",hwnd); + return FALSE; +} +/************************************************************************* + * DAD_DragEnterEx [SHELL32.131] + * + */ +BOOL WINAPI DAD_DragEnterEx(HWND hwnd, POINT p) +{ + FIXME("hwnd = %p (%ld,%ld)\n",hwnd,p.x,p.y); + return FALSE; +} +/************************************************************************* + * DAD_DragMove [SHELL32.134] + * + */ +BOOL WINAPI DAD_DragMove(POINT p) +{ + FIXME("(%ld,%ld)\n",p.x,p.y); + return FALSE; +} +/************************************************************************* + * DAD_DragLeave [SHELL32.132] + * + */ +BOOL WINAPI DAD_DragLeave(VOID) +{ + FIXME("\n"); + return FALSE; +} +/************************************************************************* + * DAD_SetDragImage [SHELL32.136] + * + * NOTES + * exported by name + */ +BOOL WINAPI DAD_SetDragImage( + HIMAGELIST himlTrack, + LPPOINT lppt) +{ + FIXME("%p %p stub\n",himlTrack, lppt); + return 0; +} +/************************************************************************* + * DAD_ShowDragImage [SHELL32.137] + * + * NOTES + * exported by name + */ +BOOL WINAPI DAD_ShowDragImage(BOOL bShow) +{ + FIXME("0x%08x stub\n",bShow); + return 0; +} + +static const WCHAR szwCabLocation[] = { + 'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'W','i','n','d','o','w','s','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'E','x','p','l','o','r','e','r','\\', + 'C','a','b','i','n','e','t','S','t','a','t','e',0 +}; + +static const WCHAR szwSettings[] = { 'S','e','t','t','i','n','g','s',0 }; + +/************************************************************************* + * ReadCabinetState [SHELL32.651] NT 4.0 + * + */ +BOOL WINAPI ReadCabinetState(CABINETSTATE *cs, int length) +{ + HKEY hkey = 0; + DWORD type, r; + + TRACE("%p %d \n",cs,length); + + if( (cs == NULL) || (length < (int)sizeof(*cs)) ) + return FALSE; + + r = RegOpenKeyW( HKEY_CURRENT_USER, szwCabLocation, &hkey ); + if( r == ERROR_SUCCESS ) + { + type = REG_BINARY; + r = RegQueryValueExW( hkey, szwSettings, + NULL, &type, (LPBYTE)cs, (LPDWORD)&length ); + RegCloseKey( hkey ); + + } + + /* if we can't read from the registry, create default values */ + if ( (r != ERROR_SUCCESS) || (cs->cLength < sizeof(*cs)) || + (cs->cLength != length) ) + { + ERR("Initializing shell cabinet settings\n"); + memset(cs, 0, sizeof(*cs)); + cs->cLength = sizeof(*cs); + cs->nVersion = 2; + cs->fFullPathTitle = FALSE; + cs->fSaveLocalView = TRUE; + cs->fNotShell = FALSE; + cs->fSimpleDefault = TRUE; + cs->fDontShowDescBar = FALSE; + cs->fNewWindowMode = FALSE; + cs->fShowCompColor = FALSE; + cs->fDontPrettyNames = FALSE; + cs->fAdminsCreateCommonGroups = TRUE; + cs->fMenuEnumFilter = 96; + } + + return TRUE; +} + +/************************************************************************* + * WriteCabinetState [SHELL32.652] NT 4.0 + * + */ +BOOL WINAPI WriteCabinetState(CABINETSTATE *cs) +{ + DWORD r; + HKEY hkey = 0; + + TRACE("%p\n",cs); + + if( cs == NULL ) + return FALSE; + + r = RegCreateKeyExW( HKEY_CURRENT_USER, szwCabLocation, 0, + NULL, 0, KEY_ALL_ACCESS, NULL, &hkey, NULL); + if( r == ERROR_SUCCESS ) + { + r = RegSetValueExW( hkey, szwSettings, 0, + REG_BINARY, (LPBYTE) cs, cs->cLength); + + RegCloseKey( hkey ); + } + + return (r==ERROR_SUCCESS); +} + +/************************************************************************* + * FileIconInit [SHELL32.660] + * + */ +BOOL WINAPI FileIconInit(BOOL bFullInit) +{ FIXME("(%s)\n", bFullInit ? "true" : "false"); + return 0; +} +/************************************************************************* + * IsUserAdmin [SHELL32.680] NT 4.0 + * + */ +HRESULT WINAPI IsUserAdmin(void) +{ FIXME("stub\n"); + return TRUE; +} + +/************************************************************************* + * SHAllocShared [SHELL32.520] + * + * See shlwapi.SHAllocShared + */ +HANDLE WINAPI SHAllocShared(LPVOID lpvData, DWORD dwSize, DWORD dwProcId) +{ + GET_FUNC(pSHAllocShared, shlwapi, (char*)7, NULL); + return pSHAllocShared(lpvData, dwSize, dwProcId); +} + +/************************************************************************* + * SHLockShared [SHELL32.521] + * + * See shlwapi.SHLockShared + */ +LPVOID WINAPI SHLockShared(HANDLE hShared, DWORD dwProcId) +{ + GET_FUNC(pSHLockShared, shlwapi, (char*)8, NULL); + return pSHLockShared(hShared, dwProcId); +} + +/************************************************************************* + * SHUnlockShared [SHELL32.522] + * + * See shlwapi.SHUnlockShared + */ +BOOL WINAPI SHUnlockShared(LPVOID lpView) +{ + GET_FUNC(pSHUnlockShared, shlwapi, (char*)9, FALSE); + return pSHUnlockShared(lpView); +} + +/************************************************************************* + * SHFreeShared [SHELL32.523] + * + * See shlwapi.SHFreeShared + */ +BOOL WINAPI SHFreeShared(HANDLE hShared, DWORD dwProcId) +{ + GET_FUNC(pSHFreeShared, shlwapi, (char*)10, FALSE); + return pSHFreeShared(hShared, dwProcId); +} + +/************************************************************************* + * SetAppStartingCursor [SHELL32.99] + */ +HRESULT WINAPI SetAppStartingCursor(HWND u, DWORD v) +{ FIXME("hwnd=%p 0x%04lx stub\n",u,v ); + return 0; +} +/************************************************************************* + * SHLoadOLE [SHELL32.151] + * + */ +HRESULT WINAPI SHLoadOLE(LPARAM lParam) +{ FIXME("0x%04lx stub\n",lParam); + return S_OK; +} +/************************************************************************* + * DriveType [SHELL32.64] + * + */ +HRESULT WINAPI DriveType(DWORD u) +{ FIXME("0x%04lx stub\n",u); + return 0; +} +/************************************************************************* + * SHAbortInvokeCommand [SHELL32.198] + * + */ +HRESULT WINAPI SHAbortInvokeCommand(void) +{ FIXME("stub\n"); + return 1; +} +/************************************************************************* + * SHOutOfMemoryMessageBox [SHELL32.126] + * + */ +int WINAPI SHOutOfMemoryMessageBox( + HWND hwndOwner, + LPCSTR lpCaption, + UINT uType) +{ + FIXME("%p %s 0x%08x stub\n",hwndOwner, lpCaption, uType); + return 0; +} +/************************************************************************* + * SHFlushClipboard [SHELL32.121] + * + */ +HRESULT WINAPI SHFlushClipboard(void) +{ FIXME("stub\n"); + return 1; +} + +/************************************************************************* + * SHWaitForFileToOpen [SHELL32.97] + * + */ +BOOL WINAPI SHWaitForFileToOpen( + LPCITEMIDLIST pidl, + DWORD dwFlags, + DWORD dwTimeout) +{ + FIXME("%p 0x%08lx 0x%08lx stub\n", pidl, dwFlags, dwTimeout); + return 0; +} + +/************************************************************************ + * @ [SHELL32.654] + * + * NOTES: first parameter seems to be a pointer (same as passed to WriteCabinetState) + * second one could be a size (0x0c). The size is the same as the structure saved to + * HCU\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState + * I'm (js) guessing: this one is just ReadCabinetState ;-) + */ +HRESULT WINAPI shell32_654 (CABINETSTATE *cs, int length) +{ + TRACE("%p %d\n",cs,length); + return ReadCabinetState(cs,length); +} + +/************************************************************************ + * RLBuildListOfPaths [SHELL32.146] + * + * NOTES + * builds a DPA + */ +DWORD WINAPI RLBuildListOfPaths (void) +{ FIXME("stub\n"); + return 0; +} +/************************************************************************ + * SHValidateUNC [SHELL32.173] + * + */ +HRESULT WINAPI SHValidateUNC (DWORD x, DWORD y, DWORD z) +{ + FIXME("0x%08lx 0x%08lx 0x%08lx stub\n",x,y,z); + return 0; +} + +/************************************************************************ + * DoEnvironmentSubstA [SHELL32.@] + * + */ +HRESULT WINAPI DoEnvironmentSubstA(LPSTR x, LPSTR y) +{ + FIXME("(%s, %s) stub\n", debugstr_a(x), debugstr_a(y)); + return 0; +} + +/************************************************************************ + * DoEnvironmentSubstW [SHELL32.@] + * + */ +HRESULT WINAPI DoEnvironmentSubstW(LPWSTR x, LPWSTR y) +{ + FIXME("(%s, %s): stub\n", debugstr_w(x), debugstr_w(y)); + return 0; +} + +/************************************************************************ + * DoEnvironmentSubst [SHELL32.53] + * + */ +HRESULT WINAPI DoEnvironmentSubstAW(LPVOID x, LPVOID y) +{ + if (SHELL_OsIsUnicode()) + return DoEnvironmentSubstW(x, y); + return DoEnvironmentSubstA(x, y); +} + +/************************************************************************* + * @ [SHELL32.243] + * + * Win98+ by-ordinal routine. In Win98 this routine returns zero and + * does nothing else. Possibly this does something in NT or SHELL32 5.0? + * + */ + +BOOL WINAPI shell32_243(DWORD a, DWORD b) +{ + return FALSE; +} + +/************************************************************************* + * @ [SHELL32.714] + */ +DWORD WINAPI SHELL32_714(LPVOID x) +{ + FIXME("(%s)stub\n", debugstr_w(x)); + return 0; +} + +/************************************************************************* + * SHAddFromPropSheetExtArray [SHELL32.167] + */ +DWORD WINAPI SHAddFromPropSheetExtArray(DWORD a, DWORD b, DWORD c) +{ + FIXME("(%08lx,%08lx,%08lx)stub\n", a, b, c); + return 0; +} + +/************************************************************************* + * SHCreatePropSheetExtArray [SHELL32.168] + */ +DWORD WINAPI SHCreatePropSheetExtArray(DWORD a, LPCSTR b, DWORD c) +{ + FIXME("(%08lx,%s,%08lx)stub\n", a, debugstr_a(b), c); + return 0; +} + +/************************************************************************* + * SHReplaceFromPropSheetExtArray [SHELL32.170] + */ +DWORD WINAPI SHReplaceFromPropSheetExtArray(DWORD a, DWORD b, DWORD c, DWORD d) +{ + FIXME("(%08lx,%08lx,%08lx,%08lx)stub\n", a, b, c, d); + return 0; +} + +/************************************************************************* + * SHDestroyPropSheetExtArray [SHELL32.169] + */ +DWORD WINAPI SHDestroyPropSheetExtArray(DWORD a) +{ + FIXME("(%08lx)stub\n", a); + return 0; +} + +/************************************************************************* + * CIDLData_CreateFromIDArray [SHELL32.83] + * + * Create IDataObject from PIDLs?? + */ +HRESULT WINAPI CIDLData_CreateFromIDArray( + LPCITEMIDLIST pidlFolder, + DWORD cpidlFiles, + LPCITEMIDLIST *lppidlFiles, + LPDATAOBJECT *ppdataObject) +{ + UINT i; + HWND hwnd = 0; /*FIXME: who should be hwnd of owner? set to desktop */ + + TRACE("(%p, %ld, %p, %p)\n", pidlFolder, cpidlFiles, lppidlFiles, ppdataObject); + if (TRACE_ON(pidl)) + { + pdump (pidlFolder); + for (i=0; i +#include +#include +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "winreg.h" +#include "wingdi.h" +#include "winuser.h" + +#include "shlobj.h" +#include "shresdef.h" +#include "shell32_main.h" +#include "undocshell.h" +#include "pidl.h" +#include "wine/unicode.h" +#include "shlwapi.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/* + ########## Combining and Constructing paths ########## +*/ + +/************************************************************************* + * PathAppend [SHELL32.36] + */ +BOOL WINAPI PathAppendAW( + LPVOID lpszPath1, + LPCVOID lpszPath2) +{ + if (SHELL_OsIsUnicode()) + return PathAppendW(lpszPath1, lpszPath2); + return PathAppendA(lpszPath1, lpszPath2); +} + +/************************************************************************* + * PathCombine [SHELL32.37] + */ +LPVOID WINAPI PathCombineAW( + LPVOID szDest, + LPCVOID lpszDir, + LPCVOID lpszFile) +{ + if (SHELL_OsIsUnicode()) + return PathCombineW( szDest, lpszDir, lpszFile ); + return PathCombineA( szDest, lpszDir, lpszFile ); +} + +/************************************************************************* + * PathAddBackslash [SHELL32.32] + */ +LPVOID WINAPI PathAddBackslashAW(LPVOID lpszPath) +{ + if(SHELL_OsIsUnicode()) + return PathAddBackslashW(lpszPath); + return PathAddBackslashA(lpszPath); +} + +/************************************************************************* + * PathBuildRoot [SHELL32.30] + */ +LPVOID WINAPI PathBuildRootAW(LPVOID lpszPath, int drive) +{ + if(SHELL_OsIsUnicode()) + return PathBuildRootW(lpszPath, drive); + return PathBuildRootA(lpszPath, drive); +} + +/* + Extracting Component Parts +*/ + +/************************************************************************* + * PathFindFileName [SHELL32.34] + */ +LPVOID WINAPI PathFindFileNameAW(LPCVOID lpszPath) +{ + if(SHELL_OsIsUnicode()) + return PathFindFileNameW(lpszPath); + return PathFindFileNameA(lpszPath); +} + +/************************************************************************* + * PathFindExtension [SHELL32.31] + */ +LPVOID WINAPI PathFindExtensionAW(LPCVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathFindExtensionW(lpszPath); + return PathFindExtensionA(lpszPath); + +} + +/************************************************************************* + * PathGetExtensionA [internal] + * + * NOTES + * exported by ordinal + * return value points to the first char after the dot + */ +static LPSTR PathGetExtensionA(LPCSTR lpszPath) +{ + TRACE("(%s)\n",lpszPath); + + lpszPath = PathFindExtensionA(lpszPath); + return (LPSTR)(*lpszPath?(lpszPath+1):lpszPath); +} + +/************************************************************************* + * PathGetExtensionW [internal] + */ +static LPWSTR PathGetExtensionW(LPCWSTR lpszPath) +{ + TRACE("(%s)\n",debugstr_w(lpszPath)); + + lpszPath = PathFindExtensionW(lpszPath); + return (LPWSTR)(*lpszPath?(lpszPath+1):lpszPath); +} + +/************************************************************************* + * PathGetExtension [SHELL32.158] + */ +LPVOID WINAPI PathGetExtensionAW(LPCVOID lpszPath,DWORD void1, DWORD void2) +{ + if (SHELL_OsIsUnicode()) + return PathGetExtensionW(lpszPath); + return PathGetExtensionA(lpszPath); +} + +/************************************************************************* + * PathGetArgs [SHELL32.52] + */ +LPVOID WINAPI PathGetArgsAW(LPVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathGetArgsW(lpszPath); + return PathGetArgsA(lpszPath); +} + +/************************************************************************* + * PathGetDriveNumber [SHELL32.57] + */ +int WINAPI PathGetDriveNumberAW(LPVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathGetDriveNumberW(lpszPath); + return PathGetDriveNumberA(lpszPath); +} + +/************************************************************************* + * PathRemoveFileSpec [SHELL32.35] + */ +BOOL WINAPI PathRemoveFileSpecAW(LPVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathRemoveFileSpecW(lpszPath); + return PathRemoveFileSpecA(lpszPath); +} + +/************************************************************************* + * PathStripPath [SHELL32.38] + */ +void WINAPI PathStripPathAW(LPVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + PathStripPathW(lpszPath); + else + PathStripPathA(lpszPath); +} + +/************************************************************************* + * PathStripToRoot [SHELL32.50] + */ +BOOL WINAPI PathStripToRootAW(LPVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathStripToRootW(lpszPath); + return PathStripToRootA(lpszPath); +} + +/************************************************************************* + * PathRemoveArgs [SHELL32.251] + */ +void WINAPI PathRemoveArgsAW(LPVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + PathRemoveArgsW(lpszPath); + else + PathRemoveArgsA(lpszPath); +} + +/************************************************************************* + * PathRemoveExtension [SHELL32.250] + */ +void WINAPI PathRemoveExtensionAW(LPVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + PathRemoveExtensionW(lpszPath); + else + PathRemoveExtensionA(lpszPath); +} + + +/* + Path Manipulations +*/ + +/************************************************************************* + * PathGetShortPathA [internal] + */ +static void PathGetShortPathA(LPSTR pszPath) +{ + CHAR path[MAX_PATH]; + + TRACE("%s\n", pszPath); + + if (GetShortPathNameA(pszPath, path, MAX_PATH)) + { + lstrcpyA(pszPath, path); + } +} + +/************************************************************************* + * PathGetShortPathW [internal] + */ +static void PathGetShortPathW(LPWSTR pszPath) +{ + WCHAR path[MAX_PATH]; + + TRACE("%s\n", debugstr_w(pszPath)); + + if (GetShortPathNameW(pszPath, path, MAX_PATH)) + { + lstrcpyW(pszPath, path); + } +} + +/************************************************************************* + * PathGetShortPath [SHELL32.92] + */ +VOID WINAPI PathGetShortPathAW(LPVOID pszPath) +{ + if(SHELL_OsIsUnicode()) + PathGetShortPathW(pszPath); + PathGetShortPathA(pszPath); +} + +/************************************************************************* + * PathRemoveBlanks [SHELL32.33] + */ +void WINAPI PathRemoveBlanksAW(LPVOID str) +{ + if(SHELL_OsIsUnicode()) + PathRemoveBlanksW(str); + else + PathRemoveBlanksA(str); +} + +/************************************************************************* + * PathQuoteSpaces [SHELL32.55] + */ +VOID WINAPI PathQuoteSpacesAW (LPVOID lpszPath) +{ + if(SHELL_OsIsUnicode()) + PathQuoteSpacesW(lpszPath); + else + PathQuoteSpacesA(lpszPath); +} + +/************************************************************************* + * PathUnquoteSpaces [SHELL32.56] + */ +VOID WINAPI PathUnquoteSpacesAW(LPVOID str) +{ + if(SHELL_OsIsUnicode()) + PathUnquoteSpacesW(str); + else + PathUnquoteSpacesA(str); +} + +/************************************************************************* + * PathParseIconLocation [SHELL32.249] + */ +int WINAPI PathParseIconLocationAW (LPVOID lpszPath) +{ + if(SHELL_OsIsUnicode()) + return PathParseIconLocationW(lpszPath); + return PathParseIconLocationA(lpszPath); +} + +/* + ########## Path Testing ########## +*/ +/************************************************************************* + * PathIsUNC [SHELL32.39] + */ +BOOL WINAPI PathIsUNCAW (LPCVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathIsUNCW( lpszPath ); + return PathIsUNCA( lpszPath ); +} + +/************************************************************************* + * PathIsRelative [SHELL32.40] + */ +BOOL WINAPI PathIsRelativeAW (LPCVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathIsRelativeW( lpszPath ); + return PathIsRelativeA( lpszPath ); +} + +/************************************************************************* + * PathIsRoot [SHELL32.29] + */ +BOOL WINAPI PathIsRootAW(LPCVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathIsRootW(lpszPath); + return PathIsRootA(lpszPath); +} + +/************************************************************************* + * PathIsExeA [internal] + */ +static BOOL PathIsExeA (LPCSTR lpszPath) +{ + LPCSTR lpszExtension = PathGetExtensionA(lpszPath); + int i; + static const char * const lpszExtensions[] = + {"exe", "com", "pif", "cmd", "bat", "scf", "scr", NULL }; + + TRACE("path=%s\n",lpszPath); + + for(i=0; lpszExtensions[i]; i++) + if (!strcasecmp(lpszExtension,lpszExtensions[i])) return TRUE; + + return FALSE; +} + +/************************************************************************* + * PathIsExeW [internal] + */ +static BOOL PathIsExeW (LPCWSTR lpszPath) +{ + LPCWSTR lpszExtension = PathGetExtensionW(lpszPath); + int i; + static const WCHAR lpszExtensions[][4] = + {{'e','x','e','\0'}, {'c','o','m','\0'}, {'p','i','f','\0'}, + {'c','m','d','\0'}, {'b','a','t','\0'}, {'s','c','f','\0'}, + {'s','c','r','\0'}, {'\0'} }; + + TRACE("path=%s\n",debugstr_w(lpszPath)); + + for(i=0; lpszExtensions[i][0]; i++) + if (!strcmpiW(lpszExtension,lpszExtensions[i])) return TRUE; + + return FALSE; +} + +/************************************************************************* + * PathIsExe [SHELL32.43] + */ +BOOL WINAPI PathIsExeAW (LPCVOID path) +{ + if (SHELL_OsIsUnicode()) + return PathIsExeW (path); + return PathIsExeA(path); +} + +/************************************************************************* + * PathIsDirectory [SHELL32.159] + */ +BOOL WINAPI PathIsDirectoryAW (LPCVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathIsDirectoryW (lpszPath); + return PathIsDirectoryA (lpszPath); +} + +/************************************************************************* + * PathFileExists [SHELL32.45] + */ +BOOL WINAPI PathFileExistsAW (LPCVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return PathFileExistsW (lpszPath); + return PathFileExistsA (lpszPath); +} + +/************************************************************************* + * PathMatchSpec [SHELL32.46] + */ +BOOL WINAPI PathMatchSpecAW(LPVOID name, LPVOID mask) +{ + if (SHELL_OsIsUnicode()) + return PathMatchSpecW( name, mask ); + return PathMatchSpecA( name, mask ); +} + +/************************************************************************* + * PathIsSameRoot [SHELL32.650] + */ +BOOL WINAPI PathIsSameRootAW(LPCVOID lpszPath1, LPCVOID lpszPath2) +{ + if (SHELL_OsIsUnicode()) + return PathIsSameRootW(lpszPath1, lpszPath2); + return PathIsSameRootA(lpszPath1, lpszPath2); +} + +/************************************************************************* + * IsLFNDriveA [SHELL32.41] + */ +BOOL WINAPI IsLFNDriveA(LPCSTR lpszPath) +{ + DWORD fnlen; + + if (!GetVolumeInformationA(lpszPath, NULL, 0, NULL, &fnlen, NULL, NULL, 0)) + return FALSE; + return fnlen > 12; +} + +/************************************************************************* + * IsLFNDriveW [SHELL32.42] + */ +BOOL WINAPI IsLFNDriveW(LPCWSTR lpszPath) +{ + DWORD fnlen; + + if (!GetVolumeInformationW(lpszPath, NULL, 0, NULL, &fnlen, NULL, NULL, 0)) + return FALSE; + return fnlen > 12; +} + +/************************************************************************* + * IsLFNDrive [SHELL32.119] + */ +BOOL WINAPI IsLFNDriveAW(LPCVOID lpszPath) +{ + if (SHELL_OsIsUnicode()) + return IsLFNDriveW(lpszPath); + return IsLFNDriveA(lpszPath); +} + +/* + ########## Creating Something Unique ########## +*/ +/************************************************************************* + * PathMakeUniqueNameA [internal] + */ +BOOL WINAPI PathMakeUniqueNameA( + LPSTR lpszBuffer, + DWORD dwBuffSize, + LPCSTR lpszShortName, + LPCSTR lpszLongName, + LPCSTR lpszPathName) +{ + FIXME("%p %lu %s %s %s stub\n", + lpszBuffer, dwBuffSize, debugstr_a(lpszShortName), + debugstr_a(lpszLongName), debugstr_a(lpszPathName)); + return TRUE; +} + +/************************************************************************* + * PathMakeUniqueNameW [internal] + */ +BOOL WINAPI PathMakeUniqueNameW( + LPWSTR lpszBuffer, + DWORD dwBuffSize, + LPCWSTR lpszShortName, + LPCWSTR lpszLongName, + LPCWSTR lpszPathName) +{ + FIXME("%p %lu %s %s %s stub\n", + lpszBuffer, dwBuffSize, debugstr_w(lpszShortName), + debugstr_w(lpszLongName), debugstr_w(lpszPathName)); + return TRUE; +} + +/************************************************************************* + * PathMakeUniqueName [SHELL32.47] + */ +BOOL WINAPI PathMakeUniqueNameAW( + LPVOID lpszBuffer, + DWORD dwBuffSize, + LPCVOID lpszShortName, + LPCVOID lpszLongName, + LPCVOID lpszPathName) +{ + if (SHELL_OsIsUnicode()) + return PathMakeUniqueNameW(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName); + return PathMakeUniqueNameA(lpszBuffer,dwBuffSize, lpszShortName,lpszLongName,lpszPathName); +} + +/************************************************************************* + * PathYetAnotherMakeUniqueName [SHELL32.75] + * + * NOTES + * exported by ordinal + */ +BOOL WINAPI PathYetAnotherMakeUniqueName( + LPWSTR lpszBuffer, + LPCWSTR lpszPathName, + LPCWSTR lpszShortName, + LPCWSTR lpszLongName) +{ + FIXME("(%p, %s, %s ,%s):stub.\n", + lpszBuffer, debugstr_w(lpszPathName), debugstr_w(lpszShortName), debugstr_w(lpszLongName)); + return TRUE; +} + + +/* + ########## cleaning and resolving paths ########## + */ + +/************************************************************************* + * PathFindOnPath [SHELL32.145] + */ +BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs) +{ + if (SHELL_OsIsUnicode()) + return PathFindOnPathW(sFile, (LPCWSTR *)sOtherDirs); + return PathFindOnPathA(sFile, (LPCSTR *)sOtherDirs); +} + +/************************************************************************* + * PathCleanupSpec [SHELL32.171] + * + * lpszFile is changed in place. + */ +int WINAPI PathCleanupSpec( LPCWSTR lpszPathW, LPWSTR lpszFileW ) +{ + int i = 0; + DWORD rc = 0; + int length = 0; + + if (SHELL_OsIsUnicode()) + { + LPWSTR p = lpszFileW; + + TRACE("Cleanup %s\n",debugstr_w(lpszFileW)); + + if (lpszPathW) + length = strlenW(lpszPathW); + + while (*p) + { + int gct = PathGetCharTypeW(*p); + if (gct == GCT_INVALID || gct == GCT_WILD || gct == GCT_SEPARATOR) + { + lpszFileW[i]='-'; + rc |= PCS_REPLACEDCHAR; + } + else + lpszFileW[i]=*p; + i++; + p++; + if (length + i == MAX_PATH) + { + rc |= PCS_FATAL | PCS_PATHTOOLONG; + break; + } + } + lpszFileW[i]=0; + } + else + { + LPSTR lpszFileA = (LPSTR)lpszFileW; + LPCSTR lpszPathA = (LPSTR)lpszPathW; + LPSTR p = lpszFileA; + + TRACE("Cleanup %s\n",debugstr_a(lpszFileA)); + + if (lpszPathA) + length = strlen(lpszPathA); + + while (*p) + { + int gct = PathGetCharTypeA(*p); + if (gct == GCT_INVALID || gct == GCT_WILD || gct == GCT_SEPARATOR) + { + lpszFileA[i]='-'; + rc |= PCS_REPLACEDCHAR; + } + else + lpszFileA[i]=*p; + i++; + p++; + if (length + i == MAX_PATH) + { + rc |= PCS_FATAL | PCS_PATHTOOLONG; + break; + } + } + lpszFileA[i]=0; + } + return rc; +} + +/************************************************************************* + * PathQualifyA [SHELL32] + */ +BOOL WINAPI PathQualifyA(LPCSTR pszPath) +{ + FIXME("%s\n",pszPath); + return 0; +} + +/************************************************************************* + * PathQualifyW [SHELL32] + */ +BOOL WINAPI PathQualifyW(LPCWSTR pszPath) +{ + FIXME("%s\n",debugstr_w(pszPath)); + return 0; +} + +/************************************************************************* + * PathQualify [SHELL32.49] + */ +BOOL WINAPI PathQualifyAW(LPCVOID pszPath) +{ + if (SHELL_OsIsUnicode()) + return PathQualifyW(pszPath); + return PathQualifyA(pszPath); +} + +/************************************************************************* + * PathResolveA [SHELL32.51] + */ +BOOL WINAPI PathResolveA( + LPSTR lpszPath, + LPCSTR *alpszPaths, + DWORD dwFlags) +{ + FIXME("(%s,%p,0x%08lx),stub!\n", + lpszPath, *alpszPaths, dwFlags); + return 0; +} + +/************************************************************************* + * PathResolveW [SHELL32] + */ +BOOL WINAPI PathResolveW( + LPWSTR lpszPath, + LPCWSTR *alpszPaths, + DWORD dwFlags) +{ + FIXME("(%s,%p,0x%08lx),stub!\n", + debugstr_w(lpszPath), debugstr_w(*alpszPaths), dwFlags); + return 0; +} + +/************************************************************************* + * PathResolve [SHELL32.51] + */ +BOOL WINAPI PathResolveAW( + LPVOID lpszPath, + LPCVOID *alpszPaths, + DWORD dwFlags) +{ + if (SHELL_OsIsUnicode()) + return PathResolveW(lpszPath, (LPCWSTR*)alpszPaths, dwFlags); + return PathResolveA(lpszPath, (LPCSTR*)alpszPaths, dwFlags); +} + +/************************************************************************* +* PathProcessCommandA [SHELL32.653] +*/ +HRESULT WINAPI PathProcessCommandA ( + LPCSTR lpszPath, + LPSTR lpszBuff, + DWORD dwBuffSize, + DWORD dwFlags) +{ + FIXME("%s %p 0x%04lx 0x%04lx stub\n", + lpszPath, lpszBuff, dwBuffSize, dwFlags); + strcpy(lpszBuff, lpszPath); + return 0; +} + +/************************************************************************* +* PathProcessCommandW +*/ +HRESULT WINAPI PathProcessCommandW ( + LPCWSTR lpszPath, + LPWSTR lpszBuff, + DWORD dwBuffSize, + DWORD dwFlags) +{ + FIXME("(%s, %p, 0x%04lx, 0x%04lx) stub\n", + debugstr_w(lpszPath), lpszBuff, dwBuffSize, dwFlags); + strcpyW(lpszBuff, lpszPath); + return 0; +} + +/************************************************************************* +* PathProcessCommand (SHELL32.653) +*/ +HRESULT WINAPI PathProcessCommandAW ( + LPCVOID lpszPath, + LPVOID lpszBuff, + DWORD dwBuffSize, + DWORD dwFlags) +{ + if (SHELL_OsIsUnicode()) + return PathProcessCommandW(lpszPath, lpszBuff, dwBuffSize, dwFlags); + return PathProcessCommandA(lpszPath, lpszBuff, dwBuffSize, dwFlags); +} + +/* + ########## special ########## +*/ + +/************************************************************************* + * PathSetDlgItemPath (SHELL32.48) + */ +VOID WINAPI PathSetDlgItemPathAW(HWND hDlg, int id, LPCVOID pszPath) +{ + if (SHELL_OsIsUnicode()) + PathSetDlgItemPathW(hDlg, id, pszPath); + else + PathSetDlgItemPathA(hDlg, id, pszPath); +} + +static const WCHAR szCurrentVersion[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\0'}; +static const WCHAR Administrative_ToolsW[] = {'A','d','m','i','n','i','s','t','r','a','t','i','v','e',' ','T','o','o','l','s','\0'}; +static const WCHAR AppDataW[] = {'A','p','p','D','a','t','a','\0'}; +static const WCHAR CacheW[] = {'C','a','c','h','e','\0'}; +static const WCHAR CD_BurningW[] = {'C','D',' ','B','u','r','n','i','n','g','\0'}; +static const WCHAR Common_Administrative_ToolsW[] = {'C','o','m','m','o','n',' ','A','d','m','i','n','i','s','t','r','a','t','i','v','e',' ','T','o','o','l','s','\0'}; +static const WCHAR Common_AppDataW[] = {'C','o','m','m','o','n',' ','A','p','p','D','a','t','a','\0'}; +static const WCHAR Common_DesktopW[] = {'C','o','m','m','o','n',' ','D','e','s','k','t','o','p','\0'}; +static const WCHAR Common_DocumentsW[] = {'C','o','m','m','o','n',' ','D','o','c','u','m','e','n','t','s','\0'}; +static const WCHAR CommonFilesDirW[] = {'C','o','m','m','o','n','F','i','l','e','s','D','i','r','\0'}; +static const WCHAR CommonMusicW[] = {'C','o','m','m','o','n','M','u','s','i','c','\0'}; +static const WCHAR CommonPicturesW[] = {'C','o','m','m','o','n','P','i','c','t','u','r','e','s','\0'}; +static const WCHAR Common_ProgramsW[] = {'C','o','m','m','o','n',' ','P','r','o','g','r','a','m','s','\0'}; +static const WCHAR Common_StartUpW[] = {'C','o','m','m','o','n',' ','S','t','a','r','t','U','p','\0'}; +static const WCHAR Common_Start_MenuW[] = {'C','o','m','m','o','n',' ','S','t','a','r','t',' ','M','e','n','u','\0'}; +static const WCHAR Common_TemplatesW[] = {'C','o','m','m','o','n',' ','T','e','m','p','l','a','t','e','s','\0'}; +static const WCHAR CommonVideoW[] = {'C','o','m','m','o','n','V','i','d','e','o','\0'}; +static const WCHAR CookiesW[] = {'C','o','o','k','i','e','s','\0'}; +static const WCHAR DesktopW[] = {'D','e','s','k','t','o','p','\0'}; +static const WCHAR FavoritesW[] = {'F','a','v','o','r','i','t','e','s','\0'}; +static const WCHAR FontsW[] = {'F','o','n','t','s','\0'}; +static const WCHAR HistoryW[] = {'H','i','s','t','o','r','y','\0'}; +static const WCHAR Local_AppDataW[] = {'L','o','c','a','l',' ','A','p','p','D','a','t','a','\0'}; +static const WCHAR My_MusicW[] = {'M','y',' ','M','u','s','i','c','\0'}; +static const WCHAR My_PicturesW[] = {'M','y',' ','P','i','c','t','u','r','e','s','\0'}; +static const WCHAR My_VideoW[] = {'M','y',' ','V','i','d','e','o','\0'}; +static const WCHAR NetHoodW[] = {'N','e','t','H','o','o','d','\0'}; +static const WCHAR PersonalW[] = {'P','e','r','s','o','n','a','l','\0'}; +static const WCHAR PrintHoodW[] = {'P','r','i','n','t','H','o','o','d','\0'}; +static const WCHAR ProgramFilesDirW[] = {'P','r','o','g','r','a','m','F','i','l','e','s','D','i','r','\0'}; +static const WCHAR ProgramsW[] = {'P','r','o','g','r','a','m','s','\0'}; +static const WCHAR RecentW[] = {'R','e','c','e','n','t','\0'}; +static const WCHAR ResourcesW[] = {'R','e','s','o','u','r','c','e','s','\0'}; +static const WCHAR SendToW[] = {'S','e','n','d','T','o','\0'}; +static const WCHAR StartUpW[] = {'S','t','a','r','t','U','p','\0'}; +static const WCHAR Start_MenuW[] = {'S','t','a','r','t',' ','M','e','n','u','\0'}; +static const WCHAR TemplatesW[] = {'T','e','m','p','l','a','t','e','s','\0'}; +static const WCHAR DefaultW[] = {'.','D','e','f','a','u','l','t','\0'}; +static const WCHAR AllUsersProfileW[] = {'%','A','L','L','U','S','E','R','S','P','R','O','F','I','L','E','%','\0'}; +static const WCHAR UserProfileW[] = {'%','U','S','E','R','P','R','O','F','I','L','E','%','\0'}; +static const WCHAR SystemDriveW[] = {'%','S','y','s','t','e','m','D','r','i','v','e','%','\0'}; +static const WCHAR ProfileListW[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s',' ','N','T','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','P','r','o','f','i','l','e','L','i','s','t',0}; +static const WCHAR ProfilesDirectoryW[] = {'P','r','o','f','i','l','e','s','D','i','r','e','c','t','o','r','y',0}; +static const WCHAR AllUsersProfileValueW[] = {'A','l','l','U','s','e','r','s','P','r','o','f','i','l','e','\0'}; +static const WCHAR szSHFolders[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','E','x','p','l','o','r','e','r','\\','S','h','e','l','l',' ','F','o','l','d','e','r','s','\0'}; +static const WCHAR szSHUserFolders[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','E','x','p','l','o','r','e','r','\\','U','s','e','r',' ','S','h','e','l','l',' ','F','o','l','d','e','r','s','\0'}; +/* This defaults to L"Documents and Settings" on Windows 2000/XP, but we're + * acting more Windows 9x-like for now. + */ +static const WCHAR szDefaultProfileDirW[] = {'w','i','n','d','o','w','s','\\','p','r','o','f','i','l','e','s','\0'}; +static const WCHAR AllUsersW[] = {'A','l','l',' ','U','s','e','r','s','\0'}; + +typedef enum _CSIDL_Type { + CSIDL_Type_User, + CSIDL_Type_AllUsers, + CSIDL_Type_CurrVer, + CSIDL_Type_Disallowed, + CSIDL_Type_NonExistent, + CSIDL_Type_WindowsPath, + CSIDL_Type_SystemPath, +} CSIDL_Type; + +typedef struct +{ + CSIDL_Type type; + LPCWSTR szValueName; + LPCWSTR szDefaultPath; /* fallback string or resource ID */ +} CSIDL_DATA; + +static const CSIDL_DATA CSIDL_Data[] = +{ + { /* 0x00 - CSIDL_DESKTOP */ + CSIDL_Type_User, + DesktopW, + MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY) + }, + { /* 0x01 - CSIDL_INTERNET */ + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x02 - CSIDL_PROGRAMS */ + CSIDL_Type_User, + ProgramsW, + MAKEINTRESOURCEW(IDS_PROGRAMS) + }, + { /* 0x03 - CSIDL_CONTROLS (.CPL files) */ + CSIDL_Type_SystemPath, + NULL, + NULL + }, + { /* 0x04 - CSIDL_PRINTERS */ + CSIDL_Type_SystemPath, + NULL, + NULL + }, + { /* 0x05 - CSIDL_PERSONAL */ + CSIDL_Type_User, + PersonalW, + MAKEINTRESOURCEW(IDS_PERSONAL) + }, + { /* 0x06 - CSIDL_FAVORITES */ + CSIDL_Type_User, + FavoritesW, + MAKEINTRESOURCEW(IDS_FAVORITES) + }, + { /* 0x07 - CSIDL_STARTUP */ + CSIDL_Type_User, + StartUpW, + MAKEINTRESOURCEW(IDS_STARTUP) + }, + { /* 0x08 - CSIDL_RECENT */ + CSIDL_Type_User, + RecentW, + MAKEINTRESOURCEW(IDS_RECENT) + }, + { /* 0x09 - CSIDL_SENDTO */ + CSIDL_Type_User, + SendToW, + MAKEINTRESOURCEW(IDS_SENDTO) + }, + { /* 0x0a - CSIDL_BITBUCKET - Recycle Bin */ + CSIDL_Type_Disallowed, + NULL, + NULL, + }, + { /* 0x0b - CSIDL_STARTMENU */ + CSIDL_Type_User, + Start_MenuW, + MAKEINTRESOURCEW(IDS_STARTMENU) + }, + { /* 0x0c - CSIDL_MYDOCUMENTS */ + CSIDL_Type_Disallowed, /* matches WinXP--can't get its path */ + NULL, + NULL + }, + { /* 0x0d - CSIDL_MYMUSIC */ + CSIDL_Type_User, + My_MusicW, + MAKEINTRESOURCEW(IDS_MYMUSIC) + }, + { /* 0x0e - CSIDL_MYVIDEO */ + CSIDL_Type_User, + My_VideoW, + MAKEINTRESOURCEW(IDS_MYVIDEO) + }, + { /* 0x0f - unassigned */ + CSIDL_Type_Disallowed, + NULL, + NULL, + }, + { /* 0x10 - CSIDL_DESKTOPDIRECTORY */ + CSIDL_Type_User, + DesktopW, + MAKEINTRESOURCEW(IDS_DESKTOPDIRECTORY) + }, + { /* 0x11 - CSIDL_DRIVES */ + CSIDL_Type_Disallowed, + NULL, + NULL, + }, + { /* 0x12 - CSIDL_NETWORK */ + CSIDL_Type_Disallowed, + NULL, + NULL, + }, + { /* 0x13 - CSIDL_NETHOOD */ + CSIDL_Type_User, + NetHoodW, + MAKEINTRESOURCEW(IDS_NETHOOD) + }, + { /* 0x14 - CSIDL_FONTS */ + CSIDL_Type_WindowsPath, + NULL, + FontsW + }, + { /* 0x15 - CSIDL_TEMPLATES */ + CSIDL_Type_User, + TemplatesW, + MAKEINTRESOURCEW(IDS_TEMPLATES) + }, + { /* 0x16 - CSIDL_COMMON_STARTMENU */ + CSIDL_Type_AllUsers, + Common_Start_MenuW, + MAKEINTRESOURCEW(IDS_STARTMENU) + }, + { /* 0x17 - CSIDL_COMMON_PROGRAMS */ + CSIDL_Type_AllUsers, + Common_ProgramsW, + MAKEINTRESOURCEW(IDS_PROGRAMS) + }, + { /* 0x18 - CSIDL_COMMON_STARTUP */ + CSIDL_Type_AllUsers, + Common_StartUpW, + MAKEINTRESOURCEW(IDS_STARTUP) + }, + { /* 0x19 - CSIDL_COMMON_DESKTOPDIRECTORY */ + CSIDL_Type_AllUsers, + Common_DesktopW, + MAKEINTRESOURCEW(IDS_DESKTOP) + }, + { /* 0x1a - CSIDL_APPDATA */ + CSIDL_Type_User, + AppDataW, + MAKEINTRESOURCEW(IDS_APPDATA) + }, + { /* 0x1b - CSIDL_PRINTHOOD */ + CSIDL_Type_User, + PrintHoodW, + MAKEINTRESOURCEW(IDS_PRINTHOOD) + }, + { /* 0x1c - CSIDL_LOCAL_APPDATA */ + CSIDL_Type_User, + Local_AppDataW, + MAKEINTRESOURCEW(IDS_LOCAL_APPDATA) + }, + { /* 0x1d - CSIDL_ALTSTARTUP */ + CSIDL_Type_NonExistent, + NULL, + NULL + }, + { /* 0x1e - CSIDL_COMMON_ALTSTARTUP */ + CSIDL_Type_NonExistent, + NULL, + NULL + }, + { /* 0x1f - CSIDL_COMMON_FAVORITES */ + CSIDL_Type_AllUsers, + FavoritesW, + MAKEINTRESOURCEW(IDS_FAVORITES) + }, + { /* 0x20 - CSIDL_INTERNET_CACHE */ + CSIDL_Type_User, + CacheW, + MAKEINTRESOURCEW(IDS_INTERNET_CACHE) + }, + { /* 0x21 - CSIDL_COOKIES */ + CSIDL_Type_User, + CookiesW, + MAKEINTRESOURCEW(IDS_COOKIES) + }, + { /* 0x22 - CSIDL_HISTORY */ + CSIDL_Type_User, + HistoryW, + MAKEINTRESOURCEW(IDS_HISTORY) + }, + { /* 0x23 - CSIDL_COMMON_APPDATA */ + CSIDL_Type_AllUsers, + Common_AppDataW, + MAKEINTRESOURCEW(IDS_APPDATA) + }, + { /* 0x24 - CSIDL_WINDOWS */ + CSIDL_Type_WindowsPath, + NULL, + NULL + }, + { /* 0x25 - CSIDL_SYSTEM */ + CSIDL_Type_SystemPath, + NULL, + NULL + }, + { /* 0x26 - CSIDL_PROGRAM_FILES */ + CSIDL_Type_CurrVer, + ProgramFilesDirW, + MAKEINTRESOURCEW(IDS_PROGRAM_FILES) + }, + { /* 0x27 - CSIDL_MYPICTURES */ + CSIDL_Type_User, + My_PicturesW, + MAKEINTRESOURCEW(IDS_MYPICTURES) + }, + { /* 0x28 - CSIDL_PROFILE */ + CSIDL_Type_User, + NULL, + NULL + }, + { /* 0x29 - CSIDL_SYSTEMX86 */ + CSIDL_Type_NonExistent, + NULL, + NULL + }, + { /* 0x2a - CSIDL_PROGRAM_FILESX86 */ + CSIDL_Type_NonExistent, + NULL, + NULL + }, + { /* 0x2b - CSIDL_PROGRAM_FILES_COMMON */ + CSIDL_Type_CurrVer, + CommonFilesDirW, + MAKEINTRESOURCEW(IDS_PROGRAM_FILES_COMMON) + }, + { /* 0x2c - CSIDL_PROGRAM_FILES_COMMONX86 */ + CSIDL_Type_NonExistent, + NULL, + NULL + }, + { /* 0x2d - CSIDL_COMMON_TEMPLATES */ + CSIDL_Type_AllUsers, + Common_TemplatesW, + MAKEINTRESOURCEW(IDS_TEMPLATES) + }, + { /* 0x2e - CSIDL_COMMON_DOCUMENTS */ + CSIDL_Type_AllUsers, + Common_DocumentsW, + MAKEINTRESOURCEW(IDS_COMMON_DOCUMENTS) + }, + { /* 0x2f - CSIDL_COMMON_ADMINTOOLS */ + CSIDL_Type_AllUsers, + Common_Administrative_ToolsW, + MAKEINTRESOURCEW(IDS_ADMINTOOLS) + }, + { /* 0x30 - CSIDL_ADMINTOOLS */ + CSIDL_Type_User, + Administrative_ToolsW, + MAKEINTRESOURCEW(IDS_ADMINTOOLS) + }, + { /* 0x31 - CSIDL_CONNECTIONS */ + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x32 - unassigned */ + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x33 - unassigned */ + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x34 - unassigned */ + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x35 - CSIDL_COMMON_MUSIC */ + CSIDL_Type_AllUsers, + CommonMusicW, + MAKEINTRESOURCEW(IDS_COMMON_MUSIC) + }, + { /* 0x36 - CSIDL_COMMON_PICTURES */ + CSIDL_Type_AllUsers, + CommonPicturesW, + MAKEINTRESOURCEW(IDS_COMMON_PICTURES) + }, + { /* 0x37 - CSIDL_COMMON_VIDEO */ + CSIDL_Type_AllUsers, + CommonVideoW, + MAKEINTRESOURCEW(IDS_COMMON_VIDEO) + }, + { /* 0x38 - CSIDL_RESOURCES */ + CSIDL_Type_WindowsPath, + NULL, + ResourcesW + }, + { /* 0x39 - CSIDL_RESOURCES_LOCALIZED */ + CSIDL_Type_NonExistent, + NULL, + NULL + }, + { /* 0x3a - CSIDL_COMMON_OEM_LINKS */ + CSIDL_Type_NonExistent, + NULL, + NULL + }, + { /* 0x3b - CSIDL_CDBURN_AREA */ + CSIDL_Type_User, + CD_BurningW, + MAKEINTRESOURCEW(IDS_CDBURN_AREA) + }, + { /* 0x3c unassigned */ + CSIDL_Type_Disallowed, + NULL, + NULL + }, + { /* 0x3d - CSIDL_COMPUTERSNEARME */ + CSIDL_Type_Disallowed, /* FIXME */ + NULL, + NULL + }, + { /* 0x3e - CSIDL_PROFILES */ + CSIDL_Type_Disallowed, /* oddly, this matches WinXP */ + NULL, + NULL + } +}; + +static HRESULT _SHExpandEnvironmentStrings(LPCWSTR szSrc, LPWSTR szDest); + +/* Gets the value named value from the registry key + * rootKey\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders + * (or from rootKey\userPrefix\... if userPrefix is not NULL) into path, which + * is assumed to be MAX_PATH WCHARs in length. + * If it exists, expands the value and writes the expanded value to + * rootKey\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders + * Returns successful error code if the value was retrieved from the registry, + * and a failure otherwise. + */ +static HRESULT _SHGetUserShellFolderPath(HKEY rootKey, LPCWSTR userPrefix, + LPCWSTR value, LPWSTR path) +{ + HRESULT hr; + WCHAR shellFolderPath[MAX_PATH], userShellFolderPath[MAX_PATH]; + LPCWSTR pShellFolderPath, pUserShellFolderPath; + DWORD dwDisp, dwType, dwPathLen = MAX_PATH; + HKEY userShellFolderKey, shellFolderKey; + + TRACE("%p,%s,%s,%p\n",rootKey, debugstr_w(userPrefix), debugstr_w(value), + path); + + if (userPrefix) + { + strcpyW(shellFolderPath, userPrefix); + PathAddBackslashW(shellFolderPath); + strcatW(shellFolderPath, szSHFolders); + pShellFolderPath = shellFolderPath; + strcpyW(userShellFolderPath, userPrefix); + PathAddBackslashW(userShellFolderPath); + strcatW(userShellFolderPath, szSHUserFolders); + pUserShellFolderPath = userShellFolderPath; + } + else + { + pUserShellFolderPath = szSHUserFolders; + pShellFolderPath = szSHFolders; + } + + if (RegCreateKeyExW(rootKey, pShellFolderPath, 0, NULL, 0, KEY_ALL_ACCESS, + NULL, &shellFolderKey, &dwDisp)) + { + TRACE("Failed to create %s\n", debugstr_w(pShellFolderPath)); + return E_FAIL; + } + if (RegCreateKeyExW(rootKey, pUserShellFolderPath, 0, NULL, 0, + KEY_ALL_ACCESS, NULL, &userShellFolderKey, &dwDisp)) + { + TRACE("Failed to create %s\n", + debugstr_w(pUserShellFolderPath)); + RegCloseKey(shellFolderKey); + return E_FAIL; + } + + if (!RegQueryValueExW(userShellFolderKey, value, NULL, &dwType, + (LPBYTE)path, &dwPathLen) && (dwType == REG_EXPAND_SZ || dwType == REG_SZ)) + { + path[dwPathLen / sizeof(WCHAR)] = '\0'; + if (dwType == REG_EXPAND_SZ && path[0] == '%') + { + WCHAR szTemp[MAX_PATH]; + + _SHExpandEnvironmentStrings(path, szTemp); + strncpyW(path, szTemp, MAX_PATH); + } + RegSetValueExW(shellFolderKey, value, 0, REG_SZ, (LPBYTE)path, + (strlenW(path) + 1) * sizeof(WCHAR)); + hr = S_OK; + } + else + hr = E_FAIL; + RegCloseKey(shellFolderKey); + RegCloseKey(userShellFolderKey); + TRACE("returning 0x%08lx\n", hr); + return hr; +} + +/* Gets a 'semi-expanded' default value of the CSIDL with index folder into + * pszPath, based on the entries in CSIDL_Data. By semi-expanded, I mean: + * - The entry's szDefaultPath may be either a string value or an integer + * resource identifier. In the latter case, the string value of the resource + * is written. + * - Depending on the entry's type, the path may begin with an (unexpanded) + * environment variable name. The caller is responsible for expanding + * environment strings if so desired. + * The types that are prepended with environment variables are: + * CSIDL_Type_User: %USERPROFILE% + * CSIDL_Type_AllUsers: %ALLUSERSPROFILE% + * CSIDL_Type_CurrVer: %SystemDrive% + * (Others might make sense too, but as yet are unneeded.) + * FIXME: there are two special cases for the default value: + * - the "My Documents" (CSIDL_PERSONAL) entry should be $HOME + * - the CSIDL_DESKTOP and CSIDL_DESKTOPDIRECTORY (which have the same path) + * should be $HOME/Desktop if it exists + * But, $HOME doesn't seem to be inherited into the Wine environment. I could + * use getenv, but this returns me a UNIX path, which may or may not be + * reachable from any currently mounted DOS drives. + */ +static HRESULT _SHGetDefaultValue(BYTE folder, LPWSTR pszPath) +{ + HRESULT hr; + WCHAR resourcePath[MAX_PATH]; + LPCWSTR pDefaultPath = NULL; + + TRACE("0x%02x,%p\n", folder, pszPath); + + if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) + return E_INVALIDARG; + if (!pszPath) + return E_INVALIDARG; + + if (CSIDL_Data[folder].szDefaultPath && + IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath)) + { + if (LoadStringW(shell32_hInstance, + (UINT)CSIDL_Data[folder].szDefaultPath, resourcePath, MAX_PATH)) + { + hr = S_OK; + pDefaultPath = resourcePath; + } + else + { + FIXME("LoadString failed, missing translation?\n"); + hr = E_FAIL; + } + } + else + { + hr = S_OK; + pDefaultPath = CSIDL_Data[folder].szDefaultPath; + } + if (SUCCEEDED(hr)) + { + switch (CSIDL_Data[folder].type) + { + case CSIDL_Type_User: + strcpyW(pszPath, UserProfileW); + break; + case CSIDL_Type_AllUsers: + strcpyW(pszPath, AllUsersProfileW); + break; + case CSIDL_Type_CurrVer: + strcpyW(pszPath, SystemDriveW); + break; + default: + ; /* no corresponding env. var, do nothing */ + } + if (pDefaultPath) + { + PathAddBackslashW(pszPath); + strcatW(pszPath, pDefaultPath); + } + } + TRACE("returning 0x%08lx\n", hr); + return hr; +} + +/* Gets the (unexpanded) value of the folder with index folder into pszPath. + * The folder's type is assumed to be CSIDL_Type_CurrVer. Its default value + * can be overridden in the HKLM\\szCurrentVersion key. + * If dwFlags has SHGFP_TYPE_DEFAULT set or if the value isn't overridden in + * the registry, uses _SHGetDefaultValue to get the value. + */ +static HRESULT _SHGetCurrentVersionPath(DWORD dwFlags, BYTE folder, + LPWSTR pszPath) +{ + HRESULT hr; + + TRACE("0x%08lx,0x%02x,%p\n", dwFlags, folder, pszPath); + + if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) + return E_INVALIDARG; + if (CSIDL_Data[folder].type != CSIDL_Type_CurrVer) + return E_INVALIDARG; + if (!pszPath) + return E_INVALIDARG; + + if (dwFlags & SHGFP_TYPE_DEFAULT) + hr = _SHGetDefaultValue(folder, pszPath); + else + { + HKEY hKey; + DWORD dwDisp; + + if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szCurrentVersion, 0, + NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, &dwDisp)) + hr = E_FAIL; + else + { + DWORD dwType, dwPathLen = MAX_PATH * sizeof(WCHAR); + + if (RegQueryValueExW(hKey, CSIDL_Data[folder].szValueName, NULL, + &dwType, (LPBYTE)pszPath, &dwPathLen) || + (dwType != REG_SZ && dwType != REG_EXPAND_SZ)) + { + hr = _SHGetDefaultValue(folder, pszPath); + dwType = REG_EXPAND_SZ; + RegSetValueExW(hKey, CSIDL_Data[folder].szValueName, 0, dwType, + (LPBYTE)pszPath, (strlenW(pszPath)+1)*sizeof(WCHAR)); + } + else + { + pszPath[dwPathLen / sizeof(WCHAR)] = '\0'; + hr = S_OK; + } + RegCloseKey(hKey); + } + } + TRACE("returning 0x%08lx (output path is %s)\n", hr, debugstr_w(pszPath)); + return hr; +} + +/* Gets the user's path (unexpanded) for the CSIDL with index folder: + * If SHGFP_TYPE_DEFAULT is set, calls _SHGetDefaultValue for it. Otherwise + * calls _SHGetUserShellFolderPath for it. Where it looks depends on hToken: + * - if hToken is -1, looks in HKEY_USERS\.Default + * - otherwise looks first in HKEY_CURRENT_USER, followed by HKEY_LOCAL_MACHINE + * if HKEY_CURRENT_USER doesn't contain any entries. If both fail, finally + * calls _SHGetDefaultValue for it. + */ +static HRESULT _SHGetUserProfilePath(HANDLE hToken, DWORD dwFlags, BYTE folder, + LPWSTR pszPath) +{ + HRESULT hr; + + TRACE("%p,0x%08lx,0x%02x,%p\n", hToken, dwFlags, folder, pszPath); + + if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) + return E_INVALIDARG; + if (CSIDL_Data[folder].type != CSIDL_Type_User) + return E_INVALIDARG; + if (!pszPath) + return E_INVALIDARG; + + /* Only the current user and the default user are supported right now + * I'm afraid. + * FIXME: should be able to call GetTokenInformation on the token, + * then call ConvertSidToStringSidW on it to get the user prefix. + * But Wine's registry doesn't store user info by sid, it stores it + * by user name (and I don't know how to convert from a token to a + * user name). + */ + if (hToken != NULL && hToken != (HANDLE)-1) + { + FIXME("unsupported for user other than current or default\n"); + return E_FAIL; + } + + if (dwFlags & SHGFP_TYPE_DEFAULT) + hr = _SHGetDefaultValue(folder, pszPath); + else + { + LPCWSTR userPrefix = NULL; + HKEY hRootKey; + + if (hToken == (HANDLE)-1) + { + hRootKey = HKEY_USERS; + userPrefix = DefaultW; + } + else /* hToken == NULL, other values disallowed above */ + hRootKey = HKEY_CURRENT_USER; + hr = _SHGetUserShellFolderPath(hRootKey, userPrefix, + CSIDL_Data[folder].szValueName, pszPath); + if (FAILED(hr) && hRootKey != HKEY_LOCAL_MACHINE) + hr = _SHGetUserShellFolderPath(HKEY_LOCAL_MACHINE, NULL, + CSIDL_Data[folder].szValueName, pszPath); + if (FAILED(hr)) + hr = _SHGetDefaultValue(folder, pszPath); + } + TRACE("returning 0x%08lx (output path is %s)\n", hr, debugstr_w(pszPath)); + return hr; +} + +/* Gets the (unexpanded) path for the CSIDL with index folder. If dwFlags has + * SHGFP_TYPE_DEFAULT set, calls _SHGetDefaultValue. Otherwise calls + * _SHGetUserShellFolderPath for it, looking only in HKEY_LOCAL_MACHINE. + * If this fails, falls back to _SHGetDefaultValue. + */ +static HRESULT _SHGetAllUsersProfilePath(DWORD dwFlags, BYTE folder, + LPWSTR pszPath) +{ + HRESULT hr; + + TRACE("0x%08lx,0x%02x,%p\n", dwFlags, folder, pszPath); + + if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) + return E_INVALIDARG; + if (CSIDL_Data[folder].type != CSIDL_Type_AllUsers) + return E_INVALIDARG; + if (!pszPath) + return E_INVALIDARG; + + if (dwFlags & SHGFP_TYPE_DEFAULT) + hr = _SHGetDefaultValue(folder, pszPath); + else + { + hr = _SHGetUserShellFolderPath(HKEY_LOCAL_MACHINE, NULL, + CSIDL_Data[folder].szValueName, pszPath); + if (FAILED(hr)) + hr = _SHGetDefaultValue(folder, pszPath); + } + TRACE("returning 0x%08lx (output path is %s)\n", hr, debugstr_w(pszPath)); + return hr; +} + +static HRESULT _SHOpenProfilesKey(PHKEY pKey) +{ + LONG lRet; + DWORD disp; + + lRet = RegCreateKeyExW(HKEY_LOCAL_MACHINE, ProfileListW, 0, NULL, 0, + KEY_ALL_ACCESS, NULL, pKey, &disp); + return HRESULT_FROM_WIN32(lRet); +} + +/* Reads the value named szValueName from the key profilesKey (assumed to be + * opened by _SHOpenProfilesKey) into szValue, which is assumed to be MAX_PATH + * WCHARs in length. If it doesn't exist, returns szDefault (and saves + * szDefault to the registry). + */ +static HRESULT _SHGetProfilesValue(HKEY profilesKey, LPCWSTR szValueName, + LPWSTR szValue, LPCWSTR szDefault) +{ + HRESULT hr; + DWORD type, dwPathLen = MAX_PATH * sizeof(WCHAR); + LONG lRet; + + TRACE("%p,%s,%p,%s\n", profilesKey, debugstr_w(szValueName), szValue, + debugstr_w(szDefault)); + lRet = RegQueryValueExW(profilesKey, szValueName, NULL, &type, + (LPBYTE)szValue, &dwPathLen); + if (!lRet && (type == REG_SZ || type == REG_EXPAND_SZ) && dwPathLen + && *szValue) + { + dwPathLen /= sizeof(WCHAR); + szValue[dwPathLen] = '\0'; + hr = S_OK; + } + else + { + /* Missing or invalid value, set a default */ + strncpyW(szValue, szDefault, MAX_PATH); + szValue[MAX_PATH - 1] = '\0'; + TRACE("Setting missing value %s to %s\n", debugstr_w(szValueName), + debugstr_w(szValue)); + lRet = RegSetValueExW(profilesKey, szValueName, 0, REG_EXPAND_SZ, + (LPBYTE)szValue, (strlenW(szValue) + 1) * sizeof(WCHAR)); + if (lRet) + hr = HRESULT_FROM_WIN32(lRet); + else + hr = S_OK; + } + TRACE("returning 0x%08lx (output value is %s)\n", hr, debugstr_w(szValue)); + return hr; +} + +/* From the original Wine source: + * + * Attempts to expand environment variables from szSrc into szDest, which is + * assumed to be MAX_PATH characters in length. Before referring to the + * environment, handles a few variables directly, because the environment + * variables may not be set when this is called (as during Wine's installation + * when default values are being written to the registry). + * The directly handled environment variables, and their source, are: + * - ALLUSERSPROFILE, USERPROFILE: reads from the registry + * - SystemDrive: uses GetSystemDirectoryW and uses the drive portion of its + * path + * If one of the directly handled environment variables is expanded, only + * expands a single variable, and only in the beginning of szSrc. + * + * That's fine for Wine, but it breaks in ReactOS where we have profile paths + * like "c:\documents and settings\Administrator.REACTOS". Anyway, we have the + * environment variables handy so we'll just use them instead of hacking around + */ +static HRESULT _SHExpandEnvironmentStrings(LPCWSTR szSrc, LPWSTR szDest) +{ + HRESULT hr; + WCHAR szTemp[MAX_PATH], szProfilesPrefix[MAX_PATH] = { 0 }; + + TRACE("%s, %p\n", debugstr_w(szSrc), szDest); + + if (!szSrc || !szDest) return E_INVALIDARG; + + /* short-circuit if there's nothing to expand */ + if (szSrc[0] != '%') + { + strcpyW(szDest, szSrc); + hr = S_OK; + goto end; + } + + *szDest = 0; + strcpyW(szTemp, szSrc); + while (SUCCEEDED(hr) && szTemp[0] == '%') + { + DWORD ret = ExpandEnvironmentStringsW(szSrc, szDest, MAX_PATH); + + if (ret > MAX_PATH) + hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + else if (ret == 0) + hr = HRESULT_FROM_WIN32(GetLastError()); + else + hr = S_OK; + if (SUCCEEDED(hr) && szDest[0] == '%') + strcpyW(szTemp, szDest); + else + { + /* terminate loop */ + szTemp[0] = '\0'; + } + } +end: + TRACE("returning 0x%08lx (input was %s, output is %s)\n", hr, + debugstr_w(szSrc), debugstr_w(szDest)); + return hr; +} + +/************************************************************************* + * SHGetFolderPathW [SHELL32.@] + * + * NOTES + * Converts nFolder to path. Most values can be overridden in either + * HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders + * or in the same location in HKLM. + * The registry usage is explained by the following tech note: + * http://www.microsoft.com/windows2000/techinfo/reskit/en-us/default.asp?url=/windows2000/techinfo/reskit/en-us/regentry/36173.asp + * The "Shell Folders" registry key was used in NT4 and earlier systems. + * Beginning with Windows 2000, the "User Shell Folders" key is used, so + * changes made to it are made to the former key too. This synchronization is + * done on-demand: not until someone requests the value of one of these paths + * (by calling one of the SHGet functions) is the value synchronized. + * Furthermore, as explained here: + * http://www.microsoft.com/windows2000/techinfo/reskit/en-us/default.asp?url=/windows2000/techinfo/reskit/en-us/regentry/36276.asp + * the HKCU paths take precedence over the HKLM paths. + * + **********************************************************************/ +HRESULT WINAPI SHGetFolderPathW( + HWND hwndOwner, + int nFolder, + HANDLE hToken, + DWORD dwFlags, + LPWSTR pszPath) +{ + HRESULT hr; + WCHAR szBuildPath[MAX_PATH], szTemp[MAX_PATH]; + DWORD folder = nFolder & CSIDL_FOLDER_MASK; + CSIDL_Type type; + int ret; + + TRACE("%p,%p,nFolder=0x%04x\n", hwndOwner,pszPath,nFolder); + + /* Windows always NULL-terminates the resulting path regardless of success + * or failure, so do so first + */ + if (pszPath) + *pszPath = '\0'; + if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) + return E_INVALIDARG; + szTemp[0] = 0; + type = CSIDL_Data[folder].type; + switch (type) + { + case CSIDL_Type_Disallowed: + hr = E_INVALIDARG; + break; + case CSIDL_Type_NonExistent: + hr = S_FALSE; + break; + case CSIDL_Type_WindowsPath: + GetWindowsDirectoryW(szTemp, MAX_PATH); + if (CSIDL_Data[folder].szDefaultPath && + !IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath) && + *CSIDL_Data[folder].szDefaultPath) + { + PathAddBackslashW(szTemp); + strcatW(szTemp, CSIDL_Data[folder].szDefaultPath); + } + hr = S_OK; + break; + case CSIDL_Type_SystemPath: + GetSystemDirectoryW(szTemp, MAX_PATH); + if (CSIDL_Data[folder].szDefaultPath && + !IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath) && + *CSIDL_Data[folder].szDefaultPath) + { + PathAddBackslashW(szTemp); + strcatW(szTemp, CSIDL_Data[folder].szDefaultPath); + } + hr = S_OK; + break; + case CSIDL_Type_CurrVer: + hr = _SHGetCurrentVersionPath(dwFlags, folder, szTemp); + break; + case CSIDL_Type_User: + hr = _SHGetUserProfilePath(hToken, dwFlags, folder, szTemp); + break; + case CSIDL_Type_AllUsers: + hr = _SHGetAllUsersProfilePath(dwFlags, folder, szTemp); + break; + default: + FIXME("bogus type %d, please fix\n", type); + hr = E_INVALIDARG; + break; + } + + /* Expand environment strings if necessary */ + if (*szTemp == '%') + hr = _SHExpandEnvironmentStrings(szTemp, szBuildPath); + else + strcpyW(szBuildPath, szTemp); + /* Copy the path if it's available before we might return */ + if (SUCCEEDED(hr) && pszPath) + strcpyW(pszPath, szBuildPath); + + if (FAILED(hr)) goto end; + + /* if we don't care about existing directories we are ready */ + if(nFolder & CSIDL_FLAG_DONT_VERIFY) goto end; + + if (PathFileExistsW(szBuildPath)) goto end; + + /* not existing but we are not allowed to create it. The return value + * is verified against shell32 version 6.0. + */ + if (!(nFolder & CSIDL_FLAG_CREATE)) + { + hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + goto end; + } + + /* create directory/directories */ + ret = SHCreateDirectoryExW(hwndOwner, szBuildPath, NULL); + if (ret && ret != ERROR_ALREADY_EXISTS) + { + ERR("Failed to create directory '%s'.\n", debugstr_w(szBuildPath)); + hr = E_FAIL; + goto end; + } + + TRACE("Created missing system directory '%s'\n", debugstr_w(szBuildPath)); +end: + TRACE("returning 0x%08lx (final path is %s)\n", hr, debugstr_w(szBuildPath)); + return hr; +} + +/************************************************************************* + * SHGetFolderPathA [SHELL32.@] + */ +HRESULT WINAPI SHGetFolderPathA( + HWND hwndOwner, + int nFolder, + HANDLE hToken, + DWORD dwFlags, + LPSTR pszPath) +{ + WCHAR szTemp[MAX_PATH]; + HRESULT hr; + + TRACE("%p,%p,nFolder=0x%04x\n",hwndOwner,pszPath,nFolder); + + if (pszPath) + *pszPath = '\0'; + hr = SHGetFolderPathW(hwndOwner, nFolder, hToken, dwFlags, szTemp); + if (SUCCEEDED(hr) && pszPath) + WideCharToMultiByte(CP_ACP, 0, szTemp, -1, pszPath, MAX_PATH, NULL, + NULL); + + return hr; +} + +/* For each folder in folders, if its value has not been set in the registry, + * call _SHGetUserProfilePath or _SHGetAllUsersProfilePath (depending on the + * folder's type) to get the unexpanded value first. + * This will create the expanded value in the Shell Folders key, and + * return the unexpanded value. + * Write the unexpanded value to User Shell Folders, and query it with + * SHGetFolderPath to force the creation of the directory if it doesn't + * already exist. + */ +static HRESULT _SHRegisterFolders(HKEY hRootKey, HANDLE hToken, + LPCWSTR szUserShellFolderPath, const UINT folders[], UINT foldersLen) +{ + UINT i; + WCHAR path[MAX_PATH]; + HRESULT hr = S_OK; + HKEY hKey = NULL; + DWORD dwDisp, dwType, dwPathLen; + LONG ret; + + TRACE("%p,%p,%s,%p,%u\n", hRootKey, hToken, + debugstr_w(szUserShellFolderPath), folders, foldersLen); + + ret = RegCreateKeyExW(hRootKey, szUserShellFolderPath, 0, NULL, 0, + KEY_ALL_ACCESS, NULL, &hKey, &dwDisp); + if (ret) + hr = HRESULT_FROM_WIN32(ret); + for (i = 0; SUCCEEDED(hr) && i < foldersLen; i++) + { + dwPathLen = MAX_PATH * sizeof(WCHAR); + if (RegQueryValueExW(hKey, CSIDL_Data[folders[i]].szValueName, NULL, + &dwType, (LPBYTE)path, &dwPathLen) || (dwType != REG_SZ && + dwType != REG_EXPAND_SZ)) + { + *path = '\0'; + if (CSIDL_Data[folders[i]].type == CSIDL_Type_User) + _SHGetUserProfilePath(hToken, SHGFP_TYPE_DEFAULT, folders[i], + path); + else if (CSIDL_Data[folders[i]].type == CSIDL_Type_AllUsers) + _SHGetAllUsersProfilePath(SHGFP_TYPE_DEFAULT, folders[i], path); + else + hr = E_FAIL; + if (*path) + { + ret = RegSetValueExW(hKey, CSIDL_Data[folders[i]].szValueName, + 0, REG_EXPAND_SZ, (LPBYTE)path, + (strlenW(path) + 1) * sizeof(WCHAR)); + if (ret) + hr = HRESULT_FROM_WIN32(ret); + else + hr = SHGetFolderPathW(NULL, folders[i] | CSIDL_FLAG_CREATE, + hToken, SHGFP_TYPE_DEFAULT, NULL); + } + } + } + if (hKey) + RegCloseKey(hKey); + + TRACE("returning 0x%08lx\n", hr); + return hr; +} + +static HRESULT _SHRegisterUserShellFolders(BOOL bDefault) +{ + static const UINT folders[] = { + CSIDL_PROGRAMS, + CSIDL_PERSONAL, + CSIDL_FAVORITES, + CSIDL_STARTUP, + CSIDL_RECENT, + CSIDL_SENDTO, + CSIDL_STARTMENU, + CSIDL_DESKTOPDIRECTORY, + CSIDL_NETHOOD, + CSIDL_TEMPLATES, + CSIDL_PRINTHOOD, + CSIDL_COOKIES, + CSIDL_HISTORY, + }; + WCHAR userShellFolderPath[MAX_PATH]; + LPCWSTR pUserShellFolderPath; + HRESULT hr = S_OK; + HKEY hRootKey; + HANDLE hToken; + + TRACE("%s\n", bDefault ? "TRUE" : "FALSE"); + if (bDefault) + { + hToken = (HANDLE)-1; + hRootKey = HKEY_USERS; + strcpyW(userShellFolderPath, DefaultW); + PathAddBackslashW(userShellFolderPath); + strcatW(userShellFolderPath, szSHUserFolders); + pUserShellFolderPath = userShellFolderPath; + } + else + { + hToken = NULL; + hRootKey = HKEY_CURRENT_USER; + pUserShellFolderPath = szSHUserFolders; + } + + hr = _SHRegisterFolders(hRootKey, hToken, pUserShellFolderPath, + folders, sizeof(folders) / sizeof(folders[0])); + TRACE("returning 0x%08lx\n", hr); + return hr; +} + +static HRESULT _SHRegisterCommonShellFolders(void) +{ + static const UINT folders[] = { + CSIDL_COMMON_STARTMENU, + CSIDL_COMMON_PROGRAMS, + CSIDL_COMMON_STARTUP, + CSIDL_COMMON_DESKTOPDIRECTORY, + CSIDL_COMMON_FAVORITES, + CSIDL_COMMON_APPDATA, + CSIDL_COMMON_TEMPLATES, + CSIDL_COMMON_DOCUMENTS, + }; + HRESULT hr; + + TRACE("\n"); + hr = _SHRegisterFolders(HKEY_LOCAL_MACHINE, NULL, szSHUserFolders, + folders, sizeof(folders) / sizeof(folders[0])); + TRACE("returning 0x%08lx\n", hr); + return hr; +} + +/* Register the default values in the registry, as some apps seem to depend + * on their presence. The set registered was taken from Windows XP. + */ +HRESULT SHELL_RegisterShellFolders(void) +{ + HRESULT hr = _SHRegisterUserShellFolders(TRUE); + + if (SUCCEEDED(hr)) + hr = _SHRegisterUserShellFolders(FALSE); + if (SUCCEEDED(hr)) + hr = _SHRegisterCommonShellFolders(); + return hr; +} + +/************************************************************************* + * SHGetSpecialFolderPathA [SHELL32.@] + */ +BOOL WINAPI SHGetSpecialFolderPathA ( + HWND hwndOwner, + LPSTR szPath, + int nFolder, + BOOL bCreate) +{ + return (SHGetFolderPathA( + hwndOwner, + nFolder + (bCreate ? CSIDL_FLAG_CREATE : 0), + NULL, + 0, + szPath)) == S_OK ? TRUE : FALSE; +} + +/************************************************************************* + * SHGetSpecialFolderPathW + */ +BOOL WINAPI SHGetSpecialFolderPathW ( + HWND hwndOwner, + LPWSTR szPath, + int nFolder, + BOOL bCreate) +{ + return (SHGetFolderPathW( + hwndOwner, + nFolder + (bCreate ? CSIDL_FLAG_CREATE : 0), + NULL, + 0, + szPath)) == S_OK ? TRUE : FALSE; +} + +/************************************************************************* + * SHGetSpecialFolderPath (SHELL32.175) + */ +BOOL WINAPI SHGetSpecialFolderPathAW ( + HWND hwndOwner, + LPVOID szPath, + int nFolder, + BOOL bCreate) + +{ + if (SHELL_OsIsUnicode()) + return SHGetSpecialFolderPathW (hwndOwner, szPath, nFolder, bCreate); + return SHGetSpecialFolderPathA (hwndOwner, szPath, nFolder, bCreate); +} + +/************************************************************************* + * SHGetFolderLocation [SHELL32.@] + * + * NOTES + * Gets the folder locations from the registry and creates a pidl. + * Creates missing reg keys and directories. + * Mostly forwards to SHGetFolderPathW, but a few values of nFolder return + * virtual folders that are handled here. + * + * PARAMS + * hwndOwner [I] + * nFolder [I] CSIDL_xxxxx + * hToken [I] token representing user, or NULL for current user, or -1 for + * default user + * dwReserved [I] must be zero + * ppidl [O] PIDL of a special folder + * + * NOTES + */ +HRESULT WINAPI SHGetFolderLocation( + HWND hwndOwner, + int nFolder, + HANDLE hToken, + DWORD dwReserved, + LPITEMIDLIST *ppidl) +{ + HRESULT hr = E_INVALIDARG; + + TRACE("%p 0x%08x %p 0x%08lx %p\n", + hwndOwner, nFolder, hToken, dwReserved, ppidl); + + if (!ppidl) + return E_INVALIDARG; + if (dwReserved) + return E_INVALIDARG; + + /* The virtual folders' locations are not user-dependent */ + *ppidl = NULL; + switch (nFolder) + { + case CSIDL_DESKTOP: + *ppidl = _ILCreateDesktop(); + break; + + case CSIDL_INTERNET: + *ppidl = _ILCreateIExplore(); + break; + + case CSIDL_CONTROLS: + *ppidl = _ILCreateControlPanel(); + break; + + case CSIDL_PRINTERS: + *ppidl = _ILCreatePrinters(); + break; + + case CSIDL_FONTS: + FIXME("virtual font folder"); + break; + + case CSIDL_BITBUCKET: + *ppidl = _ILCreateBitBucket(); + break; + + case CSIDL_DRIVES: + *ppidl = _ILCreateMyComputer(); + break; + + case CSIDL_NETWORK: + *ppidl = _ILCreateNetwork(); + break; + + default: + { + WCHAR szPath[MAX_PATH]; + + hr = SHGetFolderPathW(hwndOwner, nFolder, hToken, + SHGFP_TYPE_CURRENT, szPath); + if (SUCCEEDED(hr)) + { + DWORD attributes=0; + + TRACE("Value=%s\n", debugstr_w(szPath)); + hr = SHILCreateFromPathW(szPath, ppidl, &attributes); + } + else if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) + { + /* unlike SHGetFolderPath, SHGetFolderLocation in shell32 + * version 6.0 returns E_FAIL for non-existing paths + */ + hr = E_FAIL; + } + } + } + if(*ppidl) + hr = NOERROR; + + TRACE("-- (new pidl %p)\n",*ppidl); + return hr; +} + +/************************************************************************* + * SHGetSpecialFolderLocation [SHELL32.@] + * + * NOTES + * In NT5, SHGetSpecialFolderLocation needs the /Recent + * directory. + */ +HRESULT WINAPI SHGetSpecialFolderLocation( + HWND hwndOwner, + INT nFolder, + LPITEMIDLIST * ppidl) +{ + HRESULT hr = E_INVALIDARG; + + TRACE("(%p,0x%x,%p)\n", hwndOwner,nFolder,ppidl); + + if (!ppidl) + return E_INVALIDARG; + + hr = SHGetFolderLocation(hwndOwner, nFolder, NULL, 0, ppidl); + return hr; +} diff --git a/reactos/lib/shell32/shellreg.c b/reactos/lib/shell32/shellreg.c new file mode 100644 index 00000000000..0fe7eb4b8be --- /dev/null +++ b/reactos/lib/shell32/shellreg.c @@ -0,0 +1,154 @@ +/* + * Shell Registry Access + * + * Copyright 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "shellapi.h" +#include "wingdi.h" +#include "winuser.h" +#include "shlobj.h" +#include "winerror.h" +#include "winreg.h" +#include "winnls.h" + +#include "undocshell.h" +#include "wine/winbase16.h" +#include "shell32_main.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/************************************************************************* + * SHRegOpenKeyA [SHELL32.506] + * + */ +HRESULT WINAPI SHRegOpenKeyA( + HKEY hKey, + LPSTR lpSubKey, + PHKEY phkResult) +{ + TRACE("(%p, %s, %p)\n", hKey, debugstr_a(lpSubKey), phkResult); + return RegOpenKeyA(hKey, lpSubKey, phkResult); +} + +/************************************************************************* + * SHRegOpenKeyW [SHELL32.507] NT 4.0 + * + */ +HRESULT WINAPI SHRegOpenKeyW ( + HKEY hkey, + LPCWSTR lpszSubKey, + PHKEY retkey) +{ + WARN("%p %s %p\n",hkey,debugstr_w(lpszSubKey),retkey); + return RegOpenKeyW( hkey, lpszSubKey, retkey ); +} + +/************************************************************************* + * SHRegQueryValueExA [SHELL32.509] + * + */ +HRESULT WINAPI SHRegQueryValueExA( + HKEY hkey, + LPSTR lpValueName, + LPDWORD lpReserved, + LPDWORD lpType, + LPBYTE lpData, + LPDWORD lpcbData) +{ + TRACE("%p %s %p %p %p %p\n", hkey, lpValueName, lpReserved, lpType, lpData, lpcbData); + return RegQueryValueExA (hkey, lpValueName, lpReserved, lpType, lpData, lpcbData); +} + +/************************************************************************* + * SHRegQueryValueW [SHELL32.510] NT4.0 + * + */ +HRESULT WINAPI SHRegQueryValueW( + HKEY hkey, + LPWSTR lpszSubKey, + LPWSTR lpszData, + LPDWORD lpcbData ) +{ + WARN("%p %s %p %p semi-stub\n", + hkey, debugstr_w(lpszSubKey), lpszData, lpcbData); + return RegQueryValueW( hkey, lpszSubKey, lpszData, lpcbData ); +} + +/************************************************************************* + * SHRegQueryValueExW [SHELL32.511] NT4.0 + * + * FIXME + * if the datatype REG_EXPAND_SZ then expand the string and change + * *pdwType to REG_SZ. + */ +HRESULT WINAPI SHRegQueryValueExW ( + HKEY hkey, + LPWSTR pszValue, + LPDWORD pdwReserved, + LPDWORD pdwType, + LPVOID pvData, + LPDWORD pcbData) +{ + DWORD ret; + WARN("%p %s %p %p %p %p semi-stub\n", + hkey, debugstr_w(pszValue), pdwReserved, pdwType, pvData, pcbData); + ret = RegQueryValueExW ( hkey, pszValue, pdwReserved, pdwType, pvData, pcbData); + return ret; +} + +/************************************************************************* + * SHRegDeleteKeyA [SHELL32.?] + */ +HRESULT WINAPI SHRegDeleteKeyA( + HKEY hkey, + LPCSTR pszSubKey) +{ + FIXME("hkey=%p, %s\n", hkey, debugstr_a(pszSubKey)); + return 0; +} + +/************************************************************************* + * SHRegDeleteKeyW [SHELL32.512] + */ +HRESULT WINAPI SHRegDeleteKeyW( + HKEY hkey, + LPCWSTR pszSubKey) +{ + FIXME("hkey=%p, %s\n", hkey, debugstr_w(pszSubKey)); + return 0; +} + +/************************************************************************* + * SHRegCloseKey [SHELL32.505] NT 4.0 + * + */ +HRESULT WINAPI SHRegCloseKey (HKEY hkey) +{ + TRACE("%p\n",hkey); + return RegCloseKey( hkey ); +} diff --git a/reactos/lib/shell32/shellstring.c b/reactos/lib/shell32/shellstring.c new file mode 100644 index 00000000000..abb25c32f5c --- /dev/null +++ b/reactos/lib/shell32/shellstring.c @@ -0,0 +1,286 @@ +/* + * Copyright 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include + +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "winerror.h" +#include "wingdi.h" +#include "winuser.h" +#include "winreg.h" + +#include "shlobj.h" +#include "shellapi.h" +#include "shlwapi.h" +#include "shell32_main.h" +#include "undocshell.h" +#include "wine/unicode.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/************************* STRRET functions ****************************/ + +BOOL WINAPI StrRetToStrNA(LPSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) +{ + TRACE("dest=%p len=0x%lx strret=%p(%s) pidl=%p\n", + dest,len,src, + (src->uType == STRRET_WSTR) ? "STRRET_WSTR" : + (src->uType == STRRET_CSTR) ? "STRRET_CSTR" : + (src->uType == STRRET_OFFSET) ? "STRRET_OFFSET" : "STRRET_???", + pidl); + + if (!dest) + return FALSE; + + switch (src->uType) + { + case STRRET_WSTR: + WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, dest, len, NULL, NULL); + CoTaskMemFree(src->u.pOleStr); + break; + + case STRRET_CSTR: + lstrcpynA(dest, src->u.cStr, len); + break; + + case STRRET_OFFSET: + lstrcpynA(dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len); + break; + + default: + FIXME("unknown type!\n"); + if (len) *dest = '\0'; + return FALSE; + } + TRACE("-- %s\n", debugstr_a(dest) ); + return TRUE; +} + +/************************************************************************/ + +BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) +{ + TRACE("dest=%p len=0x%lx strret=%p(%s) pidl=%p\n", + dest,len,src, + (src->uType == STRRET_WSTR) ? "STRRET_WSTR" : + (src->uType == STRRET_CSTR) ? "STRRET_CSTR" : + (src->uType == STRRET_OFFSET) ? "STRRET_OFFSET" : "STRRET_???", + pidl); + + if (!dest) + return FALSE; + + switch (src->uType) + { + case STRRET_WSTR: + lstrcpynW(dest, src->u.pOleStr, len); + CoTaskMemFree(src->u.pOleStr); + break; + + case STRRET_CSTR: + if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ) && len) + dest[len-1] = 0; + break; + + case STRRET_OFFSET: + if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1, dest, len ) && len) + dest[len-1] = 0; + break; + + default: + FIXME("unknown type!\n"); + if (len) *dest = '\0'; + return FALSE; + } + return TRUE; +} + + +/************************************************************************* + * StrRetToStrN [SHELL32.96] + * + * converts a STRRET to a normal string + * + * NOTES + * the pidl is for STRRET OFFSET + */ +BOOL WINAPI StrRetToStrNAW(LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) +{ + if(SHELL_OsIsUnicode()) + return StrRetToStrNW(dest, len, src, pidl); + else + return StrRetToStrNA(dest, len, src, pidl); +} + +/************************* OLESTR functions ****************************/ + +/************************************************************************ + * StrToOleStr [SHELL32.163] + * + */ +int WINAPI StrToOleStrA (LPWSTR lpWideCharStr, LPCSTR lpMultiByteString) +{ + TRACE("(%p, %p %s)\n", + lpWideCharStr, lpMultiByteString, debugstr_a(lpMultiByteString)); + + return MultiByteToWideChar(0, 0, lpMultiByteString, -1, lpWideCharStr, MAX_PATH); + +} +int WINAPI StrToOleStrW (LPWSTR lpWideCharStr, LPCWSTR lpWString) +{ + TRACE("(%p, %p %s)\n", + lpWideCharStr, lpWString, debugstr_w(lpWString)); + + strcpyW (lpWideCharStr, lpWString ); + return strlenW(lpWideCharStr); +} + +BOOL WINAPI StrToOleStrAW (LPWSTR lpWideCharStr, LPCVOID lpString) +{ + if (SHELL_OsIsUnicode()) + return StrToOleStrW (lpWideCharStr, lpString); + return StrToOleStrA (lpWideCharStr, lpString); +} + +/************************************************************************* + * StrToOleStrN [SHELL32.79] + * lpMulti, nMulti, nWide [IN] + * lpWide [OUT] + */ +BOOL WINAPI StrToOleStrNA (LPWSTR lpWide, INT nWide, LPCSTR lpStrA, INT nStr) +{ + TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_an(lpStrA,nStr), nStr); + return MultiByteToWideChar (0, 0, lpStrA, nStr, lpWide, nWide); +} +BOOL WINAPI StrToOleStrNW (LPWSTR lpWide, INT nWide, LPCWSTR lpStrW, INT nStr) +{ + TRACE("(%p, %x, %s, %x)\n", lpWide, nWide, debugstr_wn(lpStrW, nStr), nStr); + + if (lstrcpynW (lpWide, lpStrW, nWide)) + { return lstrlenW (lpWide); + } + return 0; +} + +BOOL WINAPI StrToOleStrNAW (LPWSTR lpWide, INT nWide, LPCVOID lpStr, INT nStr) +{ + if (SHELL_OsIsUnicode()) + return StrToOleStrNW (lpWide, nWide, lpStr, nStr); + return StrToOleStrNA (lpWide, nWide, lpStr, nStr); +} + +/************************************************************************* + * OleStrToStrN [SHELL32.78] + */ +BOOL WINAPI OleStrToStrNA (LPSTR lpStr, INT nStr, LPCWSTR lpOle, INT nOle) +{ + TRACE("(%p, %x, %s, %x)\n", lpStr, nStr, debugstr_wn(lpOle,nOle), nOle); + return WideCharToMultiByte (0, 0, lpOle, nOle, lpStr, nStr, NULL, NULL); +} + +BOOL WINAPI OleStrToStrNW (LPWSTR lpwStr, INT nwStr, LPCWSTR lpOle, INT nOle) +{ + TRACE("(%p, %x, %s, %x)\n", lpwStr, nwStr, debugstr_wn(lpOle,nOle), nOle); + + if (lstrcpynW ( lpwStr, lpOle, nwStr)) + { return lstrlenW (lpwStr); + } + return 0; +} + +BOOL WINAPI OleStrToStrNAW (LPVOID lpOut, INT nOut, LPCVOID lpIn, INT nIn) +{ + if (SHELL_OsIsUnicode()) + return OleStrToStrNW (lpOut, nOut, lpIn, nIn); + return OleStrToStrNA (lpOut, nOut, lpIn, nIn); +} + + +/************************************************************************* + * CheckEscapesA [SHELL32.@] + * + * Checks a string for special characters which are not allowed in a path + * and encloses it in quotes if that is the case. + * + * PARAMS + * string [I/O] string to check and on return eventually quoted + * len [I] length of string + * + * RETURNS + * length of actual string + * + * NOTES + * Not really sure if this function returns actually a value at all. + */ +DWORD WINAPI CheckEscapesA( + LPSTR string, /* [I/O] string to check ??*/ + DWORD len) /* [I] is 0 */ +{ + LPWSTR wString; + DWORD ret = 0; + + TRACE("(%s %ld)\n", debugstr_a(string), len); + wString = (LPWSTR)LocalAlloc(LPTR, len * sizeof(WCHAR)); + if (wString) + { + MultiByteToWideChar(CP_ACP, 0, string, len, wString, len); + ret = CheckEscapesW(wString, len); + WideCharToMultiByte(CP_ACP, 0, wString, len, string, len, NULL, NULL); + LocalFree(wString); + } + return ret; +} + +static const WCHAR strEscapedChars[] = {' ','"',',',';','^',0}; + +/************************************************************************* + * CheckEscapesW [SHELL32.@] + * + * see CheckEscapesA + */ +DWORD WINAPI CheckEscapesW( + LPWSTR string, + DWORD len) +{ + DWORD size = lstrlenW(string); + LPWSTR s, d; + + TRACE("(%s %ld) stub\n", debugstr_w(string), len); + + if (StrPBrkW(string, strEscapedChars) && size + 2 <= len) + { + s = &string[size - 1]; + d = &string[size + 2]; + *d-- = 0; + *d-- = '"'; + for (;d > string;) + *d-- = *s--; + *d = '"'; + return size + 2; + } + return size; +} diff --git a/reactos/lib/shell32/shfldr.h b/reactos/lib/shell32/shfldr.h new file mode 100644 index 00000000000..f78026da8f9 --- /dev/null +++ b/reactos/lib/shell32/shfldr.h @@ -0,0 +1,58 @@ + +/* + * Virtual Folder + * common definitions + * + * Copyright 1997 Marcus Meissner + * Copyright 1998, 1999, 2002 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define CHARS_IN_GUID 39 + +typedef struct { + int colnameid; + int pcsFlags; + int fmt; + int cxChar; +} shvheader; + +#define GET_SHGDN_FOR(dwFlags) ((DWORD)dwFlags & (DWORD)0x0000FF00) +#define GET_SHGDN_RELATION(dwFlags) ((DWORD)dwFlags & (DWORD)0x000000FF) + +BOOL SHELL32_GetCustomFolderAttribute (LPCITEMIDLIST pidl, LPCWSTR pwszHeading, LPCWSTR pwszAttribute, LPWSTR pwszValue, DWORD cchValue); + +LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut); +HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST * pidlInOut, + LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes); +HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes); +HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTR szOut, + DWORD dwOutLen); + +HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot, + LPCSTR pathRoot, LPCITEMIDLIST pidlComplete, REFIID riid, LPVOID * ppvOut); + +HRESULT SHELL32_CompareIDs (IShellFolder * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + +static inline int SHELL32_GUIDToStringA (REFGUID guid, LPSTR str) +{ + return sprintf(str, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); +} + +void SHELL_FS_ProcessDisplayFilename(LPSTR szPath, DWORD dwFlags); diff --git a/reactos/lib/shell32/shfldr_desktop.c b/reactos/lib/shell32/shfldr_desktop.c new file mode 100644 index 00000000000..57180471467 --- /dev/null +++ b/reactos/lib/shell32/shfldr_desktop.c @@ -0,0 +1,739 @@ + +/* + * Virtual Desktop Folder + * + * Copyright 1997 Marcus Meissner + * Copyright 1998, 1999, 2002 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wingdi.h" +#include "winuser.h" + +#include "ole2.h" +#include "shlguid.h" + +#include "enumidlist.h" +#include "pidl.h" +#include "undocshell.h" +#include "shell32_main.h" +#include "shresdef.h" +#include "shlwapi.h" +#include "shellfolder.h" +#include "wine/debug.h" +#include "debughlp.h" +#include "shfldr.h" + +WINE_DEFAULT_DEBUG_CHANNEL (shell); + +/*********************************************************************** +* Desktopfolder implementation +*/ + +typedef struct { + IShellFolder2Vtbl *lpVtbl; + DWORD ref; + + CLSID *pclsid; + + /* both paths are parsible from the desktop */ + LPSTR sPathTarget; /* complete path to target used for enumeration and ChangeNotify */ + LPITEMIDLIST pidlRoot; /* absolute pidl */ + + int dwAttributes; /* attributes returned by GetAttributesOf FIXME: use it */ + + UINT cfShellIDList; /* clipboardformat for IDropTarget */ + BOOL fAcceptFmt; /* flag for pending Drop */ +} IGenericSFImpl; + +#define _IUnknown_(This) (IShellFolder*)&(This->lpVtbl) +#define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl) + +static struct IShellFolder2Vtbl vt_MCFldr_ShellFolder2; + +static shvheader DesktopSFHeader[] = { + {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, + {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}, + {IDS_SHV_COLUMN5, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5} +}; + +#define DESKTOPSHELLVIEWCOLUMNS 5 + +/************************************************************************** +* ISF_Desktop_Constructor +*/ +HRESULT WINAPI ISF_Desktop_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +{ + IGenericSFImpl *sf; + char szMyPath[MAX_PATH]; + + TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); + + if (!ppv) + return E_POINTER; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + if (!SHGetSpecialFolderPathA (0, szMyPath, CSIDL_DESKTOPDIRECTORY, TRUE)) + return E_UNEXPECTED; + + sf = (IGenericSFImpl *) LocalAlloc (GMEM_ZEROINIT, sizeof (IGenericSFImpl)); + if (!sf) + return E_OUTOFMEMORY; + + sf->ref = 0; + sf->lpVtbl = &vt_MCFldr_ShellFolder2; + sf->pidlRoot = _ILCreateDesktop (); /* my qualified pidl */ + sf->sPathTarget = SHAlloc (strlen (szMyPath) + 1); + lstrcpyA (sf->sPathTarget, szMyPath); + + if (!SUCCEEDED (IUnknown_QueryInterface (_IUnknown_ (sf), riid, ppv))) { + IUnknown_Release (_IUnknown_ (sf)); + return E_NOINTERFACE; + } + + TRACE ("--(%p)\n", sf); + return S_OK; +} + +/************************************************************************** + * ISF_Desktop_fnQueryInterface + * + * NOTES supports not IPersist/IPersistFolder + */ +static HRESULT WINAPI ISF_Desktop_fnQueryInterface (IShellFolder2 * iface, REFIID riid, LPVOID * ppvObj) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj); + + *ppvObj = NULL; + + if (IsEqualIID (riid, &IID_IUnknown) || IsEqualIID (riid, &IID_IShellFolder) + || IsEqualIID (riid, &IID_IShellFolder2)) { + *ppvObj = This; + } + + if (*ppvObj) { + IUnknown_AddRef ((IUnknown *) (*ppvObj)); + TRACE ("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj); + return S_OK; + } + TRACE ("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI ISF_Desktop_fnAddRef (IShellFolder2 * iface) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return ++(This->ref); +} + +static ULONG WINAPI ISF_Desktop_fnRelease (IShellFolder2 * iface) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + if (!--(This->ref)) { + TRACE ("-- destroying IShellFolder(%p)\n", This); + if (This->pidlRoot) + SHFree (This->pidlRoot); + if (This->sPathTarget) + SHFree (This->sPathTarget); + LocalFree ((HLOCAL) This); + return 0; + } + return This->ref; +} + +/************************************************************************** +* ISF_Desktop_fnParseDisplayName +* +* NOTES +* "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds +* to MyComputer +*/ +static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface, + HWND hwndOwner, + LPBC pbc, + LPOLESTR lpszDisplayName, + DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + WCHAR szElement[MAX_PATH]; + LPCWSTR szNext = NULL; + LPITEMIDLIST pidlTemp = NULL; + HRESULT hr = S_OK; + char szPath[MAX_PATH]; + DWORD len; + CLSID clsid; + + TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", + This, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName), pchEaten, ppidl, pdwAttributes); + + if (!lpszDisplayName || !ppidl) + return E_INVALIDARG; + + *ppidl = 0; + + if (pchEaten) + *pchEaten = 0; /* strange but like the original */ + + if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':') { + szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); + TRACE ("-- element: %s\n", debugstr_w (szElement)); + SHCLSIDFromStringW (szElement + 2, &clsid); + pidlTemp = _ILCreateGuid (PT_GUID, &clsid); + } else if (PathGetDriveNumberW (lpszDisplayName) >= 0) { + /* it's a filesystem path with a drive. Let MyComputer parse it */ + pidlTemp = _ILCreateMyComputer (); + szNext = lpszDisplayName; + } else if (PathIsUNCW(lpszDisplayName)) { + pidlTemp = _ILCreateNetwork(); + szNext = lpszDisplayName; + } else { + /* it's a filesystem path on the desktop. Let a FSFolder parse it */ + + if (*lpszDisplayName) { + /* build a complete path to create a simple pidl */ + lstrcpyA(szPath, This->sPathTarget); + PathAddBackslashA(szPath); + len = lstrlenA(szPath); + WideCharToMultiByte(CP_ACP, 0, lpszDisplayName, -1, szPath + len, MAX_PATH - len, NULL, NULL); + hr = _ILCreateFromPathA(szPath, &pidlTemp); + } else { + pidlTemp = _ILCreateMyComputer(); + } + + szNext = NULL; + } + + if (SUCCEEDED(hr) && pidlTemp) { + if (szNext && *szNext) { + hr = SHELL32_ParseNextElement (iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); + } else { + if (pdwAttributes && *pdwAttributes) { + hr = SHELL32_GetItemAttributes (_IShellFolder_ (This), pidlTemp, pdwAttributes); + } + } + } + + *ppidl = pidlTemp; + + TRACE ("(%p)->(-- ret=0x%08lx)\n", This, hr); + + return hr; +} + +/************************************************************************** + * CreateDesktopEnumList() + */ +static BOOL CreateDesktopEnumList(IEnumIDList *list, DWORD dwFlags) +{ + BOOL ret = TRUE; + char szPath[MAX_PATH]; + + TRACE("(%p)->(flags=0x%08lx) \n",list,dwFlags); + + /*enumerate the root folders */ + if(dwFlags & SHCONTF_FOLDERS) + { + HKEY hkey; + + /*create the pidl for This item */ + ret = AddToEnumList(list, _ILCreateMyComputer()); + + if (ret && !RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\desktop\\NameSpace", + 0, KEY_READ, &hkey)) + { + char iid[50]; + int i=0; + BOOL moreKeys = TRUE; + + while (ret && moreKeys) + { + DWORD size = sizeof (iid); + LONG apiRet = RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, + NULL); + + if (ERROR_SUCCESS == apiRet) + { + ret = AddToEnumList(list, _ILCreateGuidFromStrA(iid)); + i++; + } + else if (ERROR_NO_MORE_ITEMS == apiRet) + moreKeys = FALSE; + else + ret = FALSE; + } + RegCloseKey(hkey); + } + } + + /*enumerate the elements in %windir%\desktop */ + SHGetSpecialFolderPathA(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE); + ret = ret && CreateFolderEnumList(list, szPath, dwFlags); + + return ret; +} + +/************************************************************************** +* ISF_Desktop_fnEnumObjects +*/ +static HRESULT WINAPI ISF_Desktop_fnEnumObjects (IShellFolder2 * iface, + HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); + + *ppEnumIDList = IEnumIDList_Constructor(); + if (*ppEnumIDList) + CreateDesktopEnumList(*ppEnumIDList, dwFlags); + + TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList); + + return *ppEnumIDList ? S_OK : E_OUTOFMEMORY; +} + +/************************************************************************** +* ISF_Desktop_fnBindToObject +*/ +static HRESULT WINAPI ISF_Desktop_fnBindToObject (IShellFolder2 * iface, + LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut); + + return SHELL32_BindToChild (This->pidlRoot, This->sPathTarget, pidl, riid, ppvOut); +} + +/************************************************************************** +* ISF_Desktop_fnBindToStorage +*/ +static HRESULT WINAPI ISF_Desktop_fnBindToStorage (IShellFolder2 * iface, + LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut); + + *ppvOut = NULL; + return E_NOTIMPL; +} + +/************************************************************************** +* ISF_Desktop_fnCompareIDs +*/ + +static HRESULT WINAPI ISF_Desktop_fnCompareIDs (IShellFolder2 * iface, + LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + int nReturn; + + TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2); + nReturn = SHELL32_CompareIDs (_IShellFolder_ (This), lParam, pidl1, pidl2); + TRACE ("-- %i\n", nReturn); + return nReturn; +} + +/************************************************************************** +* ISF_Desktop_fnCreateViewObject +*/ +static HRESULT WINAPI ISF_Desktop_fnCreateViewObject (IShellFolder2 * iface, + HWND hwndOwner, REFIID riid, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + LPSHELLVIEW pShellView; + HRESULT hr = E_INVALIDARG; + + TRACE ("(%p)->(hwnd=%p,%s,%p)\n", This, hwndOwner, shdebugstr_guid (riid), ppvOut); + + if (ppvOut) { + *ppvOut = NULL; + + if (IsEqualIID (riid, &IID_IDropTarget)) { + WARN ("IDropTarget not implemented\n"); + hr = E_NOTIMPL; + } else if (IsEqualIID (riid, &IID_IContextMenu)) { + WARN ("IContextMenu not implemented\n"); + hr = E_NOTIMPL; + } else if (IsEqualIID (riid, &IID_IShellView)) { + pShellView = IShellView_Constructor ((IShellFolder *) iface); + if (pShellView) { + hr = IShellView_QueryInterface (pShellView, riid, ppvOut); + IShellView_Release (pShellView); + } + } + } + TRACE ("-- (%p)->(interface=%p)\n", This, ppvOut); + return hr; +} + +/************************************************************************** +* ISF_Desktop_fnGetAttributesOf +*/ +static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf (IShellFolder2 * iface, + UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + HRESULT hr = S_OK; + + TRACE ("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n", This, cidl, apidl, *rgfInOut); + + if ((!cidl) || (!apidl) || (!rgfInOut)) + return E_INVALIDARG; + + if (*rgfInOut == 0) + *rgfInOut = ~0; + + while (cidl > 0 && *apidl) { + pdump (*apidl); + SHELL32_GetItemAttributes (_IShellFolder_ (This), *apidl, rgfInOut); + apidl++; + cidl--; + } + + TRACE ("-- result=0x%08lx\n", *rgfInOut); + + return hr; +} + +/************************************************************************** +* ISF_Desktop_fnGetUIObjectOf +* +* PARAMETERS +* HWND hwndOwner, //[in ] Parent window for any output +* UINT cidl, //[in ] array size +* LPCITEMIDLIST* apidl, //[in ] simple pidl array +* REFIID riid, //[in ] Requested Interface +* UINT* prgfInOut, //[ ] reserved +* LPVOID* ppvObject) //[out] Resulting Interface +* +*/ +static HRESULT WINAPI ISF_Desktop_fnGetUIObjectOf (IShellFolder2 * iface, + HWND hwndOwner, + UINT cidl, + LPCITEMIDLIST * apidl, + REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + LPITEMIDLIST pidl; + IUnknown *pObj = NULL; + HRESULT hr = E_INVALIDARG; + + TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", + This, hwndOwner, cidl, apidl, shdebugstr_guid (riid), prgfInOut, ppvOut); + + if (ppvOut) { + *ppvOut = NULL; + + if (IsEqualIID (riid, &IID_IContextMenu)) { + pObj = (LPUNKNOWN) ISvItemCm_Constructor ((IShellFolder *) iface, This->pidlRoot, apidl, cidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1)) { + pObj = (LPUNKNOWN) IDataObject_Constructor (hwndOwner, This->pidlRoot, apidl, cidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1)) { + pidl = ILCombine (This->pidlRoot, apidl[0]); + pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl); + SHFree (pidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1)) { + pidl = ILCombine (This->pidlRoot, apidl[0]); + pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl); + SHFree (pidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1)) { + hr = IShellFolder_QueryInterface (iface, &IID_IDropTarget, (LPVOID *) & pObj); + } else if ((IsEqualIID(riid,&IID_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA)) + && (cidl == 1)) { + pidl = ILCombine (This->pidlRoot, apidl[0]); + hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj); + SHFree (pidl); + } else { + hr = E_NOINTERFACE; + } + + if (SUCCEEDED(hr) && !pObj) + hr = E_OUTOFMEMORY; + + *ppvOut = pObj; + } + TRACE ("(%p)->hr=0x%08lx\n", This, hr); + return hr; +} + +/************************************************************************** +* ISF_Desktop_fnGetDisplayNameOf +* +* NOTES +* special case: pidl = null gives desktop-name back +*/ +static HRESULT WINAPI ISF_Desktop_fnGetDisplayNameOf (IShellFolder2 * iface, + LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + CHAR szPath[MAX_PATH]; + GUID const *clsid; + HRESULT hr = S_OK; + + *szPath = '\0'; + + TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); + pdump (pidl); + + if (!strRet) + return E_INVALIDARG; + + if (_ILIsDesktop (pidl)) { + if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) && (GET_SHGDN_FOR (dwFlags) == SHGDN_FORPARSING)) { + lstrcpyA (szPath, This->sPathTarget); + } else { + HCR_GetClassNameA(&CLSID_ShellDesktop, szPath, MAX_PATH); + } + } else if (_ILIsPidlSimple (pidl)) { + if ((clsid = _ILGetGUIDPointer (pidl))) { + if (GET_SHGDN_FOR (dwFlags) == SHGDN_FORPARSING) { + int bWantsForParsing; + + /* + * we can only get a filesystem path from a shellfolder if the value WantsFORPARSING in + * CLSID\\{...}\\shellfolder exists + * exception: the MyComputer folder has this keys not but like any filesystem backed + * folder it needs these behaviour + */ + if (IsEqualIID (clsid, &CLSID_MyComputer)) { + bWantsForParsing = 1; + } else { + /* get the "WantsFORPARSING" flag from the registry */ + char szRegPath[100]; + + lstrcpyA (szRegPath, "CLSID\\"); + SHELL32_GUIDToStringA (clsid, &szRegPath[6]); + lstrcatA (szRegPath, "\\shellfolder"); + bWantsForParsing = + (ERROR_SUCCESS == + SHGetValueA (HKEY_CLASSES_ROOT, szRegPath, "WantsFORPARSING", NULL, NULL, NULL)); + } + + if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) && bWantsForParsing) { + /* we need the filesystem path to the destination folder. Only the folder itself can know it */ + hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags, szPath, MAX_PATH); + } else { + /* parsing name like ::{...} */ + lstrcpyA (szPath, "::"); + SHELL32_GUIDToStringA (clsid, &szPath[2]); + } + } else { + /* user friendly name */ + HCR_GetClassNameA (clsid, szPath, MAX_PATH); + } + } else { + /* file system folder */ + _ILSimpleGetText (pidl, szPath, MAX_PATH); + + if (!_ILIsFolder(pidl)) + SHELL_FS_ProcessDisplayFilename(szPath, dwFlags); + } + } else { + /* a complex pidl, let the subfolder do the work */ + hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags, szPath, MAX_PATH); + } + + if (SUCCEEDED (hr)) { + strRet->uType = STRRET_CSTR; + lstrcpynA (strRet->u.cStr, szPath, MAX_PATH); + } + + TRACE ("-- (%p)->(%s,0x%08lx)\n", This, szPath, hr); + return hr; +} + +/************************************************************************** +* ISF_Desktop_fnSetNameOf +* Changes the name of a file object or subfolder, possibly changing its item +* identifier in the process. +* +* PARAMETERS +* HWND hwndOwner, //[in ] Owner window for output +* LPCITEMIDLIST pidl, //[in ] simple pidl of item to change +* LPCOLESTR lpszName, //[in ] the items new display name +* DWORD dwFlags, //[in ] SHGNO formatting flags +* LPITEMIDLIST* ppidlOut) //[out] simple pidl returned +*/ +static HRESULT WINAPI ISF_Desktop_fnSetNameOf (IShellFolder2 * iface, HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + FIXME ("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); + + return E_FAIL; +} + +static HRESULT WINAPI ISF_Desktop_fnGetDefaultSearchGUID (IShellFolder2 * iface, GUID * pguid) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI ISF_Desktop_fnEnumSearches (IShellFolder2 * iface, IEnumExtraSearch ** ppenum) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI ISF_Desktop_fnGetDefaultColumn (IShellFolder2 * iface, + DWORD dwRes, ULONG * pSort, ULONG * pDisplay) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)\n", This); + + if (pSort) + *pSort = 0; + if (pDisplay) + *pDisplay = 0; + + return S_OK; +} +static HRESULT WINAPI ISF_Desktop_fnGetDefaultColumnState (IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)\n", This); + + if (!pcsFlags || iColumn >= DESKTOPSHELLVIEWCOLUMNS) + return E_INVALIDARG; + + *pcsFlags = DesktopSFHeader[iColumn].pcsFlags; + + return S_OK; +} +static HRESULT WINAPI ISF_Desktop_fnGetDetailsEx (IShellFolder2 * iface, + LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + + return E_NOTIMPL; +} +static HRESULT WINAPI ISF_Desktop_fnGetDetailsOf (IShellFolder2 * iface, + LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + HRESULT hr = E_FAIL; + + TRACE ("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd); + + if (!psd || iColumn >= DESKTOPSHELLVIEWCOLUMNS) + return E_INVALIDARG; + + if (!pidl) { + psd->fmt = DesktopSFHeader[iColumn].fmt; + psd->cxChar = DesktopSFHeader[iColumn].cxChar; + psd->str.uType = STRRET_CSTR; + LoadStringA (shell32_hInstance, DesktopSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH); + return S_OK; + } else { + /* the data from the pidl */ + switch (iColumn) { + case 0: /* name */ + hr = IShellFolder_GetDisplayNameOf (iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); + break; + case 1: /* size */ + _ILGetFileSize (pidl, psd->str.u.cStr, MAX_PATH); + break; + case 2: /* type */ + _ILGetFileType (pidl, psd->str.u.cStr, MAX_PATH); + break; + case 3: /* date */ + _ILGetFileDate (pidl, psd->str.u.cStr, MAX_PATH); + break; + case 4: /* attributes */ + _ILGetFileAttributes (pidl, psd->str.u.cStr, MAX_PATH); + break; + } + hr = S_OK; + psd->str.uType = STRRET_CSTR; + } + + return hr; +} +static HRESULT WINAPI ISF_Desktop_fnMapColumnToSCID (IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} + +static IShellFolder2Vtbl vt_MCFldr_ShellFolder2 = +{ + ISF_Desktop_fnQueryInterface, + ISF_Desktop_fnAddRef, + ISF_Desktop_fnRelease, + ISF_Desktop_fnParseDisplayName, + ISF_Desktop_fnEnumObjects, + ISF_Desktop_fnBindToObject, + ISF_Desktop_fnBindToStorage, + ISF_Desktop_fnCompareIDs, + ISF_Desktop_fnCreateViewObject, + ISF_Desktop_fnGetAttributesOf, + ISF_Desktop_fnGetUIObjectOf, + ISF_Desktop_fnGetDisplayNameOf, + ISF_Desktop_fnSetNameOf, + /* ShellFolder2 */ + ISF_Desktop_fnGetDefaultSearchGUID, + ISF_Desktop_fnEnumSearches, + ISF_Desktop_fnGetDefaultColumn, + ISF_Desktop_fnGetDefaultColumnState, + ISF_Desktop_fnGetDetailsEx, + ISF_Desktop_fnGetDetailsOf, + ISF_Desktop_fnMapColumnToSCID}; diff --git a/reactos/lib/shell32/shfldr_fs.c b/reactos/lib/shell32/shfldr_fs.c new file mode 100644 index 00000000000..d7ef8381b43 --- /dev/null +++ b/reactos/lib/shell32/shfldr_fs.c @@ -0,0 +1,1399 @@ + +/* + * file system folder + * + * Copyright 1997 Marcus Meissner + * Copyright 1998, 1999, 2002 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wingdi.h" +#include "winuser.h" + +#include "ole2.h" +#include "shlguid.h" + +#include "enumidlist.h" +#include "pidl.h" +#include "undocshell.h" +#include "shell32_main.h" +#include "shresdef.h" +#include "shlwapi.h" +#include "shellfolder.h" +#include "wine/debug.h" +#include "debughlp.h" +#include "shfldr.h" + +WINE_DEFAULT_DEBUG_CHANNEL (shell); + +/*********************************************************************** +* IShellFolder implementation +*/ + +typedef struct { + IUnknownVtbl *lpVtbl; + DWORD ref; + IShellFolder2Vtbl *lpvtblShellFolder; + IPersistFolder3Vtbl *lpvtblPersistFolder3; + IDropTargetVtbl *lpvtblDropTarget; + ISFHelperVtbl *lpvtblSFHelper; + + IUnknown *pUnkOuter; /* used for aggregation */ + + CLSID *pclsid; + + /* both paths are parsible from the desktop */ + LPSTR sPathTarget; /* complete path to target used for enumeration and ChangeNotify */ + + LPITEMIDLIST pidlRoot; /* absolute pidl */ + + int dwAttributes; /* attributes returned by GetAttributesOf FIXME: use it */ + + UINT cfShellIDList; /* clipboardformat for IDropTarget */ + BOOL fAcceptFmt; /* flag for pending Drop */ +} IGenericSFImpl; + +static struct IUnknownVtbl unkvt; +static struct IShellFolder2Vtbl sfvt; +static struct IPersistFolder3Vtbl vt_FSFldr_PersistFolder3; /* IPersistFolder3 for a FS_Folder */ +static struct IDropTargetVtbl dtvt; +static struct ISFHelperVtbl shvt; + +#define _IShellFolder2_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblShellFolder))) +#define _ICOM_THIS_From_IShellFolder2(class, name) class* This = (class*)(((char*)name)-_IShellFolder2_Offset); + +#define _IPersistFolder2_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblPersistFolder3))) +#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder2_Offset); + +#define _IPersistFolder3_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblPersistFolder3))) +#define _ICOM_THIS_From_IPersistFolder3(class, name) class* This = (class*)(((char*)name)-_IPersistFolder3_Offset); + +#define _IDropTarget_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblDropTarget))) +#define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset); + +#define _ISFHelper_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblSFHelper))) +#define _ICOM_THIS_From_ISFHelper(class, name) class* This = (class*)(((char*)name)-_ISFHelper_Offset); + +/* + converts This to a interface pointer +*/ +#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl) +#define _IShellFolder_(This) (IShellFolder*)&(This->lpvtblShellFolder) +#define _IShellFolder2_(This) (IShellFolder2*)&(This->lpvtblShellFolder) +#define _IPersist_(This) (IPersist*)&(This->lpvtblPersistFolder3) +#define _IPersistFolder_(This) (IPersistFolder*)&(This->lpvtblPersistFolder3) +#define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpvtblPersistFolder3) +#define _IPersistFolder3_(This) (IPersistFolder3*)&(This->lpvtblPersistFolder3) +#define _IDropTarget_(This) (IDropTarget*)&(This->lpvtblDropTarget) +#define _ISFHelper_(This) (ISFHelper*)&(This->lpvtblSFHelper) + +/************************************************************************** +* registers clipboardformat once +*/ +static void SF_RegisterClipFmt (IGenericSFImpl * This) +{ + TRACE ("(%p)\n", This); + + if (!This->cfShellIDList) { + This->cfShellIDList = RegisterClipboardFormatA (CFSTR_SHELLIDLIST); + } +} + +/************************************************************************** +* we need a separate IUnknown to handle aggregation +* (inner IUnknown) +*/ +static HRESULT WINAPI IUnknown_fnQueryInterface (IUnknown * iface, REFIID riid, LPVOID * ppvObj) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj); + + *ppvObj = NULL; + + if (IsEqualIID (riid, &IID_IUnknown)) + *ppvObj = _IUnknown_ (This); + else if (IsEqualIID (riid, &IID_IShellFolder)) + *ppvObj = _IShellFolder_ (This); + else if (IsEqualIID (riid, &IID_IShellFolder2)) + *ppvObj = _IShellFolder_ (This); + else if (IsEqualIID (riid, &IID_IPersist)) + *ppvObj = _IPersist_ (This); + else if (IsEqualIID (riid, &IID_IPersistFolder)) + *ppvObj = _IPersistFolder_ (This); + else if (IsEqualIID (riid, &IID_IPersistFolder2)) + *ppvObj = _IPersistFolder2_ (This); + else if (IsEqualIID (riid, &IID_IPersistFolder3)) + *ppvObj = _IPersistFolder3_ (This); + else if (IsEqualIID (riid, &IID_ISFHelper)) + *ppvObj = _ISFHelper_ (This); + else if (IsEqualIID (riid, &IID_IDropTarget)) { + *ppvObj = _IDropTarget_ (This); + SF_RegisterClipFmt (This); + } + + if (*ppvObj) { + IUnknown_AddRef ((IUnknown *) (*ppvObj)); + TRACE ("-- Interface = %p\n", *ppvObj); + return S_OK; + } + TRACE ("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI IUnknown_fnAddRef (IUnknown * iface) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return ++(This->ref); +} + +static ULONG WINAPI IUnknown_fnRelease (IUnknown * iface) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + if (!--(This->ref)) { + TRACE ("-- destroying IShellFolder(%p)\n", This); + + if (This->pidlRoot) + SHFree (This->pidlRoot); + if (This->sPathTarget) + SHFree (This->sPathTarget); + LocalFree ((HLOCAL) This); + return 0; + } + return This->ref; +} + +static IUnknownVtbl unkvt = +{ + IUnknown_fnQueryInterface, + IUnknown_fnAddRef, + IUnknown_fnRelease, +}; + +static shvheader GenericSFHeader[] = { + {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, + {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}, + {IDS_SHV_COLUMN5, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5} +}; + +#define GENERICSHELLVIEWCOLUMNS 5 + +/************************************************************************** +* IFSFolder_Constructor +* +* NOTES +* creating undocumented ShellFS_Folder as part of an aggregation +* {F3364BA0-65B9-11CE-A9BA-00AA004AE837} +* +*/ +HRESULT WINAPI IFSFolder_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +{ + IGenericSFImpl *sf; + + TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); + + if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown)) + return CLASS_E_NOAGGREGATION; + sf = (IGenericSFImpl *) LocalAlloc (GMEM_ZEROINIT, sizeof (IGenericSFImpl)); + if (!sf) + return E_OUTOFMEMORY; + + sf->ref = 0; + sf->lpVtbl = &unkvt; + sf->lpvtblShellFolder = &sfvt; + sf->lpvtblPersistFolder3 = &vt_FSFldr_PersistFolder3; + sf->lpvtblDropTarget = &dtvt; + sf->lpvtblSFHelper = &shvt; + sf->pclsid = (CLSID *) & CLSID_ShellFSFolder; + sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_ (sf); + + if (!SUCCEEDED (IUnknown_QueryInterface (_IUnknown_ (sf), riid, ppv))) { + IUnknown_Release (_IUnknown_ (sf)); + return E_NOINTERFACE; + } + + TRACE ("--%p\n", *ppv); + return S_OK; +} + +/************************************************************************** + * IShellFolder_fnQueryInterface + * + * PARAMETERS + * REFIID riid [in ] Requested InterfaceID + * LPVOID* ppvObject [out] Interface* to hold the result + */ +static HRESULT WINAPI IShellFolder_fnQueryInterface (IShellFolder2 * iface, REFIID riid, LPVOID * ppvObj) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj); + + return IUnknown_QueryInterface (This->pUnkOuter, riid, ppvObj); +} + +/************************************************************************** +* IShellFolder_AddRef +*/ + +static ULONG WINAPI IShellFolder_fnAddRef (IShellFolder2 * iface) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_AddRef (This->pUnkOuter); +} + +/************************************************************************** + * IShellFolder_fnRelease + */ +static ULONG WINAPI IShellFolder_fnRelease (IShellFolder2 * iface) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_Release (This->pUnkOuter); +} + +/************************************************************************** +* IShellFolder_ParseDisplayName {SHELL32} +* +* Parse a display name. +* +* PARAMS +* hwndOwner [in] Parent window for any message's +* pbc [in] optional FileSystemBindData context +* lpszDisplayName [in] Unicode displayname. +* pchEaten [out] (unicode) characters processed +* ppidl [out] complex pidl to item +* pdwAttributes [out] items attributes +* +* NOTES +* Every folder tries to parse only its own (the leftmost) pidl and creates a +* subfolder to evaluate the remaining parts. +* Now we can parse into namespaces implemented by shell extensions +* +* Behaviour on win98: lpszDisplayName=NULL -> crash +* lpszDisplayName="" -> returns mycoputer-pidl +* +* FIXME +* pdwAttributes is not set +* pchEaten is not set like in windows +*/ +static HRESULT WINAPI +IShellFolder_fnParseDisplayName (IShellFolder2 * iface, + HWND hwndOwner, + LPBC pbc, + LPOLESTR lpszDisplayName, + DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + HRESULT hr = E_INVALIDARG; + LPCWSTR szNext = NULL; + WCHAR szElement[MAX_PATH]; + CHAR szPath[MAX_PATH]; + LPITEMIDLIST pidlTemp = NULL; + DWORD len; + + TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", + This, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName), pchEaten, ppidl, pdwAttributes); + + if (!lpszDisplayName || !ppidl) + return E_INVALIDARG; + + if (pchEaten) + *pchEaten = 0; /* strange but like the original */ + + if (*lpszDisplayName) { + /* get the next element */ + szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); + + /* build the full pathname to the element */ + lstrcpyA(szPath, This->sPathTarget); + PathAddBackslashA(szPath); + len = lstrlenA(szPath); + WideCharToMultiByte(CP_ACP, 0, szElement, -1, szPath + len, MAX_PATH - len, NULL, NULL); + + /* get the pidl */ + hr = _ILCreateFromPathA(szPath, &pidlTemp); + + if (SUCCEEDED(hr)) { + if (szNext && *szNext) { + /* try to analyse the next element */ + hr = SHELL32_ParseNextElement (iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); + } else { + /* it's the last element */ + if (pdwAttributes && *pdwAttributes) { + hr = SHELL32_GetItemAttributes (_IShellFolder_ (This), pidlTemp, pdwAttributes); + } + } + } + } + + if (SUCCEEDED(hr)) + *ppidl = pidlTemp; + else + *ppidl = NULL; + + TRACE ("(%p)->(-- pidl=%p ret=0x%08lx)\n", This, ppidl ? *ppidl : 0, hr); + + return hr; +} + +/************************************************************************** +* IShellFolder_fnEnumObjects +* PARAMETERS +* HWND hwndOwner, //[in ] Parent Window +* DWORD grfFlags, //[in ] SHCONTF enumeration mask +* LPENUMIDLIST* ppenumIDList //[out] IEnumIDList interface +*/ +static HRESULT WINAPI +IShellFolder_fnEnumObjects (IShellFolder2 * iface, HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); + + *ppEnumIDList = IEnumIDList_Constructor(); + if (*ppEnumIDList) + CreateFolderEnumList(*ppEnumIDList, This->sPathTarget, dwFlags); + + TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList); + + return *ppEnumIDList ? S_OK : E_OUTOFMEMORY; +} + +/************************************************************************** +* IShellFolder_fnBindToObject +* PARAMETERS +* LPCITEMIDLIST pidl, //[in ] relative pidl to open +* LPBC pbc, //[in ] optional FileSystemBindData context +* REFIID riid, //[in ] Initial Interface +* LPVOID* ppvObject //[out] Interface* +*/ +static HRESULT WINAPI +IShellFolder_fnBindToObject (IShellFolder2 * iface, LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, LPVOID * ppvOut) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", This, pidl, pbc, shdebugstr_guid (riid), ppvOut); + + return SHELL32_BindToChild (This->pidlRoot, This->sPathTarget, pidl, riid, ppvOut); +} + +/************************************************************************** +* IShellFolder_fnBindToStorage +* PARAMETERS +* LPCITEMIDLIST pidl, //[in ] complex pidl to store +* LPBC pbc, //[in ] reserved +* REFIID riid, //[in ] Initial storage interface +* LPVOID* ppvObject //[out] Interface* returned +*/ +static HRESULT WINAPI +IShellFolder_fnBindToStorage (IShellFolder2 * iface, LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut); + + *ppvOut = NULL; + return E_NOTIMPL; +} + +/************************************************************************** +* IShellFolder_fnCompareIDs +*/ + +static HRESULT WINAPI +IShellFolder_fnCompareIDs (IShellFolder2 * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + int nReturn; + + TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2); + nReturn = SHELL32_CompareIDs (_IShellFolder_ (This), lParam, pidl1, pidl2); + TRACE ("-- %i\n", nReturn); + return nReturn; +} + +/************************************************************************** +* IShellFolder_fnCreateViewObject +*/ +static HRESULT WINAPI +IShellFolder_fnCreateViewObject (IShellFolder2 * iface, HWND hwndOwner, REFIID riid, LPVOID * ppvOut) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + LPSHELLVIEW pShellView; + HRESULT hr = E_INVALIDARG; + + TRACE ("(%p)->(hwnd=%p,%s,%p)\n", This, hwndOwner, shdebugstr_guid (riid), ppvOut); + + if (ppvOut) { + *ppvOut = NULL; + + if (IsEqualIID (riid, &IID_IDropTarget)) { + hr = IShellFolder_QueryInterface (iface, &IID_IDropTarget, ppvOut); + } else if (IsEqualIID (riid, &IID_IContextMenu)) { + FIXME ("IContextMenu not implemented\n"); + hr = E_NOTIMPL; + } else if (IsEqualIID (riid, &IID_IShellView)) { + pShellView = IShellView_Constructor ((IShellFolder *) iface); + if (pShellView) { + hr = IShellView_QueryInterface (pShellView, riid, ppvOut); + IShellView_Release (pShellView); + } + } + } + TRACE ("-- (%p)->(interface=%p)\n", This, ppvOut); + return hr; +} + +/************************************************************************** +* IShellFolder_fnGetAttributesOf +* +* PARAMETERS +* UINT cidl, //[in ] num elements in pidl array +* LPCITEMIDLIST* apidl, //[in ] simple pidl array +* ULONG* rgfInOut) //[out] result array +* +*/ +static HRESULT WINAPI +IShellFolder_fnGetAttributesOf (IShellFolder2 * iface, UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + HRESULT hr = S_OK; + + TRACE ("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n", This, cidl, apidl, *rgfInOut); + + if ((!cidl) || (!apidl) || (!rgfInOut)) + return E_INVALIDARG; + + if (*rgfInOut == 0) + *rgfInOut = ~0; + + while (cidl > 0 && *apidl) { + pdump (*apidl); + SHELL32_GetItemAttributes (_IShellFolder_ (This), *apidl, rgfInOut); + apidl++; + cidl--; + } + + TRACE ("-- result=0x%08lx\n", *rgfInOut); + + return hr; +} + +/************************************************************************** +* IShellFolder_fnGetUIObjectOf +* +* PARAMETERS +* HWND hwndOwner, //[in ] Parent window for any output +* UINT cidl, //[in ] array size +* LPCITEMIDLIST* apidl, //[in ] simple pidl array +* REFIID riid, //[in ] Requested Interface +* UINT* prgfInOut, //[ ] reserved +* LPVOID* ppvObject) //[out] Resulting Interface +* +* NOTES +* This function gets asked to return "view objects" for one or more (multiple select) +* items: +* The viewobject typically is an COM object with one of the following interfaces: +* IExtractIcon,IDataObject,IContextMenu +* In order to support icon positions in the default Listview your DataObject +* must implement the SetData method (in addition to GetData :) - the shell passes +* a barely documented "Icon positions" structure to SetData when the drag starts, +* and GetData's it if the drop is in another explorer window that needs the positions. +*/ +static HRESULT WINAPI +IShellFolder_fnGetUIObjectOf (IShellFolder2 * iface, + HWND hwndOwner, + UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + LPITEMIDLIST pidl; + IUnknown *pObj = NULL; + HRESULT hr = E_INVALIDARG; + + TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", + This, hwndOwner, cidl, apidl, shdebugstr_guid (riid), prgfInOut, ppvOut); + + if (ppvOut) { + *ppvOut = NULL; + + if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1)) { + pObj = (LPUNKNOWN) ISvItemCm_Constructor ((IShellFolder *) iface, This->pidlRoot, apidl, cidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1)) { + pObj = (LPUNKNOWN) IDataObject_Constructor (hwndOwner, This->pidlRoot, apidl, cidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1)) { + pidl = ILCombine (This->pidlRoot, apidl[0]); + pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl); + SHFree (pidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1)) { + pidl = ILCombine (This->pidlRoot, apidl[0]); + pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl); + SHFree (pidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1)) { + hr = IShellFolder_QueryInterface (iface, &IID_IDropTarget, (LPVOID *) & pObj); + } else if ((IsEqualIID(riid,&IID_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA)) + && (cidl == 1)) { + pidl = ILCombine (This->pidlRoot, apidl[0]); + hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj); + SHFree (pidl); + } else { + hr = E_NOINTERFACE; + } + + if (SUCCEEDED(hr) && !pObj) + hr = E_OUTOFMEMORY; + + *ppvOut = pObj; + } + TRACE ("(%p)->hr=0x%08lx\n", This, hr); + return hr; +} + +void SHELL_FS_ProcessDisplayFilename(LPSTR szPath, DWORD dwFlags) +{ + /*FIXME: MSDN also mentions SHGDN_FOREDITING which is not yet handled. */ + if (!(dwFlags & SHGDN_FORPARSING) && + ((dwFlags & SHGDN_INFOLDER) || (dwFlags == SHGDN_NORMAL))) { + HKEY hKey; + DWORD dwData; + DWORD dwDataSize = sizeof (DWORD); + BOOL doHide = FALSE; /* The default value is FALSE (win98 at least) */ + + if (!RegCreateKeyExA (HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", + 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0)) { + if (!RegQueryValueExA (hKey, "HideFileExt", 0, 0, (LPBYTE) & dwData, &dwDataSize)) + doHide = dwData; + + RegCloseKey (hKey); + } + + if (!doHide) { + LPSTR ext = PathFindExtensionA(szPath); + + if (ext) { + HKEY hkey; + char classname[MAX_PATH]; + LONG classlen = MAX_PATH; + + if (!RegQueryValueA(HKEY_CLASSES_ROOT, ext, classname, &classlen)) + if (!RegOpenKeyA(HKEY_CLASSES_ROOT, classname, &hkey)) { + if (!RegQueryValueExA(hkey, "NeverShowExt", 0, NULL, NULL, NULL)) + doHide = TRUE; + + RegCloseKey(hkey); + } + } + } + + if (doHide && szPath[0] != '.') + PathRemoveExtensionA (szPath); + } +} + +/************************************************************************** +* IShellFolder_fnGetDisplayNameOf +* Retrieves the display name for the specified file object or subfolder +* +* PARAMETERS +* LPCITEMIDLIST pidl, //[in ] complex pidl to item +* DWORD dwFlags, //[in ] SHGNO formatting flags +* LPSTRRET lpName) //[out] Returned display name +* +* FIXME +* if the name is in the pidl the ret value should be a STRRET_OFFSET +*/ + +static HRESULT WINAPI +IShellFolder_fnGetDisplayNameOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + CHAR szPath[MAX_PATH]; + int len = 0; + BOOL bSimplePidl; + + *szPath = '\0'; + + TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); + pdump (pidl); + + if (!pidl || !strRet) + return E_INVALIDARG; + + bSimplePidl = _ILIsPidlSimple (pidl); + + /* take names of special folders only if its only this folder */ + if (_ILIsSpecialFolder (pidl)) { + if (bSimplePidl) { + _ILSimpleGetText (pidl, szPath, MAX_PATH); /* append my own path */ + } else { + FIXME ("special pidl\n"); + } + } else { + if (!(dwFlags & SHGDN_INFOLDER) && (dwFlags & SHGDN_FORPARSING) && This->sPathTarget) { + lstrcpyA (szPath, This->sPathTarget); /* get path to root */ + PathAddBackslashA (szPath); + len = lstrlenA (szPath); + } + _ILSimpleGetText (pidl, szPath + len, MAX_PATH - len); /* append my own path */ + + if (!_ILIsFolder(pidl)) + SHELL_FS_ProcessDisplayFilename(szPath, dwFlags); + } + + if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl) { /* go deeper if needed */ + PathAddBackslashA (szPath); + len = lstrlenA (szPath); + + if (!SUCCEEDED + (SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags | SHGDN_INFOLDER, szPath + len, MAX_PATH - len))) + return E_OUTOFMEMORY; + } + strRet->uType = STRRET_CSTR; + lstrcpynA (strRet->u.cStr, szPath, MAX_PATH); + + TRACE ("-- (%p)->(%s)\n", This, szPath); + return S_OK; +} + +/************************************************************************** +* IShellFolder_fnSetNameOf +* Changes the name of a file object or subfolder, possibly changing its item +* identifier in the process. +* +* PARAMETERS +* HWND hwndOwner, //[in ] Owner window for output +* LPCITEMIDLIST pidl, //[in ] simple pidl of item to change +* LPCOLESTR lpszName, //[in ] the items new display name +* DWORD dwFlags, //[in ] SHGNO formatting flags +* LPITEMIDLIST* ppidlOut) //[out] simple pidl returned +*/ +static HRESULT WINAPI IShellFolder_fnSetNameOf (IShellFolder2 * iface, HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + char szSrc[MAX_PATH], + szDest[MAX_PATH]; + int len; + BOOL bIsFolder = _ILIsFolder (ILFindLastID (pidl)); + + TRACE ("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); + + /* build source path */ + if (dwFlags & SHGDN_INFOLDER) { + strcpy (szSrc, This->sPathTarget); + PathAddBackslashA (szSrc); + len = strlen (szSrc); + _ILSimpleGetText (pidl, szSrc + len, MAX_PATH - len); + } else { + /* FIXME: Can this work with a simple PIDL? */ + SHGetPathFromIDListA (pidl, szSrc); + } + + /* build destination path */ + strcpy (szDest, This->sPathTarget); + PathAddBackslashA (szDest); + len = strlen (szDest); + WideCharToMultiByte (CP_ACP, 0, lpName, -1, szDest + len, MAX_PATH - len, NULL, NULL); + szDest[MAX_PATH - 1] = 0; + TRACE ("src=%s dest=%s\n", szSrc, szDest); + if (MoveFileA (szSrc, szDest)) { + HRESULT hr = S_OK; + + if (pPidlOut) + hr = _ILCreateFromPathA(szDest, pPidlOut); + + SHChangeNotify (bIsFolder ? SHCNE_RENAMEFOLDER : SHCNE_RENAMEITEM, SHCNF_PATHA, szSrc, szDest); + + return hr; + } + + return E_FAIL; +} + +static HRESULT WINAPI IShellFolder_fnGetDefaultSearchGUID (IShellFolder2 * iface, GUID * pguid) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI IShellFolder_fnEnumSearches (IShellFolder2 * iface, IEnumExtraSearch ** ppenum) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI +IShellFolder_fnGetDefaultColumn (IShellFolder2 * iface, DWORD dwRes, ULONG * pSort, ULONG * pDisplay) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + TRACE ("(%p)\n", This); + + if (pSort) + *pSort = 0; + if (pDisplay) + *pDisplay = 0; + + return S_OK; +} +static HRESULT WINAPI IShellFolder_fnGetDefaultColumnState (IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + + TRACE ("(%p)\n", This); + + if (!pcsFlags || iColumn >= GENERICSHELLVIEWCOLUMNS) + return E_INVALIDARG; + + *pcsFlags = GenericSFHeader[iColumn].pcsFlags; + + return S_OK; +} +static HRESULT WINAPI +IShellFolder_fnGetDetailsEx (IShellFolder2 * iface, LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + FIXME ("(%p)\n", This); + + return E_NOTIMPL; +} +static HRESULT WINAPI +IShellFolder_fnGetDetailsOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + HRESULT hr = E_FAIL; + + TRACE ("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd); + + if (!psd || iColumn >= GENERICSHELLVIEWCOLUMNS) + return E_INVALIDARG; + + if (!pidl) { + /* the header titles */ + psd->fmt = GenericSFHeader[iColumn].fmt; + psd->cxChar = GenericSFHeader[iColumn].cxChar; + psd->str.uType = STRRET_CSTR; + LoadStringA (shell32_hInstance, GenericSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH); + return S_OK; + } else { + /* the data from the pidl */ + switch (iColumn) { + case 0: /* name */ + hr = IShellFolder_GetDisplayNameOf (iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); + break; + case 1: /* size */ + _ILGetFileSize (pidl, psd->str.u.cStr, MAX_PATH); + break; + case 2: /* type */ + _ILGetFileType (pidl, psd->str.u.cStr, MAX_PATH); + break; + case 3: /* date */ + _ILGetFileDate (pidl, psd->str.u.cStr, MAX_PATH); + break; + case 4: /* attributes */ + _ILGetFileAttributes (pidl, psd->str.u.cStr, MAX_PATH); + break; + } + hr = S_OK; + psd->str.uType = STRRET_CSTR; + } + + return hr; +} +static HRESULT WINAPI IShellFolder_fnMapColumnToSCID (IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid) +{ + _ICOM_THIS_From_IShellFolder2 (IGenericSFImpl, iface) + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} + +static IShellFolder2Vtbl sfvt = +{ + IShellFolder_fnQueryInterface, + IShellFolder_fnAddRef, + IShellFolder_fnRelease, + IShellFolder_fnParseDisplayName, + IShellFolder_fnEnumObjects, + IShellFolder_fnBindToObject, + IShellFolder_fnBindToStorage, + IShellFolder_fnCompareIDs, + IShellFolder_fnCreateViewObject, + IShellFolder_fnGetAttributesOf, + IShellFolder_fnGetUIObjectOf, + IShellFolder_fnGetDisplayNameOf, + IShellFolder_fnSetNameOf, + /* ShellFolder2 */ + IShellFolder_fnGetDefaultSearchGUID, + IShellFolder_fnEnumSearches, + IShellFolder_fnGetDefaultColumn, + IShellFolder_fnGetDefaultColumnState, + IShellFolder_fnGetDetailsEx, + IShellFolder_fnGetDetailsOf, + IShellFolder_fnMapColumnToSCID +}; + +/**************************************************************************** + * ISFHelper for IShellFolder implementation + */ + +static HRESULT WINAPI ISFHelper_fnQueryInterface (ISFHelper * iface, REFIID riid, LPVOID * ppvObj) +{ + _ICOM_THIS_From_ISFHelper (IGenericSFImpl, iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_QueryInterface (This->pUnkOuter, riid, ppvObj); +} + +static ULONG WINAPI ISFHelper_fnAddRef (ISFHelper * iface) +{ + _ICOM_THIS_From_ISFHelper (IGenericSFImpl, iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_AddRef (This->pUnkOuter); +} + +static ULONG WINAPI ISFHelper_fnRelease (ISFHelper * iface) +{ + _ICOM_THIS_From_ISFHelper (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + return IUnknown_Release (This->pUnkOuter); +} + +/**************************************************************************** + * ISFHelper_fnAddFolder + * + * creates a unique folder name + */ + +static HRESULT WINAPI ISFHelper_fnGetUniqueName (ISFHelper * iface, LPSTR lpName, UINT uLen) +{ + _ICOM_THIS_From_ISFHelper (IGenericSFImpl, iface) + IEnumIDList *penum; + HRESULT hr; + char szText[MAX_PATH]; + char *szNewFolder = "New Folder"; + + TRACE ("(%p)(%s %u)\n", This, lpName, uLen); + + if (uLen < strlen (szNewFolder) + 4) + return E_POINTER; + + strcpy (lpName, szNewFolder); + + hr = IShellFolder_fnEnumObjects (_IShellFolder2_ (This), 0, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penum); + if (penum) { + LPITEMIDLIST pidl; + DWORD dwFetched; + int i = 1; + + next:IEnumIDList_Reset (penum); + while (S_OK == IEnumIDList_Next (penum, 1, &pidl, &dwFetched) && dwFetched) { + _ILSimpleGetText (pidl, szText, MAX_PATH); + if (0 == strcasecmp (szText, lpName)) { + sprintf (lpName, "%s %d", szNewFolder, i++); + if (i > 99) { + hr = E_FAIL; + break; + } + goto next; + } + } + + IEnumIDList_Release (penum); + } + return hr; +} + +/**************************************************************************** + * ISFHelper_fnAddFolder + * + * adds a new folder. + */ + +static HRESULT WINAPI ISFHelper_fnAddFolder (ISFHelper * iface, HWND hwnd, LPCSTR lpName, LPITEMIDLIST * ppidlOut) +{ + _ICOM_THIS_From_ISFHelper (IGenericSFImpl, iface) + char lpstrNewDir[MAX_PATH]; + DWORD bRes; + HRESULT hres = E_FAIL; + + TRACE ("(%p)(%s %p)\n", This, lpName, ppidlOut); + + strcpy (lpstrNewDir, This->sPathTarget); + PathAppendA(lpstrNewDir, lpName); + + bRes = CreateDirectoryA (lpstrNewDir, NULL); + if (bRes) { + SHChangeNotify (SHCNE_MKDIR, SHCNF_PATHA, lpstrNewDir, NULL); + + hres = S_OK; + + if (ppidlOut) + hres = _ILCreateFromPathA(lpstrNewDir, ppidlOut); + } else { + char lpstrText[128 + MAX_PATH]; + char lpstrTempText[128]; + char lpstrCaption[256]; + + /* Cannot Create folder because of permissions */ + LoadStringA (shell32_hInstance, IDS_CREATEFOLDER_DENIED, lpstrTempText, sizeof (lpstrTempText)); + LoadStringA (shell32_hInstance, IDS_CREATEFOLDER_CAPTION, lpstrCaption, sizeof (lpstrCaption)); + sprintf (lpstrText, lpstrTempText, lpstrNewDir); + MessageBoxA (hwnd, lpstrText, lpstrCaption, MB_OK | MB_ICONEXCLAMATION); + } + + return hres; +} + +/**************************************************************************** + * ISFHelper_fnDeleteItems + * + * deletes items in folder + */ +static HRESULT WINAPI ISFHelper_fnDeleteItems (ISFHelper * iface, UINT cidl, LPCITEMIDLIST * apidl) +{ + _ICOM_THIS_From_ISFHelper (IGenericSFImpl, iface) + UINT i; + char szPath[MAX_PATH]; + BOOL bConfirm = TRUE; + + TRACE ("(%p)(%u %p)\n", This, cidl, apidl); + + /* deleting multiple items so give a slightly different warning */ + if (cidl != 1) { + char tmp[8]; + + snprintf (tmp, sizeof (tmp), "%d", cidl); + if (!SHELL_ConfirmDialog(ASK_DELETE_MULTIPLE_ITEM, tmp)) + return E_FAIL; + bConfirm = FALSE; + } + + for (i = 0; i < cidl; i++) { + strcpy (szPath, This->sPathTarget); + PathAddBackslashA (szPath); + _ILSimpleGetText (apidl[i], szPath + strlen (szPath), MAX_PATH); + + if (_ILIsFolder (apidl[i])) { + LPITEMIDLIST pidl; + + TRACE ("delete %s\n", szPath); + if (!SHELL_DeleteDirectoryA (szPath, bConfirm)) { + TRACE ("delete %s failed, bConfirm=%d\n", szPath, bConfirm); + return E_FAIL; + } + pidl = ILCombine (This->pidlRoot, apidl[i]); + SHChangeNotify (SHCNE_RMDIR, SHCNF_IDLIST, pidl, NULL); + SHFree (pidl); + } else if (_ILIsValue (apidl[i])) { + LPITEMIDLIST pidl; + + TRACE ("delete %s\n", szPath); + if (!SHELL_DeleteFileA (szPath, bConfirm)) { + TRACE ("delete %s failed, bConfirm=%d\n", szPath, bConfirm); + return E_FAIL; + } + pidl = ILCombine (This->pidlRoot, apidl[i]); + SHChangeNotify (SHCNE_DELETE, SHCNF_IDLIST, pidl, NULL); + SHFree (pidl); + } + + } + return S_OK; +} + +/**************************************************************************** + * ISFHelper_fnCopyItems + * + * copies items to this folder + */ +static HRESULT WINAPI +ISFHelper_fnCopyItems (ISFHelper * iface, IShellFolder * pSFFrom, UINT cidl, LPCITEMIDLIST * apidl) +{ + UINT i; + IPersistFolder2 *ppf2 = NULL; + char szSrcPath[MAX_PATH], + szDstPath[MAX_PATH]; + + _ICOM_THIS_From_ISFHelper (IGenericSFImpl, iface); + + TRACE ("(%p)->(%p,%u,%p)\n", This, pSFFrom, cidl, apidl); + + IShellFolder_QueryInterface (pSFFrom, &IID_IPersistFolder2, (LPVOID *) & ppf2); + if (ppf2) { + LPITEMIDLIST pidl; + + if (SUCCEEDED (IPersistFolder2_GetCurFolder (ppf2, &pidl))) { + for (i = 0; i < cidl; i++) { + SHGetPathFromIDListA (pidl, szSrcPath); + PathAddBackslashA (szSrcPath); + _ILSimpleGetText (apidl[i], szSrcPath + strlen (szSrcPath), MAX_PATH); + + strcpy (szDstPath, This->sPathTarget); + PathAddBackslashA (szDstPath); + _ILSimpleGetText (apidl[i], szDstPath + strlen (szDstPath), MAX_PATH); + MESSAGE ("would copy %s to %s\n", szSrcPath, szDstPath); + } + SHFree (pidl); + } + IPersistFolder2_Release (ppf2); + } + return S_OK; +} + +static ISFHelperVtbl shvt = +{ + ISFHelper_fnQueryInterface, + ISFHelper_fnAddRef, + ISFHelper_fnRelease, + ISFHelper_fnGetUniqueName, + ISFHelper_fnAddFolder, + ISFHelper_fnDeleteItems, + ISFHelper_fnCopyItems +}; + +/************************************************************************ + * IFSFldr_PersistFolder3_QueryInterface + * + */ +static HRESULT WINAPI IFSFldr_PersistFolder3_QueryInterface (IPersistFolder3 * iface, REFIID iid, LPVOID * ppvObj) +{ + _ICOM_THIS_From_IPersistFolder3 (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + return IUnknown_QueryInterface (This->pUnkOuter, iid, ppvObj); +} + +/************************************************************************ + * IFSFldr_PersistFolder3_AddRef + * + */ +static ULONG WINAPI IFSFldr_PersistFolder3_AddRef (IPersistFolder3 * iface) +{ + _ICOM_THIS_From_IPersistFolder3 (IGenericSFImpl, iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_AddRef (This->pUnkOuter); +} + +/************************************************************************ + * IFSFldr_PersistFolder3_Release + * + */ +static ULONG WINAPI IFSFldr_PersistFolder3_Release (IPersistFolder3 * iface) +{ + _ICOM_THIS_From_IPersistFolder3 (IGenericSFImpl, iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_Release (This->pUnkOuter); +} + +/************************************************************************ + * IFSFldr_PersistFolder3_GetClassID + */ +static HRESULT WINAPI IFSFldr_PersistFolder3_GetClassID (IPersistFolder3 * iface, CLSID * lpClassId) +{ + _ICOM_THIS_From_IPersistFolder3 (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + if (!lpClassId) + return E_POINTER; + *lpClassId = *This->pclsid; + + return S_OK; +} + +/************************************************************************ + * IFSFldr_PersistFolder3_Initialize + * + * NOTES + * sPathTarget is not set. Don't know how to handle in a non rooted environment. + */ +static HRESULT WINAPI IFSFldr_PersistFolder3_Initialize (IPersistFolder3 * iface, LPCITEMIDLIST pidl) +{ + char sTemp[MAX_PATH]; + + _ICOM_THIS_From_IPersistFolder3 (IGenericSFImpl, iface); + + TRACE ("(%p)->(%p)\n", This, pidl); + + if (This->pidlRoot) + SHFree (This->pidlRoot); /* free the old pidl */ + This->pidlRoot = ILClone (pidl); /* set my pidl */ + + if (This->sPathTarget) + SHFree (This->sPathTarget); + + /* set my path */ + if (SHGetPathFromIDListA (pidl, sTemp)) { + This->sPathTarget = SHAlloc (strlen (sTemp) + 1); + strcpy (This->sPathTarget, sTemp); + } + + TRACE ("--(%p)->(%s)\n", This, This->sPathTarget); + return S_OK; +} + +/************************************************************************** + * IFSFldr_PersistFolder3_GetCurFolder + */ +static HRESULT WINAPI IFSFldr_PersistFolder3_fnGetCurFolder (IPersistFolder3 * iface, LPITEMIDLIST * pidl) +{ + _ICOM_THIS_From_IPersistFolder3 (IGenericSFImpl, iface); + + TRACE ("(%p)->(%p)\n", This, pidl); + + if (!pidl) return E_POINTER; + *pidl = ILClone (This->pidlRoot); + return S_OK; +} + +/************************************************************************** + * IFSFldr_PersistFolder3_InitializeEx + * + * FIXME: errorhandling + */ +static HRESULT WINAPI +IFSFldr_PersistFolder3_InitializeEx (IPersistFolder3 * iface, + IBindCtx * pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO * ppfti) +{ + char sTemp[MAX_PATH]; + + _ICOM_THIS_From_IPersistFolder3 (IGenericSFImpl, iface); + + TRACE ("(%p)->(%p,%p,%p)\n", This, pbc, pidlRoot, ppfti); + if (ppfti) + TRACE ("--%p %s %s 0x%08lx 0x%08x\n", + ppfti->pidlTargetFolder, debugstr_w (ppfti->szTargetParsingName), + debugstr_w (ppfti->szNetworkProvider), ppfti->dwAttributes, ppfti->csidl); + + pdump (pidlRoot); + if (ppfti && ppfti->pidlTargetFolder) + pdump (ppfti->pidlTargetFolder); + + if (This->pidlRoot) + __SHFreeAndNil (&This->pidlRoot); /* free the old */ + if (This->sPathTarget) + __SHFreeAndNil (&This->sPathTarget); + + /* + * Root path and pidl + */ + This->pidlRoot = ILClone (pidlRoot); + + /* + * the target folder is spezified in csidl OR pidlTargetFolder OR szTargetParsingName + */ + if (ppfti) { + if (ppfti->csidl != -1) { + if (SHGetSpecialFolderPathA (0, sTemp, ppfti->csidl, ppfti->csidl & CSIDL_FLAG_CREATE)) { + __SHCloneStrA (&This->sPathTarget, sTemp); + } + } else if (ppfti->szTargetParsingName[0]) { + __SHCloneStrWtoA (&This->sPathTarget, ppfti->szTargetParsingName); + } else if (ppfti->pidlTargetFolder) { + if (SHGetPathFromIDListA (ppfti->pidlTargetFolder, sTemp)) { + __SHCloneStrA (&This->sPathTarget, sTemp); + } + } + } + + TRACE ("--(%p)->(target=%s)\n", This, debugstr_a (This->sPathTarget)); + pdump (This->pidlRoot); + return (This->sPathTarget) ? S_OK : E_FAIL; +} + +static HRESULT WINAPI +IFSFldr_PersistFolder3_GetFolderTargetInfo (IPersistFolder3 * iface, PERSIST_FOLDER_TARGET_INFO * ppfti) +{ + _ICOM_THIS_From_IPersistFolder3 (IGenericSFImpl, iface); + FIXME ("(%p)->(%p)\n", This, ppfti); + ZeroMemory (ppfti, sizeof (ppfti)); + return E_NOTIMPL; +} + +static IPersistFolder3Vtbl vt_FSFldr_PersistFolder3 = +{ + IFSFldr_PersistFolder3_QueryInterface, + IFSFldr_PersistFolder3_AddRef, + IFSFldr_PersistFolder3_Release, + IFSFldr_PersistFolder3_GetClassID, + IFSFldr_PersistFolder3_Initialize, + IFSFldr_PersistFolder3_fnGetCurFolder, + IFSFldr_PersistFolder3_InitializeEx, + IFSFldr_PersistFolder3_GetFolderTargetInfo +}; + +/**************************************************************************** + * ISFDropTarget implementation + */ +static BOOL ISFDropTarget_QueryDrop (IDropTarget * iface, DWORD dwKeyState, LPDWORD pdwEffect) +{ + DWORD dwEffect = *pdwEffect; + + _ICOM_THIS_From_IDropTarget (IGenericSFImpl, iface); + + *pdwEffect = DROPEFFECT_NONE; + + if (This->fAcceptFmt) { /* Does our interpretation of the keystate ... */ + *pdwEffect = KeyStateToDropEffect (dwKeyState); + + /* ... matches the desired effect ? */ + if (dwEffect & *pdwEffect) { + return TRUE; + } + } + return FALSE; +} + +static HRESULT WINAPI ISFDropTarget_QueryInterface (IDropTarget * iface, REFIID riid, LPVOID * ppvObj) +{ + _ICOM_THIS_From_IDropTarget (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + return IUnknown_QueryInterface (This->pUnkOuter, riid, ppvObj); +} + +static ULONG WINAPI ISFDropTarget_AddRef (IDropTarget * iface) +{ + _ICOM_THIS_From_IDropTarget (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + return IUnknown_AddRef (This->pUnkOuter); +} + +static ULONG WINAPI ISFDropTarget_Release (IDropTarget * iface) +{ + _ICOM_THIS_From_IDropTarget (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + return IUnknown_Release (This->pUnkOuter); +} + +static HRESULT WINAPI +ISFDropTarget_DragEnter (IDropTarget * iface, IDataObject * pDataObject, DWORD dwKeyState, POINTL pt, DWORD * pdwEffect) +{ + FORMATETC fmt; + + _ICOM_THIS_From_IDropTarget (IGenericSFImpl, iface); + + TRACE ("(%p)->(DataObject=%p)\n", This, pDataObject); + + InitFormatEtc (fmt, This->cfShellIDList, TYMED_HGLOBAL); + + This->fAcceptFmt = (S_OK == IDataObject_QueryGetData (pDataObject, &fmt)) ? TRUE : FALSE; + + ISFDropTarget_QueryDrop (iface, dwKeyState, pdwEffect); + + return S_OK; +} + +static HRESULT WINAPI ISFDropTarget_DragOver (IDropTarget * iface, DWORD dwKeyState, POINTL pt, DWORD * pdwEffect) +{ + _ICOM_THIS_From_IDropTarget (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + if (!pdwEffect) + return E_INVALIDARG; + + ISFDropTarget_QueryDrop (iface, dwKeyState, pdwEffect); + + return S_OK; +} + +static HRESULT WINAPI ISFDropTarget_DragLeave (IDropTarget * iface) +{ + _ICOM_THIS_From_IDropTarget (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + This->fAcceptFmt = FALSE; + + return S_OK; +} + +static HRESULT WINAPI +ISFDropTarget_Drop (IDropTarget * iface, IDataObject * pDataObject, DWORD dwKeyState, POINTL pt, DWORD * pdwEffect) +{ + _ICOM_THIS_From_IDropTarget (IGenericSFImpl, iface); + + FIXME ("(%p) object dropped\n", This); + + return E_NOTIMPL; +} + +static struct IDropTargetVtbl dtvt = { + ISFDropTarget_QueryInterface, + ISFDropTarget_AddRef, + ISFDropTarget_Release, + ISFDropTarget_DragEnter, + ISFDropTarget_DragOver, + ISFDropTarget_DragLeave, + ISFDropTarget_Drop +}; diff --git a/reactos/lib/shell32/shfldr_mycomp.c b/reactos/lib/shell32/shfldr_mycomp.c new file mode 100644 index 00000000000..994514c55e9 --- /dev/null +++ b/reactos/lib/shell32/shfldr_mycomp.c @@ -0,0 +1,833 @@ + +/* + * Virtual Workplace folder + * + * Copyright 1997 Marcus Meissner + * Copyright 1998, 1999, 2002 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" + +#include "wingdi.h" +#include "pidl.h" +#include "shlguid.h" +#include "enumidlist.h" +#include "undocshell.h" +#include "shell32_main.h" +#include "shresdef.h" +#include "shlwapi.h" +#include "shellfolder.h" +#include "wine/debug.h" +#include "debughlp.h" +#include "shfldr.h" + +WINE_DEFAULT_DEBUG_CHANNEL (shell); + +/*********************************************************************** +* IShellFolder implementation +*/ + +typedef struct { + IShellFolder2Vtbl *lpVtbl; + DWORD ref; + IPersistFolder2Vtbl *lpVtblPersistFolder2; + + /* both paths are parsible from the desktop */ + LPITEMIDLIST pidlRoot; /* absolute pidl */ + int dwAttributes; /* attributes returned by GetAttributesOf FIXME: use it */ +} IGenericSFImpl; + +static struct IShellFolder2Vtbl vt_ShellFolder2; +static struct IPersistFolder2Vtbl vt_PersistFolder2; + +#define _IPersistFolder2_Offset ((int)(&(((IGenericSFImpl*)0)->lpVtblPersistFolder2))) +#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder2_Offset); + +/* + converts This to a interface pointer +*/ +#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl) +#define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl) +#define _IShellFolder2_(This) (IShellFolder2*)&(This->lpVtbl) + +#define _IPersist_(This) (IPersist*)&(This->lpVtblPersistFolder2) +#define _IPersistFolder_(This) (IPersistFolder*)&(This->lpVtblPersistFolder2) +#define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpVtblPersistFolder2) + +/*********************************************************************** +* IShellFolder [MyComputer] implementation +*/ + +static shvheader MyComputerSFHeader[] = { + {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, + {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN6, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN7, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, +}; + +#define MYCOMPUTERSHELLVIEWCOLUMNS 4 + +/************************************************************************** +* ISF_MyComputer_Constructor +*/ +HRESULT WINAPI ISF_MyComputer_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +{ + IGenericSFImpl *sf; + + TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); + + if (!ppv) + return E_POINTER; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + sf = (IGenericSFImpl *) LocalAlloc (GMEM_ZEROINIT, sizeof (IGenericSFImpl)); + if (!sf) + return E_OUTOFMEMORY; + + sf->ref = 0; + sf->lpVtbl = &vt_ShellFolder2; + sf->lpVtblPersistFolder2 = &vt_PersistFolder2; + sf->pidlRoot = _ILCreateMyComputer (); /* my qualified pidl */ + + if (!SUCCEEDED (IUnknown_QueryInterface (_IUnknown_ (sf), riid, ppv))) { + IUnknown_Release (_IUnknown_ (sf)); + return E_NOINTERFACE; + } + + TRACE ("--(%p)\n", sf); + return S_OK; +} + +/************************************************************************** + * ISF_MyComputer_fnQueryInterface + * + * NOTES supports not IPersist/IPersistFolder + */ +static HRESULT WINAPI ISF_MyComputer_fnQueryInterface (IShellFolder2 * iface, REFIID riid, LPVOID * ppvObj) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj); + + *ppvObj = NULL; + + if (IsEqualIID (riid, &IID_IUnknown) || + IsEqualIID (riid, &IID_IShellFolder) || IsEqualIID (riid, &IID_IShellFolder2)) { + *ppvObj = This; + } else if (IsEqualIID (riid, &IID_IPersist) || + IsEqualIID (riid, &IID_IPersistFolder) || IsEqualIID (riid, &IID_IPersistFolder2)) { + *ppvObj = _IPersistFolder2_ (This); + } + + if (*ppvObj) { + IUnknown_AddRef ((IUnknown *) (*ppvObj)); + TRACE ("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj); + return S_OK; + } + TRACE ("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI ISF_MyComputer_fnAddRef (IShellFolder2 * iface) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return ++(This->ref); +} + +static ULONG WINAPI ISF_MyComputer_fnRelease (IShellFolder2 * iface) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + if (!--(This->ref)) { + TRACE ("-- destroying IShellFolder(%p)\n", This); + if (This->pidlRoot) + SHFree (This->pidlRoot); + LocalFree ((HLOCAL) This); + return 0; + } + return This->ref; +} + +/************************************************************************** +* ISF_MyComputer_fnParseDisplayName +*/ +static HRESULT WINAPI +ISF_MyComputer_fnParseDisplayName (IShellFolder2 * iface, + HWND hwndOwner, + LPBC pbc, + LPOLESTR lpszDisplayName, + DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + HRESULT hr = E_INVALIDARG; + LPCWSTR szNext = NULL; + WCHAR szElement[MAX_PATH]; + LPITEMIDLIST pidlTemp = NULL; + CLSID clsid; + + TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", + This, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName), pchEaten, ppidl, pdwAttributes); + + *ppidl = 0; + if (pchEaten) + *pchEaten = 0; /* strange but like the original */ + + /* handle CLSID paths */ + if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':') { + szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); + TRACE ("-- element: %s\n", debugstr_w (szElement)); + SHCLSIDFromStringW (szElement + 2, &clsid); + pidlTemp = _ILCreateGuid (PT_GUID, &clsid); + } + /* do we have an absolute path name ? */ + else if (PathGetDriveNumberW (lpszDisplayName) >= 0 && lpszDisplayName[2] == (WCHAR) '\\') { + szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); + szElement[0] = toupper(szElement[0]); /* make drive letter uppercase to enable PIDL comparison */ + pidlTemp = _ILCreateDrive (szElement); + } + + if (szNext && *szNext) { + hr = SHELL32_ParseNextElement (iface, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); + } else { + if (pdwAttributes && *pdwAttributes) { + SHELL32_GetItemAttributes (_IShellFolder_ (This), pidlTemp, pdwAttributes); + } + hr = S_OK; + } + + *ppidl = pidlTemp; + + TRACE ("(%p)->(-- ret=0x%08lx)\n", This, hr); + + return hr; +} + +/************************************************************************** + * CreateMyCompEnumList() + */ +static BOOL CreateMyCompEnumList(IEnumIDList *list, DWORD dwFlags) +{ + BOOL ret = TRUE; + + TRACE("(%p)->(flags=0x%08lx) \n",list,dwFlags); + + /*enumerate the folders*/ + if(dwFlags & SHCONTF_FOLDERS) + { + WCHAR wszDriveName[] = {'A', ':', '\\', '\0'}; + DWORD dwDrivemap = GetLogicalDrives(); + HKEY hkey; + + while (ret && wszDriveName[0]<='Z') + { + if(dwDrivemap & 0x00000001L) + ret = AddToEnumList(list, _ILCreateDrive(wszDriveName)); + wszDriveName[0]++; + dwDrivemap = dwDrivemap >> 1; + } + + TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n",list); + if (ret && !RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\mycomputer\\NameSpace", + 0, KEY_READ, &hkey)) + { + char iid[50]; + int i=0; + + while (ret) + { + DWORD size = sizeof (iid); + LONG apiRet = RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, + NULL); + + if (ERROR_SUCCESS == apiRet) + { + /* FIXME: shell extensions, shouldn't the type be + * PT_SHELLEXT? */ + ret = AddToEnumList(list, _ILCreateGuidFromStrA(iid)); + i++; + } + else if (ERROR_NO_MORE_ITEMS == apiRet) + break; + else + ret = FALSE; + } + RegCloseKey(hkey); + } + } + return ret; +} + +/************************************************************************** +* ISF_MyComputer_fnEnumObjects +*/ +static HRESULT WINAPI +ISF_MyComputer_fnEnumObjects (IShellFolder2 * iface, HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); + + *ppEnumIDList = IEnumIDList_Constructor(); + if (*ppEnumIDList) + CreateMyCompEnumList(*ppEnumIDList, dwFlags); + + TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList); + + return (*ppEnumIDList) ? S_OK : E_OUTOFMEMORY; +} + +/************************************************************************** +* ISF_MyComputer_fnBindToObject +*/ +static HRESULT WINAPI +ISF_MyComputer_fnBindToObject (IShellFolder2 * iface, LPCITEMIDLIST pidl, + LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut); + + return SHELL32_BindToChild (This->pidlRoot, NULL, pidl, riid, ppvOut); +} + +/************************************************************************** +* ISF_MyComputer_fnBindToStorage +*/ +static HRESULT WINAPI +ISF_MyComputer_fnBindToStorage (IShellFolder2 * iface, + LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut); + + *ppvOut = NULL; + return E_NOTIMPL; +} + +/************************************************************************** +* ISF_MyComputer_fnCompareIDs +*/ + +static HRESULT WINAPI +ISF_MyComputer_fnCompareIDs (IShellFolder2 * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + int nReturn; + + TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2); + nReturn = SHELL32_CompareIDs (_IShellFolder_ (This), lParam, pidl1, pidl2); + TRACE ("-- %i\n", nReturn); + return nReturn; +} + +/************************************************************************** +* ISF_MyComputer_fnCreateViewObject +*/ +static HRESULT WINAPI +ISF_MyComputer_fnCreateViewObject (IShellFolder2 * iface, HWND hwndOwner, REFIID riid, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + LPSHELLVIEW pShellView; + HRESULT hr = E_INVALIDARG; + + TRACE ("(%p)->(hwnd=%p,%s,%p)\n", This, hwndOwner, shdebugstr_guid (riid), ppvOut); + + if (ppvOut) { + *ppvOut = NULL; + + if (IsEqualIID (riid, &IID_IDropTarget)) { + WARN ("IDropTarget not implemented\n"); + hr = E_NOTIMPL; + } else if (IsEqualIID (riid, &IID_IContextMenu)) { + WARN ("IContextMenu not implemented\n"); + hr = E_NOTIMPL; + } else if (IsEqualIID (riid, &IID_IShellView)) { + pShellView = IShellView_Constructor ((IShellFolder *) iface); + if (pShellView) { + hr = IShellView_QueryInterface (pShellView, riid, ppvOut); + IShellView_Release (pShellView); + } + } + } + TRACE ("-- (%p)->(interface=%p)\n", This, ppvOut); + return hr; +} + +/************************************************************************** +* ISF_MyComputer_fnGetAttributesOf +*/ +static HRESULT WINAPI +ISF_MyComputer_fnGetAttributesOf (IShellFolder2 * iface, UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + HRESULT hr = S_OK; + + TRACE ("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n", This, cidl, apidl, *rgfInOut); + + if ((!cidl) || (!apidl) || (!rgfInOut)) + return E_INVALIDARG; + + if (*rgfInOut == 0) + *rgfInOut = ~0; + + while (cidl > 0 && *apidl) { + pdump (*apidl); + SHELL32_GetItemAttributes (_IShellFolder_ (This), *apidl, rgfInOut); + apidl++; + cidl--; + } + + TRACE ("-- result=0x%08lx\n", *rgfInOut); + return hr; +} + +/************************************************************************** +* ISF_MyComputer_fnGetUIObjectOf +* +* PARAMETERS +* HWND hwndOwner, //[in ] Parent window for any output +* UINT cidl, //[in ] array size +* LPCITEMIDLIST* apidl, //[in ] simple pidl array +* REFIID riid, //[in ] Requested Interface +* UINT* prgfInOut, //[ ] reserved +* LPVOID* ppvObject) //[out] Resulting Interface +* +*/ +static HRESULT WINAPI +ISF_MyComputer_fnGetUIObjectOf (IShellFolder2 * iface, + HWND hwndOwner, + UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + LPITEMIDLIST pidl; + IUnknown *pObj = NULL; + HRESULT hr = E_INVALIDARG; + + TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", + This, hwndOwner, cidl, apidl, shdebugstr_guid (riid), prgfInOut, ppvOut); + + if (ppvOut) { + *ppvOut = NULL; + + if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1)) { + pObj = (LPUNKNOWN) ISvItemCm_Constructor ((IShellFolder *) iface, This->pidlRoot, apidl, cidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1)) { + pObj = (LPUNKNOWN) IDataObject_Constructor (hwndOwner, This->pidlRoot, apidl, cidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1)) { + pidl = ILCombine (This->pidlRoot, apidl[0]); + pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl); + SHFree (pidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1)) { + pidl = ILCombine (This->pidlRoot, apidl[0]); + pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl); + SHFree (pidl); + hr = S_OK; + } else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1)) { + hr = IShellFolder_QueryInterface (iface, &IID_IDropTarget, (LPVOID *) & pObj); + } else if ((IsEqualIID(riid,&IID_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA)) + && (cidl == 1)) { + pidl = ILCombine (This->pidlRoot, apidl[0]); + hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj); + SHFree (pidl); + } else { + hr = E_NOINTERFACE; + } + + if (SUCCEEDED(hr) && !pObj) + hr = E_OUTOFMEMORY; + + *ppvOut = pObj; + } + TRACE ("(%p)->hr=0x%08lx\n", This, hr); + return hr; +} + +/************************************************************************** +* ISF_MyComputer_fnGetDisplayNameOf +*/ +static HRESULT WINAPI ISF_MyComputer_fnGetDisplayNameOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + char szPath[MAX_PATH], + szDrive[18]; + int len = 0; + BOOL bSimplePidl; + HRESULT hr = S_OK; + + TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); + pdump (pidl); + + if (!strRet) + return E_INVALIDARG; + + szPath[0] = 0x00; + szDrive[0] = 0x00; + + bSimplePidl = _ILIsPidlSimple (pidl); + + if (!pidl->mkid.cb) { + /* parsing name like ::{...} */ + lstrcpyA (szPath, "::"); + SHELL32_GUIDToStringA(&CLSID_MyComputer, &szPath[2]); + } else if (_ILIsSpecialFolder (pidl)) { + /* take names of special folders only if its only this folder */ + if (bSimplePidl) { + GUID const *clsid; + + if ((clsid = _ILGetGUIDPointer (pidl))) { + if (GET_SHGDN_FOR (dwFlags) == SHGDN_FORPARSING) { + int bWantsForParsing; + + /* + * we can only get a filesystem path from a shellfolder if the value WantsFORPARSING in + * CLSID\\{...}\\shellfolder exists + * exception: the MyComputer folder has this keys not but like any filesystem backed + * folder it needs these behaviour + */ + /* get the "WantsFORPARSING" flag from the registry */ + char szRegPath[100]; + + lstrcpyA (szRegPath, "CLSID\\"); + SHELL32_GUIDToStringA (clsid, &szRegPath[6]); + lstrcatA (szRegPath, "\\shellfolder"); + bWantsForParsing = + (ERROR_SUCCESS == + SHGetValueA (HKEY_CLASSES_ROOT, szRegPath, "WantsFORPARSING", NULL, NULL, NULL)); + + if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) && bWantsForParsing) { + /* we need the filesystem path to the destination folder. Only the folder itself can know it */ + hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags, szPath, MAX_PATH); + } else { + LPSTR p; + + /* parsing name like ::{...} */ + p = lstrcpyA(szPath, "::") + 2; + p += SHELL32_GUIDToStringA(&CLSID_MyComputer, p); + + lstrcatA(p, "\\::"); + p += 3; + SHELL32_GUIDToStringA(clsid, p); + } + } else { + /* user friendly name */ + HCR_GetClassNameA (clsid, szPath, MAX_PATH); + } + } else + _ILSimpleGetText (pidl, szPath, MAX_PATH); /* append my own path */ + } else { + FIXME ("special folder\n"); + } + } else { + if (!_ILIsDrive (pidl)) { + ERR ("Wrong pidl type\n"); + return E_INVALIDARG; + } + + _ILSimpleGetText (pidl, szPath, MAX_PATH); /* append my own path */ + + /* long view "lw_name (C:)" */ + if (bSimplePidl && !(dwFlags & SHGDN_FORPARSING)) { + DWORD dwVolumeSerialNumber, + dwMaximumComponetLength, + dwFileSystemFlags; + + GetVolumeInformationA (szPath, szDrive, sizeof (szDrive) - 6, &dwVolumeSerialNumber, + &dwMaximumComponetLength, &dwFileSystemFlags, NULL, 0); + strcat (szDrive, " ("); + strncat (szDrive, szPath, 2); + strcat (szDrive, ")"); + strcpy (szPath, szDrive); + } + } + + if (!bSimplePidl) { /* go deeper if needed */ + PathAddBackslashA (szPath); + len = strlen (szPath); + + hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags | SHGDN_INFOLDER, szPath + len, MAX_PATH - len); + } + + if (SUCCEEDED (hr)) { + strRet->uType = STRRET_CSTR; + lstrcpynA (strRet->u.cStr, szPath, MAX_PATH); + } + + TRACE ("-- (%p)->(%s)\n", This, szPath); + return hr; +} + +/************************************************************************** +* ISF_MyComputer_fnSetNameOf +* Changes the name of a file object or subfolder, possibly changing its item +* identifier in the process. +* +* PARAMETERS +* HWND hwndOwner, //[in ] Owner window for output +* LPCITEMIDLIST pidl, //[in ] simple pidl of item to change +* LPCOLESTR lpszName, //[in ] the items new display name +* DWORD dwFlags, //[in ] SHGNO formatting flags +* LPITEMIDLIST* ppidlOut) //[out] simple pidl returned +*/ +static HRESULT WINAPI ISF_MyComputer_fnSetNameOf (IShellFolder2 * iface, HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); + return E_FAIL; +} + +static HRESULT WINAPI ISF_MyComputer_fnGetDefaultSearchGUID (IShellFolder2 * iface, GUID * pguid) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI ISF_MyComputer_fnEnumSearches (IShellFolder2 * iface, IEnumExtraSearch ** ppenum) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} +static HRESULT WINAPI ISF_MyComputer_fnGetDefaultColumn (IShellFolder2 * iface, DWORD dwRes, ULONG * pSort, ULONG * pDisplay) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)\n", This); + + if (pSort) *pSort = 0; + if (pDisplay) *pDisplay = 0; + return S_OK; +} +static HRESULT WINAPI ISF_MyComputer_fnGetDefaultColumnState (IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)\n", This); + + if (!pcsFlags || iColumn >= MYCOMPUTERSHELLVIEWCOLUMNS) return E_INVALIDARG; + *pcsFlags = MyComputerSFHeader[iColumn].pcsFlags; + return S_OK; +} +static HRESULT WINAPI ISF_MyComputer_fnGetDetailsEx (IShellFolder2 * iface, LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} + +/* FIXME: drive size >4GB is rolling over */ +static HRESULT WINAPI ISF_MyComputer_fnGetDetailsOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + HRESULT hr; + + TRACE ("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd); + + if (!psd || iColumn >= MYCOMPUTERSHELLVIEWCOLUMNS) + return E_INVALIDARG; + + if (!pidl) { + psd->fmt = MyComputerSFHeader[iColumn].fmt; + psd->cxChar = MyComputerSFHeader[iColumn].cxChar; + psd->str.uType = STRRET_CSTR; + LoadStringA (shell32_hInstance, MyComputerSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH); + return S_OK; + } else { + char szPath[MAX_PATH]; + ULARGE_INTEGER ulBytes; + + psd->str.u.cStr[0] = 0x00; + psd->str.uType = STRRET_CSTR; + switch (iColumn) { + case 0: /* name */ + hr = IShellFolder_GetDisplayNameOf (iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); + break; + case 1: /* type */ + _ILGetFileType (pidl, psd->str.u.cStr, MAX_PATH); + break; + case 2: /* total size */ + if (_ILIsDrive (pidl)) { + _ILSimpleGetText (pidl, szPath, MAX_PATH); + GetDiskFreeSpaceExA (szPath, NULL, &ulBytes, NULL); + StrFormatByteSizeA (ulBytes.u.LowPart, psd->str.u.cStr, MAX_PATH); + } + break; + case 3: /* free size */ + if (_ILIsDrive (pidl)) { + _ILSimpleGetText (pidl, szPath, MAX_PATH); + GetDiskFreeSpaceExA (szPath, &ulBytes, NULL, NULL); + StrFormatByteSizeA (ulBytes.u.LowPart, psd->str.u.cStr, MAX_PATH); + } + break; + } + hr = S_OK; + } + + return hr; +} +static HRESULT WINAPI ISF_MyComputer_fnMapColumnToSCID (IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} + +static IShellFolder2Vtbl vt_ShellFolder2 = +{ + ISF_MyComputer_fnQueryInterface, + ISF_MyComputer_fnAddRef, + ISF_MyComputer_fnRelease, + ISF_MyComputer_fnParseDisplayName, + ISF_MyComputer_fnEnumObjects, + ISF_MyComputer_fnBindToObject, + ISF_MyComputer_fnBindToStorage, + ISF_MyComputer_fnCompareIDs, + ISF_MyComputer_fnCreateViewObject, + ISF_MyComputer_fnGetAttributesOf, + ISF_MyComputer_fnGetUIObjectOf, + ISF_MyComputer_fnGetDisplayNameOf, + ISF_MyComputer_fnSetNameOf, + /* ShellFolder2 */ + ISF_MyComputer_fnGetDefaultSearchGUID, + ISF_MyComputer_fnEnumSearches, + ISF_MyComputer_fnGetDefaultColumn, + ISF_MyComputer_fnGetDefaultColumnState, + ISF_MyComputer_fnGetDetailsEx, + ISF_MyComputer_fnGetDetailsOf, + ISF_MyComputer_fnMapColumnToSCID +}; + +/************************************************************************ + * IMCFldr_PersistFolder2_QueryInterface + */ +static HRESULT WINAPI IMCFldr_PersistFolder2_QueryInterface (IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObj) +{ + _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + return IUnknown_QueryInterface (_IUnknown_ (This), iid, ppvObj); +} + +/************************************************************************ + * IMCFldr_PersistFolder2_AddRef + */ +static ULONG WINAPI IMCFldr_PersistFolder2_AddRef (IPersistFolder2 * iface) +{ + _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_AddRef (_IUnknown_ (This)); +} + +/************************************************************************ + * ISFPersistFolder_Release + */ +static ULONG WINAPI IMCFldr_PersistFolder2_Release (IPersistFolder2 * iface) +{ + _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface); + + TRACE ("(%p)->(count=%lu)\n", This, This->ref); + + return IUnknown_Release (_IUnknown_ (This)); +} + +/************************************************************************ + * IMCFldr_PersistFolder2_GetClassID + */ +static HRESULT WINAPI IMCFldr_PersistFolder2_GetClassID (IPersistFolder2 * iface, CLSID * lpClassId) +{ + _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface); + + TRACE ("(%p)\n", This); + + if (!lpClassId) + return E_POINTER; + *lpClassId = CLSID_MyComputer; + + return S_OK; +} + +/************************************************************************ + * IMCFldr_PersistFolder2_Initialize + * + * NOTES: it makes no sense to change the pidl + */ +static HRESULT WINAPI IMCFldr_PersistFolder2_Initialize (IPersistFolder2 * iface, LPCITEMIDLIST pidl) +{ + _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface); + TRACE ("(%p)->(%p)\n", This, pidl); + return E_NOTIMPL; +} + +/************************************************************************** + * IPersistFolder2_fnGetCurFolder + */ +static HRESULT WINAPI IMCFldr_PersistFolder2_GetCurFolder (IPersistFolder2 * iface, LPITEMIDLIST * pidl) +{ + _ICOM_THIS_From_IPersistFolder2 (IGenericSFImpl, iface); + + TRACE ("(%p)->(%p)\n", This, pidl); + + if (!pidl) + return E_POINTER; + *pidl = ILClone (This->pidlRoot); + return S_OK; +} + +static IPersistFolder2Vtbl vt_PersistFolder2 = +{ + IMCFldr_PersistFolder2_QueryInterface, + IMCFldr_PersistFolder2_AddRef, + IMCFldr_PersistFolder2_Release, + IMCFldr_PersistFolder2_GetClassID, + IMCFldr_PersistFolder2_Initialize, + IMCFldr_PersistFolder2_GetCurFolder +}; diff --git a/reactos/lib/shell32/shlexec.c b/reactos/lib/shell32/shlexec.c new file mode 100644 index 00000000000..9ea332195e3 --- /dev/null +++ b/reactos/lib/shell32/shlexec.c @@ -0,0 +1,1464 @@ +/* + * Shell Library Functions + * + * Copyright 1998 Marcus Meissner + * Copyright 2002 Eric Pouech + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" +#include "wownt32.h" +#include "shellapi.h" +#include "wingdi.h" +#include "winuser.h" +#include "shlobj.h" +#include "shlwapi.h" +#include "ddeml.h" + +#include "wine/winbase16.h" +#include "shell32_main.h" +#include "undocshell.h" +#include "pidl.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(exec); + +static const WCHAR wszOpen[] = {'o','p','e','n',0}; +static const WCHAR wszExe[] = {'.','e','x','e',0}; +static const WCHAR wszILPtr[] = {':','%','p',0}; +static const WCHAR wszShell[] = {'\\','s','h','e','l','l','\\',0}; +static const WCHAR wszFolder[] = {'F','o','l','d','e','r',0}; +static const WCHAR wszEmpty[] = {0}; + + +/*********************************************************************** + * SHELL_ArgifyW [Internal] + * + * this function is supposed to expand the escape sequences found in the registry + * some diving reported that the following were used: + * + %1, %2... seem to report to parameter of index N in ShellExecute pmts + * %1 file + * %2 printer + * %3 driver + * %4 port + * %I address of a global item ID (explorer switch /idlist) + * %L seems to be %1 as long filename followed by the 8+3 variation + * %S ??? + * %* all following parameters (see batfile) + * + * FIXME: use 'len' + * FIXME: Careful of going over string boundaries. No checking is done to 'res'... + */ +static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lpFile, LPITEMIDLIST pidl, LPCWSTR args) +{ + WCHAR xlpFile[1024]; + BOOL done = FALSE; + PWSTR res = out; + PCWSTR cmd; + LPVOID pv; + + TRACE("%p, %d, %s, %s, %p, %p\n", out, len, debugstr_w(fmt), + debugstr_w(lpFile), pidl, args); + + while (*fmt) + { + if (*fmt == '%') + { + switch (*++fmt) + { + case '\0': + case '%': + *res++ = '%'; + break; + + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '0': + case '*': + if (args) + { + if (*fmt == '*') + { + *res++ = '"'; + while(*args) + *res++ = *args++; + *res++ = '"'; + } + else + { + while(*args && !isspace(*args)) + *res++ = *args++; + + while(isspace(*args)) + ++args; + } + break; + } + /* else fall through */ + case '1': + if (!done || (*fmt == '1')) + { + /*FIXME Is the call to SearchPathW() really needed? We already have separated out the parameter string in args. */ + if (SearchPathW(NULL, lpFile, wszExe, sizeof(xlpFile)/sizeof(WCHAR), xlpFile, NULL)) + cmd = xlpFile; + else + cmd = lpFile; + + /* Add double quotation marks unless we already have them + (e.g.: "file://%1" %* for exefile) or unless the arg is already + enclosed in double quotation marks */ + if ((res == out || *(fmt + 1) != '"') && *cmd != '"') + { + *res++ = '"'; + strcpyW(res, cmd); + res += strlenW(cmd); + *res++ = '"'; + } + else + { + strcpyW(res, cmd); + res += strlenW(cmd); + } + } + break; + + /* + * IE uses this a lot for activating things such as windows media + * player. This is not verified to be fully correct but it appears + * to work just fine. + */ + case 'l': + case 'L': + if (lpFile) { + strcpyW(res, lpFile); + res += strlenW(lpFile); + } + break; + + case 'i': + case 'I': + if (pidl) { + HGLOBAL hmem = SHAllocShared(pidl, ILGetSize(pidl), 0); + pv = SHLockShared(hmem, 0); + res += sprintfW(res, wszILPtr, pv); + SHUnlockShared(pv); + } + break; + + default: + /* + * Check if this is a env-variable here... + */ + + /* Make sure that we have at least one more %.*/ + if (strchrW(fmt, '%')) + { + WCHAR tmpBuffer[1024]; + PWSTR tmpB = tmpBuffer; + WCHAR tmpEnvBuff[MAX_PATH]; + DWORD envRet; + + while (*fmt != '%') + *tmpB++ = *fmt++; + *tmpB++ = 0; + + TRACE("Checking %s to be a env-var\n", debugstr_w(tmpBuffer)); + + envRet = GetEnvironmentVariableW(tmpBuffer, tmpEnvBuff, MAX_PATH); + if (envRet == 0 || envRet > MAX_PATH) + strcpyW( res, tmpBuffer ); + else + strcpyW( res, tmpEnvBuff ); + res += strlenW(res); + } + done = TRUE; + break; + } + /* Don't skip past terminator (catch a single '%' at the end) */ + if (*fmt != '\0') + { + fmt++; + } + } + else + *res++ = *fmt++; + } + + *res = '\0'; + + return done; +} + +HRESULT SHELL_GetPathFromIDListForExecuteA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize) +{ + STRRET strret; + IShellFolder* desktop; + + HRESULT hr = SHGetDesktopFolder(&desktop); + + if (SUCCEEDED(hr)) { + hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &strret); + + if (SUCCEEDED(hr)) + StrRetToStrNA(pszPath, uOutSize, &strret, pidl); + + IShellFolder_Release(desktop); + } + + return hr; +} + +HRESULT SHELL_GetPathFromIDListForExecuteW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize) +{ + STRRET strret; + IShellFolder* desktop; + + HRESULT hr = SHGetDesktopFolder(&desktop); + + if (SUCCEEDED(hr)) { + hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &strret); + + if (SUCCEEDED(hr)) + StrRetToStrNW(pszPath, uOutSize, &strret, pidl); + + IShellFolder_Release(desktop); + } + + return hr; +} + +/************************************************************************* + * SHELL_ResolveShortCutW [Internal] + * read shortcut file at 'wcmd' + */ +static HRESULT SHELL_ResolveShortCutW(LPWSTR wcmd, LPWSTR wargs, LPWSTR wdir, HWND hwnd, LPCWSTR lpVerb, int* pshowcmd, LPITEMIDLIST* ppidl) +{ + IShellFolder* psf; + + HRESULT hr = SHGetDesktopFolder(&psf); + + *ppidl = NULL; + + if (SUCCEEDED(hr)) { + LPITEMIDLIST pidl; + ULONG l; + + hr = IShellFolder_ParseDisplayName(psf, 0, 0, wcmd, &l, &pidl, 0); + + if (SUCCEEDED(hr)) { + IShellLinkW* psl; + + hr = IShellFolder_GetUIObjectOf(psf, NULL, 1, (LPCITEMIDLIST*)&pidl, &IID_IShellLinkW, NULL, (LPVOID*)&psl); + + if (SUCCEEDED(hr)) { + hr = IShellLinkW_Resolve(psl, hwnd, 0); + + if (SUCCEEDED(hr)) { + hr = IShellLinkW_GetPath(psl, wcmd, MAX_PATH, NULL, SLGP_UNCPRIORITY); + + if (SUCCEEDED(hr)) { + if (!*wcmd) { + /* We could not translate the PIDL in the shell link into a valid file system path - so return the PIDL instead. */ + hr = IShellLinkW_GetIDList(psl, ppidl); + + if (SUCCEEDED(hr) && *ppidl) { + /* We got a PIDL instead of a file system path - try to translate it. */ + if (SUCCEEDED(SHELL_GetPathFromIDListW(*ppidl, wcmd, MAX_PATH))) { + SHFree(*ppidl); + *ppidl = NULL; + } + } + } + + if (SUCCEEDED(hr)) { + /* get command line arguments, working directory and display mode if available */ + IShellLinkW_GetWorkingDirectory(psl, wdir, MAX_PATH); + IShellLinkW_GetArguments(psl, wargs, MAX_PATH); + IShellLinkW_GetShowCmd(psl, pshowcmd); + } + } + } + + IShellLinkW_Release(psl); + } + + SHFree(pidl); + } + + IShellFolder_Release(psf); + } + + return hr; +} + +/************************************************************************* + * SHELL_ExecuteW [Internal] + * + */ +static UINT SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, + LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out) +{ + STARTUPINFOW startup; + PROCESS_INFORMATION info; + UINT retval = 31; + UINT gcdret = 0; + WCHAR curdir[MAX_PATH]; + + TRACE("Execute %s from directory %s\n", debugstr_w(lpCmd), debugstr_w(psei->lpDirectory)); + /* ShellExecute specifies the command from psei->lpDirectory + * if present. Not from the current dir as CreateProcess does */ + if( psei->lpDirectory && psei->lpDirectory[0] ) + if( ( gcdret = GetCurrentDirectoryW( MAX_PATH, curdir))) + if( !SetCurrentDirectoryW( psei->lpDirectory)) + ERR("cannot set directory %s\n", debugstr_w(psei->lpDirectory)); + ZeroMemory(&startup,sizeof(STARTUPINFOW)); + startup.cb = sizeof(STARTUPINFOW); + startup.dwFlags = STARTF_USESHOWWINDOW; + startup.wShowWindow = psei->nShow; + if (CreateProcessW(NULL, (LPWSTR)lpCmd, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, + env, *psei->lpDirectory? psei->lpDirectory: NULL, &startup, &info)) + { + /* Give 30 seconds to the app to come up, if desired. Probably only needed + when starting app immediately before making a DDE connection. */ + if (shWait) + if (WaitForInputIdle( info.hProcess, 30000 ) == WAIT_FAILED) + WARN("WaitForInputIdle failed: Error %ld\n", GetLastError() ); + retval = 33; + if (psei->fMask & SEE_MASK_NOCLOSEPROCESS) + psei_out->hProcess = info.hProcess; + else + CloseHandle( info.hProcess ); + CloseHandle( info.hThread ); + } + else if ((retval = GetLastError()) >= 32) + { + FIXME("Strange error set by CreateProcess: %d\n", retval); + retval = ERROR_BAD_FORMAT; + } + + TRACE("returning %u\n", retval); + + psei_out->hInstApp = (HINSTANCE)retval; + if( gcdret ) + if( !SetCurrentDirectoryW( curdir)) + ERR("cannot return to directory %s\n", debugstr_w(curdir)); + + return retval; +} + + +/*********************************************************************** + * SHELL_BuildEnvW [Internal] + * + * Build the environment for the new process, adding the specified + * path to the PATH variable. Returned pointer must be freed by caller. + */ +static void *SHELL_BuildEnvW( const WCHAR *path ) +{ + static const WCHAR wPath[] = {'P','A','T','H','=',0}; + WCHAR *strings, *new_env; + WCHAR *p, *p2; + int total = strlenW(path) + 1; + BOOL got_path = FALSE; + + if (!(strings = GetEnvironmentStringsW())) return NULL; + p = strings; + while (*p) + { + int len = strlenW(p) + 1; + if (!strncmpiW( p, wPath, 5 )) got_path = TRUE; + total += len; + p += len; + } + if (!got_path) total += 5; /* we need to create PATH */ + total++; /* terminating null */ + + if (!(new_env = HeapAlloc( GetProcessHeap(), 0, total * sizeof(WCHAR) ))) + { + FreeEnvironmentStringsW( strings ); + return NULL; + } + p = strings; + p2 = new_env; + while (*p) + { + int len = strlenW(p) + 1; + memcpy( p2, p, len * sizeof(WCHAR) ); + if (!strncmpiW( p, wPath, 5 )) + { + p2[len - 1] = ';'; + strcpyW( p2 + len, path ); + p2 += strlenW(path) + 1; + } + p += len; + p2 += len; + } + if (!got_path) + { + strcpyW( p2, wPath ); + strcatW( p2, path ); + p2 += strlenW(p2) + 1; + } + *p2 = 0; + FreeEnvironmentStringsW( strings ); + return new_env; +} + + +/*********************************************************************** + * SHELL_TryAppPathW [Internal] + * + * Helper function for SHELL_FindExecutable + * @param lpResult - pointer to a buffer of size MAX_PATH + * On entry: szName is a filename (probably without path separators). + * On exit: if szName found in "App Path", place full path in lpResult, and return true + */ +static BOOL SHELL_TryAppPathW( LPCWSTR szName, LPWSTR lpResult, WCHAR **env) +{ + static const WCHAR wszKeyAppPaths[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s', + '\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','A','p','p',' ','P','a','t','h','s','\\',0}; + static const WCHAR wPath[] = {'P','a','t','h',0}; + HKEY hkApp = 0; + WCHAR buffer[1024]; + LONG len; + LONG res; + BOOL found = FALSE; + + if (env) *env = NULL; + strcpyW(buffer, wszKeyAppPaths); + strcatW(buffer, szName); + res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, buffer, 0, KEY_READ, &hkApp); + if (res) goto end; + + len = MAX_PATH*sizeof(WCHAR); + res = RegQueryValueW(hkApp, NULL, lpResult, &len); + if (res) goto end; + found = TRUE; + + if (env) + { + DWORD count = sizeof(buffer); + if (!RegQueryValueExW(hkApp, wPath, NULL, NULL, (LPBYTE)buffer, &count) && buffer[0]) + *env = SHELL_BuildEnvW( buffer ); + } + +end: + if (hkApp) RegCloseKey(hkApp); + return found; +} + +static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, LPWSTR key, LPWSTR filetype, LPWSTR command, LONG commandlen) +{ + static const WCHAR wCommand[] = {'\\','c','o','m','m','a','n','d',0}; + + /* Looking for ...buffer\shell\\command */ + strcatW(filetype, wszShell); + strcatW(filetype, lpOperation); + strcatW(filetype, wCommand); + + if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, command, + &commandlen) == ERROR_SUCCESS) + { + commandlen /= sizeof(WCHAR); + if (key) strcpyW(key, filetype); +#if 0 + LPWSTR tmp; + WCHAR param[256]; + LONG paramlen = sizeof(param); + static const WCHAR wSpace[] = {' ',0}; + + /* FIXME: it seems all Windows version don't behave the same here. + * the doc states that this ddeexec information can be found after + * the exec names. + * on Win98, it doesn't appear, but I think it does on Win2k + */ + /* Get the parameters needed by the application + from the associated ddeexec key */ + tmp = strstrW(filetype, wCommand); + tmp[0] = '\0'; + strcatW(filetype, wDdeexec); + if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, param, + ¶mlen) == ERROR_SUCCESS) + { + paramlen /= sizeof(WCHAR); + strcatW(command, wSpace); + strcatW(command, param); + commandlen += paramlen; + } +#endif + + command[commandlen] = '\0'; + + return 33; /* FIXME see SHELL_FindExecutable() */ + } + + return 31; /* default - 'No association was found' */ +} + +/************************************************************************* + * SHELL_FindExecutable [Internal] + * + * Utility for code sharing between FindExecutable and ShellExecute + * in: + * lpFile the name of a file + * lpOperation the operation on it (open) + * out: + * lpResult a buffer, big enough :-(, to store the command to do the + * operation on the file + * key a buffer, big enough, to get the key name to do actually the + * command (it'll be used afterwards for more information + * on the operation) + */ +UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, + LPWSTR lpResult, int resultLen, LPWSTR key, WCHAR **env, LPITEMIDLIST pidl, LPCWSTR args) +{ + static const WCHAR wWindows[] = {'w','i','n','d','o','w','s',0}; + static const WCHAR wPrograms[] = {'p','r','o','g','r','a','m','s',0}; + static const WCHAR wExtensions[] = {'e','x','e',' ','p','i','f',' ','b','a','t',' ','c','m','d',' ','c','o','m',0}; + WCHAR *extension = NULL; /* pointer to file extension */ + WCHAR filetype[256]; /* registry name for this filetype */ + LONG filetypelen = sizeof(filetype); /* length of above */ + WCHAR command[1024]; /* command from registry */ + WCHAR wBuffer[256]; /* Used to GetProfileString */ + UINT retval = 31; /* default - 'No association was found' */ + WCHAR *tok; /* token pointer */ + WCHAR xlpFile[256]; /* result of SearchPath */ + DWORD attribs; /* file attributes */ + + TRACE("%s\n", (lpFile != NULL) ? debugstr_w(lpFile) : "-"); + + xlpFile[0] = '\0'; + lpResult[0] = '\0'; /* Start off with an empty return string */ + if (key) *key = '\0'; + + /* trap NULL parameters on entry */ + if ((lpFile == NULL) || (lpResult == NULL) || (lpOperation == NULL)) + { + WARN("(lpFile=%s,lpResult=%s,lpOperation=%s): NULL parameter\n", + debugstr_w(lpFile), debugstr_w(lpOperation), debugstr_w(lpResult)); + return 2; /* File not found. Close enough, I guess. */ + } + + if (SHELL_TryAppPathW( lpFile, lpResult, env )) + { + TRACE("found %s via App Paths\n", debugstr_w(lpResult)); + return 33; + } + + if (SearchPathW(lpPath, lpFile, wszExe, sizeof(xlpFile)/sizeof(WCHAR), xlpFile, NULL)) + { + TRACE("SearchPathW returned non-zero\n"); + lpFile = xlpFile; + /* Hey, isn't this value ignored? Why make this call? Shouldn't we return here? --dank*/ + } + + attribs = GetFileAttributesW(lpFile); + if (attribs!=INVALID_FILE_ATTRIBUTES && (attribs&FILE_ATTRIBUTE_DIRECTORY)) + { + strcpyW(filetype, wszFolder); + filetypelen = 6; /* strlen("Folder") */ + } + else + { + /* First thing we need is the file's extension */ + extension = strrchrW(xlpFile, '.'); /* Assume last "." is the one; */ + /* File->Run in progman uses */ + /* .\FILE.EXE :( */ + TRACE("xlpFile=%s,extension=%s\n", debugstr_w(xlpFile), debugstr_w(extension)); + + if (extension == NULL || extension[1]==0) + { + WARN("Returning 31 - No association\n"); + return 31; /* no association */ + } + + /* Three places to check: */ + /* 1. win.ini, [windows], programs (NB no leading '.') */ + /* 2. Registry, HKEY_CLASS_ROOT\\shell\open\command */ + /* 3. win.ini, [extensions], extension (NB no leading '.' */ + /* All I know of the order is that registry is checked before */ + /* extensions; however, it'd make sense to check the programs */ + /* section first, so that's what happens here. */ + + /* See if it's a program - if GetProfileString fails, we skip this + * section. Actually, if GetProfileString fails, we've probably + * got a lot more to worry about than running a program... */ + if (GetProfileStringW(wWindows, wPrograms, wExtensions, wBuffer, sizeof(wBuffer)/sizeof(WCHAR)) > 0) + { + CharLowerW(wBuffer); + tok = wBuffer; + while (*tok) + { + WCHAR *p = tok; + while (*p && *p != ' ' && *p != '\t') p++; + if (*p) + { + *p++ = 0; + while (*p == ' ' || *p == '\t') p++; + } + + if (strcmpiW(tok, &extension[1]) == 0) /* have to skip the leading "." */ + { + strcpyW(lpResult, xlpFile); + /* Need to perhaps check that the file has a path + * attached */ + TRACE("found %s\n", debugstr_w(lpResult)); + return 33; + + /* Greater than 32 to indicate success FIXME According to the + * docs, I should be returning a handle for the + * executable. Does this mean I'm supposed to open the + * executable file or something? More RTFM, I guess... */ + } + tok = p; + } + } + + /* Check registry */ + if (RegQueryValueW(HKEY_CLASSES_ROOT, extension, filetype, + &filetypelen) == ERROR_SUCCESS) + { + filetypelen /= sizeof(WCHAR); + filetype[filetypelen] = '\0'; + TRACE("File type: %s\n", debugstr_w(filetype)); + } + } + + if (*filetype) + { + if (lpOperation) + { + /* pass the operation string to SHELL_FindExecutableByOperation() */ + filetype[filetypelen] = '\0'; + retval = SHELL_FindExecutableByOperation(lpPath, lpFile, lpOperation, key, filetype, command, sizeof(command)); + } + else + { + WCHAR operation[MAX_PATH]; + HKEY hkey; + + /* Looking for ...buffer\shell\\command */ + strcatW(filetype, wszShell); + + /* enumerate the operation subkeys in the registry and search for one with an associated command */ + if (RegOpenKeyW(HKEY_CLASSES_ROOT, filetype, &hkey) == ERROR_SUCCESS) + { + int idx = 0; + for(;; ++idx) + { + if (RegEnumKeyW(hkey, idx, operation, MAX_PATH) != ERROR_SUCCESS) + break; + + filetype[filetypelen] = '\0'; + retval = SHELL_FindExecutableByOperation(lpPath, lpFile, operation, key, filetype, command, sizeof(command)); + + if (retval > 32) + break; + } + RegCloseKey(hkey); + } + } + + if (retval > 32) + { + SHELL_ArgifyW(lpResult, resultLen, command, xlpFile, pidl, args); + + /* Remove double quotation marks and command line arguments */ + if (*lpResult == '"') + { + WCHAR *p = lpResult; + while (*(p + 1) != '"') + { + *p = *(p + 1); + p++; + } + *p = '\0'; + } + } + } + else /* Check win.ini */ + { + static const WCHAR wExtensions[] = {'e','x','t','e','n','s','i','o','n','s',0}; + + /* Toss the leading dot */ + extension++; + if (GetProfileStringW(wExtensions, extension, wszEmpty, command, sizeof(command)/sizeof(WCHAR)) > 0) + { + if (strlenW(command) != 0) + { + strcpyW(lpResult, command); + tok = strchrW(lpResult, '^'); /* should be ^.extension? */ + if (tok != NULL) + { + tok[0] = '\0'; + strcatW(lpResult, xlpFile); /* what if no dir in xlpFile? */ + tok = strchrW(command, '^'); /* see above */ + if ((tok != NULL) && (strlenW(tok)>5)) + { + strcatW(lpResult, &tok[5]); + } + } + retval = 33; /* FIXME - see above */ + } + } + } + + TRACE("returning %s\n", debugstr_w(lpResult)); + return retval; +} + +/****************************************************************** + * dde_cb + * + * callback for the DDE connection. not really usefull + */ +static HDDEDATA CALLBACK dde_cb(UINT uType, UINT uFmt, HCONV hConv, + HSZ hsz1, HSZ hsz2, HDDEDATA hData, + ULONG_PTR dwData1, ULONG_PTR dwData2) +{ + TRACE("dde_cb: %04x, %04x, %p, %p, %p, %p, %08lx, %08lx\n", + uType, uFmt, hConv, hsz1, hsz2, hData, dwData1, dwData2); + return NULL; +} + +/****************************************************************** + * dde_connect + * + * ShellExecute helper. Used to do an operation with a DDE connection + * + * Handles both the direct connection (try #1), and if it fails, + * launching an application and trying (#2) to connect to it + * + */ +static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec, + const WCHAR* lpFile, WCHAR *env, + LPCWSTR szCommandline, LPITEMIDLIST pidl, SHELL_ExecuteW32 execfunc, + LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out) +{ + static const WCHAR wApplication[] = {'\\','a','p','p','l','i','c','a','t','i','o','n',0}; + static const WCHAR wTopic[] = {'\\','t','o','p','i','c',0}; + WCHAR * endkey = key + strlenW(key); + WCHAR app[256], topic[256], ifexec[256], res[256]; + LONG applen, topiclen, ifexeclen; + WCHAR * exec; + DWORD ddeInst = 0; + DWORD tid; + HSZ hszApp, hszTopic; + HCONV hConv; + HDDEDATA hDdeData; + unsigned ret = 31; + + strcpyW(endkey, wApplication); + applen = sizeof(app); + if (RegQueryValueW(HKEY_CLASSES_ROOT, key, app, &applen) != ERROR_SUCCESS) + { + FIXME("default app name NIY %s\n", debugstr_w(key)); + return 2; + } + + strcpyW(endkey, wTopic); + topiclen = sizeof(topic); + if (RegQueryValueW(HKEY_CLASSES_ROOT, key, topic, &topiclen) != ERROR_SUCCESS) + { + static const WCHAR wSystem[] = {'S','y','s','t','e','m',0}; + strcpyW(topic, wSystem); + } + + if (DdeInitializeW(&ddeInst, dde_cb, APPCMD_CLIENTONLY, 0L) != DMLERR_NO_ERROR) + { + return 2; + } + + hszApp = DdeCreateStringHandleW(ddeInst, app, CP_WINUNICODE); + hszTopic = DdeCreateStringHandleW(ddeInst, topic, CP_WINUNICODE); + + hConv = DdeConnect(ddeInst, hszApp, hszTopic, NULL); + exec = ddeexec; + if (!hConv) + { + static const WCHAR wIfexec[] = {'\\','i','f','e','x','e','c',0}; + TRACE("Launching '%s'\n", debugstr_w(start)); + ret = execfunc(start, env, TRUE, psei, psei_out); + if (ret < 32) + { + TRACE("Couldn't launch\n"); + goto error; + } + hConv = DdeConnect(ddeInst, hszApp, hszTopic, NULL); + if (!hConv) + { + TRACE("Couldn't connect. ret=%d\n", ret); + DdeUninitialize(ddeInst); + SetLastError(ERROR_DDE_FAIL); + return 30; /* whatever */ + } + strcpyW(endkey, wIfexec); + ifexeclen = sizeof(ifexec); + if (RegQueryValueW(HKEY_CLASSES_ROOT, key, ifexec, &ifexeclen) == ERROR_SUCCESS) + { + exec = ifexec; + } + } + + SHELL_ArgifyW(res, sizeof(res)/sizeof(WCHAR), exec, lpFile, pidl, szCommandline); + TRACE("%s %s => %s\n", debugstr_w(exec), debugstr_w(lpFile), debugstr_w(res)); + + /* It's documented in the KB 330337 that IE has a bug and returns + * error DMLERR_NOTPROCESSED on XTYP_EXECUTE request. + */ + hDdeData = DdeClientTransaction((LPBYTE)res, (strlenW(res) + 1) * sizeof(WCHAR), hConv, 0L, 0, + XTYP_EXECUTE, 10000, &tid); + if (hDdeData) + DdeFreeDataHandle(hDdeData); + else + WARN("DdeClientTransaction failed with error %04x\n", DdeGetLastError(ddeInst)); + ret = 33; + + DdeDisconnect(hConv); + + error: + DdeUninitialize(ddeInst); + + return ret; +} + +/************************************************************************* + * execute_from_key [Internal] + */ +static UINT execute_from_key(LPWSTR key, LPCWSTR lpFile, WCHAR *env, LPCWSTR szCommandline, + SHELL_ExecuteW32 execfunc, + LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out) +{ + WCHAR cmd[1024]; + LONG cmdlen = sizeof(cmd); + UINT retval = 31; + + cmd[0] = '\0'; + + /* Get the application for the registry */ + if (RegQueryValueW(HKEY_CLASSES_ROOT, key, cmd, &cmdlen) == ERROR_SUCCESS) + { + static const WCHAR wCommand[] = {'c','o','m','m','a','n','d',0}; + static const WCHAR wDdeexec[] = {'d','d','e','e','x','e','c',0}; + LPWSTR tmp; + WCHAR param[256]; + LONG paramlen = sizeof(param); + + param[0] = '\0'; + + /* Get the parameters needed by the application + from the associated ddeexec key */ + tmp = strstrW(key, wCommand); + assert(tmp); + strcpyW(tmp, wDdeexec); + + if (RegQueryValueW(HKEY_CLASSES_ROOT, key, param, ¶mlen) == ERROR_SUCCESS) + { + TRACE("Got ddeexec %s => %s\n", debugstr_w(key), debugstr_w(param)); + retval = dde_connect(key, cmd, param, lpFile, env, szCommandline, psei->lpIDList, execfunc, psei, psei_out); + } + else + { + /* Is there a replace() function anywhere? */ + cmdlen /= sizeof(WCHAR); + cmd[cmdlen] = '\0'; + SHELL_ArgifyW(param, sizeof(param)/sizeof(WCHAR), cmd, lpFile, psei->lpIDList, szCommandline); + retval = execfunc(param, env, FALSE, psei, psei_out); + } + } + else TRACE("ooch\n"); + + return retval; +} + +/************************************************************************* + * FindExecutableA [SHELL32.@] + */ +HINSTANCE WINAPI FindExecutableA(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult) +{ + HINSTANCE retval; + WCHAR *wFile = NULL, *wDirectory = NULL; + WCHAR wResult[MAX_PATH]; + + if (lpFile) __SHCloneStrAtoW(&wFile, lpFile); + if (lpDirectory) __SHCloneStrAtoW(&wDirectory, lpDirectory); + + retval = FindExecutableW(wFile, wDirectory, wResult); + WideCharToMultiByte(CP_ACP, 0, wResult, -1, lpResult, MAX_PATH, NULL, NULL); + if (wFile) SHFree( wFile ); + if (wDirectory) SHFree( wDirectory ); + + TRACE("returning %s\n", lpResult); + return (HINSTANCE)retval; +} + +/************************************************************************* + * FindExecutableW [SHELL32.@] + */ +HINSTANCE WINAPI FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpResult) +{ + UINT retval = 31; /* default - 'No association was found' */ + WCHAR old_dir[1024]; + + TRACE("File %s, Dir %s\n", + (lpFile != NULL ? debugstr_w(lpFile) : "-"), (lpDirectory != NULL ? debugstr_w(lpDirectory) : "-")); + + lpResult[0] = '\0'; /* Start off with an empty return string */ + + /* trap NULL parameters on entry */ + if ((lpFile == NULL) || (lpResult == NULL)) + { + /* FIXME - should throw a warning, perhaps! */ + return (HINSTANCE)2; /* File not found. Close enough, I guess. */ + } + + if (lpDirectory) + { + GetCurrentDirectoryW(sizeof(old_dir)/sizeof(WCHAR), old_dir); + SetCurrentDirectoryW(lpDirectory); + } + + retval = SHELL_FindExecutable(lpDirectory, lpFile, wszOpen, lpResult, MAX_PATH, NULL, NULL, NULL, NULL); + + TRACE("returning %s\n", debugstr_w(lpResult)); + if (lpDirectory) + SetCurrentDirectoryW(old_dir); + return (HINSTANCE)retval; +} + +/************************************************************************* + * ShellExecuteExW32 [Internal] + */ +BOOL WINAPI ShellExecuteExW32 (LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc) +{ + static const WCHAR wQuote[] = {'"',0}; + static const WCHAR wSpace[] = {' ',0}; + static const WCHAR wWww[] = {'w','w','w',0}; + static const WCHAR wFile[] = {'f','i','l','e',0}; + static const WCHAR wHttp[] = {'h','t','t','p',':','/','/',0}; + static const WCHAR wExtLnk[] = {'.','l','n','k',0}; + static const WCHAR wExplorer[] = {'e','x','p','l','o','r','e','r','.','e','x','e',0}; + + WCHAR wszApplicationName[MAX_PATH+2], wszParameters[1024], wszDir[MAX_PATH]; + SHELLEXECUTEINFOW sei_tmp; /* modifiable copy of SHELLEXECUTEINFO struct */ + WCHAR wfileName[MAX_PATH]; + WCHAR *env; + WCHAR lpstrProtocol[256]; + LPCWSTR lpFile; + UINT retval = 31; + WCHAR wcmd[1024]; + WCHAR buffer[MAX_PATH]; + const WCHAR* ext; + BOOL done; + + /* make a local copy of the LPSHELLEXECUTEINFO structure and work with this from now on */ + memcpy(&sei_tmp, sei, sizeof(sei_tmp)); + + TRACE("mask=0x%08lx hwnd=%p verb=%s file=%s parm=%s dir=%s show=0x%08x class=%s\n", + sei_tmp.fMask, sei_tmp.hwnd, debugstr_w(sei_tmp.lpVerb), + debugstr_w(sei_tmp.lpFile), debugstr_w(sei_tmp.lpParameters), + debugstr_w(sei_tmp.lpDirectory), sei_tmp.nShow, + (sei_tmp.fMask & SEE_MASK_CLASSNAME) ? debugstr_w(sei_tmp.lpClass) : "not used"); + + sei->hProcess = NULL; + + /* make copies of all path/command strings */ + if (sei_tmp.lpFile) + strcpyW(wszApplicationName, sei_tmp.lpFile); + else + *wszApplicationName = '\0'; + + if (sei_tmp.lpParameters) + strcpyW(wszParameters, sei_tmp.lpParameters); + else + *wszParameters = '\0'; + + if (sei_tmp.lpDirectory) + strcpyW(wszDir, sei_tmp.lpDirectory); + else + *wszDir = '\0'; + + /* adjust string pointers to point to the new buffers */ + sei_tmp.lpFile = wszApplicationName; + sei_tmp.lpParameters = wszParameters; + sei_tmp.lpDirectory = wszDir; + + if (sei_tmp.fMask & (SEE_MASK_INVOKEIDLIST | SEE_MASK_ICON | SEE_MASK_HOTKEY | + SEE_MASK_CONNECTNETDRV | SEE_MASK_FLAG_DDEWAIT | + SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI | SEE_MASK_UNICODE | + SEE_MASK_NO_CONSOLE | SEE_MASK_ASYNCOK | SEE_MASK_HMONITOR )) + { + FIXME("flags ignored: 0x%08lx\n", sei_tmp.fMask); + } + + /* process the IDList */ + if (sei_tmp.fMask & SEE_MASK_IDLIST) + { + IShellExecuteHookW* pSEH; + + HRESULT hr = SHBindToParent(sei_tmp.lpIDList, &IID_IShellExecuteHookW, (LPVOID*)&pSEH, NULL); + + if (SUCCEEDED(hr)) + { + hr = IShellExecuteHookW_Execute(pSEH, sei); + + IShellExecuteHookW_Release(pSEH); + + if (hr == S_OK) + return TRUE; + } + + wszApplicationName[0] = '"'; + SHGetPathFromIDListW(sei_tmp.lpIDList, wszApplicationName+1); + strcatW(wszApplicationName, wQuote); + TRACE("-- idlist=%p (%s)\n", sei_tmp.lpIDList, debugstr_w(wszApplicationName)); + } + + if (sei_tmp.fMask & (SEE_MASK_CLASSNAME | SEE_MASK_CLASSKEY)) + { + /* launch a document by fileclass like 'WordPad.Document.1' */ + /* the Commandline contains 'c:\Path\wordpad.exe "%1"' */ + /* FIXME: szCommandline should not be of a fixed size. Fixed to 1024, MAX_PATH is way too short! */ + HCR_GetExecuteCommandW((sei_tmp.fMask & SEE_MASK_CLASSKEY) ? sei_tmp.hkeyClass : NULL, + (sei_tmp.fMask & SEE_MASK_CLASSNAME) ? sei_tmp.lpClass: NULL, + (sei_tmp.lpVerb) ? sei_tmp.lpVerb : wszOpen, + wszParameters, sizeof(wszParameters)/sizeof(WCHAR)); + + /* FIXME: get the extension of lpFile, check if it fits to the lpClass */ + TRACE("SEE_MASK_CLASSNAME->'%s', doc->'%s'\n", debugstr_w(wszParameters), debugstr_w(wszApplicationName)); + + wcmd[0] = '\0'; + done = SHELL_ArgifyW(wcmd, sizeof(wcmd)/sizeof(WCHAR), wszParameters, wszApplicationName, sei_tmp.lpIDList, NULL); + if (!done && wszApplicationName[0]) + { + strcatW(wcmd, wSpace); + strcatW(wcmd, wszApplicationName); + } + retval = execfunc(wcmd, NULL, FALSE, &sei_tmp, sei); + if (retval > 32) + return TRUE; + else + return FALSE; + } + + + /* resolve shell shortcuts */ + ext = PathFindExtensionW(sei_tmp.lpFile); + + if (ext && !strncmpiW(ext, wExtLnk, sizeof(wExtLnk) / sizeof(WCHAR) - 1) && + (ext[sizeof(wExtLnk) / sizeof(WCHAR) - 1] == '\0' || + (sei_tmp.lpFile[0] == '"' && ext[sizeof(wExtLnk) / sizeof(WCHAR) - 1] == '"'))) /* or check for: shell_attribs & SFGAO_LINK */ + { + HRESULT hr; + BOOL Quoted; + + if (wszApplicationName[0] == '"') + { + if (wszApplicationName[strlenW(wszApplicationName) - 1] == '"') + { + wszApplicationName[strlenW(wszApplicationName) - 1] = '\0'; + Quoted = TRUE; + } + else + { + Quoted = FALSE; + } + } + else + { + Quoted = FALSE; + } + /* expand paths before reading shell link */ + if (ExpandEnvironmentStringsW(Quoted ? sei_tmp.lpFile + 1 : sei_tmp.lpFile, buffer, MAX_PATH)) + lstrcpyW(Quoted ? wszApplicationName + 1 : wszApplicationName/*sei_tmp.lpFile*/, buffer); + + if (*sei_tmp.lpParameters) + if (ExpandEnvironmentStringsW(sei_tmp.lpParameters, buffer, MAX_PATH)) + lstrcpyW(wszParameters/*sei_tmp.lpParameters*/, buffer); + + hr = SHELL_ResolveShortCutW((LPWSTR)(Quoted ? sei_tmp.lpFile + 1 : sei_tmp.lpFile), + (LPWSTR)sei_tmp.lpParameters, (LPWSTR)sei_tmp.lpDirectory, + sei_tmp.hwnd, sei_tmp.lpVerb?sei_tmp.lpVerb:wszEmpty, &sei_tmp.nShow, (LPITEMIDLIST*)&sei_tmp.lpIDList); + if (Quoted) + { + wszApplicationName[strlenW(wszApplicationName) + 1] = '\0'; + wszApplicationName[strlenW(wszApplicationName)] = '"'; + } + + if (sei->lpIDList) + sei->fMask |= SEE_MASK_IDLIST; + + if (SUCCEEDED(hr)) + { + /* repeat IDList processing if needed */ + if (sei_tmp.fMask & SEE_MASK_IDLIST) + { + IShellExecuteHookW* pSEH; + + HRESULT hr = SHBindToParent(sei_tmp.lpIDList, &IID_IShellExecuteHookW, (LPVOID*)&pSEH, NULL); + + if (SUCCEEDED(hr)) + { + hr = IShellExecuteHookW_Execute(pSEH, sei); + + IShellExecuteHookW_Release(pSEH); + + if (hr == S_OK) + return TRUE; + } + + TRACE("-- idlist=%p (%s)\n", debugstr_w(sei_tmp.lpIDList), debugstr_w(sei_tmp.lpFile)); + } + } + } + + + /* Has the IDList not yet been translated? */ + if (sei_tmp.fMask & SEE_MASK_IDLIST) + { + /* last chance to translate IDList: now also allow CLSID paths */ + if (SUCCEEDED(SHELL_GetPathFromIDListForExecuteW(sei_tmp.lpIDList, buffer, sizeof(buffer)))) { + if (buffer[0]==':' && buffer[1]==':') { + /* open shell folder for the specified class GUID */ + strcpyW(wszParameters, buffer); + strcpyW(wszApplicationName, wExplorer); + + sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST; + } else if (HCR_GetExecuteCommandW(0, wszFolder, sei_tmp.lpVerb?sei_tmp.lpVerb:wszOpen, buffer, sizeof(buffer))) { + SHELL_ArgifyW(wszApplicationName, sizeof(wszApplicationName)/sizeof(WCHAR), buffer, NULL, sei_tmp.lpIDList, NULL); + + sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST; + } + } + } + + /* expand environment strings */ + if (ExpandEnvironmentStringsW(sei_tmp.lpFile, buffer, MAX_PATH)) + lstrcpyW(wszApplicationName, buffer); + + if (*sei_tmp.lpParameters) + if (ExpandEnvironmentStringsW(sei_tmp.lpParameters, buffer, MAX_PATH)) + lstrcpyW(wszParameters, buffer); + + if (*sei_tmp.lpDirectory) + if (ExpandEnvironmentStringsW(sei_tmp.lpDirectory, buffer, MAX_PATH)) + lstrcpyW(wszDir, buffer); + + /* Else, try to execute the filename */ + TRACE("execute:%s,%s,%s\n", debugstr_w(wszApplicationName), debugstr_w(wszParameters), debugstr_w(wszDir)); + + /* separate out command line arguments from executable file name */ + if (!*sei_tmp.lpParameters) { + /* If the executable path is quoted, handle the rest of the command line as parameters. */ + if (sei_tmp.lpFile[0] == '"') { + LPWSTR src = wszApplicationName/*sei_tmp.lpFile*/ + 1; + LPWSTR dst = wfileName; + LPWSTR end; + + /* copy the unquoted executable path to 'wfileName' */ + while(*src && *src!='"') + *dst++ = *src++; + + *dst = '\0'; + + if (*src == '"') { + end = ++src; + + while(isspace(*src)) + ++src; + } else + end = src; + + /* copy the parameter string to 'wszParameters' */ + strcpyW(wszParameters, src); + + /* terminate previous command string after the quote character */ + *end = '\0'; + } + else + { + /* If the executable name is not quoted, we have to use this search loop here, + that in CreateProcess() is not sufficient because it does not handle shell links. */ + WCHAR buffer[MAX_PATH], xlpFile[MAX_PATH]; + LPWSTR space, s; + + LPWSTR beg = wszApplicationName/*sei_tmp.lpFile*/; + for(s=beg; (space=strchrW(s, ' ')); s=space+1) { + int idx = space-sei_tmp.lpFile; + strncpyW(buffer, sei_tmp.lpFile, idx); + buffer[idx] = '\0'; + + /*FIXME This finds directory paths if the targeted file name contains spaces. */ + if (SearchPathW(*sei_tmp.lpDirectory? sei_tmp.lpDirectory: NULL, buffer, wszExe, sizeof(xlpFile), xlpFile, NULL)) + { + /* separate out command from parameter string */ + LPCWSTR p = space + 1; + + while(isspaceW(*p)) + ++p; + + strcpyW(wszParameters, p); + *space = '\0'; + + break; + } + } + + strcpyW(wfileName, sei_tmp.lpFile); + } + } else + strcpyW(wfileName, sei_tmp.lpFile); + + lpFile = wfileName; + + if (sei_tmp.lpParameters[0]) { + strcatW(wszApplicationName, wSpace); + strcatW(wszApplicationName, wszParameters); + } + + /* We set the default to open, and that should generally work. + But that is not really the way the MS docs say to do it. */ + if (!sei_tmp.lpVerb) + sei_tmp.lpVerb = wszOpen; + + retval = execfunc(wszApplicationName, NULL, FALSE, &sei_tmp, sei); + if (retval > 32) + return TRUE; + + /* Else, try to find the executable */ + wcmd[0] = '\0'; + retval = SHELL_FindExecutable(sei_tmp.lpDirectory, lpFile, sei_tmp.lpVerb, wcmd, 1024, lpstrProtocol, &env, sei_tmp.lpIDList, sei_tmp.lpParameters); + if (retval > 32) /* Found */ + { + WCHAR wszQuotedCmd[MAX_PATH+2]; + /* Must quote to handle case where cmd contains spaces, + * else security hole if malicious user creates executable file "C:\\Program" + */ + strcpyW(wszQuotedCmd, wQuote); + strcatW(wszQuotedCmd, wcmd); + strcatW(wszQuotedCmd, wQuote); + if (wszParameters[0]) { + strcatW(wszQuotedCmd, wSpace); + strcatW(wszQuotedCmd, wszParameters); + } + TRACE("%s/%s => %s/%s\n", debugstr_w(wszApplicationName), debugstr_w(sei_tmp.lpVerb), debugstr_w(wszQuotedCmd), debugstr_w(lpstrProtocol)); + if (*lpstrProtocol) + retval = execute_from_key(lpstrProtocol, wszApplicationName, env, sei_tmp.lpParameters, execfunc, &sei_tmp, sei); + else + retval = execfunc(wszQuotedCmd, env, FALSE, &sei_tmp, sei); + if (env) HeapFree( GetProcessHeap(), 0, env ); + } + else if (PathIsURLW((LPWSTR)lpFile)) /* File not found, check for URL */ + { + static const WCHAR wShell[] = {'\\','s','h','e','l','l','\\',0}; + static const WCHAR wCommand[] = {'\\','c','o','m','m','a','n','d',0}; + LPWSTR lpstrRes; + INT iSize; + + lpstrRes = strchrW(lpFile, ':'); + if (lpstrRes) + iSize = lpstrRes - lpFile; + else + iSize = strlenW(lpFile); + + TRACE("Got URL: %s\n", debugstr_w(lpFile)); + /* Looking for ...protocol\shell\lpOperation\command */ + strncpyW(lpstrProtocol, lpFile, iSize); + lpstrProtocol[iSize] = '\0'; + strcatW(lpstrProtocol, wShell); + strcatW(lpstrProtocol, sei_tmp.lpVerb? sei_tmp.lpVerb: wszOpen); + strcatW(lpstrProtocol, wCommand); + + /* Remove File Protocol from lpFile */ + /* In the case file://path/file */ + if (!strncmpiW(lpFile, wFile, iSize)) + { + lpFile += iSize; + while (*lpFile == ':') lpFile++; + } + retval = execute_from_key(lpstrProtocol, lpFile, NULL, sei_tmp.lpParameters, execfunc, &sei_tmp, sei); + } + /* Check if file specified is in the form www.??????.*** */ + else if (!strncmpiW(lpFile, wWww, 3)) + { + /* if so, append lpFile http:// and call ShellExecute */ + WCHAR lpstrTmpFile[256]; + strcpyW(lpstrTmpFile, wHttp); + strcatW(lpstrTmpFile, lpFile); + retval = (UINT)ShellExecuteW(sei_tmp.hwnd, sei_tmp.lpVerb, lpstrTmpFile, NULL, NULL, 0); + } + + TRACE("retval %u\n", retval); + + if (retval <= 32) + { + sei->hInstApp = (HINSTANCE)retval; + return FALSE; + } + + sei->hInstApp = (HINSTANCE)33; + return TRUE; +} + +/************************************************************************* + * ShellExecuteA [SHELL32.290] + */ +HINSTANCE WINAPI ShellExecuteA(HWND hWnd, LPCSTR lpOperation,LPCSTR lpFile, + LPCSTR lpParameters,LPCSTR lpDirectory, INT iShowCmd) +{ + SHELLEXECUTEINFOA sei; + HANDLE hProcess = 0; + + TRACE("%p,%s,%s,%s,%s,%d\n", + hWnd, lpOperation, lpFile, lpParameters, lpDirectory, iShowCmd); + + sei.cbSize = sizeof(sei); + sei.fMask = 0; + sei.hwnd = hWnd; + sei.lpVerb = lpOperation; + sei.lpFile = lpFile; + sei.lpParameters = lpParameters; + sei.lpDirectory = lpDirectory; + sei.nShow = iShowCmd; + sei.lpIDList = 0; + sei.lpClass = 0; + sei.hkeyClass = 0; + sei.dwHotKey = 0; + sei.hProcess = hProcess; + + ShellExecuteExA (&sei); + return sei.hInstApp; +} + +/************************************************************************* + * ShellExecuteEx [SHELL32.291] + * + */ +BOOL WINAPI ShellExecuteExAW (LPVOID sei) +{ + if (SHELL_OsIsUnicode()) + return ShellExecuteExW32 (sei, SHELL_ExecuteW); + return ShellExecuteExA (sei); +} + +/************************************************************************* + * ShellExecuteExA [SHELL32.292] + * + */ +BOOL WINAPI ShellExecuteExA (LPSHELLEXECUTEINFOA sei) +{ + SHELLEXECUTEINFOW seiW; + BOOL ret; + WCHAR *wVerb = NULL, *wFile = NULL, *wParameters = NULL, *wDirectory = NULL, *wClass = NULL; + + TRACE("%p\n", sei); + + memcpy(&seiW, sei, sizeof(SHELLEXECUTEINFOW)); + + if (sei->lpVerb) + seiW.lpVerb = __SHCloneStrAtoW(&wVerb, sei->lpVerb); + + if (sei->lpFile) + seiW.lpFile = __SHCloneStrAtoW(&wFile, sei->lpFile); + + if (sei->lpParameters) + seiW.lpParameters = __SHCloneStrAtoW(&wParameters, sei->lpParameters); + + if (sei->lpDirectory) + seiW.lpDirectory = __SHCloneStrAtoW(&wDirectory, sei->lpDirectory); + + if ((sei->fMask & SEE_MASK_CLASSNAME) && sei->lpClass) + seiW.lpClass = __SHCloneStrAtoW(&wClass, sei->lpClass); + else + seiW.lpClass = NULL; + + ret = ShellExecuteExW32 (&seiW, SHELL_ExecuteW); + + sei->hInstApp = seiW.hInstApp; + + if (wVerb) SHFree(wVerb); + if (wFile) SHFree(wFile); + if (wParameters) SHFree(wParameters); + if (wDirectory) SHFree(wDirectory); + if (wClass) SHFree(wClass); + + return ret; +} + +/************************************************************************* + * ShellExecuteExW [SHELL32.293] + * + */ +BOOL WINAPI ShellExecuteExW (LPSHELLEXECUTEINFOW sei) +{ + return ShellExecuteExW32 (sei, SHELL_ExecuteW); +} + +/************************************************************************* + * ShellExecuteW [SHELL32.294] + * from shellapi.h + * WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, + * LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd); + */ +HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, + LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd) +{ + SHELLEXECUTEINFOW sei; + HANDLE hProcess = 0; + + TRACE("\n"); + sei.cbSize = sizeof(sei); + sei.fMask = 0; + sei.hwnd = hwnd; + sei.lpVerb = lpOperation; + sei.lpFile = lpFile; + sei.lpParameters = lpParameters; + sei.lpDirectory = lpDirectory; + sei.nShow = nShowCmd; + sei.lpIDList = 0; + sei.lpClass = 0; + sei.hkeyClass = 0; + sei.dwHotKey = 0; + sei.hProcess = hProcess; + + ShellExecuteExW32 (&sei, SHELL_ExecuteW); + return sei.hInstApp; +} diff --git a/reactos/lib/shell32/shlfileop.c b/reactos/lib/shell32/shlfileop.c new file mode 100644 index 00000000000..814fce00f48 --- /dev/null +++ b/reactos/lib/shell32/shlfileop.c @@ -0,0 +1,1429 @@ +/* + * SHFileOperation + * + * Copyright 2000 Juergen Schmied + * Copyright 2002 Andriy Palamarchuk + * Copyright 2004 Dietrich Teickner (from Odin) + * Copyright 2004 Rolf Kalbermatter + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "shellapi.h" +#include "wingdi.h" +#include "winuser.h" +#include "shlobj.h" +#include "shresdef.h" +#define NO_SHLWAPI_STREAM +#include "shlwapi.h" +#include "shell32_main.h" +#include "undocshell.h" +#include "wine/unicode.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +#define IsAttrib(x, y) ((INVALID_FILE_ATTRIBUTES != (x)) && ((x) & (y))) +#define IsAttribFile(x) (!((x) & FILE_ATTRIBUTE_DIRECTORY)) +#define IsAttribDir(x) IsAttrib(x, FILE_ATTRIBUTE_DIRECTORY) +#define IsDotDir(x) ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0)))) + +#define FO_MASK 0xF + +static const WCHAR wWildcardFile[] = {'*',0}; +static const WCHAR wWildcardChars[] = {'*','?',0}; +static const WCHAR wBackslash[] = {'\\',0}; + +static BOOL SHELL_DeleteDirectoryW(LPCWSTR path, BOOL bShowUI); +static DWORD SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec); +static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec); +static DWORD SHNotifyRemoveDirectoryA(LPCSTR path); +static DWORD SHNotifyRemoveDirectoryW(LPCWSTR path); +static DWORD SHNotifyDeleteFileA(LPCSTR path); +static DWORD SHNotifyDeleteFileW(LPCWSTR path); +static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest); +static DWORD SHNotifyCopyFileW(LPCWSTR src, LPCWSTR dest, BOOL bFailIfExists); +static DWORD SHFindAttrW(LPCWSTR pName, BOOL fileOnly); + +typedef struct +{ + UINT caption_resource_id, text_resource_id; +} SHELL_ConfirmIDstruc; + +static BOOL SHELL_ConfirmIDs(int nKindOfDialog, SHELL_ConfirmIDstruc *ids) +{ + switch (nKindOfDialog) { + case ASK_DELETE_FILE: + ids->caption_resource_id = IDS_DELETEITEM_CAPTION; + ids->text_resource_id = IDS_DELETEITEM_TEXT; + return TRUE; + case ASK_DELETE_FOLDER: + ids->caption_resource_id = IDS_DELETEFOLDER_CAPTION; + ids->text_resource_id = IDS_DELETEITEM_TEXT; + return TRUE; + case ASK_DELETE_MULTIPLE_ITEM: + ids->caption_resource_id = IDS_DELETEITEM_CAPTION; + ids->text_resource_id = IDS_DELETEMULTIPLE_TEXT; + return TRUE; + case ASK_OVERWRITE_FILE: + ids->caption_resource_id = IDS_OVERWRITEFILE_CAPTION; + ids->text_resource_id = IDS_OVERWRITEFILE_TEXT; + return TRUE; + default: + FIXME(" Unhandled nKindOfDialog %d stub\n", nKindOfDialog); + } + return FALSE; +} + +BOOL SHELL_ConfirmDialog(int nKindOfDialog, LPCSTR szDir) +{ + CHAR szCaption[255], szText[255], szBuffer[MAX_PATH + 256]; + SHELL_ConfirmIDstruc ids; + + if (!SHELL_ConfirmIDs(nKindOfDialog, &ids)) + return FALSE; + + LoadStringA(shell32_hInstance, ids.caption_resource_id, szCaption, sizeof(szCaption)); + LoadStringA(shell32_hInstance, ids.text_resource_id, szText, sizeof(szText)); + + FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, + szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir); + + return (IDOK == MessageBoxA(GetActiveWindow(), szBuffer, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION)); +} + +BOOL SHELL_ConfirmDialogW(int nKindOfDialog, LPCWSTR szDir) +{ + WCHAR szCaption[255], szText[255], szBuffer[MAX_PATH + 256]; + SHELL_ConfirmIDstruc ids; + + if (!SHELL_ConfirmIDs(nKindOfDialog, &ids)) + return FALSE; + + LoadStringW(shell32_hInstance, ids.caption_resource_id, szCaption, sizeof(szCaption)); + LoadStringW(shell32_hInstance, ids.text_resource_id, szText, sizeof(szText)); + + FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, + szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir); + + return (IDOK == MessageBoxW(GetActiveWindow(), szBuffer, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION)); +} + +static DWORD SHELL32_AnsiToUnicodeBuf(LPCSTR aPath, LPWSTR *wPath, DWORD minChars) +{ + DWORD len = MultiByteToWideChar(CP_ACP, 0, aPath, -1, NULL, 0); + + if (len < minChars) + len = minChars; + + *wPath = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (*wPath) + { + MultiByteToWideChar(CP_ACP, 0, aPath, -1, *wPath, len); + return NO_ERROR; + } + return E_OUTOFMEMORY; +} + +static void SHELL32_FreeUnicodeBuf(LPWSTR wPath) +{ + HeapFree(GetProcessHeap(), 0, wPath); +} + +/************************************************************************** + * SHELL_DeleteDirectory() [internal] + * + * Asks for confirmation when bShowUI is true and deletes the directory and + * all its subdirectories and files if necessary. + */ +BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir, BOOL bShowUI) +{ + LPWSTR wPath; + BOOL ret = FALSE; + + if (!SHELL32_AnsiToUnicodeBuf(pszDir, &wPath, 0)) + { + ret = SHELL_DeleteDirectoryW(wPath, bShowUI); + SHELL32_FreeUnicodeBuf(wPath); + } + return ret; +} + +static BOOL SHELL_DeleteDirectoryW(LPCWSTR pszDir, BOOL bShowUI) +{ + BOOL ret = TRUE; + HANDLE hFind; + WIN32_FIND_DATAW wfd; + WCHAR szTemp[MAX_PATH]; + + /* Make sure the directory exists before eventually prompting the user */ + PathCombineW(szTemp, pszDir, wWildcardFile); + hFind = FindFirstFileW(szTemp, &wfd); + if (hFind == INVALID_HANDLE_VALUE) + return FALSE; + + if (!bShowUI || (ret = SHELL_ConfirmDialogW(ASK_DELETE_FOLDER, pszDir))) + { + do + { + LPWSTR lp = wfd.cAlternateFileName; + if (!lp[0]) + lp = wfd.cFileName; + if (IsDotDir(lp)) + continue; + PathCombineW(szTemp, pszDir, lp); + if (FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes) + ret = SHELL_DeleteDirectoryW(szTemp, FALSE); + else + ret = (SHNotifyDeleteFileW(szTemp) == ERROR_SUCCESS); + } while (ret && FindNextFileW(hFind, &wfd)); + } + FindClose(hFind); + if (ret) + ret = (SHNotifyRemoveDirectoryW(pszDir) == ERROR_SUCCESS); + return ret; +} + +/************************************************************************** + * SHELL_DeleteFileA() [internal] + */ +BOOL SHELL_DeleteFileA(LPCSTR pszFile, BOOL bShowUI) +{ + if (bShowUI && !SHELL_ConfirmDialog(ASK_DELETE_FILE, pszFile)) + return FALSE; + + return (SHNotifyDeleteFileA(pszFile) == ERROR_SUCCESS); +} + +BOOL SHELL_DeleteFileW(LPCWSTR pszFile, BOOL bShowUI) +{ + if (bShowUI && !SHELL_ConfirmDialogW(ASK_DELETE_FILE, pszFile)) + return FALSE; + + return (SHNotifyDeleteFileW(pszFile) == ERROR_SUCCESS); +} + +/************************************************************************** + * Win32CreateDirectory [SHELL32.93] + * + * Creates a directory. Also triggers a change notify if one exists. + * + * PARAMS + * path [I] path to directory to create + * + * RETURNS + * TRUE if successful, FALSE otherwise + * + * NOTES: + * Verified on Win98 / IE 5 (SHELL32 4.72, March 1999 build) to be ANSI. + * This is Unicode on NT/2000 + */ +static DWORD SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec) +{ + LPWSTR wPath; + DWORD retCode; + + TRACE("(%s, %p)\n", debugstr_a(path), sec); + + retCode = SHELL32_AnsiToUnicodeBuf(path, &wPath, 0); + if (!retCode) + { + retCode = SHNotifyCreateDirectoryW(wPath, sec); + SHELL32_FreeUnicodeBuf(wPath); + } + return retCode; +} + +/**********************************************************************/ + +static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec) +{ + TRACE("(%s, %p)\n", debugstr_w(path), sec); + + if (CreateDirectoryW(path, sec)) + { + SHChangeNotify(SHCNE_MKDIR, SHCNF_PATHW, path, NULL); + return ERROR_SUCCESS; + } + return GetLastError(); +} + +/**********************************************************************/ + +BOOL WINAPI Win32CreateDirectoryAW(LPCVOID path, LPSECURITY_ATTRIBUTES sec) +{ + if (SHELL_OsIsUnicode()) + return (SHNotifyCreateDirectoryW(path, sec) == ERROR_SUCCESS); + return (SHNotifyCreateDirectoryA(path, sec) == ERROR_SUCCESS); +} + +/************************************************************************ + * Win32RemoveDirectory [SHELL32.94] + * + * Deletes a directory. Also triggers a change notify if one exists. + * + * PARAMS + * path [I] path to directory to delete + * + * RETURNS + * TRUE if successful, FALSE otherwise + * + * NOTES: + * Verified on Win98 / IE 5 (SHELL32 4.72, March 1999 build) to be ANSI. + * This is Unicode on NT/2000 + */ +static DWORD SHNotifyRemoveDirectoryA(LPCSTR path) +{ + LPWSTR wPath; + DWORD retCode; + + TRACE("(%s)\n", debugstr_a(path)); + + retCode = SHELL32_AnsiToUnicodeBuf(path, &wPath, 0); + if (!retCode) + { + retCode = SHNotifyRemoveDirectoryW(wPath); + SHELL32_FreeUnicodeBuf(wPath); + } + return retCode; +} + +/***********************************************************************/ + +static DWORD SHNotifyRemoveDirectoryW(LPCWSTR path) +{ + BOOL ret; + TRACE("(%s)\n", debugstr_w(path)); + + ret = RemoveDirectoryW(path); + if (!ret) + { + /* Directory may be write protected */ + DWORD dwAttr = GetFileAttributesW(path); + if (IsAttrib(dwAttr, FILE_ATTRIBUTE_READONLY)) + if (SetFileAttributesW(path, dwAttr & ~FILE_ATTRIBUTE_READONLY)) + ret = RemoveDirectoryW(path); + } + if (ret) + { + SHChangeNotify(SHCNE_RMDIR, SHCNF_PATHW, path, NULL); + return ERROR_SUCCESS; + } + return GetLastError(); +} + +/***********************************************************************/ + +BOOL WINAPI Win32RemoveDirectoryAW(LPCVOID path) +{ + if (SHELL_OsIsUnicode()) + return (SHNotifyRemoveDirectoryW(path) == ERROR_SUCCESS); + return (SHNotifyRemoveDirectoryA(path) == ERROR_SUCCESS); +} + +/************************************************************************ + * Win32DeleteFile [SHELL32.164] + * + * Deletes a file. Also triggers a change notify if one exists. + * + * PARAMS + * path [I] path to file to delete + * + * RETURNS + * TRUE if successful, FALSE otherwise + * + * NOTES: + * Verified on Win98 / IE 5 (SHELL32 4.72, March 1999 build) to be ANSI. + * This is Unicode on NT/2000 + */ +static DWORD SHNotifyDeleteFileA(LPCSTR path) +{ + LPWSTR wPath; + DWORD retCode; + + TRACE("(%s)\n", debugstr_a(path)); + + retCode = SHELL32_AnsiToUnicodeBuf(path, &wPath, 0); + if (!retCode) + { + retCode = SHNotifyDeleteFileW(wPath); + SHELL32_FreeUnicodeBuf(wPath); + } + return retCode; +} + +/***********************************************************************/ + +static DWORD SHNotifyDeleteFileW(LPCWSTR path) +{ + BOOL ret; + + TRACE("(%s)\n", debugstr_w(path)); + + ret = DeleteFileW(path); + if (!ret) + { + /* File may be write protected or a system file */ + DWORD dwAttr = GetFileAttributesW(path); + if (IsAttrib(dwAttr, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)) + if (SetFileAttributesW(path, dwAttr & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) + ret = DeleteFileW(path); + } + if (ret) + { + SHChangeNotify(SHCNE_DELETE, SHCNF_PATHW, path, NULL); + return ERROR_SUCCESS; + } + return GetLastError(); +} + +/***********************************************************************/ + +DWORD WINAPI Win32DeleteFileAW(LPCVOID path) +{ + if (SHELL_OsIsUnicode()) + return (SHNotifyDeleteFileW(path) == ERROR_SUCCESS); + return (SHNotifyDeleteFileA(path) == ERROR_SUCCESS); +} + +/************************************************************************ + * SHNotifyMoveFile [internal] + * + * Moves a file. Also triggers a change notify if one exists. + * + * PARAMS + * src [I] path to source file to move + * dest [I] path to target file to move to + * + * RETURNS + * ERORR_SUCCESS if successful + */ +static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest) +{ + BOOL ret; + + TRACE("(%s %s)\n", debugstr_w(src), debugstr_w(dest)); + + ret = MoveFileW(src, dest); + if (!ret) + { + DWORD dwAttr; + + dwAttr = SHFindAttrW(dest, FALSE); + if (INVALID_FILE_ATTRIBUTES == dwAttr) + { + /* Source file may be write protected or a system file */ + dwAttr = GetFileAttributesW(src); + if (IsAttrib(dwAttr, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)) + if (SetFileAttributesW(src, dwAttr & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) + ret = MoveFileW(src, dest); + } + } + if (ret) + { + SHChangeNotify(SHCNE_RENAMEITEM, SHCNF_PATHW, src, dest); + return ERROR_SUCCESS; + } + return GetLastError(); +} + +/************************************************************************ + * SHNotifyCopyFile [internal] + * + * Copies a file. Also triggers a change notify if one exists. + * + * PARAMS + * src [I] path to source file to move + * dest [I] path to target file to move to + * bFailIfExists [I] if TRUE, the target file will not be overwritten if + * a file with this name already exists + * + * RETURNS + * ERROR_SUCCESS if successful + */ +static DWORD SHNotifyCopyFileW(LPCWSTR src, LPCWSTR dest, BOOL bFailIfExists) +{ + BOOL ret; + + TRACE("(%s %s %s)\n", debugstr_w(src), debugstr_w(dest), bFailIfExists ? "failIfExists" : ""); + + ret = CopyFileW(src, dest, bFailIfExists); + if (ret) + { + SHChangeNotify(SHCNE_CREATE, SHCNF_PATHW, dest, NULL); + return ERROR_SUCCESS; + } + return GetLastError(); +} + +/************************************************************************* + * SHCreateDirectory [SHELL32.165] + * + * This function creates a file system folder whose fully qualified path is + * given by path. If one or more of the intermediate folders do not exist, + * they will be created as well. + * + * PARAMS + * hWnd [I] + * path [I] path of directory to create + * + * RETURNS + * ERRROR_SUCCESS or one of the following values: + * ERROR_BAD_PATHNAME if the path is relative + * ERROR_FILE_EXISTS when a file with that name exists + * ERROR_PATH_NOT_FOUND can't find the path, probably invalid + * ERROR_INVLID_NAME if the path contains invalid chars + * ERROR_ALREADY_EXISTS when the directory already exists + * ERROR_FILENAME_EXCED_RANGE if the filename was to long to process + * + * NOTES + * exported by ordinal + * Win9x exports ANSI + * WinNT/2000 exports Unicode + */ +DWORD WINAPI SHCreateDirectory(HWND hWnd, LPCVOID path) +{ + if (SHELL_OsIsUnicode()) + return SHCreateDirectoryExW(hWnd, path, NULL); + return SHCreateDirectoryExA(hWnd, path, NULL); +} + +/************************************************************************* + * SHCreateDirectoryExA [SHELL32.@] + * + * This function creates a file system folder whose fully qualified path is + * given by path. If one or more of the intermediate folders do not exist, + * they will be created as well. + * + * PARAMS + * hWnd [I] + * path [I] path of directory to create + * sec [I] security attributes to use or NULL + * + * RETURNS + * ERRROR_SUCCESS or one of the following values: + * ERROR_BAD_PATHNAME or ERROR_PATH_NOT_FOUND if the path is relative + * ERROR_INVLID_NAME if the path contains invalid chars + * ERROR_FILE_EXISTS when a file with that name exists + * ERROR_ALREADY_EXISTS when the directory already exists + * ERROR_FILENAME_EXCED_RANGE if the filename was to long to process + * + * FIXME: Not implemented yet; + * SHCreateDirectoryEx also verifies that the files in the directory will be visible + * if the path is a network path to deal with network drivers which might have a limited + * but unknown maximum path length. If not: + * + * If hWnd is set to a valid window handle, a message box is displayed warning + * the user that the files may not be accessible. If the user chooses not to + * proceed, the function returns ERROR_CANCELLED. + * + * If hWnd is set to NULL, no user interface is displayed and the function + * returns ERROR_CANCELLED. + */ +int WINAPI SHCreateDirectoryExA(HWND hWnd, LPCSTR path, LPSECURITY_ATTRIBUTES sec) +{ + LPWSTR wPath; + DWORD retCode; + + TRACE("(%s, %p)\n", debugstr_a(path), sec); + + retCode = SHELL32_AnsiToUnicodeBuf(path, &wPath, 0); + if (!retCode) + { + retCode = SHCreateDirectoryExW(hWnd, wPath, sec); + SHELL32_FreeUnicodeBuf(wPath); + } + return retCode; +} + +/************************************************************************* + * SHCreateDirectoryExW [SHELL32.@] + */ +int WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES sec) +{ + int ret = ERROR_BAD_PATHNAME; + TRACE("(%p, %s, %p)\n", hWnd, debugstr_w(path), sec); + + if (PathIsRelativeW(path)) + { + SetLastError(ret); + } + else + { + ret = SHNotifyCreateDirectoryW(path, sec); + /* Refuse to work on certain error codes before trying to create directories recursively */ + if (ret != ERROR_FILE_EXISTS && + ret != ERROR_ALREADY_EXISTS && + ret != ERROR_FILENAME_EXCED_RANGE) + { + WCHAR *pEnd, *pSlash, szTemp[MAX_PATH + 1]; /* extra for PathAddBackslash() */ + + lstrcpynW(szTemp, path, MAX_PATH); + pEnd = PathAddBackslashW(szTemp); + pSlash = szTemp + 3; + + while (*pSlash) + { + while (*pSlash && *pSlash != '\\') + pSlash = CharNextW(pSlash); + + if (*pSlash) + { + *pSlash = 0; /* terminate path at separator */ + + ret = SHNotifyCreateDirectoryW(szTemp, pSlash + 1 == pEnd ? sec : NULL); + } + *pSlash++ = '\\'; /* put the separator back */ + } + } + + if (ret && hWnd && (ERROR_CANCELLED != ret)) + { + /* We failed and should show a dialog box */ + FIXME("Show system error message, creating path %s, failed with error %d\n", debugstr_w(path), ret); + ret = ERROR_CANCELLED; /* Error has been already presented to user (not really yet!) */ + } + } + return ret; +} + + +/************************************************************************* + * SHFindAttrW [internal] + * + * Get the Attributes for a file or directory. The difference to GetAttributes() + * is that this function will also work for paths containing wildcard characters + * in its filename. + + * PARAMS + * path [I] path of directory or file to check + * fileOnly [I] TRUE if only files should be found + * + * RETURNS + * INVALID_FILE_ATTRIBUTES if the path does not exist, the actual attributes of + * the first file or directory found otherwise + */ +static DWORD SHFindAttrW(LPCWSTR pName, BOOL fileOnly) +{ + WIN32_FIND_DATAW wfd; + BOOL b_FileMask = fileOnly && (NULL != StrPBrkW(pName, wWildcardChars)); + DWORD dwAttr = INVALID_FILE_ATTRIBUTES; + HANDLE hFind = FindFirstFileW(pName, &wfd); + + TRACE("%s %d\n", debugstr_w(pName), fileOnly); + if (INVALID_HANDLE_VALUE != hFind) + { + do + { + if (b_FileMask && IsAttribDir(wfd.dwFileAttributes)) + continue; + dwAttr = wfd.dwFileAttributes; + break; + } + while (FindNextFileW(hFind, &wfd)); + FindClose(hFind); + } + return dwAttr; +} + +/************************************************************************* + * + * SHFileStrICmp HelperFunction for SHFileOperationW + * + */ +BOOL SHFileStrICmpW(LPWSTR p1, LPWSTR p2, LPWSTR p1End, LPWSTR p2End) +{ + WCHAR C1 = '\0'; + WCHAR C2 = '\0'; + int i_Temp = -1; + int i_len1 = lstrlenW(p1); + int i_len2 = lstrlenW(p2); + + if (p1End && (&p1[i_len1] >= p1End) && ('\\' == p1End[0])) + { + C1 = p1End[0]; + p1End[0] = '\0'; + i_len1 = lstrlenW(p1); + } + if (p2End) + { + if ((&p2[i_len2] >= p2End) && ('\\' == p2End[0])) + { + C2 = p2End[0]; + if (C2) + p2End[0] = '\0'; + } + } + else + { + if ((i_len1 <= i_len2) && ('\\' == p2[i_len1])) + { + C2 = p2[i_len1]; + if (C2) + p2[i_len1] = '\0'; + } + } + i_len2 = lstrlenW(p2); + if (i_len1 == i_len2) + i_Temp = lstrcmpiW(p1,p2); + if (C1) + p1[i_len1] = C1; + if (C2) + p2[i_len2] = C2; + return !(i_Temp); +} + +/************************************************************************* + * + * SHFileStrCpyCat HelperFunction for SHFileOperationW + * + */ +LPWSTR SHFileStrCpyCatW(LPWSTR pTo, LPCWSTR pFrom, LPCWSTR pCatStr) +{ + LPWSTR pToFile = NULL; + int i_len; + if (pTo) + { + if (pFrom) + lstrcpyW(pTo, pFrom); + if (pCatStr) + { + i_len = lstrlenW(pTo); + if ((i_len) && (pTo[--i_len] != '\\')) + i_len++; + pTo[i_len] = '\\'; + if (pCatStr[0] == '\\') + pCatStr++; \ + lstrcpyW(&pTo[i_len+1], pCatStr); + } + pToFile = StrRChrW(pTo,NULL,'\\'); + /* termination of the new string-group */ + pTo[(lstrlenW(pTo)) + 1] = '\0'; + } + return pToFile; +} + +/************************************************************************** + * SHELL_FileNamesMatch() + * + * Accepts two \0 delimited lists of the file names. Checks whether number of + * files in both lists is the same, and checks also if source-name exists. + */ +BOOL SHELL_FileNamesMatch(LPCWSTR pszFiles1, LPCWSTR pszFiles2, BOOL bOnlySrc) +{ + while ((pszFiles1[0] != '\0') && + (bOnlySrc || (pszFiles2[0] != '\0'))) + { + if (NULL == StrPBrkW(pszFiles1, wWildcardChars)) + { + if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(pszFiles1)) + return FALSE; + } + pszFiles1 += lstrlenW(pszFiles1) + 1; + if (!bOnlySrc) + pszFiles2 += lstrlenW(pszFiles2) + 1; + } + return ((pszFiles1[0] == '\0') && (bOnlySrc || (pszFiles2[0] == '\0'))); +} + +/************************************************************************* + * + * SHNameTranslate HelperFunction for SHFileOperationA + * + * Translates a list of 0 terminated ASCII strings into Unicode. If *wString + * is NULL, only the necessary size of the string is determined and returned, + * otherwise the ASCII strings are copied into it and the buffer is increased + * to point to the location after the final 0 termination char. + */ +DWORD SHNameTranslate(LPWSTR* wString, LPCWSTR* pWToFrom, BOOL more) +{ + DWORD size = 0, aSize = 0; + LPCSTR aString = (LPCSTR)*pWToFrom; + + if (aString) + { + do + { + size = lstrlenA(aString) + 1; + aSize += size; + aString += size; + } while ((size != 1) && more); + /* The two sizes might be different in the case of multibyte chars */ + size = MultiByteToWideChar(CP_ACP, 0, aString, aSize, *wString, 0); + if (*wString) /* only in the second loop */ + { + MultiByteToWideChar(CP_ACP, 0, (LPCSTR)*pWToFrom, aSize, *wString, size); + *pWToFrom = *wString; + *wString += size; + } + } + return size; +} +/************************************************************************* + * SHFileOperationA [SHELL32.@] + * + * Function to copy, move, delete and create one or more files with optional + * user prompts. + * + * PARAMS + * lpFileOp [I/O] pointer to a structure containing all the necessary information + * + * NOTES + * exported by name + */ +int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp) +{ + SHFILEOPSTRUCTW nFileOp = *((LPSHFILEOPSTRUCTW)lpFileOp); + int retCode = 0; + DWORD size; + LPWSTR ForFree = NULL, /* we change wString in SHNameTranslate and can't use it for freeing */ + wString = NULL; /* we change this in SHNameTranslate */ + + TRACE("\n"); + if (FO_DELETE == (nFileOp.wFunc & FO_MASK)) + nFileOp.pTo = NULL; /* we need a NULL or a valid pointer for translation */ + if (!(nFileOp.fFlags & FOF_SIMPLEPROGRESS)) + nFileOp.lpszProgressTitle = NULL; /* we need a NULL or a valid pointer for translation */ + while (1) /* every loop calculate size, second translate also, if we have storage for this */ + { + size = SHNameTranslate(&wString, &nFileOp.lpszProgressTitle, FALSE); /* no loop */ + size += SHNameTranslate(&wString, &nFileOp.pFrom, TRUE); /* internal loop */ + size += SHNameTranslate(&wString, &nFileOp.pTo, TRUE); /* internal loop */ + + if (ForFree) + { + retCode = SHFileOperationW(&nFileOp); + HeapFree(GetProcessHeap(), 0, ForFree); /* we can not use wString, it was changed */ + break; + } + else + { + wString = ForFree = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); + if (ForFree) continue; + retCode = ERROR_OUTOFMEMORY; + nFileOp.fAnyOperationsAborted = TRUE; + SetLastError(retCode); + return retCode; + } + } + + lpFileOp->hNameMappings = nFileOp.hNameMappings; + lpFileOp->fAnyOperationsAborted = nFileOp.fAnyOperationsAborted; + return retCode; +} + +static const char * debug_shfileops_flags( DWORD fFlags ) +{ + return wine_dbg_sprintf( "%s%s%s%s%s%s%s%s%s%s%s%s%s", + fFlags & FOF_MULTIDESTFILES ? "FOF_MULTIDESTFILES " : "", + fFlags & FOF_CONFIRMMOUSE ? "FOF_CONFIRMMOUSE " : "", + fFlags & FOF_SILENT ? "FOF_SILENT " : "", + fFlags & FOF_RENAMEONCOLLISION ? "FOF_RENAMEONCOLLISION " : "", + fFlags & FOF_NOCONFIRMATION ? "FOF_NOCONFIRMATION " : "", + fFlags & FOF_WANTMAPPINGHANDLE ? "FOF_WANTMAPPINGHANDLE " : "", + fFlags & FOF_ALLOWUNDO ? "FOF_ALLOWUNDO " : "", + fFlags & FOF_FILESONLY ? "FOF_FILESONLY " : "", + fFlags & FOF_SIMPLEPROGRESS ? "FOF_SIMPLEPROGRESS " : "", + fFlags & FOF_NOCONFIRMMKDIR ? "FOF_NOCONFIRMMKDIR " : "", + fFlags & FOF_NOERRORUI ? "FOF_NOERRORUI " : "", + fFlags & FOF_NOCOPYSECURITYATTRIBS ? "FOF_NOCOPYSECURITYATTRIBS" : "", + fFlags & 0xf000 ? "MORE-UNKNOWN-Flags" : ""); +} + +static const char * debug_shfileops_action( DWORD op ) +{ + LPCSTR cFO_Name [] = {"FO_????","FO_MOVE","FO_COPY","FO_DELETE","FO_RENAME"}; + return wine_dbg_sprintf("%s", cFO_Name[ op ]); +} + +#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026 +#define HIGH_ADR (LPWSTR)0xffffffff + +/************************************************************************* + * SHFileOperationW [SHELL32.@] + * + * See SHFileOperationA + */ +int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp) +{ + SHFILEOPSTRUCTW nFileOp = *(lpFileOp); + + LPCWSTR pNextFrom = nFileOp.pFrom; + LPCWSTR pNextTo = nFileOp.pTo; + LPCWSTR pFrom = pNextFrom; + LPCWSTR pTo = NULL; + HANDLE hFind = INVALID_HANDLE_VALUE; + WIN32_FIND_DATAW wfd; + LPWSTR pTempFrom = NULL; + LPWSTR pTempTo = NULL; + LPWSTR pFromFile; + LPWSTR pToFile = NULL; + LPWSTR lpFileName; + int retCode = 0; + DWORD ToAttr; + DWORD ToPathAttr; + DWORD FromPathAttr; + FILEOP_FLAGS OFl = ((FILEOP_FLAGS)lpFileOp->fFlags & 0xfff); + + BOOL b_Multi = (nFileOp.fFlags & FOF_MULTIDESTFILES); + + BOOL b_MultiTo = (FO_DELETE != (lpFileOp->wFunc & FO_MASK)); + BOOL b_MultiPaired = (!b_MultiTo); + BOOL b_MultiFrom = FALSE; + BOOL not_overwrite; + BOOL ask_overwrite; + BOOL b_SameRoot; + BOOL b_SameTailName; + BOOL b_ToInvalidTail = FALSE; + BOOL b_ToValid; /* for W98-Bug for FO_MOVE with source and target in same rootdrive */ + BOOL b_Mask; + BOOL b_ToTailSlash = FALSE; + + long FuncSwitch = (nFileOp.wFunc & FO_MASK); + long level= nFileOp.wFunc>>4; + + /* default no error */ + nFileOp.fAnyOperationsAborted = FALSE; + + if ((FuncSwitch < FO_MOVE) || (FuncSwitch > FO_RENAME)) + goto shfileop_end; /* no valid FunctionCode */ + + if (level == 0) + TRACE("%s: flags (0x%04x) : %s\n", + debug_shfileops_action(FuncSwitch), nFileOp.fFlags, + debug_shfileops_flags(nFileOp.fFlags) ); + + /* establish when pTo is interpreted as the name of the destination file + * or the directory where the Fromfile should be copied to. + * This depends on: + * (1) pTo points to the name of an existing directory; + * (2) the flag FOF_MULTIDESTFILES is present; + * (3) whether pFrom point to multiple filenames. + * + * Some experiments: + * + * destisdir 1 1 1 1 0 0 0 0 + * FOF_MULTIDESTFILES 1 1 0 0 1 1 0 0 + * multiple from filenames 1 0 1 0 1 0 1 0 + * --------------- + * copy files to dir 1 0 1 1 0 0 1 0 + * create dir 0 0 0 0 0 0 1 0 + */ + + /* + * Summary of flags: + * + * implemented flags: + * FOF_MULTIDESTFILES, FOF_NOCONFIRMATION, FOF_FILESONLY + * + * unimplememented and ignored flags: + * FOF_CONFIRMMOUSE, FOF_SILENT, FOF_NOCONFIRMMKDIR, + * FOF_SIMPLEPROGRESS, FOF_NOCOPYSECURITYATTRIBS + * + * partially implemented, breaks if file exists: + * FOF_RENAMEONCOLLISION + * + * unimplemented and break if any other flag set: + * FOF_ALLOWUNDO, FOF_WANTMAPPINGHANDLE + */ + + TRACE("%s level=%ld nFileOp.fFlags=0x%x\n", + debug_shfileops_action(FuncSwitch), level, lpFileOp->fFlags); + + /* OFl &= (-1 - (FOF_MULTIDESTFILES | FOF_FILESONLY)); */ + /* OFl ^= (FOF_SILENT | FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOCONFIRMMKDIR); */ + OFl &= (~(FOF_MULTIDESTFILES | FOF_NOCONFIRMATION | FOF_FILESONLY)); /* implemented */ + OFl ^= (FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS); /* ignored, if one */ + OFl &= (~FOF_SIMPLEPROGRESS); /* ignored, only with FOF_SILENT */ + if (OFl) + { + if (OFl & (~(FOF_CONFIRMMOUSE | FOF_SILENT | FOF_RENAMEONCOLLISION | + FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS))) + { + TRACE("%s level=%ld lpFileOp->fFlags=0x%x not implemented, Aborted=TRUE, stub\n", + debug_shfileops_action(FuncSwitch), level, OFl); + retCode = 0x403; /* 1027, we need an extension to shlfileop */ + goto shfileop_end; + } + else + { + TRACE("%s level=%ld lpFileOp->fFlags=0x%x not fully implemented, stub\n", + debug_shfileops_action(FuncSwitch), level, OFl); + } + } + + if ((pNextFrom) && (!(b_MultiTo) || (pNextTo))) + { + nFileOp.pFrom = pTempFrom = HeapAlloc(GetProcessHeap(), 0, ((1 + 2 * (b_MultiTo)) * MAX_PATH + 6) * sizeof(WCHAR)); + if (!pTempFrom) + { + retCode = ERROR_OUTOFMEMORY; + SetLastError(retCode); + goto shfileop_end; + } + if (b_MultiTo) + pTempTo = &pTempFrom[MAX_PATH + 4]; + nFileOp.pTo = pTempTo; + ask_overwrite = (!(nFileOp.fFlags & FOF_NOCONFIRMATION) && !(nFileOp.fFlags & FOF_RENAMEONCOLLISION)); + not_overwrite = (!(nFileOp.fFlags & FOF_NOCONFIRMATION) || (nFileOp.fFlags & FOF_RENAMEONCOLLISION)); + } + else + { + retCode = ERROR_SHELL_INTERNAL_FILE_NOT_FOUND; + goto shfileop_end; + } + /* need break at error before change sourcepointer */ + while(!nFileOp.fAnyOperationsAborted && (pNextFrom[0])) + { + nFileOp.wFunc = ((level + 1) << 4) + FuncSwitch; + nFileOp.fFlags = lpFileOp->fFlags; + + if (b_MultiTo) + { + pTo = pNextTo; + pNextTo = &pNextTo[lstrlenW(pTo)+1]; + b_MultiTo = (b_Multi && pNextTo[0]); + } + + pFrom = pNextFrom; + pNextFrom = &pNextFrom[lstrlenW(pNextFrom)+1]; + if (!b_MultiFrom && !b_MultiTo) + b_MultiFrom = (pNextFrom[0]); + + pFromFile = SHFileStrCpyCatW(pTempFrom, pFrom, NULL); + + if (pTo) + { + pToFile = SHFileStrCpyCatW(pTempTo, pTo, NULL); + } + if (!b_MultiPaired) + { + b_MultiPaired = + SHELL_FileNamesMatch(lpFileOp->pFrom, lpFileOp->pTo, (!b_Multi || b_MultiFrom)); + } + if (!(b_MultiPaired) || !(pFromFile) || !(pFromFile[1]) || ((pTo) && !(pToFile))) + { + retCode = ERROR_SHELL_INTERNAL_FILE_NOT_FOUND; + goto shfileop_end; + } + if (pTo) + { + b_ToTailSlash = (!pToFile[1]); + if (b_ToTailSlash) + { + pToFile[0] = '\0'; + if (StrChrW(pTempTo,'\\')) + { + pToFile = SHFileStrCpyCatW(pTempTo, NULL, NULL); + } + } + b_ToInvalidTail = (NULL != StrPBrkW(&pToFile[1], wWildcardChars)); + } + + /* for all */ + b_Mask = (NULL != StrPBrkW(&pFromFile[1], wWildcardChars)); + if (FO_RENAME == FuncSwitch) + { + /* temporary only for FO_RENAME */ + if (b_MultiTo || b_MultiFrom || (b_Mask && !b_ToInvalidTail)) + { +#ifndef W98_FO_FUNCTION + retCode = ERROR_GEN_FAILURE; /* W2K ERROR_GEN_FAILURE, W98 returns no error */ +#endif + goto shfileop_end; + } + } + + hFind = FindFirstFileW(pFrom, &wfd); + if (INVALID_HANDLE_VALUE == hFind) + { + if ((FO_DELETE == FuncSwitch) && (b_Mask)) + { + pFromFile[0] = '\0'; + FromPathAttr = GetFileAttributesW(pTempFrom); + pFromFile[0] = '\\'; + if (IsAttribDir(FromPathAttr)) + { + /* FO_DELETE with mask and without found is valid */ + goto shfileop_end; + } + } + /* root (without mask) is also not allowed as source, tested in W98 */ + retCode = ERROR_SHELL_INTERNAL_FILE_NOT_FOUND; + goto shfileop_end; + } + + /* for all */ + + /* ??? b_Mask = (!SHFileStrICmpA(&pFromFile[1], &wfd.cFileName[0], HIGH_ADR, HIGH_ADR)); */ + if (!pTo) /* FO_DELETE */ + { + do + { + lpFileName = wfd.cAlternateFileName; + if (!lpFileName[0]) + lpFileName = wfd.cFileName; + if (IsDotDir(lpFileName) || + ((b_Mask) && IsAttribDir(wfd.dwFileAttributes) && (nFileOp.fFlags & FOF_FILESONLY))) + continue; + SHFileStrCpyCatW(&pFromFile[1], lpFileName, NULL); + /* TODO: Check the SHELL_DeleteFileOrDirectoryW() function in shell32.dll */ + if (IsAttribFile(wfd.dwFileAttributes)) + { + if(SHNotifyDeleteFileW(pTempFrom) != ERROR_SUCCESS) + { + nFileOp.fAnyOperationsAborted = TRUE; + retCode = 0x78; /* value unknown */ + } + } + else + { + if(!SHELL_DeleteDirectoryW(pTempFrom, (!(nFileOp.fFlags & FOF_NOCONFIRMATION)))) + { + nFileOp.fAnyOperationsAborted = TRUE; + retCode = 0x79; /* value unknown */ + } + } + } while (!nFileOp.fAnyOperationsAborted && FindNextFileW(hFind, &wfd)); + FindClose(hFind); + hFind = INVALID_HANDLE_VALUE; + if (nFileOp.fAnyOperationsAborted) + goto shfileop_end; + continue; + } /* FO_DELETE ends, pTo must be always valid from here */ + + b_SameRoot = (toupperW(pTempFrom[0]) == toupperW(pTempTo[0])); + b_SameTailName = SHFileStrICmpW(pToFile, pFromFile, NULL, NULL); + + ToPathAttr = ToAttr = GetFileAttributesW(pTempTo); + if (!b_Mask && (ToAttr == INVALID_FILE_ATTRIBUTES) && (pToFile)) + { + pToFile[0] = '\0'; + ToPathAttr = GetFileAttributesW(pTempTo); + pToFile[0] = '\\'; + } + + if (FO_RENAME == FuncSwitch) + { + if (!b_SameRoot || b_Mask /* FO_RENAME works not with Mask */ + || !SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, NULL) + || (SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, HIGH_ADR) && !b_ToTailSlash)) + { + retCode = 0x73; + goto shfileop_end; + } + if (b_ToInvalidTail) + { + retCode=0x2; + goto shfileop_end; + } + if (INVALID_FILE_ATTRIBUTES == ToPathAttr) + { + retCode = 0x75; + goto shfileop_end; + } + if (IsAttribDir(wfd.dwFileAttributes) && IsAttribDir(ToAttr)) + { + retCode = (b_ToTailSlash) ? 0xb7 : 0x7b; + goto shfileop_end; + } + /* we use SHNotifyMoveFile() instead MoveFileW */ + if (SHNotifyMoveFileW(pTempFrom, pTempTo) != ERROR_SUCCESS) + { + /* we need still the value for the returncode, we use the mostly assumed */ + retCode = 0xb7; + goto shfileop_end; + } + goto shfileop_end; + } + + /* W98 Bug with FO_MOVE different from FO_COPY, better the same as FO_COPY */ + b_ToValid = ((b_SameTailName && b_SameRoot && (FO_COPY == FuncSwitch)) || + (b_SameTailName && !b_SameRoot) || (b_ToInvalidTail)); + + /* handle mask in source */ + if (b_Mask) + { + if (!IsAttribDir(ToAttr)) + { + retCode = (b_ToInvalidTail &&/* b_SameTailName &&*/ (FO_MOVE == FuncSwitch)) \ + ? 0x2 : 0x75; + goto shfileop_end; + } + pToFile = SHFileStrCpyCatW(pTempTo, NULL, wBackslash); + nFileOp.fFlags = (nFileOp.fFlags | FOF_MULTIDESTFILES); + do + { + lpFileName = wfd.cAlternateFileName; + if (!lpFileName[0]) + lpFileName = wfd.cFileName; + if (IsDotDir(lpFileName) || + (IsAttribDir(wfd.dwFileAttributes) && (nFileOp.fFlags & FOF_FILESONLY))) + continue; /* next name in pTempFrom(dir) */ + SHFileStrCpyCatW(&pToFile[1], lpFileName, NULL); + SHFileStrCpyCatW(&pFromFile[1], lpFileName, NULL); + retCode = SHFileOperationW (&nFileOp); + } while(!nFileOp.fAnyOperationsAborted && FindNextFileW(hFind, &wfd)); + } + FindClose(hFind); + hFind = INVALID_HANDLE_VALUE; + /* FO_COPY/FO_MOVE with mask, FO_DELETE and FO_RENAME are solved */ + if (b_Mask) + continue; + + /* only FO_COPY/FO_MOVE without mask, all others are (must be) solved */ + if (IsAttribDir(wfd.dwFileAttributes) && (ToAttr == INVALID_FILE_ATTRIBUTES)) + { + if (pToFile) + { + pToFile[0] = '\0'; + ToPathAttr = GetFileAttributesW(pTempTo); + if ((ToPathAttr == INVALID_FILE_ATTRIBUTES) && b_ToValid) + { + /* create dir must be here, sample target D:\y\ *.* create with RC=10003 */ + if (SHNotifyCreateDirectoryW(pTempTo, NULL)) + { + retCode = 0x73;/* value unknown */ + goto shfileop_end; + } + ToPathAttr = GetFileAttributesW(pTempTo); + } + pToFile[0] = '\\'; + if (b_ToInvalidTail) + { + retCode = 0x10003; + goto shfileop_end; + } + } + } + + /* trailing BackSlash is ever removed and pToFile points to BackSlash before */ + if (!b_MultiTo && (b_MultiFrom || (!(b_Multi) && IsAttribDir(ToAttr)))) + { + if ((FO_MOVE == FuncSwitch) && IsAttribDir(ToAttr) && IsAttribDir(wfd.dwFileAttributes)) + { + if (b_Multi) + { + retCode = 0x73; /* !b_Multi = 0x8 ?? */ + goto shfileop_end; + } + } + pToFile = SHFileStrCpyCatW(pTempTo, NULL, wfd.cFileName); + ToAttr = GetFileAttributesW(pTempTo); + } + + if (IsAttribDir(ToAttr)) + { + if (IsAttribFile(wfd.dwFileAttributes)) + { + retCode = (FO_COPY == FuncSwitch) ? 0x75 : 0xb7; + goto shfileop_end; + } + } + else + { + pToFile[0] = '\0'; + ToPathAttr = GetFileAttributesW(pTempTo); + pToFile[0] = '\\'; + if (IsAttribFile(ToPathAttr)) + { + /* error, is this tested ? */ + retCode = 0x777402; + goto shfileop_end; + } + } + + /* singlesource + no mask */ + if (INVALID_FILE_ATTRIBUTES == (ToAttr & ToPathAttr)) + { + /* Target-dir does not exist, and cannot be created */ + retCode=0x75; + goto shfileop_end; + } + + switch(FuncSwitch) + { + case FO_MOVE: + pToFile = NULL; + if ((ToAttr == INVALID_FILE_ATTRIBUTES) && SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, NULL)) + { + nFileOp.wFunc = ((level+1)<<4) + FO_RENAME; + } + else + { + if (b_SameRoot && IsAttribDir(ToAttr) && IsAttribDir(wfd.dwFileAttributes)) + { + /* we need pToFile for FO_DELETE after FO_MOVE contence */ + pToFile = SHFileStrCpyCatW(pTempFrom, NULL, wWildcardFile); + } + else + { + nFileOp.wFunc = ((level+1)<<4) + FO_COPY; + } + } + retCode = SHFileOperationW(&nFileOp); + if (pToFile) + ((DWORD*)pToFile)[0] = '\0'; + if (!nFileOp.fAnyOperationsAborted && (FO_RENAME != (nFileOp.wFunc & 0xf))) + { + nFileOp.wFunc = ((level+1)<<4) + FO_DELETE; + retCode = SHFileOperationW(&nFileOp); + } + continue; + case FO_COPY: + if (SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL)) + { /* target is the same as source ? */ + /* we still need the value for the returncode, we assume 0x71 */ + retCode = 0x71; + goto shfileop_end; + } + if (IsAttribDir((ToAttr & wfd.dwFileAttributes))) + { + if (IsAttribDir(ToAttr) || !SHNotifyCreateDirectoryW(pTempTo, NULL)) + { + /* ??? nFileOp.fFlags = (nFileOp.fFlags | FOF_MULTIDESTFILES); */ + SHFileStrCpyCatW(pTempFrom, NULL, wWildcardFile); + retCode = SHFileOperationW(&nFileOp); + } + else + { + retCode = 0x750;/* value unknown */ + goto shfileop_end; + } + } + else + { + if (!(ask_overwrite && SHELL_ConfirmDialogW(ASK_OVERWRITE_FILE, pTempTo)) + && (not_overwrite)) + { + /* we still need the value for the returncode, we use the mostly assumed */ + retCode = 0x73; + goto shfileop_end; + } + if (SHNotifyCopyFileW(pTempFrom, pTempTo, TRUE) != ERROR_SUCCESS) + { + retCode = 0x77; /* value unknown */ + goto shfileop_end; + } + } + } + } + +shfileop_end: + if (hFind != INVALID_HANDLE_VALUE) + FindClose(hFind); + hFind = INVALID_HANDLE_VALUE; + if (pTempFrom) + HeapFree(GetProcessHeap(), 0, pTempFrom); + if (retCode) + nFileOp.fAnyOperationsAborted = TRUE; + TRACE("%s level=%ld AnyOpsAborted=%s ret=0x%x, with %s %s%s\n", + debug_shfileops_action(FuncSwitch), level, + nFileOp.fAnyOperationsAborted ? "TRUE":"FALSE", + retCode, debugstr_w(pFrom), pTo ? "-> ":"", debugstr_w(pTo)); + + lpFileOp->fAnyOperationsAborted = nFileOp.fAnyOperationsAborted; + return retCode; +} + +/************************************************************************* + * SHFileOperation [SHELL32.@] + * + */ +DWORD WINAPI SHFileOperationAW(LPVOID lpFileOp) +{ + if (SHELL_OsIsUnicode()) + return SHFileOperationW(lpFileOp); + return SHFileOperationA(lpFileOp); +} + +#define SHDSA_GetItemCount(hdsa) (*(int*)(hdsa)) + +/************************************************************************* + * SHFreeNameMappings [shell32.246] + * + * Free the mapping handle returned by SHFileoperation if FOF_WANTSMAPPINGHANDLE + * was specified. + * + * PARAMS + * hNameMapping [I] handle to the name mappings used during renaming of files + * + */ +void WINAPI SHFreeNameMappings(HANDLE hNameMapping) +{ + if (hNameMapping) + { + int i = SHDSA_GetItemCount((HDSA)hNameMapping) - 1; + + for (; i>= 0; i--) + { + LPSHNAMEMAPPINGW lp = DSA_GetItemPtr((HDSA)hNameMapping, i); + + SHFree(lp->pszOldPath); + SHFree(lp->pszNewPath); + } + DSA_Destroy((HDSA)hNameMapping); + } +} + +/************************************************************************* + * SheGetDirW [SHELL32.281] + * + */ +HRESULT WINAPI SheGetDirW(LPWSTR u, LPWSTR v) +{ FIXME("%p %p stub\n",u,v); + return 0; +} + +/************************************************************************* + * SheChangeDirW [SHELL32.274] + * + */ +HRESULT WINAPI SheChangeDirW(LPWSTR u) +{ FIXME("(%s),stub\n",debugstr_w(u)); + return 0; +} + +/************************************************************************* + * IsNetDrive [SHELL32.66] + */ +BOOL WINAPI IsNetDrive(DWORD drive) +{ + char root[4]; + strcpy(root, "A:\\"); + root[0] += (char)drive; + return (GetDriveTypeA(root) == DRIVE_REMOTE); +} + + +/************************************************************************* + * RealDriveType [SHELL32.524] + */ +INT WINAPI RealDriveType(INT drive, BOOL bQueryNet) +{ + char root[] = "A:\\"; + root[0] += (char)drive; + return GetDriveTypeA(root); +} diff --git a/reactos/lib/shell32/shlfolder.c b/reactos/lib/shell32/shlfolder.c new file mode 100644 index 00000000000..3394155fdbb --- /dev/null +++ b/reactos/lib/shell32/shlfolder.c @@ -0,0 +1,516 @@ + +/* + * Shell Folder stuff + * + * Copyright 1997 Marcus Meissner + * Copyright 1998, 1999, 2002 Juergen Schmied + * + * IShellFolder2 and related interfaces + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include + +#define COBJMACROS + +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wingdi.h" +#include "winuser.h" + +#include "ole2.h" +#include "shlguid.h" + +#include "pidl.h" +#include "undocshell.h" +#include "shell32_main.h" +#include "shresdef.h" +#include "shlwapi.h" +#include "shellfolder.h" +#include "wine/debug.h" +#include "debughlp.h" +#include "shfldr.h" + +WINE_DEFAULT_DEBUG_CHANNEL (shell); + +/*************************************************************************** + * debughelper: print out the return address + * helps especially to track down unbalanced AddRef/Release + */ +#define MEM_DEBUG 0 + +#if MEM_DEBUG +#define _CALL_TRACE TRACE("called from: 0x%08x\n", *( ((UINT*)&iface)-1 )); +#else +#define _CALL_TRACE +#endif + +static const WCHAR wszDotShellClassInfo[] = {'.','S','h','e','l','l','C','l','a','s','s','I','n','f','o',0}; + +/*************************************************************************** + * SHELL32_GetCustomFolderAttribute (internal function) + * + * Gets a value from the folder's desktop.ini file, if one exists. + * + * PARAMETERS + * pidl [I] Folder containing the desktop.ini file. + * pwszHeading [I] Heading in .ini file. + * pwszAttribute [I] Attribute in .ini file. + * pwszValue [O] Buffer to store value into. + * cchValue [I] Size in characters including NULL of buffer pointed to + * by pwszValue. + * + * RETURNS + * TRUE if returned non-NULL value. + * FALSE otherwise. + */ +BOOL SHELL32_GetCustomFolderAttribute( + LPCITEMIDLIST pidl, LPCWSTR pwszHeading, LPCWSTR pwszAttribute, + LPWSTR pwszValue, DWORD cchValue) +{ +#if 0 /* Hack around not having system attribute on non-Windows file systems */ + DWORD dwAttrib = _ILGetFileAttributes(pidl, NULL, 0); +#else + DWORD dwAttrib = FILE_ATTRIBUTE_SYSTEM; +#endif + if (dwAttrib & FILE_ATTRIBUTE_SYSTEM) + { + DWORD ret; + WCHAR wszDesktopIniPath[MAX_PATH]; + static const WCHAR wszDesktopIni[] = + {'d','e','s','k','t','o','p','.','i','n','i',0}; + static const WCHAR wszDefault[] = + {0}; + if (!SHGetPathFromIDListW(pidl, wszDesktopIniPath)) + return FALSE; + PathAppendW(wszDesktopIniPath, wszDesktopIni); + ret = GetPrivateProfileStringW(pwszHeading, pwszAttribute, + wszDefault, pwszValue, cchValue, wszDesktopIniPath); + if (!ret) return FALSE; + return TRUE; + } + return FALSE; +} + + +/*************************************************************************** + * GetNextElement (internal function) + * + * gets a part of a string till the first backslash + * + * PARAMETERS + * pszNext [IN] string to get the element from + * pszOut [IN] pointer to buffer whitch receives string + * dwOut [IN] length of pszOut + * + * RETURNS + * LPSTR pointer to first, not yet parsed char + */ + +LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut) +{ + LPCWSTR pszTail = pszNext; + DWORD dwCopy; + + TRACE ("(%s %p 0x%08lx)\n", debugstr_w (pszNext), pszOut, dwOut); + + *pszOut = 0x0000; + + if (!pszNext || !*pszNext) + return NULL; + + while (*pszTail && (*pszTail != (WCHAR) '\\')) + pszTail++; + + dwCopy = (const WCHAR *) pszTail - (const WCHAR *) pszNext + 1; + lstrcpynW (pszOut, pszNext, (dwOut < dwCopy) ? dwOut : dwCopy); + + if (*pszTail) + pszTail++; + else + pszTail = NULL; + + TRACE ("--(%s %s 0x%08lx %p)\n", debugstr_w (pszNext), debugstr_w (pszOut), dwOut, pszTail); + return pszTail; +} + +HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, + LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes) +{ + HRESULT hr = E_INVALIDARG; + LPITEMIDLIST pidlOut = NULL, + pidlTemp = NULL; + IShellFolder *psfChild; + + TRACE ("(%p, %p, %p, %s)\n", psf, pbc, pidlInOut ? *pidlInOut : NULL, debugstr_w (szNext)); + + /* get the shellfolder for the child pidl and let it analyse further */ + hr = IShellFolder_BindToObject (psf, *pidlInOut, pbc, &IID_IShellFolder, (LPVOID *) & psfChild); + + if (SUCCEEDED(hr)) { + hr = IShellFolder_ParseDisplayName (psfChild, hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes); + IShellFolder_Release (psfChild); + + if (SUCCEEDED(hr)) { + pidlTemp = ILCombine (*pidlInOut, pidlOut); + + if (!pidlTemp) + hr = E_OUTOFMEMORY; + } + + if (pidlOut) + ILFree (pidlOut); + } + + ILFree (*pidlInOut); + *pidlInOut = pidlTemp; + + TRACE ("-- pidl=%p ret=0x%08lx\n", pidlInOut ? *pidlInOut : NULL, hr); + return hr; +} + +/*********************************************************************** + * SHELL32_CoCreateInitSF + * + * Creates a shell folder and initializes it with a pidl and a root folder + * via IPersistFolder3 or IPersistFolder. + * + * NOTES + * pathRoot can be NULL for Folders beeing a drive. + * In this case the absolute path is build from pidlChild (eg. C:) + */ +HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCSTR pathRoot, + LPCITEMIDLIST pidlChild, REFCLSID clsid, REFIID riid, LPVOID * ppvOut) +{ + HRESULT hr; + + TRACE ("%p %s %p\n", pidlRoot, pathRoot, pidlChild); + + if (SUCCEEDED ((hr = SHCoCreateInstance (NULL, clsid, NULL, riid, ppvOut)))) { + LPITEMIDLIST pidlAbsolute = ILCombine (pidlRoot, pidlChild); + IPersistFolder *pPF; + IPersistFolder3 *ppf; + + if (SUCCEEDED (IUnknown_QueryInterface ((IUnknown *) * ppvOut, &IID_IPersistFolder3, (LPVOID *) & ppf))) { + PERSIST_FOLDER_TARGET_INFO ppfti; + char szDestPath[MAX_PATH]; + + ZeroMemory (&ppfti, sizeof (ppfti)); + + /* build path */ + if (pathRoot) { + lstrcpyA (szDestPath, pathRoot); + PathAddBackslashA(szDestPath); /* FIXME: why have drives a backslash here ? */ + } else { + szDestPath[0] = '\0'; + } + + if (pidlChild) { + LPSTR pszChild = _ILGetTextPointer(pidlChild); + + if (pszChild) + lstrcatA (szDestPath, pszChild); + else + hr = E_INVALIDARG; + } + + /* fill the PERSIST_FOLDER_TARGET_INFO */ + ppfti.dwAttributes = -1; + ppfti.csidl = -1; + MultiByteToWideChar (CP_ACP, 0, szDestPath, -1, ppfti.szTargetParsingName, MAX_PATH); + + IPersistFolder3_InitializeEx (ppf, NULL, pidlAbsolute, &ppfti); + IPersistFolder3_Release (ppf); + } + else if (SUCCEEDED ((hr = IUnknown_QueryInterface ((IUnknown *) * ppvOut, &IID_IPersistFolder, (LPVOID *) & pPF)))) { + IPersistFolder_Initialize (pPF, pidlAbsolute); + IPersistFolder_Release (pPF); + } + ILFree (pidlAbsolute); + } + TRACE ("-- (%p) ret=0x%08lx\n", *ppvOut, hr); + return hr; +} + +/*********************************************************************** + * SHELL32_BindToChild + * + * Common code for IShellFolder_BindToObject. + * Creates a shell folder by binding to a root pidl. + */ +HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot, + LPCSTR pathRoot, LPCITEMIDLIST pidlComplete, REFIID riid, LPVOID * ppvOut) +{ + GUID const *clsid; + IShellFolder *pSF; + HRESULT hr; + LPITEMIDLIST pidlChild; + + if (!pidlRoot || !ppvOut) + return E_INVALIDARG; + + *ppvOut = NULL; + + pidlChild = ILCloneFirst (pidlComplete); + + if ((clsid = _ILGetGUIDPointer (pidlChild))) { + /* virtual folder */ + hr = SHELL32_CoCreateInitSF (pidlRoot, pathRoot, pidlChild, clsid, &IID_IShellFolder, (LPVOID *) & pSF); + } else { + /* file system folder */ + CLSID clsidFolder = CLSID_ShellFSFolder; + static const WCHAR wszCLSID[] = {'C','L','S','I','D',0}; + WCHAR wszCLSIDValue[CHARS_IN_GUID]; + LPITEMIDLIST pidlAbsolute = ILCombine (pidlRoot, pidlChild); + /* see if folder CLSID should be overridden by desktop.ini file */ + if (SHELL32_GetCustomFolderAttribute (pidlAbsolute, + wszDotShellClassInfo, wszCLSID, wszCLSIDValue, CHARS_IN_GUID)) + CLSIDFromString (wszCLSIDValue, &clsidFolder); + ILFree (pidlAbsolute); + hr = SHELL32_CoCreateInitSF (pidlRoot, pathRoot, pidlChild, + &clsidFolder, &IID_IShellFolder, (LPVOID *)&pSF); + } + ILFree (pidlChild); + + if (SUCCEEDED (hr)) { + if (_ILIsPidlSimple (pidlComplete)) { + /* no sub folders */ + hr = IShellFolder_QueryInterface (pSF, riid, ppvOut); + } else { + /* go deeper */ + hr = IShellFolder_BindToObject (pSF, ILGetNext (pidlComplete), NULL, riid, ppvOut); + } + IShellFolder_Release (pSF); + } + + TRACE ("-- returning (%p) %08lx\n", *ppvOut, hr); + + return hr; +} + +/*********************************************************************** + * SHELL32_GetDisplayNameOfChild + * + * Retrives the display name of a child object of a shellfolder. + * + * For a pidl eg. [subpidl1][subpidl2][subpidl3]: + * - it binds to the child shellfolder [subpidl1] + * - asks it for the displayname of [subpidl2][subpidl3] + * + * Is possible the pidl is a simple pidl. In this case it asks the + * subfolder for the displayname of a empty pidl. The subfolder + * returns the own displayname eg. "::{guid}". This is used for + * virtual folders with the registry key WantsFORPARSING set. + */ +HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, + LPCITEMIDLIST pidl, DWORD dwFlags, LPSTR szOut, DWORD dwOutLen) +{ + LPITEMIDLIST pidlFirst; + HRESULT hr = E_INVALIDARG; + + TRACE ("(%p)->(pidl=%p 0x%08lx %p 0x%08lx)\n", psf, pidl, dwFlags, szOut, dwOutLen); + pdump (pidl); + + pidlFirst = ILCloneFirst (pidl); + if (pidlFirst) { + IShellFolder2 *psfChild; + + hr = IShellFolder_BindToObject (psf, pidlFirst, NULL, &IID_IShellFolder, (LPVOID *) & psfChild); + if (SUCCEEDED (hr)) { + STRRET strTemp; + LPITEMIDLIST pidlNext = ILGetNext (pidl); + + hr = IShellFolder_GetDisplayNameOf (psfChild, pidlNext, dwFlags, &strTemp); + if (SUCCEEDED (hr)) { + hr = StrRetToStrNA (szOut, dwOutLen, &strTemp, pidlNext); + } + IShellFolder_Release (psfChild); + } + ILFree (pidlFirst); + } else + hr = E_OUTOFMEMORY; + + TRACE ("-- ret=0x%08lx %s\n", hr, szOut); + + return hr; +} + +/*********************************************************************** + * SHELL32_GetItemAttributes + * + * NOTES + * observerd values: + * folder: 0xE0000177 FILESYSTEM | HASSUBFOLDER | FOLDER + * file: 0x40000177 FILESYSTEM + * drive: 0xf0000144 FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR + * mycomputer: 0xb0000154 HASSUBFOLDER | FOLDER | FILESYSANCESTOR + * (seems to be default for shell extensions if no registry entry exists) + * + * win2k: + * folder: 0xF0400177 FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR | CANMONIKER + * file: 0x40400177 FILESYSTEM | CANMONIKER + * drive 0xF0400154 FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR | CANMONIKER | CANRENAME (LABEL) + * + * This function does not set flags!! It only resets flags when necessary. + */ +HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes) +{ + GUID const *clsid; + DWORD dwAttributes; + DWORD dwSupportedAttr=SFGAO_CANCOPY | /*0x00000001 */ + SFGAO_CANMOVE | /*0x00000002 */ + SFGAO_CANLINK | /*0x00000004 */ + SFGAO_CANRENAME | /*0x00000010 */ + SFGAO_CANDELETE | /*0x00000020 */ + SFGAO_HASPROPSHEET | /*0x00000040 */ + SFGAO_DROPTARGET | /*0x00000100 */ + SFGAO_LINK | /*0x00010000 */ + SFGAO_READONLY | /*0x00040000 */ + SFGAO_HIDDEN | /*0x00080000 */ + SFGAO_FILESYSANCESTOR | /*0x10000000 */ + SFGAO_FOLDER | /*0x20000000 */ + SFGAO_FILESYSTEM | /*0x40000000 */ + SFGAO_HASSUBFOLDER; /*0x80000000 */ + + TRACE ("0x%08lx\n", *pdwAttributes); + + if (*pdwAttributes & ~dwSupportedAttr) + { + WARN ("attributes 0x%08lx not implemented\n", (*pdwAttributes & ~dwSupportedAttr)); + *pdwAttributes &= dwSupportedAttr; + } + + if (_ILIsDrive (pidl)) { + *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANLINK; + } else if ((clsid = _ILGetGUIDPointer (pidl))) { + if (HCR_GetFolderAttributes (clsid, &dwAttributes)) { + *pdwAttributes &= dwAttributes; + } else { + *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME|SFGAO_CANLINK; + } + } else if (_ILGetDataPointer (pidl)) { + dwAttributes = _ILGetFileAttributes (pidl, NULL, 0); + *pdwAttributes &= ~SFGAO_FILESYSANCESTOR; + + if ((SFGAO_FOLDER & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_DIRECTORY)) + *pdwAttributes &= ~(SFGAO_FOLDER | SFGAO_HASSUBFOLDER); + + if ((SFGAO_HIDDEN & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_HIDDEN)) + *pdwAttributes &= ~SFGAO_HIDDEN; + + if ((SFGAO_READONLY & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_READONLY)) + *pdwAttributes &= ~SFGAO_READONLY; + + if (SFGAO_LINK & *pdwAttributes) { + char ext[MAX_PATH]; + + if (!_ILGetExtension(pidl, ext, MAX_PATH) || strcasecmp(ext, "lnk")) + *pdwAttributes &= ~SFGAO_LINK; + } + } else { + *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME|SFGAO_CANLINK; + } + TRACE ("-- 0x%08lx\n", *pdwAttributes); + return S_OK; +} + +/*********************************************************************** + * SHELL32_CompareIDs + */ +HRESULT SHELL32_CompareIDs (IShellFolder * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + int type1, + type2; + char szTemp1[MAX_PATH]; + char szTemp2[MAX_PATH]; + HRESULT nReturn; + LPITEMIDLIST firstpidl, + nextpidl1, + nextpidl2; + IShellFolder *psf; + + /* test for empty pidls */ + BOOL isEmpty1 = _ILIsDesktop (pidl1); + BOOL isEmpty2 = _ILIsDesktop (pidl2); + + if (isEmpty1 && isEmpty2) + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 0 ); + if (isEmpty1) + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, (WORD)-1 ); + if (isEmpty2) + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 1 ); + + /* test for different types. Sort order is the PT_* constant */ + type1 = _ILGetDataPointer (pidl1)->type; + type2 = _ILGetDataPointer (pidl2)->type; + if (type1 < type2) + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, (WORD)-1 ); + else if (type1 > type2) + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 1 ); + + /* test for name of pidl */ + _ILSimpleGetText (pidl1, szTemp1, MAX_PATH); + _ILSimpleGetText (pidl2, szTemp2, MAX_PATH); + nReturn = strcasecmp (szTemp1, szTemp2); + if (nReturn < 0) + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, (WORD)-1 ); + else if (nReturn > 0) + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 1 ); + + /* test of complex pidls */ + firstpidl = ILCloneFirst (pidl1); + nextpidl1 = ILGetNext (pidl1); + nextpidl2 = ILGetNext (pidl2); + + /* optimizing: test special cases and bind not deeper */ + /* the deeper shellfolder would do the same */ + isEmpty1 = _ILIsDesktop (nextpidl1); + isEmpty2 = _ILIsDesktop (nextpidl2); + + if (isEmpty1 && isEmpty2) { + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 0 ); + } else if (isEmpty1) { + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, (WORD)-1 ); + } else if (isEmpty2) { + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, 1 ); + /* optimizing end */ + } else if (SUCCEEDED (IShellFolder_BindToObject (iface, firstpidl, NULL, &IID_IShellFolder, (LPVOID *) & psf))) { + nReturn = IShellFolder_CompareIDs (psf, lParam, nextpidl1, nextpidl2); + IShellFolder_Release (psf); + } + ILFree (firstpidl); + return nReturn; +} + +/*********************************************************************** + * SHCreateLinks + * + * Undocumented. + */ +HRESULT WINAPI SHCreateLinks( HWND hWnd, LPCSTR lpszDir, LPDATAOBJECT lpDataObject, + UINT uFlags, LPITEMIDLIST *lppidlLinks) +{ + FIXME("%p %s %p %08x %p\n",hWnd,lpszDir,lpDataObject,uFlags,lppidlLinks); + return E_NOTIMPL; +} diff --git a/reactos/lib/shell32/shlfsbind.c b/reactos/lib/shell32/shlfsbind.c new file mode 100644 index 00000000000..cbf09d420fc --- /dev/null +++ b/reactos/lib/shell32/shlfsbind.c @@ -0,0 +1,223 @@ +/* + * File System Bind Data object to use as parameter for the bind context to + * IShellFolder_ParseDisplayName + * + * Copyright 2003 Rolf Kalbermatter + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "config.h" +#include "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "shlobj.h" +#include "shell32_main.h" + +#include "debughlp.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(pidl); + +/*********************************************************************** + * IFileSystemBindData implementation + */ +typedef struct +{ + IFileSystemBindDataVtbl *lpVtbl; + DWORD ref; + WIN32_FIND_DATAW findFile; +} IFileSystemBindDataImpl; + +static HRESULT WINAPI IFileSystemBindData_fnQueryInterface(IFileSystemBindData *iface, REFIID riid, LPVOID* ppvObj); +static ULONG WINAPI IFileSystemBindData_fnAddRef(IFileSystemBindData *iface); +static ULONG WINAPI IFileSystemBindData_fnRelease(IFileSystemBindData *iface); +static HRESULT WINAPI IFileSystemBindData_fnGetFindData(IFileSystemBindData *iface, WIN32_FIND_DATAW *pfd); +static HRESULT WINAPI IFileSystemBindData_fnSetFindData(IFileSystemBindData *iface, const WIN32_FIND_DATAW *pfd); + +static struct IFileSystemBindDataVtbl sbvt = +{ + IFileSystemBindData_fnQueryInterface, + IFileSystemBindData_fnAddRef, + IFileSystemBindData_fnRelease, + IFileSystemBindData_fnSetFindData, + IFileSystemBindData_fnGetFindData, +}; + +static const WCHAR wFileSystemBindData[] = {'F','i','l','e',' ','S','y','s','t','e','m',' ','B','i','n','d','D','a','t','a',0}; + +HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV) +{ + IFileSystemBindDataImpl *sb; + HRESULT ret = E_OUTOFMEMORY; + + TRACE("%p, %p\n", pfd, ppV); + + if (!ppV) + return E_INVALIDARG; + + *ppV = NULL; + + sb = (IFileSystemBindDataImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IFileSystemBindDataImpl)); + if (!sb) + return ret; + + sb->lpVtbl = &sbvt; + sb->ref = 1; + IFileSystemBindData_fnSetFindData((IFileSystemBindData*)sb, pfd); + + ret = CreateBindCtx(0, ppV); + if (SUCCEEDED(ret)) + { + BIND_OPTS bindOpts; + bindOpts.cbStruct = sizeof(BIND_OPTS); + bindOpts.grfFlags = 0; + bindOpts.grfMode = STGM_CREATE; + bindOpts.dwTickCountDeadline = 0; + IBindCtx_SetBindOptions(*ppV, &bindOpts); + IBindCtx_RegisterObjectParam(*ppV, (LPOLESTR)wFileSystemBindData, (LPUNKNOWN)sb); + + IFileSystemBindData_Release((IFileSystemBindData*)sb); + } + else + HeapFree(GetProcessHeap(), 0, sb); + return ret; +} + +HRESULT WINAPI FileSystemBindData_GetFindData(LPBC pbc, WIN32_FIND_DATAW *pfd) +{ + LPUNKNOWN pUnk; + IFileSystemBindData *pfsbd = NULL; + HRESULT ret; + + TRACE("%p, %p\n", pbc, pfd); + + if (!pfd) + return E_INVALIDARG; + + ret = IBindCtx_GetObjectParam(pbc, (LPOLESTR)wFileSystemBindData, &pUnk); + if (SUCCEEDED(ret)) + { + ret = IUnknown_QueryInterface(pUnk, &IID_IFileSystemBindData, (LPVOID *)&pfsbd); + if (SUCCEEDED(ret)) + { + ret = IFileSystemBindData_GetFindData(pfsbd, pfd); + IFileSystemBindData_Release(pfsbd); + } + IUnknown_Release(pUnk); + } + return ret; +} + +HRESULT WINAPI FileSystemBindData_SetFindData(LPBC pbc, const WIN32_FIND_DATAW *pfd) +{ + LPUNKNOWN pUnk; + IFileSystemBindData *pfsbd = NULL; + HRESULT ret; + + TRACE("%p, %p\n", pbc, pfd); + + ret = IBindCtx_GetObjectParam(pbc, (LPOLESTR)wFileSystemBindData, &pUnk); + if (SUCCEEDED(ret)) + { + ret = IUnknown_QueryInterface(pUnk, &IID_IFileSystemBindData, (LPVOID *)&pfsbd); + if (SUCCEEDED(ret)) + { + ret = IFileSystemBindData_SetFindData(pfsbd, pfd); + IFileSystemBindData_Release(pfsbd); + } + IUnknown_Release(pUnk); + } + return ret;} + + + +static HRESULT WINAPI IFileSystemBindData_fnQueryInterface(IFileSystemBindData *iface, REFIID riid, LPVOID *ppV) +{ + IFileSystemBindDataImpl *This = (IFileSystemBindDataImpl *)iface; + TRACE("(%p)->(\n\tIID:\t%s, %p)\n", This, debugstr_guid(riid), ppV); + + *ppV = NULL; + + if (IsEqualIID(riid, &IID_IUnknown)) + { + *ppV = This; + } + else if (IsEqualIID(riid, &IID_IFileSystemBindData)) + { + *ppV = (IFileSystemBindData*)This; + } + + if (*ppV) + { + IUnknown_AddRef((IUnknown*)(*ppV)); + TRACE("-- Interface: (%p)->(%p)\n", ppV, *ppV); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI IFileSystemBindData_fnAddRef(IFileSystemBindData *iface) +{ + IFileSystemBindDataImpl *This = (IFileSystemBindDataImpl *)iface; + TRACE("(%p)\n", This); + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IFileSystemBindData_fnRelease(IFileSystemBindData *iface) +{ + IFileSystemBindDataImpl *This = (IFileSystemBindDataImpl *)iface; + TRACE("(%p)\n", This); + + if (!InterlockedDecrement(&This->ref)) + { + TRACE(" destroying ISFBindPidl(%p)\n",This); + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return This->ref; +} + +static HRESULT WINAPI IFileSystemBindData_fnGetFindData(IFileSystemBindData *iface, WIN32_FIND_DATAW *pfd) +{ + IFileSystemBindDataImpl *This = (IFileSystemBindDataImpl *)iface; + TRACE("(%p), %p\n", This, pfd); + + if (!pfd) + return E_INVALIDARG; + + memcpy(pfd, &This->findFile, sizeof(WIN32_FIND_DATAW)); + return NOERROR; +} + +static HRESULT WINAPI IFileSystemBindData_fnSetFindData(IFileSystemBindData *iface, const WIN32_FIND_DATAW *pfd) +{ + IFileSystemBindDataImpl *This = (IFileSystemBindDataImpl *)iface; + TRACE("(%p), %p\n", This, pfd); + + if (pfd) + memcpy(&This->findFile, pfd, sizeof(WIN32_FIND_DATAW)); + else + memset(&This->findFile, 0, sizeof(WIN32_FIND_DATAW)); + return NOERROR; +} diff --git a/reactos/lib/shell32/shlmenu.c b/reactos/lib/shell32/shlmenu.c new file mode 100644 index 00000000000..d10acb430bd --- /dev/null +++ b/reactos/lib/shell32/shlmenu.c @@ -0,0 +1,1002 @@ +/* + * see www.geocities.com/SiliconValley/4942/filemenu.html + * + * Copyright 1999, 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "wingdi.h" +#include "winuser.h" +#include "shlobj.h" +#include "undocshell.h" +#include "shlwapi.h" +#include "shell32_main.h" +#include "shlguid.h" + +#include "pidl.h" +#include "wine/debug.h" + +#ifdef FM_SEPARATOR +#undef FM_SEPARATOR +#endif +#define FM_SEPARATOR (LPCWSTR)1 + +static BOOL FileMenu_AppendItemW(HMENU hMenu, LPCWSTR lpText, UINT uID, int icon, + HMENU hMenuPopup, int nItemHeight); + +typedef struct +{ + BOOL bInitialized; + BOOL bFixedItems; + /* create */ + COLORREF crBorderColor; + int nBorderWidth; + HBITMAP hBorderBmp; + + /* insert using pidl */ + LPITEMIDLIST pidl; + UINT uID; + UINT uFlags; + UINT uEnumFlags; + LPFNFMCALLBACK lpfnCallback; +} FMINFO, *LPFMINFO; + +typedef struct +{ int cchItemText; + int iIconIndex; + HMENU hMenu; + WCHAR szItemText[1]; +} FMITEM, * LPFMITEM; + +static BOOL bAbortInit; + +#define CCH_MAXITEMTEXT 256 + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +LPFMINFO FM_GetMenuInfo(HMENU hmenu) +{ MENUINFO MenuInfo; + LPFMINFO menudata; + + MenuInfo.cbSize = sizeof(MENUINFO); + MenuInfo.fMask = MIM_MENUDATA; + + if (! GetMenuInfo(hmenu, &MenuInfo)) + return NULL; + + menudata = (LPFMINFO)MenuInfo.dwMenuData; + + if ((menudata == 0) || (MenuInfo.cbSize != sizeof(MENUINFO))) + { + ERR("menudata corrupt: %p %lu\n", menudata, MenuInfo.cbSize); + return 0; + } + + return menudata; + +} +/************************************************************************* + * FM_SetMenuParameter [internal] + * + */ +static LPFMINFO FM_SetMenuParameter( + HMENU hmenu, + UINT uID, + LPCITEMIDLIST pidl, + UINT uFlags, + UINT uEnumFlags, + LPFNFMCALLBACK lpfnCallback) +{ + LPFMINFO menudata; + + TRACE("\n"); + + menudata = FM_GetMenuInfo(hmenu); + + if ( menudata->pidl) + { SHFree(menudata->pidl); + } + + menudata->uID = uID; + menudata->pidl = ILClone(pidl); + menudata->uFlags = uFlags; + menudata->uEnumFlags = uEnumFlags; + menudata->lpfnCallback = lpfnCallback; + + return menudata; +} + +/************************************************************************* + * FM_InitMenuPopup [internal] + * + */ +static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl) +{ IShellFolder *lpsf, *lpsf2; + ULONG ulItemAttr = SFGAO_FOLDER; + UINT uID, uFlags, uEnumFlags; + LPFNFMCALLBACK lpfnCallback; + LPCITEMIDLIST pidl; + WCHAR sTemp[MAX_PATH]; + int NumberOfItems = 0, iIcon; + MENUINFO MenuInfo; + LPFMINFO menudata; + + TRACE("%p %p\n", hmenu, pAlternatePidl); + + MenuInfo.cbSize = sizeof(MENUINFO); + MenuInfo.fMask = MIM_MENUDATA; + + if (! GetMenuInfo(hmenu, &MenuInfo)) + return FALSE; + + menudata = (LPFMINFO)MenuInfo.dwMenuData; + + if ((menudata == 0) || (MenuInfo.cbSize != sizeof(MENUINFO))) + { + ERR("menudata corrupt: %p %lu\n", menudata, MenuInfo.cbSize); + return 0; + } + + if (menudata->bInitialized) + return 0; + + pidl = (pAlternatePidl? pAlternatePidl: menudata->pidl); + if (!pidl) + return 0; + + uID = menudata->uID; + uFlags = menudata->uFlags; + uEnumFlags = menudata->uEnumFlags; + lpfnCallback = menudata->lpfnCallback; + menudata->bInitialized = FALSE; + + SetMenuInfo(hmenu, &MenuInfo); + + if (SUCCEEDED (SHGetDesktopFolder(&lpsf))) + { + if (SUCCEEDED(IShellFolder_BindToObject(lpsf, pidl,0,(REFIID)&IID_IShellFolder,(LPVOID *)&lpsf2))) + { + IEnumIDList *lpe = NULL; + + if (SUCCEEDED (IShellFolder_EnumObjects(lpsf2, 0, uEnumFlags, &lpe ))) + { + + LPITEMIDLIST pidlTemp = NULL; + ULONG ulFetched; + + while ((!bAbortInit) && (NOERROR == IEnumIDList_Next(lpe,1,&pidlTemp,&ulFetched))) + { + if (SUCCEEDED (IShellFolder_GetAttributesOf(lpsf, 1, (LPCITEMIDLIST*)&pidlTemp, &ulItemAttr))) + { + ILGetDisplayNameExW(NULL, pidlTemp, sTemp, ILGDN_FORPARSING); + if (! (PidlToSicIndex(lpsf, pidlTemp, FALSE, 0, &iIcon))) + iIcon = FM_BLANK_ICON; + if ( SFGAO_FOLDER & ulItemAttr) + { + LPFMINFO lpFmMi; + MENUINFO MenuInfo; + HMENU hMenuPopup = CreatePopupMenu(); + + lpFmMi = (LPFMINFO) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO)); + + lpFmMi->pidl = ILCombine(pidl, pidlTemp); + lpFmMi->uEnumFlags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS; + + MenuInfo.cbSize = sizeof(MENUINFO); + MenuInfo.fMask = MIM_MENUDATA; + MenuInfo.dwMenuData = (DWORD) lpFmMi; + SetMenuInfo (hMenuPopup, &MenuInfo); + + FileMenu_AppendItemW (hmenu, sTemp, uID, iIcon, hMenuPopup, FM_DEFAULT_HEIGHT); + } + else + { + LPWSTR pExt = PathFindExtensionW(sTemp); + if (pExt) + *pExt = 0; + FileMenu_AppendItemW (hmenu, sTemp, uID, iIcon, 0, FM_DEFAULT_HEIGHT); + } + } + + if (lpfnCallback) + { + TRACE("enter callback\n"); + lpfnCallback ( pidl, pidlTemp); + TRACE("leave callback\n"); + } + + NumberOfItems++; + } + IEnumIDList_Release (lpe); + } + IShellFolder_Release(lpsf2); + } + IShellFolder_Release(lpsf); + } + + if ( GetMenuItemCount (hmenu) == 0 ) + { + static const WCHAR szEmpty[] = { '(','e','m','p','t','y',')',0 }; + FileMenu_AppendItemW (hmenu, szEmpty, uID, FM_BLANK_ICON, 0, FM_DEFAULT_HEIGHT); + NumberOfItems++; + } + + menudata->bInitialized = TRUE; + SetMenuInfo(hmenu, &MenuInfo); + + return NumberOfItems; +} +/************************************************************************* + * FileMenu_Create [SHELL32.114] + * + * NOTES + * for non-root menus values are + * (ffffffff,00000000,00000000,00000000,00000000) + */ +HMENU WINAPI FileMenu_Create ( + COLORREF crBorderColor, + int nBorderWidth, + HBITMAP hBorderBmp, + int nSelHeight, + UINT uFlags) +{ + MENUINFO MenuInfo; + LPFMINFO menudata; + + HMENU hMenu = CreatePopupMenu(); + + TRACE("0x%08lx 0x%08x %p 0x%08x 0x%08x hMenu=%p\n", + crBorderColor, nBorderWidth, hBorderBmp, nSelHeight, uFlags, hMenu); + + menudata = (LPFMINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO)); + menudata->crBorderColor = crBorderColor; + menudata->nBorderWidth = nBorderWidth; + menudata->hBorderBmp = hBorderBmp; + + MenuInfo.cbSize = sizeof(MENUINFO); + MenuInfo.fMask = MIM_MENUDATA; + MenuInfo.dwMenuData = (DWORD) menudata; + SetMenuInfo (hMenu, &MenuInfo); + + return hMenu; +} + +/************************************************************************* + * FileMenu_Destroy [SHELL32.118] + * + * NOTES + * exported by name + */ +void WINAPI FileMenu_Destroy (HMENU hmenu) +{ + LPFMINFO menudata; + + TRACE("%p\n", hmenu); + + FileMenu_DeleteAllItems (hmenu); + + menudata = FM_GetMenuInfo(hmenu); + + if ( menudata->pidl) + { SHFree( menudata->pidl); + } + HeapFree(GetProcessHeap(), 0, menudata); + + DestroyMenu (hmenu); +} + +/************************************************************************* + * FileMenu_AppendItem [SHELL32.115] + * + */ +static BOOL FileMenu_AppendItemW( + HMENU hMenu, + LPCWSTR lpText, + UINT uID, + int icon, + HMENU hMenuPopup, + int nItemHeight) +{ + MENUITEMINFOW mii; + LPFMITEM myItem; + LPFMINFO menudata; + MENUINFO MenuInfo; + + + TRACE("%p %s 0x%08x 0x%08x %p 0x%08x\n", + hMenu, (lpText!=FM_SEPARATOR) ? debugstr_w(lpText) : NULL, + uID, icon, hMenuPopup, nItemHeight); + + ZeroMemory (&mii, sizeof(MENUITEMINFOW)); + + mii.cbSize = sizeof(MENUITEMINFOW); + + if (lpText != FM_SEPARATOR) + { + int len = strlenW (lpText); + myItem = (LPFMITEM) SHAlloc( sizeof(FMITEM) + len*sizeof(WCHAR)); + strcpyW (myItem->szItemText, lpText); + myItem->cchItemText = len; + myItem->iIconIndex = icon; + myItem->hMenu = hMenu; + mii.fMask = MIIM_DATA; + mii.dwItemData = (DWORD) myItem; + } + + if ( hMenuPopup ) + { /* sub menu */ + mii.fMask |= MIIM_TYPE | MIIM_SUBMENU; + mii.fType = MFT_OWNERDRAW; + mii.hSubMenu = hMenuPopup; + } + else if (lpText == FM_SEPARATOR ) + { mii.fMask |= MIIM_ID | MIIM_TYPE; + mii.fType = MFT_SEPARATOR; + } + else + { /* normal item */ + mii.fMask |= MIIM_ID | MIIM_TYPE | MIIM_STATE; + mii.fState = MFS_ENABLED | MFS_DEFAULT; + mii.fType = MFT_OWNERDRAW; + } + mii.wID = uID; + + InsertMenuItemW (hMenu, (UINT)-1, TRUE, &mii); + + /* set bFixedItems to true */ + MenuInfo.cbSize = sizeof(MENUINFO); + MenuInfo.fMask = MIM_MENUDATA; + + if (! GetMenuInfo(hMenu, &MenuInfo)) + return FALSE; + + menudata = (LPFMINFO)MenuInfo.dwMenuData; + if ((menudata == 0) || (MenuInfo.cbSize != sizeof(MENUINFO))) + { + ERR("menudata corrupt: %p %lu\n", menudata, MenuInfo.cbSize); + return 0; + } + + menudata->bFixedItems = TRUE; + SetMenuInfo(hMenu, &MenuInfo); + + return TRUE; + +} + +/**********************************************************************/ + +BOOL WINAPI FileMenu_AppendItemAW( + HMENU hMenu, + LPCVOID lpText, + UINT uID, + int icon, + HMENU hMenuPopup, + int nItemHeight) +{ + BOOL ret; + + if ((SHELL_OsIsUnicode() && (lpText!=FM_SEPARATOR)) || (lpText == NULL)) + ret = FileMenu_AppendItemW(hMenu, lpText, uID, icon, hMenuPopup, nItemHeight); + else + { + DWORD len = MultiByteToWideChar( CP_ACP, 0, lpText, -1, NULL, 0 ); + LPWSTR lpszText = HeapAlloc ( GetProcessHeap(), 0, len*sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, lpText, -1, lpszText, len ); + ret = FileMenu_AppendItemW(hMenu, lpszText, uID, icon, hMenuPopup, nItemHeight); + HeapFree( GetProcessHeap(), 0, lpszText ); + } + + return ret; +} +/************************************************************************* + * FileMenu_InsertUsingPidl [SHELL32.110] + * + * NOTES + * uEnumFlags any SHCONTF flag + */ +int WINAPI FileMenu_InsertUsingPidl ( + HMENU hmenu, + UINT uID, + LPCITEMIDLIST pidl, + UINT uFlags, + UINT uEnumFlags, + LPFNFMCALLBACK lpfnCallback) +{ + TRACE("%p 0x%08x %p 0x%08x 0x%08x %p\n", + hmenu, uID, pidl, uFlags, uEnumFlags, lpfnCallback); + + pdump (pidl); + + bAbortInit = FALSE; + + FM_SetMenuParameter(hmenu, uID, pidl, uFlags, uEnumFlags, lpfnCallback); + + return FM_InitMenuPopup(hmenu, NULL); +} + +/************************************************************************* + * FileMenu_ReplaceUsingPidl [SHELL32.113] + * + * FIXME: the static items are deleted but won't be refreshed + */ +int WINAPI FileMenu_ReplaceUsingPidl( + HMENU hmenu, + UINT uID, + LPCITEMIDLIST pidl, + UINT uEnumFlags, + LPFNFMCALLBACK lpfnCallback) +{ + TRACE("%p 0x%08x %p 0x%08x %p\n", + hmenu, uID, pidl, uEnumFlags, lpfnCallback); + + FileMenu_DeleteAllItems (hmenu); + + FM_SetMenuParameter(hmenu, uID, pidl, 0, uEnumFlags, lpfnCallback); + + return FM_InitMenuPopup(hmenu, NULL); +} + +/************************************************************************* + * FileMenu_Invalidate [SHELL32.111] + */ +void WINAPI FileMenu_Invalidate (HMENU hMenu) +{ + FIXME("%p\n",hMenu); +} + +/************************************************************************* + * FileMenu_FindSubMenuByPidl [SHELL32.106] + */ +HMENU WINAPI FileMenu_FindSubMenuByPidl( + HMENU hMenu, + LPCITEMIDLIST pidl) +{ + FIXME("%p %p\n",hMenu, pidl); + return 0; +} + +/************************************************************************* + * FileMenu_AppendFilesForPidl [SHELL32.124] + */ +int WINAPI FileMenu_AppendFilesForPidl( + HMENU hmenu, + LPCITEMIDLIST pidl, + BOOL bAddSeperator) +{ + LPFMINFO menudata; + + menudata = FM_GetMenuInfo(hmenu); + + menudata->bInitialized = FALSE; + + FM_InitMenuPopup(hmenu, pidl); + + if (bAddSeperator) + FileMenu_AppendItemW (hmenu, FM_SEPARATOR, 0, 0, 0, FM_DEFAULT_HEIGHT); + + TRACE("%p %p 0x%08x\n",hmenu, pidl,bAddSeperator); + + return 0; +} +/************************************************************************* + * FileMenu_AddFilesForPidl [SHELL32.125] + * + * NOTES + * uEnumFlags any SHCONTF flag + */ +int WINAPI FileMenu_AddFilesForPidl ( + HMENU hmenu, + UINT uReserved, + UINT uID, + LPCITEMIDLIST pidl, + UINT uFlags, + UINT uEnumFlags, + LPFNFMCALLBACK lpfnCallback) +{ + TRACE("%p 0x%08x 0x%08x %p 0x%08x 0x%08x %p\n", + hmenu, uReserved, uID, pidl, uFlags, uEnumFlags, lpfnCallback); + + return FileMenu_InsertUsingPidl ( hmenu, uID, pidl, uFlags, uEnumFlags, lpfnCallback); + +} + + +/************************************************************************* + * FileMenu_TrackPopupMenuEx [SHELL32.116] + */ +BOOL WINAPI FileMenu_TrackPopupMenuEx ( + HMENU hMenu, + UINT uFlags, + int x, + int y, + HWND hWnd, + LPTPMPARAMS lptpm) +{ + TRACE("%p 0x%08x 0x%x 0x%x %p %p\n", + hMenu, uFlags, x, y, hWnd, lptpm); + return TrackPopupMenuEx(hMenu, uFlags, x, y, hWnd, lptpm); +} + +/************************************************************************* + * FileMenu_GetLastSelectedItemPidls [SHELL32.107] + */ +BOOL WINAPI FileMenu_GetLastSelectedItemPidls( + UINT uReserved, + LPCITEMIDLIST *ppidlFolder, + LPCITEMIDLIST *ppidlItem) +{ + FIXME("0x%08x %p %p\n",uReserved, ppidlFolder, ppidlItem); + return 0; +} + +#define FM_ICON_SIZE 16 +#define FM_Y_SPACE 4 +#define FM_SPACE1 4 +#define FM_SPACE2 2 +#define FM_LEFTBORDER 2 +#define FM_RIGHTBORDER 8 +/************************************************************************* + * FileMenu_MeasureItem [SHELL32.112] + */ +LRESULT WINAPI FileMenu_MeasureItem( + HWND hWnd, + LPMEASUREITEMSTRUCT lpmis) +{ + LPFMITEM pMyItem = (LPFMITEM)(lpmis->itemData); + HDC hdc = GetDC(hWnd); + SIZE size; + LPFMINFO menuinfo; + + TRACE("%p %p %s\n", hWnd, lpmis, debugstr_w(pMyItem->szItemText)); + + GetTextExtentPoint32W(hdc, pMyItem->szItemText, pMyItem->cchItemText, &size); + + lpmis->itemWidth = size.cx + FM_LEFTBORDER + FM_ICON_SIZE + FM_SPACE1 + FM_SPACE2 + FM_RIGHTBORDER; + lpmis->itemHeight = (size.cy > (FM_ICON_SIZE + FM_Y_SPACE)) ? size.cy : (FM_ICON_SIZE + FM_Y_SPACE); + + /* add the menubitmap */ + menuinfo = FM_GetMenuInfo(pMyItem->hMenu); + if (menuinfo->nBorderWidth) + lpmis->itemWidth += menuinfo->nBorderWidth; + + TRACE("-- 0x%04x 0x%04x\n", lpmis->itemWidth, lpmis->itemHeight); + ReleaseDC (hWnd, hdc); + return 0; +} +/************************************************************************* + * FileMenu_DrawItem [SHELL32.105] + */ +LRESULT WINAPI FileMenu_DrawItem( + HWND hWnd, + LPDRAWITEMSTRUCT lpdis) +{ + LPFMITEM pMyItem = (LPFMITEM)(lpdis->itemData); + COLORREF clrPrevText, clrPrevBkgnd; + int xi,yi,xt,yt; + HIMAGELIST hImageList; + RECT TextRect, BorderRect; + LPFMINFO menuinfo; + + TRACE("%p %p %s\n", hWnd, lpdis, debugstr_w(pMyItem->szItemText)); + + if (lpdis->itemState & ODS_SELECTED) + { + clrPrevText = SetTextColor(lpdis->hDC, GetSysColor (COLOR_HIGHLIGHTTEXT)); + clrPrevBkgnd = SetBkColor(lpdis->hDC, GetSysColor (COLOR_HIGHLIGHT)); + } + else + { + clrPrevText = SetTextColor(lpdis->hDC, GetSysColor (COLOR_MENUTEXT)); + clrPrevBkgnd = SetBkColor(lpdis->hDC, GetSysColor (COLOR_MENU)); + } + + CopyRect(&TextRect, &(lpdis->rcItem)); + + /* add the menubitmap */ + menuinfo = FM_GetMenuInfo(pMyItem->hMenu); + if (menuinfo->nBorderWidth) + TextRect.left += menuinfo->nBorderWidth; + + BorderRect.right = menuinfo->nBorderWidth; +/* FillRect(lpdis->hDC, &BorderRect, CreateSolidBrush( menuinfo->crBorderColor)); +*/ + TextRect.left += FM_LEFTBORDER; + xi = TextRect.left + FM_SPACE1; + yi = TextRect.top + FM_Y_SPACE/2; + TextRect.bottom -= FM_Y_SPACE/2; + + xt = xi + FM_ICON_SIZE + FM_SPACE2; + yt = yi; + + ExtTextOutW (lpdis->hDC, xt , yt, ETO_OPAQUE, &TextRect, pMyItem->szItemText, pMyItem->cchItemText, NULL); + + Shell_GetImageList(0, &hImageList); + ImageList_Draw(hImageList, pMyItem->iIconIndex, lpdis->hDC, xi, yi, ILD_NORMAL); + + TRACE("-- 0x%04lx 0x%04lx 0x%04lx 0x%04lx\n", TextRect.left, TextRect.top, TextRect.right, TextRect.bottom); + + SetTextColor(lpdis->hDC, clrPrevText); + SetBkColor(lpdis->hDC, clrPrevBkgnd); + + return TRUE; +} + +/************************************************************************* + * FileMenu_InitMenuPopup [SHELL32.109] + * + * NOTES + * The filemenu is a ownerdrawn menu. Call this function responding to + * WM_INITPOPUPMENU + * + */ +BOOL WINAPI FileMenu_InitMenuPopup (HMENU hmenu) +{ + FM_InitMenuPopup(hmenu, NULL); + return TRUE; +} + +/************************************************************************* + * FileMenu_HandleMenuChar [SHELL32.108] + */ +LRESULT WINAPI FileMenu_HandleMenuChar( + HMENU hMenu, + WPARAM wParam) +{ + FIXME("%p 0x%08x\n",hMenu,wParam); + return 0; +} + +/************************************************************************* + * FileMenu_DeleteAllItems [SHELL32.104] + * + * NOTES + * exported by name + */ +BOOL WINAPI FileMenu_DeleteAllItems (HMENU hmenu) +{ + MENUITEMINFOW mii; + LPFMINFO menudata; + + int i; + + TRACE("%p\n", hmenu); + + ZeroMemory ( &mii, sizeof(MENUITEMINFOW)); + mii.cbSize = sizeof(MENUITEMINFOW); + mii.fMask = MIIM_SUBMENU|MIIM_DATA; + + for (i = 0; i < GetMenuItemCount( hmenu ); i++) + { GetMenuItemInfoW(hmenu, i, TRUE, &mii ); + + if (mii.dwItemData) + SHFree((LPFMINFO)mii.dwItemData); + + if (mii.hSubMenu) + FileMenu_Destroy(mii.hSubMenu); + } + + while (DeleteMenu (hmenu, 0, MF_BYPOSITION)){}; + + menudata = FM_GetMenuInfo(hmenu); + + menudata->bInitialized = FALSE; + + return TRUE; +} + +/************************************************************************* + * FileMenu_DeleteItemByCmd [SHELL32.117] + * + */ +BOOL WINAPI FileMenu_DeleteItemByCmd (HMENU hMenu, UINT uID) +{ + MENUITEMINFOW mii; + + TRACE("%p 0x%08x\n", hMenu, uID); + + ZeroMemory ( &mii, sizeof(MENUITEMINFOW)); + mii.cbSize = sizeof(MENUITEMINFOW); + mii.fMask = MIIM_SUBMENU; + + GetMenuItemInfoW(hMenu, uID, FALSE, &mii ); + if ( mii.hSubMenu ) + { + /* FIXME: Do what? */ + } + + DeleteMenu(hMenu, MF_BYCOMMAND, uID); + return TRUE; +} + +/************************************************************************* + * FileMenu_DeleteItemByIndex [SHELL32.140] + */ +BOOL WINAPI FileMenu_DeleteItemByIndex ( HMENU hMenu, UINT uPos) +{ + MENUITEMINFOW mii; + + TRACE("%p 0x%08x\n", hMenu, uPos); + + ZeroMemory ( &mii, sizeof(MENUITEMINFOW)); + mii.cbSize = sizeof(MENUITEMINFOW); + mii.fMask = MIIM_SUBMENU; + + GetMenuItemInfoW(hMenu, uPos, TRUE, &mii ); + if ( mii.hSubMenu ) + { + /* FIXME: Do what? */ + } + + DeleteMenu(hMenu, MF_BYPOSITION, uPos); + return TRUE; +} + +/************************************************************************* + * FileMenu_DeleteItemByFirstID [SHELL32.141] + */ +BOOL WINAPI FileMenu_DeleteItemByFirstID( + HMENU hMenu, + UINT uID) +{ + TRACE("%p 0x%08x\n", hMenu, uID); + return 0; +} + +/************************************************************************* + * FileMenu_DeleteSeparator [SHELL32.142] + */ +BOOL WINAPI FileMenu_DeleteSeparator(HMENU hMenu) +{ + TRACE("%p\n", hMenu); + return 0; +} + +/************************************************************************* + * FileMenu_EnableItemByCmd [SHELL32.143] + */ +BOOL WINAPI FileMenu_EnableItemByCmd( + HMENU hMenu, + UINT uID, + BOOL bEnable) +{ + TRACE("%p 0x%08x 0x%08x\n", hMenu, uID,bEnable); + return 0; +} + +/************************************************************************* + * FileMenu_GetItemExtent [SHELL32.144] + * + * NOTES + * if the menu is too big, entries are getting cut away!! + */ +DWORD WINAPI FileMenu_GetItemExtent (HMENU hMenu, UINT uPos) +{ RECT rect; + + FIXME("%p 0x%08x\n", hMenu, uPos); + + if (GetMenuItemRect(0, hMenu, uPos, &rect)) + { FIXME("0x%04lx 0x%04lx 0x%04lx 0x%04lx\n", + rect.right, rect.left, rect.top, rect.bottom); + return ((rect.right-rect.left)<<16) + (rect.top-rect.bottom); + } + return 0x00100010; /*FIXME*/ +} + +/************************************************************************* + * FileMenu_AbortInitMenu [SHELL32.120] + * + */ +void WINAPI FileMenu_AbortInitMenu (void) +{ TRACE("\n"); + bAbortInit = TRUE; +} + +/************************************************************************* + * SHFind_InitMenuPopup [SHELL32.149] + * + * + * PARAMETERS + * hMenu [in] handle of menu previously created + * hWndParent [in] parent window + * w [in] no pointer (0x209 over here) perhaps menu IDs ??? + * x [in] no pointer (0x226 over here) + * + * RETURNS + * LPXXXXX pointer to struct containing a func addr at offset 8 + * or NULL at failure. + */ +LPVOID WINAPI SHFind_InitMenuPopup (HMENU hMenu, HWND hWndParent, DWORD w, DWORD x) +{ FIXME("hmenu=%p hwnd=%p 0x%08lx 0x%08lx stub\n", + hMenu,hWndParent,w,x); + return NULL; /* this is supposed to be a pointer */ +} + +/************************************************************************* + * Shell_MergeMenus [SHELL32.67] + * + */ +BOOL _SHIsMenuSeparator(HMENU hm, int i) +{ + MENUITEMINFOW mii; + + mii.cbSize = sizeof(MENUITEMINFOW); + mii.fMask = MIIM_TYPE; + mii.cch = 0; /* WARNING: We MUST initialize it to 0*/ + if (!GetMenuItemInfoW(hm, i, TRUE, &mii)) + { + return(FALSE); + } + + if (mii.fType & MFT_SEPARATOR) + { + return(TRUE); + } + + return(FALSE); +} + +/**********************************************************************/ + +HRESULT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags) +{ int nItem; + HMENU hmSubMenu; + BOOL bAlreadySeparated; + MENUITEMINFOW miiSrc; + WCHAR szName[256]; + UINT uTemp, uIDMax = uIDAdjust; + + TRACE("hmenu1=%p hmenu2=%p 0x%04x 0x%04x 0x%04x 0x%04lx\n", + hmDst, hmSrc, uInsert, uIDAdjust, uIDAdjustMax, uFlags); + + if (!hmDst || !hmSrc) + { return uIDMax; + } + + nItem = GetMenuItemCount(hmDst); + + if (uInsert >= (UINT)nItem) /* insert position inside menu? */ + { + uInsert = (UINT)nItem; /* append on the end */ + bAlreadySeparated = TRUE; + } + else + { + bAlreadySeparated = _SHIsMenuSeparator(hmDst, uInsert); + } + + if ((uFlags & MM_ADDSEPARATOR) && !bAlreadySeparated) + { + /* Add a separator between the menus */ + InsertMenuA(hmDst, uInsert, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + bAlreadySeparated = TRUE; + } + + + /* Go through the menu items and clone them*/ + for (nItem = GetMenuItemCount(hmSrc) - 1; nItem >= 0; nItem--) + { + miiSrc.cbSize = sizeof(MENUITEMINFOW); + miiSrc.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_TYPE | MIIM_DATA; + + /* We need to reset this every time through the loop in case menus DON'T have IDs*/ + miiSrc.fType = MFT_STRING; + miiSrc.dwTypeData = szName; + miiSrc.dwItemData = 0; + miiSrc.cch = sizeof(szName)/sizeof(WCHAR); + + if (!GetMenuItemInfoW(hmSrc, nItem, TRUE, &miiSrc)) + { + continue; + } + +/* TRACE("found menu=0x%04x %s id=0x%04x mask=0x%08x smenu=0x%04x\n", hmSrc, debugstr_a(miiSrc.dwTypeData), miiSrc.wID, miiSrc.fMask, miiSrc.hSubMenu); +*/ + if (miiSrc.fType & MFT_SEPARATOR) + { + /* This is a separator; don't put two of them in a row */ + if (bAlreadySeparated) + continue; + + bAlreadySeparated = TRUE; + } + else if (miiSrc.hSubMenu) + { + if (uFlags & MM_SUBMENUSHAVEIDS) + { + miiSrc.wID += uIDAdjust; /* add uIDAdjust to the ID */ + + if (miiSrc.wID > uIDAdjustMax) /* skip ID's higher uIDAdjustMax */ + continue; + + if (uIDMax <= miiSrc.wID) /* remember the highest ID */ + uIDMax = miiSrc.wID + 1; + } + else + { + miiSrc.fMask &= ~MIIM_ID; /* Don't set IDs for submenus that didn't have them already */ + } + hmSubMenu = miiSrc.hSubMenu; + + miiSrc.hSubMenu = CreatePopupMenu(); + + if (!miiSrc.hSubMenu) return(uIDMax); + + uTemp = Shell_MergeMenus(miiSrc.hSubMenu, hmSubMenu, 0, uIDAdjust, uIDAdjustMax, uFlags & MM_SUBMENUSHAVEIDS); + + if (uIDMax <= uTemp) + uIDMax = uTemp; + + bAlreadySeparated = FALSE; + } + else /* normal menu item */ + { + miiSrc.wID += uIDAdjust; /* add uIDAdjust to the ID */ + + if (miiSrc.wID > uIDAdjustMax) /* skip ID's higher uIDAdjustMax */ + continue; + + if (uIDMax <= miiSrc.wID) /* remember the highest ID */ + uIDMax = miiSrc.wID + 1; + + bAlreadySeparated = FALSE; + } + +/* TRACE("inserting menu=0x%04x %s id=0x%04x mask=0x%08x smenu=0x%04x\n", hmDst, debugstr_a(miiSrc.dwTypeData), miiSrc.wID, miiSrc.fMask, miiSrc.hSubMenu); +*/ + if (!InsertMenuItemW(hmDst, uInsert, TRUE, &miiSrc)) + { + return(uIDMax); + } + } + + /* Ensure the correct number of separators at the beginning of the + inserted menu items*/ + if (uInsert == 0) + { + if (bAlreadySeparated) + { + DeleteMenu(hmDst, uInsert, MF_BYPOSITION); + } + } + else + { + if (_SHIsMenuSeparator(hmDst, uInsert-1)) + { + if (bAlreadySeparated) + { + DeleteMenu(hmDst, uInsert, MF_BYPOSITION); + } + } + else + { + if ((uFlags & MM_ADDSEPARATOR) && !bAlreadySeparated) + { + /* Add a separator between the menus*/ + InsertMenuW(hmDst, uInsert, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + } + } + } + return(uIDMax); +} diff --git a/reactos/lib/shell32/shlview.c b/reactos/lib/shell32/shlview.c new file mode 100644 index 00000000000..6c650802be0 --- /dev/null +++ b/reactos/lib/shell32/shlview.c @@ -0,0 +1,2406 @@ +/* + * ShellView + * + * Copyright 1998,1999 + * + * This is the view visualizing the data provied by the shellfolder. + * No direct access to data from pidls should be done from here. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * FIXME: The order by part of the background context menu should be + * buily according to the columns shown. + * + * FIXME: Load/Save the view state from/into the stream provied by + * the ShellBrowser + * + * FIXME: CheckToolbar: handle the "new folder" and "folder up" button + * + * FIXME: ShellView_FillList: consider sort orders + * + * FIXME: implement the drag and drop in the old (msg-based) way + * + * FIXME: when the ShellView_WndProc gets a WM_NCDESTROY should we do a + * Release() ??? + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "windef.h" +#include "winerror.h" +#include "winbase.h" +#include "winnls.h" +#include "objbase.h" +#include "servprov.h" +#include "shlguid.h" +#include "wingdi.h" +#include "winuser.h" +#include "shlobj.h" +#include "undocshell.h" +#include "shresdef.h" +#include "wine/debug.h" + +#include "docobj.h" +#include "pidl.h" +#include "shell32_main.h" +#include "shellfolder.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +typedef struct +{ BOOL bIsAscending; + INT nHeaderID; + INT nLastHeaderID; +}LISTVIEW_SORT_INFO, *LPLISTVIEW_SORT_INFO; + +typedef struct +{ + IShellViewVtbl* lpVtbl; + DWORD ref; + IOleCommandTargetVtbl* lpvtblOleCommandTarget; + IDropTargetVtbl* lpvtblDropTarget; + IDropSourceVtbl* lpvtblDropSource; + IViewObjectVtbl* lpvtblViewObject; + IShellFolder* pSFParent; + IShellFolder2* pSF2Parent; + IShellBrowser* pShellBrowser; + ICommDlgBrowser* pCommDlgBrowser; + HWND hWnd; /* SHELLDLL_DefView */ + HWND hWndList; /* ListView control */ + HWND hWndParent; + FOLDERSETTINGS FolderSettings; + HMENU hMenu; + UINT uState; + UINT cidl; + LPITEMIDLIST *apidl; + LISTVIEW_SORT_INFO ListViewSortInfo; + ULONG hNotify; /* change notification handle */ + HANDLE hAccel; +} IShellViewImpl; + +static struct IShellViewVtbl svvt; + +static struct IOleCommandTargetVtbl ctvt; +#define _IOleCommandTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblOleCommandTarget))) +#define _ICOM_THIS_From_IOleCommandTarget(class, name) class* This = (class*)(((char*)name)-_IOleCommandTarget_Offset); + +static struct IDropTargetVtbl dtvt; +#define _IDropTarget_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblDropTarget))) +#define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset); + +static struct IDropSourceVtbl dsvt; +#define _IDropSource_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblDropSource))) +#define _ICOM_THIS_From_IDropSource(class, name) class* This = (class*)(((char*)name)-_IDropSource_Offset); + +static struct IViewObjectVtbl vovt; +#define _IViewObject_Offset ((int)(&(((IShellViewImpl*)0)->lpvtblViewObject))) +#define _ICOM_THIS_From_IViewObject(class, name) class* This = (class*)(((char*)name)-_IViewObject_Offset); + +/* ListView Header ID's */ +#define LISTVIEW_COLUMN_NAME 0 +#define LISTVIEW_COLUMN_SIZE 1 +#define LISTVIEW_COLUMN_TYPE 2 +#define LISTVIEW_COLUMN_TIME 3 +#define LISTVIEW_COLUMN_ATTRIB 4 + +/*menu items */ +#define IDM_VIEW_FILES (FCIDM_SHVIEWFIRST + 0x500) +#define IDM_VIEW_IDW (FCIDM_SHVIEWFIRST + 0x501) +#define IDM_MYFILEITEM (FCIDM_SHVIEWFIRST + 0x502) + +#define ID_LISTVIEW 2000 + +#define SHV_CHANGE_NOTIFY WM_USER + 0x1111 + +/*windowsx.h */ +#define GET_WM_COMMAND_ID(wp, lp) LOWORD(wp) +#define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp) +#define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp) + +extern void WINAPI _InsertMenuItem (HMENU hmenu, UINT indexMenu, BOOL fByPosition, + UINT wID, UINT fType, LPSTR dwTypeData, UINT fState); + +/* + Items merged into the toolbar and and the filemenu +*/ +typedef struct +{ int idCommand; + int iImage; + int idButtonString; + int idMenuString; + BYTE bState; + BYTE bStyle; +} MYTOOLINFO, *LPMYTOOLINFO; + +MYTOOLINFO Tools[] = +{ +{ FCIDM_SHVIEW_BIGICON, 0, 0, IDS_VIEW_LARGE, TBSTATE_ENABLED, BTNS_BUTTON }, +{ FCIDM_SHVIEW_SMALLICON, 0, 0, IDS_VIEW_SMALL, TBSTATE_ENABLED, BTNS_BUTTON }, +{ FCIDM_SHVIEW_LISTVIEW, 0, 0, IDS_VIEW_LIST, TBSTATE_ENABLED, BTNS_BUTTON }, +{ FCIDM_SHVIEW_REPORTVIEW, 0, 0, IDS_VIEW_DETAILS, TBSTATE_ENABLED, BTNS_BUTTON }, +{ -1, 0, 0, 0, 0, 0} +}; + +typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask); + +/********************************************************** + * IShellView_Constructor + */ +IShellView * IShellView_Constructor( IShellFolder * pFolder) +{ IShellViewImpl * sv; + sv=(IShellViewImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IShellViewImpl)); + sv->ref=1; + sv->lpVtbl=&svvt; + sv->lpvtblOleCommandTarget=&ctvt; + sv->lpvtblDropTarget=&dtvt; + sv->lpvtblDropSource=&dsvt; + sv->lpvtblViewObject=&vovt; + + sv->pSFParent = pFolder; + if(pFolder) IShellFolder_AddRef(pFolder); + IShellFolder_QueryInterface(sv->pSFParent, &IID_IShellFolder2, (LPVOID*)&sv->pSF2Parent); + + TRACE("(%p)->(%p)\n",sv, pFolder); + return (IShellView *) sv; +} + +/********************************************************** + * + * ##### helperfunctions for communication with ICommDlgBrowser ##### + */ +static BOOL IsInCommDlg(IShellViewImpl * This) +{ return(This->pCommDlgBrowser != NULL); +} + +static HRESULT IncludeObject(IShellViewImpl * This, LPCITEMIDLIST pidl) +{ + HRESULT ret = S_OK; + + if ( IsInCommDlg(This) ) + { + TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl); + ret = ICommDlgBrowser_IncludeObject(This->pCommDlgBrowser, (IShellView*)This, pidl); + TRACE("--0x%08lx\n", ret); + } + return ret; +} + +static HRESULT OnDefaultCommand(IShellViewImpl * This) +{ + HRESULT ret = S_FALSE; + + if (IsInCommDlg(This)) + { + TRACE("ICommDlgBrowser::OnDefaultCommand\n"); + ret = ICommDlgBrowser_OnDefaultCommand(This->pCommDlgBrowser, (IShellView*)This); + TRACE("--\n"); + } + return ret; +} + +static HRESULT OnStateChange(IShellViewImpl * This, UINT uFlags) +{ + HRESULT ret = S_FALSE; + + if (IsInCommDlg(This)) + { + TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags); + ret = ICommDlgBrowser_OnStateChange(This->pCommDlgBrowser, (IShellView*)This, uFlags); + TRACE("--\n"); + } + return ret; +} +/********************************************************** + * set the toolbar of the filedialog buttons + * + * - activates the buttons from the shellbrowser according to + * the view state + */ +static void CheckToolbar(IShellViewImpl * This) +{ + LRESULT result; + + TRACE("\n"); + + if (IsInCommDlg(This)) + { + IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON, + FCIDM_TB_SMALLICON, (This->FolderSettings.ViewMode==FVM_LIST)? TRUE : FALSE, &result); + IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_CHECKBUTTON, + FCIDM_TB_REPORTVIEW, (This->FolderSettings.ViewMode==FVM_DETAILS)? TRUE : FALSE, &result); + IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON, + FCIDM_TB_SMALLICON, TRUE, &result); + IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_TOOLBAR, TB_ENABLEBUTTON, + FCIDM_TB_REPORTVIEW, TRUE, &result); + } +} + +/********************************************************** + * + * ##### helperfunctions for initializing the view ##### + */ +/********************************************************** + * change the style of the listview control + */ +static void SetStyle(IShellViewImpl * This, DWORD dwAdd, DWORD dwRemove) +{ + DWORD tmpstyle; + + TRACE("(%p)\n", This); + + tmpstyle = GetWindowLongA(This->hWndList, GWL_STYLE); + SetWindowLongA(This->hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove)); +} + +/********************************************************** +* ShellView_CreateList() +* +* - creates the list view window +*/ +static BOOL ShellView_CreateList (IShellViewImpl * This) +{ DWORD dwStyle, dwExStyle; + + TRACE("%p\n",This); + + dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | + LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_ALIGNLEFT | LVS_AUTOARRANGE; + dwExStyle = WS_EX_CLIENTEDGE; + + switch (This->FolderSettings.ViewMode) + { + case FVM_ICON: dwStyle |= LVS_ICON; break; + case FVM_DETAILS: dwStyle |= LVS_REPORT; break; + case FVM_SMALLICON: dwStyle |= LVS_SMALLICON; break; + case FVM_LIST: dwStyle |= LVS_LIST; break; + default: dwStyle |= LVS_LIST; break; + } + + if (This->FolderSettings.fFlags & FWF_AUTOARRANGE) dwStyle |= LVS_AUTOARRANGE; + if (This->FolderSettings.fFlags & FWF_DESKTOP) + This->FolderSettings.fFlags |= FWF_NOCLIENTEDGE | FWF_NOSCROLL; + if (This->FolderSettings.fFlags & FWF_SINGLESEL) dwStyle |= LVS_SINGLESEL; + if (This->FolderSettings.fFlags & FWF_NOCLIENTEDGE) + dwExStyle &= ~WS_EX_CLIENTEDGE; + + This->hWndList=CreateWindowExA( dwExStyle, + WC_LISTVIEWA, + NULL, + dwStyle, + 0,0,0,0, + This->hWnd, + (HMENU)ID_LISTVIEW, + shell32_hInstance, + NULL); + + if(!This->hWndList) + return FALSE; + + This->ListViewSortInfo.bIsAscending = TRUE; + This->ListViewSortInfo.nHeaderID = -1; + This->ListViewSortInfo.nLastHeaderID = -1; + + if (This->FolderSettings.fFlags & FWF_DESKTOP) { + if (0) /* FIXME: look into registry vale HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ListviewShadow and activate drop shadows */ + ListView_SetTextBkColor(This->hWndList, CLR_NONE); + else + ListView_SetTextBkColor(This->hWndList, GetSysColor(COLOR_DESKTOP)); + + ListView_SetTextColor(This->hWndList, RGB(255,255,255)); + } + + /* UpdateShellSettings(); */ + return TRUE; +} + +/********************************************************** +* ShellView_InitList() +* +* - adds all needed columns to the shellview +*/ +static BOOL ShellView_InitList(IShellViewImpl * This) +{ + LVCOLUMNA lvColumn; + SHELLDETAILS sd; + int i; + char szTemp[50]; + + TRACE("%p\n",This); + + ListView_DeleteAllItems(This->hWndList); + + lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; + lvColumn.pszText = szTemp; + + if (This->pSF2Parent) + { + for (i=0; 1; i++) + { + if (!SUCCEEDED(IShellFolder2_GetDetailsOf(This->pSF2Parent, NULL, i, &sd))) + break; + lvColumn.fmt = sd.fmt; + lvColumn.cx = sd.cxChar*8; /* chars->pixel */ + StrRetToStrNA( szTemp, 50, &sd.str, NULL); + ListView_InsertColumnA(This->hWndList, i, &lvColumn); + } + } + else + { + FIXME("no SF2\n"); + } + + ListView_SetImageList(This->hWndList, ShellSmallIconList, LVSIL_SMALL); + ListView_SetImageList(This->hWndList, ShellBigIconList, LVSIL_NORMAL); + + return TRUE; +} +/********************************************************** +* ShellView_CompareItems() +* +* NOTES +* internal, CALLBACK for DSA_Sort +*/ +static INT CALLBACK ShellView_CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData) +{ + int ret; + TRACE("pidl1=%p pidl2=%p lpsf=%p\n", lParam1, lParam2, (LPVOID) lpData); + + if(!lpData) return 0; + + ret = (SHORT) SCODE_CODE(IShellFolder_CompareIDs((LPSHELLFOLDER)lpData, 0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2)); + TRACE("ret=%i\n",ret); + return ret; +} + +/************************************************************************* + * ShellView_ListViewCompareItems + * + * Compare Function for the Listview (FileOpen Dialog) + * + * PARAMS + * lParam1 [I] the first ItemIdList to compare with + * lParam2 [I] the second ItemIdList to compare with + * lpData [I] The column ID for the header Ctrl to process + * + * RETURNS + * A negative value if the first item should precede the second, + * a positive value if the first item should follow the second, + * or zero if the two items are equivalent + * + * NOTES + * FIXME: function does what ShellView_CompareItems is supposed to do. + * unify it and figure out how to use the undocumented first parameter + * of IShellFolder_CompareIDs to do the job this function does and + * move this code to IShellFolder. + * make LISTVIEW_SORT_INFO obsolete + * the way this function works is only usable if we had only + * filesystemfolders (25/10/99 jsch) + */ +static INT CALLBACK ShellView_ListViewCompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData) +{ + INT nDiff=0; + FILETIME fd1, fd2; + char strName1[MAX_PATH], strName2[MAX_PATH]; + BOOL bIsFolder1, bIsFolder2,bIsBothFolder; + LPITEMIDLIST pItemIdList1 = (LPITEMIDLIST) lParam1; + LPITEMIDLIST pItemIdList2 = (LPITEMIDLIST) lParam2; + LISTVIEW_SORT_INFO *pSortInfo = (LPLISTVIEW_SORT_INFO) lpData; + + + bIsFolder1 = _ILIsFolder(pItemIdList1); + bIsFolder2 = _ILIsFolder(pItemIdList2); + bIsBothFolder = bIsFolder1 && bIsFolder2; + + /* When sorting between a File and a Folder, the Folder gets sorted first */ + if( (bIsFolder1 || bIsFolder2) && !bIsBothFolder) + { + nDiff = bIsFolder1 ? -1 : 1; + } + else + { + /* Sort by Time: Folders or Files can be sorted */ + + if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TIME) + { + _ILGetFileDateTime(pItemIdList1, &fd1); + _ILGetFileDateTime(pItemIdList2, &fd2); + nDiff = CompareFileTime(&fd2, &fd1); + } + /* Sort by Attribute: Folder or Files can be sorted */ + else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_ATTRIB) + { + _ILGetFileAttributes(pItemIdList1, strName1, MAX_PATH); + _ILGetFileAttributes(pItemIdList2, strName2, MAX_PATH); + nDiff = strcasecmp(strName1, strName2); + } + /* Sort by FileName: Folder or Files can be sorted */ + else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_NAME || bIsBothFolder) + { + /* Sort by Text */ + _ILSimpleGetText(pItemIdList1, strName1, MAX_PATH); + _ILSimpleGetText(pItemIdList2, strName2, MAX_PATH); + nDiff = strcasecmp(strName1, strName2); + } + /* Sort by File Size, Only valid for Files */ + else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_SIZE) + { + nDiff = (INT)(_ILGetFileSize(pItemIdList1, NULL, 0) - _ILGetFileSize(pItemIdList2, NULL, 0)); + } + /* Sort by File Type, Only valid for Files */ + else if(pSortInfo->nHeaderID == LISTVIEW_COLUMN_TYPE) + { + /* Sort by Type */ + _ILGetFileType(pItemIdList1, strName1, MAX_PATH); + _ILGetFileType(pItemIdList2, strName2, MAX_PATH); + nDiff = strcasecmp(strName1, strName2); + } + } + /* If the Date, FileSize, FileType, Attrib was the same, sort by FileName */ + + if(nDiff == 0) + { + _ILSimpleGetText(pItemIdList1, strName1, MAX_PATH); + _ILSimpleGetText(pItemIdList2, strName2, MAX_PATH); + nDiff = strcasecmp(strName1, strName2); + } + + if(!pSortInfo->bIsAscending) + { + nDiff = -nDiff; + } + + return nDiff; + +} + +/********************************************************** +* LV_FindItemByPidl() +*/ +static int LV_FindItemByPidl( + IShellViewImpl * This, + LPCITEMIDLIST pidl) +{ + LVITEMA lvItem; + ZeroMemory(&lvItem, sizeof(LVITEMA)); + lvItem.mask = LVIF_PARAM; + for(lvItem.iItem = 0; ListView_GetItemA(This->hWndList, &lvItem); lvItem.iItem++) + { + LPITEMIDLIST currentpidl = (LPITEMIDLIST) lvItem.lParam; + HRESULT hr = IShellFolder_CompareIDs(This->pSFParent, 0, pidl, currentpidl); + if(SUCCEEDED(hr) && !HRESULT_CODE(hr)) + { + return lvItem.iItem; + } + } + return -1; +} + +/********************************************************** +* LV_AddItem() +*/ +static BOOLEAN LV_AddItem(IShellViewImpl * This, LPCITEMIDLIST pidl) +{ + LVITEMA lvItem; + + TRACE("(%p)(pidl=%p)\n", This, pidl); + + ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listview item*/ + lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/ + lvItem.iItem = ListView_GetItemCount(This->hWndList); /*add the item to the end of the list*/ + lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidl)); /*set the item's data*/ + lvItem.pszText = LPSTR_TEXTCALLBACKA; /*get text on a callback basis*/ + lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/ + return (-1==ListView_InsertItemA(This->hWndList, &lvItem))? FALSE: TRUE; +} + +/********************************************************** +* LV_DeleteItem() +*/ +static BOOLEAN LV_DeleteItem(IShellViewImpl * This, LPCITEMIDLIST pidl) +{ + int nIndex; + + TRACE("(%p)(pidl=%p)\n", This, pidl); + + nIndex = LV_FindItemByPidl(This, ILFindLastID(pidl)); + return (-1==ListView_DeleteItem(This->hWndList, nIndex))? FALSE: TRUE; +} + +/********************************************************** +* LV_RenameItem() +*/ +static BOOLEAN LV_RenameItem(IShellViewImpl * This, LPCITEMIDLIST pidlOld, LPCITEMIDLIST pidlNew ) +{ + int nItem; + LVITEMA lvItem; + + TRACE("(%p)(pidlold=%p pidlnew=%p)\n", This, pidlOld, pidlNew); + + nItem = LV_FindItemByPidl(This, ILFindLastID(pidlOld)); + if ( -1 != nItem ) + { + ZeroMemory(&lvItem, sizeof(lvItem)); /* create the listview item*/ + lvItem.mask = LVIF_PARAM; /* only the pidl */ + lvItem.iItem = nItem; + ListView_GetItemA(This->hWndList, &lvItem); + + SHFree((LPITEMIDLIST)lvItem.lParam); + lvItem.mask = LVIF_PARAM; + lvItem.iItem = nItem; + lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidlNew)); /* set the item's data */ + ListView_SetItemA(This->hWndList, &lvItem); + ListView_Update(This->hWndList, nItem); + return TRUE; /* FIXME: better handling */ + } + return FALSE; +} +/********************************************************** +* ShellView_FillList() +* +* - gets the objectlist from the shellfolder +* - sorts the list +* - fills the list into the view +*/ + +static INT CALLBACK fill_list( LPVOID ptr, LPVOID arg ) +{ + LPITEMIDLIST pidl = ptr; + IShellViewImpl *This = arg; + /* in a commdlg This works as a filemask*/ + if ( IncludeObject(This, pidl)==S_OK ) LV_AddItem(This, pidl); + SHFree(pidl); + return TRUE; +} + +static HRESULT ShellView_FillList(IShellViewImpl * This) +{ + LPENUMIDLIST pEnumIDList; + LPITEMIDLIST pidl; + DWORD dwFetched; + HRESULT hRes; + HDPA hdpa; + + TRACE("%p\n",This); + + /* get the itemlist from the shfolder*/ + hRes = IShellFolder_EnumObjects(This->pSFParent,This->hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList); + if (hRes != S_OK) + { + if (hRes==S_FALSE) + return(NOERROR); + return(hRes); + } + + /* create a pointer array */ + hdpa = DPA_Create(16); + if (!hdpa) + { + return(E_OUTOFMEMORY); + } + + /* copy the items into the array*/ + while((S_OK == IEnumIDList_Next(pEnumIDList,1, &pidl, &dwFetched)) && dwFetched) + { + if (DPA_InsertPtr(hdpa, 0x7fff, pidl) == -1) + { + SHFree(pidl); + } + } + + /* sort the array */ + DPA_Sort(hdpa, ShellView_CompareItems, (LPARAM)This->pSFParent); + + /*turn the listview's redrawing off*/ + SendMessageA(This->hWndList, WM_SETREDRAW, FALSE, 0); + + DPA_DestroyCallback( hdpa, fill_list, This ); + + /*turn the listview's redrawing back on and force it to draw*/ + SendMessageA(This->hWndList, WM_SETREDRAW, TRUE, 0); + + IEnumIDList_Release(pEnumIDList); /* destroy the list*/ + + return S_OK; +} + +/********************************************************** +* ShellView_OnCreate() +*/ +static LRESULT ShellView_OnCreate(IShellViewImpl * This) +{ + IDropTarget* pdt; + SHChangeNotifyEntry ntreg; + IPersistFolder2 * ppf2 = NULL; + + TRACE("%p\n",This); + + if(ShellView_CreateList(This)) + { + if(ShellView_InitList(This)) + { + ShellView_FillList(This); + } + } + + if (SUCCEEDED(IShellFolder_CreateViewObject(This->pSFParent, This->hWnd, &IID_IDropTarget, (LPVOID*)&pdt))) + { + RegisterDragDrop(This->hWnd, pdt); + IDropTarget_Release(pdt); + } + + /* register for receiving notifications */ + IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2); + if (ppf2) + { + IPersistFolder2_GetCurFolder(ppf2, (LPITEMIDLIST*)&ntreg.pidl); + ntreg.fRecursive = TRUE; + This->hNotify = SHChangeNotifyRegister(This->hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg); + SHFree((LPITEMIDLIST)ntreg.pidl); + IPersistFolder2_Release(ppf2); + } + + This->hAccel = LoadAcceleratorsA(shell32_hInstance, "shv_accel"); + + return S_OK; +} + +/********************************************************** + * #### Handling of the menus #### + */ + +/********************************************************** +* ShellView_BuildFileMenu() +*/ +static HMENU ShellView_BuildFileMenu(IShellViewImpl * This) +{ CHAR szText[MAX_PATH]; + MENUITEMINFOA mii; + int nTools,i; + HMENU hSubMenu; + + TRACE("(%p)\n",This); + + hSubMenu = CreatePopupMenu(); + if(hSubMenu) + { /*get the number of items in our global array*/ + for(nTools = 0; Tools[nTools].idCommand != -1; nTools++){} + + /*add the menu items*/ + for(i = 0; i < nTools; i++) + { + LoadStringA(shell32_hInstance, Tools[i].idMenuString, szText, MAX_PATH); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; + + if(BTNS_SEP != Tools[i].bStyle) /* no separator*/ + { + mii.fType = MFT_STRING; + mii.fState = MFS_ENABLED; + mii.dwTypeData = szText; + mii.wID = Tools[i].idCommand; + } + else + { + mii.fType = MFT_SEPARATOR; + } + /* tack This item onto the end of the menu */ + InsertMenuItemA(hSubMenu, (UINT)-1, TRUE, &mii); + } + } + TRACE("-- return (menu=%p)\n",hSubMenu); + return hSubMenu; +} +/********************************************************** +* ShellView_MergeFileMenu() +*/ +static void ShellView_MergeFileMenu(IShellViewImpl * This, HMENU hSubMenu) +{ TRACE("(%p)->(submenu=%p) stub\n",This,hSubMenu); + + if(hSubMenu) + { /*insert This item at the beginning of the menu */ + _InsertMenuItem(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED); + _InsertMenuItem(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, "dummy45", MFS_ENABLED); + + } + TRACE("--\n"); +} + +/********************************************************** +* ShellView_MergeViewMenu() +*/ + +static void ShellView_MergeViewMenu(IShellViewImpl * This, HMENU hSubMenu) +{ MENUITEMINFOA mii; + + TRACE("(%p)->(submenu=%p)\n",This,hSubMenu); + + if(hSubMenu) + { /*add a separator at the correct position in the menu*/ + _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA; + mii.fType = MFT_STRING; + mii.dwTypeData = "View"; + mii.hSubMenu = LoadMenuA(shell32_hInstance, "MENU_001"); + InsertMenuItemA(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii); + } +} + +/********************************************************** +* ShellView_GetSelections() +* +* - fills the this->apidl list with the selected objects +* +* RETURNS +* number of selected items +*/ +static UINT ShellView_GetSelections(IShellViewImpl * This) +{ + LVITEMA lvItem; + UINT i = 0; + + if (This->apidl) + { + SHFree(This->apidl); + } + + This->cidl = ListView_GetSelectedCount(This->hWndList); + This->apidl = (LPITEMIDLIST*)SHAlloc(This->cidl * sizeof(LPITEMIDLIST)); + + TRACE("selected=%i\n", This->cidl); + + if(This->apidl) + { + TRACE("-- Items selected =%u\n", This->cidl); + + ZeroMemory(&lvItem, sizeof(lvItem)); + lvItem.mask = LVIF_STATE | LVIF_PARAM; + lvItem.stateMask = LVIS_SELECTED; + + while(ListView_GetItemA(This->hWndList, &lvItem) && (i < This->cidl)) + { + if(lvItem.state & LVIS_SELECTED) + { + This->apidl[i] = (LPITEMIDLIST)lvItem.lParam; + i++; + TRACE("-- selected Item found\n"); + } + lvItem.iItem++; + } + } + return This->cidl; + +} + +/********************************************************** + * ShellView_OpenSelectedItems() + */ +static HRESULT ShellView_OpenSelectedItems(IShellViewImpl * This) +{ + static UINT CF_IDLIST = 0; + HRESULT hr; + IDataObject* selection; + FORMATETC fetc; + STGMEDIUM stgm; + LPIDA pIDList; + LPCITEMIDLIST parent_pidl; + int i; + + if (0 == ShellView_GetSelections(This)) + { + return S_OK; + } + hr = IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, + (LPCITEMIDLIST*)This->apidl, &IID_IDataObject, + 0, (LPVOID *)&selection); + if (FAILED(hr)) + return hr; + + if (0 == CF_IDLIST) + { + CF_IDLIST = RegisterClipboardFormatA(CFSTR_SHELLIDLIST); + } + fetc.cfFormat = CF_IDLIST; + fetc.ptd = NULL; + fetc.dwAspect = DVASPECT_CONTENT; + fetc.lindex = -1; + fetc.tymed = TYMED_HGLOBAL; + + hr = IDataObject_QueryGetData(selection, &fetc); + if (FAILED(hr)) + return hr; + + hr = IDataObject_GetData(selection, &fetc, &stgm); + if (FAILED(hr)) + return hr; + + pIDList = GlobalLock(stgm.u.hGlobal); + + parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pIDList+pIDList->aoffset[0]); + for (i = pIDList->cidl; i > 0; --i) + { + LPCITEMIDLIST pidl; + SFGAOF attribs; + + pidl = (LPCITEMIDLIST)((LPBYTE)pIDList+pIDList->aoffset[i]); + + attribs = SFGAO_FOLDER; + hr = IShellFolder_GetAttributesOf(This->pSFParent, 1, &pidl, &attribs); + + if (SUCCEEDED(hr) && ! (attribs & SFGAO_FOLDER)) + { + SHELLEXECUTEINFOA shexinfo; + + shexinfo.cbSize = sizeof(SHELLEXECUTEINFOA); + shexinfo.fMask = SEE_MASK_INVOKEIDLIST; /* SEE_MASK_IDLIST is also possible. */ + shexinfo.hwnd = NULL; + shexinfo.lpVerb = NULL; + shexinfo.lpFile = NULL; + shexinfo.lpParameters = NULL; + shexinfo.lpDirectory = NULL; + shexinfo.nShow = SW_NORMAL; + shexinfo.lpIDList = ILCombine(parent_pidl, pidl); + + ShellExecuteExA(&shexinfo); /* Discard error/success info */ + + ILFree((LPITEMIDLIST)shexinfo.lpIDList); + } + } + + GlobalUnlock(stgm.u.hGlobal); + ReleaseStgMedium(&stgm); + + IDataObject_Release(selection); + + return S_OK; +} + +/********************************************************** + * ShellView_DoContextMenu() + */ +static void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL bDefault) +{ UINT uCommand; + DWORD wFlags; + HMENU hMenu; + BOOL fExplore = FALSE; + HWND hwndTree = 0; + LPCONTEXTMENU pContextMenu = NULL; + IContextMenu2 *pCM = NULL; + CMINVOKECOMMANDINFO cmi; + + TRACE("(%p)->(0x%08x 0x%08x 0x%08x) stub\n",This, x, y, bDefault); + + /* look, what's selected and create a context menu object of it*/ + if( ShellView_GetSelections(This) ) + { + IShellFolder_GetUIObjectOf( This->pSFParent, This->hWndParent, This->cidl, (LPCITEMIDLIST*)This->apidl, + (REFIID)&IID_IContextMenu, NULL, (LPVOID *)&pContextMenu); + + if(pContextMenu) + { + TRACE("-- pContextMenu\n"); + hMenu = CreatePopupMenu(); + + if( hMenu ) + { + /* See if we are in Explore or Open mode. If the browser's tree is present, we are in Explore mode.*/ + if(SUCCEEDED(IShellBrowser_GetControlWindow(This->pShellBrowser,FCW_TREE, &hwndTree)) && hwndTree) + { + TRACE("-- explore mode\n"); + fExplore = TRUE; + } + + /* build the flags depending on what we can do with the selected item */ + wFlags = CMF_NORMAL | (This->cidl != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0); + + /* let the ContextMenu merge its items in */ + if (SUCCEEDED(IContextMenu_QueryContextMenu( pContextMenu, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, wFlags ))) + { + if (This->FolderSettings.fFlags & FWF_DESKTOP) + SetMenuDefaultItem(hMenu, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND); + + if( bDefault ) + { + TRACE("-- get menu default command\n"); + uCommand = GetMenuDefaultItem(hMenu, FALSE, GMDI_GOINTOPOPUPS); + } + else + { + TRACE("-- track popup\n"); + uCommand = TrackPopupMenu( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL); + } + + if(uCommand > 0) + { + TRACE("-- uCommand=%u\n", uCommand); + if (uCommand==FCIDM_SHVIEW_OPEN && IsInCommDlg(This)) + { + TRACE("-- dlg: OnDefaultCommand\n"); + if (FAILED(OnDefaultCommand(This))) + { + ShellView_OpenSelectedItems(This); + } + } + else + { + TRACE("-- explore -- invoke command\n"); + ZeroMemory(&cmi, sizeof(cmi)); + cmi.cbSize = sizeof(cmi); + cmi.hwnd = This->hWndParent; /* this window has to answer CWM_GETISHELLBROWSER */ + cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand); + IContextMenu_InvokeCommand(pContextMenu, &cmi); + } + } + DestroyMenu(hMenu); + } + } + if (pContextMenu) + IContextMenu_Release(pContextMenu); + } + } + else /* background context menu */ + { + hMenu = CreatePopupMenu(); + + pCM = ISvBgCm_Constructor(This->pSFParent); + IContextMenu2_QueryContextMenu(pCM, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0); + + uCommand = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL); + DestroyMenu(hMenu); + + TRACE("-- (%p)->(uCommand=0x%08x )\n",This, uCommand); + + ZeroMemory(&cmi, sizeof(cmi)); + cmi.cbSize = sizeof(cmi); + cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand); + cmi.hwnd = This->hWndParent; + IContextMenu2_InvokeCommand(pCM, &cmi); + + IContextMenu2_Release(pCM); + } +} + +/********************************************************** + * ##### message handling ##### + */ + +/********************************************************** +* ShellView_OnSize() +*/ +static LRESULT ShellView_OnSize(IShellViewImpl * This, WORD wWidth, WORD wHeight) +{ + TRACE("%p width=%u height=%u\n",This, wWidth,wHeight); + + /*resize the ListView to fit our window*/ + if(This->hWndList) + { + MoveWindow(This->hWndList, 0, 0, wWidth, wHeight, TRUE); + } + + return S_OK; +} +/********************************************************** +* ShellView_OnDeactivate() +* +* NOTES +* internal +*/ +static void ShellView_OnDeactivate(IShellViewImpl * This) +{ + TRACE("%p\n",This); + + if(This->uState != SVUIA_DEACTIVATE) + { + if(This->hMenu) + { + IShellBrowser_SetMenuSB(This->pShellBrowser,0, 0, 0); + IShellBrowser_RemoveMenusSB(This->pShellBrowser,This->hMenu); + DestroyMenu(This->hMenu); + This->hMenu = 0; + } + + This->uState = SVUIA_DEACTIVATE; + } +} + +/********************************************************** +* ShellView_OnActivate() +*/ +static LRESULT ShellView_OnActivate(IShellViewImpl * This, UINT uState) +{ OLEMENUGROUPWIDTHS omw = { {0, 0, 0, 0, 0, 0} }; + MENUITEMINFOA mii; + CHAR szText[MAX_PATH]; + + TRACE("%p uState=%x\n",This,uState); + + /*don't do anything if the state isn't really changing */ + if(This->uState == uState) + { + return S_OK; + } + + ShellView_OnDeactivate(This); + + /*only do This if we are active */ + if(uState != SVUIA_DEACTIVATE) + { + /*merge the menus */ + This->hMenu = CreateMenu(); + + if(This->hMenu) + { + IShellBrowser_InsertMenusSB(This->pShellBrowser, This->hMenu, &omw); + TRACE("-- after fnInsertMenusSB\n"); + + /*build the top level menu get the menu item's text*/ + strcpy(szText,"dummy 31"); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE; + mii.fType = MFT_STRING; + mii.fState = MFS_ENABLED; + mii.dwTypeData = szText; + mii.hSubMenu = ShellView_BuildFileMenu(This); + + /*insert our menu into the menu bar*/ + if(mii.hSubMenu) + { + InsertMenuItemA(This->hMenu, FCIDM_MENU_HELP, FALSE, &mii); + } + + /*get the view menu so we can merge with it*/ + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_SUBMENU; + + if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_VIEW, FALSE, &mii)) + { + ShellView_MergeViewMenu(This, mii.hSubMenu); + } + + /*add the items that should only be added if we have the focus*/ + if(SVUIA_ACTIVATE_FOCUS == uState) + { + /*get the file menu so we can merge with it */ + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_SUBMENU; + + if(GetMenuItemInfoA(This->hMenu, FCIDM_MENU_FILE, FALSE, &mii)) + { + ShellView_MergeFileMenu(This, mii.hSubMenu); + } + } + TRACE("-- before fnSetMenuSB\n"); + IShellBrowser_SetMenuSB(This->pShellBrowser, This->hMenu, 0, This->hWnd); + } + } + This->uState = uState; + TRACE("--\n"); + return S_OK; +} + +/********************************************************** +* ShellView_OnSetFocus() +* +*/ +static LRESULT ShellView_OnSetFocus(IShellViewImpl * This) +{ + TRACE("%p\n",This); + + /* Tell the browser one of our windows has received the focus. This + should always be done before merging menus (OnActivate merges the + menus) if one of our windows has the focus.*/ + + IShellBrowser_OnViewWindowActive(This->pShellBrowser,(IShellView*) This); + ShellView_OnActivate(This, SVUIA_ACTIVATE_FOCUS); + + /* Set the focus to the listview */ + SetFocus(This->hWndList); + + /* Notify the ICommDlgBrowser interface */ + OnStateChange(This,CDBOSC_SETFOCUS); + + return 0; +} + +/********************************************************** +* ShellView_OnKillFocus() +*/ +static LRESULT ShellView_OnKillFocus(IShellViewImpl * This) +{ + TRACE("(%p) stub\n",This); + + ShellView_OnActivate(This, SVUIA_ACTIVATE_NOFOCUS); + /* Notify the ICommDlgBrowser */ + OnStateChange(This,CDBOSC_KILLFOCUS); + + return 0; +} + +/********************************************************** +* ShellView_OnCommand() +* +* NOTES +* the CmdID's are the ones from the context menu +*/ +static LRESULT ShellView_OnCommand(IShellViewImpl * This,DWORD dwCmdID, DWORD dwCmd, HWND hwndCmd) +{ + TRACE("(%p)->(0x%08lx 0x%08lx %p) stub\n",This, dwCmdID, dwCmd, hwndCmd); + + switch(dwCmdID) + { + case FCIDM_SHVIEW_SMALLICON: + This->FolderSettings.ViewMode = FVM_SMALLICON; + SetStyle (This, LVS_SMALLICON, LVS_TYPEMASK); + CheckToolbar(This); + break; + + case FCIDM_SHVIEW_BIGICON: + This->FolderSettings.ViewMode = FVM_ICON; + SetStyle (This, LVS_ICON, LVS_TYPEMASK); + CheckToolbar(This); + break; + + case FCIDM_SHVIEW_LISTVIEW: + This->FolderSettings.ViewMode = FVM_LIST; + SetStyle (This, LVS_LIST, LVS_TYPEMASK); + CheckToolbar(This); + break; + + case FCIDM_SHVIEW_REPORTVIEW: + This->FolderSettings.ViewMode = FVM_DETAILS; + SetStyle (This, LVS_REPORT, LVS_TYPEMASK); + CheckToolbar(This); + break; + + /* the menu-ID's for sorting are 0x30... see shrec.rc */ + case 0x30: + case 0x31: + case 0x32: + case 0x33: + This->ListViewSortInfo.nHeaderID = (LPARAM) (dwCmdID - 0x30); + This->ListViewSortInfo.bIsAscending = TRUE; + This->ListViewSortInfo.nLastHeaderID = This->ListViewSortInfo.nHeaderID; + ListView_SortItems(This->hWndList, ShellView_ListViewCompareItems, (LPARAM) (&(This->ListViewSortInfo))); + break; + + default: + TRACE("-- COMMAND 0x%04lx unhandled\n", dwCmdID); + } + return 0; +} + +/********************************************************** +* ShellView_OnNotify() +*/ + +static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpnmh) +{ LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lpnmh; + NMLVDISPINFOA *lpdi = (NMLVDISPINFOA *)lpnmh; + LPITEMIDLIST pidl; + + TRACE("%p CtlID=%u lpnmh->code=%x\n",This,CtlID,lpnmh->code); + + switch(lpnmh->code) + { + case NM_SETFOCUS: + TRACE("-- NM_SETFOCUS %p\n",This); + ShellView_OnSetFocus(This); + break; + + case NM_KILLFOCUS: + TRACE("-- NM_KILLFOCUS %p\n",This); + ShellView_OnDeactivate(This); + /* Notify the ICommDlgBrowser interface */ + OnStateChange(This,CDBOSC_KILLFOCUS); + break; + + case NM_CUSTOMDRAW: + TRACE("-- NM_CUSTOMDRAW %p\n",This); + return CDRF_DODEFAULT; + + case NM_RELEASEDCAPTURE: + TRACE("-- NM_RELEASEDCAPTURE %p\n",This); + break; + + case NM_CLICK: + TRACE("-- NM_CLICK %p\n",This); + break; + + case NM_RCLICK: + TRACE("-- NM_RCLICK %p\n",This); + break; + + case HDN_ENDTRACKA: + TRACE("-- HDN_ENDTRACKA %p\n",This); + /*nColumn1 = ListView_GetColumnWidth(This->hWndList, 0); + nColumn2 = ListView_GetColumnWidth(This->hWndList, 1);*/ + break; + + case LVN_DELETEITEM: + TRACE("-- LVN_DELETEITEM %p\n",This); + SHFree((LPITEMIDLIST)lpnmlv->lParam); /*delete the pidl because we made a copy of it*/ + break; + + case LVN_DELETEALLITEMS: + TRACE("-- LVN_DELETEALLITEMS %p\n",This); + return FALSE; + + case LVN_INSERTITEM: + TRACE("-- LVN_INSERTITEM (STUB)%p\n",This); + break; + + case LVN_ITEMACTIVATE: + TRACE("-- LVN_ITEMACTIVATE %p\n",This); + OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */ + ShellView_DoContextMenu(This, 0, 0, TRUE); + break; + + case LVN_COLUMNCLICK: + This->ListViewSortInfo.nHeaderID = lpnmlv->iSubItem; + if(This->ListViewSortInfo.nLastHeaderID == This->ListViewSortInfo.nHeaderID) + { + This->ListViewSortInfo.bIsAscending = !This->ListViewSortInfo.bIsAscending; + } + else + { + This->ListViewSortInfo.bIsAscending = TRUE; + } + This->ListViewSortInfo.nLastHeaderID = This->ListViewSortInfo.nHeaderID; + + ListView_SortItems(lpnmlv->hdr.hwndFrom, ShellView_ListViewCompareItems, (LPARAM) (&(This->ListViewSortInfo))); + break; + + case LVN_GETDISPINFOA: + case LVN_GETDISPINFOW: + TRACE("-- LVN_GETDISPINFO %p\n",This); + pidl = (LPITEMIDLIST)lpdi->item.lParam; + + if(lpdi->item.mask & LVIF_TEXT) /* text requested */ + { + if (This->pSF2Parent) + { + SHELLDETAILS sd; + IShellFolder2_GetDetailsOf(This->pSF2Parent, pidl, lpdi->item.iSubItem, &sd); + if (lpnmh->code == LVN_GETDISPINFOA) + { + StrRetToStrNA( lpdi->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL); + TRACE("-- text=%s\n",lpdi->item.pszText); + } + else /* LVN_GETDISPINFOW */ + { + StrRetToStrNW( ((NMLVDISPINFOW *)lpdi)->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL); + TRACE("-- text=%s\n",debugstr_w((WCHAR*)(lpdi->item.pszText))); + } + } + else + { + FIXME("no SF2\n"); + } + } + if(lpdi->item.mask & LVIF_IMAGE) /* image requested */ + { + lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(This->pSFParent, pidl, 0); + } + break; + + case LVN_ITEMCHANGED: + TRACE("-- LVN_ITEMCHANGED %p\n",This); + OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */ + break; + + case LVN_BEGINDRAG: + case LVN_BEGINRDRAG: + TRACE("-- LVN_BEGINDRAG\n"); + + if (ShellView_GetSelections(This)) + { + IDataObject * pda; + DWORD dwAttributes = SFGAO_CANLINK; + DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE; + + if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, &IID_IDataObject,0,(LPVOID *)&pda))) + { + IDropSource * pds = (IDropSource*)&(This->lpvtblDropSource); /* own DropSource interface */ + + if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, (LPCITEMIDLIST*)This->apidl, &dwAttributes))) + { + if (dwAttributes & SFGAO_CANLINK) + { + dwEffect |= DROPEFFECT_LINK; + } + } + + if (pds) + { + DWORD dwEffect; + DoDragDrop(pda, pds, dwEffect, &dwEffect); + } + IDataObject_Release(pda); + } + } + break; + + case LVN_BEGINLABELEDITA: + { + DWORD dwAttr = SFGAO_CANRENAME; + pidl = (LPITEMIDLIST)lpdi->item.lParam; + + TRACE("-- LVN_BEGINLABELEDITA %p\n",This); + + IShellFolder_GetAttributesOf(This->pSFParent, 1, (LPCITEMIDLIST*)&pidl, &dwAttr); + if (SFGAO_CANRENAME & dwAttr) + { + return FALSE; + } + return TRUE; + } + break; + + case LVN_ENDLABELEDITA: + { + TRACE("-- LVN_ENDLABELEDITA %p\n",This); + if (lpdi->item.pszText) + { + HRESULT hr; + WCHAR wszNewName[MAX_PATH]; + LVITEMA lvItem; + + ZeroMemory(&lvItem, sizeof(LVITEMA)); + lvItem.iItem = lpdi->item.iItem; + lvItem.mask = LVIF_PARAM; + ListView_GetItemA(This->hWndList, &lvItem); + + pidl = (LPITEMIDLIST)lpdi->item.lParam; + if (!MultiByteToWideChar( CP_ACP, 0, lpdi->item.pszText, -1, wszNewName, MAX_PATH )) + wszNewName[MAX_PATH-1] = 0; + hr = IShellFolder_SetNameOf(This->pSFParent, 0, pidl, wszNewName, SHGDN_INFOLDER, &pidl); + + if(SUCCEEDED(hr) && pidl) + { + lvItem.mask = LVIF_PARAM; + lvItem.lParam = (LPARAM)pidl; + ListView_SetItemA(This->hWndList, &lvItem); + return TRUE; + } + } + return FALSE; + } + break; + + case LVN_KEYDOWN: + { + /* MSG msg; + msg.hwnd = This->hWnd; + msg.message = WM_KEYDOWN; + msg.wParam = plvKeyDown->wVKey; + msg.lParam = 0; + msg.time = 0; + msg.pt = 0;*/ + + LPNMLVKEYDOWN plvKeyDown = (LPNMLVKEYDOWN) lpnmh; + + /* initiate a rename of the selected file or directory */ + if(plvKeyDown->wVKey == VK_F2) + { + /* see how many files are selected */ + int i = ListView_GetSelectedCount(This->hWndList); + + /* get selected item */ + if(i == 1) + { + /* get selected item */ + i = ListView_GetNextItem(This->hWndList, -1, + LVNI_SELECTED); + + ListView_EnsureVisible(This->hWndList, i, 0); + ListView_EditLabelA(This->hWndList, i); + } + } +#if 0 + TranslateAccelerator(This->hWnd, This->hAccel, &msg) +#endif + else if(plvKeyDown->wVKey == VK_DELETE) + { + UINT i; + int item_index; + LVITEMA item; + LPITEMIDLIST* pItems; + ISFHelper *psfhlp; + + IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, + (LPVOID*)&psfhlp); + + if(!(i = ListView_GetSelectedCount(This->hWndList))) + break; + + /* allocate memory for the pidl array */ + pItems = HeapAlloc(GetProcessHeap(), 0, + sizeof(LPITEMIDLIST) * i); + + /* retrieve all selected items */ + i = 0; + item_index = -1; + while(ListView_GetSelectedCount(This->hWndList) > i) + { + /* get selected item */ + item_index = ListView_GetNextItem(This->hWndList, + item_index, LVNI_SELECTED); + item.iItem = item_index; + item.mask |= LVIF_PARAM; + ListView_GetItemA(This->hWndList, &item); + + /* get item pidl */ + pItems[i] = (LPITEMIDLIST)item.lParam; + + i++; + } + + /* perform the item deletion */ + ISFHelper_DeleteItems(psfhlp, i, (LPCITEMIDLIST*)pItems); + + /* free pidl array memory */ + HeapFree(GetProcessHeap(), 0, pItems); + } + else + FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown->wVKey); + } + break; + + default: + TRACE("-- %p WM_COMMAND %x unhandled\n", This, lpnmh->code); + break; + } + return 0; +} + +/********************************************************** +* ShellView_OnChange() +*/ + +static LRESULT ShellView_OnChange(IShellViewImpl * This, LPITEMIDLIST * Pidls, LONG wEventId) +{ + + TRACE("(%p)(%p,%p,0x%08lx)\n", This, Pidls[0], Pidls[1], wEventId); + switch(wEventId) + { + case SHCNE_MKDIR: + case SHCNE_CREATE: + LV_AddItem(This, Pidls[0]); + break; + case SHCNE_RMDIR: + case SHCNE_DELETE: + LV_DeleteItem(This, Pidls[0]); + break; + case SHCNE_RENAMEFOLDER: + case SHCNE_RENAMEITEM: + LV_RenameItem(This, Pidls[0], Pidls[1]); + break; + case SHCNE_UPDATEITEM: + break; + } + return TRUE; +} +/********************************************************** +* ShellView_WndProc +*/ + +static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) +{ + IShellViewImpl * pThis = (IShellViewImpl*)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + LPCREATESTRUCTA lpcs; + + TRACE("(hwnd=%p msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam); + + switch (uMessage) + { + case WM_NCCREATE: + lpcs = (LPCREATESTRUCTA)lParam; + pThis = (IShellViewImpl*)(lpcs->lpCreateParams); + SetWindowLongPtrW(hWnd, GWLP_USERDATA, (ULONG_PTR)pThis); + pThis->hWnd = hWnd; /*set the window handle*/ + break; + + case WM_SIZE: return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam)); + case WM_SETFOCUS: return ShellView_OnSetFocus(pThis); + case WM_KILLFOCUS: return ShellView_OnKillFocus(pThis); + case WM_CREATE: return ShellView_OnCreate(pThis); + case WM_ACTIVATE: return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS); + case WM_NOTIFY: return ShellView_OnNotify(pThis,(UINT)wParam, (LPNMHDR)lParam); + case WM_COMMAND: return ShellView_OnCommand(pThis, + GET_WM_COMMAND_ID(wParam, lParam), + GET_WM_COMMAND_CMD(wParam, lParam), + GET_WM_COMMAND_HWND(wParam, lParam)); + case SHV_CHANGE_NOTIFY: return ShellView_OnChange(pThis, (LPITEMIDLIST*)wParam, (LONG)lParam); + + case WM_CONTEXTMENU: ShellView_DoContextMenu(pThis, LOWORD(lParam), HIWORD(lParam), FALSE); + return 0; + + case WM_SHOWWINDOW: UpdateWindow(pThis->hWndList); + break; + + case WM_GETDLGCODE: return SendMessageA(pThis->hWndList,uMessage,0,0); + + case WM_DESTROY: + RevokeDragDrop(pThis->hWnd); + SHChangeNotifyDeregister(pThis->hNotify); + break; + + case WM_ERASEBKGND: + if ((pThis->FolderSettings.fFlags & FWF_DESKTOP) || + (pThis->FolderSettings.fFlags & FWF_TRANSPARENT)) + return 1; + break; + } + + return DefWindowProcA (hWnd, uMessage, wParam, lParam); +} +/********************************************************** +* +* +* The INTERFACE of the IShellView object +* +* +********************************************************** +* IShellView_QueryInterface +*/ +static HRESULT WINAPI IShellView_fnQueryInterface(IShellView * iface,REFIID riid, LPVOID *ppvObj) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown)) + { + *ppvObj = This; + } + else if(IsEqualIID(riid, &IID_IShellView)) + { + *ppvObj = (IShellView*)This; + } + else if(IsEqualIID(riid, &IID_IOleCommandTarget)) + { + *ppvObj = (IOleCommandTarget*)&(This->lpvtblOleCommandTarget); + } + else if(IsEqualIID(riid, &IID_IDropTarget)) + { + *ppvObj = (IDropTarget*)&(This->lpvtblDropTarget); + } + else if(IsEqualIID(riid, &IID_IDropSource)) + { + *ppvObj = (IDropSource*)&(This->lpvtblDropSource); + } + else if(IsEqualIID(riid, &IID_IViewObject)) + { + *ppvObj = (IViewObject*)&(This->lpvtblViewObject); + } + + if(*ppvObj) + { + IUnknown_AddRef( (IUnknown*)*ppvObj ); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +/********************************************************** +* IShellView_AddRef +*/ +static ULONG WINAPI IShellView_fnAddRef(IShellView * iface) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return ++(This->ref); +} +/********************************************************** +* IShellView_Release +*/ +static ULONG WINAPI IShellView_fnRelease(IShellView * iface) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + TRACE("(%p)->()\n",This); + + if (!--(This->ref)) + { + TRACE(" destroying IShellView(%p)\n",This); + + DestroyWindow(This->hWndList); + + if(This->pSFParent) + IShellFolder_Release(This->pSFParent); + + if(This->pSF2Parent) + IShellFolder2_Release(This->pSF2Parent); + + if (This->apidl) + SHFree(This->apidl); + + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->ref; +} + +/********************************************************** +* ShellView_GetWindow +*/ +static HRESULT WINAPI IShellView_fnGetWindow(IShellView * iface,HWND * phWnd) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + TRACE("(%p)\n",This); + + *phWnd = This->hWnd; + + return S_OK; +} + +static HRESULT WINAPI IShellView_fnContextSensitiveHelp(IShellView * iface,BOOL fEnterMode) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + FIXME("(%p) stub\n",This); + + return E_NOTIMPL; +} + +/********************************************************** +* IShellView_TranslateAccelerator +* +* FIXME: +* use the accel functions +*/ +static HRESULT WINAPI IShellView_fnTranslateAccelerator(IShellView * iface,LPMSG lpmsg) +{ +#if 0 + IShellViewImpl *This = (IShellViewImpl *)iface; + + FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%lx wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam); +#endif + + if ((lpmsg->message>=WM_KEYFIRST) && (lpmsg->message>=WM_KEYLAST)) + { + TRACE("-- key=0x04%x\n",lpmsg->wParam) ; + } + return S_FALSE; /* not handled */ +} + +static HRESULT WINAPI IShellView_fnEnableModeless(IShellView * iface,BOOL fEnable) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + FIXME("(%p) stub\n",This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellView_fnUIActivate(IShellView * iface,UINT uState) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + +/* + CHAR szName[MAX_PATH]; +*/ + LRESULT lResult; + int nPartArray[1] = {-1}; + + TRACE("(%p)->(state=%x) stub\n",This, uState); + + /*don't do anything if the state isn't really changing*/ + if(This->uState == uState) + { + return S_OK; + } + + /*OnActivate handles the menu merging and internal state*/ + ShellView_OnActivate(This, uState); + + /*only do This if we are active*/ + if(uState != SVUIA_DEACTIVATE) + { + +/* + GetFolderPath is not a method of IShellFolder + IShellFolder_GetFolderPath( This->pSFParent, szName, sizeof(szName) ); +*/ + /* set the number of parts */ + IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETPARTS, 1, + (LPARAM)nPartArray, &lResult); + + /* set the text for the parts */ +/* + IShellBrowser_SendControlMsg(This->pShellBrowser, FCW_STATUS, SB_SETTEXTA, + 0, (LPARAM)szName, &lResult); +*/ + } + + return S_OK; +} + +static HRESULT WINAPI IShellView_fnRefresh(IShellView * iface) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + TRACE("(%p)\n",This); + + ListView_DeleteAllItems(This->hWndList); + ShellView_FillList(This); + + return S_OK; +} + +static HRESULT WINAPI IShellView_fnCreateViewWindow( + IShellView * iface, + IShellView *lpPrevView, + LPCFOLDERSETTINGS lpfs, + IShellBrowser * psb, + RECT * prcView, + HWND *phWnd) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + WNDCLASSA wc; + *phWnd = 0; + + + TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n",This, lpPrevView,lpfs, psb, prcView, phWnd); + TRACE("-- vmode=%x flags=%x left=%li top=%li right=%li bottom=%li\n",lpfs->ViewMode, lpfs->fFlags ,prcView->left,prcView->top, prcView->right, prcView->bottom); + + /*set up the member variables*/ + This->pShellBrowser = psb; + This->FolderSettings = *lpfs; + + /*get our parent window*/ + IShellBrowser_AddRef(This->pShellBrowser); + IShellBrowser_GetWindow(This->pShellBrowser, &(This->hWndParent)); + + /* try to get the ICommDlgBrowserInterface, adds a reference !!! */ + This->pCommDlgBrowser=NULL; + if ( SUCCEEDED (IShellBrowser_QueryInterface( This->pShellBrowser, + (REFIID)&IID_ICommDlgBrowser, (LPVOID*) &This->pCommDlgBrowser))) + { + TRACE("-- CommDlgBrowser\n"); + } + + /*if our window class has not been registered, then do so*/ + if(!GetClassInfoA(shell32_hInstance, SV_CLASS_NAME, &wc)) + { + ZeroMemory(&wc, sizeof(wc)); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC) ShellView_WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = shell32_hInstance; + wc.hIcon = 0; + wc.hCursor = LoadCursorA (0, (LPSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); + wc.lpszMenuName = NULL; + wc.lpszClassName = SV_CLASS_NAME; + + if(!RegisterClassA(&wc)) + return E_FAIL; + } + + *phWnd = CreateWindowExA(0, + SV_CLASS_NAME, + NULL, + WS_CHILD | WS_VISIBLE | WS_TABSTOP, + prcView->left, + prcView->top, + prcView->right - prcView->left, + prcView->bottom - prcView->top, + This->hWndParent, + 0, + shell32_hInstance, + (LPVOID)This); + + CheckToolbar(This); + + if(!*phWnd) return E_FAIL; + + return S_OK; +} + +static HRESULT WINAPI IShellView_fnDestroyViewWindow(IShellView * iface) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + TRACE("(%p)\n",This); + + /*Make absolutely sure all our UI is cleaned up.*/ + IShellView_UIActivate((IShellView*)This, SVUIA_DEACTIVATE); + + if(This->hMenu) + { + DestroyMenu(This->hMenu); + } + + DestroyWindow(This->hWnd); + if(This->pShellBrowser) IShellBrowser_Release(This->pShellBrowser); + if(This->pCommDlgBrowser) ICommDlgBrowser_Release(This->pCommDlgBrowser); + + + return S_OK; +} + +static HRESULT WINAPI IShellView_fnGetCurrentInfo(IShellView * iface, LPFOLDERSETTINGS lpfs) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + TRACE("(%p)->(%p) vmode=%x flags=%x\n",This, lpfs, + This->FolderSettings.ViewMode, This->FolderSettings.fFlags); + + if (!lpfs) return E_INVALIDARG; + + *lpfs = This->FolderSettings; + return NOERROR; +} + +static HRESULT WINAPI IShellView_fnAddPropertySheetPages(IShellView * iface, DWORD dwReserved,LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + FIXME("(%p) stub\n",This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellView_fnSaveViewState(IShellView * iface) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + FIXME("(%p) stub\n",This); + + return S_OK; +} + +static HRESULT WINAPI IShellView_fnSelectItem( + IShellView * iface, + LPCITEMIDLIST pidl, + UINT uFlags) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + int i; + + TRACE("(%p)->(pidl=%p, 0x%08x) stub\n",This, pidl, uFlags); + + i = LV_FindItemByPidl(This, pidl); + + if (i != -1) + { + LVITEMA lvItem; + + if(uFlags & SVSI_ENSUREVISIBLE) + ListView_EnsureVisible(This->hWndList, i, 0); + + ZeroMemory(&lvItem, sizeof(LVITEMA)); + lvItem.mask = LVIF_STATE; + lvItem.iItem = 0; + + while(ListView_GetItemA(This->hWndList, &lvItem)) + { + if (lvItem.iItem == i) + { + if (uFlags & SVSI_SELECT) + lvItem.state |= LVIS_SELECTED; + else + lvItem.state &= ~LVIS_SELECTED; + + if(uFlags & SVSI_FOCUSED) + lvItem.state &= ~LVIS_FOCUSED; + } + else + { + if (uFlags & SVSI_DESELECTOTHERS) + lvItem.state &= ~LVIS_SELECTED; + } + ListView_SetItemA(This->hWndList, &lvItem); + lvItem.iItem++; + } + + + if(uFlags & SVSI_EDIT) + ListView_EditLabelA(This->hWndList, i); + + } + return S_OK; +} + +static HRESULT WINAPI IShellView_fnGetItemObject(IShellView * iface, UINT uItem, REFIID riid, LPVOID *ppvOut) +{ + IShellViewImpl *This = (IShellViewImpl *)iface; + + TRACE("(%p)->(uItem=0x%08x,\n\tIID=%s, ppv=%p)\n",This, uItem, debugstr_guid(riid), ppvOut); + + *ppvOut = NULL; + + switch(uItem) + { + case SVGIO_BACKGROUND: + *ppvOut = ISvBgCm_Constructor(This->pSFParent); + break; + + case SVGIO_SELECTION: + ShellView_GetSelections(This); + IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, riid, 0, ppvOut); + break; + } + TRACE("-- (%p)->(interface=%p)\n",This, *ppvOut); + + if(!*ppvOut) return E_OUTOFMEMORY; + + return S_OK; +} + +static struct IShellViewVtbl svvt = +{ + IShellView_fnQueryInterface, + IShellView_fnAddRef, + IShellView_fnRelease, + IShellView_fnGetWindow, + IShellView_fnContextSensitiveHelp, + IShellView_fnTranslateAccelerator, + IShellView_fnEnableModeless, + IShellView_fnUIActivate, + IShellView_fnRefresh, + IShellView_fnCreateViewWindow, + IShellView_fnDestroyViewWindow, + IShellView_fnGetCurrentInfo, + IShellView_fnAddPropertySheetPages, + IShellView_fnSaveViewState, + IShellView_fnSelectItem, + IShellView_fnGetItemObject +}; + + +/********************************************************** + * ISVOleCmdTarget_QueryInterface (IUnknown) + */ +static HRESULT WINAPI ISVOleCmdTarget_QueryInterface( + IOleCommandTarget * iface, + REFIID iid, + LPVOID* ppvObj) +{ + _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface); + + return IShellFolder_QueryInterface((IShellFolder*)This, iid, ppvObj); +} + +/********************************************************** + * ISVOleCmdTarget_AddRef (IUnknown) + */ +static ULONG WINAPI ISVOleCmdTarget_AddRef( + IOleCommandTarget * iface) +{ + _ICOM_THIS_From_IOleCommandTarget(IShellFolder, iface); + + return IShellFolder_AddRef((IShellFolder*)This); +} + +/********************************************************** + * ISVOleCmdTarget_Release (IUnknown) + */ +static ULONG WINAPI ISVOleCmdTarget_Release( + IOleCommandTarget * iface) +{ + _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface); + + return IShellFolder_Release((IShellFolder*)This); +} + +/********************************************************** + * ISVOleCmdTarget_QueryStatus (IOleCommandTarget) + */ +static HRESULT WINAPI ISVOleCmdTarget_QueryStatus( + IOleCommandTarget *iface, + const GUID* pguidCmdGroup, + ULONG cCmds, + OLECMD * prgCmds, + OLECMDTEXT* pCmdText) +{ + UINT i; + _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface); + + FIXME("(%p)->(%p(%s) 0x%08lx %p %p\n", + This, pguidCmdGroup, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText); + + if (!prgCmds) + return E_POINTER; + for (i = 0; i < cCmds; i++) + { + FIXME("\tprgCmds[%d].cmdID = %ld\n", i, prgCmds[i].cmdID); + prgCmds[i].cmdf = 0; + } + return OLECMDERR_E_UNKNOWNGROUP; +} + +/********************************************************** + * ISVOleCmdTarget_Exec (IOleCommandTarget) + * + * nCmdID is the OLECMDID_* enumeration + */ +static HRESULT WINAPI ISVOleCmdTarget_Exec( + IOleCommandTarget *iface, + const GUID* pguidCmdGroup, + DWORD nCmdID, + DWORD nCmdexecopt, + VARIANT* pvaIn, + VARIANT* pvaOut) +{ + _ICOM_THIS_From_IOleCommandTarget(IShellViewImpl, iface); + + FIXME("(%p)->(\n\tTarget GUID:%s Command:0x%08lx Opt:0x%08lx %p %p)\n", + This, debugstr_guid(pguidCmdGroup), nCmdID, nCmdexecopt, pvaIn, pvaOut); + + if (IsEqualIID(pguidCmdGroup, &CGID_Explorer) && + (nCmdID == 0x29) && + (nCmdexecopt == 4) && pvaOut) + return S_OK; + if (IsEqualIID(pguidCmdGroup, &CGID_ShellDocView) && + (nCmdID == 9) && + (nCmdexecopt == 0)) + return 1; + + return OLECMDERR_E_UNKNOWNGROUP; +} + +static IOleCommandTargetVtbl ctvt = +{ + ISVOleCmdTarget_QueryInterface, + ISVOleCmdTarget_AddRef, + ISVOleCmdTarget_Release, + ISVOleCmdTarget_QueryStatus, + ISVOleCmdTarget_Exec +}; + +/********************************************************** + * ISVDropTarget implementation + */ + +static HRESULT WINAPI ISVDropTarget_QueryInterface( + IDropTarget *iface, + REFIID riid, + LPVOID *ppvObj) +{ + _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface); + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj); +} + +static ULONG WINAPI ISVDropTarget_AddRef( IDropTarget *iface) +{ + _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellFolder_AddRef((IShellFolder*)This); +} + +static ULONG WINAPI ISVDropTarget_Release( IDropTarget *iface) +{ + _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellFolder_Release((IShellFolder*)This); +} + +static HRESULT WINAPI ISVDropTarget_DragEnter( + IDropTarget *iface, + IDataObject *pDataObject, + DWORD grfKeyState, + POINTL pt, + DWORD *pdwEffect) +{ + + _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface); + + FIXME("Stub: This=%p, DataObject=%p\n",This,pDataObject); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ISVDropTarget_DragOver( + IDropTarget *iface, + DWORD grfKeyState, + POINTL pt, + DWORD *pdwEffect) +{ + _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface); + + FIXME("Stub: This=%p\n",This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ISVDropTarget_DragLeave( + IDropTarget *iface) +{ + _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface); + + FIXME("Stub: This=%p\n",This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ISVDropTarget_Drop( + IDropTarget *iface, + IDataObject* pDataObject, + DWORD grfKeyState, + POINTL pt, + DWORD *pdwEffect) +{ + _ICOM_THIS_From_IDropTarget(IShellViewImpl, iface); + + FIXME("Stub: This=%p\n",This); + + return E_NOTIMPL; +} + +static struct IDropTargetVtbl dtvt = +{ + ISVDropTarget_QueryInterface, + ISVDropTarget_AddRef, + ISVDropTarget_Release, + ISVDropTarget_DragEnter, + ISVDropTarget_DragOver, + ISVDropTarget_DragLeave, + ISVDropTarget_Drop +}; + +/********************************************************** + * ISVDropSource implementation + */ + +static HRESULT WINAPI ISVDropSource_QueryInterface( + IDropSource *iface, + REFIID riid, + LPVOID *ppvObj) +{ + _ICOM_THIS_From_IDropSource(IShellViewImpl, iface); + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj); +} + +static ULONG WINAPI ISVDropSource_AddRef( IDropSource *iface) +{ + _ICOM_THIS_From_IDropSource(IShellViewImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellFolder_AddRef((IShellFolder*)This); +} + +static ULONG WINAPI ISVDropSource_Release( IDropSource *iface) +{ + _ICOM_THIS_From_IDropSource(IShellViewImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellFolder_Release((IShellFolder*)This); +} +static HRESULT WINAPI ISVDropSource_QueryContinueDrag( + IDropSource *iface, + BOOL fEscapePressed, + DWORD grfKeyState) +{ + _ICOM_THIS_From_IDropSource(IShellViewImpl, iface); + TRACE("(%p)\n",This); + + if (fEscapePressed) + return DRAGDROP_S_CANCEL; + else if (!(grfKeyState & MK_LBUTTON) && !(grfKeyState & MK_RBUTTON)) + return DRAGDROP_S_DROP; + else + return NOERROR; +} + +static HRESULT WINAPI ISVDropSource_GiveFeedback( + IDropSource *iface, + DWORD dwEffect) +{ + _ICOM_THIS_From_IDropSource(IShellViewImpl, iface); + TRACE("(%p)\n",This); + + return DRAGDROP_S_USEDEFAULTCURSORS; +} + +static struct IDropSourceVtbl dsvt = +{ + ISVDropSource_QueryInterface, + ISVDropSource_AddRef, + ISVDropSource_Release, + ISVDropSource_QueryContinueDrag, + ISVDropSource_GiveFeedback +}; +/********************************************************** + * ISVViewObject implementation + */ + +static HRESULT WINAPI ISVViewObject_QueryInterface( + IViewObject *iface, + REFIID riid, + LPVOID *ppvObj) +{ + _ICOM_THIS_From_IViewObject(IShellViewImpl, iface); + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + return IShellFolder_QueryInterface((IShellFolder*)This, riid, ppvObj); +} + +static ULONG WINAPI ISVViewObject_AddRef( IViewObject *iface) +{ + _ICOM_THIS_From_IViewObject(IShellViewImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellFolder_AddRef((IShellFolder*)This); +} + +static ULONG WINAPI ISVViewObject_Release( IViewObject *iface) +{ + _ICOM_THIS_From_IViewObject(IShellViewImpl, iface); + + TRACE("(%p)->(count=%lu)\n",This,This->ref); + + return IShellFolder_Release((IShellFolder*)This); +} + +static HRESULT WINAPI ISVViewObject_Draw( + IViewObject *iface, + DWORD dwDrawAspect, + LONG lindex, + void* pvAspect, + DVTARGETDEVICE* ptd, + HDC hdcTargetDev, + HDC hdcDraw, + LPCRECTL lprcBounds, + LPCRECTL lprcWBounds, + BOOL (CALLBACK *pfnContinue)(ULONG_PTR dwContinue), + ULONG_PTR dwContinue) +{ + + _ICOM_THIS_From_IViewObject(IShellViewImpl, iface); + + FIXME("Stub: This=%p\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI ISVViewObject_GetColorSet( + IViewObject *iface, + DWORD dwDrawAspect, + LONG lindex, + void *pvAspect, + DVTARGETDEVICE* ptd, + HDC hicTargetDevice, + LOGPALETTE** ppColorSet) +{ + + _ICOM_THIS_From_IViewObject(IShellViewImpl, iface); + + FIXME("Stub: This=%p\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI ISVViewObject_Freeze( + IViewObject *iface, + DWORD dwDrawAspect, + LONG lindex, + void* pvAspect, + DWORD* pdwFreeze) +{ + + _ICOM_THIS_From_IViewObject(IShellViewImpl, iface); + + FIXME("Stub: This=%p\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI ISVViewObject_Unfreeze( + IViewObject *iface, + DWORD dwFreeze) +{ + + _ICOM_THIS_From_IViewObject(IShellViewImpl, iface); + + FIXME("Stub: This=%p\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI ISVViewObject_SetAdvise( + IViewObject *iface, + DWORD aspects, + DWORD advf, + IAdviseSink* pAdvSink) +{ + + _ICOM_THIS_From_IViewObject(IShellViewImpl, iface); + + FIXME("Stub: This=%p\n",This); + + return E_NOTIMPL; +} +static HRESULT WINAPI ISVViewObject_GetAdvise( + IViewObject *iface, + DWORD* pAspects, + DWORD* pAdvf, + IAdviseSink** ppAdvSink) +{ + + _ICOM_THIS_From_IViewObject(IShellViewImpl, iface); + + FIXME("Stub: This=%p\n",This); + + return E_NOTIMPL; +} + + +static struct IViewObjectVtbl vovt = +{ + ISVViewObject_QueryInterface, + ISVViewObject_AddRef, + ISVViewObject_Release, + ISVViewObject_Draw, + ISVViewObject_GetColorSet, + ISVViewObject_Freeze, + ISVViewObject_Unfreeze, + ISVViewObject_SetAdvise, + ISVViewObject_GetAdvise +}; diff --git a/reactos/lib/shell32/shpolicy.c b/reactos/lib/shell32/shpolicy.c new file mode 100644 index 00000000000..d0d24ec9b8f --- /dev/null +++ b/reactos/lib/shell32/shpolicy.c @@ -0,0 +1,915 @@ +/* + * shpolicy.c - Data for shell/system policies. + * + * Copyright 1999 Ian Schmidt + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * NOTES: + * + * Some of these policies can be tweaked via the System Policy + * Editor which came with the Win95 Migration Guide, although + * there doesn't appear to be an updated Win98 version that + * would handle the many new policies introduced since then. + * You could easily write one with the information in + * this file... + * + * Up to date as of SHELL32 v5.00 (W2K) + */ + +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" + +#include "shell32_main.h" +#include "shlobj.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +#define SHELL_NO_POLICY 0xffffffff + +typedef struct tagPOLICYDAT +{ + DWORD policy; /* policy value passed to SHRestricted */ + LPCSTR appstr; /* application str such as "Explorer" */ + LPCSTR keystr; /* name of the actual registry key / policy */ + DWORD cache; /* cached value or 0xffffffff for invalid */ +} POLICYDATA, *LPPOLICYDATA; + +/* registry strings */ +static const CHAR strRegistryPolicyA[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies"; +static const WCHAR strRegistryPolicyW[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o', + 's','o','f','t','\\','W','i','n','d','o','w','s','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n', + '\\','P','o','l','i','c','i','e','s',0}; +static const CHAR strPolicyA[] = "Policy"; +static const WCHAR strPolicyW[] = {'P','o','l','i','c','y',0}; + +/* application strings */ + +static const char strExplorer[] = {"Explorer"}; +static const char strActiveDesk[] = {"ActiveDesktop"}; +static const char strWinOldApp[] = {"WinOldApp"}; +static const char strAddRemoveProgs[] = {"AddRemoveProgs"}; + +/* key strings */ + +static const char strNoFileURL[] = {"NoFileUrl"}; +static const char strNoFolderOptions[] = {"NoFolderOptions"}; +static const char strNoChangeStartMenu[] = {"NoChangeStartMenu"}; +static const char strNoWindowsUpdate[] = {"NoWindowsUpdate"}; +static const char strNoSetActiveDesktop[] = {"NoSetActiveDesktop"}; +static const char strNoForgetSoftwareUpdate[] = {"NoForgetSoftwareUpdate"}; +static const char strNoMSAppLogo[] = {"NoMSAppLogo5ChannelNotify"}; +static const char strForceCopyACLW[] = {"ForceCopyACLWithFile"}; +static const char strNoResolveTrk[] = {"NoResolveTrack"}; +static const char strNoResolveSearch[] = {"NoResolveSearch"}; +static const char strNoEditComponent[] = {"NoEditingComponents"}; +static const char strNoMovingBand[] = {"NoMovingBands"}; +static const char strNoCloseDragDrop[] = {"NoCloseDragDropBands"}; +static const char strNoCloseComponent[] = {"NoClosingComponents"}; +static const char strNoDelComponent[] = {"NoDeletingComponents"}; +static const char strNoAddComponent[] = {"NoAddingComponents"}; +static const char strNoComponent[] = {"NoComponents"}; +static const char strNoChangeWallpaper[] = {"NoChangingWallpaper"}; +static const char strNoHTMLWallpaper[] = {"NoHTMLWallpaper"}; +static const char strNoCustomWebView[] = {"NoCustomizeWebView"}; +static const char strClassicShell[] = {"ClassicShell"}; +static const char strClearRecentDocs[] = {"ClearRecentDocsOnExit"}; +static const char strNoFavoritesMenu[] = {"NoFavoritesMenu"}; +static const char strNoActiveDesktopChanges[] = {"NoActiveDesktopChanges"}; +static const char strNoActiveDesktop[] = {"NoActiveDesktop"}; +static const char strNoRecentDocMenu[] = {"NoRecentDocsMenu"}; +static const char strNoRecentDocHistory[] = {"NoRecentDocsHistory"}; +static const char strNoInetIcon[] = {"NoInternetIcon"}; +static const char strNoSettingsWizard[] = {"NoSettingsWizards"}; +static const char strNoLogoff[] = {"NoLogoff"}; +static const char strNoNetConDis[] = {"NoNetConnectDisconnect"}; +static const char strNoViewContextMenu[] = {"NoViewContextMenu"}; +static const char strNoTrayContextMenu[] = {"NoTrayContextMenu"}; +static const char strNoWebMenu[] = {"NoWebMenu"}; +static const char strLnkResolveIgnoreLnkInfo[] = {"LinkResolveIgnoreLinkInfo"}; +static const char strNoCommonGroups[] = {"NoCommonGroups"}; +static const char strEnforceShlExtSecurity[] = {"EnforceShellExtensionSecurity"}; +static const char strNoRealMode[] = {"NoRealMode"}; +static const char strMyDocsOnNet[] = {"MyDocsOnNet"}; +static const char strNoStartMenuSubfolder[] = {"NoStartMenuSubFolders"}; +static const char strNoAddPrinters[] = {"NoAddPrinter"}; +static const char strNoDeletePrinters[] = {"NoDeletePrinter"}; +static const char strNoPrintTab[] = {"NoPrinterTabs"}; +static const char strRestrictRun[] = {"RestrictRun"}; +static const char strNoStartBanner[] = {"NoStartBanner"}; +static const char strNoNetworkNeighborhood[] = {"NoNetHood"}; +static const char strNoDriveTypeAtRun[] = {"NoDriveTypeAutoRun"}; +static const char strNoDrivesAutoRun[] = {"NoDriveAutoRun"}; +static const char strSeparateProcess[] = {"SeparateProcess"}; +static const char strNoDrives[] = {"NoDrives"}; +static const char strNoFind[] = {"NoFind"}; +static const char strNoDesktop[] = {"NoDesktop"}; +static const char strNoSetTaskBar[] = {"NoSetTaskbar"}; +static const char strNoSetFld[] = {"NoSetFolders"}; +static const char strNoFileMenu[] = {"NoFileMenu"}; +static const char strNoSaveSetting[] = {"NoSaveSettings"}; +static const char strNoClose[] = {"NoClose"}; +static const char strNoRun[] = {"NoRun"}; + +/* policy data array */ +POLICYDATA sh32_policy_table[] = +{ + { + REST_NORUN, + strExplorer, + strNoRun, + SHELL_NO_POLICY + }, + { + REST_NOCLOSE, + strExplorer, + strNoClose, + SHELL_NO_POLICY + }, + { + REST_NOSAVESET, + strExplorer, + strNoSaveSetting, + SHELL_NO_POLICY + }, + { + REST_NOFILEMENU, + strExplorer, + strNoFileMenu, + SHELL_NO_POLICY + }, + { + REST_NOSETFOLDERS, + strExplorer, + strNoSetFld, + SHELL_NO_POLICY + }, + { + REST_NOSETTASKBAR, + strExplorer, + strNoSetTaskBar, + SHELL_NO_POLICY + }, + { + REST_NODESKTOP, + strExplorer, + strNoDesktop, + SHELL_NO_POLICY + }, + { + REST_NOFIND, + strExplorer, + strNoFind, + SHELL_NO_POLICY + }, + { + REST_NODRIVES, + strExplorer, + strNoDrives, + SHELL_NO_POLICY + }, + { + REST_NODRIVEAUTORUN, + strExplorer, + strNoDrivesAutoRun, + SHELL_NO_POLICY + }, + { + REST_NODRIVETYPEAUTORUN, + strExplorer, + strNoDriveTypeAtRun, + SHELL_NO_POLICY + }, + { + REST_NONETHOOD, + strExplorer, + strNoNetworkNeighborhood, + SHELL_NO_POLICY + }, + { + REST_STARTBANNER, + strExplorer, + strNoStartBanner, + SHELL_NO_POLICY + }, + { + REST_RESTRICTRUN, + strExplorer, + strRestrictRun, + SHELL_NO_POLICY + }, + { + REST_NOPRINTERTABS, + strExplorer, + strNoPrintTab, + SHELL_NO_POLICY + }, + { + REST_NOPRINTERDELETE, + strExplorer, + strNoDeletePrinters, + SHELL_NO_POLICY + }, + { + REST_NOPRINTERADD, + strExplorer, + strNoAddPrinters, + SHELL_NO_POLICY + }, + { + REST_NOSTARTMENUSUBFOLDERS, + strExplorer, + strNoStartMenuSubfolder, + SHELL_NO_POLICY + }, + { + REST_MYDOCSONNET, + strExplorer, + strMyDocsOnNet, + SHELL_NO_POLICY + }, + { + REST_NOEXITTODOS, + strWinOldApp, + strNoRealMode, + SHELL_NO_POLICY + }, + { + REST_ENFORCESHELLEXTSECURITY, + strExplorer, + strEnforceShlExtSecurity, + SHELL_NO_POLICY + }, + { + REST_LINKRESOLVEIGNORELINKINFO, + strExplorer, + strLnkResolveIgnoreLnkInfo, + SHELL_NO_POLICY + }, + { + REST_NOCOMMONGROUPS, + strExplorer, + strNoCommonGroups, + SHELL_NO_POLICY + }, + { + REST_SEPARATEDESKTOPPROCESS, + strExplorer, + strSeparateProcess, + SHELL_NO_POLICY + }, + { + REST_NOWEB, + strExplorer, + strNoWebMenu, + SHELL_NO_POLICY + }, + { + REST_NOTRAYCONTEXTMENU, + strExplorer, + strNoTrayContextMenu, + SHELL_NO_POLICY + }, + { + REST_NOVIEWCONTEXTMENU, + strExplorer, + strNoViewContextMenu, + SHELL_NO_POLICY + }, + { + REST_NONETCONNECTDISCONNECT, + strExplorer, + strNoNetConDis, + SHELL_NO_POLICY + }, + { + REST_STARTMENULOGOFF, + strExplorer, + strNoLogoff, + SHELL_NO_POLICY + }, + { + REST_NOSETTINGSASSIST, + strExplorer, + strNoSettingsWizard, + SHELL_NO_POLICY + }, + { + REST_NOINTERNETICON, + strExplorer, + strNoInetIcon, + SHELL_NO_POLICY + }, + { + REST_NORECENTDOCSHISTORY, + strExplorer, + strNoRecentDocHistory, + SHELL_NO_POLICY + }, + { + REST_NORECENTDOCSMENU, + strExplorer, + strNoRecentDocMenu, + SHELL_NO_POLICY + }, + { + REST_NOACTIVEDESKTOP, + strExplorer, + strNoActiveDesktop, + SHELL_NO_POLICY + }, + { + REST_NOACTIVEDESKTOPCHANGES, + strExplorer, + strNoActiveDesktopChanges, + SHELL_NO_POLICY + }, + { + REST_NOFAVORITESMENU, + strExplorer, + strNoFavoritesMenu, + SHELL_NO_POLICY + }, + { + REST_CLEARRECENTDOCSONEXIT, + strExplorer, + strClearRecentDocs, + SHELL_NO_POLICY + }, + { + REST_CLASSICSHELL, + strExplorer, + strClassicShell, + SHELL_NO_POLICY + }, + { + REST_NOCUSTOMIZEWEBVIEW, + strExplorer, + strNoCustomWebView, + SHELL_NO_POLICY + }, + { + REST_NOHTMLWALLPAPER, + strActiveDesk, + strNoHTMLWallpaper, + SHELL_NO_POLICY + }, + { + REST_NOCHANGINGWALLPAPER, + strActiveDesk, + strNoChangeWallpaper, + SHELL_NO_POLICY + }, + { + REST_NODESKCOMP, + strActiveDesk, + strNoComponent, + SHELL_NO_POLICY + }, + { + REST_NOADDDESKCOMP, + strActiveDesk, + strNoAddComponent, + SHELL_NO_POLICY + }, + { + REST_NODELDESKCOMP, + strActiveDesk, + strNoDelComponent, + SHELL_NO_POLICY + }, + { + REST_NOCLOSEDESKCOMP, + strActiveDesk, + strNoCloseComponent, + SHELL_NO_POLICY + }, + { + REST_NOCLOSE_DRAGDROPBAND, + strActiveDesk, + strNoCloseDragDrop, + SHELL_NO_POLICY + }, + { + REST_NOMOVINGBAND, + strActiveDesk, + strNoMovingBand, + SHELL_NO_POLICY + }, + { + REST_NOEDITDESKCOMP, + strActiveDesk, + strNoEditComponent, + SHELL_NO_POLICY + }, + { + REST_NORESOLVESEARCH, + strExplorer, + strNoResolveSearch, + SHELL_NO_POLICY + }, + { + REST_NORESOLVETRACK, + strExplorer, + strNoResolveTrk, + SHELL_NO_POLICY + }, + { + REST_FORCECOPYACLWITHFILE, + strExplorer, + strForceCopyACLW, + SHELL_NO_POLICY + }, + { + REST_NOLOGO3CHANNELNOTIFY, + strExplorer, + strNoMSAppLogo, + SHELL_NO_POLICY + }, + { + REST_NOFORGETSOFTWAREUPDATE, + strExplorer, + strNoForgetSoftwareUpdate, + SHELL_NO_POLICY + }, + { + REST_NOSETACTIVEDESKTOP, + strExplorer, + strNoSetActiveDesktop, + SHELL_NO_POLICY + }, + { + REST_NOUPDATEWINDOWS, + strExplorer, + strNoWindowsUpdate, + SHELL_NO_POLICY + }, + { + REST_NOCHANGESTARMENU, + strExplorer, + strNoChangeStartMenu, + SHELL_NO_POLICY + }, + { + REST_NOFOLDEROPTIONS, + strExplorer, + strNoFolderOptions, + SHELL_NO_POLICY + }, + { + REST_HASFINDCOMPUTERS, + strExplorer, + "FindComputers", + SHELL_NO_POLICY + }, + { + REST_INTELLIMENUS, + strExplorer, + "IntelliMenus", + SHELL_NO_POLICY + }, + { + REST_RUNDLGMEMCHECKBOX, + strExplorer, + "MemCheckBoxInRunDlg", + SHELL_NO_POLICY + }, + { + REST_ARP_ShowPostSetup, + strAddRemoveProgs, + "ShowPostSetup", + SHELL_NO_POLICY + }, + { + REST_NOCSC, + strExplorer, + "NoSyncAll", + SHELL_NO_POLICY + }, + { + REST_NOCONTROLPANEL, + strExplorer, + "NoControlPanel", + SHELL_NO_POLICY + }, + { + REST_ENUMWORKGROUP, + strExplorer, + "EnumWorkgroup", + SHELL_NO_POLICY + }, + { + REST_ARP_NOARP, + strAddRemoveProgs, + "NoAddRemovePrograms", + SHELL_NO_POLICY + }, + { + REST_ARP_NOREMOVEPAGE, + strAddRemoveProgs, + "NoRemovePage", + SHELL_NO_POLICY + }, + { + REST_ARP_NOADDPAGE, + strAddRemoveProgs, + "NoAddPage", + SHELL_NO_POLICY + }, + { + REST_ARP_NOWINSETUPPAGE, + strAddRemoveProgs, + "NoWindowsSetupPage", + SHELL_NO_POLICY + }, + { + REST_GREYMSIADS, + strExplorer, + "", + SHELL_NO_POLICY + }, + { + REST_NOCHANGEMAPPEDDRIVELABEL, + strExplorer, + "NoChangeMappedDriveLabel", + SHELL_NO_POLICY + }, + { + REST_NOCHANGEMAPPEDDRIVECOMMENT, + strExplorer, + "NoChangeMappedDriveComment", + SHELL_NO_POLICY + }, + { + REST_MaxRecentDocs, + strExplorer, + "MaxRecentDocs", + SHELL_NO_POLICY + }, + { + REST_NONETWORKCONNECTIONS, + strExplorer, + "NoNetworkConnections", + SHELL_NO_POLICY + }, + { + REST_FORCESTARTMENULOGOFF, + strExplorer, + "ForceStartMenuLogoff", + SHELL_NO_POLICY + }, + { + REST_NOWEBVIEW, + strExplorer, + "NoWebView", + SHELL_NO_POLICY + }, + { + REST_NOCUSTOMIZETHISFOLDER, + strExplorer, + "NoCustomizeThisFolder", + SHELL_NO_POLICY + }, + { + REST_NOENCRYPTION, + strExplorer, + "NoEncryption", + SHELL_NO_POLICY + }, + { + REST_ALLOWFRENCHENCRYPTION, + strExplorer, + "AllowFrenchEncryption", + SHELL_NO_POLICY + }, + { + REST_DONTSHOWSUPERHIDDEN, + strExplorer, + "DontShowSuperHidden", + SHELL_NO_POLICY + }, + { + REST_NOSHELLSEARCHBUTTON, + strExplorer, + "NoShellSearchButton", + SHELL_NO_POLICY + }, + { + REST_NOHARDWARETAB, + strExplorer, + "NoHardwareTab", + SHELL_NO_POLICY + }, + { + REST_NORUNASINSTALLPROMPT, + strExplorer, + "NoRunasInstallPrompt", + SHELL_NO_POLICY + }, + { + REST_PROMPTRUNASINSTALLNETPATH, + strExplorer, + "PromptRunasInstallNetPath", + SHELL_NO_POLICY + }, + { + REST_NOMANAGEMYCOMPUTERVERB, + strExplorer, + "NoManageMyComputerVerb", + SHELL_NO_POLICY + }, + { + REST_NORECENTDOCSNETHOOD, + strExplorer, + "NoRecentDocsNetHood", + SHELL_NO_POLICY + }, + { + REST_DISALLOWRUN, + strExplorer, + "DisallowRun", + SHELL_NO_POLICY + }, + { + REST_NOWELCOMESCREEN, + strExplorer, + "NoWelcomeScreen", + SHELL_NO_POLICY + }, + { + REST_RESTRICTCPL, + strExplorer, + "RestrictCpl", + SHELL_NO_POLICY + }, + { + REST_DISALLOWCPL, + strExplorer, + "DisallowCpl", + SHELL_NO_POLICY + }, + { + REST_NOSMBALLOONTIP, + strExplorer, + "NoSMBalloonTip", + SHELL_NO_POLICY + }, + { + REST_NOSMHELP, + strExplorer, + "NoSMHelp", + SHELL_NO_POLICY + }, + { + REST_NOWINKEYS, + strExplorer, + "NoWinKeys", + SHELL_NO_POLICY + }, + { + REST_NOENCRYPTONMOVE, + strExplorer, + "NoEncryptOnMove", + SHELL_NO_POLICY + }, + { + REST_NOLOCALMACHINERUN, + strExplorer, + "DisableLocalMachineRun", + SHELL_NO_POLICY + }, + { + REST_NOCURRENTUSERRUN, + strExplorer, + "DisableCurrentUserRun", + SHELL_NO_POLICY + }, + { + REST_NOLOCALMACHINERUNONCE, + strExplorer, + "DisableLocalMachineRunOnce", + SHELL_NO_POLICY + }, + { + REST_NOCURRENTUSERRUNONCE, + strExplorer, + "DisableCurrentUserRunOnce", + SHELL_NO_POLICY + }, + { + REST_FORCEACTIVEDESKTOPON, + strExplorer, + "ForceActiveDesktopOn", + SHELL_NO_POLICY + }, + { + REST_NOCOMPUTERSNEARME, + strExplorer, + "NoComputersNearMe", + SHELL_NO_POLICY + }, + { + REST_NOVIEWONDRIVE, + strExplorer, + "NoViewOnDrive", + SHELL_NO_POLICY + }, + { + REST_NONETCRAWL, + strExplorer, + "NoNetCrawl", + SHELL_NO_POLICY + }, + { + REST_NOSHAREDDOCUMENTS, + strExplorer, + "NoSharedDocs", + SHELL_NO_POLICY + }, + { + REST_NOSMMYDOCS, + strExplorer, + "NoSMMyDocs", + SHELL_NO_POLICY + }, +/* 0x4000050 - 0x4000060 */ + { + REST_NONLEGACYSHELLMODE, + strExplorer, + "NoneLegacyShellMode", + SHELL_NO_POLICY + }, + { + REST_STARTRUNNOHOMEPATH, + strExplorer, + "StartRunNoHOMEPATH", + SHELL_NO_POLICY + }, +/* 0x4000061 - 0x4000086 */ + { + REST_NODISCONNECT, + strExplorer, + "NoDisconnect", + SHELL_NO_POLICY + }, + { + REST_NOSECURITY, + strExplorer, + "NoNTSecurity", + SHELL_NO_POLICY + }, + { + REST_NOFILEASSOCIATE, + strExplorer, + "NoFileAssociate", + SHELL_NO_POLICY + }, + { + 0x50000024, + strExplorer, + strNoFileURL, + SHELL_NO_POLICY + }, + { + 0, + 0, + 0, + SHELL_NO_POLICY + } +}; + +/************************************************************************* + * SHRestricted [SHELL32.100] + * + * Get the value associated with a policy Id. + * + * PARAMS + * pol [I] Policy Id + * + * RETURNS + * The queried value for the policy. + * + * NOTES + * Exported by ordinal. + * This function caches the retrieved values to prevent unnecessary registry access, + * if SHInitRestricted() was previously called. + * + * REFERENCES + * a: MS System Policy Editor. + * b: 98Lite 2.0 (which uses many of these policy keys) http://www.98lite.net/ + * c: 'The Windows 95 Registry', by John Woram, 1996 MIS: Press + */ +DWORD WINAPI SHRestricted (RESTRICTIONS policy) +{ + char regstr[256]; + HKEY xhkey; + DWORD retval, datsize = 4; + LPPOLICYDATA p; + + TRACE("(%08x)\n", policy); + + /* scan to see if we know this policy ID */ + for (p = sh32_policy_table; p->policy; p++) + { + if (policy == p->policy) + { + break; + } + } + + if (p->policy == 0) + { + /* we don't know this policy, return 0 */ + TRACE("unknown policy: (%08x)\n", policy); + return 0; + } + + /* we have a known policy */ + + /* first check if this policy has been cached, return it if so */ + if (p->cache != SHELL_NO_POLICY) + { + return p->cache; + } + + lstrcpyA(regstr, strRegistryPolicyA); + lstrcatA(regstr, p->appstr); + + /* return 0 and don't set the cache if any registry errors occur */ + retval = 0; + if (RegOpenKeyA(HKEY_CURRENT_USER, regstr, &xhkey) == ERROR_SUCCESS) + { + if (RegQueryValueExA(xhkey, p->keystr, NULL, NULL, (LPBYTE)&retval, &datsize) == ERROR_SUCCESS) + { + p->cache = retval; + } + RegCloseKey(xhkey); + } + return retval; +} + +/************************************************************************* + * SHInitRestricted [SHELL32.244] + * + * Initialise the policy cache to speed up calls to SHRestricted(). + * + * PARAMS + * unused [I] Reserved. + * inpRegKey [I] Registry key to scan. + * + * RETURNS + * Success: -1. The policy cache is initialised. + * Failure: 0, if inpRegKey is any value other than NULL, "Policy", or + * "Software\Microsoft\Windows\CurrentVersion\Policies". + * + * NOTES + * Exported by ordinal. Introduced in Win98. + */ +BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey) +{ + TRACE("(%p, %p)\n", unused, inpRegKey); + + /* first check - if input is non-NULL and points to the secret + key string, then pass. Otherwise return 0. + */ + if (inpRegKey != NULL) + { + if (SHELL_OsIsUnicode()) + { + if (lstrcmpiW((LPCWSTR)inpRegKey, strRegistryPolicyW) && + lstrcmpiW((LPCWSTR)inpRegKey, strPolicyW)) + /* doesn't match, fail */ + return 0; + } + else + { + if (lstrcmpiA((LPCSTR)inpRegKey, strRegistryPolicyA) && + lstrcmpiA((LPCSTR)inpRegKey, strPolicyA)) + /* doesn't match, fail */ + return 0; + } + } + + return TRUE; +} diff --git a/reactos/lib/shell32/shres.rc b/reactos/lib/shell32/shres.rc new file mode 100644 index 00000000000..21ab4ced7d5 --- /dev/null +++ b/reactos/lib/shell32/shres.rc @@ -0,0 +1,16642 @@ +/* + * Top level resource file for shell stuff + * + * Copyright 1998 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winnls.h" +#include "wingdi.h" +#include "shlobj.h" +#include "shresdef.h" + +#include "version.rc" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +shv_accel ACCELERATORS +BEGIN + VK_F5, FCIDM_SHVIEW_REFRESH, VIRTKEY +END + +/* BINRES document.ico */ +1 ICON document.ico +/* { + '00 00 01 00 08 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 86 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 2E 09 00 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 96 0E 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 7E 11 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 A6 12 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 4E 21 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 F6 46 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 9E 57 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 11 11 11 00 22 22 22 00 33 33 33 00 55 55' + '55 00 66 66 66 00 77 77 77 00 7F 7F 7F 00 88 88' + '88 00 99 99 99 00 AA AA AA 00 BB BB BB 00 CC CC' + 'CC 00 DD DD DD 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 33 00 32 00 5C 00 64 00 6F 00 63 00 75 00' + '6D 00 65 00 6E 00 74 00 2E 00 69 00 63 00 6F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 18 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 5A 00 5C 00 00 EC FD 7F 1A 02' + '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 5A 00' + '00 00 00 00 00 00 03 00 00 00 62 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 08 6C' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 64 6F 63 75 6D 65 6E 74 2E' + '69 63 6F 00 4B 00 14 1A 95 00 1F 3B D4 77 13 00' + '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 18 6C' + '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' + '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' + '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 18 6C' + '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00' + '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00' + '10 01 08 09 09 09 09 09 09 08 09 09 08 09 09 08' + '06 03 10 10 10 00 00 00 00 00 00 00 00 00 00 00' + '10 02 0C 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0F' + '0B 08 03 10 10 10 00 00 00 00 00 00 00 00 00 00' + '10 01 0C 0E 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D' + '0A 0C 0A 02 10 10 10 00 00 00 00 00 00 00 00 00' + '10 02 0B 0E 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0E' + '0A 0D 0D 0A 02 10 10 10 00 00 00 00 00 00 00 00' + '10 01 0C 0E 0D 0D 0D 0D 0D 0D 0E 0D 0D 0E 0D 0D' + '0B 0D 0E 0E 0A 03 10 10 10 00 00 00 00 00 00 00' + '10 02 0C 0E 0D 0D 0D 0E 0D 0D 0D 0D 0E 0D 0E 0D' + '0A 0D 0F 0E 0E 09 02 10 10 00 00 00 00 00 00 00' + '10 01 0C 0E 0D 0E 0D 0D 0D 0E 0D 0E 0D 0D 0E 0D' + '0B 0D 0E 0F 0E 0F 0A 02 10 10 00 00 00 00 00 00' + '10 02 0C 0E 0D 0D 0E 0D 0E 0D 0D 0E 0E 0D 0D 0E' + '0A 0E 0F 0E 0F 0F 0F 0A 02 10 10 10 00 00 00 00' + '10 01 0C 0E 0D 0E 0E 0D 0D 0E 0E 0D 0D 0E 0E 0E' + '0A 0D 0E 0E 0E 0E 0E 0E 09 03 10 10 00 00 00 00' + '10 02 0C 0E 0E 0D 0D 0E 0E 0D 0E 0E 0E 0D 0E 0E' + '0C 0A 0B 0B 0B 0A 0B 0B 0B 06 10 10 00 00 00 00' + '10 01 0C 0F 0D 0E 0E 0D 0E 0E 0D 0E 0D 0E 0D 0E' + '0E 0E 0E 0E 0E 0E 0E 0E 0F 09 10 10 00 00 00 00' + '10 02 0C 0E 0E 0E 0E 0E 0D 0E 0E 0E 0E 0E 0E 0E' + '0E 0E 0E 0E 0E 0E 0E 0E 0E 08 10 10 00 00 00 00' + '10 01 0C 0F 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' + '0E 0E 0E 0E 0E 0E 0E 0E 0F 09 10 10 00 00 00 00' + '10 02 0C 0F 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' + '0E 0F 0E 0E 0E 0E 0E 0F 0E 09 10 10 00 00 00 00' + '10 01 0C 0F 0E 0E 0E 0E 0F 0E 0F 0E 0E 0E 0F 0E' + '0E 0E 0E 0E 0F 0E 0F 0E 0F 09 10 10 00 00 00 00' + '10 02 0C 0F 0E 0F 0E 0F 0E 0F 0E 0F 0F 0F 0E 0F' + '0F 0E 0F 0E 0E 0E 0E 0F 0F 08 10 10 00 00 00 00' + '10 02 0C 0F 0E 0E 0F 0E 0F 0E 0F 0F 0F 0E 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0E 0F 09 10 10 00 00 00 00' + '10 02 0C 0F 0F 0E 0E 0F 0E 0F 0E 0F 0E 0F 0F 0E' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' + '10 02 0C 0F 0E 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' + '10 02 0C 0F 0F 0E 0F 0F 0E 0F 0F 0E 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' + '10 02 0C 0F 0F 0F 0E 0F 0F 0E 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' + '10 02 0D 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' + '10 02 0C 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' + '10 02 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' + '10 01 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0A 10 10 00 00 00 00' + '10 02 0C 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' + '10 02 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' + '10 02 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0A 10 10 00 00 00 00' + '10 01 06 08 06 06 06 06 06 06 06 06 06 06 06 06' + '06 06 05 06 05 06 05 05 06 04 10 10 00 00 00 00' + '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 10 10 10 10 10 10 10 10 10 00 00 E0 00' + '07 FF C0 00 03 FF C0 00 01 FF C0 00 00 FF C0 00' + '00 7F C0 00 00 3F C0 00 00 1F C0 00 00 1F C0 00' + '00 0F C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 11 11 11 00 33 33' + '33 00 44 44 44 00 77 77 77 00 7F 7F 7F 00 99 99' + '99 00 AA AA AA 00 BB BB BB 00 CC CC CC 00 DD DD' + 'DD 00 EE EE EE 00 FF FF FF 00 00 00 00 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 33 00 32 00 5C 00' + '64 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00' + '2E 00 69 00 63 00 6F 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 77 13 00 00 00 18 0A' + '38 00 00 00 38 00 18 6C 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' + 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 86 00' + '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 77 38 9F 07 00 CD 8B F5 77 78 13' + '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 5A 00' + '5C 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 40 9F' + '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' + 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' + 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' + 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 77 00 EC FD 7F 5A 00 00 00 00 00 00 00 03 00' + '00 00 62 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 08 6C 0C 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 64' + '6F 63 75 6D 65 6E 74 2E 69 63 6F 00 4B 00 14 1A' + '95 00 1F 3B D4 77 13 00 00 00 98 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 18 6C 38 00 86 00 00 00 00 00' + '00 00 C9 F1 E7 77 86 00 00 00 A4 1A 95 00 08 00' + '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 18 6C 38 00 86 00 00 00 58 1A' + '95 00 00 00 00 00 00 0D 0D 0D 0D 0D 0D 0D 0D 0D' + '0D 00 00 00 00 00 00 01 07 08 08 07 08 07 08 04' + '0D 0D 00 00 00 00 00 01 09 0B 0A 0B 0B 0B 0A 09' + '06 0D 0D 00 00 00 00 01 0A 0A 0A 0A 0A 0B 0A 09' + '0C 06 0D 0D 00 00 00 01 09 0A 0B 0A 0B 0A 0A 09' + '0C 0C 06 01 0D 00 00 01 0A 0B 0A 0B 0A 0B 0A 09' + '0A 09 0A 04 0D 00 00 01 09 0B 0B 0A 0B 0B 0B 0B' + '0A 0B 0B 08 0D 00 00 01 0A 0C 0B 0B 0B 0B 0B 0B' + '0B 0B 0C 08 0D 00 00 01 0A 0B 0B 0C 0B 0C 0B 0B' + '0C 0B 0C 09 0D 00 00 01 0B 0C 0B 0C 0B 0C 0C 0C' + '0C 0C 0C 08 0D 00 00 01 09 0C 0C 0B 0C 0C 0C 0C' + '0C 0C 0C 09 0D 00 00 01 0B 0C 0C 0C 0C 0C 0C 0C' + '0C 0C 0C 08 0D 00 00 01 0A 0C 0C 0C 0C 0C 0C 0C' + '0C 0C 0C 09 0D 00 00 01 0B 0C 0C 0C 0C 0C 0C 0C' + '0C 0C 0C 09 0D 00 00 01 0B 0C 0C 0C 0C 0C 0C 0C' + '0C 0C 0C 09 0D 00 00 0D 03 03 03 03 03 03 03 02' + '03 02 03 02 0D 00 80 1F 00 00 80 0F 00 00 80 07' + '00 00 80 03 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08' + '88 87 88 78 88 78 88 88 00 00 00 00 00 00 00 00' + '7F F7 FF 7F FF 7F F7 78 80 00 00 00 00 00 00 04' + '7F 7F 77 F7 F7 F7 FF 8F 88 00 00 00 00 00 00 00' + '7F F7 FF 7F 7F 7F 7F 77 F8 80 00 00 00 00 00 08' + '7F 77 F7 F7 F7 F7 F7 77 FF 88 00 00 00 00 00 00' + '7F F7 7F 7F 7F 7F 7F 7F 7F F8 80 00 00 00 00 08' + '7F 7F F7 F7 F7 F7 F7 77 FF FF 88 00 00 00 00 00' + '7F F7 FF 7F 7F F7 FF 8F FF FF F8 80 00 00 00 08' + '7F 7F 77 F7 FF 7F F7 77 F7 F7 FF 84 00 00 00 00' + '7F F7 FF 7F 7F F7 FF 77 77 77 87 78 00 00 00 08' + '7F 7F F7 FF F7 FF 7F FF 7F F7 FF F7 00 00 00 00' + '7F F7 FF 7F 7F 7F F7 FF F7 FF F7 F8 00 00 00 08' + '7F FF F7 F7 FF F7 FF 7F 7F FF 7F F8 00 00 00 00' + '7F 7F FF FF 7F FF 7F FF F7 FF FF F8 00 00 00 04' + '7F FF 7F F7 FF 7F FF F7 FF FF F7 F7 00 00 00 00' + 'FF FF FF FF FF F7 FF FF 7F F7 FF F8 00 00 00 08' + '7F 7F F7 FF FF FF FF FF FF FF FF F8 00 00 00 00' + '7F FF FF F7 FF FF FF FF FF FF FF F8 00 00 00 08' + '7F FF FF FF FF 7F FF FF FF FF FF F7 00 00 00 00' + 'FF F7 FF FF FF FF FF FF FF FF FF F8 00 00 00 08' + '7F FF FF 7F FF FF FF FF FF FF FF F7 00 00 00 00' + '7F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 08' + '7F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 00' + 'FF FF FF FF FF FF FF FF FF FF FF F7 00 00 00 08' + '7F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 00' + 'FF FF FF FF FF FF FF FF FF FF FF F7 00 00 00 04' + '7F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 08' + '7F FF FF FF FF FF FF F7 FF FF FF F7 00 00 00 00' + '88 88 88 88 88 88 88 88 88 88 88 88 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 00' + '07 FF C0 00 03 FF C0 00 01 FF C0 00 00 FF C0 00' + '00 7F C0 00 00 3F C0 00 00 1F C0 00 00 1F C0 00' + '00 0F C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' + '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 77' + '77 77 78 00 00 00 00 7F F7 FF 7F 80 00 00 04 7F' + '7F 7F 77 F8 00 00 00 77 F7 F7 F7 FF 70 00 00 FF' + '7F 7F 7F 7F 78 00 08 77 FF 7F F7 F7 F7 00 00 FF' + '7F FF 7F 7F F7 00 00 7F FF F7 FF FF F7 00 04 7F' + 'FF FF FF FF F7 00 00 FF FF FF FF FF F7 00 00 7F' + 'FF FF FF FF F7 00 00 FF FF FF FF FF F7 00 04 7F' + 'FF FF FF FF F7 00 00 FF FF FF FF FF F7 00 00 88' + '88 88 88 88 88 00 80 1F 00 00 80 0F 00 00 80 07' + '00 00 80 03 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 11 11 11 00 22 22 22 00 33 33 33 00 44 44' + '44 00 66 66 66 00 77 77 77 00 7F 7F 7F 00 88 88' + '88 00 99 99 99 00 AA AA AA 00 BB BB BB 00 CC CC' + 'CC 00 DD DD DD 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 33 00 32 00 5C 00 64 00 6F 00 63 00 75 00' + '6D 00 65 00 6E 00 74 00 2E 00 69 00 63 00 6F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 18 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 5A 00 5C 00 00 EC FD 7F 1A 02' + '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 5A 00' + '00 00 00 00 00 00 03 00 00 00 62 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 08 6C' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 64 6F 63 75 6D 65 6E 74 2E' + '69 63 6F 00 4B 00 14 1A 95 00 1F 3B D4 77 13 00' + '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 18 6C' + '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' + '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' + '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 18 6C' + '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 10 10 10 10 10 10 10 10 10 10 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 10 10 10 10 10 10 10 10 10 10 10 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 10 10 03 08 08 06 08 08 06 08 06 06 08 06 08' + '06 06 06 06 06 06 06 05 06 05 05 01 10 10 10 10' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 10 10 03 0C 0E 0E 0E 0D 0E 0E 0E 0E 0E 0E 0D' + '0E 0E 0E 0E 0E 0E 0E 0E 0E 0C 08 05 01 10 10 10' + '10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0D 0D 0D 0D 0D 0D 0D 0E 0D' + '0D 0D 0D 0E 0D 0D 0D 0E 0E 0B 09 0A 05 01 10 10' + '10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 10 10 03 0B 0F 0C 0D 0D 0D 0D 0D 0D 0D 0D 0D' + '0D 0D 0D 0D 0D 0D 0D 0D 0D 0B 0A 0D 0A 05 02 10' + '10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D' + '0E 0D 0D 0D 0D 0E 0D 0D 0E 0A 0A 0E 0D 09 06 01' + '10 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00' + '00 10 10 03 0C 0E 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D' + '0D 0D 0D 0D 0D 0D 0D 0E 0D 0B 0A 0E 0D 0E 0A 06' + '01 10 10 10 10 00 00 00 00 00 00 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D' + '0D 0D 0D 0E 0D 0D 0D 0D 0E 0B 0A 0E 0E 0E 0E 0A' + '05 01 10 10 10 10 00 00 00 00 00 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0D 0D 0D 0D 0D 0D 0D 0E 0D' + '0D 0E 0D 0D 0D 0D 0E 0D 0E 0B 0A 0E 0E 0E 0E 0F' + '0A 06 01 10 10 10 10 00 00 00 00 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0E 0D 0D 0D 0E 0D 0D 0D 0D' + '0E 0D 0E 0D 0E 0D 0D 0E 0D 0B 0A 0E 0F 0E 0E 0E' + '0F 0A 05 01 10 10 10 10 00 00 00 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0D 0D 0E 0D 0D 0D 0E 0D 0E' + '0D 0D 0D 0E 0D 0D 0E 0D 0E 0B 0A 0F 0E 0E 0F 0E' + '0F 0E 0B 05 02 10 10 10 10 00 00 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0D 0E 0D 0D 0E 0D 0D 0E 0D' + '0E 0D 0E 0D 0E 0E 0D 0E 0E 0B 0B 0E 0F 0E 0E 0F' + '0E 0F 0F 0B 05 01 10 10 10 10 00 00 00 00 00 00' + '00 10 10 03 0C 0F 0E 0D 0D 0D 0E 0D 0E 0D 0D 0E' + '0D 0E 0D 0E 0D 0D 0E 0D 0E 0B 0A 0F 0E 0F 0F 0F' + '0F 0F 0F 0F 0B 06 01 10 10 10 10 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0E 0D 0E 0D 0D 0E 0E 0D 0E' + '0D 0D 0E 0D 0E 0E 0D 0E 0E 0B 0B 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0B 05 02 10 10 10 00 00 00 00 00' + '00 10 10 03 0C 0F 0E 0D 0E 0D 0E 0E 0D 0D 0E 0D' + '0E 0E 0D 0E 0E 0D 0E 0E 0E 0B 09 0B 0B 0B 0A 0B' + '0B 0A 0B 0A 0B 0B 09 05 10 10 10 00 00 00 00 00' + '00 10 10 03 0C 0F 0E 0D 0D 0E 0D 0D 0E 0E 0D 0E' + '0D 0E 0E 0D 0E 0E 0E 0D 0E 0D 0C 0C 0C 0C 0C 0C' + '0C 0C 0C 0C 0B 0C 0C 06 10 10 10 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0E 0E 0D 0E 0E 0E 0D 0E 0E' + '0E 0E 0D 0E 0E 0E 0D 0E 0E 0E 0E 0E 0E 0E 0E 0E' + '0E 0E 0E 0E 0F 0E 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0C 0F 0E 0D 0E 0E 0D 0E 0E 0E 0D 0E' + '0E 0D 0E 0E 0D 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' + '0E 0E 0E 0E 0E 0F 0D 06 10 10 10 00 00 00 00 00' + '00 10 10 03 0C 0F 0D 0E 0E 0E 0E 0D 0E 0D 0E 0E' + '0D 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' + '0F 0E 0E 0E 0E 0E 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 03 0D 0F 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' + '0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' + '0E 0E 0E 0E 0E 0F 0D 06 10 10 10 00 00 00 00 00' + '00 10 10 03 0C 0F 0E 0E 0E 0E 0E 0F 0E 0E 0E 0E' + '0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0F 0E' + '0E 0E 0E 0F 0E 0E 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0C 0F 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' + '0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0F 0E 0E 0E 0E' + '0E 0F 0E 0E 0E 0F 0E 06 10 10 10 00 00 00 00 00' + '00 10 10 03 0C 0F 0F 0E 0E 0E 0F 0E 0F 0E 0F 0E' + '0F 0E 0E 0E 0E 0E 0E 0F 0E 0E 0E 0E 0E 0E 0E 0F' + '0E 0E 0F 0E 0F 0E 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 03 0D 0F 0E 0E 0E 0F 0E 0E 0E 0F 0E 0F' + '0E 0F 0E 0F 0F 0E 0F 0E 0F 0E 0F 0E 0F 0E 0E 0E' + '0F 0E 0E 0E 0E 0F 0E 06 10 10 10 00 00 00 00 00' + '00 10 10 04 0C 0F 0E 0E 0F 0E 0E 0E 0F 0E 0F 0E' + '0F 0E 0F 0F 0E 0F 0F 0F 0E 0F 0F 0F 0E 0F 0E 0F' + '0E 0F 0E 0F 0F 0E 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 03 0D 0F 0E 0E 0E 0F 0E 0F 0E 0E 0F 0F' + '0E 0F 0F 0E 0F 0E 0F 0F 0F 0F 0E 0F 0F 0F 0F 0E' + '0F 0E 0E 0E 0F 0F 0E 06 10 10 10 00 00 00 00 00' + '00 10 10 04 0C 0F 0F 0E 0F 0E 0F 0E 0F 0F 0F 0E' + '0F 0F 0E 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0E 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 03 0D 0F 0E 0F 0E 0F 0E 0F 0E 0F 0E 0F' + '0F 0E 0F 0E 0F 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 06 01 10 10 00 00 00 00 00' + '00 10 10 04 0C 0F 0F 0E 0E 0F 0F 0E 0F 0E 0F 0E' + '0F 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 03 0D 0F 0E 0F 0F 0E 0E 0F 0F 0F 0F 0F' + '0E 0F 0F 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 06 10 10 10 00 00 00 00 00' + '00 10 10 04 0C 0F 0F 0F 0E 0F 0F 0F 0E 0F 0F 0E' + '0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0D 0F 0E 0F 0F 0E 0F 0F 0F 0E 0F 0F' + '0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 03 0C 0F 0F 0E 0F 0F 0F 0E 0F 0F 0F 0F' + '0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0D 0F 0F 0F 0E 0F 0F 0F 0F 0F 0E 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 03 0D 0F 0F 0E 0F 0F 0F 0F 0E 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0C 0F 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0D 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 03 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0C 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0C 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' + '00 10 10 04 0D 0F 0F 0F 0F 0F 0F 0F 0F 0E 0F 0F' + '0E 0F 0E 0F 0E 0F 0F 0E 0F 0E 0F 0F 0F 0F 0E 0F' + '0F 0F 0E 0F 0E 0F 0E 09 10 10 10 00 00 00 00 00' + '00 10 10 02 0A 09 09 09 09 09 09 09 09 09 09 09' + '09 09 09 08 09 09 08 09 08 09 08 08 08 08 08 08' + '08 08 08 08 08 08 08 05 10 10 10 00 00 00 00 00' + '00 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 10 10 10 10 10 10 10 10 00 00 00 00 00' + '00 00 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' + '10 10 10 10 10 10 10 10 10 10 00 00 00 00 F0 00' + '00 01 FF FF 00 00 E0 00 00 00 FF FF 00 00 E0 00' + '00 00 7F FF 00 00 E0 00 00 00 3F FF 00 00 E0 00' + '00 00 1F FF 00 00 E0 00 00 00 0F FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 03 FF 00 00 E0 00' + '00 00 01 FF 00 00 E0 00 00 00 00 FF 00 00 E0 00' + '00 00 00 7F 00 00 E0 00 00 00 00 3F 00 00 E0 00' + '00 00 00 1F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 F0 00 00 00 00 0F 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00' + '00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 04 00 00 00 29 00 00' + '00 38 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 38 00 00 00 34 00 00 00 19 00 00' + '00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 01 00 00 00 76 00 00 00 F1 00 00' + '00 F9 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F8 00 00 00 F2 00 00 00 B2 00 00' + '00 49 00 00 00 05 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 5A 00 00 00 FF 01 01 01 FF 06 06' + '06 FF 05 05 05 FF 05 05 05 FF 05 05 05 FF 05 05' + '05 FF 05 05 05 FF 05 05 05 FF 05 05 05 FF 05 05' + '05 FF 05 05 05 FF 05 05 05 FF 05 05 05 FF 05 05' + '05 FF 05 05 05 FF 05 05 05 FF 05 05 05 FF 04 04' + '04 FF 04 04 04 FF 04 04 04 FF 03 03 03 FF 02 02' + '02 FF 03 03 03 FF 02 02 02 FF 00 00 00 FF 00 00' + '00 D9 00 00 00 39 00 00 00 06 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 2E 2E 2E FF 88 88' + '88 FF 87 87 87 FF 86 86 86 FF 86 86 86 FF 85 85' + '85 FF 84 84 84 FF 84 84 84 FF 83 83 83 FF 82 82' + '82 FF 82 82 82 FF 81 81 81 FF 80 80 80 FF 7F 7F' + '7F FF 7F 7F 7F FF 7E 7E 7E FF 7D 7D 7D FF 7C 7C' + '7C FF 7C 7C 7C FF 7B 7B 7B FF 74 74 74 FF 72 72' + '72 FF 73 73 73 FF 67 67 67 FF 18 18 18 FF 00 00' + '00 FF 00 00 00 D9 00 00 00 58 00 00 00 03 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 38 38 38 FF C1 C1' + 'C1 FF F2 F2 F2 FF EA EA EA FF EA EA EA FF EA EA' + 'EA FF EA EA EA FF E9 E9 E9 FF E9 E9 E9 FF E9 E9' + 'E9 FF E9 E9 E9 FF E9 E9 E9 FF E8 E8 E8 FF E8 E8' + 'E8 FF E8 E8 E8 FF E9 E9 E9 FF EB EB EB FF EA EA' + 'EA FF EA EA EA FF EA EA EA FF EB EB EB FF F1 F1' + 'F1 FF C4 C4 C4 FF 8C 8C 8C FF 67 67 67 FF 15 15' + '15 FF 00 00 00 FF 00 00 00 DC 00 00 00 4C 00 00' + '00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 35 35 35 FF C8 C8' + 'C8 FF FA FA FA FF DD DD DD FF DE DE DE FF DE DE' + 'DE FF DF DF DF FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E1 E1 E1 FF E1 E1 E1 FF E2 E2 E2 FF E2 E2' + 'E2 FF E2 E2 E2 FF E2 E2 E2 FF E3 E3 E3 FF E8 E8' + 'E8 FF BA BA BA FF A3 A3 A3 FF A6 A6 A6 FF 6B 6B' + '6B FF 0B 0B 0B FF 00 00 00 FF 00 00 00 EB 00 00' + '00 4B 00 00 00 03 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 35 35 35 FF C7 C7' + 'C7 FF F9 F9 F9 FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DB DB DB FF DB DB DB FF DB DB' + 'DB FF DC DC DC FF DC DC DC FF DC DC DC FF DC DC' + 'DC FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DE DE DE FF E3 E3' + 'E3 FF B7 B7 B7 FF A8 A8 A8 FF DE DE DE FF A8 A8' + 'A8 FF 6C 6C 6C FF 25 25 25 FF 00 00 00 FF 00 00' + '00 DE 00 00 00 57 00 00 00 03 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 35 35 35 FF C7 C7' + 'C7 FF F9 F9 F9 FF DC DC DC FF DB DB DB FF DB DB' + 'DB FF DC DC DC FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DF DF DF FF DE DE' + 'DE FF DF DF DF FF DF DF DF FF E0 E0 E0 FF E5 E5' + 'E5 FF B8 B8 B8 FF A7 A7 A7 FF EB EB EB FF DE DE' + 'DE FF A4 A4 A4 FF 72 72 72 FF 17 17 17 FF 00 00' + '00 FF 00 00 00 DC 00 00 00 4C 00 00 00 06 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 36 36 36 FF C8 C8' + 'C8 FF FA FA FA FF DC DC DC FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E1 E1 E1 FF E6 E6' + 'E6 FF B9 B9 B9 FF A9 A9 A9 FF EA EA EA FF EA EA' + 'EA FF E9 E9 E9 FF B1 B1 B1 FF 72 72 72 FF 14 14' + '14 FF 00 00 00 FF 00 00 00 EB 00 00 00 4B 00 00' + '00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 37 37 37 FF C9 C9' + 'C9 FF FA FA FA FF DD DD DD FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E1 E1 E1 FF E1 E1' + 'E1 FF E1 E1 E1 FF E1 E1 E1 FF E2 E2 E2 FF E7 E7' + 'E7 FF BA BA BA FF AA AA AA FF EC EC EC FF EA EA' + 'EA FF ED ED ED FF EA EA EA FF B2 B2 B2 FF 6A 6A' + '6A FF 1C 1C 1C FF 00 00 00 FF 00 00 00 DE 00 00' + '00 57 00 00 00 04 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 37 37 37 FF C9 C9' + 'C9 FF FA FA FA FF DF DF DF FF DE DE DE FF DF DF' + 'DF FF DF DF DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E1 E1 E1 FF E1 E1 E1 FF E1 E1' + 'E1 FF E1 E1 E1 FF E2 E2 E2 FF E2 E2 E2 FF E2 E2' + 'E2 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3 E3 FF E8 E8' + 'E8 FF BA BA BA FF AC AC AC FF EF EF EF FF ED ED' + 'ED FF ED ED ED FF F1 F1 F1 FF F1 F1 F1 FF B1 B1' + 'B1 FF 6B 6B 6B FF 13 13 13 FF 00 00 00 FF 00 00' + '00 DC 00 00 00 46 00 00 00 05 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 37 37 37 FF C9 C9' + 'C9 FF FA FA FA FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E1 E1 E1 FF E1 E1 E1 FF E1 E1' + 'E1 FF E1 E1 E1 FF E2 E2 E2 FF E2 E2 E2 FF E2 E2' + 'E2 FF E2 E2 E2 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3' + 'E3 FF E3 E3 E3 FF E3 E3 E3 FF E4 E4 E4 FF E9 E9' + 'E9 FF BB BB BB FF AD AD AD FF F3 F3 F3 FF F1 F1' + 'F1 FF F1 F1 F1 FF F1 F1 F1 FF F4 F4 F4 FF F5 F5' + 'F5 FF B5 B5 B5 FF 70 70 70 FF 14 14 14 FF 00 00' + '00 FF 00 00 00 E0 00 00 00 3F 00 00 00 02 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 37 37 37 FF CA CA' + 'CA FF FB FB FB FF E1 E1 E1 FF E1 E1 E1 FF E1 E1' + 'E1 FF E1 E1 E1 FF E2 E2 E2 FF E2 E2 E2 FF E2 E2' + 'E2 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3 E3 FF E3 E3' + 'E3 FF E3 E3 E3 FF E3 E3 E3 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5 E5 FF EA EA' + 'EA FF BC BC BC FF AF AF AF FF F5 F5 F5 FF F3 F3' + 'F3 FF F3 F3 F3 FF F3 F3 F3 FF F4 F4 F4 FF F8 F8' + 'F8 FF F4 F4 F4 FF B6 B6 B6 FF 6C 6C 6C FF 22 22' + '22 FF 00 00 00 FF 00 00 00 D4 00 00 00 49 00 00' + '00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 38 38 38 FF CA CA' + 'CA FF FB FB FB FF E2 E2 E2 FF E1 E1 E1 FF E2 E2' + 'E2 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3 E3 FF E3 E3' + 'E3 FF E3 E3 E3 FF E4 E4 E4 FF E3 E3 E3 FF E3 E3' + 'E3 FF E4 E4 E4 FF E5 E5 E5 FF E5 E5 E5 FF E5 E5' + 'E5 FF E5 E5 E5 FF E6 E6 E6 FF E6 E6 E6 FF EB EB' + 'EB FF BC BC BC FF B1 B1 B1 FF F8 F8 F8 FF F6 F6' + 'F6 FF F6 F6 F6 FF F7 F7 F7 FF F8 F8 F8 FF F8 F8' + 'F8 FF FC FC FC FF FC FC FC FF B5 B5 B5 FF 70 70' + '70 FF 18 18 18 FF 00 00 00 FF 00 00 00 D4 00 00' + '00 3F 00 00 00 05 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 38 38 38 FF CB CB' + 'CB FF FC FC FC FF E3 E3 E3 FF E3 E3 E3 FF E3 E3' + 'E3 FF E3 E3 E3 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E5 E5 E5 FF E5 E5 E5 FF E5 E5' + 'E5 FF E5 E5 E5 FF E6 E6 E6 FF E6 E6 E6 FF E6 E6' + 'E6 FF E6 E6 E6 FF E6 E6 E6 FF E6 E6 E6 FF EC EC' + 'EC FF BD BD BD FF B3 B3 B3 FF FC FC FC FF F9 F9' + 'F9 FF FA FA FA FF FA FA FA FF FB FB FB FF FC FC' + 'FC FF FC FC FC FF FF FF FF FF FF FF FF FF BA BA' + 'BA FF 75 75 75 FF 18 18 18 FF 00 00 00 FF 00 00' + '00 E0 00 00 00 3E 00 00 00 03 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 38 38 38 FF CB CB' + 'CB FF FC FC FC FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E5 E5 E5 FF E5 E5 E5 FF E5 E5' + 'E5 FF E5 E5 E5 FF E6 E6 E6 FF E6 E6 E6 FF E6 E6' + 'E6 FF E6 E6 E6 FF E6 E6 E6 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF ED ED' + 'ED FF BE BE BE FF B5 B5 B5 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FB FB' + 'FB FF BE BE BE FF 6E 6E 6E FF 1C 1C 1C FF 00 00' + '00 FF 00 00 00 BB 00 00 00 1F 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 38 38 38 FF CC CC' + 'CC FF FC FC FC FF E4 E4 E4 FF E4 E4 E4 FF E5 E5' + 'E5 FF E5 E5 E5 FF E6 E6 E6 FF E5 E5 E5 FF E5 E5' + 'E5 FF E6 E6 E6 FF E7 E7 E7 FF E6 E6 E6 FF E6 E6' + 'E6 FF E7 E7 E7 FF E7 E7 E7 FF E8 E8 E8 FF E8 E8' + 'E8 FF E8 E8 E8 FF E8 E8 E8 FF E9 E9 E9 FF EE EE' + 'EE FF C3 C3 C3 FF 9A 9A 9A FF B9 B9 B9 FF B8 B8' + 'B8 FF B7 B7 B7 FF B7 B7 B7 FF B7 B7 B7 FF B7 B7' + 'B7 FF B6 B6 B6 FF B5 B5 B5 FF B5 B5 B5 FF B8 B8' + 'B8 FF B5 B5 B5 FF 91 91 91 FF 67 67 67 FF 01 01' + '01 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 39 39 39 FF CC CC' + 'CC FF FC FC FC FF E6 E6 E6 FF E7 E7 E7 FF E6 E6' + 'E6 FF E6 E6 E6 FF E6 E6 E6 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E8 E8 E8 FF E8 E8' + 'E8 FF E8 E8 E8 FF E8 E8 E8 FF E9 E9 E9 FF E9 E9' + 'E9 FF E9 E9 E9 FF E9 E9 E9 FF EA EA EA FF EB EB' + 'EB FF E2 E2 E2 FF CD CD CD FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF C9 C9 C9 FF C9 C9' + 'C9 FF C9 C9 C9 FF C9 C9 C9 FF C9 C9 C9 FF C9 C9' + 'C9 FF CD CD CD FF CC CC CC FF 7A 7A 7A FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 39 39 39 FF CC CC' + 'CC FF FC FC FC FF E8 E8 E8 FF E8 E8 E8 FF E8 E8' + 'E8 FF E7 E7 E7 FF E7 E7 E7 FF E8 E8 E8 FF E8 E8' + 'E8 FF E8 E8 E8 FF E8 E8 E8 FF E9 E9 E9 FF E9 E9' + 'E9 FF E9 E9 E9 FF E9 E9 E9 FF EA EA EA FF EA EA' + 'EA FF EA EA EA FF EA EA EA FF EB EB EB FF EB EB' + 'EB FF ED ED ED FF EF EF EF FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F1 F1 F1 FF F1 F1' + 'F1 FF F1 F1 F1 FF F1 F1 F1 FF F2 F2 F2 FF F2 F2' + 'F2 FF F6 F6 F6 FF EC EC EC FF 7A 7A 7A FF 04 04' + '04 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3A 3A 3A FF CE CE' + 'CE FF FD FD FD FF E9 E9 E9 FF E9 E9 E9 FF EA EA' + 'EA FF E9 E9 E9 FF E8 E8 E8 FF E8 E8 E8 FF E9 E9' + 'E9 FF E9 E9 E9 FF EA EA EA FF EA EA EA FF EA EA' + 'EA FF EA EA EA FF EB EB EB FF EB EB EB FF EA EA' + 'EA FF EB EB EB FF EC EC EC FF EC EC EC FF EC EC' + 'EC FF EC EC EC FF EC EC EC FF ED ED ED FF ED ED' + 'ED FF ED ED ED FF ED ED ED FF EE EE EE FF ED ED' + 'ED FF ED ED ED FF EE EE EE FF EF EF EF FF EF EF' + 'EF FF F2 F2 F2 FF E9 E9 E9 FF 7B 7B 7B FF 04 04' + '04 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3A 3A 3A FF CD CD' + 'CD FF FD FD FD FF EA EA EA FF EB EB EB FF EC EC' + 'EC FF ED ED ED FF EC EC EC FF E9 E9 E9 FF EA EA' + 'EA FF EA EA EA FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EC EC EC FF EC EC' + 'EC FF EC EC EC FF EC EC EC FF ED ED ED FF ED ED' + 'ED FF ED ED ED FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF EE EE EE FF EE EE EE FF EF EF EF FF EF EF' + 'EF FF EF EF EF FF EF EF EF FF F0 F0 F0 FF F0 F0' + 'F0 FF F4 F4 F4 FF E9 E9 E9 FF 7B 7B 7B FF 04 04' + '04 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3A 3A 3A FF CE CE' + 'CE FF FE FE FE FF EC EC EC FF EC EC EC FF ED ED' + 'ED FF EE EE EE FF EF EF EF FF EE EE EE FF EB EB' + 'EB FF EB EB EB FF EC EC EC FF EC EC EC FF EC EC' + 'EC FF EC EC EC FF EC EC EC FF ED ED ED FF ED ED' + 'ED FF ED ED ED FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF EE EE EE FF EE EE EE FF EF EF EF FF EF EF' + 'EF FF EF EF EF FF EF EF EF FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F1 F1 F1 FF F1 F1' + 'F1 FF F4 F4 F4 FF EA EA EA FF 7C 7C 7C FF 04 04' + '04 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3B 3B 3B FF CE CE' + 'CE FF FE FE FE FF ED ED ED FF ED ED ED FF EE EE' + 'EE FF EF EF EF FF F0 F0 F0 FF F1 F1 F1 FF F0 F0' + 'F0 FF EE EE EE FF EC EC EC FF EC EC EC FF ED ED' + 'ED FF ED ED ED FF EE EE EE FF EE EE EE FF EE EE' + 'EE FF EE EE EE FF EF EF EF FF EF EF EF FF EF EF' + 'EF FF EF EF EF FF EF EF EF FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F1 F1 F1 FF F1 F1' + 'F1 FF F1 F1 F1 FF F1 F1 F1 FF F2 F2 F2 FF F1 F1' + 'F1 FF F5 F5 F5 FF EA EA EA FF 7D 7D 7D FF 04 04' + '04 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3B 3B 3B FF CF CF' + 'CF FF FE FE FE FF EE EE EE FF EF EF EF FF F0 F0' + 'F0 FF F0 F0 F0 FF F1 F1 F1 FF F2 F2 F2 FF F2 F2' + 'F2 FF F3 F3 F3 FF F1 F1 F1 FF EE EE EE FF EE EE' + 'EE FF EE EE EE FF EE EE EE FF EE EE EE FF EF EF' + 'EF FF EF EF EF FF EF EF EF FF EF EF EF FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F1 F1 F1 FF F1 F1' + 'F1 FF F1 F1 F1 FF F1 F1 F1 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F3 F3 F3 FF F3 F3' + 'F3 FF F6 F6 F6 FF EB EB EB FF 7D 7D 7D FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3B 3B 3B FF CF CF' + 'CF FF FF FF FF FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F1 F1 F1 FF F2 F2 F2 FF F3 F3 F3 FF F3 F3' + 'F3 FF F4 F4 F4 FF F5 F5 F5 FF F5 F5 F5 FF F4 F4' + 'F4 FF F3 F3 F3 FF F2 F2 F2 FF F1 F1 F1 FF F1 F1' + 'F1 FF F0 F0 F0 FF F0 F0 F0 FF F1 F1 F1 FF F1 F1' + 'F1 FF F0 F0 F0 FF F0 F0 F0 FF F1 F1 F1 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F3 F3 F3 FF F3 F3' + 'F3 FF F3 F3 F3 FF F3 F3 F3 FF F4 F4 F4 FF F4 F4' + 'F4 FF F7 F7 F7 FF EB EB EB FF 7E 7E 7E FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3C 3C 3C FF D0 D0' + 'D0 FF FF FF FF FF F1 F1 F1 FF F1 F1 F1 FF F2 F2' + 'F2 FF F2 F2 F2 FF F3 F3 F3 FF F4 F4 F4 FF F4 F4' + 'F4 FF F5 F5 F5 FF F6 F6 F6 FF F6 F6 F6 FF F7 F7' + 'F7 FF F7 F7 F7 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8' + 'F8 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F8 F8' + 'F8 FF F6 F6 F6 FF F6 F6 F6 FF F5 F5 F5 FF F3 F3' + 'F3 FF F3 F3 F3 FF F3 F3 F3 FF F3 F3 F3 FF F4 F4' + 'F4 FF F4 F4 F4 FF F4 F4 F4 FF F5 F5 F5 FF F5 F5' + 'F5 FF F8 F8 F8 FF EB EB EB FF 7E 7E 7E FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3D 3D 3D FF D1 D1' + 'D1 FF FF FF FF FF F2 F2 F2 FF F2 F2 F2 FF F3 F3' + 'F3 FF F3 F3 F3 FF F4 F4 F4 FF F5 F5 F5 FF F5 F5' + 'F5 FF F6 F6 F6 FF F7 F7 F7 FF F7 F7 F7 FF F8 F8' + 'F8 FF F8 F8 F8 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF FA FA FA FF FB FB FB FF FB FB FB FF FC FC' + 'FC FF FC FC FC FF FC FC FC FF FC FC FC FF FC FC' + 'FC FF FA FA FA FF F7 F7 F7 FF F5 F5 F5 FF F5 F5' + 'F5 FF F5 F5 F5 FF F5 F5 F5 FF F6 F6 F6 FF F6 F6' + 'F6 FF F9 F9 F9 FF EC EC EC FF 7F 7F 7F FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3D 3D 3D FF D1 D1' + 'D1 FF FF FF FF FF F3 F3 F3 FF F3 F3 F3 FF F4 F4' + 'F4 FF F4 F4 F4 FF F5 F5 F5 FF F6 F6 F6 FF F6 F6' + 'F6 FF F7 F7 F7 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8' + 'F8 FF F9 F9 F9 FF F9 F9 F9 FF FA FA FA FF FA FA' + 'FA FF FA FA FA FF FA FA FA FF FB FB FB FF FC FC' + 'FC FF FC FC FC FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FD FD FD FF FE FE FE FF FD FD FD FF FA FA' + 'FA FF F7 F7 F7 FF F5 F5 F5 FF F6 F6 F6 FF F7 F7' + 'F7 FF FA FA FA FF EC EC EC FF 80 80 80 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3E 3E 3E FF D2 D2' + 'D2 FF FF FF FF FF F4 F4 F4 FF F5 F5 F5 FF F5 F5' + 'F5 FF F5 F5 F5 FF F7 F7 F7 FF F7 F7 F7 FF F7 F7' + 'F7 FF F8 F8 F8 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF FA FA FA FF FA FA FA FF FB FB FB FF FB FB' + 'FB FF FB FB FB FF FC FC FC FF FC FC FC FF FC FC' + 'FC FF FD FD FD FF FD FD FD FF FD FD FD FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FF FF' + 'FF FF FE FE FE FF FB FB FB FF F8 F8 F8 FF F7 F7' + 'F7 FF FB FB FB FF ED ED ED FF 81 81 81 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3E 3E 3E FF D2 D2' + 'D2 FF FF FF FF FF F5 F5 F5 FF F6 F6 F6 FF F6 F6' + 'F6 FF F6 F6 F6 FF F7 F7 F7 FF F8 F8 F8 FF F8 F8' + 'F8 FF F8 F8 F8 FF F8 F8 F8 FF F9 F9 F9 FF FA FA' + 'FA FF FA FA FA FF FA FA FA FF FB FB FB FF FB FB' + 'FB FF FC FC FC FF FC FC FC FF FC FC FC FF FD FD' + 'FD FF FD FD FD FF FD FD FD FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FE FE FE FF FA FA' + 'FA FF FC FC FC FF ED ED ED FF 80 80 80 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3E 3E 3E FF D3 D3' + 'D3 FF FF FF FF FF F6 F6 F6 FF F7 F7 F7 FF F7 F7' + 'F7 FF F7 F7 F7 FF F8 F8 F8 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF FA FA FA FF FA FA FA FF FA FA' + 'FA FF FB FB FB FF FB FB FB FF FC FC FC FF FC FC' + 'FC FF FC FC FC FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FD FD FD FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF EE EE EE FF 82 82 82 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3E 3E 3E FF D3 D3' + 'D3 FF FF FF FF FF F7 F7 F7 FF F7 F7 F7 FF F8 F8' + 'F8 FF F9 F9 F9 FF F8 F8 F8 FF F8 F8 F8 FF FA FA' + 'FA FF FA FA FA FF FB FB FB FF FB FB FB FF FB FB' + 'FB FF FC FC FC FF FC FC FC FF FC FC FC FF FC FC' + 'FC FF FD FD FD FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F0 F0 F0 FF 82 82 82 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3F 3F 3F FF D4 D4' + 'D4 FF FF FF FF FF F8 F8 F8 FF F8 F8 F8 FF F9 F9' + 'F9 FF F9 F9 F9 FF FA FA FA FF FA FA FA FF FA FA' + 'FA FF FA FA FA FF FB FB FB FF FB FB FB FF FC FC' + 'FC FF FC FC FC FF FC FC FC FF FD FD FD FF FD FD' + 'FD FF FD FD FD FF FD FD FD FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF EF EF EF FF 82 82 82 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3F 3F 3F FF D5 D5' + 'D5 FF FF FF FF FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF FA FA FA FF FB FB FB FF FB FB FB FF FB FB' + 'FB FF FC FC FC FF FC FC FC FF FC FC FC FF FC FC' + 'FC FF FD FD FD FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F0 F0 F0 FF 83 83 83 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 3F 3F 3F FF D5 D5' + 'D5 FF FF FF FF FF FA FA FA FF FA FA FA FF FB FB' + 'FB FF FB FB FB FF FB FB FB FF FB FB FB FF FC FC' + 'FC FF FC FC FC FF FC FC FC FF FD FD FD FF FD FD' + 'FD FF FD FD FD FF FD FD FD FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F0 F0 F0 FF 84 84 84 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 40 40 40 FF D5 D5' + 'D5 FF FF FF FF FF FB FB FB FF FB FB FB FF FB FB' + 'FB FF FC FC FC FF FC FC FC FF FC FC FC FF FC FC' + 'FC FF FD FD FD FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FD FD FD FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F0 F0 F0 FF 85 85 85 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 40 40 40 FF D6 D6' + 'D6 FF FF FF FF FF FB FB FB FF FB FB FB FF FC FC' + 'FC FF FC FC FC FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FD FD FD FF FD FD FD FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F0 F0 F0 FF 85 85 85 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 41 41 41 FF D6 D6' + 'D6 FF FF FF FF FF FB FB FB FF FC FC FC FF FD FD' + 'FD FF FD FD FD FF FC FC FC FF FD FD FD FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F0 F0 F0 FF 86 86 86 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 41 41 41 FF D6 D6' + 'D6 FF FF FF FF FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F1 F1 F1 FF 87 87 87 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 41 41 41 FF D7 D7' + 'D7 FF FF FF FF FF FD FD FD FF FD FD FD FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F1 F1 F1 FF 87 87 87 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 41 41 41 FF D7 D7' + 'D7 FF FF FF FF FF FE FE FE FF FE FE FE FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F1 F1 F1 FF 88 88 88 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 41 41 41 FF D7 D7' + 'D7 FF FF FF FF FF FE FE FE FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F1 F1 F1 FF 88 88 88 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 42 42 42 FF D8 D8' + 'D8 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F1 F1 F1 FF 89 89 89 FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 42 42 42 FF D9 D9' + 'D9 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F2 F2 F2 FF 8A 8A 8A FF 05 05' + '05 FF 00 00 00 F7 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 84 00 00 00 FF 47 47 47 FF D9 D9' + 'D9 FF FB FB FB FF F8 F8 F8 FF F8 F8 F8 FF F8 F8' + 'F8 FF F7 F7 F7 FF F7 F7 F7 FF F7 F7 F7 FF F7 F7' + 'F7 FF F7 F7 F7 FF F7 F7 F7 FF F7 F7 F7 FF F7 F7' + 'F7 FF F6 F6 F6 FF F6 F6 F6 FF F6 F6 F6 FF F6 F6' + 'F6 FF F6 F6 F6 FF F5 F5 F5 FF F5 F5 F5 FF F5 F5' + 'F5 FF F5 F5 F5 FF F5 F5 F5 FF F4 F4 F4 FF F4 F4' + 'F4 FF F4 F4 F4 FF F4 F4 F4 FF F4 F4 F4 FF F4 F4' + 'F4 FF F4 F4 F4 FF F3 F3 F3 FF F3 F3 F3 FF F3 F3' + 'F3 FF F6 F6 F6 FF E8 E8 E8 FF 8F 8F 8F FF 06 06' + '06 FF 00 00 00 F7 00 00 00 38 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 83 00 00 00 FF 2D 2D 2D FF 98 98' + '98 FF 98 98 98 FF 97 97 97 FF 97 97 97 FF 97 97' + '97 FF 96 96 96 FF 95 95 95 FF 95 95 95 FF 95 95' + '95 FF 93 93 93 FF 93 93 93 FF 93 93 93 FF 92 92' + '92 FF 91 91 91 FF 90 90 90 FF 90 90 90 FF 90 90' + '90 FF 8F 8F 8F FF 8F 8F 8F FF 8E 8E 8E FF 8C 8C' + '8C FF 8C 8C 8C FF 8C 8C 8C FF 8B 8B 8B FF 89 89' + '89 FF 89 89 89 FF 88 88 88 FF 88 88 88 FF 86 86' + '86 FF 86 86 86 FF 86 86 86 FF 86 86 86 FF 84 84' + '84 FF 84 84 84 FF 87 87 87 FF 6C 6C 6C FF 04 04' + '04 FF 00 00 00 F7 00 00 00 33 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 47 00 00 00 F5 00 00 00 FF 04 04' + '04 FF 04 04 04 FF 04 04 04 FF 04 04 04 FF 04 04' + '04 FF 04 04 04 FF 04 04 04 FF 04 04 04 FF 04 04' + '04 FF 04 04 04 FF 04 04 04 FF 04 04 04 FF 04 04' + '04 FF 04 04 04 FF 04 04 04 FF 04 04 04 FF 04 04' + '04 FF 04 04 04 FF 04 04 04 FF 04 04 04 FF 04 04' + '04 FF 03 03 03 FF 03 03 03 FF 03 03 03 FF 03 03' + '03 FF 03 03 03 FF 03 03 03 FF 03 03 03 FF 03 03' + '03 FF 03 03 03 FF 03 03 03 FF 03 03 03 FF 03 03' + '03 FF 03 03 03 FF 03 03 03 FF 03 03 03 FF 00 00' + '00 FF 00 00 00 C1 00 00 00 14 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 52 00 00 00 EA 00 00' + '00 F3 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F4 00 00' + '00 C7 00 00 00 29 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 F0 00 00 01 FF FF 00 00 E0 00' + '00 00 FF FF 00 00 E0 00 00 00 7F FF 00 00 E0 00' + '00 00 3F FF 00 00 E0 00 00 00 1F FF 00 00 E0 00' + '00 00 0F FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 03 FF 00 00 E0 00 00 00 01 FF 00 00 E0 00' + '00 00 00 FF 00 00 E0 00 00 00 00 7F 00 00 E0 00' + '00 00 00 3F 00 00 E0 00 00 00 00 1F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 F0 00' + '00 00 00 0F 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 00' + '00 64 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 62 00 00 00 41 00 00' + '00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 4D 01 01 01 FB 05 05' + '05 FF 03 03 03 FF 03 03 03 FF 02 02 02 FF 02 02' + '02 FF 02 02 02 FF 02 02 02 FF 02 02 02 FF 02 02' + '02 FF 02 02 02 FF 02 02 02 FF 02 02 02 FF 01 01' + '01 FF 00 00 00 FF 03 03 03 FF 01 01 01 FD 00 00' + '00 7F 00 00 00 02 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1A 1A 1A FF 8C 8C' + '8C FF 9F 9F 9F FF 9C 9C 9C FF 9A 9A 9A FF 9A 9A' + '9A FF 99 99 99 FF 99 99 99 FF 97 97 97 FF 97 97' + '97 FF 96 96 96 FF 96 96 96 FF 95 95 95 FF 93 93' + '93 FF 8E 8E 8E FF 7D 7D 7D FF 33 33 33 FF 00 00' + '00 FD 00 00 00 79 00 00 00 02 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1D 1D 1D FF C6 C6' + 'C6 FF F7 F7 F7 FF EA EA EA FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EC EC EC FF EC EC' + 'EC FF ED ED ED FF EE EE EE FF EE EE EE FF EF EF' + 'EF FF F3 F3 F3 FF B7 B7 B7 FF 94 94 94 FF 34 34' + '34 FF 00 00 00 FD 00 00 00 7A 00 00 00 02 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1C 1C 1C FF C4 C4' + 'C4 FF EB EB EB FF D8 D8 D8 FF DA DA DA FF DB DB' + 'DB FF DB DB DB FF DC DC DC FF DC DC DC FF DC DC' + 'DC FF DD DD DD FF DD DD DD FF DD DD DD FF DE DE' + 'DE FF E0 E0 E0 FF AE AE AE FF D1 D1 D1 FF A4 A4' + 'A4 FF 32 32 32 FF 00 00 00 FD 00 00 00 7A 00 00' + '00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1C 1C 1C FF C4 C4' + 'C4 FF ED ED ED FF DB DB DB FF DD DD DD FF DD DD' + 'DD FF DE DE DE FF DE DE DE FF DE DE DE FF DF DF' + 'DF FF DF DF DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E2 E2 E2 FF AE AE AE FF D9 D9 D9 FF E9 E9' + 'E9 FF A3 A3 A3 FF 2E 2E 2E FF 00 00 00 FD 00 00' + '00 7A 00 00 00 02 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1D 1D 1D FF C6 C6' + 'C6 FF EF EF EF FF DD DD DD FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E1 E1 E1 FF E1 E1 E1 FF E1 E1 E1 FF E2 E2' + 'E2 FF E4 E4 E4 FF B0 B0 B0 FF DA DA DA FF F1 F1' + 'F1 FF EC EC EC FF A3 A3 A3 FF 2B 2B 2B FF 00 00' + '00 FD 00 00 00 79 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1D 1D 1D FF C6 C6' + 'C6 FF EF EF EF FF DE DE DE FF E0 E0 E0 FF E0 E0' + 'E0 FF E1 E1 E1 FF E1 E1 E1 FF E1 E1 E1 FF E2 E2' + 'E2 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3 E3 FF E3 E3' + 'E3 FF E5 E5 E5 FF B1 B1 B1 FF DE DE DE FF F2 F2' + 'F2 FF F4 F4 F4 FF F1 F1 F1 FF A4 A4 A4 FF 2B 2B' + '2B FF 00 00 00 FC 00 00 00 72 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1D 1D 1D FF C7 C7' + 'C7 FF F1 F1 F1 FF E0 E0 E0 FF E2 E2 E2 FF E2 E2' + 'E2 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3 E3 FF E3 E3' + 'E3 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5' + 'E5 FF E7 E7 E7 FF B3 B3 B3 FF E1 E1 E1 FF F6 F6' + 'F6 FF F4 F4 F4 FF F9 F9 F9 FF F6 F6 F6 FF A6 A6' + 'A6 FF 2D 2D 2D FF 00 00 00 F9 00 00 00 6F 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1E 1E 1E FF C7 C7' + 'C7 FF F1 F1 F1 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3' + 'E3 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5 E5 FF E5 E5' + 'E5 FF E5 E5 E5 FF E5 E5 E5 FF E6 E6 E6 FF E6 E6' + 'E6 FF E8 E8 E8 FF B5 B5 B5 FF E8 E8 E8 FF FE FE' + 'FE FF FC FC FC FF FD FD FD FF FF FF FF FF FC FC' + 'FC FF AD AD AD FF 31 31 31 FF 00 00 00 F9 00 00' + '00 6F 00 00 00 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1E 1E 1E FF C8 C8' + 'C8 FF F3 F3 F3 FF E3 E3 E3 FF E5 E5 E5 FF E5 E5' + 'E5 FF E5 E5 E5 FF E6 E6 E6 FF E6 E6 E6 FF E6 E6' + 'E6 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E8 E8' + 'E8 FF EA EA EA FF B2 B2 B2 FF D8 D8 D8 FF EC EC' + 'EC FF EA EA EA FF EB EB EB FF EB EB EB FF EF EF' + 'EF FF EA EA EA FF 98 98 98 FF 2C 2C 2C FF 00 00' + '00 F5 00 00 00 42 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1E 1E 1E FF C8 C8' + 'C8 FF F3 F3 F3 FF E5 E5 E5 FF E6 E6 E6 FF E6 E6' + 'E6 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E8 E8' + 'E8 FF E8 E8 E8 FF E8 E8 E8 FF E9 E9 E9 FF E9 E9' + 'E9 FF EC EC EC FF C9 C9 C9 FF B3 B3 B3 FF B6 B6' + 'B6 FF B5 B5 B5 FF B5 B5 B5 FF B5 B5 B5 FF B4 B4' + 'B4 FF B6 B6 B6 FF BA BA BA FF 80 80 80 FF 03 03' + '03 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1F 1F 1F FF C9 C9' + 'C9 FF F5 F5 F5 FF E8 E8 E8 FF E8 E8 E8 FF E8 E8' + 'E8 FF E8 E8 E8 FF E9 E9 E9 FF E9 E9 E9 FF E9 E9' + 'E9 FF EA EA EA FF EA EA EA FF EA EA EA FF EB EB' + 'EB FF EB EB EB FF EE EE EE FF EE EE EE FF ED ED' + 'ED FF EE EE EE FF EE EE EE FF EF EF EF FF EF EF' + 'EF FF F0 F0 F0 FF F7 F7 F7 FF 93 93 93 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1F 1F 1F FF CA CA' + 'CA FF F7 F7 F7 FF EA EA EA FF EC EC EC FF EA EA' + 'EA FF E9 E9 E9 FF EA EA EA FF EA EA EA FF EB EB' + 'EB FF EB EB EB FF EC EC EC FF EC EC EC FF EC EC' + 'EC FF ED ED ED FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF EE EE EE FF EF EF EF FF EF EF EF FF EF EF' + 'EF FF F1 F1 F1 FF F6 F6 F6 FF 93 93 93 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 1F 1F 1F FF CA CA' + 'CA FF F8 F8 F8 FF EC EC EC FF EE EE EE FF EF EF' + 'EF FF EE EE EE FF EB EB EB FF EB EB EB FF EC EC' + 'EC FF ED ED ED FF ED ED ED FF ED ED ED FF EE EE' + 'EE FF EE EE EE FF EF EF EF FF EF EF EF FF EF EF' + 'EF FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F1 F1' + 'F1 FF F2 F2 F2 FF F7 F7 F7 FF 93 93 93 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 20 20 20 FF CB CB' + 'CB FF F9 F9 F9 FF EE EE EE FF F0 F0 F0 FF F1 F1' + 'F1 FF F2 F2 F2 FF F1 F1 F1 FF EE EE EE FF ED ED' + 'ED FF EE EE EE FF EE EE EE FF EE EE EE FF EF EF' + 'EF FF EF EF EF FF EF EF EF FF F0 F0 F0 FF F1 F1' + 'F1 FF F1 F1 F1 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F3 F3 F3 FF F8 F8 F8 FF 94 94 94 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 20 20 20 FF CC CC' + 'CC FF FB FB FB FF F0 F0 F0 FF F2 F2 F2 FF F2 F2' + 'F2 FF F4 F4 F4 FF F5 F5 F5 FF F5 F5 F5 FF F4 F4' + 'F4 FF F3 F3 F3 FF F3 F3 F3 FF F3 F3 F3 FF F3 F3' + 'F3 FF F3 F3 F3 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F3 F3 F3 FF F4 F4' + 'F4 FF F5 F5 F5 FF F9 F9 F9 FF 94 94 94 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 20 20 20 FF CD CD' + 'CD FF FB FB FB FF F2 F2 F2 FF F3 F3 F3 FF F4 F4' + 'F4 FF F5 F5 F5 FF F6 F6 F6 FF F7 F7 F7 FF F8 F8' + 'F8 FF F9 F9 F9 FF F9 F9 F9 FF FA FA FA FF FB FB' + 'FB FF FB FB FB FF FB FB FB FF FA FA FA FF F8 F8' + 'F8 FF F6 F6 F6 FF F5 F5 F5 FF F4 F4 F4 FF F5 F5' + 'F5 FF F6 F6 F6 FF FA FA FA FF 95 95 95 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 21 21 21 FF CE CE' + 'CE FF FD FD FD FF F4 F4 F4 FF F4 F4 F4 FF F6 F6' + 'F6 FF F6 F6 F6 FF F7 F7 F7 FF F8 F8 F8 FF F8 F8' + 'F8 FF FA FA FA FF FA FA FA FF FB FB FB FF FB FB' + 'FB FF FC FC FC FF FD FD FD FF FD FD FD FF FE FE' + 'FE FF FE FE FE FF FC FC FC FF F9 F9 F9 FF F6 F6' + 'F6 FF F7 F7 F7 FF FB FB FB FF 96 96 96 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 21 21 21 FF CE CE' + 'CE FF FE FE FE FF F5 F5 F5 FF F6 F6 F6 FF F7 F7' + 'F7 FF F8 F8 F8 FF F9 F9 F9 FF F9 F9 F9 FF FA FA' + 'FA FF FB FB FB FF FB FB FB FF FC FC FC FF FC FC' + 'FC FF FD FD FD FF FD FD FD FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FF FF FF FF FF FF FF FF FD FD' + 'FD FF FB FB FB FF FC FC FC FF 97 97 97 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 21 21 21 FF CF CF' + 'CF FF FF FF FF FF F7 F7 F7 FF F8 F8 F8 FF F8 F8' + 'F8 FF F9 F9 F9 FF FA FA FA FF FA FA FA FF FB FB' + 'FB FF FB FB FB FF FC FC FC FF FC FC FC FF FD FD' + 'FD FF FD FD FD FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 98 98 98 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 22 22 22 FF CF CF' + 'CF FF FF FF FF FF F8 F8 F8 FF F9 F9 F9 FF FA FA' + 'FA FF FA FA FA FF FA FA FA FF FB FB FB FF FC FC' + 'FC FF FC FC FC FF FD FD FD FF FD FD FD FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 99 99 99 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 22 22 22 FF D0 D0' + 'D0 FF FF FF FF FF F9 F9 F9 FF FA FA FA FF FB FB' + 'FB FF FB FB FB FF FB FB FB FF FC FC FC FF FD FD' + 'FD FF FD FD FD FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 99 99 99 FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 23 23 23 FF D1 D1' + 'D1 FF FF FF FF FF FA FA FA FF FB FB FB FF FC FC' + 'FC FF FC FC FC FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 9A 9A 9A FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 23 23 23 FF D1 D1' + 'D1 FF FF FF FF FF FC FC FC FF FC FC FC FF FD FD' + 'FD FF FD FD FD FF FD FD FD FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 9B 9B 9B FF 02 02' + '02 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 23 23 23 FF D2 D2' + 'D2 FF FF FF FF FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FE FE FE FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 9C 9C 9C FF 03 03' + '03 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 23 23 23 FF D3 D3' + 'D3 FF FF FF FF FF FE FE FE FF FE FE FE FF FE FE' + 'FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 9D 9D 9D FF 03 03' + '03 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 23 23 23 FF D3 D3' + 'D3 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 9D 9D 9D FF 03 03' + '03 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 24 24 24 FF D4 D4' + 'D4 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 9E 9E 9E FF 03 03' + '03 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 84 27 27 27 FF D8 D8' + 'D8 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FE FE FE FF FE FE' + 'FE FF FE FE FE FF FE FE FE FF FE FE FE FF FD FD' + 'FD FF FD FD FD FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FD FD FD FF FC FC FC FF FC FC FC FF FC FC' + 'FC FF FD FD FD FF FF FF FF FF A3 A3 A3 FF 04 04' + '04 FF 00 00 00 61 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 7F 18 18 18 FF 77 77' + '77 FF 7D 7D 7D FF 7B 7B 7B FF 7A 7A 7A FF 79 79' + '79 FF 79 79 79 FF 78 78 78 FF 78 78 78 FF 77 77' + '77 FF 76 76 76 FF 75 75 75 FF 75 75 75 FF 74 74' + '74 FF 73 73 73 FF 72 72 72 FF 71 71 71 FF 70 70' + '70 FF 70 70 70 FF 6F 6F 6F FF 6E 6E 6E FF 6E 6E' + '6E FF 6D 6D 6D FF 6E 6E 6E FF 59 59 59 FF 03 03' + '03 FF 00 00 00 59 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 2A 00 00 00 D3 00 00' + '00 F5 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F6 00 00' + '00 B6 00 00 00 14 00 00 00 00 00 00 00 00 E0 00' + '07 FF C0 00 03 FF C0 00 01 FF C0 00 00 FF C0 00' + '00 7F C0 00 00 3F C0 00 00 1F C0 00 00 1F C0 00' + '00 0F C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 20 00 00 00' + '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 01 01 01 63 05 05' + '05 AF 04 04 04 A8 04 04 04 A8 04 04 04 A8 04 04' + '04 A8 03 03 03 A8 03 03 03 AA 02 02 02 A0 00 00' + '00 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 13 13 13 CB A8 A8' + 'A8 FF BC BC BC FF B7 B7 B7 FF B7 B7 B7 FF B6 B6' + 'B6 FF B7 B7 B7 FF B6 B6 B6 FF 7A 7A 7A FF 0F 0F' + '0F D5 00 00 00 28 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 17 17 17 CC D1 D1' + 'D1 FF EA EA EA FF E5 E5 E5 FF E6 E6 E6 FF E7 E7' + 'E7 FF E9 E9 E9 FF E3 E3 E3 FF D0 D0 D0 FF 95 95' + '95 FF 0B 0B 0B D5 00 00 00 28 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 17 17 17 CC CD CD' + 'CD FF E4 E4 E4 FF DF DF DF FF E0 E0 E0 FF E1 E1' + 'E1 FF E2 E2 E2 FF DA DA DA FF CE CE CE FF F9 F9' + 'F9 FF 95 95 95 FF 0A 0A 0A D4 00 00 00 25 00 00' + '00 00 00 00 00 00 00 00 00 00 17 17 17 CC D0 D0' + 'D0 FF E7 E7 E7 FF E3 E3 E3 FF E4 E4 E4 FF E4 E4' + 'E4 FF E6 E6 E6 FF DD DD DD FF D2 D2 D2 FF FF FF' + 'FF FF FF FF FF FF 9E 9E 9E FF 0D 0D 0D D1 00 00' + '00 24 00 00 00 00 00 00 00 00 17 17 17 CC D1 D1' + 'D1 FF EB EB EB FF E5 E5 E5 FF E7 E7 E7 FF E7 E7' + 'E7 FF E9 E9 E9 FF E4 E4 E4 FF CB CB CB FF D7 D7' + 'D7 FF D9 D9 D9 FF DF DF DF FF 7C 7C 7C FF 00 00' + '00 9D 00 00 00 00 00 00 00 00 17 17 17 CC D4 D4' + 'D4 FF F0 F0 F0 FF E9 E9 E9 FF E9 E9 E9 FF EA EA' + 'EA FF EB EB EB FF EC EC EC FF E8 E8 E8 FF E4 E4' + 'E4 FF E5 E5 E5 FF EF EF EF FF BC BC BC FF 03 03' + '03 A8 00 00 00 00 00 00 00 00 17 17 17 CC D6 D6' + 'D6 FF F4 F4 F4 FF EF EF EF FF EE EE EE FF ED ED' + 'ED FF ED ED ED FF EE EE EE FF F0 F0 F0 FF F1 F1' + 'F1 FF F1 F1 F1 FF FC FC FC FF BD BD BD FF 02 02' + '02 A8 00 00 00 00 00 00 00 00 18 18 18 CC D8 D8' + 'D8 FF F8 F8 F8 FF F4 F4 F4 FF F5 F5 F5 FF F5 F5' + 'F5 FF F6 F6 F6 FF F6 F6 F6 FF F6 F6 F6 FF F5 F5' + 'F5 FF F4 F4 F4 FF FE FE FE FF BE BE BE FF 03 03' + '03 A8 00 00 00 00 00 00 00 00 18 18 18 CC DB DB' + 'DB FF FB FB FB FF F6 F6 F6 FF F8 F8 F8 FF FA FA' + 'FA FF FB FB FB FF FC FC FC FF FD FD FD FF FE FE' + 'FE FF FD FD FD FF FF FF FF FF C0 C0 C0 FF 02 02' + '02 A8 00 00 00 00 00 00 00 00 18 18 18 CC DC DC' + 'DC FF FE FE FE FF F9 F9 F9 FF FB FB FB FF FC FC' + 'FC FF FC FC FC FF FD FD FD FF FE FE FE FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF C3 C3 C3 FF 02 02' + '02 A8 00 00 00 00 00 00 00 00 18 18 18 CC DE DE' + 'DE FF FF FF FF FF FC FC FC FF FC FC FC FF FD FD' + 'FD FF FE FE FE FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF C4 C4 C4 FF 03 03' + '03 A8 00 00 00 00 00 00 00 00 18 18 18 CC DF DF' + 'DF FF FF FF FF FF FD FD FD FF FE FE FE FF FE FE' + 'FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF C5 C5 C5 FF 03 03' + '03 A8 00 00 00 00 00 00 00 00 19 19 19 CC E2 E2' + 'E2 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF C7 C7 C7 FF 03 03' + '03 A8 00 00 00 00 00 00 00 00 19 19 19 CC E2 E2' + 'E2 FF FF FF FF FF FD FD FD FF FD FD FD FF FD FD' + 'FD FF FD FD FD FF FD FD FD FF FC FC FC FF FC FC' + 'FC FF FB FB FB FF FF FF FF FF C6 C6 C6 FF 04 04' + '04 A8 00 00 00 00 00 00 00 00 09 09 09 A0 41 41' + '41 F9 46 46 46 F0 44 44 44 F0 44 44 44 F0 43 43' + '43 F0 42 42 42 F0 42 42 42 F0 41 41 41 F0 3F 3F' + '3F F0 3F 3F 3F F0 40 40 40 F0 36 36 36 FB 02 02' + '02 82 00 00 00 00 80 1F 00 00 80 0F 00 00 80 07' + '00 00 80 03 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00' +} */ + + +/* BINRES folder.ico */ +3 ICON folder.ico +/* { + '00 00 01 00 08 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 86 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 2E 09 00 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 96 0E 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 7E 11 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 A6 12 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 4E 21 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 F6 46 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 9E 57 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 11 00 00 00 00 11 00 00 00 00 11 00 22 00' + '00 00 33 00 00 00 33 33 00 00 33 33 33 00 44 00' + '00 00 66 33 00 00 66 33 33 00 66 66 33 00 7F 7F' + '7F 00 99 33 00 00 99 33 33 00 99 66 33 00 99 66' + '66 00 CC 66 66 00 FF 99 33 00 FF CC 33 00 99 99' + '66 00 CC 99 66 00 FF 99 66 00 CC CC 66 00 FF CC' + '66 00 BB BB BB 00 CC 99 99 00 FF 99 99 00 CC CC' + '99 00 FF CC 99 00 FF FF 99 00 CC 99 CC 00 CC CC' + 'CC 00 DD DD DD 00 FF CC CC 00 FF FF CC 00 FF CC' + 'FF 00 EE EE EE 00 FF FF FF 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 18 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 56 00 58 00 00 EC FD 7F 1A 02' + '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 56 00' + '00 00 00 00 00 00 03 00 00 00 5E 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 08 6C' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 66 6F 6C 64 65 72 2E 69 63' + '6F 00 1A 93 4B 00 14 1A 95 00 1F 3B D4 77 13 00' + '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 18 6C' + '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' + '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' + '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 18 6C' + '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 27 27 27 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 27 02 03 27 27' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 27 03 04 0D 06 27' + '27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 27 27 27 09 11 22 1A 06' + '27 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 27 27 27 0F 1B 22 26 26 1A' + '05 27 27 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 27 02 08 15 1B 1C 26 26 26 26' + '1A 04 27 27 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 27 27 27 08 1A 1D 1A 26 26 26 26 26' + '25 15 04 27 27 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 27 27 27 0A 1D 1D 1A 1D 1D 26 26 26 26' + '26 25 10 04 27 27 00 00 00 00 00 00 00 00 00 00' + '00 00 27 01 01 10 23 1D 15 23 16 12 18 26 26 26' + '26 26 25 10 01 27 27 00 00 00 00 00 00 00 00 00' + '27 27 02 06 1B 23 1D 1A 22 12 12 16 12 1D 26 26' + '26 25 25 25 10 01 27 27 00 00 00 00 00 00 00 27' + '27 27 0E 22 23 1D 1A 22 18 12 16 12 16 12 18 25' + '26 24 25 23 25 10 01 27 27 00 00 00 00 00 27 01' + '04 15 23 22 22 1C 1D 1B 12 16 12 12 18 16 16 1D' + '23 25 25 21 25 22 10 01 27 27 00 00 00 00 03 06' + '1D 25 25 23 1C 1B 1D 13 16 12 18 16 12 16 18 16' + '1D 25 25 25 22 21 21 0F 01 27 27 00 00 00 27 09' + '22 23 22 22 17 1D 16 12 16 16 12 16 16 18 16 18' + '1B 1D 25 21 21 21 20 22 09 02 27 27 00 00 27 27' + '06 22 23 15 1D 16 12 16 16 13 16 18 12 16 18 1B' + '18 1D 1D 21 21 20 22 20 22 0A 27 27 27 00 00 27' + '27 09 16 1D 16 13 16 16 12 16 12 16 16 18 16 18' + '1D 1D 1E 22 20 22 19 20 19 22 0F 27 27 27 00 00' + '27 27 09 16 12 16 16 12 18 16 16 12 18 16 18 1D' + '1D 1D 22 22 23 20 22 19 22 19 1C 0E 27 27 00 00' + '00 27 27 09 16 16 16 18 16 12 18 16 16 1D 1D 1D' + '22 1E 22 23 22 23 20 19 19 22 1F 14 01 27 00 00' + '00 00 27 27 09 12 18 16 12 16 16 1D 1D 1D 1D 23' + '1D 22 23 22 23 23 25 22 19 19 14 02 27 27 00 00' + '00 00 00 27 27 09 16 18 16 18 1D 1D 1D 1D 22 1D' + '23 22 23 23 23 24 23 25 20 1A 04 27 27 00 00 00' + '00 00 00 00 27 27 09 16 18 1D 22 1D 1D 22 1D 23' + '22 23 22 23 24 23 26 26 1D 07 27 27 00 00 00 00' + '00 00 00 00 00 27 27 09 1D 22 1D 22 1D 22 23 22' + '23 22 26 23 25 23 25 22 0A 27 27 00 00 00 00 00' + '00 00 00 00 00 00 27 27 10 1D 22 1E 22 23 22 23' + '22 23 23 24 23 26 25 0B 27 27 00 00 00 00 00 00' + '00 00 00 00 00 00 27 27 15 23 22 22 23 22 23 24' + '23 25 25 23 26 26 0F 27 27 00 00 00 00 00 00 00' + '00 00 00 00 00 00 27 27 05 1C 23 22 22 23 24 23' + '25 25 23 26 26 10 27 27 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 27 27 04 17 22 23 23 25 25' + '23 25 26 26 15 27 27 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 27 27 04 1D 26 26 25 23' + '26 26 25 22 04 27 27 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 27 27 06 22 25 26 26' + '25 26 22 06 27 27 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 27 27 04 1C 26 26' + '26 23 07 27 27 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 27 27 01 1A 26' + '23 0A 27 27 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 27 27 27 06' + '04 27 27 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 27 27' + '27 27 00 00 00 00 00 00 00 00 00 00 00 00 FF FC' + '7F FF FF F8 3F FF FF F0 1F FF FF C0 0F FF FF 80' + '07 FF FF 00 03 FF FC 00 01 FF F8 00 00 FF F0 00' + '00 7F C0 00 00 3F 80 00 00 1F 00 00 00 0F 00 00' + '00 07 00 00 00 03 00 00 00 01 80 00 00 00 C0 00' + '00 00 E0 00 00 00 F0 00 00 00 F8 00 00 01 FC 00' + '00 03 FE 00 00 07 FF 00 00 0F FF 00 00 1F FF 00' + '00 3F FF 80 00 7F FF C0 00 7F FF E0 00 FF FF F0' + '01 FF FF F8 03 FF FF FC 07 FF FF FF 0F FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 11 00 00 00 00 11' + '00 00 00 00 11 00 11 11 11 00 22 00 00 00 33 00' + '00 00 33 33 00 00 33 00 33 00 22 22 22 00 33 33' + '33 00 66 33 00 00 66 33 33 00 66 66 33 00 44 44' + '44 00 66 66 66 00 77 77 77 00 7F 7F 7F 00 99 66' + '66 00 FF 99 33 00 99 99 66 00 CC 99 66 00 FF 99' + '66 00 FF CC 66 00 CC 99 99 00 CC CC 99 00 FF CC' + '99 00 FF FF 99 00 CC 99 CC 00 CC CC CC 00 DD DD' + 'DD 00 FF CC CC 00 FF FF CC 00 EE EE EE 00 FF FF' + 'FF 00 00 00 00 00 FF CC FF 00 EE EE EE 00 FF FF' + 'FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 77 13 00 00 00 18 0A' + '38 00 00 00 38 00 18 6C 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' + 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 86 00' + '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 77 38 9F 07 00 CD 8B F5 77 78 13' + '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 56 00' + '58 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 40 9F' + '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' + 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' + 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' + 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 77 00 EC FD 7F 56 00 00 00 00 00 00 00 03 00' + '00 00 5E 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 08 6C 0C 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 66' + '6F 6C 64 65 72 2E 69 63 6F 00 1A 93 4B 00 14 1A' + '95 00 1F 3B D4 77 13 00 00 00 98 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 18 6C 38 00 86 00 00 00 00 00' + '00 00 C9 F1 E7 77 86 00 00 00 A4 1A 95 00 08 00' + '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 18 6C 38 00 86 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 01 23 23 00' + '00 00 00 00 00 00 00 00 00 00 00 02 03 12 0C 23' + '00 00 00 00 00 00 00 00 00 00 02 08 15 22 20 0A' + '03 00 00 00 00 00 00 00 23 23 0C 1A 1F 22 22 1F' + '07 03 00 00 00 00 00 01 01 10 1A 1A 13 1A 22 22' + '1D 07 23 00 00 00 23 09 1A 1F 1A 13 16 13 1A 21' + '22 1C 06 02 00 00 05 1F 20 1A 16 16 13 17 16 1A' + '1E 21 19 05 23 00 23 0D 1A 16 13 17 16 16 17 1A' + '1A 1E 1D 18 04 01 00 23 0B 17 16 16 13 16 1A 1A' + '20 1F 1D 1F 14 23 00 00 23 0B 17 16 1A 1A 1F 20' + '1F 21 20 1C 0A 23 00 00 00 23 0C 17 1F 1B 1F 1F' + '20 20 21 0D 23 00 00 00 00 00 23 18 20 1F 20 1F' + '22 22 0F 23 00 00 00 00 00 00 23 0E 1A 21 20 22' + '22 14 23 00 00 00 00 00 00 00 00 23 0C 20 22 22' + '18 02 23 00 00 00 00 00 00 00 00 00 23 0E 1F 1D' + '02 23 00 00 00 00 00 00 00 00 00 00 00 23 02 01' + '23 00 00 00 00 00 FC 7F 00 00 F8 3F 00 00 F0 1F' + '00 00 C0 0F 00 00 80 07 00 00 00 03 00 00 00 01' + '00 00 00 00 00 00 80 00 00 00 C0 00 00 00 E0 01' + '00 00 F0 03 00 00 F0 07 00 00 F8 07 00 00 FC 0F' + '00 00 FE 1F 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 08 10 00 00 00 00 00 00 00 00 00' + '00 00 00 00 08 BF 81 00 00 00 00 00 00 00 00 00' + '00 00 00 04 1B 7F F8 00 00 00 00 00 00 00 00 00' + '00 00 00 9B 77 FF FF 89 00 00 00 00 00 00 00 00' + '00 00 00 78 7F FF FF F8 20 00 00 00 00 00 00 00' + '00 00 1F B7 78 FF FF F7 10 00 00 00 00 00 00 00' + '00 81 77 8F B7 BF FF FF F8 20 00 00 00 00 00 00' + '08 BF FB FB 8B 8B FF FF F7 18 00 00 00 00 00 00' + '17 7F B7 88 B1 B7 BF FF 7F F8 00 00 00 00 00 0B' + 'FF F8 77 BB 7B 7B 78 FF F7 F7 B0 00 00 00 09 7F' + '7F B7 7B 88 B7 B8 BF BF 7F 77 7B 00 00 00 08 7F' + '7F 87 B8 B7 B8 B8 7B FB F7 F7 F7 90 00 00 00 97' + 'FB 7B 7B 7B 7B 8F B7 BF BF 7F 77 78 00 00 00 08' + 'B7 B8 B7 B8 B8 BB 7B 7B F7 77 77 7F 90 00 00 00' + '1B 7B 8B 7B 87 B7 BF BF 7F F7 77 FB F1 00 00 00' + '08 B8 B7 B7 BB 7B 77 F7 FB FF 77 77 78 00 00 00' + '00 8B 7B 7B B7 77 7F BF BF FF 77 77 80 00 00 00' + '00 08 B8 B7 7B FB F7 F7 F7 FF FF B7 00 00 00 00' + '00 00 1B FB 77 7F BF 7F BF FF FF 78 00 00 00 00' + '00 00 08 BF 7F BF 7F F7 FF BF FF 80 00 00 00 00' + '00 00 00 87 FB F7 FF BF FF FF F8 00 00 00 00 00' + '00 00 00 BF 77 FF BF FF 7F FF 80 00 00 00 00 00' + '00 00 00 07 F7 F7 FF F7 FF F8 00 00 00 00 00 00' + '00 00 00 00 BF 7F 7F FF FF B0 00 00 00 00 00 00' + '00 00 00 00 8B FF FF FF F7 00 00 00 00 00 00 00' + '00 00 00 00 08 7F FF FF 78 00 00 00 00 00 00 00' + '00 00 00 00 00 07 FF F7 80 00 00 00 00 00 00 00' + '00 00 00 00 00 00 8F F8 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FC' + '7F FF FF F8 3F FF FF F0 1F FF FF C0 0F FF FF 80' + '07 FF FF 00 03 FF FC 00 01 FF F8 00 00 FF F0 00' + '00 7F C0 00 00 3F 80 00 00 1F 00 00 00 0F 00 00' + '00 07 00 00 00 03 00 00 00 01 80 00 00 00 C0 00' + '00 00 E0 00 00 00 F0 00 00 00 F8 00 00 01 FC 00' + '00 03 FE 00 00 07 FF 00 00 0F FF 00 00 1F FF 00' + '00 3F FF 80 00 7F FF C0 00 7F FF E0 00 FF FF F0' + '01 FF FF F8 03 FF FF FC 07 FF FF FF 0F FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' + '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 01 80 00 00 00 00 00 01 8F 78 00 00 00 00 00' + '1B FF F7 10 00 00 00 4B 8F B7 FF 70 00 00 08 BF' + '7B 8B FF F7 90 00 07 F7 7B 87 B7 F7 70 00 08 7B' + 'B7 BB 7B 7F 77 00 00 8B 7B B7 BF F7 77 B0 00 08' + 'B7 B7 FB FF F7 00 00 00 17 7F BF 7F F8 00 00 00' + '0B F7 FF FF 80 00 00 00 08 7F 7F F8 00 00 00 00' + '00 8F FF 70 00 00 00 00 00 08 F7 00 00 00 00 00' + '00 00 00 00 00 00 FC 7F 00 00 F8 3F 00 00 F0 1F' + '00 00 C0 0F 00 00 80 07 00 00 00 03 00 00 00 01' + '00 00 00 00 00 00 80 00 00 00 C0 00 00 00 E0 01' + '00 00 F0 03 00 00 F0 07 00 00 F8 07 00 00 FC 0F' + '00 00 FE 1F 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 11 00 00 00 00 11 00 00 00 00 11 00 22 00' + '00 00 33 00 00 00 00 22 00 00 33 33 00 00 22 22' + '22 00 44 00 00 00 55 00 00 00 66 00 00 00 66 33' + '00 00 66 33 33 00 66 66 33 00 7F 7F 7F 00 99 33' + '00 00 99 33 33 00 99 66 00 00 99 66 33 00 CC 66' + '00 00 CC 66 33 00 99 66 66 00 CC 66 66 00 CC 99' + '33 00 FF 99 33 00 FF CC 33 00 99 99 66 00 CC 99' + '66 00 FF 99 66 00 CC CC 66 00 FF CC 66 00 BB BB' + 'BB 00 CC 99 99 00 FF 99 99 00 CC CC 99 00 FF CC' + '99 00 FF FF 99 00 CC 99 CC 00 CC CC CC 00 DD DD' + 'DD 00 FF CC CC 00 CC FF CC 00 FF FF CC 00 FF CC' + 'FF 00 EE EE EE 00 FF FF FF 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 18 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 56 00 58 00 00 EC FD 7F 1A 02' + '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 56 00' + '00 00 00 00 00 00 03 00 00 00 5E 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 08 6C' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 66 6F 6C 64 65 72 2E 69 63' + '6F 00 1A 93 4B 00 14 1A 95 00 1F 3B D4 77 13 00' + '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 18 6C' + '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' + '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' + '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 18 6C' + '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 2F 2F 2F 2F 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 2F 2F 2F 2F 2F 2F 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 2F 2F 2F 01 2F 2F 2F 2F 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '2F 2F 2F 2F 09 10 0C 02 2F 2F 2F 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2F' + '2F 2F 04 11 15 1C 17 09 02 2F 2F 2F 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 2F 2F' + '2F 05 13 1C 23 2E 2D 1C 0B 2F 2F 2F 2F 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 2F 2F 2F 2F' + '0B 23 22 21 2E 2E 2E 28 1C 0A 2F 2F 2F 2F 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 2F 2F 2F 01 0C' + '23 22 18 2E 2E 2E 2E 2E 28 1C 05 2F 2F 2F 2F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 2F 2F 2F 2F 04 13 29' + '24 17 2D 2E 2E 2E 2E 2E 2E 28 17 05 02 2F 2F 2F' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 2F 2F 2F 01 05 1C 2D 24' + '15 2D 2E 2E 2E 2E 2E 2E 2E 2E 27 1C 04 01 2F 2F' + '2F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 2F 2F 2F 01 0C 24 29 1F 17' + '2D 24 24 2E 2E 2E 2E 2E 2E 2E 2E 28 17 06 2F 2F' + '2F 2F 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 2F 2F 2F 2F 05 16 29 29 24 17 29' + '29 19 1D 24 2E 2E 2E 2E 2E 2E 2E 2D 28 17 09 2F' + '2F 2F 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 2F 2F 2F 2F 0C 21 2B 24 24 1D 27 2B' + '19 19 19 1D 29 2E 2E 2E 2E 2E 2D 2E 2E 28 1B 05' + '2F 2F 2F 2F 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 2F 2F 2F 03 10 29 2B 24 29 1D 20 2B 19' + '19 1D 19 19 19 29 2E 2E 2E 2E 2E 2D 2D 2D 29 17' + '04 2F 2F 2F 00 00 00 00 00 00 00 00 00 00 00 00' + '00 2F 2F 2F 2F 05 13 29 2B 24 29 1C 1C 2E 1D 19' + '19 19 1D 19 1D 19 2D 2E 2E 2E 2D 2E 2D 2D 2D 27' + '13 04 2F 2F 2F 00 00 00 00 00 00 00 00 00 00 00' + '2F 2F 2F 2F 0A 21 2B 2B 24 29 24 21 2E 1D 19 1D' + '19 1D 19 1D 19 1F 19 29 2E 2D 2E 2D 29 2D 28 2D' + '28 15 2F 2F 2F 2F 00 00 00 00 00 00 00 00 00 2F' + '2F 2F 04 13 24 28 29 2B 29 24 1C 2B 24 19 1D 19' + '1D 19 1D 1A 1D 1D 1F 1D 2B 2C 2E 2D 2D 2D 2D 28' + '29 27 15 04 2F 2F 2F 00 00 00 00 00 00 00 2F 2F' + '2F 05 13 29 2E 2B 2B 29 24 1C 2D 24 19 1D 1A 1D' + '19 1D 19 1D 19 1D 1D 1F 1D 25 28 2D 2D 2D 29 28' + '28 28 29 13 01 2F 2F 2F 00 00 00 00 00 00 2F 2F' + '0C 22 2E 2B 29 29 2D 2B 1C 29 1F 1D 1D 19 1D 19' + '1D 1A 1D 19 1D 1F 1D 1D 1F 22 2B 2D 2D 28 28 28' + '28 27 28 27 15 2F 2F 2F 2F 00 00 00 00 00 2F 2F' + '0C 2B 29 2B 29 2B 2B 17 24 24 1D 1D 19 1D 1D 1A' + '1D 1D 19 1D 1F 1D 1D 1F 22 1F 1F 29 28 2D 29 28' + '28 28 27 29 20 15 04 2F 2F 2F 2F 00 00 00 2F 2F' + '2F 10 2B 2D 2B 2D 1D 23 24 1D 19 1D 1F 19 1D 1D' + '1A 1D 1D 19 1D 1F 1F 1D 1F 24 22 1F 29 28 2D 28' + '29 28 29 27 29 20 10 2F 2F 2F 2F 00 00 00 2F 2F' + '2F 2F 10 24 2E 1D 1C 24 19 1D 1F 19 1D 1F 19 1D' + '1D 1D 19 1D 1F 1D 1D 1F 22 1F 1F 24 24 29 2A 29' + '28 27 27 27 27 20 29 13 2F 2F 2F 2F 00 00 00 00' + '2F 2F 2F 11 24 1C 24 1D 1D 19 1D 1D 19 1D 1D 1A' + '1D 19 1F 1D 19 1F 1D 24 1F 22 24 24 24 24 29 28' + '27 29 27 29 20 27 28 24 11 02 2F 2F 2F 2F 00 00' + '00 2F 2F 01 12 1D 1F 1D 1A 1D 19 1D 1F 19 1F 1D' + '19 1D 1D 1A 1D 1D 1D 1F 1D 24 24 24 25 29 2B 29' + '28 27 27 27 27 27 21 27 28 10 2F 2F 2F 2F 00 00' + '00 00 2F 2F 04 14 1D 1D 1D 1D 1F 1D 19 1D 19 1D' + '1F 1D 19 1D 1F 1D 1F 24 24 24 25 29 29 25 29 2B' + '29 28 29 20 29 23 27 26 23 29 13 01 2F 2F 00 00' + '00 00 2F 2F 2F 08 10 19 1D 1F 19 1F 1D 1D 1D 1F' + '1D 19 1D 1D 1D 24 24 24 24 24 29 2B 24 29 2B 2B' + '29 2B 20 20 27 27 26 23 26 27 1C 02 2F 2F 00 00' + '00 00 00 2F 2F 2F 01 14 1D 1D 1D 19 1D 1F 1D 19' + '1D 1F 1D 1F 24 24 24 24 2B 24 24 29 2B 29 29 2B' + '2B 29 2E 27 23 26 23 20 20 21 05 2F 2F 2F 00 00' + '00 00 00 00 2F 2F 2F 03 12 19 1D 1D 1F 19 1F 1D' + '1F 1D 24 24 24 24 29 24 24 29 29 2B 29 2B 2B 29' + '2B 2E 2B 29 27 23 26 27 21 07 2F 2F 2F 00 00 00' + '00 00 00 00 00 00 2F 2F 2F 12 1D 1F 1D 1D 1D 1D' + '24 24 24 24 24 24 24 2B 29 24 2B 29 2B 29 2B 2B' + '2C 2B 2D 2E 28 26 23 21 0D 2F 2F 2F 00 00 00 00' + '00 00 00 00 00 00 2F 2F 2F 03 10 18 1D 1D 1F 24' + '24 29 24 24 2B 24 29 29 24 2B 29 2B 29 2B 2B 2C' + '2B 2D 2D 2E 2B 2B 27 0D 2F 2F 2F 00 00 00 00 00' + '00 00 00 00 00 00 00 00 2F 2F 2F 10 1D 1F 24 29' + '24 24 29 24 24 29 25 29 2B 29 2B 29 2E 29 2B 2D' + '2B 2E 2B 29 2E 2B 13 2F 2F 2F 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 2F 2F 2F 0C 24 29 24' + '25 29 24 2B 29 25 29 29 2B 29 2B 2B 29 2B 2D 2B' + '2E 29 2B 2E 2E 13 2F 2F 2F 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 2F 2F 2F 0D 1F 29' + '29 24 29 24 29 29 2B 29 29 2B 29 2D 2B 2D 2D 2B' + '2D 2B 2E 2E 13 01 2F 2F 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 2F 2F 0C 1E 24' + '29 2B 29 2B 29 2B 29 2B 2B 2C 2B 2B 2D 2D 2B 2C' + '2B 2E 2E 1C 01 2F 2F 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 2F 2F 15 2D 29' + '1E 29 2B 29 2B 29 2B 29 2D 2B 2C 2B 2D 2B 2C 2B' + '2E 2D 22 02 01 2F 2F 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 2F 2F 07 22 2B' + '29 24 29 2B 29 2B 2C 2B 2B 2D 2B 2C 2B 2D 2B 2E' + '2E 29 07 2F 2F 2F 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 2F 2F 2F 07 1C' + '2E 23 24 2C 2B 2D 2B 2C 2B 2D 2D 2B 2D 2D 2E 2E' + '24 07 2F 2F 2F 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 2F 2F 2F 04' + '1B 1D 29 2B 2D 2B 2C 2B 2E 2D 2B 2E 2D 2E 2E 29' + '0C 2F 2F 2F 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2F 2F 2F' + '01 18 2B 2D 2B 2C 2B 2E 2C 2B 2E 2D 2E 2E 29 0E' + '2F 2F 2F 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2F' + '2F 04 1C 2E 2E 2B 2E 2D 2B 2E 2D 2E 2E 2B 13 2F' + '2F 2F 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2F' + '2F 2F 04 1C 2D 2E 2D 2E 2E 2E 2E 2E 2E 1B 01 2F' + '2F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '2F 2F 2F 2F 1C 2D 2E 2E 2E 2E 2E 2E 1C 01 2F 2F' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 2F 2F 2F 2F 13 2B 2E 2E 2E 2E 1E 01 2F 2F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 2F 2F 2F 0E 29 2E 2D 23 05 2F 2F 2F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 2F 2F 2F 07 13 07 04 2F 2F 2F 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 2F 2F 2F 2F 2F 2F 2F 2F 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 2F 2F 2F 2F 2F 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FC 3F FF FF 00 00 FF FF' + 'F8 1F FF FF 00 00 FF FF F0 0F FF FF 00 00 FF FF' + 'C0 07 FF FF 00 00 FF FF 80 03 FF FF 00 00 FF FF' + '00 01 FF FF 00 00 FF FC 00 00 FF FF 00 00 FF F8' + '00 00 7F FF 00 00 FF E0 00 00 3F FF 00 00 FF C0' + '00 00 1F FF 00 00 FF 80 00 00 0F FF 00 00 FE 00' + '00 00 0F FF 00 00 FC 00 00 00 03 FF 00 00 F8 00' + '00 00 03 FF 00 00 E0 00 00 00 01 FF 00 00 C0 00' + '00 00 00 FF 00 00 80 00 00 00 00 7F 00 00 00 00' + '00 00 00 3F 00 00 00 00 00 00 00 1F 00 00 00 00' + '00 00 00 07 00 00 00 00 00 00 00 07 00 00 00 00' + '00 00 00 03 00 00 C0 00 00 00 00 00 00 00 E0 00' + '00 00 00 00 00 00 F0 00 00 00 00 00 00 00 F0 00' + '00 00 00 00 00 00 F8 00 00 00 00 00 00 00 FC 00' + '00 00 00 01 00 00 FF 00 00 00 00 03 00 00 FF 00' + '00 00 00 07 00 00 FF C0 00 00 00 0F 00 00 FF E0' + '00 00 00 1F 00 00 FF F0 00 00 00 3F 00 00 FF F8' + '00 00 00 7F 00 00 FF F8 00 00 00 7F 00 00 FF F8' + '00 00 00 FF 00 00 FF F8 00 00 01 FF 00 00 FF FC' + '00 00 03 FF 00 00 FF FE 00 00 07 FF 00 00 FF FF' + '80 00 0F FF 00 00 FF FF 80 00 1F FF 00 00 FF FF' + 'C0 00 3F FF 00 00 FF FF E0 00 7F FF 00 00 FF FF' + 'F8 00 7F FF 00 00 FF FF FC 00 FF FF 00 00 FF FF' + 'FE 01 FF FF 00 00 FF FF FF 07 FF FF 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00' + '00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 0E 00 00 00 32 00 00 00 2D 00 00 00 0B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 31 00 00' + '00 B1 00 00 00 F6 00 00 00 DF 00 00 00 65 00 00' + '00 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 58 00 00 00 F2 00 00' + '00 FF 12 04 00 FF 02 00 00 FF 00 00 00 F6 00 00' + '00 71 00 00 00 08 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 12 00 00 00 9D 00 00 00 F6 00 00 00 FF 59 17' + '00 FF 97 2E 01 FF 6E 20 00 FF 06 00 00 FF 00 00' + '00 F0 00 00 00 65 00 00 00 08 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3A 00 00' + '00 C2 00 00 00 FF 17 03 00 FF 7A 37 1A FF BE 59' + '2D FF CF 9C 89 FF BF 81 6D FF 5A 1E 08 FF 06 00' + '00 FF 00 00 00 EE 00 00 00 5C 00 00 00 08 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 70 00 00 00 F3 00 00' + '00 FF 32 07 00 FF B1 63 41 FF D5 8F 70 FF E3 BF' + 'AF FF FF FF FF FF EA E7 EA FF C0 82 6C FF 64 1B' + '01 FF 00 00 00 FF 00 00 00 EE 00 00 00 5E 00 00' + '00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 20 00 00 00 AC 00 00 00 FD 06 00 00 FF 61 1B' + '00 FF D5 9F 86 FF E2 A3 84 FF DB AE 9A FF FD FB' + 'FA FF FF FF FF FF FF FF FF FF E9 E3 E4 FF BD 87' + '77 FF 5A 1A 01 FF 02 00 00 FF 00 00 00 E6 00 00' + '00 52 00 00 00 08 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2A 00 00' + '00 C4 00 00 00 FF 08 00 00 FF 73 29 0F FF EE BD' + 'A5 FF EB AE 8B FF CA 7F 5C FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF E6 DF' + 'E1 FF BE 7A 63 FF 3D 0E 00 FF 00 00 00 FF 00 00' + '00 E2 00 00 00 3D 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 01 00 00 00 6C 00 00 00 E3 00 00' + '00 FF 2F 01 00 FF A7 66 50 FF F5 D0 B8 FF F3 B6' + '8D FF CF 89 67 FF F5 EB E8 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FD FD' + 'FE FF E4 DA DC FF B6 78 61 FF 44 11 00 FF 00 00' + '00 FF 00 00 00 CB 00 00 00 3C 00 00 00 01 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1C 00 00 00 8D 00 00 00 FF 07 00 00 FF 4D 1A' + '07 FF C9 81 63 FF FF E3 CD FF F7 BC 91 FF C7 71' + '47 FF F1 E5 E0 FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF E5 D8 DA FF B3 77 61 FF 33 0E' + '00 FF 00 00 00 FF 00 00 00 C8 00 00 00 33 00 00' + '00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 30 00 00' + '00 D3 00 00 00 FF 0B 00 00 FF 85 36 19 FF E9 B7' + '9F FF FF E6 CB FF F9 B8 88 FF CE 7B 50 FF F2 EE' + 'EF FF FF C8 98 FF FF D7 B6 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FD FE FF FF E5 DA DB FF BE 7D' + '65 FF 30 0B 00 FF 00 00 00 FF 00 00 00 D2 00 00' + '00 33 00 00 00 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 04 00 00 00 72 00 00 00 EA 00 00' + '00 FF 37 0B 00 FF B1 71 56 FF F7 D4 BE FF FF DF' + 'C0 FF FD C3 95 FF D0 80 56 FF E9 D4 CC FF FF D4' + 'AD FF FF 92 39 FF FF 98 44 FF FF D6 B4 FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FE FE FE FF FC FC FB FF F8 F6 F7 FF E4 D9' + 'DA FF B5 80 6B FF 3A 12 02 FF 00 00 00 FF 00 00' + '00 C8 00 00 00 39 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1F 00 00 00 9F 00 00 00 FF 08 00 00 FF 5F 28' + '11 FF D3 93 74 FF FF EF DE FF FF D9 B5 FF FC C5' + '9B FF D5 83 56 FF E6 CE C4 FF FF EB D2 FF FF 93' + '3A FF FF 94 3D FF FF 93 3B FF FF 95 3E FF FF DD' + 'BF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FD FB FB FF FA F8 F8 FF F8 F6 F6 FF F5 F3' + 'F4 FF E7 DA DA FF B6 82 6C FF 2A 0D 00 FF 00 00' + '00 FF 00 00 00 BF 00 00 00 29 00 00 00 02 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3D 00 00' + '00 E1 00 00 00 FF 12 00 00 FF 94 3F 15 FF F3 CF' + 'BC FF FF EC D7 FF FF D1 AC FF FF D8 B4 FF DC 91' + '64 FF E0 C0 B3 FF FF E9 D3 FF FF 99 44 FF FF 96' + '40 FF FF 98 44 FF FF 98 43 FF FF 97 42 FF FF 9B' + '46 FF FF D3 AE FF FF FF FF FF FF FF FF FF FE FD' + 'FD FF FC FA FA FF F9 F6 F6 FF F6 F3 F3 FF F4 F0' + 'F0 FF F1 ED EF FF E3 D6 D6 FF BD 77 57 FF 27 08' + '00 FF 00 00 00 FF 00 00 00 C4 00 00 00 28 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 02 00 00 00 60 00 00 00 DD 00 00' + '00 FF 2F 0C 00 FF A1 5E 3C FF F7 D5 C0 FF FF EA' + 'D2 FF FF D4 B0 FF FF DB B8 FF E3 A2 76 FF D6 9E' + '83 FF FF F8 F1 FF FF AB 64 FF FF 95 3D FF FF 9A' + '46 FF FF 99 46 FF FF 99 45 FF FF 9A 47 FF FF 9C' + '49 FF FF A8 5D FF FF E3 CA FF FF FF FF FF FD FC' + 'FD FF FA F8 F8 FF F7 F5 F5 FF F4 F1 F1 FF F2 EE' + 'EE FF F1 EC EC FF EB E6 E8 FF E1 CF CC FF A2 62' + '43 FF 24 0A 00 FF 00 00 00 FF 00 00 00 A1 00 00' + '00 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 12 00 00 00 9E 00 00 00 FF 00 00 00 FF 59 1E' + '00 FF D5 99 7A FF FF F5 E8 FF FF E4 C7 FF FF D9' + 'B8 FF FF E0 C1 FF ED B6 8E FF D7 A1 86 FF FD FA' + 'F6 FF FF AC 66 FF FF 98 41 FF FF 9C 49 FF FF 9C' + '49 FF FF 9C 49 FF FF 9C 48 FF FF 9C 49 FF FF A0' + '51 FF FF A3 54 FF FF A7 59 FF FE DF C3 FF FB FF' + 'FF FF F9 F7 F8 FF F6 F3 F3 FF F4 F0 F0 FF F1 EC' + 'EC FF EF E9 E8 FF EC E6 E6 FF E9 E3 E5 FF E4 D0' + 'CA FF AE 6B 48 FF 16 02 00 FF 00 00 00 FF 00 00' + '00 B0 00 00 00 1C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 48 00 00' + '00 C8 00 00 00 FF 21 04 00 FF 8E 4B 25 FF EF C7' + 'B0 FF FF F0 DE FF FF E3 C9 FF FF DE C0 FF FF E8' + 'CC FF EF BF 99 FF D2 93 71 FF F9 F0 E9 FF FF BF' + '86 FF FF 98 43 FF FF 9D 4C FF FF 9E 4C FF FF 9D' + '4B FF FF 9D 4B FF FF 9D 4B FF FF 9E 4B FF FF A2' + '53 FF FF A7 59 FF FF AA 5E FF FF B0 6A FF FD D7' + 'B5 FF F7 F8 FC FF F5 F3 F3 FF F2 ED ED FF F0 EA' + 'EA FF ED E7 E7 FF EA E3 E3 FF E9 E1 E1 FF E5 DE' + 'E1 FF E0 CA C3 FF B0 6B 44 FF 23 09 00 FF 00 00' + '00 FE 00 00 00 B1 00 00 00 24 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 4C 00 00 00 EB 00 00' + '00 FF 37 11 00 FF B5 72 4C FF FC DD C8 FF FF F8' + 'E8 FF FF E4 C8 FF FF E3 C8 FF FF E9 CF FF F2 CA' + 'A9 FF D4 92 69 FF F8 EC E3 FF FF C4 8E FF FF 98' + '42 FF FF 9F 4F FF FF A0 4F FF FF A0 4E FF FF 9F' + '4E FF FF 9F 4E FF FF 9F 4D FF FF 9F 4E FF FF A3' + '54 FF FF A8 5C FF FF AD 64 FF FF B0 67 FF FF B4' + '6F FF FA D9 BC FF F4 F0 F1 FF F1 ED EE FF EF E9' + 'E9 FF EC E5 E5 FF E9 E2 E2 FF E7 DE DE FF E5 DC' + 'DC FF E2 DA DD FF E3 CC C3 FF A4 5F 37 FF 25 0B' + '00 FF 00 00 00 FF 00 00 00 A1 00 00 00 25 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 EB 02 00 00 FF 6A 2F' + '0C FF E4 AC 8B FF FF FA EF FF FF F1 DC FF FF E7' + 'CE FF FF E8 D0 FF FF EC D5 FF FC E3 C8 FF D2 8B' + '5F FF F0 D2 BD FF FF C9 96 FF FF 9E 4A FF FF A1' + '51 FF FF A2 52 FF FF A1 51 FF FF A1 51 FF FF A1' + '51 FF FF A1 51 FF FF A1 50 FF FF A1 50 FF FF A5' + '57 FF FF AA 5E FF FF AE 66 FF FF B3 6D FF FF B7' + '72 FF FF B9 74 FF F8 D6 B7 FF EF EC EF FF ED E8' + 'E9 FF EB E4 E4 FF E8 E0 E0 FF E6 DD DD FF E3 DA' + 'D9 FF E0 D6 D6 FF DE D5 D8 FF E2 C7 BD FF AF 63' + '36 FF 16 03 00 FF 00 00 00 FF 00 00 00 B0 00 00' + '00 1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 ED 06 01 00 FF 7A 3C' + '16 FF F7 CA AA FF FF F4 E0 FF FF E9 D2 FF FF E9' + 'D2 FF FF ED D7 FF FA E1 C7 FF D1 87 58 FF EF C6' + 'A8 FF FF CD 9E FF FF A0 4D FF FF A2 53 FF FF A3' + '54 FF FF A3 54 FF FF A3 54 FF FF A3 53 FF FF A3' + '53 FF FF A3 53 FF FF A3 53 FF FF A3 53 FF FF A7' + '59 FF FF AC 60 FF FF B0 68 FF FF B4 6F FF FF B9' + '76 FF FF BD 7C FF FF C1 81 FF F9 D4 B1 FF EC E6' + 'E8 FF E9 E3 E3 FF E7 DE DE FF E4 DB DB FF E2 D7' + 'D7 FF DF D4 D4 FF DD D1 D0 FF DB D2 D5 FF DF C3' + 'B8 FF A9 5E 30 FF 1D 08 00 FF 00 00 00 FE 00 00' + '00 B1 00 00 00 26 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 7D 00 00 00 FF 08 01' + '00 FF 96 46 13 FF FB CF AC FF FF F4 E1 FF FF EB' + 'D6 FF FF F1 DE FF DF A6 7E FF E2 A8 7F FF FF CF' + 'A1 FF FF A2 52 FF FF A2 52 FF FF A3 54 FF FF A3' + '54 FF FF A3 54 FF FF A3 54 FF FF A3 54 FF FF A3' + '54 FF FF A3 54 FF FF A3 54 FF FF A3 54 FF FF A7' + '5A FF FF AC 62 FF FF B1 69 FF FF B5 71 FF FF BA' + '78 FF FF BF 7F FF FF C3 85 FF FF C6 89 FF F5 D7' + 'B9 FF E8 E1 E3 FF E5 DD DE FF E4 DA DA FF E1 D6' + 'D6 FF DD D3 D3 FF DB CF CF FF D8 CB CB FF D9 CF' + 'D3 FF E6 C9 BA FF 95 50 23 FF 0C 00 00 FF 00 00' + '00 FF 00 00 00 91 00 00 00 17 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 01 00 00 00 7C 00 00' + '00 FF 0B 03 00 FF 89 49 1D FF F7 C4 9A FF FF FC' + 'EC FF DF A8 7F FF DE 98 67 FF FF CC 9D FF FF A8' + '5C FF FF A2 52 FF FF A4 56 FF FF A4 55 FF FF A4' + '55 FF FF A4 55 FF FF A4 55 FF FF A4 55 FF FF A3' + '55 FF FF A3 55 FF FF A3 54 FF FF A3 54 FF FF A7' + '5B FF FF AC 62 FF FF B0 69 FF FF B5 71 FF FF BA' + '78 FF FF BF 80 FF FF C4 87 FF FF C8 8C FF FF CC' + '91 FF F4 D7 B9 FF E4 DB DB FF E1 D8 D9 FF DF D5' + 'D5 FF DD D1 D1 FF DB CE CE FF D8 CA CA FF D4 C6' + 'C6 FF D5 CA CE FF E5 C3 B1 FF 9D 5D 34 FF 0A 00' + '00 FF 00 00 00 FA 00 00 00 99 00 00 00 13 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 76 00 00 00 FC 09 00 00 FF 87 4B 20 FF E7 AE' + '83 FF DF 95 60 FF FD C1 8C FF FF A9 5F FF FF A2' + '53 FF FF A4 57 FF FF A4 57 FF FF A4 57 FF FF A4' + '56 FF FF A4 56 FF FF A4 56 FF FF A4 56 FF FF A4' + '56 FF FF A4 56 FF FF A4 55 FF FF A3 55 FF FF A7' + '5B FF FF AC 62 FF FF B1 6A FF FF B5 71 FF FF BA' + '78 FF FF BE 7E FF FF C4 86 FF FF CA 92 FF FF D2' + '9E FF FF D9 A9 FF F4 DE C6 FF E0 D6 D7 FF DD D2' + 'D3 FF DB CF CF FF D9 CC CC FF D6 C8 C8 FF D3 C4' + 'C4 FF D0 BF BF FF D6 CC D0 FF E6 C5 B3 FF 96 54' + '29 FF 11 05 00 FF 00 00 00 F9 00 00 00 82 00 00' + '00 16 00 00 00 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 5F 00 00 00 FB 0D 03 00 FF B1 50' + '0F FF FD AB 6A FF FF B3 6D FF FF A3 55 FF FF A5' + '58 FF FF A5 58 FF FF A5 58 FF FF A4 58 FF FF A4' + '58 FF FF A4 58 FF FF A4 58 FF FF A4 57 FF FF A4' + '57 FF FF A4 57 FF FF A4 57 FF FF A4 57 FF FF A8' + '5C FF FF AC 63 FF FF B0 69 FF FF B5 70 FF FF BA' + '7A FF FF C3 88 FF FF CF 9D FF FF D7 AB FF FF DB' + 'B4 FF FF E0 BA FF FF E3 BE FF F4 E0 CA FF DD D1' + 'D1 FF D9 CD CE FF D8 CA CA FF D5 C6 C6 FF D2 C3' + 'C3 FF D0 C0 C0 FF CC BA BA FF D0 C3 C6 FF EA CC' + 'BD FF 97 55 26 FF 0D 02 00 FF 00 00 00 FF 00 00' + '00 7D 00 00 00 0E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 9E 00 00 00 FF 26 12' + '04 FF B2 5F 23 FF FB 98 48 FF FF AA 5F FF FF A6' + '5A FF FF A6 59 FF FF A6 59 FF FF A6 59 FF FF A6' + '59 FF FF A5 59 FF FF A5 59 FF FF A5 59 FF FF A5' + '58 FF FF A5 58 FF FF A5 58 FF FF A5 58 FF FF A7' + '5B FF FF AC 62 FF FF B5 72 FF FF C2 89 FF FF CB' + '99 FF FF D2 A6 FF FF D7 AD FF FF DA B2 FF FF DD' + 'B8 FF FF E1 BD FF FF E4 C3 FF FF E9 C8 FF F4 E3' + 'CE FF DB CD CC FF D5 C7 C8 FF D4 C5 C5 FF D1 C2' + 'C2 FF CF BE BE FF CC BA BA FF C9 B5 B6 FF CC BD' + 'C0 FF E2 BE AD FF A2 65 3A FF 0E 05 00 FF 00 00' + '00 EC 00 00 00 30 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 14 00 00 00 AC 00 00' + '00 FF 27 12 03 FF A7 53 15 FF F9 93 40 FF FF A7' + '5B FF FF A7 5C FF FF A6 5B FF FF A6 5B FF FF A6' + '5B FF FF A6 5B FF FF A6 5B FF FF A6 5A FF FF A6' + '5A FF FF A6 5A FF FF A5 58 FF FF A5 58 FF FF AE' + '69 FF FF BB 7F FF FF C9 97 FF FF CF A2 FF FF D2' + 'A7 FF FF D5 AC FF FF D9 B1 FF FF DC B8 FF FF E0' + 'BD FF FF E3 C2 FF FF E7 C8 FF FF EA CD FF FF EF' + 'D2 FF F4 E5 D3 FF D7 C9 C8 FF D1 C2 C2 FF D0 C0' + 'C0 FF CE BD BD FF CB B9 B9 FF C8 B5 B5 FF C3 B0' + 'B0 FF D6 C7 CA FF BF 94 78 FF 18 09 00 FF 00 00' + '00 F4 00 00 00 2C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00' + '00 A6 00 00 00 FF 11 08 02 FF A1 4F 12 FF FA 93' + '3F FF FF AC 61 FF FF A7 5D FF FF A7 5C FF FF A6' + '5C FF FF A6 5C FF FF A6 5C FF FF A7 5B FF FF A6' + '5B FF FF A4 57 FF FF A9 60 FF FF BA 7F FF FF C5' + '94 FF FF CB 9C FF FF CE A1 FF FF D1 A6 FF FF D4' + 'AC FF FF D8 B1 FF FF DC B7 FF FF DF BD FF FF E3' + 'C2 FF FF E5 C7 FF FF E8 CC FF FF EC D1 FF FF EE' + 'D6 FF FF F3 DB FF F6 EB D9 FF D3 C3 C3 FF CD BC' + 'BC FF CD BB BB FF CA B7 B7 FF C6 B3 B4 FF CB B9' + 'BC FF BD 92 7B FF 31 19 0B FF 00 00 00 FF 00 00' + '00 8D 00 00 00 03 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 05 00 00 00 A6 00 00 00 FF 16 0B 03 FF A6 54' + '16 FF FA 94 41 FF FF AB 61 FF FF A9 5F FF FF A8' + '5D FF FF A8 5E FF FF A8 5D FF FF A6 5B FF FF A7' + '5D FF FF B2 71 FF FF C2 8E FF FF C8 9A FF FF C9' + '9B FF FF CD A0 FF FF D0 A6 FF FF D4 AC FF FF D7' + 'B1 FF FF DB B7 FF FF DE BC FF FF E1 C1 FF FF E4' + 'C6 FF FF E7 CB FF FF EA D0 FF FF ED D4 FF FF EF' + 'D9 FF FF F2 DD FF FF F8 E3 FF EE E5 D9 FF D1 C1' + 'C0 FF CA B7 B8 FF C8 B5 B5 FF CA B7 B8 FF CB A8' + '9A FF 46 2D 1D FF 00 00 00 FF 00 00 00 C8 00 00' + '00 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 87 00 00 00 FF 0D 06' + '02 FF 92 4B 14 FF FD 96 41 FF FF AB 63 FF FF A9' + '60 FF FF A8 5F FF FF A6 5B FF FF AB 64 FF FF C1' + '8C FF FF CB A0 FF FF CC A0 FF FF CB 9F FF FF CD' + 'A2 FF FF D1 A8 FF FF D4 AD FF FF D7 B2 FF FF DA' + 'B8 FF FF DE BD FF FF E1 C2 FF FF E4 C7 FF FF E7' + 'CB FF FF E9 D0 FF FF EC D4 FF FF EF D8 FF FF F1' + 'DD FF FF F4 E1 FF FF F7 E5 FF FF FD EC FF F2 EA' + 'E0 FF CA B8 B6 FF C8 B6 B9 FF CD AD A1 FF 57 35' + '1B FF 00 00 00 FF 00 00 00 D6 00 00 00 18 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 75 00 00' + '00 FD 0C 06 02 FF 7E 42 11 FF F3 91 3F FF FF AC' + '63 FF FF A7 5D FF FF B5 77 FF FF C8 9A FF FF CF' + 'A7 FF FF CE A5 FF FF CF A6 FF FF CF A7 FF FF D1' + 'AA FF FF D4 AF FF FF D8 B4 FF FF DA B9 FF FF DD' + 'BE FF FF E0 C2 FF FF E3 C7 FF FF E6 CC FF FF E9' + 'D0 FF FF EB D4 FF FF EE D8 FF FF F0 DC FF FF F2' + 'E0 FF FF F5 E4 FF FF F8 E9 FF FF F9 EB FF FD F3' + 'E0 FF F3 EC E4 FF DB BD B0 FF 68 46 30 FF 00 00' + '00 FF 00 00 00 D1 00 00 00 32 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 78 00 00 00 F1 00 00 00 FF 7F 43 12 FF EF 90' + '40 FF FF BC 80 FF FF D0 A8 FF FF D3 AD FF FF D2' + 'AC FF FF D2 AD FF FF D3 AD FF FF D3 AE FF FF D5' + 'B1 FF FF D8 B5 FF FF DB BA FF FF DD BF FF FF E0' + 'C4 FF FF E3 C8 FF FF E6 CC FF FF E8 D1 FF FF EB' + 'D5 FF FF ED D8 FF FF EF DC FF FF F2 E0 FF FF F4' + 'E3 FF FF F7 E8 FF FE F5 E6 FF FC EF DC FF FD F7' + 'EA FF FF F0 DA FF 83 5C 3B FF 00 00 00 FF 00 00' + '00 EB 00 00 00 3F 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 54 00 00 00 FD 00 00 00 FF 66 3A' + '14 FF F4 B8 85 FF FF D9 B8 FF FF D6 B3 FF FF D5' + 'B3 FF FF D6 B4 FF FF D6 B5 FF FF D7 B5 FF FF D9' + 'B8 FF FF DC BC FF FF DF C1 FF FF E1 C5 FF FF E4' + 'C9 FF FF E7 CE FF FF E8 D1 FF FF EB D5 FF FF EE' + 'D9 FF FF F0 DD FF FF F1 E0 FF FF F4 E4 FF FF F6' + 'E8 FF FE F2 E1 FF FB EB D7 FF FF FD F6 FF FF F6' + 'E4 FF 9C 66 38 FF 03 00 00 FF 00 00 00 F5 00 00' + '00 46 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 45 00 00 00 E0 01 00' + '00 FF 78 47 1B FF F2 B5 7F FF FF DC BE FF FF DA' + 'BB FF FF DA BB FF FF DB BC FF FF DB BD FF FF DC' + 'BF FF FF DF C3 FF FF E2 C7 FF FF E4 CB FF FF E6' + 'CF FF FF E9 D4 FF FF EB D6 FF FF ED DA FF FF F0' + 'DE FF FF F2 E1 FF FF F3 E5 FF FF F4 E6 FF FC EE' + 'DB FF FD F1 E0 FF FF FC F5 FF FF F5 E3 FF A7 7A' + '51 FF 07 00 00 FF 00 00 00 F3 00 00 00 60 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 8B 00 00' + '00 FF 69 42 1C FF ED AC 6F FF EE BC 90 FF FF E2' + 'C7 FF FF DE C2 FF FF DE C2 FF FF DF C4 FF FF E0' + 'C5 FF FF E2 C9 FF FF E5 CD FF FF E7 D1 FF FF E9' + 'D4 FF FF EC D8 FF FF EE DB FF FF F0 DF FF FF F1' + 'E2 FF FF F4 E6 FF FE F3 E5 FF FC EB D9 FF FD F2' + 'E2 FF FF FC F4 FF FF FF FE FF CB 9A 6C FF 1A 09' + '00 FF 00 00 00 FF 00 00 00 7D 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 9C 02 00' + '00 FF AA 6B 2D FF FF FA EA FF F1 D6 BF FF EC B8' + '88 FF FF E1 C9 FF FF E3 CB FF FF E2 CA FF FF E3' + 'CB FF FF E5 CF FF FF E8 D3 FF FF EA D6 FF FF EC' + 'D9 FF FF ED DD FF FF EF E0 FF FF F2 E3 FF FF F4' + 'E6 FF FD F0 E0 FF FD EF DE FF FE F4 E8 FF FF FB' + 'F4 FF FF FF F7 FF DC B0 84 FF 29 17 09 FF 00 00' + '00 FF 00 00 00 94 00 00 00 0B 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 94 01 00' + '00 FF 51 30 0F FF DF B0 7F FF FF FB F0 FF EF D0' + 'B3 FF F0 C5 9D FF FD E4 CD FF FF E6 D1 FF FF E7' + 'D2 FF FF E8 D5 FF FF EB D9 FF FF ED DC FF FF EF' + 'DF FF FF F0 E2 FF FF F2 E5 FF FF F3 E6 FF FE F0' + 'E1 FF FE F0 E1 FF FE F6 ED FF FF FA F3 FF FF FF' + 'FC FF E5 C3 A0 FF 3B 20 06 FF 00 00 00 FF 00 00' + '00 B0 00 00 00 07 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 1F 00 00' + '00 CC 00 00 00 FF 35 1B 00 FF D4 99 5A FF FF FF' + 'FE FF EC C3 9B FF F4 CE AA FF FF ED DC FF FF EA' + 'D8 FF FF EC DB FF FF EE DF FF FF F0 E1 FF FF F1' + 'E4 FF FF F3 E7 FF FE F2 E6 FF FE EF E0 FF FE F3' + 'E7 FF FF F8 F0 FF FF FA F3 FF FF FF FF FF F3 CD' + 'A6 FF 52 2F 0D FF 00 00 00 FF 00 00 00 B8 00 00' + '00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1A 00 00 00 AE 00 00 00 FF 23 13 01 FF BF 8D' + '56 FF F3 B6 77 FF F6 D4 B6 FF FF F0 E3 FF FF ED' + 'DF FF FF EF E1 FF FF F1 E4 FF FF F3 E7 FF FF F3' + 'E9 FF FE F2 E5 FF FE F2 E6 FF FF F6 ED FF FF F9' + 'F2 FF FF F9 F4 FF FF FF FF FF FB DE BE FF 55 37' + '1A FF 00 00 00 FF 00 00 00 CB 00 00 00 1E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 04 00 00 00 A1 00 00 00 FF 11 07' + '00 FF B5 72 2D FF FF EB CF FF FF F4 EA FF FF F1' + 'E5 FF FF F2 E7 FF FF F4 EA FF FF F4 EB FF FE F3' + 'E9 FF FE F4 EA FF FF F8 F2 FF FF FA F5 FF FF FB' + 'F6 FF FF FF FF FF F7 E5 D0 FF 76 4D 25 FF 00 00' + '00 FF 00 00 00 DB 00 00 00 25 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00' + '00 FF 23 14 04 FF C7 99 68 FF FF FF F2 FF FF F8' + 'F1 FF FF F5 ED FF FE F6 ED FF FE F4 EC FF FE F8' + 'F1 FF FF FA F6 FF FF FB F6 FF FF FC F8 FF FF FF' + 'FF FF FF F4 DE FF 8C 61 34 FF 00 00 00 FF 00 00' + '00 EA 00 00 00 3B 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 10 00 00' + '00 BB 00 00 00 FF 28 17 05 FF C1 9C 74 FF FF F6' + 'E7 FF FF FB F8 FF FE F8 F1 FF FF FA F6 FF FF FC' + 'F8 FF FF FC FA FF FF FD FB FF FF FF FF FF FF FD' + 'F5 FF AA 82 56 FF 0E 05 00 FF 00 00 00 F9 00 00' + '00 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 04 00 00 00 A8 00 00 00 FF 06 00 00 FF AB 84' + '58 FF FF FA EB FF FF FF FF FF FF FE FD FF FF FF' + 'FD FF FF FF FF FF FF FF FF FF FF FF FC FF C9 9B' + '66 FF 0F 05 00 FF 00 00 00 FF 00 00 00 68 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0A 00 00 00 74 00 00 00 FF 0E 05' + '00 FF 79 5C 3A FF FF ED D6 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FE FF C9 A5 7A FF 19 0D' + '00 FF 00 00 00 FF 00 00 00 82 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 67 00 00' + '00 EE 00 00 00 FF 6E 4E 29 FF F0 DD C5 FF FF FF' + 'F4 FF FF F1 DC FF D1 AC 80 FF 36 1D 02 FF 00 00' + '00 FF 00 00 00 8F 00 00 00 03 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 3F 00 00 00 E0 00 00 00 FF 48 2F 12 FF 87 5D' + '2D FF 53 38 19 FF 12 0A 00 FF 00 00 00 FF 00 00' + '00 AD 00 00 00 08 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 26 00 00 00 BF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 EC 00 00 00 83 00 00' + '00 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 0A 00 00 00 75 00 00' + '00 84 00 00 00 60 00 00 00 24 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FC 3F FF FF 00 00 FF FF F8 1F FF FF 00 00 FF FF' + 'F0 0F FF FF 00 00 FF FF C0 07 FF FF 00 00 FF FF' + '80 03 FF FF 00 00 FF FF 00 01 FF FF 00 00 FF FC' + '00 00 FF FF 00 00 FF F8 00 00 7F FF 00 00 FF E0' + '00 00 3F FF 00 00 FF C0 00 00 1F FF 00 00 FF 80' + '00 00 0F FF 00 00 FE 00 00 00 0F FF 00 00 FC 00' + '00 00 03 FF 00 00 F8 00 00 00 03 FF 00 00 E0 00' + '00 00 01 FF 00 00 C0 00 00 00 00 FF 00 00 80 00' + '00 00 00 7F 00 00 00 00 00 00 00 3F 00 00 00 00' + '00 00 00 1F 00 00 00 00 00 00 00 07 00 00 00 00' + '00 00 00 07 00 00 00 00 00 00 00 03 00 00 C0 00' + '00 00 00 00 00 00 E0 00 00 00 00 00 00 00 F0 00' + '00 00 00 00 00 00 F0 00 00 00 00 00 00 00 F8 00' + '00 00 00 00 00 00 FC 00 00 00 00 01 00 00 FF 00' + '00 00 00 03 00 00 FF 00 00 00 00 07 00 00 FF C0' + '00 00 00 0F 00 00 FF E0 00 00 00 1F 00 00 FF F0' + '00 00 00 3F 00 00 FF F8 00 00 00 7F 00 00 FF F8' + '00 00 00 7F 00 00 FF F8 00 00 00 FF 00 00 FF F8' + '00 00 01 FF 00 00 FF FC 00 00 03 FF 00 00 FF FE' + '00 00 07 FF 00 00 FF FF 80 00 0F FF 00 00 FF FF' + '80 00 1F FF 00 00 FF FF C0 00 3F FF 00 00 FF FF' + 'E0 00 7F FF 00 00 FF FF F8 00 7F FF 00 00 FF FF' + 'FC 00 FF FF 00 00 FF FF FE 01 FF FF 00 00 FF FF' + 'FF 07 FF FF 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 0E 00 00 00 58 00 00' + '00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 30 00 00 00 C1 09 00 00 FF 00 00' + '00 ED 00 00 00 59 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 61 00 00 00 E9 33 0D 00 FF 97 3E 19 FF 4D 1D' + '0A FF 00 00 00 F0 00 00 00 52 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 14 00 00 00 9A 02 00' + '00 FF 63 32 1D FF C6 78 55 FF F2 DA D2 FF CC A1' + '95 FF 44 17 07 FF 00 00 00 EB 00 00 00 4C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 3B 00 00 00 CD 18 03 00 FF 9A 62' + '4A FF E0 9D 7D FF F1 DB D2 FF FF FF FF FF FD FD' + 'FE FF CA 9D 8F FF 3D 15 08 FF 00 00 00 E5 00 00' + '00 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 6F 00 00 00 F1 3B 15 09 FF CB 95 7B FF EE AA' + '83 FF E9 C8 B8 FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FD FC FE FF C8 9B 8D FF 39 14 07 FF 00 00' + '00 E2 00 00 00 3C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 03 00 00 00 80 00 00' + '00 FF 45 1B 0D FF E1 AC 91 FF FC BD 95 FF DB A5' + '8B FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FA F7 F9 FF B5 80 6E FF 1A 05' + '00 FF 00 00 00 CA 00 00 00 1E 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1F 00 00 00 AC 07 00 00 FF 74 43' + '2F FF EF C3 A7 FF FC C4 9B FF DB A2 86 FF FA D0' + 'AF FF FF BE 87 FF FF FC FA FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF F4 EB EB FF A8 78' + '67 FF 16 05 00 FF 00 00 00 BB 00 00 00 1B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 4A 00 00 00 DA 24 0A 00 FF AB 76 5E FF FF DE' + 'C1 FF FE CB A2 FF DC A0 80 FF F7 D7 BD FF FF 9D' + '49 FF FF 8E 31 FF FF BB 82 FF FF FB F8 FF FF FF' + 'FF FF FF FF FF FF FD FB FB FF FA FA FB FF F3 EA' + 'E9 FF A6 7B 6A FF 16 05 00 FF 00 00 00 B5 00 00' + '00 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 07 00 00 00 82 00 00' + '00 F9 50 28 15 FF D8 A9 8F FF FF E9 CE FF FE D1' + 'AA FF DE A2 81 FF F4 D5 C0 FF FF A6 58 FF FF 96' + '3E FF FF 98 44 FF FF 96 3E FF FF BD 85 FF FF FA' + 'F6 FF FE FF FF FF FA F8 F8 FF F6 F3 F3 FF F4 F2' + 'F3 FF F0 E4 E3 FF A5 74 5E FF 16 05 00 FF 00 00' + '00 B1 00 00 00 16 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 28 00 00 00 B8 0E 00 00 FF 86 55' + '3D FF F6 D3 BA FF FF EB D1 FF FE D9 B7 FF E2 A9' + '88 FF F1 D4 C1 FF FF B0 69 FF FF 98 40 FF FF 9C' + '49 FF FF 9C 48 FF FF 9D 4C FF FF A0 4E FF FF C1' + '89 FF FD F6 F1 FF F8 F9 FB FF F5 F0 F0 FF F1 EB' + 'EB FF EE EA EB FF ED E0 DD FF A6 74 5B FF 16 05' + '00 FF 00 00 00 B1 00 00 00 16 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 4F 00 00 00 E2 30 13 04 FF BB 8B 70 FF FF ED' + 'D8 FF FF EB D1 FF FF E3 C7 FF E5 B0 8C FF ED CB' + 'B6 FF FF B9 7A FF FF 99 44 FF FF 9F 4D FF FF 9E' + '4D FF FF 9E 4C FF FF A0 4F FF FF A6 5A FF FF AA' + '5D FF FE C3 8D FF F7 EE E8 FF F2 F0 F2 FF EE E8' + 'E8 FF EB E3 E3 FF E8 E2 E3 FF EA DA D7 FF A7 72' + '56 FF 18 06 00 FF 00 00 00 B1 00 00 00 17 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 EA 53 27 0F FF E8 BF A3 FF FF F9 E7 FF FF EB' + 'D2 FF FF EF D8 FF EA BC 9B FF E7 BB 9E FF FF C0' + '86 FF FF 9C 47 FF FF A2 51 FF FF A1 51 FF FF A1' + '51 FF FF A1 50 FF FF A2 53 FF FF A9 5D FF FF B0' + '68 FF FF B3 6B FF FD C8 94 FF F1 EA E7 FF EC E8' + 'EA FF E9 E1 E1 FF E5 DC DB FF E2 DA DB FF E7 D4' + 'D0 FF A2 65 42 FF 08 00 00 FF 00 00 00 A8 00 00' + '00 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 EB 5F 32 18 FF F9 D2 B3 FF FF F4 DE FF FF EF' + 'DA FF F4 D4 B9 FF E1 A8 82 FF FD C5 93 FF FF A1' + '50 FF FF A2 53 FF FF A3 54 FF FF A3 54 FF FF A3' + '53 FF FF A3 53 FF FF A3 55 FF FF AB 60 FF FF B2' + '6B FF FF B9 76 FF FF BE 7A FF FA D1 A8 FF EC E4' + 'E2 FF E7 DF E2 FF E4 DA DA FF DF D4 D4 FF DD D4' + 'D6 FF E2 C5 B9 FF 7D 4A 2C FF 01 00 00 FF 00 00' + '00 86 00 00 00 05 00 00 00 00 00 00 00 00 00 00' + '00 51 00 00 00 F3 5A 2F 15 FF F1 C8 A5 FF FC E5' + 'CD FF E1 A2 77 FF FB BB 85 FF FF A5 56 FF FF A3' + '53 FF FF A4 55 FF FF A4 55 FF FF A4 55 FF FF A3' + '55 FF FF A3 55 FF FF A4 57 FF FF AB 61 FF FF B3' + '6C FF FF BA 77 FF FF C0 81 FF FF C6 87 FF F9 D4' + 'AC FF E7 DC DA FF E1 D7 D9 FF DE D2 D2 FF DA CD' + 'CD FF D8 CD D0 FF E1 C4 B8 FF 7F 4F 31 FF 01 00' + '00 FF 00 00 00 83 00 00 00 03 00 00 00 00 00 00' + '00 00 00 00 00 48 00 00 00 EB 56 2F 16 FF E3 94' + '5B FF FB B5 79 FF FF A8 5C FF FF A3 55 FF FF A4' + '58 FF FF A4 56 FF FF A4 56 FF FF A4 56 FF FF A4' + '56 FF FF A4 56 FF FF A5 58 FF FF AB 62 FF FF B2' + '6B FF FF B9 76 FF FF C2 85 FF FF CD 97 FF FF D7' + 'A7 FF F8 DF C1 FF E2 D6 D4 FF DB CF D0 FF D9 CB' + 'CB FF D4 C5 C4 FF D3 C6 C8 FF E2 C5 B8 FF 80 51' + '31 FF 02 00 00 FE 00 00 00 79 00 00 00 06 00 00' + '00 00 00 00 00 00 00 00 00 4E 00 00 00 FF 7A 40' + '16 FF FB 9E 51 FF FF AA 5C FF FF A6 5A FF FF A5' + '59 FF FF A5 59 FF FF A5 58 FF FF A5 59 FF FF A5' + '59 FF FF A4 57 FF FF A4 57 FF FF AB 62 FF FF B8' + '76 FF FF C6 8F FF FF D2 A3 FF FF DA B1 FF FF E0' + 'BA FF FF E5 C1 FF F8 E5 CB FF DE D0 CD FF D4 C6' + 'C7 FF D3 C3 C3 FF CE BC BC FF CD BE C0 FF DE C0' + 'B3 FF 85 56 37 FF 06 01 00 FE 00 00 00 4C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 6B 00 00' + '00 FB 6D 37 0D FF F5 92 41 FF FF AC 5F FF FF A7' + '5C FF FF A6 5B FF FF A6 5B FF FF A6 5B FF FF A5' + '59 FF FF A5 58 FF FF AE 68 FF FF C0 87 FF FF CC' + '9D FF FF D3 A9 FF FF D8 B0 FF FF DD B8 FF FF E2' + 'C0 FF FF E7 C8 FF FF EE D0 FF F8 EA D5 FF DA CB' + 'C8 FF CF BE BF FF CD BB BB FF C8 B5 B5 FF D3 C0' + 'C1 FF 9B 77 61 FF 09 03 00 FF 00 00 00 4B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 5B 00 00 00 F7 5D 2F 0C FF F1 90 41 FF FF AD' + '62 FF FF A8 5E FF FF A7 5D FF FF A6 5A FF FF AB' + '64 FF FF BC 83 FF FF C8 98 FF FF CE A1 FF FF D2' + 'A8 FF FF D7 B0 FF FF DC B8 FF FF E1 C0 FF FF E5' + 'C8 FF FF EA CF FF FF EE D6 FF FF F4 DE FF F8 EF' + 'DE FF D6 C6 C4 FF C8 B6 B7 FF D0 BC BD FF A0 80' + '70 FF 10 09 04 FF 00 00 00 8E 00 00 00 04 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 6B 00 00 00 FF 70 3A 0F FF FB 9C' + '4B FF FF AE 64 FF FF A6 5B FF FF AE 6A FF FF C6' + '95 FF FF CD A3 FF FF CD A1 FF FF D1 A8 FF FF D6' + 'B0 FF FF DB B8 FF FF DF C0 FF FF E4 C6 FF FF E8' + 'CD FF FF EC D4 FF FF F0 DB FF FF F3 E1 FF FF FC' + 'EA FF F5 EC E0 FF D3 C2 C3 FF BF A0 95 FF 29 19' + '0C FF 00 00 00 C7 00 00 00 0B 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 69 00 00 00 FB 6F 3C' + '12 FF F7 9B 4C FF FF BC 7F FF FF CD A3 FF FF D1' + 'AB FF FF D0 AA FF FF D2 AC FF FF D6 B1 FF FF DB' + 'B9 FF FF DF C0 FF FF E3 C7 FF FF E7 CD FF FF EB' + 'D4 FF FF EF DA FF FF F3 E0 FF FF F6 E6 FF FE F5' + 'E5 FF FF FF EF FF E9 D0 BA FF 43 2D 20 FF 00 00' + '00 D9 00 00 00 25 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 59 00 00' + '00 F2 60 36 14 FF ED BA 8B FF FF DB B9 FF FF D7' + 'B4 FF FF D6 B5 FF FF D8 B7 FF FF DC BC FF FF E0' + 'C2 FF FF E4 C9 FF FF E8 CF FF FF EB D5 FF FF EF' + 'DB FF FF F2 E1 FF FF F4 E5 FF FE F2 E1 FF FF FA' + 'EE FF F9 EA D3 FF 5B 41 2A FF 00 00 00 E4 00 00' + '00 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 4F 00 00 00 F9 A5 74 48 FF FB CF A6 FF FF DE' + 'C1 FF FF DD C0 FF FF DD C1 FF FF E1 C6 FF FF E5' + 'CD FF FF E8 D2 FF FF EC D7 FF FF EE DD FF FF F2' + 'E2 FF FF F3 E4 FF FE F0 DF FF FF F9 EF FF FF F3' + 'E2 FF 70 52 37 FF 00 00 00 F0 00 00 00 42 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 23 03 00 00 FD BF 97 6F FF FF EA D3 FF F4 CC' + 'A9 FF FF E3 CB FF FF E3 CC FF FF E6 CF FF FF EA' + 'D5 FF FF EC DA FF FF EF DF FF FF F2 E4 FF FE F2' + 'E3 FF FE F0 E1 FF FF FA F3 FF FF FA ED FF 83 65' + '48 FF 00 00 00 F6 00 00 00 52 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 12 00 00 00 CD 37 23 0E FF D6 B6 91 FF FD E7' + 'D0 FF F6 D3 B4 FF FF EB D9 FF FF EB D9 FF FF EE' + 'DE FF FF F0 E2 FF FF F2 E6 FF FF F1 E4 FF FE F3' + 'E6 FF FF FA F4 FF FF FE F4 FF 98 79 5A FF 01 00' + '00 FC 00 00 00 65 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1C 00 00 00 D4 24 13 01 FF D7 A8' + '74 FF FE D8 B5 FF FF F1 E5 FF FF EF E1 FF FF F2' + 'E6 FF FF F4 E9 FF FE F2 E5 FF FF F6 EC FF FF FA' + 'F4 FF FF FF FF FF BB 9C 7B FF 06 01 00 FF 00 00' + '00 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 2A 00 00 00 D3 36 1F' + '07 FF EB C5 9C FF FF FF F6 FF FF F4 EA FF FF F5' + 'EB FF FF F4 EB FF FF F7 F0 FF FF FB F7 FF FF FF' + 'FF FF E0 C8 AD FF 29 1A 0B FF 00 00 00 B7 00 00' + '00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 22 00 00' + '00 DA 3E 2D 1A FF DE C5 A8 FF FF FF FD FF FF FA' + 'F5 FF FF FB F7 FF FF FD FB FF FF FF FF FF EC D9' + 'C2 FF 3A 27 14 FF 00 00 00 C7 00 00 00 16 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 22 00 00 00 C4 25 18 0A FF C6 B0 95 FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF F4 E5 D3 FF 4B 36' + '20 FF 00 00 00 D6 00 00 00 22 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 10 00 00 00 A6 12 09 01 FF AA 94' + '7A FF FF F6 EA FF F0 DE C8 FF 5E 46 2B FF 00 00' + '00 E3 00 00 00 2E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 02 00 00 00 84 05 01' + '00 FF 44 31 1A FF 26 19 0A FF 00 00 00 E1 00 00' + '00 3D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 54 00 00 00 84 00 00 00 67 00 00 00 1F 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FC' + '7F FF FF F8 3F FF FF F0 1F FF FF C0 0F FF FF 80' + '07 FF FF 00 03 FF FC 00 01 FF F8 00 00 FF F0 00' + '00 7F C0 00 00 3F 80 00 00 1F 00 00 00 0F 00 00' + '00 07 00 00 00 03 00 00 00 01 80 00 00 00 C0 00' + '00 00 E0 00 00 00 F0 00 00 00 F8 00 00 01 FC 00' + '00 03 FE 00 00 07 FF 00 00 0F FF 00 00 1F FF 00' + '00 3F FF 80 00 7F FF C0 00 7F FF E0 00 FF FF F0' + '01 FF FF F8 03 FF FF FC 07 FF FF FF 0F FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 20 00 00 00' + '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 10 00 00 00 8A 00 00 00 67 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 36 1E 0B' + '04 C9 9D 6B 56 FF 5D 3E 32 FE 00 00 00 67 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 69 4C 2F 21 EF CE 9D' + '87 FF FF FF FE FF F0 E3 DF FF 50 36 2D F9 00 00' + '00 5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 0A 00 00 00 90 71 4F 3D FF EE B2 90 FF FD D2' + 'B5 FF FF FF FD FF FF FF FF FF E8 D7 D1 FF 3C 27' + '1F F3 00 00 00 47 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2C 1A 0D' + '07 BF A6 83 6D FF FB CC AC FF F7 BA 8F FF FF 9A' + '44 FF FF C3 91 FF FF FD FC FF FF FF FF FF DC C7' + 'C1 FF 38 26 1D E9 00 00 00 40 00 00 00 00 00 00' + '00 00 00 00 00 00 02 01 00 5C 47 33 27 E8 D6 B9' + 'A1 FF FF E0 C2 FF F3 BF 98 FF FF A3 55 FF FF 9A' + '44 FF FF 9D 4A FF FF CB 9D FF F5 F2 F2 FF F6 F2' + 'F5 FF D5 BD B4 FF 39 24 19 E9 00 00 00 3E 00 00' + '00 00 00 00 00 00 29 16 0B F2 F3 D0 B4 FF FF F3' + 'DC FF EF BC 94 FF FE A9 60 FF FF 9F 4D FF FF A1' + '51 FF FF A5 57 FF FF B1 67 FF F9 D1 AA FF E9 E2' + 'E3 FF EA E2 E5 FF CA AB 9D FF 28 17 0D E2 00 00' + '00 2D 00 00 00 00 06 03 02 67 6D 53 3F FB F7 B8' + '88 FF FF AD 65 FF FF A3 52 FF FF A4 56 FF FF A3' + '54 FF FF A7 5A FF FF B5 6F FF FF C5 88 FF F5 D9' + 'BD FF DE D4 D4 FF DE D1 D3 FF BD 9F 92 FF 2D 1E' + '13 D8 00 00 00 2D 00 00 00 00 00 00 00 6E 76 43' + '1B FF FD A4 53 FF FF AA 5D FF FF A5 57 FF FF A4' + '56 FF FF B0 6C FF FF C6 91 FF FF D7 AE FF FF E4' + 'C0 FF F3 E2 D0 FF D3 C5 C5 FF D9 C7 C9 FF A5 85' + '75 FF 06 03 01 9C 00 00 00 00 00 00 00 00 00 00' + '00 6D 6E 3E 18 FF FF A6 58 FF FF AE 65 FF FF BD' + '85 FF FF CC A0 FF FF D7 B2 FF FF E0 C0 FF FF E9' + 'CE FF FF F3 DC FF F3 EA DF FF CB B4 AF FF 3C 30' + '2A EB 01 01 00 32 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 6F 71 43 1E F6 F7 C2 90 FF FF D8' + 'B5 FF FF D7 B4 FF FF DF C1 FF FF E7 CE FF FF EE' + 'DA FF FF F8 E8 FF FF F7 E4 FF 61 51 44 F8 00 00' + '00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 9F D0 AA 86 FF FF E6' + 'CA FF FF E1 C9 FF FF E8 D3 FF FF EE DD FF FF F4' + 'E7 FF FF FC ED FF 7C 6B 5A FD 00 00 00 64 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 43 53 43 32 F4 F3 D2' + 'B0 FF FF F1 E0 FF FF F0 E3 FF FF F4 E8 FF FF FF' + 'FB FF 98 86 75 FF 00 00 00 7D 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 4E 59 47' + '34 F4 F5 EA D9 FF FF FF FC FF FF FF FF FF BA AC' + '9C FF 0C 07 03 A2 00 00 00 03 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 45 47 3C 31 E3 E3 DC D4 FF C9 BE B0 FF 16 10' + '09 B4 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 2B 19 12 0A BB 0D 09 03 A0 00 00' + '00 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FC 7F 00 00 F8 3F 00 00 F0 1F' + '00 00 C0 0F 00 00 80 07 00 00 00 03 00 00 00 01' + '00 00 00 00 00 00 80 00 00 00 C0 00 00 00 E0 01' + '00 00 F0 03 00 00 F0 07 00 00 F8 07 00 00 FC 0F' + '00 00 FE 1F 00 00' +} */ + +/* BINRES folder_open.ico */ +4 ICON folder_open.ico +/* { + '00 00 01 00 06 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 66 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 0E 09 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 76 0E 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 1E 34 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 C6 44 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 2E 49 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 B7 35 09 00 C4 3D 06 00 B5 44 16 00 B5 48' + '23 00 BE 50 2B 00 CE 48 0F 00 CC 4A 15 00 CB 53' + '1B 00 D4 58 1A 00 DC 66 1F 00 C5 53 26 00 D0 5A' + '22 00 D0 59 31 00 DE 69 20 00 DA 72 2B 00 CE 63' + '3C 00 D5 67 31 00 DF 6F 37 00 DC 72 30 00 E4 6C' + '24 00 EA 78 27 00 EB 6D 31 00 E8 75 36 00 F1 76' + '30 00 BB 6C 4F 00 C4 6D 55 00 C4 76 5D 00 CE 7D' + '5F 00 D2 74 50 00 D4 7A 5B 00 E6 72 41 00 C5 7F' + '6B 00 C8 7B 68 00 DB 7E 65 00 F8 8A 29 00 EF 88' + '35 00 F2 8A 34 00 FD 99 35 00 FC 9B 3B 00 FF A3' + '3A 00 BC 89 79 00 E9 88 46 00 E5 85 4B 00 F5 9A' + '44 00 FD 9D 45 00 F0 95 49 00 FA 9C 4D 00 EA 81' + '5B 00 FF A6 40 00 FF A9 45 00 F4 A0 49 00 FF AD' + '4E 00 FA A0 53 00 FE A9 53 00 FD A6 58 00 FA AA' + '5B 00 FF B2 55 00 FF B3 5C 00 C5 80 6C 00 CB 82' + '6C 00 D5 84 69 00 C3 85 77 00 CA 8B 77 00 D4 89' + '78 00 CD 90 7C 00 DA 9B 7E 00 EF 9D 65 00 ED 97' + '6F 00 F4 9E 63 00 F5 9C 6F 00 E3 8C 78 00 E0 9D' + '7E 00 E8 9A 7D 00 F0 9B 79 00 FA AF 65 00 F6 AB' + '6C 00 FD B2 62 00 FF BA 65 00 FE B6 6E 00 FF BF' + '6D 00 EC A1 76 00 EB A2 7A 00 F2 A6 75 00 F7 AC' + '70 00 F0 A3 7D 00 F5 AC 7F 00 FE B7 71 00 FC BC' + '72 00 F9 BA 7F 00 FE C4 78 00 92 8F 8D 00 91 90' + '8E 00 9F 93 8F 00 93 91 91 00 9B 96 94 00 9C 9B' + '9B 00 BC 8F 82 00 A1 93 8D 00 BC 92 85 00 B1 96' + '8A 00 A3 95 91 00 A5 98 94 00 A0 9E 9F 00 BC 9A' + '93 00 BE 9E 98 00 A8 A0 9C 00 B6 A1 9D 00 B9 A3' + '9F 00 A4 A2 A2 00 A9 A6 A6 00 AD AA A6 00 A9 A5' + 'A8 00 AE AB AC 00 B7 A7 A1 00 B9 A3 A0 00 B6 A8' + 'A3 00 BA AA A5 00 B3 AB AB 00 B5 B1 AD 00 B4 AE' + 'B0 00 BB B3 B7 00 C1 93 84 00 C2 93 89 00 CE 97' + '8B 00 C2 9A 8D 00 CF 99 8A 00 D6 98 87 00 C3 9F' + '92 00 CB 9D 92 00 DF 9D 90 00 E4 9A 88 00 C2 A1' + '97 00 CB A0 92 00 C3 A6 9C 00 C8 A4 99 00 DC A4' + '91 00 DB A9 91 00 D0 A3 99 00 E8 A7 80 00 EC AD' + '83 00 F0 AA 82 00 F3 AB 89 00 F0 B7 80 00 FF BF' + '85 00 F3 B2 8C 00 F8 B1 88 00 F5 BB 8C 00 F8 BE' + '8E 00 F1 AE 9A 00 EE B2 95 00 F7 B8 96 00 C1 AC' + 'A5 00 D7 AA A4 00 C4 B1 AD 00 D7 B0 A1 00 DA B5' + 'A6 00 DA B4 AA 00 D9 BB AF 00 C2 BC BD 00 D0 B3' + 'B2 00 DA BD B4 00 D0 BB BB 00 E0 B2 A5 00 EE BD' + 'A2 00 E3 B4 AA 00 E4 BB AF 00 F1 B6 A7 00 F6 BE' + 'A2 00 F0 BA AB 00 E5 BE B3 00 EC BC B0 00 E2 BF' + 'BB 00 FD C9 86 00 F4 C4 97 00 FF CB 95 00 FB C4' + '9C 00 FE CC 9D 00 FD D1 93 00 FE D5 9C 00 FE DB' + '9E 00 EC C5 AF 00 F4 C2 A5 00 FD CD A1 00 F5 C8' + 'AA 00 F9 CB AB 00 FD D4 A3 00 FF DE A4 00 FD D3' + 'AC 00 FD DB A9 00 E9 C2 B7 00 F1 C2 B5 00 F3 CA' + 'B3 00 FA D2 B3 00 FD DC B5 00 FB D6 BB 00 FB DC' + 'BC 00 FF E0 A5 00 FF E2 AE 00 FF E3 B2 00 FE E6' + 'BE 00 FF E8 BF 00 C3 BF C0 00 D0 C1 C1 00 DB C5' + 'C0 00 DD C6 CC 00 DF CA CB 00 DF CF D0 00 EB C5' + 'C0 00 EB CF CA 00 F9 CD C6 00 FC D3 C5 00 FC DC' + 'C5 00 F0 D3 CA 00 FF D7 CB 00 FA DD CA 00 E0 CF' + 'D0 00 E5 D7 DA 00 FA D8 D1 00 F0 DC D9 00 FE E4' + 'C1 00 FF E9 C3 00 FF EE CE 00 F0 E0 D4 00 FC E2' + 'D3 00 FF EE D0 00 F0 E1 DF 00 FD E5 DA 00 FE EB' + 'DC 00 FF F0 D5 00 FE F2 DD 00 ED DE E0 00 F0 DF' + 'E2 00 F1 E3 E3 00 FD E9 E5 00 F0 E7 EF 00 F1 EB' + 'EC 00 FE F5 E3 00 FF F3 EB 00 FF FA EE 00 F3 EE' + 'F0 00 FE F3 F2 00 FF FA F1 00 FF F7 FF 00 FF F9' + 'FC 00 7F 7F 7F 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 40 B4' + '0C 01 66 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 5F 5F 5F 5C 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 A5 99 98 76 70 60 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 7F 83 88 7E 68 74 71 67 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 65 47 A7 E3 A9 83 7E 68 75 71 6D 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 9D 8E 95 F4 F4 EA BF 82 7C 68 73 71 6D' + '5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 9B B1 95 F4 F4 F3 F1 E9 D0 83 7F 7A 6B' + '76 6E 5E 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 89 BA 91 F1 F4 F3 F1 F1 EC E8 AB 83 41' + '63 69 76 70 5E 00 00 00 00 00 00 00 00 00 00 00' + '00 00 62 89 C5 93 E0 E3 F1 F1 F0 F0 EB E9 E2 AA' + '83 40 3E 68 6B 71 6D 00 00 00 00 00 00 00 00 00' + '00 00 BE B6 B4 93 B0 90 B7 C3 DF EC EB E9 E2 E7' + 'E7 AC 83 40 3E 7B 6C 71 70 5C 00 00 00 00 00 00' + '00 00 AB C1 C5 94 97 4F 36 37 8F C0 D5 DB E7 E7' + 'E7 D9 D8 AC 82 3D 20 63 6B 77 6D 00 00 00 00 00' + '00 00 95 C2 C7 B0 91 5A 4D 36 2C 2E 43 96 BE D1' + 'D9 D9 D8 CF CF A1 7E 3C 1B 69 CA 00 00 00 00 00' + '00 66 95 C2 C7 B7 8D AD 4E 3A 36 2C 24 18 2B 48' + 'A5 AC D8 CF CF CD CB A0 3D 3E 9F 60 00 00 00 00' + '00 9E C0 C4 C7 BD 55 B2 5A 4E 3A 36 2C 24 15 14' + '12 3D 88 9D CE CD CB A2 8A 20 9F 6D 00 00 00 00' + '00 9E D4 C8 C9 BD 4A BA AD 5A 4E 3A 34 2C 24 15' + '0E 0C 0C 1D 7F 99 A0 A2 A0 21 79 70 00 00 00 00' + '00 9C E1 DD C9 C2 8E BC AD AD 5A 4E 39 36 2C 25' + '15 0E 0C 08 07 10 3C 7B 8A 21 73 6E 00 00 00 00' + '5D A6 E5 DE DD C4 95 B9 B3 B2 AD 5A 4E 3A 36 2D' + '25 15 14 09 08 06 02 04 19 1A 63 6F 00 00 00 00' + 'D0 D3 E5 E1 DE DC B8 A8 B0 B0 AF AD 5A 4E 3A 39' + '32 26 25 15 0A 09 06 01 03 05 20 76 00 00 00 00' + 'D0 E0 E6 E5 E1 DE DD BC 97 97 B0 94 94 90 50 3A' + '34 32 31 26 23 14 09 01 08 0B 1A 76 00 00 00 00' + 'AB E4 E6 E6 E5 E1 DE DD C9 C2 B7 91 8E 97 AF 50' + '39 34 32 31 28 23 14 08 0C 0B 10 75 60 00 00 66' + 'BF ED ED ED E6 E5 E1 DE DD C9 C9 C7 BA 92 97 AD' + '50 39 34 32 31 26 18 17 0F 0C 0D 69 67 00 00 A1' + 'D6 EE F2 ED E6 E6 E5 E1 DE DD C9 C8 C7 B7 52 91' + '59 57 4D 39 32 27 16 2F 33 13 0D 61 6D 00 00 CC' + 'EA F2 F2 EF ED ED E6 E5 DE DE DD C9 C9 C7 B1 8D' + '8E 92 56 4C 38 35 1F 4B 4E 2E 11 3B 70 00 00 A1' + 'F1 F4 F2 F2 F2 ED E6 E6 E5 E1 DE DD C9 C8 C7 C6' + 'BA 94 52 51 53 46 30 54 58 4B 2A 1C 78 00 00 A1' + 'EA EA F1 EE F2 EF ED E6 D7 C3 C4 DC DC C9 C9 C7' + 'C7 C6 C5 B3 93 44 22 49 8E 53 45 1E 77 00 00 74' + '98 9D D2 DA E0 E3 E4 D4 A9 87 86 B5 C1 B9 C1 C2' + 'C7 C7 C7 C5 B4 8C 81 98 84 61 29 3F 00 00 00 00' + '00 5B 98 98 86 A5 A6 A3 98 00 00 72 86 80 86 A4' + 'B9 B7 BA BD BB 8B 9A 00 00 00 00 6A 00 00 00 00' + '00 00 00 00 00 66 5D 66 00 00 00 00 00 00 00 6B' + '7D 85 B6 B0 AE 42 76 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 9A 84 63 64 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FC 3F FF FF FC 0F FF FF FC 03 FF FF F8 00' + 'FF FF F8 00 1F FF F8 00 07 FF F8 00 01 FF F0 00' + '00 7F F0 00 00 0F F0 00 00 07 F0 00 00 07 E0 00' + '00 03 E0 00 00 03 E0 00 00 03 E0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 01 80 00' + '00 01 80 00 00 01 80 00 00 01 80 00 00 01 80 00' + '00 01 80 00 00 03 E0 18 00 7B FE 3F 80 7F FF FF' + 'F0 FF FF FF FF FF FF FF FF FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 B8 47 1D 00 C9 45' + '0E 00 CB 55 1F 00 D7 5F 1F 00 DE 65 1E 00 D0 59' + '28 00 CE 68 3F 00 E2 69 24 00 E7 77 27 00 EB 7B' + '2F 00 F0 7F 39 00 C7 6B 4E 00 DE 7A 45 00 C9 7B' + '60 00 F3 8B 32 00 FD 9C 35 00 BE 80 70 00 BF 91' + '7F 00 F0 96 46 00 F6 99 44 00 F7 99 44 00 E8 8D' + '51 00 ED 8A 5E 00 FD A4 44 00 FF AA 46 00 FF AA' + '49 00 F7 A2 52 00 FF B2 59 00 FF B5 59 00 FF B2' + '5D 00 FF B3 5E 00 C4 84 72 00 EF A1 6B 00 FF B4' + '62 00 FF B5 68 00 F2 A7 73 00 F8 B3 71 00 F8 B5' + '7E 00 FF C3 73 00 FF C5 7A 00 FF C7 7A 00 96 8A' + '85 00 96 90 8E 00 99 91 8E 00 92 91 90 00 96 95' + '94 00 9F 97 94 00 9A 98 97 00 9C 99 98 00 9E 9C' + '9C 00 A6 96 91 00 AD 9C 95 00 B6 9D 93 00 A6 A0' + '9F 00 BB A0 94 00 B7 A0 9B 00 B1 A2 9F 00 BB A0' + '9A 00 A6 A2 A3 00 AE A7 A5 00 AC A7 A8 00 B3 A3' + 'A3 00 BF AB A6 00 BF AE AB 00 B7 AF B0 00 C9 8E' + '82 00 C4 95 8B 00 C9 94 88 00 CD 9A 8E 00 D9 9C' + '85 00 C3 9C 95 00 C2 9E 95 00 CE 9D 91 00 D1 9F' + '94 00 CD A0 90 00 C6 AA 9F 00 DA A3 98 00 DF AA' + '98 00 DF A9 9A 00 DC AB 9F 00 EC B5 8D 00 F1 B2' + '83 00 F3 B3 8B 00 F5 B6 8A 00 F7 B5 8E 00 F7 B8' + '8A 00 EE AC 93 00 F6 BB 99 00 CF B3 A9 00 D9 B0' + 'A0 00 D1 B7 B1 00 D9 BD B2 00 E9 BC A3 00 E5 BE' + 'AF 00 EA BC A8 00 FD C3 8C 00 FF D1 8F 00 FE C7' + '92 00 F8 C3 98 00 F9 C2 9B 00 FC C1 99 00 FF C8' + '9B 00 FA CF 9C 00 FB D0 97 00 FD CD A3 00 F8 CE' + 'AE 00 FC D0 A1 00 F7 D0 AE 00 FF DD AC 00 F4 CB' + 'B0 00 F2 CA B5 00 FF DF B2 00 FF E2 AD 00 FE E0' + 'B3 00 FF E1 B3 00 FF E4 B6 00 FE E0 BA 00 D3 C0' + 'C2 00 DE C1 C1 00 DF C4 C3 00 EF CA C3 00 EA D0' + 'CF 00 F6 D7 CE 00 F6 DA CF 00 F3 DD CD 00 E0 D0' + 'D1 00 EE D6 D4 00 E3 D4 D8 00 FA DF DB 00 FB E2' + 'C7 00 FF E8 C0 00 FF E8 C1 00 FF ED CB 00 FF EC' + 'CC 00 FF ED CC 00 EF E0 DF 00 FB E2 D3 00 FF EB' + 'D2 00 FF F0 D5 00 FF F1 D6 00 FC E5 E0 00 FC E7' + 'E4 00 F0 E6 EA 00 F7 ED ED 00 FB EB EA 00 FF F4' + 'E0 00 FF F9 ED 00 FF FA F6 00 FF F6 FB 00 7F 7F' + '7F 00 F7 B8 96 00 C1 AC A5 00 D7 AA A4 00 C4 B1' + 'AD 00 D7 B0 A1 00 DA B5 A6 00 DA B4 AA 00 D9 BB' + 'AF 00 C2 BC BD 00 D0 B3 B2 00 DA BD B4 00 D0 BB' + 'BB 00 E0 B2 A5 00 EE BD A2 00 E3 B4 AA 00 E4 BB' + 'AF 00 F1 B6 A7 00 F6 BE A2 00 F0 BA AB 00 E5 BE' + 'B3 00 EC BC B0 00 E2 BF BB 00 FD C9 86 00 F4 C4' + '97 00 FF CB 95 00 FB C4 9C 00 FE CC 9D 00 FD D1' + '93 00 FE D5 9C 00 FE DB 9E 00 EC C5 AF 00 F4 C2' + 'A5 00 FD CD A1 00 F5 C8 AA 00 F9 CB AB 00 FD D4' + 'A3 00 FF DE A4 00 FD D3 AC 00 FD DB A9 00 E9 C2' + 'B7 00 F1 C2 B5 00 F3 CA B3 00 FA D2 B3 00 FD DC' + 'B5 00 FB D6 BB 00 FB DC BC 00 FF E0 A5 00 FF E2' + 'AE 00 FF E3 B2 00 FE E6 BE 00 FF E8 BF 00 C3 BF' + 'C0 00 D0 C1 C1 00 DB C5 C0 00 DD C6 CC 00 DF CA' + 'CB 00 DF CF D0 00 EB C5 C0 00 EB CF CA 00 F9 CD' + 'C6 00 FC D3 C5 00 FC DC C5 00 F0 D3 CA 00 FF D7' + 'CB 00 FA DD CA 00 E0 CF D0 00 E5 D7 DA 00 FA D8' + 'D1 00 F0 DC D9 00 FE E4 C1 00 FF E9 C3 00 FF EE' + 'CE 00 F0 E0 D4 00 FC E2 D3 00 FF EE D0 00 F0 E1' + 'DF 00 FD E5 DA 00 FE EB DC 00 FF F0 D5 00 FE F2' + 'DD 00 ED DE E0 00 F0 DF E2 00 F1 E3 E3 00 FD E9' + 'E5 00 F0 E7 EF 00 F1 EB EC 00 FE F5 E3 00 FF F3' + 'EB 00 FF FA EE 00 F3 EE F0 00 FE F3 F2 00 FF FA' + 'F1 00 FF F7 FF 00 FF F9 FC 00 7F 7F 7F 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 40 B4 0C 01 66 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 2F 31 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 45 4F 48 3D 2D 00 00' + '00 00 00 00 00 00 00 00 00 57 8E 81 50 47 3C 2E' + '00 00 00 00 00 00 00 00 00 63 8D 95 90 7F 4E 43' + '3E 30 00 00 00 00 00 00 59 67 65 66 7D 8F 88 7A' + '4D 42 38 3B 00 00 00 00 5A 6D 56 22 1B 21 5F 80' + '7E 78 4A 20 41 00 00 00 6F 74 54 29 1E 14 0A 0D' + '46 77 76 49 40 00 00 00 82 83 58 61 27 1C 15 09' + '04 06 0E 44 3A 00 00 5B 8A 87 6A 64 62 28 1F 18' + '0F 05 02 01 11 00 00 5C 92 8C 86 75 69 55 60 1D' + '19 10 08 03 0C 32 2B 7B 93 92 8C 87 84 70 53 26' + '23 1A 0B 13 07 36 2C 91 94 93 92 8B 85 84 72 6B' + '52 24 17 25 16 39 00 3F 79 7C 89 5E 4C 6E 6C 73' + '71 68 4B 35 12 2A 00 00 00 00 33 00 00 00 00 37' + '5D 51 34 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 E7 FF 00 00 E0 FF 00 00 E0 3F' + '00 00 E0 0F 00 00 C0 03 00 00 C0 01 00 00 C0 01' + '00 00 C0 01 00 00 80 01 00 00 80 00 00 00 00 00' + '00 00 00 00 00 00 80 00 00 00 F7 87 00 00 FF FF' + '00 00 FF FF 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 00 24 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 D5 C9' + 'BE 1C DC C8 BE 54 D4 C6 BE 54 CF C4 BF 54 CB C4' + 'BF 54 CF C7 C2 41 D2 CA C6 2E D6 CE C9 1B DA D3' + 'CD 0C D8 D2 C9 03 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 DC C8' + 'BE 54 F0 C5 BC FF DA BF BE FF CA BA BF FF BF B8' + 'BF FF C9 C2 C9 C3 D4 CC D4 8A DF D8 DF 54 EA E7' + 'EA 26 E6 E2 DF 0A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 D8 BE' + 'B4 54 E5 A7 9E FF DE 9C 90 FF D5 96 89 FF CA 95' + '89 FF C6 A1 9B EB C2 AE AD D8 BF BD BF C6 CA C9' + 'CA 96 D3 D0 D1 6B DA D2 D4 43 E1 DA DB 24 DE D7' + 'D4 0D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 D6 B7' + 'AB 54 E0 91 84 FF E3 95 84 FF E3 9B 88 FF DF A2' + '8F FF D4 9B 8C FF C9 99 8E FF BF 9D 95 FF BF A9' + 'A3 DF C4 B8 B6 BD CF C9 CF 98 DA D4 DA 6C DA D5' + 'D6 47 D1 CC C4 27 D8 D1 CB 17 D8 D0 C9 0A 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 D6 B2' + 'A4 54 E0 84 6F FF EA AB 9A FF F5 C9 BA FF FF DF' + 'D0 FF F4 AF 9A FF E9 8C 75 FF DF 78 5F FF C9 88' + '74 FF BA 9A 8F FF B0 AF B0 FF BA B9 BA DB C5 C4' + 'C5 AE D0 D0 D0 78 E4 DF E4 46 E5 DD DF 1E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 DF C7 BD 71 E7 B4' + 'A6 C6 EA 90 79 FF ED A1 8F FF F4 C1 B6 FF FF F2' + 'EF FF FB E2 DD FF F7 D2 CA FF F4 C1 B4 FF E6 AA' + '98 FF D6 98 84 FF C5 89 7A FF C1 94 8B F3 BD A4' + 'A1 E4 BA BA BA D1 C8 C3 C8 B1 CF C9 CD 89 D0 CD' + 'CA 5B D7 D4 D1 39 D8 D3 CD 1A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 E5 C4 BA A9 F1 B9' + 'A8 FF F4 A9 8A FF F0 A0 8A FF F4 BC B0 FF FF FC' + 'FF FF FF FC FF FF FF F6 F8 FF FF EC EA FF F8 CE' + 'C3 FF EC B3 A2 FF DA 99 89 FF D2 96 89 FF C9 97' + '8D FF BF 9C 95 FF BF A3 9F EF C1 AF AD D5 C5 C1' + 'C0 B0 CF CC CD 8A D3 CF CF 60 D1 C9 C4 33 D4 CE' + 'C8 22 D5 CE C6 10 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 E5 C2 B5 A9 F4 C3' + 'AA FF FF CD A0 FF F4 A9 8A FF F4 B8 AA FF FF FC' + 'FF FF FF FC FF FF FF FA FF FF FF F7 FF FF FF F3' + 'F5 FF FA EB EA FF F0 DF DF FF EF BD B4 FF E9 9B' + '89 FF DF 77 5F FF CA 7F 6A FF BA 8F 7F FF B0 A7' + 'A0 FF B9 B1 B4 F3 C4 BC C4 D2 CF C8 CF 9C DA D7' + 'DA 66 DB D8 D5 32 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 E5 B8 A6 A9 F4 BA' + '9C FF FF D1 A0 FF F4 A7 83 FF F4 B5 A2 FF FF FC' + 'FF FF FF FC FF FF FF FA FF FF FF F7 FF FF FF F3' + 'F5 FF FD EE EE FF FA E9 EA FF F3 DE DC FF ED CF' + 'CA FF EA BC B4 FF E3 A9 9B FF DA 97 83 FF CF 87' + '6A FF C4 8B 78 FB BD 97 8F F0 BA AC AF DD C4 BC' + 'C0 CB CC C5 C9 A8 D0 C8 C9 73 D7 CF D0 50 D7 D0' + 'CD 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 E5 AF 9C A9 F4 B4' + '93 FF FF D9 A5 FF F4 AB 81 FF F4 B5 9D FF FF F8' + 'FA FF FF F9 FD FF FF F9 FF FF FF F7 FF FF FF F3' + 'F5 FF FD F0 F0 FF FA EF F0 FF F3 EF F0 FF F0 EA' + 'EC FF F0 E1 E5 FF EF CA C4 FF EB B2 A3 FF E4 9A' + '7F FF D3 8F 78 FF C7 8C 7C FF BF 91 89 FF C2 9A' + '94 FE C4 A6 A4 EC C4 B4 B9 C9 CB C3 C8 A5 CE C9' + 'CA 77 CC C6 BF 3F D2 CB C6 2E D8 D0 CB 1C DB D3' + 'CF 0C D5 CD C4 04 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 E5 AA 95 A9 F4 B2' + '90 FF FF E4 B0 FF F5 B6 85 FF F5 BA 9A FF FF F1' + 'F0 FF FF F5 FA FF FF F7 FF FF FF F7 FF FF FF F3' + 'F5 FF FA F0 F0 FF F0 EF F0 FF F0 EF F0 FF F0 EC' + 'EF FF F0 E7 EF FF F0 E3 E5 FF F0 E2 E0 FF F0 E2' + 'E0 FF E5 C0 B5 FF DF 9C 8A FF DF 77 5F FF D4 71' + '55 FF C4 79 64 FF B0 90 8F FF B0 A5 A4 FF B5 B5' + 'B5 EA C0 C0 C0 C0 D4 CF D4 8A E4 DC E4 56 EF E8' + 'EF 26 DB D4 CF 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 D8 C8 BE 38 E6 C6 BD A9 EC B6 A2 E2 F4 BE' + '9A FF FF E0 A5 FF F5 BA 88 FF F5 B6 90 FF FF D3' + 'BA FF FF D2 AF FF FF D9 BB FF FF E7 DF FF FF ED' + 'EA FF FA F0 F0 FF F0 EF F0 FF F0 EF F0 FF F0 EC' + 'EF FF F0 E7 EF FF F0 E3 E5 FF F0 E2 E0 FF F0 E2' + 'E0 FF EC D5 D1 FF E9 C8 C3 FF E9 BC B4 FF DF A8' + '9C FF D6 94 85 FF CF 80 6F FF C8 7F 6F FF C2 88' + '7B F8 BF 9A 94 E9 BF B0 B1 D8 C5 C1 C5 BC CF CC' + 'CF 98 D0 CD CC 6C D7 D3 D1 45 E5 DD DE 23 D8 D0' + 'C9 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 DC C8 BE 54 F0 C5 BD FF F3 C0 AD FF F8 C9' + 'A3 FF FF DE A0 FF F5 BD 8A FF F5 B4 8A FF FF C3' + '9F FF FF BD 83 FF FF C0 84 FF FF CB A4 FF FF D2' + 'B3 FF FA D9 C3 FF F0 E1 D5 FF F0 EA E7 FF F0 EC' + 'EF FF F0 E7 EF FF F0 E3 E5 FF EF E1 E0 FF EF E1' + 'E0 FF EF DF E0 FF EF DF E0 FF EF DF E0 FF E5 CB' + 'CA FF DF B2 AC FF DF 95 84 FF D8 89 79 FF D0 84' + '76 FF C9 86 79 FF BF 8F 84 FF BC 9B 93 F5 BF A9' + 'A5 E0 C3 BA B7 BD CD C9 CA 97 DF D7 DF 6F D5 CF' + 'CD 45 D4 CF C8 25 DB D6 CF 0E D5 CE C4 04 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 DC C9 BF 54 F0 C7 BF FF FA CA B5 FF FF D2' + 'AA FF FF DE A0 FF F5 BF 8A FF F5 B5 8A FF FF BF' + '9F FF FF B5 74 FF FF AD 59 FF FF A5 4F FF FF A1' + '4F FF FA AC 6A FF F0 C7 A0 FF F0 E1 D5 FF F0 EC' + 'EF FF F0 E7 EF FF F0 E3 E5 FF EF E1 E0 FF EF DF' + 'E0 FF EF DF E0 FF EF DF E0 FF EF DF E0 FF E5 D9' + 'DF FF E0 D4 DA FF E0 D0 D0 FF DF C4 C4 FF DF AB' + 'A4 FF E0 84 6F FF D5 6A 4F FF CA 68 4F FF BF 7F' + '70 FF B5 99 8F FF B5 AC AA F6 BF B8 BF E4 CA C7' + 'CA AE DA DA DA 70 F0 EF F0 2C DC D6 CF 0E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 DB C3 B7 54 EF B5 A9 FF F9 D0 B4 FF FF DE' + 'B4 FF FF E2 AA FF FB C7 95 FF F8 BA 8E FF F5 B9' + '95 FF FB BD 7F FF FF B9 6B FF FF AD 59 FF FF A6' + '52 FF FA A4 54 FF F0 A7 60 FF F0 AC 71 FF F0 B5' + '88 FF F0 BF A5 FF F0 D0 C4 FF EF DA D8 FF EF DF' + 'E0 FF EF DF E0 FF EB DD DF FF E5 D9 DF FF E1 D7' + 'DF FF E0 D4 DA FF E0 D0 D0 FF DF CB CC FF DF C3' + 'C1 FF DF B5 AF FF DB A2 96 FF D4 92 81 FF CA 85' + '70 FF C7 7A 64 FF C3 7D 6A FC BF 8C 7F F6 C2 AA' + 'A6 E4 CF C6 C8 C0 E4 DF E4 8A D8 D1 CB 2E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 DB BF B2 54 EF AB 9A FF F9 D2 B2 FF FF E5' + 'BA FF FF E4 B0 FF FF CE 9E FF FA BD 91 FF F0 B1' + '8A FF FA C1 83 FF FF C1 74 FF FF B3 5F FF FF AC' + '57 FF FB A4 4F FF F5 9B 44 FF F1 95 41 FF EF 96' + '4B FF EF 9D 65 FF EF AB 84 FF ED B8 9F FF EA C4' + 'B5 FF EA CD C6 FF E6 D3 D4 FF E0 D7 DF FF E0 D5' + 'DB FF E0 D3 D6 FF E0 CF D0 FF DF CF D0 FF DF CF' + 'D0 FF DF CF D0 FF DF C2 C1 FF DA B1 AA FF D0 9A' + '8A FF D0 85 74 FF CC 78 64 FF C4 74 5A FF C0 90' + '84 FF C7 B0 AF EB D9 D2 D9 C5 DB D5 D2 4C D8 D2' + 'C9 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 DC BE AF 54 F0 A8 90 FF FA D2 AF FF FF E6' + 'BA FF FF E4 B0 FF FF D4 A4 FF FA BF 94 FF F0 A7' + '80 FF FA BF 80 FF FF C5 75 FF FF B8 60 FF FF B3' + '5F FF FF AD 59 FF FF A5 4F FF F5 9B 45 FF EF 8F' + '3A FF EF 80 30 FF EF 75 25 FF EA 7A 35 FF E0 90' + '60 FF E0 AA 94 FF E0 C2 BE FF E0 D7 DF FF E0 D2' + 'D5 FF E0 CF D0 FF E0 CF D0 FF DF CF D0 FF DF CF' + 'D0 FF DF CF D0 FF DF C9 CF FF DA C4 CA FF D0 C0' + 'C0 FF D0 BA BF FF D0 9F 9A FF D0 6F 50 FF C4 79' + '65 FF C4 97 8F F3 CF C8 CF DD E4 E2 E4 69 E6 E3' + 'DF 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E1 C7' + 'BD 71 EB C1 B4 C6 F0 B8 A4 FF FA D7 B6 FF FF E5' + 'BA FF FF E4 B0 FF FF DE AC FF FA CA 9C FF F0 A7' + '80 FF FA C7 8E FF FF CF 86 FF FF BD 69 FF FF B8' + '63 FF FF B2 5D FF FF AD 59 FF FB A4 4F FF F6 9A' + '44 FF EF 8F 3A FF EF 81 30 FF ED 7A 2E FF EA 7A' + '35 FF E2 7F 46 FF DF 87 5B FF DF 92 74 FF DF A6' + '94 FF DF BA B3 FF E0 CF D0 FF DF CF D0 FF DF CF' + 'D0 FF DF CF D0 FF DF C9 CF FF DA C4 CA FF D0 C0' + 'C0 FF D0 BD BF FF D0 AD A8 FF D0 8E 7A FF C5 7D' + '65 FF C1 8E 7E F9 C5 C2 C5 EF E1 E0 E1 79 E6 E2' + 'DF 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E7 C8' + 'BD A9 F3 C7 BA FF F5 C7 B4 FF FB DC BB FF FF E6' + 'BB FF FF E4 B5 FF FF E4 B1 FF F9 CD 9E FF EF 9F' + '7A FF F9 CA 97 FF FF D6 95 FF FF C4 74 FF FF BD' + '6A FF FF B8 63 FF FF B3 5F FF FF AC 57 FF FB A4' + '4F FF F5 9B 44 FF F1 8E 3A FF EF 81 30 FF EF 75' + '25 FF E4 6D 21 FF DF 6B 26 FF DF 6D 34 FF DB 7F' + '57 FF DA 92 78 FF DA A7 95 FF DA B1 A6 FF DB BC' + 'B8 FF DF C9 CA FF DF C7 CD FF DA C4 CA FF D0 C0' + 'C0 FF D0 BF C0 FF D0 B6 B3 FF D0 A4 9A FF C8 7C' + '65 FF C3 84 71 FD BF BD BF FB DF DC DF 88 E5 E1' + 'DF 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E6 CC' + 'BF A9 F5 D0 BF FF FF D7 BF FF FF E2 BF FF FF E7' + 'BF FF FF E6 BF FF FF E4 B5 FF F9 C7 9A FF EF 8F' + '70 FF F9 C7 9A FF FF DC A0 FF FF CC 80 FF FF C4' + '74 FF FF BD 6A FF FF B8 60 FF FF B3 5F FF FF AD' + '59 FF FF A5 4F FF F5 9B 45 FF EF 8F 3A FF EF 80' + '30 FF E5 75 25 FF DF 6D 1F FF DF 67 1F FF D5 5D' + '1F FF D0 57 1F FF D0 57 1F FF D0 74 54 FF D5 97' + '89 FF DF BF BF FF DF C4 C9 FF DA C4 CA FF D0 C0' + 'C0 FF D0 BF C0 FF D0 BA BA FF D0 B0 B0 FF D0 78' + '64 FF CA 7A 69 FF BF B7 BF FF DE D7 DE 95 E5 DE' + 'DF 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E5 C0' + 'B1 A9 F4 CA B5 FF FF E6 CA FF FF E7 C3 FF FF E7' + 'BF FF FF E7 BF FF FF E6 BB FF F9 CD A4 FF EF 9E' + '7A FF F9 CE A5 FF FF DD A7 FF FF CC 80 FF FF C9' + '7C FF FF C4 74 FF FF BD 69 FF FF B8 63 FF FF B2' + '5A FF FF AC 4F FF FB A4 4B FF F6 9A 44 FF EF 8F' + '3A FF EB 81 2F FF E6 76 26 FF DF 6D 1F FF DB 65' + '1F FF D6 5E 1F FF D0 57 1F FF CF 5D 2A FF D1 65' + '38 FF D4 6D 4A FF D4 82 69 FF D2 97 89 FF D0 AF' + 'AA FF D0 B9 B8 FF D0 BC BE FF D0 B8 BA FF D0 7B' + '68 FF C7 79 66 FF B5 B2 B5 FF D4 D2 D4 A1 DE DA' + 'D8 4C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E5 BB' + 'AA A9 F4 C7 B1 FF FF EF D5 FF FF EC CA FF FF E9' + 'C3 FF FF E8 C0 FF FF E7 BF FF FA D1 AB FF F0 A7' + '85 FF FA CE AC FF FF DB AC FF FF CE 85 FF FF CC' + '81 FF FF C9 7C FF FF C4 74 FF FF BD 6A FF FF B8' + '5F FF FF B2 55 FF FF AC 54 FF FB A4 4F FF F5 9B' + '44 FF F4 8E 39 FF EF 81 2F FF E5 75 24 FF E1 6D' + '21 FF DB 65 1F FF D5 5C 1F FF D1 55 18 FF CF 4E' + '13 FF CF 48 10 FF CF 58 2B FF CD 6C 4A FF CA 82' + '6A FF C7 91 83 FF C7 9E 96 FF CA A9 A4 FF CE 7C' + '68 FF C7 7B 68 FF B5 A7 A5 FF CE C9 C8 AD D7 D4' + 'D1 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E6 BB' + 'AA A9 F5 C9 B5 FF FF F3 DF FF FF F0 D4 FF FF EC' + 'CA FF FF E8 C0 FF FF E8 C0 FF FA D2 AF FF F0 A7' + '8F FF FA C6 AE FF FF D6 AF FF FF D4 90 FF FF CE' + '85 FF FF CC 80 FF FF CC 80 FF FF C4 74 FF FF BD' + '6A FF FF B8 60 FF FF B3 5F FF FF AD 59 FF FF A5' + '4F FF FF 9B 44 FF F9 8F 39 FF EF 80 2F FF E5 75' + '25 FF DF 6D 1F FF DF 67 1F FF D5 5D 1F FF CF 55' + '1A FF CF 4F 10 FF CF 48 10 FF CA 40 0A FF C0 38' + '00 FF B5 47 1F FF B5 60 45 FF C0 84 70 FF CA 7B' + '64 FF CA 81 6E FF BF 97 8F FF CA BC BA BA D0 CE' + 'CA 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 D9 C9 BE 38 E8 C7 BD A9 F4 C3' + 'B7 E2 FB D1 BF FF FF F1 D5 FF FF EF D1 FF FF ED' + 'CD FF FF EC C9 FF FF E9 C3 FF FA D6 B3 FF F0 B2' + '99 FF F3 BB A4 FF F8 C7 A8 FF FF D6 A5 FF FF D7' + 'A1 FF FF D5 98 FF FF CE 89 FF FF C7 7F FF FF C2' + '74 FF FF BD 69 FF FF B8 63 FF FF B2 5D FF FF AC' + '59 FF FF A8 4F FF FD A2 44 FF F9 99 3A FF F6 8D' + '2F FF F0 82 2A FF E9 77 29 FF DF 69 22 FF D6 5D' + '1D FF CF 54 19 FF CF 4E 13 FF CD 47 0E FF C9 40' + '0A FF B8 38 0E FF B1 3F 1A FF B5 56 30 FF C0 56' + '32 FF C3 68 4B FF BF 8A 7A FF CA B5 B2 C6 D6 D2' + 'D4 73 E5 E3 DF 07 D8 D2 C9 02 00 00 00 00 00 00' + '00 00 00 00 00 00 DC C9 C0 54 F2 C9 C2 FF FA CD' + 'C3 FF FF DA C9 FF FF F1 D5 FF FF EF D1 FF FF EE' + 'CF FF FF EE CF FF FF EB C8 FF FB DE BC FF F5 C7' + 'A9 FF F5 BE A3 FF F6 BE A0 FF FA C7 A0 FF F9 C7' + '9F FF FB C8 9B FF FF C9 94 FF FF CA 8D FF FF C9' + '84 FF FF C6 79 FF FF BE 6B FF FF B8 63 FF FF B3' + '5F FF FF B0 58 FF FF AD 4F FF FF A9 44 FF FF 9F' + '3A FF FB 95 35 FF F4 8C 34 FF ED 7D 2A FF E4 6F' + '22 FF DA 62 1F FF D6 59 18 FF D2 50 13 FF CF 48' + '10 FF B9 32 05 FF B1 30 06 FF B5 44 14 FF BC 46' + '1B FF C0 58 38 FF C0 7D 6A FF C6 AD AA D2 D6 D3' + 'D6 83 F0 EF F0 12 DC D6 CF 06 00 00 00 00 00 00' + '00 00 00 00 00 00 DC CB C4 54 F0 CF CF FF FA D9' + 'CF FF FF E5 D4 FF FF F3 DF FF FF F1 D5 FF FF EF' + 'D0 FF FF EE D0 FF FF EE CF FF FF EC CA FF FF E7' + 'C0 FF FF D0 AA FF FA BB 95 FF F0 A7 80 FF EF 9E' + '80 FF F4 A6 8A FF FF BF A0 FF FF CC A0 FF FF D4' + '9A FF FF D4 90 FF FF C6 7A FF FF BD 6A FF FF B8' + '60 FF FF B3 5F FF FF B0 59 FF FF AF 4F FF FF A9' + '45 FF FF A6 40 FF FF A6 40 FF FF 9A 35 FF FA 8A' + '2A FF F0 78 20 FF E4 67 1F FF D9 59 1A FF CF 4F' + '10 FF B9 34 05 FF B4 34 0A FF C0 4F 1F FF C0 49' + '1F FF C0 54 34 FF C0 6F 5F FF C0 A4 9F DF CF CF' + 'CF 95 F0 EF F0 23 DC D6 CF 0B 00 00 00 00 00 00' + '00 00 00 00 00 00 DC C8 BD 54 F0 C4 BA FF FA E0' + 'CF FF FF EF DB FF FF F3 DF FF FF F2 DB FF FF F1' + 'D6 FF FF EF D0 FF FF EE CF FF FF ED CD FF FF EC' + 'C9 FF FF E1 BC FF FD D8 B1 FF F9 D2 AA FF F9 C8' + 'A3 FF FB C2 9C FF FF BF 95 FF F7 AE 86 FF F4 A8' + '81 FF F4 AD 85 FF FB BC 8C FF FF C4 8A FF FF C7' + '7F FF FF BB 6A FF FF B3 5A FF FF AF 4F FF FF AD' + '4B FF FF AA 46 FF FF A6 40 FF FF A1 3C FF FD 9B' + '35 FF F9 91 2A FF F6 85 29 FF EB 72 24 FF D9 59' + '19 FF BD 3F 0F FF B8 3D 11 FF C9 54 1F FF C3 4F' + '1F FF C3 54 2D FF C9 65 4A FF C2 9D 98 EB CF CA' + 'CF A7 EF EA EF 32 DB D4 CF 11 00 00 00 00 00 00' + '00 00 00 00 00 00 DC C5 B9 54 F0 BD AF FF FA E3' + 'D3 FF FF F6 E3 FF FF F4 DF FF FF F3 DF FF FF F2' + 'DB FF FF F1 D5 FF FF EF D1 FF FF EE CF FF FF EE' + 'CF FF FF EB C8 FF FF E9 C3 FF FF E8 C0 FF FF E0' + 'B8 FF FF D7 AE FF FF CC 9F FF F7 B6 8D FF F4 AB' + '86 FF F4 AA 8A FF F7 B0 8E FF FB BC 93 FF FF CE' + '99 FF FF C3 7A FF FF BA 63 FF FF B2 55 FF FF B0' + '51 FF FF AD 4B FF FF A9 44 FF FF A7 41 FF FF A4' + '3C FF FF A1 35 FF FF 98 31 FF F6 85 2B FF E4 67' + '24 FF CC 50 1D FF C4 4B 1B FF CF 59 1F FF C8 54' + '1F FF C8 55 28 FF CF 5C 3A FF C1 97 8F F6 C9 C4' + 'C9 B7 EA E5 EA 42 DA D3 CD 16 00 00 00 00 00 00' + '00 00 00 00 00 00 DC C4 B9 54 F0 BA AF FF FA E4' + 'DA FF FF F8 EA FF FF F6 E0 FF FF F4 DF FF FF F3' + 'DF FF FF F3 DF FF FF F1 D5 FF FF EF D0 FF FF EE' + 'D0 FF FF EE CF FF FF EC CA FF FF E8 C0 FF FF E8' + 'C0 FF FF E7 BF FF FF E6 BF FF FF E4 B5 FF FF DC' + 'AA FF FF CD A0 FF F4 A3 7F FF F4 A3 84 FF FF CC' + 'B0 FF FF CC 90 FF FF C5 75 FF FF B8 60 FF FF B2' + '55 FF FF AF 4F FF FF AF 4F FF FF A9 45 FF FF A6' + '40 FF FF A6 40 FF FF A1 35 FF FA 92 2F FF F0 78' + '2F FF E4 68 2F FF D9 60 2A FF CF 60 20 FF CF 5A' + '1F FF CF 56 24 FF D0 54 2F FF BA 91 84 FF BF BF' + 'BF C5 E0 DF E0 52 D6 D1 CA 1B 00 00 00 00 00 00' + '00 00 E1 C8 BD 71 EE C7 BC C6 F9 C8 BA FF FD E9' + 'DE FF FF F9 EE FF FF F8 EA FF FF F6 E3 FF FF F4' + 'DF FF FF F3 DF FF FF F2 DB FF FF F1 D6 FF FF EF' + 'D0 FF FF EE CF FF FF ED CD FF FF EC C9 FF FF E9' + 'C3 FF FF E7 BF FF FF E7 BF FF FF E6 BB FF FF E2' + 'B4 FF FF DC AA FF FB C4 98 FF F4 B1 8C FF EA A3' + '85 FF F8 C3 97 FF FF CF 91 FF FF C5 75 FF FF BA' + '63 FF FF B3 56 FF FF AF 4F FF FF AD 4B FF FF AA' + '46 FF FF A6 40 FF FF A4 3C FF FA 93 36 FF F0 72' + '2F FF F2 81 3D FF EF 88 3F FF E4 84 35 FF D6 6A' + '26 FF CF 5A 24 FF D0 54 2F FF C1 86 76 FF C3 B1' + 'AD CB D5 D5 D5 64 D3 CD C6 21 00 00 00 00 00 00' + '00 00 E7 CA C1 AA F6 CE C5 FF FF D6 CA FF FF EE' + 'E3 FF FF FA F0 FF FF FA F0 FF FF F8 E8 FF FF F6' + 'E3 FF FF F4 DF FF FF F3 DF FF FF F2 DB FF FF F1' + 'D5 FF FF EF D1 FF FF EE CF FF FF EF CF FF FF EB' + 'C8 FF FF E9 C3 FF FF E8 C0 FF FF E7 BF FF FF E6' + 'BB FF FF E4 B5 FF FF DA AA FF F8 C2 97 FF EA 9F' + '7A FF F1 B1 8C FF F6 BB 8E FF F9 BB 80 FF FD B8' + '75 FF FF B6 6C FF FF B5 64 FF FF B4 5D FF FF B0' + '53 FF FF A9 45 FF FF A7 41 FF F8 92 3A FF EA 6A' + '2F FF F8 92 48 FF FB A5 51 FF F5 A1 4A FF E2 7E' + '35 FF D6 65 2B FF D0 57 2F FF C4 7D 68 FF C4 A4' + '9D D1 CF CD CF 77 D7 D3 CF 2C DB D6 CF 07 00 00' + '00 00 E6 D0 C9 AA F5 D9 D4 FF FF E4 DF FF FF F2' + 'EA FF FF FA F0 FF FF FA F0 FF FF FA F0 FF FF F8' + 'EA FF FF F6 E0 FF FF F4 DF FF FF F3 DF FF FF F3' + 'DF FF FF F1 D5 FF FF EF CF FF FF EF CF FF FF EF' + 'CF FF FF EC CA FF FF E8 C0 FF FF E8 C0 FF FF E7' + 'BF FF FF E6 BF FF FF E4 B5 FF FF D8 A5 FF FF C0' + '90 FF EA 96 70 FF E5 89 6A FF EF 9A 80 FF F9 AD' + '89 FF FF BA 8F FF FF C0 8F FF FF C0 7A FF FF BA' + '65 FF FF B0 50 FF FF A9 45 FF F4 8E 3A FF E0 60' + '2F FF F4 9A 4F FF FF B8 60 FF FF B8 60 FF F4 97' + '4A FF E4 79 39 FF D0 5F 2F FF C5 77 5A FF C5 9A' + '8F D8 CF C7 CF 8A E4 E2 E4 3C F0 F0 F0 16 00 00' + '00 00 E6 CA C2 AA F5 D6 D1 FF FF EC EA FF FF F6' + 'F4 FF FF FA F6 FF FF FA F0 FF FF FA F0 FF FF F9' + 'EE FF FF F8 EA FF FF F6 E3 FF FF F4 DF FF FF F3' + 'DF FF FF F2 DB FF FF F1 D6 FF FF EF CF FF FF EF' + 'CF FF FF EE CD FF FF EC C9 FF FF E9 C3 FF FF E7' + 'BF FF FF E7 BF FF FF E6 BB FF FF E0 B3 FF FF D7' + 'A5 FF F8 CA 9A FF F6 C0 95 FF F9 BB 94 FF F6 B3' + '89 FF F1 A7 7D FF EA 96 6F FF EA 96 68 FF ED 9B' + '65 FF F5 A4 65 FF FB A9 68 FF F8 9C 61 FF E9 7A' + '4F FF F7 AC 68 FF FF C2 71 FF FF BD 69 FF FB AB' + '5B FF EF 90 48 FF D9 6A 2F FF CF 72 4C FF C8 8F' + '7E DE C5 C1 C5 9B D4 CF CB 38 DC D6 CF 07 00 00' + '00 00 E6 C6 BB AA F5 D4 CD FF FF F4 F5 FF FF F9' + 'FB FF FF FB FB FF FF FA F5 FF FF FA F1 FF FF FA' + 'F0 FF FF FA F0 FF FF F8 E8 FF FF F6 E3 FF FF F4' + 'DF FF FF F3 DF FF FF F2 DB FF FF F1 D5 FF FF EF' + 'D1 FF FF EF CF FF FF EF CF FF FF EB C8 FF FF E9' + 'C3 FF FF E8 C0 FF FF E7 BF FF FF E6 BB FF FF E4' + 'B5 FF FF E4 B1 FF FF DE AC FF FF D3 A4 FF F8 C5' + '96 FF F1 B4 86 FF EA A0 75 FF EA 9E 75 FF EC 9F' + '75 FF F0 A4 74 FF F6 A3 74 FF F4 97 6B FF E9 7F' + '5A FF F4 A3 6C FF F9 B6 75 FF FA B9 74 FF FD B7' + '6D FF F7 A6 5D FF E9 87 44 FF D8 73 48 FF CB 87' + '73 EB C5 C1 C5 C2 CD C7 C1 41 00 00 00 00 00 00' + '00 00 E6 C3 B5 AA F5 D4 CA FF FF FC FF FF FF FC' + 'FF FF FF FC FF FF FF FC FF FF FF FA F5 FF FF FA' + 'F0 FF FF FA F0 FF FF FA F0 FF FF F8 EA FF FF F6' + 'E0 FF FF F4 DF FF FF F3 DF FF FF F3 DF FF FF F1' + 'D5 FF FF EF CF FF FF EF CF FF FF EF CF FF FF EC' + 'CA FF FF E8 C0 FF FF E8 BF FF FF E7 BF FF FF E6' + 'BF FF FF E4 B5 FF FF E4 B0 FF FF E4 B0 FF FF E4' + 'B0 FF FF E2 AA FF FF DE A0 FF FF D7 A0 FF FA C8' + '95 FF F0 B0 7F FF EF 95 6A FF E9 7F 5A FF DF 6F' + '4F FF E9 7F 5A FF EF 93 6A FF F0 AC 80 FF F9 B9' + '80 FF FF BD 7A FF FF B7 6F FF DF 7D 4F FF CF 82' + '6F FF CF C7 CF FF D0 C8 C4 55 00 00 00 00 00 00' + '00 00 EA CB C3 AA F6 D0 CA FF F5 D8 D4 FF F5 D5' + 'CD FF F8 D8 D1 FF FF E1 DF FF FF E8 E2 FF FF F0' + 'E8 FF FF FA F0 FF FF FA F0 FF FF F9 EE FF FF F8' + 'EA FF FF F4 E2 FF FB E3 D0 FF F5 C5 B4 FF F4 BD' + 'A9 FF F4 BD A8 FF F5 C4 AF FF FB D1 B6 FF FF DB' + 'BC FF FF E2 BF FF FF E6 BF FF FF E7 BF FF FF E7' + 'BF FF FF E6 BB FF FF E4 B6 FF FF E4 B0 FF FF E4' + 'B0 FF FF E3 AE FF FF E2 AA FF FF DD A3 FF FD D6' + '9C FF F9 CE 94 FF F3 AF 7F FF E6 98 76 FF D4 89' + '79 FF DF A4 93 FF E8 B0 9C FF EF AC 94 FF EC 99' + '78 FF EA 8D 65 FF EA 87 59 FF DF 69 41 FF D7 7F' + '64 C6 D0 C8 C4 55 D1 C9 C0 1C 00 00 00 00 00 00' + '00 00 E3 CE C6 71 EA CD C6 AA E6 C8 BF AA EC C0' + 'B4 BB F3 C2 B7 D7 FA CE C7 FF FA D4 CE FF FA DB' + 'D3 FF FA E2 D5 FF FA E4 D8 FF FB E7 DC FF FF EC' + 'E0 FF FB E2 D1 FF F6 D1 BF FF F0 B8 A9 FF E8 B1' + 'A2 C6 E5 B0 A2 AA E6 B7 A9 AA F3 C5 B1 E2 F9 CD' + 'B5 FF F9 D0 B4 FF F9 CE AE FF F9 D0 AE FF FA D6' + 'B4 FF FD D9 B4 FF FF DE B4 FF FF E4 B5 FF FF E4' + 'B1 FF FF E4 B0 FF FF E4 B0 FF FF E1 A8 FF FF DF' + 'A3 FF FF DE A0 FF F5 B9 86 FF E3 A3 82 FF CA 9C' + '94 FF D5 B9 B1 C6 DE C2 B8 AA E5 B6 A9 AA DE 9F' + '8D AA DB 91 7B AA DB 8D 74 AA E1 83 66 E2 DE 97' + '7F AA 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E6 BF' + 'B4 33 F0 BC B2 88 F2 C2 B8 FF F0 C1 B8 FF F0 BC' + 'B0 FF F0 B4 A0 FF F0 B8 AA FF F5 C1 B4 FF FF D0' + 'C0 FF F5 BD AA FF F0 BC AA FF F0 CD C0 FF DC CB' + 'BF 55 00 00 00 00 00 00 00 00 E6 CC BF A9 EF C4' + 'B5 FF EF B4 A0 FF EF A2 8A FF EF A2 8A FF F0 B4' + 'A0 FF F9 BF A0 FF FF CF AA FF FF E6 BF FF FF E4' + 'B5 FF FF E4 B0 FF FF E4 B0 FF FF E4 B0 FF FF E2' + 'AA FF FF DE A0 FF F5 B4 80 FF E0 A1 7F FF C0 A7' + 'A0 FF CB BE B4 55 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 E5 CC BF A9 E6 CC' + 'BF AA 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 D8 C6' + 'BB 11 DC C5 BA 2D DC C7 BC 55 DC C7 BC 55 DC C5' + 'B9 55 DC C2 B4 55 E9 BC B0 A6 F1 BC B0 C1 F5 C1' + 'B4 A5 F1 BA AD C2 E8 BD B0 A7 DC CB BF 55 D5 CA' + 'BF 1C 00 00 00 00 00 00 00 00 D8 CA BF 38 DB C8' + 'BB 55 DB C2 B4 55 DB BC AD 55 DB BC AD 55 DC C2' + 'B4 55 EC BF AD C6 F4 BA A3 FF F4 B3 95 FF F4 B2' + '91 FF F4 B9 93 FF F5 C6 9A FF FB CF A1 FF FF D9' + 'A7 FF FF E2 AA FF ED A8 7C FF DC 9D 83 FF CA C1' + 'BF FF CF C7 BF 55 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 D8 CA BF 38 D8 CA' + 'BF 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 DF C2 B7 51 E6 BF B4 6C E6 BF' + 'B4 50 E5 BE B3 6D DE C2 B7 52 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 DF C2 B7 71 E5 B8 A9 AA E5 A9 94 AA E5 A9' + '94 AA EA B1 9A C6 F5 C0 A4 FF F8 C0 9E FF F8 C2' + '9A FF F4 C7 9A FF E6 9C 77 FF DA 9D 86 E2 D0 CD' + 'CA AA D1 CB C2 38 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 E0 CD C4 54 FF D4 CF FF F4 B6 A5 FF EA 9F' + '85 FF E0 8F 70 FF E0 8F 70 FF DB A2 8A AA 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 D7 CB C0 1C E1 CD C4 55 DD C3 B6 55 DA BB' + 'AB 55 D6 B6 A4 55 D6 B6 A4 55 D5 BC AD 38 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF 00' + '3F FF FF FF 00 00 FF 00 3F FF FF FF 00 00 FF 00' + '07 FF FF FF 00 00 FF 00 00 FF FF FF 00 00 FF 00' + '00 FF FF FF 00 00 FE 00 00 1F FF FF 00 00 FE 00' + '00 03 FF FF 00 00 FE 00 00 03 FF FF 00 00 FE 00' + '00 00 7F FF 00 00 FE 00 00 00 03 FF 00 00 FE 00' + '00 00 03 FF 00 00 F8 00 00 00 00 7F 00 00 F8 00' + '00 00 00 0F 00 00 F8 00 00 00 00 0F 00 00 F8 00' + '00 00 00 0F 00 00 F8 00 00 00 00 07 00 00 F8 00' + '00 00 00 07 00 00 F0 00 00 00 00 07 00 00 F0 00' + '00 00 00 07 00 00 F0 00 00 00 00 07 00 00 F0 00' + '00 00 00 07 00 00 F0 00 00 00 00 07 00 00 F0 00' + '00 00 00 07 00 00 C0 00 00 00 00 01 00 00 C0 00' + '00 00 00 01 00 00 C0 00 00 00 00 01 00 00 C0 00' + '00 00 00 01 00 00 C0 00 00 00 00 01 00 00 C0 00' + '00 00 00 01 00 00 80 00 00 00 00 01 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 01 00 00 80 00' + '00 00 00 01 00 00 80 00 00 00 00 01 00 00 80 00' + '00 00 00 07 00 00 F0 00 60 00 03 E7 00 00 F0 00' + '60 00 03 E7 00 00 FF C1 FF 80 03 FF 00 00 FF FF' + 'FF F8 0F FF 00 00 FF FF FF F8 0F FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 20 00 00 00' + '00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 C5' + 'BC FF D0 BC BF FF BF B8 BF FF CF C7 CF A5 DF D8' + 'DF 54 F0 EF F0 0F 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 98' + '8F FF E0 84 6F FF D0 84 6F FF BF 98 90 FF B0 B0' + 'B0 FF C0 C0 C0 B7 DF D7 DF 66 EF E8 EF 1E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 84' + '6F FF F0 BF B0 FF FF DF D0 FF EF 97 80 FF DF 78' + '5F FF BF 90 80 FF B0 AF B0 FF C0 BF C0 C9 D0 D0' + 'D0 78 EF E7 EF 2D 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 F0 C4 BC FF EF 97' + '7F FF EF 9F 8F FF FF FC FF FF FF FC FF FF FF E7' + 'E0 FF F0 A7 8F FF D0 77 5F FF BF 88 7F FF B0 AF' + 'B0 FF BF B8 BF DB D0 CF D0 8A E0 E0 E0 3C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 EF BF B0 FF FF CD' + 'A0 FF EF 97 80 FF FF FC FF FF FF FC FF FF FF F7' + 'FF FF FF F1 F0 FF F0 DF DF FF EF AD 9F FF DF 77' + '5F FF C0 84 70 FF B0 A7 A0 FF BF B7 BF ED CF C8' + 'CF 9C E0 E0 E0 4B 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 EF A7 90 FF FF D4' + 'A0 FF EF 8F 6F FF FF FC FF FF FF FC FF FF FF F7' + 'FF FF FF F1 F0 FF FF EF F0 FF F0 EF F0 FF F0 DF' + 'E0 FF EF AD 9F FF DF 77 50 FF C0 78 60 FF B0 9F' + '9F FF BF B7 BF FE CF C7 CF AE DF D8 DF 5D 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 EF 9A 80 FF FF E4' + 'B0 FF F0 9F 70 FF FF F1 F0 FF FF F7 FF FF FF F7' + 'FF FF FF F1 F0 FF F0 EF F0 FF F0 EF F0 FF F0 E7' + 'EF FF F0 E2 E0 FF F0 E2 E0 FF E0 AF A0 FF DF 77' + '5F FF CF 6F 50 FF B0 90 8F FF B0 B0 B0 FF C0 C0' + 'C0 C0 DF D7 DF 6F EF E8 EF 26 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 F0 C4 BC FF F0 B8 A0 FF FF DE' + 'A0 FF F0 AC 80 FF FF C5 A0 FF FF C0 80 FF FF DF' + 'CF FF FF F1 F0 FF F0 EF F0 FF F0 EF F0 FF F0 E7' + 'EF FF F0 E2 E0 FF F0 E2 E0 FF EF DF E0 FF EF DF' + 'E0 FF E0 B7 B0 FF DF 78 5F FF CF 67 4F FF BF 87' + '7F FF B0 AF B0 FF C0 BF C0 D2 D0 D0 D0 81 EF E7' + 'EF 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 F0 C7 BF FF FF CC B0 FF FF DE' + 'A0 FF F0 B0 80 FF FF BF 9F FF FF B1 5F FF FF A5' + '4F FF FF 9F 50 FF F0 C7 A0 FF F0 EF F0 FF F0 E7' + 'EF FF F0 E2 E0 FF EF DF E0 FF EF DF E0 FF EF DF' + 'E0 FF E0 D7 DF FF E0 D0 D0 FF DF BF BF FF E0 84' + '6F FF D0 5D 3F FF BF 7F 70 FF B0 A7 A0 FF BF B8' + 'BF E4 D0 D0 D0 93 F0 EF F0 2C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 EF AD 9F FF FF E6 BF FF FF E4' + 'B0 FF FF C0 90 FF F0 B7 90 FF FF C7 7F FF FF B1' + '5F FF FF A5 4F FF F0 97 40 FF F0 90 3F FF F0 AC' + '80 FF F0 D4 CF FF EF DF E0 FF EF DF E0 FF E0 D7' + 'DF FF E0 D7 DF FF E0 D0 D0 FF DF CF D0 FF DF CF' + 'D0 FF DF B7 B0 FF D0 88 70 FF D0 5D 3F FF BF 77' + '60 FF BF AF AF FF DF D8 DF BA 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 F0 A8 90 FF FF E8 C0 FF FF E4' + 'B0 FF FF CC 9F FF F0 A7 80 FF FF CC 80 FF FF B8' + '60 FF FF B1 5F FF FF A5 4F FF F0 97 40 FF EF 80' + '30 FF EF 70 20 FF E0 90 60 FF E0 B8 AF FF E0 D7' + 'DF FF E0 D0 D0 FF E0 CF D0 FF DF CF D0 FF DF CF' + 'D0 FF DF C7 CF FF D0 C0 C0 FF D0 B7 BF FF D0 6F' + '50 FF BF 7F 70 FF CF C8 CF DD F0 F0 F0 2F 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 F4 C5 BC FF F0 C0 AF FF FF E6 BF FF FF E4' + 'B0 FF FF E4 B0 FF F0 A7 80 FF FF DE A0 FF FF C0' + '6F FF FF B8 60 FF FF B1 5F FF FF A5 4F FF F0 97' + '40 FF EF 80 30 FF EF 70 20 FF DF 67 1F FF DF 70' + '3F FF DF A0 8F FF E0 CF D0 FF DF CF D0 FF DF CF' + 'D0 FF DF C7 CF FF D0 C0 C0 FF D0 BF C0 FF D0 9F' + '90 FF C0 6F 50 FF C0 C0 C0 F9 F0 EF F0 46 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 F0 CD C0 FF FF D7 BF FF FF E8 C0 FF FF E6' + 'BF FF FF E4 B0 FF EF 8F 70 FF FF E4 B0 FF FF CC' + '80 FF FF C0 6F FF FF B8 60 FF FF B1 5F FF FF A5' + '4F FF F0 97 40 FF EF 80 30 FF E0 70 20 FF DF 67' + '1F FF D0 58 1F FF D0 57 1F FF D0 84 6F FF DF BF' + 'BF FF DF C7 CF FF D0 C0 C0 FF D0 BF C0 FF D0 B0' + 'B0 FF D0 5D 3F FF BF B7 BF FF EF E8 EF 60 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 EF B4 A0 FF FF EE D0 FF FF E8 C0 FF FF E8' + 'C0 FF FF E6 BF FF F0 A7 80 FF FF E8 C0 FF FF CC' + '80 FF FF CC 80 FF FF C0 6F FF FF B8 60 FF FF B0' + '50 FF FF A5 4F FF F0 97 40 FF EF 80 2F FF E0 70' + '20 FF DF 67 1F FF D0 58 1F FF CF 4F 10 FF CF 45' + '10 FF CF 6F 4F FF D0 A7 9F FF D0 BF C0 FF D0 BC' + 'BF FF D0 5D 3F FF B0 B0 B0 FF E0 DF E0 7C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 F0 B4 A0 FF FF F3 DF FF FF EF CF FF FF E8' + 'C0 FF FF E8 C0 FF F0 A7 8F FF FF D7 BF FF FF D4' + '90 FF FF CC 80 FF FF CC 80 FF FF C0 6F FF FF B8' + '60 FF FF B1 5F FF FF A5 4F FF FF 97 3F FF EF 80' + '2F FF E0 70 20 FF DF 67 1F FF D0 58 1F FF CF 4F' + '10 FF CF 45 10 FF C0 38 00 FF B0 4F 30 FF C0 84' + '70 FF D0 77 5F FF BF 97 8F FF D0 D0 D0 98 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 F4 C6' + 'BC FF FF C8 BF FF FF F0 D0 FF FF EE D0 FF FF EF' + 'CF FF FF E8 C0 FF F0 B8 9F FF F0 B4 A0 FF FF D7' + 'B0 FF FF DF AF FF FF CF 8F FF FF C7 7F FF FF C0' + '6F FF FF B8 60 FF FF B1 5F FF FF AF 4F FF FF A6' + '40 FF FF 94 30 FF EF 80 2F FF DF 67 1F FF D0 58' + '1F FF CF 4F 10 FF CF 45 10 FF AF 27 00 FF B0 3F' + '10 FF C0 47 1F FF C0 84 70 FF CF C8 CF B3 F0 F0' + 'F0 0B 00 00 00 00 00 00 00 00 00 00 00 00 F0 CF' + 'CF FF FF DF CF FF FF F3 DF FF FF F0 D0 FF FF EE' + 'D0 FF FF EF CF FF FF E7 C0 FF FF C5 A0 FF F0 A7' + '80 FF EF 9A 80 FF FF BF A0 FF FF D4 A0 FF FF D4' + '90 FF FF C0 6F FF FF B8 60 FF FF B1 5F FF FF AF' + '4F FF FF A6 40 FF FF A6 40 FF FF 94 30 FF F0 78' + '20 FF DF 5F 1F FF CF 4F 10 FF AF 27 00 FF C0 4F' + '1F FF C0 47 1F FF C0 6F 5F FF C0 C0 C0 CF F0 EF' + 'F0 23 00 00 00 00 00 00 00 00 00 00 00 00 F0 BF' + 'B0 FF FF F6 E0 FF FF F3 DF FF FF F3 DF FF FF F0' + 'D0 FF FF EE D0 FF FF EF CF FF FF E8 C0 FF FF E8' + 'C0 FF FF D8 B0 FF FF C0 90 FF EF 8F 6F FF EF 9A' + '80 FF FF C5 A0 FF FF CF 8F FF FF B8 60 FF FF B0' + '50 FF FF AF 4F FF FF A6 40 FF FF A6 40 FF FF 9F' + '30 FF FF 8F 2F FF DF 5F 1F FF B0 37 10 FF CF 57' + '1F FF C0 4F 1F FF CF 60 40 FF BF B7 BF EB EF E8' + 'EF 3B 00 00 00 00 00 00 00 00 00 00 00 00 F0 BA' + 'AF FF FF FA F0 FF FF F6 E0 FF FF F3 DF FF FF F3' + 'DF FF FF F0 D0 FF FF EE D0 FF FF EF CF FF FF E8' + 'C0 FF FF E8 C0 FF FF E6 BF FF FF E4 B0 FF FF CD' + 'A0 FF EF 8F 6F FF FF CC B0 FF FF CC 80 FF FF B8' + '60 FF FF B0 50 FF FF AF 4F FF FF A6 40 FF FF A6' + '40 FF FF 9F 30 FF F0 78 2F FF DF 60 2F FF CF 60' + '20 FF CF 57 1F FF D0 54 2F FF B0 B0 B0 FF E0 DF' + 'E0 52 00 00 00 00 00 00 00 00 F4 C6 BC FF FF D0' + 'C0 FF FF FA F0 FF FF FA F0 FF FF F6 E0 FF FF F3' + 'DF FF FF F3 DF FF FF F0 D0 FF FF EE D0 FF FF EF' + 'CF FF FF E8 C0 FF FF E8 C0 FF FF E6 BF FF FF E4' + 'B0 FF FF CD A0 FF E0 8F 70 FF FF D8 B0 FF FF CC' + '80 FF FF B8 60 FF FF B0 50 FF FF AF 4F FF FF A6' + '40 FF FF A6 40 FF F0 6F 2F FF FF 9F 4F FF F0 97' + '40 FF CF 60 20 FF D0 54 2F FF BF 97 8F FF D0 D0' + 'D0 6E 00 00 00 00 00 00 00 00 F0 D4 CF FF FF E4' + 'DF FF FF FA F0 FF FF FA F0 FF FF FA F0 FF FF F6' + 'E0 FF FF F3 DF FF FF F3 DF FF FF F0 D0 FF FF EF' + 'CF FF FF EF CF FF FF E8 C0 FF FF E8 C0 FF FF E6' + 'BF FF FF E4 B0 FF FF C0 90 FF E0 82 60 FF EF 9A' + '80 FF FF B7 8F FF FF C0 8F FF FF C0 70 FF FF B0' + '50 FF FF A6 40 FF E0 60 2F FF FF B8 60 FF FF B8' + '60 FF EF 87 3F FF D0 5F 2F FF C0 84 70 FF CF C7' + 'CF 8A F0 F0 F0 16 00 00 00 00 F0 C7 BF FF FF F1' + 'F0 FF FF FC FF FF FF FA F0 FF FF FA F0 FF FF FA' + 'F0 FF FF F6 E0 FF FF F3 DF FF FF F3 DF FF FF F0' + 'D0 FF FF EF CF FF FF EF CF FF FF E8 C0 FF FF E8' + 'C0 FF FF E6 BF FF FF E4 B0 FF FF E4 B0 FF FF CC' + '9F FF F0 AC 7F FF E0 82 60 FF E0 82 60 FF F0 9F' + '70 FF FF B0 7F FF EF 88 60 FF FF CC 80 FF FF C0' + '6F FF FF B1 5F FF DF 70 30 FF CF 6F 50 FF C0 BF' + 'C0 A5 00 00 00 00 00 00 00 00 F0 C0 B0 FF FF FC' + 'FF FF FF FC FF FF FF FC FF FF FF FA F0 FF FF FA' + 'F0 FF FF FA F0 FF FF F6 E0 FF FF F3 DF FF FF F3' + 'DF FF FF F0 D0 FF FF EF CF FF FF EF CF FF FF E8' + 'C0 FF FF E8 BF FF FF E6 BF FF FF E4 B0 FF FF E4' + 'B0 FF FF E4 B0 FF FF DE A0 FF FF D4 A0 FF F0 B0' + '7F FF EF 88 60 FF DF 6F 4F FF EF 88 60 FF F0 AC' + '80 FF FF C0 80 FF FF B7 6F FF D0 60 40 FF CF C7' + 'CF FF 00 00 00 00 00 00 00 00 FA D3 D0 FF F0 C7' + 'BF FF F0 BF B0 FF FF D4 CF FF FF E4 DF FF FF FA' + 'F0 FF FF FA F0 FF FF FA F0 FF FF F3 DF FF F0 AF' + '9F FF EF 9F 8F FF F0 AF 9F FF FF CC B0 FF FF DF' + 'BF FF FF E8 C0 FF FF E8 BF FF FF E6 BF FF FF E4' + 'B0 FF FF E4 B0 FF FF E4 B0 FF FF DE A0 FF FF DE' + 'A0 FF F0 AC 7F FF CF 97 8F FF E0 C7 C0 FF EF AD' + '9F FF E0 78 60 FF E0 70 4F FF DF 58 30 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 F0 BA AF 4D F2 C2 B8 FF F0 C1 B8 FF F0 B4' + 'A0 FF F0 BA AF FF FF D0 C0 FF F0 B4 A0 FF F0 CD' + 'C0 FF 00 00 00 00 00 00 00 00 F0 CD C0 FF EF B4' + 'A0 FF EF 9A 80 FF F0 B4 A0 FF FF C5 A0 FF FF E6' + 'BF FF FF E4 B0 FF FF E4 B0 FF FF E4 B0 FF FF DE' + 'A0 FF F0 9F 70 FF C0 A7 A0 FF 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 F0 CD C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 F0 BA AF B7 F0 BA AF 79 EF B9 AE B9 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 F0 BA AF FF EF 9A' + '80 FF EF 9A 80 FF F0 B7 90 FF FF CD A0 FF FF E4' + 'B0 FF E0 82 60 FF D0 CF D0 FF 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF D4 CF FF EF A7 90 FF E0 8F' + '70 FF E0 8F 70 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF FF FF FC 0F' + 'FF FF FC 03 FF FF FC 00 FF FF F8 00 3F FF F8 00' + '0F FF F8 00 03 FF F8 00 00 7F F0 00 00 1F F0 00' + '00 07 F0 00 00 07 F0 00 00 03 E0 00 00 03 E0 00' + '00 03 E0 00 00 03 E0 00 00 03 C0 00 00 01 C0 00' + '00 01 C0 00 00 01 C0 00 00 01 80 00 00 01 80 00' + '00 00 80 00 00 01 80 00 00 01 80 00 00 03 E0 18' + '00 7B FE 3F 80 7F FF FF F0 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 D7 C8 BE 01 DD C6 BD 57 CA C1' + 'BF 65 D8 D1 D0 27 DD D7 D1 03 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 D7 B8 AC 03 DF A0 92 D1 E0 AA' + '9B FD CA A2 98 E7 CC C3 C4 98 D6 D1 CF 38 DC D4' + 'D0 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 E4 C3 B7 2A F2 AE 94 F8 FC E7' + 'E4 FF FA DF DB FF DD AC A0 FE C9 9F 97 ED C6 BB' + 'B8 AC D2 CC CA 49 D7 D1 CB 08 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 E6 B1 9D 31 F9 C4 99 FD FC E5' + 'E0 FF FF F6 FB FF F7 ED ED FF EE D6 D4 FF DF AA' + '98 FF C8 96 8C F4 C5 B0 B0 BF CD C7 C5 59 DD D5' + 'D3 15 DE D7 D5 01 00 00 00 00 00 00 00 00 00 00' + '00 00 DB C8 BE 02 EA C5 B8 BF FA CF 9C FF FC C1' + '99 FF FF C8 9B FF F3 DD CD FF F0 E6 EA FF EF E0' + 'DF FF EA D0 CF FF DA A3 98 FF CC 8F 83 F8 C4 A8' + 'A2 D0 D3 CB CC 78 DC D8 D2 19 00 00 00 00 00 00' + '00 00 DB C0 B3 03 ED BC A8 D1 FF DD AC FF F7 B8' + '8A FF FF B4 62 FF F7 A2 52 FF EF A1 6B FF EA BC' + 'A8 FF E3 D4 D8 FF E0 D0 D1 FF DF C4 C3 FF D1 9F' + '94 FF C6 85 72 FB D6 CA CB A6 DC D6 D0 05 00 00' + '00 00 E6 C8 BD 2A F6 CD B7 F8 FF E4 B6 FF F5 B6' + '8A FF FF C7 7A FF FF B2 5D FF F6 99 44 FF EB 7B' + '2F FF DE 7A 45 FF D9 9C 85 FF DE C1 C1 FF D3 C0' + 'C2 FF CE 9D 91 FF CA B6 B3 DA E5 E0 DF 10 00 00' + '00 00 E6 BE AD 31 FC E3 C8 FD FF E8 C0 FF F6 BB' + '99 FF FF D1 8F FF FF C3 73 FF FF B2 59 FF F7 99' + '44 FF E7 77 27 FF D7 5F 1F FF D0 59 28 FF C9 7B' + '60 FF C9 94 88 FF C2 A4 9D E7 D7 D3 D1 19 DB C9' + 'C0 03 ED CB C2 BF FF EB D2 FF FF ED CC FF F8 CE' + 'AE FF F9 C2 9B FF FE C7 92 FF FF C5 7A FF FF B3' + '5E FF FD A4 44 FF F3 8B 32 FF DE 65 1E FF C9 45' + '0E FF B8 47 1D FF C2 81 70 F1 E1 DE DC 30 DC C6' + 'BA 04 EE CB BE D1 FF F4 E0 FF FF F1 D6 FF FF EC' + 'CC FF FE E0 BA FF FD CD A3 FF F7 B5 8E FF FD C3' + '8C FF FF B5 59 FF FF AA 46 FF FD 9C 35 FF E2 69' + '24 FF CB 55 1F FF C9 6B 4E FB DC D6 D7 56 E6 CB' + 'C2 3A FA DA D1 F8 FF F9 ED FF FF F4 E0 FF FF F1' + 'D6 FF FF ED CC FF FF E8 C1 FF FF DF B2 FF F3 B3' + '8B FF F8 B5 7E FF FF B5 68 FF FF AA 49 FF F0 7F' + '39 FF F0 96 46 FF CF 68 3F FE D0 C4 C2 7B E7 C8' + 'BD 40 FC EC EB FD FF FA F6 FF FF F9 ED FF FF F4' + 'E0 FF FF F0 D5 FF FF ED CB FF FF E8 C1 FF FE E0' + 'B3 FF FC D0 A1 FF F1 B2 83 FF F2 A7 73 FF ED 8A' + '5E FF F8 B3 71 FF E8 8D 51 FF CB B4 B0 AB E6 CD' + 'C5 25 EB C9 C1 98 F7 D0 C8 EE F8 DC D0 FC FC E3' + 'D4 FD F0 C5 B4 E8 EC C2 B1 A7 F7 CD B1 FA F9 D1' + 'AF FC FF E1 B3 FF FF E2 AD FF FB D0 97 FF D4 A3' + '92 EB DE B3 A3 94 E2 9B 80 A5 DD AC 9A 3F 00 00' + '00 00 D9 C5 BA 02 DE C6 BB 17 E0 C1 B6 2A EA BF' + 'B3 5D DF C4 B8 25 D9 CA BF 05 DD C1 B2 1A E1 C0' + 'B3 30 E8 B9 A5 93 F4 C3 A7 E8 EF B7 8E FA D4 B5' + 'A8 8B D0 C9 C1 01 D9 CA BF 05 D9 CA BF 05 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 DF CA BF 15 D8 B5 A2 1A D6 BA' + 'A9 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C1 FF' + '00 00 C0 7F 00 00 C0 1F 00 00 C0 03 00 00 80 01' + '00 00 80 00 00 00 80 00 00 00 80 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 FF C7 00 00 FF FF 00 00 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 7F 7F 7F 00 00 99' + '99 00 66 CC CC 00 99 CC FF 00 99 FF FF 00 F8 F8' + 'F8 00 00 00 00 00 E2 69 24 00 E7 77 27 00 EB 7B' + '2F 00 F0 7F 39 00 C7 6B 4E 00 DE 7A 45 00 C9 7B' + '60 00 F3 8B 32 00 FD 9C 35 00 BE 80 70 00 BF 91' + '7F 00 F0 96 46 00 F6 99 44 00 F7 99 44 00 E8 8D' + '51 00 ED 8A 5E 00 FD A4 44 00 FF AA 46 00 FF AA' + '49 00 F7 A2 52 00 FF B2 59 00 FF B5 59 00 FF B2' + '5D 00 FF B3 5E 00 C4 84 72 00 EF A1 6B 00 FF B4' + '62 00 FF B5 68 00 F2 A7 73 00 F8 B3 71 00 F8 B5' + '7E 00 FF C3 73 00 FF C5 7A 00 FF C7 7A 00 96 8A' + '85 00 96 90 8E 00 99 91 8E 00 92 91 90 00 96 95' + '94 00 9F 97 94 00 9A 98 97 00 3C 17 95 00 00 00' + '38 00 A8 44 F9 77 21 00 00 00 B8 0C 38 00 00 00' + '38 00 30 7E 0D 01 14 17 95 00 B1 A2 9F 00 5C 19' + '95 00 00 40 0D 01 68 19 95 00 77 82 F5 77 98 7F' + 'F5 77 3A 8A F5 77 00 04 00 00 C4 A2 AF 00 10 00' + '00 00 10 00 00 00 C9 94 88 00 CD 9A 8E 00 D9 9C' + '85 00 C3 9C 95 00 C2 9E 95 00 CE 9D 91 00 D1 9F' + '94 00 CD A0 90 00 C6 AA 9F 00 DA A3 98 00 DF AA' + '98 00 DF A9 9A 00 DC AB 9F 00 EC B5 8D 00 F1 B2' + '83 00 F3 B3 8B 00 F5 B6 8A 00 F7 B5 8E 00 F7 B8' + '8A 00 EE AC 93 00 F6 BB 99 00 CF B3 A9 00 D9 B0' + 'A0 00 D1 B7 B1 00 D9 BD B2 00 E9 BC A3 00 E5 BE' + 'AF 00 EA BC A8 00 FD C3 8C 00 FF D1 8F 00 FE C7' + '92 00 F8 C3 98 00 F9 C2 9B 00 FC C1 99 00 FF C8' + '9B 00 FA CF 9C 00 FB D0 97 00 FD CD A3 00 F8 CE' + 'AE 00 FC D0 A1 00 F7 D0 AE 00 FF DD AC 00 F4 CB' + 'B0 00 F2 CA B5 00 FF DF B2 00 FF E2 AD 00 FE E0' + 'B3 00 FF E1 B3 00 FF E4 B6 00 FE E0 BA 00 D3 C0' + 'C2 00 A8 01 38 00 10 44 0D 01 40 00 00 00 00 00' + '00 00 A8 01 38 00 38 44 0D 01 38 44 0D 01 E0 D0' + 'D1 00 EE D6 D4 00 E3 D4 D8 00 FA DF DB 00 FB E2' + 'C7 00 FF E8 C0 00 FF E8 C1 00 FF ED CB 00 FF EC' + 'CC 00 08 44 0D 01 08 44 0D 01 FB E2 D3 00 FF EB' + 'D2 00 FF F0 D5 00 FF F1 D6 00 FC E5 E0 00 FC E7' + 'E4 00 F0 E6 EA 00 00 40 0D 01 A4 18 95 00 E5 3A' + 'F8 77 06 00 00 00 08 44 0D 01 00 00 38 00 00 40' + '0D 01 00 00 00 00 78 19 95 00 CA 8C F5 77 78 01' + '38 00 BE 8E F5 77 08 06 38 00 37 90 F5 77 08 40' + '0D 01 08 40 0D 01 40 00 00 00 40 00 00 00 D0 BB' + 'BB 00 E0 B2 A5 00 EE BD A2 00 E3 B4 AA 00 E4 BB' + 'AF 00 F1 B6 A7 00 F6 BE A2 00 F0 BA AB 00 E5 BE' + 'B3 00 EC BC B0 00 00 40 0D 01 00 40 0D 01 F4 C4' + '97 00 78 01 38 00 08 40 0D 01 E0 07 0D 01 E8 07' + '0D 01 78 01 38 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 F5 C8 AA 00 00 40 0D 01 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E9 C2' + 'B7 00 08 04 00 00 87 00 00 00 08 04 00 00 08 01' + '00 00 00 00 00 00 00 00 00 00 00 00 01 01 00 00' + '38 00 BC 18 95 00 C0 18 95 00 B0 19 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 81 E9' + '49 00 00 00 38 00 00 00 00 00 08 40 0D 01 08 40' + '0D 01 A4 1A 95 00 40 00 00 00 40 00 00 00 B8 10' + 'E9 77 FF FF FF FF C9 F1 E7 77 16 EA 4B 00 F8 00' + '00 00 B4 1A 95 00 DC E3 49 00 E0 A3 4E 00 FF FF' + 'FF FF 10 00 00 00 10 DA 4B 00 08 40 0D 01 71 CC' + '43 00 08 40 0D 01 30 7E 0D 01 A4 1A 95 00 C4 A2' + 'AF 00 C4 F5 AF 00 02 00 00 00 30 7E 0D 01 0F 02' + '00 00 48 40 0D 01 10 00 00 00 00 00 00 00 20 00' + '00 00 08 40 0D 01 40 00 00 00 10 00 00 00 00 01' + '00 00 00 04 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 10 00 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 07 07 07 07 07 07 07' + '07 07 07 07 07 07 00 00 02 02 02 02 02 02 02 02' + '02 02 02 02 07 07 00 00 02 06 04 05 04 05 04 04' + '04 04 03 02 07 07 00 02 06 05 05 04 05 04 05 04' + '04 04 03 07 02 07 00 02 06 05 05 05 05 05 04 05' + '04 04 02 07 02 07 02 06 05 05 05 05 04 05 05 04' + '05 03 07 03 03 07 02 06 05 05 05 05 05 05 04 05' + '04 03 07 03 03 07 02 02 02 02 02 02 02 02 02 02' + '02 02 03 05 03 07 00 02 06 05 05 05 05 05 05 05' + '05 05 05 05 03 07 00 02 06 05 05 05 05 05 05 05' + '06 06 06 06 03 07 00 02 06 05 05 05 05 05 06 02' + '02 02 02 02 02 00 00 00 02 06 06 06 06 06 02 00' + '00 00 00 00 00 00 00 00 00 02 02 02 02 02 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF 00 00 FF FF 00 00 E0 00' + '00 00 C0 00 00 00 C0 00 00 00 80 00 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 80 00 00 00 80 01 00 00 C0 7F 00 00 E0 FF' + '00 00 FF FF 00 00' +} */ + +/* BINRES floppy.ico */ +5 ICON floppy.ico +/* { + '00 00 01 00 09 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 96 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 3E 09 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 A6 0E 00 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 CE 0F 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 B6 12 00 00 30 30 00 00 01 00 04 00 68 06' + '00 00 5E 21 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 C6 27 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 6E 4D 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 16 5E 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 01 01 01 00 02 02 02 00 04 04 04 00 05 05' + '05 00 07 07 07 00 09 09 09 00 0A 0A 0A 00 0C 0C' + '0C 00 0D 0D 0D 00 10 10 10 00 12 12 12 00 13 13' + '13 00 15 15 15 00 16 16 16 00 17 17 17 00 18 18' + '18 00 19 19 19 00 1B 1B 1B 00 1C 1C 1C 00 1E 1E' + '1E 00 1F 1F 1F 00 20 20 20 00 21 21 21 00 23 23' + '23 00 24 24 24 00 25 25 25 00 26 26 26 00 27 27' + '27 00 28 28 24 00 2A 2A 25 00 28 28 28 00 2A 2A' + '2A 00 2B 2B 2B 00 2C 2C 2C 00 2E 2E 2E 00 32 32' + '32 00 33 33 33 00 34 34 34 00 35 35 35 00 37 37' + '37 00 3B 3B 3B 00 3C 3C 3C 00 3D 3D 3D 00 3F 3F' + '3F 00 40 40 40 00 44 44 44 00 45 45 45 00 46 46' + '46 00 47 47 47 00 48 48 48 00 49 49 49 00 4B 4B' + '4B 00 4C 4C 4C 00 4E 4E 4E 00 50 50 50 00 52 52' + '52 00 57 57 57 00 59 59 59 00 5E 5E 5E 00 61 61' + '61 00 64 64 64 00 65 65 65 00 6A 6A 6A 00 7F 60' + '60 00 71 71 71 00 77 77 77 00 79 79 79 00 7F 7F' + '7F 00 D5 40 40 00 00 C0 00 00 00 FF 00 00 87 80' + '7D 00 8B 86 84 00 8A 8A 8A 00 8C 8C 8C 00 8D 8D' + '8D 00 8E 8E 8E 00 97 97 97 00 99 99 99 00 9A 9A' + '9A 00 9E 9E 9E 00 A3 A3 9E 00 A4 A4 A4 00 A7 A7' + 'A7 00 AA AA AA 00 AB AB AB 00 AD A8 AB 00 AE AE' + 'AE 00 AF AF AF 00 B0 B0 B0 00 B2 B2 B2 00 B5 B5' + 'B5 00 B6 B6 B6 00 B7 B7 B7 00 BB BB BB 00 BC BC' + 'BC 00 BD BD BD 00 BF BF BF 00 EA 80 80 00 CA A8' + '94 00 CC AF 9D 00 E9 B6 99 00 E9 B8 9C 00 CE B6' + 'A6 00 D0 B3 A3 00 EB BE A5 00 D2 C3 B9 00 EC C0' + 'A7 00 EF CC B8 00 C2 C2 C2 00 C4 C4 C4 00 C5 C5' + 'C5 00 C6 C6 C6 00 C8 C9 C9 00 C9 C9 C9 00 CA CA' + 'CA 00 CB CB CB 00 CC CC CC 00 CD CD CD 00 CF CF' + 'CF 00 D5 CB C4 00 D0 D0 D0 00 D1 D1 D1 00 D2 D2' + 'D2 00 D3 D3 D3 00 D4 D4 D4 00 D5 D5 D5 00 D6 D6' + 'D6 00 D7 D7 D7 00 D8 D8 D8 00 D9 D9 D9 00 DA DA' + 'D8 00 DB DB DB 00 DC DC DC 00 DD DD DD 00 DE DE' + 'DE 00 DF DF DF 00 F1 D2 C2 00 F2 D6 C7 00 F4 DD' + 'D0 00 E0 E0 E0 00 E1 E1 E1 00 E2 E2 E2 00 E3 E3' + 'E3 00 E4 E4 E4 00 E5 E5 E5 00 E6 E6 E6 00 E7 E7' + 'E7 00 E8 E8 E8 00 E9 E9 E9 00 EA EA EA 00 EB EB' + 'EB 00 EC EC EC 00 ED ED ED 00 F0 F0 F0 00 F2 F2' + 'F2 00 F3 F3 F3 00 F9 F9 F9 00 FA FA FA 00 FF FF' + 'FF 00 00 00 00 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 56 00' + '00 00 00 00 00 00 03 00 00 00 5E 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 08 6C' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 66 6C 6F 70 70 79 2E 69 63' + '6F 00 1A 93 4B 00 14 1A 95 00 1F 3B D4 77 15 00' + '00 00 A8 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 B0 6C' + '38 00 96 00 00 00 00 00 00 00 C9 F1 E7 77 96 00' + '00 00 A4 1A 95 00 09 00 00 00 00 00 00 00 96 00' + '00 00 96 00 00 00 09 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 B0 6C' + '38 00 96 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 2A 2A 2A 2A 40 40 40 40 40 40 40 40 40 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 4B 4B 4B 4B A1 A1 A1 A1 A1 A1 A1 A1 A1 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1D 00 4B 08 45 45 45 45 45 45 45 45 45 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1E A1 A1 08 63 63 63 63 63 63 63 63 63 00 A1' + 'A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1' + 'A1 03 08 0A 10 9A 94 94 94 94 94 94 94 94 00 A1' + 'A1 17 22 22 21 21 21 21 21 21 21 20 20 20 20 20' + '20 08 08 10 0F 99 94 4F 4F 4F 4F 4F 4F 4F A1 01' + '4A 98 95 95 7E 46 94 95 90 82 7C 77 77 77 72 55' + '23 A1 A1 15 10 97 93 95 95 97 97 98 98 99 A1 11' + '57 98 95 95 47 47 46 89 7F 7C 75 77 77 77 77 2D' + '23 A1 A1 0D 0C 96 94 4F 4F 4F 4F 4F 4F 4F A1 1F' + '7B 98 98 95 95 47 5C 5D 29 29 29 29 29 29 29 5D' + '5D A1 A1 07 09 95 94 90 90 91 91 93 93 94 A1 1F' + '7B 95 98 95 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1' + 'A1 19 15 05 07 92 94 4F 4F 4F 4F 4F 4F 4F A1 1C' + '7C 97 98 98 54 56 58 59 59 59 59 56 56 56 56 56' + '56 24 08 A1 A1 92 92 94 94 96 96 97 97 98 A1 1B' + '7D 98 9A 96 95 91 8F 86 82 7C 7C 7A 7A 7A 7A 7A' + '7A 28 02 03 03 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 19' + '80 96 8E 8F 8D 89 89 89 8D 8D 8D 8D 8D 8D 8D 8D' + '8D 2C 09 0B 0E 17 1B 2A 2E 30 30 22 22 22 A1 19' + '88 83 6F 62 82 83 83 83 83 83 83 83 83 83 83 83' + '83 2E 18 12 16 21 27 2E 31 30 30 22 22 22 A1 04' + '6E 60 5B 56 5F 7F 7F 7E 7D 7F 81 82 81 7D 7D 7E' + '7F 34 35 23 25 2F 2E 34 34 2A 24 1A 13 0E 00 A1' + '53 78 70 62 73 7C 7A 7A 7A 7F 7F 7F 7F 7F 7A 7E' + '7A 38 39 27 2C 4B 4B 4B 4B 4B 4B 4B 4B 4B 00 A1' + '3A 7A 77 77 74 7D 7D 7E 7F 80 80 80 80 80 7F 85' + '91 3B 3B 3F 2E 4D A0 49 48 69 6C 66 66 66 00 A1' + '2D 7C 74 74 7E 7D 7D 7C 7C 7C 7C 7D 7C 7D 7C 7B' + '7A 3B 3B 3F 2E 4D A0 49 48 69 6C 66 66 66 00 A1' + '05 87 76 7D 7D 7A 7A 7A 7A 7D 7D 7D 7D 7D 7D 7D' + '7D 3E 3F 41 43 51 A0 38 36 8B 6D 67 66 66 00 A1' + 'A1 87 78 7D 7D 7A 7A 7A 7A 7A 78 7D 7D 7D 7D 7D' + '7D 2A 3F 41 43 55 A0 37 35 8C 8A 6A 66 66 00 A1' + 'A1 82 7E 7D 7D 7D 7D 7D 7D 7D 7D 7D 7D 7D 7D 7D' + '7D A1 A1 A1 A1 52 84 84 84 79 6B 68 65 64 00 A1' + 'A1 76 80 7D 7D 80 80 80 80 80 80 80 7D 7D 7D 76' + '73 6F 6E 61 7A 06 A1 00 00 00 00 00 00 00 00 A1' + 'A1 4E 86 86 88 88 87 87 87 87 87 87 87 87 87 87' + '87 94 94 86 71 A1 A1 00 00 00 00 00 00 00 00 00' + 'A1 42 7D 8E 88 88 88 8D 8D 8D 8D 8D 8D 8D 8D 8E' + '8E 94 94 83 5F A1 A1 00 00 00 00 00 00 00 00 00' + 'A1 27 61 93 93 94 98 98 98 98 98 98 98 98 98 94' + '94 94 93 7E 50 A1 A1 00 00 00 00 00 00 00 00 00' + 'A1 14 56 9A 94 99 98 9A 98 98 98 98 98 98 98 98' + '99 92 98 80 4A A1 A1 00 00 00 00 00 00 00 00 00' + '00 A1 4C 6F 5B 5B 98 9B 9B 9B 9B 9B 9B 9B 9B 9D' + '7F 5D 5E 77 3C A1 A1 00 00 00 00 00 00 00 00 00' + '00 A1 3D 87 86 91 9E 9E 9E 9E 9E 9E 9E 9E 9E 9F' + '9C 82 86 5A 26 A1 00 00 00 00 00 00 00 00 00 00' + '00 A1 A1 2B 33 32 32 32 32 32 32 32 32 32 32 32' + '32 33 33 02 A1 00 00 00 00 00 00 00 00 00 00 00' + '00 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1' + 'A1 A1 A1 A1 A1 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF E0 00 FF FF E0 00 FF FF E8 00 FF FF' + 'E0 00 80 00 00 00 80 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 80 00 00 00 80 00 00 00 80 00 00 00 80 00' + '00 00 80 00 00 00 80 00 00 7F 80 00 00 7F C0 00' + '00 7F C0 00 00 7F C0 00 00 7F E0 00 00 7F E0 00' + '00 FF E0 00 01 FF E0 00 01 FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 01 01 00 00 01 01' + '01 00 03 06 04 00 05 05 05 00 09 09 09 00 0A 0C' + '0C 00 08 0D 0F 00 13 13 13 00 15 15 15 00 16 16' + '15 00 17 17 17 00 18 18 18 00 19 19 19 00 1D 1D' + '1D 00 1E 1E 1E 00 31 0A 0B 00 1A 1E 20 00 35 19' + '35 00 21 21 21 00 29 23 23 00 30 2A 30 00 31 31' + '31 00 32 33 33 00 34 34 34 00 35 35 35 00 36 36' + '36 00 39 39 39 00 3A 3A 3B 00 3B 3B 3B 00 7A 00' + '00 00 4E 3E 3E 00 3F 41 42 00 44 44 44 00 46 46' + '46 00 4B 4B 4B 00 50 52 52 00 57 57 57 00 59 59' + '59 00 5C 5C 5C 00 5E 5E 5E 00 65 6A 68 00 69 69' + '69 00 6E 6E 6E 00 6F 6E 6E 00 77 6E 69 00 7E 69' + '69 00 72 72 72 00 75 75 75 00 79 73 79 00 79 79' + '79 00 7B 7B 7B 00 7F 7F 7F 00 83 00 00 00 88 70' + '70 00 00 FF 00 00 75 99 75 00 97 97 97 00 9B 9B' + '9B 00 A5 A5 A5 00 A6 A6 A6 00 A8 A2 A8 00 A8 A8' + 'A8 00 A9 A9 A9 00 AF AF AF 00 B8 AC B8 00 B2 B2' + 'B2 00 ED B7 97 00 C0 AE A4 00 DB B7 A2 00 DC B7' + 'A2 00 B7 E6 B7 00 FB C6 A8 00 F9 C7 AB 00 C0 C0' + 'C0 00 C1 C2 C2 00 C2 C2 C2 00 C3 C3 C3 00 C6 CD' + 'CD 00 C7 CE CE 00 C9 C9 C9 00 CA CA CA 00 C8 CF' + 'CF 00 CC CC CC 00 CE CE CE 00 D0 D0 D0 00 D1 D1' + 'D1 00 D2 D2 D2 00 D3 D3 D3 00 D4 D4 D4 00 D5 D5' + 'D5 00 D6 D6 D6 00 D7 D7 D7 00 DE D8 D3 00 D8 D8' + 'D8 00 D9 D9 D9 00 DA DA DA 00 DE DE DE 00 FF C9' + 'C9 00 FF D7 D7 00 FF E3 D0 00 DF E6 E6 00 E0 E0' + 'E0 00 E1 E1 E1 00 E2 E2 E2 00 E4 E4 E4 00 E5 E5' + 'E5 00 E6 E6 E6 00 E8 E3 E1 00 E8 E8 E8 00 E9 E9' + 'E9 00 EA EA EA 00 EB EB EB 00 ED ED ED 00 F3 F3' + 'F3 00 F4 F4 F4 00 F5 F5 F5 00 F6 F6 F6 00 FF F2' + 'FF 00 F9 F9 F9 00 FA FA FA 00 FB FB FB 00 FB FC' + 'FC 00 FC FC FC 00 FF FD FE 00 FE FE FE 00 FF FF' + 'FF 00 00 00 00 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8' + 'D8 00 D9 D9 D9 00 DA DA D8 00 DB DB DB 00 DC DC' + 'DC 00 DD DD DD 00 DE DE DE 00 DF DF DF 00 F1 D2' + 'C2 00 F2 D6 C7 00 F4 DD D0 00 E0 E0 E0 00 E1 E1' + 'E1 00 E2 E2 E2 00 E3 E3 E3 00 E4 E4 E4 00 E5 E5' + 'E5 00 E6 E6 E6 00 E7 E7 E7 00 E8 E8 E8 00 E9 E9' + 'E9 00 EA EA EA 00 EB EB EB 00 EC EC EC 00 ED ED' + 'ED 00 F0 F0 F0 00 F2 F2 F2 00 F3 F3 F3 00 F9 F9' + 'F9 00 FA FA FA 00 FF FF FF 00 00 00 00 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 77 00 EC FD 7F 56 00 00 00 00 00 00 00 03 00' + '00 00 5E 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 08 6C 0C 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 66' + '6C 6F 70 70 79 2E 69 63 6F 00 1A 93 4B 00 14 1A' + '95 00 1F 3B D4 77 15 00 00 00 A8 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 B0 6C 38 00 96 00 00 00 00 00' + '00 00 C9 F1 E7 77 96 00 00 00 A4 1A 95 00 09 00' + '00 00 00 00 00 00 96 00 00 00 96 00 00 00 09 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 B0 6C 38 00 96 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '06 14 36 2E 2E 2E 00 00 00 00 00 00 00 00 00 0A' + '29 10 35 1E 1E 1E 00 7F 7F 7F 7F 7F 7F 7F 7F 01' + '03 1F 63 62 62 62 7F 2C 3D 38 41 40 3E 3C 3F 0D' + '05 24 65 4E 4F 52 7F 7C 76 37 47 31 33 32 42 08' + '7F 23 6B 51 53 53 7F 7D 7D 12 15 19 19 18 19 13' + '7F 23 7D 66 68 69 7F 7E 72 7D 77 75 72 72 7E 28' + '7F 02 7F 0B 0C 04 7F 7B 3B 58 5B 5A 5C 5B 69 25' + '0F 16 1C 20 11 07 7F 5C 54 54 57 59 5A 5A 67 27' + '25 17 6C 44 46 45 7F 3A 57 58 55 55 56 57 66 26' + '2F 22 4B 2D 48 43 00 2A 61 55 55 55 56 57 67 1D' + '0E 21 7A 5D 64 49 00 1B 71 60 5E 5F 5F 5E 5E 6A' + '71 30 7F 00 00 00 00 04 72 6F 6D 6B 6A 6A 69 70' + '75 1A 00 00 00 00 00 7F 6E 50 77 75 73 74 78 54' + '79 09 00 00 00 00 00 7F 2B 4A 4D 4C 4C 4C 4C 4A' + '39 7F 00 00 00 00 00 00 7F 7F 7F 7F 7F 7F 7F 7F' + '7F 00 00 00 00 00 FF C0 00 00 FF 80 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 80 07 00 00 80 0F 00 00 80 0F 00 00 80 0F' + '00 00 C0 1F 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 04 00 00 00 00 00 80 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00' + '00 00 00 09 99 99 00 00 00 00 00 0F FF FF 0F FA' + '77 77 00 0F 88 88 0F F0 00 00 00 0F FF FF 0F F7' + '77 77 70 00 00 00 07 77 77 77 70 00 00 00 07 77' + '77 77 70 08 88 88 07 77 77 77 70 08 87 77 07 77' + '77 77 70 07 8F 77 07 77 77 77 77 70 00 00 08 77' + '77 77 77 70 00 00 00 77 77 77 77 70 00 00 00 77' + '77 77 77 70 00 00 00 00 00 00 00 00 00 00 FF 80' + '00 00 FF 80 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 07 00 00 80 07' + '00 00 80 07 00 00 80 0F 00 00 80 0F 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 04 00 00 00' + '00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 08 88 88 88 88 00 00 00 00 00 00 00 00 00 08' + '88 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '08 09 99 99 99 99 00 00 00 00 00 00 00 00 00 00' + '00 07 77 77 77 77 00 00 00 00 00 00 00 00 00 00' + '00 0F FF FF FF FF 00 00 00 00 00 00 00 00 00 00' + '00 0F F8 88 88 88 00 8F FF 7A FF F7 77 77 77 00' + '00 0F FF FF FF FF 00 7F FF AA A7 77 77 77 70 00' + '00 0F F8 88 88 88 00 7F FF FA 77 00 00 00 07 70' + '00 0F FF FF FF FF 00 7F FF 00 00 00 00 00 00 00' + '00 0F F8 88 88 88 00 7F FF 77 77 77 77 77 77 70' + '00 0F FF FF FF FF 00 7F FF 77 77 77 77 77 77 70' + '00 00 00 00 00 00 00 7F FF FF FF FF FF FF FF F0' + '00 00 00 88 80 00 00 77 77 77 77 77 77 77 77 78' + '00 00 08 88 80 00 00 77 77 77 77 77 77 77 77 78' + '80 08 88 80 00 00 00 77 77 77 77 77 77 77 77 78' + '80 08 88 88 88 88 00 87 77 77 77 77 77 77 77 78' + '88 88 F8 87 77 77 00 07 77 77 77 77 77 77 77 78' + '88 88 F8 87 77 77 00 07 77 77 77 77 77 77 77 78' + '88 88 F8 87 77 77 00 07 77 77 77 77 77 77 77 70' + '88 87 F8 8F 77 77 00 07 77 77 77 77 77 77 77 70' + '00 07 77 77 77 77 00 07 77 77 77 77 77 77 77 77' + '77 70 00 00 00 00 00 08 77 77 77 77 77 77 77 77' + '77 70 00 00 00 00 00 08 77 77 77 77 77 77 77 77' + '77 70 00 00 00 00 00 00 77 77 77 77 77 77 77 77' + '77 80 00 00 00 00 00 00 77 77 77 77 77 77 77 77' + '77 80 00 00 00 00 00 00 87 77 77 77 77 77 77 77' + '77 80 00 00 00 00 00 00 87 77 77 77 77 77 77 77' + '77 00 00 00 00 00 00 00 00 88 88 88 88 88 88 88' + '80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF E0 00 FF FF E0 00 FF FF' + 'E0 00 FF FF E8 00 E0 00 00 00 80 00 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 00 00 00 80 00 00 00 80 00' + '00 00 80 00 00 00 80 00 00 00 80 00 00 00 80 00' + '00 3F 80 00 00 7F C0 00 00 7F C0 00 00 7F C0 00' + '00 7F E0 00 00 7F E0 00 00 FF E0 00 00 FF E0 00' + '01 FF FF FF FF FF 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 01 01 01 00 02 02 02 00 03 03 03 00 04 04' + '04 00 05 05 05 00 06 06 06 00 07 07 07 00 08 08' + '08 00 09 09 09 00 0A 0A 0A 00 0B 0B 0B 00 0C 0C' + '0C 00 0D 0D 0D 00 0E 0E 0E 00 10 10 10 00 11 11' + '11 00 12 12 10 00 12 12 12 00 13 13 13 00 14 14' + '14 00 15 15 15 00 16 16 14 00 16 16 16 00 17 17' + '17 00 18 18 18 00 19 19 19 00 1B 1B 1B 00 1C 1C' + '1C 00 1E 1E 1E 00 1F 1F 1F 00 22 22 1F 00 20 20' + '20 00 21 21 21 00 22 22 22 00 23 23 23 00 24 24' + '24 00 25 25 25 00 26 26 26 00 27 27 27 00 28 28' + '24 00 2A 2A 25 00 2B 2B 26 00 28 28 28 00 29 29' + '29 00 2A 2A 2A 00 2B 2B 2B 00 2C 2C 2C 00 2E 2E' + '2E 00 2F 2F 2F 00 30 30 2C 00 30 30 30 00 32 32' + '32 00 33 33 33 00 36 36 30 00 34 34 34 00 35 35' + '35 00 36 36 36 00 37 37 37 00 39 39 39 00 3B 3B' + '3B 00 3C 3C 3C 00 3D 3D 3D 00 3F 3F 3F 00 40 40' + '40 00 41 41 41 00 42 42 42 00 43 43 43 00 44 44' + '44 00 45 45 45 00 46 46 46 00 47 47 47 00 48 48' + '48 00 49 49 49 00 4A 4A 4A 00 4B 4B 4B 00 4C 4C' + '4C 00 4E 4E 4E 00 4F 4F 4F 00 50 50 50 00 52 52' + '52 00 53 53 53 00 54 54 54 00 57 57 57 00 5B 58' + '57 00 59 59 59 00 5D 5D 5D 00 5E 5E 5E 00 5F 5F' + '5F 00 61 61 61 00 64 64 64 00 65 65 65 00 66 66' + '66 00 6D 6A 67 00 6A 6A 6A 00 7F 60 60 00 71 71' + '71 00 75 75 75 00 77 77 77 00 7B 77 75 00 79 79' + '79 00 7A 7A 7A 00 7E 7E 7E 00 7F 7F 7F 00 C0 00' + '00 00 83 7A 75 00 D5 40 40 00 00 C0 00 00 00 FF' + '00 00 87 80 7D 00 80 80 80 00 83 83 83 00 84 84' + '84 00 8B 86 84 00 8A 8A 8A 00 8C 8C 8C 00 8D 8D' + '8D 00 8E 8E 8E 00 90 90 90 00 93 93 93 00 97 97' + '97 00 99 99 99 00 9A 9A 9A 00 9E 9E 9E 00 9F 9F' + '9F 00 A3 A3 9E 00 A4 A4 A4 00 A6 A6 A6 00 A7 A7' + 'A7 00 A8 A8 A8 00 A9 A9 A9 00 AA AA AA 00 AB AB' + 'AB 00 AD A8 AB 00 AB AC AC 00 AD AD AD 00 AE AE' + 'AE 00 AF AF AF 00 B0 B0 B0 00 B1 B1 B1 00 B2 B2' + 'B2 00 B3 B3 B3 00 B5 B5 B5 00 B6 B6 B6 00 B7 B7' + 'B7 00 B8 B4 B6 00 B8 B6 B6 00 B8 B8 B8 00 BA BA' + 'BA 00 BB BB BB 00 BC BC BC 00 BD BD BD 00 BE BE' + 'BE 00 BF BF BF 00 EA 80 80 00 CA A8 94 00 CC AF' + '9D 00 E9 B6 99 00 E9 B8 9C 00 CE B6 A6 00 D0 B3' + 'A3 00 D0 BC B0 00 EA BB A0 00 EA BC A1 00 EB BE' + 'A5 00 D2 C3 B9 00 EC C0 A7 00 EC C2 AA 00 ED C5' + 'AE 00 ED C6 AF 00 EE C8 B3 00 EF CC B8 00 F0 CF' + 'BC 00 F0 D0 BE 00 C0 C0 C0 00 C1 C1 C1 00 C2 C2' + 'C2 00 C3 C3 C3 00 C4 C4 C4 00 C5 C5 C5 00 C6 C6' + 'C6 00 C8 C8 C8 00 C8 C9 C9 00 C9 C9 C9 00 CA CA' + 'CA 00 CB CB CB 00 CC CC CC 00 CD CD CD 00 CE CE' + 'CE 00 CF CF CF 00 D5 CB C4 00 D0 CB C8 00 D7 D2' + 'CE 00 D9 D1 CC 00 D0 D0 D0 00 D1 D1 D1 00 D2 D2' + 'D2 00 D3 D3 D3 00 D4 D4 D4 00 D5 D5 D5 00 D6 D6' + 'D6 00 D7 D7 D7 00 DC D9 D7 00 D8 D8 D8 00 D9 D9' + 'D9 00 DA DA D8 00 DA DA DA 00 DB DB DB 00 DC DC' + 'DC 00 DD DD DD 00 DE DE DE 00 DF DF DF 00 FF C0' + 'C0 00 F1 D2 C2 00 F2 D6 C7 00 F3 D9 CB 00 F4 DD' + 'D0 00 F6 E4 D9 00 E0 E0 E0 00 E1 E1 E1 00 E2 E2' + 'E2 00 E3 E3 E3 00 E4 E4 E4 00 E5 E5 E5 00 E6 E6' + 'E6 00 E7 E7 E7 00 E8 E8 E8 00 E9 E9 E9 00 EA EA' + 'EA 00 EB EB EB 00 EC EC EC 00 ED ED ED 00 EE EE' + 'EE 00 EF EF EF 00 F9 EE E8 00 F0 F0 F0 00 F1 F1' + 'F1 00 F2 F2 F2 00 F3 F3 F3 00 F4 F4 F4 00 F5 F5' + 'F5 00 F6 F6 F6 00 F7 F7 F7 00 FD F9 F7 00 F8 F8' + 'F8 00 F9 F9 F9 00 FA FA FA 00 FF FF FF 00 00 00' + '00 00 C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 B0 6C' + '38 00 96 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 F8 F8 F8 F8 F8 F8' + 'F8 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 F8 3D 3D 3D 3D 3D' + 'F8 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 F8 73 73 73 73 73' + 'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 F8 16 36 36 1F 04' + 'F8 68 68 68 68 68 68 68 68 68 68 68 68 68 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 F8 28 00 00 73 0C' + 'F8 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 F8 29 F8 F8 F8 0C' + 'F8 9A 9A 9A 9A 9A 9A 9A 9A 9A 9A 9A 9A 9A 00 00' + '00 00 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8' + 'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 11 2A 32 1F 0F' + 'F8 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 00 00' + 'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8' + 'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 04 0C 0C 0F 19' + 'F8 E7 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 00 F8' + 'F8 F8 F8 21 2F 2E 2F 2E 2E 2E 2E 2E 2E 2E 2E 2E' + '2E 2E 2D 2D 2D 2D 2D 2D 2D 2D F8 0C 0C 0F 19 18' + 'F8 E6 E1 79 79 79 79 79 79 79 79 79 79 79 00 F8' + 'F8 26 76 91 87 86 85 BB BA B9 B7 B2 B1 B0 B0 B1' + 'AE AF 99 99 96 97 94 97 97 97 F8 0C 0F 19 19 1D' + 'F8 E5 CF DA DA DA DB DB DB DC DD DD DD DE F8 F8' + '01 72 85 E5 E2 E2 E2 C6 6B 6B E1 E2 E2 DD D1 CB' + 'C4 BB BB BB BB BB B6 BB 83 30 F8 F8 F8 19 1E 19' + 'F8 E4 E0 E1 E2 E2 E3 E4 E4 E4 E5 E5 E5 E6 F8 F8' + '1A 85 E5 E5 E2 E2 E2 6C 6C 6C 6B DB D3 C7 BA C4' + 'B9 BB BB BB BB BB BB BB 40 30 F8 F8 F8 1E 15 13' + 'F8 E3 E1 79 79 79 79 79 79 79 79 79 79 79 F8 F8' + '2C 85 E4 E5 E5 E2 E2 6C 6C 6C 6C B9 B5 5C 5C 5C' + '5C 5C 5C 5C 5C 5C 5C BB 77 40 F8 F8 F8 F8 0E 0F' + 'F8 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 F8 F8' + '2B C3 E6 E5 E5 E2 E2 E2 6C 6C 8E 8E 8F 3C 3C 3C' + '3C 3C 3C 3C 3C 3C 3C 8F 8F 8F F8 F8 F8 F8 0A 0D' + 'F8 E2 E1 DD DD DD DD DE DE DF E0 E0 E0 E1 F8 F8' + '2B C3 E8 E2 E5 E2 E2 F8 F8 F8 F8 F8 F8 F8 F8 F8' + 'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 24 1E 05 07 0A' + 'F8 DF E1 79 79 79 79 79 79 79 79 79 79 79 F8 F8' + '27 C3 E9 E5 E5 E5 E5 6E 3C 3C 3C 3C 3C 3C 3C 3C' + '3C 3C 3C 3C 3C 3C 3C 3C 3C 3C F8 2E 10 02 03 03' + 'F8 D0 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 F8 F8' + '27 C4 ED E4 E5 E5 E5 80 80 84 88 8A 89 89 89 89' + '89 89 84 84 84 84 84 84 84 84 F8 34 0C F8 F8 F8' + 'F8 DF DF E0 E1 E1 E2 E3 E3 E3 E4 E4 E4 E5 F8 F8' + '26 C5 EE E5 E7 E5 E3 E2 E0 DE DC CF D0 CB CC C4' + 'C4 BD C2 C2 C2 C2 C2 C2 C2 C2 F8 3A 02 03 04 04' + 'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8' + '26 C5 F2 F4 F1 F1 F1 F0 F0 EF EF EE EE EE ED ED' + 'EC EC EC EB EB EB E9 E9 E8 E8 F8 3A 07 09 0B 0D' + '0F 13 1A 1D 27 37 42 46 46 46 46 2F 2F 2F F8 F8' + '24 C8 F7 E3 DB DC DC DA D3 D3 D3 D3 D3 DA DA DA' + 'DA DA DA DA DA DA DA DA DA DA F8 3F 0D 10 12 17' + '1B 21 26 33 3D 44 47 46 46 46 2F 2F 2F 2F F8 F8' + '24 D2 F4 CC B2 95 99 CB CE CC CC CC CC CC CC CC' + 'CC CC CC CC CC CC CC CC CC CC F8 44 23 18 1B 20' + '27 2E 38 40 44 47 4A 46 46 2F 2F 2F 2F 2F F8 F8' + '1E CE EE B4 82 90 8A B1 CE CB CB CB CB CB C9 C9' + 'C9 C9 C9 C9 C9 C9 CB CB CB CB F8 4B 30 1E 25 2E' + '31 3B 43 44 47 4B 49 42 39 2F 23 1C 1C 14 F8 F8' + '05 B0 F1 96 8C B1 84 95 CB C7 C7 C7 C6 C5 C5 C7' + 'C9 CB CB C9 C7 C5 C5 C5 C6 C7 F8 4B 4C 27 30 35' + '3D 45 44 47 4B 4B 45 3D 34 2D 25 1C 1C 17 00 F8' + 'F8 7E EF BD B3 C4 99 B7 C5 C4 C2 C5 C2 C2 C7 C7' + 'C7 C7 C7 C7 C7 C7 C2 C2 C6 C2 F8 50 53 3D 38 3F' + 'F8 73 73 73 73 73 73 73 73 73 73 73 73 73 00 F8' + 'F8 66 E9 C3 BD B9 BD C3 BC BD C7 C7 C7 C7 C7 C7' + 'C7 C7 C7 C7 C7 C7 C7 C7 C7 DB F8 53 57 56 49 45' + 'F8 70 F3 EA D9 D7 AC A8 A2 9D 9D 9D 9D 9D 00 F8' + 'F8 55 E3 C2 BB BB BB B8 C5 C5 C5 C5 C6 C7 C8 C8' + 'C8 C8 C8 C8 C8 C8 C7 C7 CF DE F8 57 57 5B 5E 44' + 'F8 75 F7 BF 71 6D 69 A0 A6 9D 9D 9D 9D 9D 00 F8' + 'F8 40 C9 C4 B8 B9 B8 C6 C5 C5 C5 C3 C4 C4 C4 C4' + 'C4 C4 C5 C4 C5 C5 C4 C4 C3 C2 F8 57 57 5B 5E 44' + 'F8 75 F7 BF 71 6D 69 A0 A6 9D 9D 9D 9D 9D 00 F8' + 'F8 22 90 CF B8 B9 BC C5 C5 BD C3 C2 C2 C2 C2 BD' + 'C5 C5 BC C5 C5 C5 C5 C5 C5 BC F8 57 5B 5E 5E 60' + 'F8 78 F7 92 52 4E 54 AD A9 A3 9D 9D 9D 9D 00 F8' + 'F8 07 7C D1 BA BB C5 C5 C5 C2 C2 C2 C2 C2 C2 C5' + 'C5 C5 C5 C5 C5 C5 C5 C5 C5 C5 F8 5B 5B 5E 60 64' + 'F8 7B F7 89 50 4D 5D D6 AB A7 9E 9D 9D 9D 00 00' + 'F8 F8 6F D1 BD C3 C5 C5 C2 C2 C2 C2 C2 C2 C2 C2' + 'BD C5 C5 C5 C5 C5 C5 C5 C5 C5 F8 5B 5B 5E 64 64' + '3D 83 F7 7F 4F 4C 63 D8 D5 AA A4 9D 9D 9D 00 00' + 'F8 F8 58 D0 C3 C4 C5 C5 C3 C3 C3 C3 C3 C3 C3 C3' + 'C3 C5 C5 C5 C5 C5 C5 C5 C5 C5 F8 5E 60 64 66 66' + 'F8 8B F7 DA D3 CA C1 D9 D7 AC A8 A2 A2 9D 00 00' + 'F8 F8 41 CB C6 C4 C5 C5 C5 C5 C5 C5 C5 C5 C5 C5' + 'C5 C5 C5 C5 C5 C5 C5 C5 C5 C5 F8 F8 F8 F8 F8 F8' + 'F8 7D CD CD CD CD C0 BE A5 A1 9F 9C 9C 9B 00 00' + 'F8 F8 2F BA C8 C7 C5 C5 C8 C8 C8 C8 C8 C8 C8 C8' + 'C8 C8 C8 C5 C5 C5 C5 C5 BA B7 B4 B2 B0 8D 97 C2' + '79 09 F8 F8 00 00 00 00 00 00 00 00 00 00 00 00' + 'F8 F8 19 8A CF CF D2 D2 D2 CC CE CE CE CE CE CE' + 'CE CE CE CE D1 D1 D1 D1 D1 CE D1 D1 E1 CC BA B8' + '65 02 F8 F8 00 00 00 00 00 00 00 00 00 00 00 00' + 'F8 F8 08 78 D0 D3 D0 D2 D2 D2 D1 D1 D1 D1 D1 D1' + 'D1 D1 D1 D1 D1 D1 D1 D1 D1 D1 E1 E1 E1 D1 D0 B4' + '51 F8 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 F8 F8 62 C5 DC DB D2 D2 D2 D2 D2 DA DA DA DA' + 'DA DA DA DA DA DA DA DA DB DB E1 E1 E1 DD CC 95' + '3B F8 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 F8 F8 4B B7 DF DD DE E5 E5 E5 E5 E5 E5 DE DE' + 'DE DE DE DE DE DE DF DF E1 E1 E1 E1 DE E0 C8 81' + '20 F8 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 F8 F8 38 97 E0 E0 E0 E1 E1 E5 E5 E5 E5 E5 E5' + 'E5 E5 E5 E5 E5 E5 E5 E1 E1 E1 E1 E1 E0 E2 C6 7A' + '0B F8 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 F8 F8 1D 84 DE E7 E1 E0 E6 E5 E4 E7 E5 E5 E5' + 'E5 E5 E5 E5 E5 E5 E5 E5 E5 E6 E4 DF E5 E5 C8 72' + 'F8 F8 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 F8 F8 08 79 DE D3 97 AF C8 E6 E7 E7 E8 E8 E7' + 'E6 E5 E5 E6 E7 E8 E8 E7 E8 DE B0 98 C3 E6 C6 61' + 'F8 F8 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 F8 F8 74 DA B2 8C 93 8C E5 EC EB EB EB EB' + 'EB EB EB EB EB EB EB EB EE C7 8A 8F 90 E5 BB 59' + 'F8 F8 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 F8 F8 5A BC D1 D0 C7 DE F5 F5 F5 F5 F5 F5' + 'F5 F5 F5 F5 F5 F5 F5 F5 F6 ED D3 CB D0 C9 8A 37' + 'F8 F8 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 F8 F8 1A 6E 98 C5 C9 CF CB CB CB CB CB CB' + 'CB CB CB CB CB CB CB CB CB CC CC C9 BB 8A 56 06' + 'F8 F8 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 F8 F8 F8 0C 3E 49 48 48 48 48 48 48 48 48' + '48 48 48 48 48 48 48 48 48 48 48 49 49 31 02 F8' + 'F8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8' + 'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8' + 'F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 F8 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF F0 00 00 00 00 FF FF' + 'FF F0 00 00 00 00 FF FF FF F0 00 00 00 00 FF FF' + 'FF F0 00 00 00 00 FF FF FF F3 00 00 00 00 FF FF' + 'FF F0 00 00 00 00 F0 00 00 00 00 00 00 00 C0 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 C0 00' + '00 00 00 00 00 00 C0 00 00 00 00 00 00 00 C0 00' + '00 00 00 00 00 00 C0 00 00 00 03 FF 00 00 C0 00' + '00 00 03 FF 00 00 C0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 F0 00 00 00 07 FF 00 00 F0 00' + '00 00 0F FF 00 00 F0 00 00 00 0F FF 00 00 F0 00' + '00 00 1F FF 00 00 F8 00 00 00 3F FF 00 00 FE 00' + '00 00 7F FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 04 00 00 00' + '00 00 80 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07' + '77 77 77 77 77 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 08 88 88 88 88 88 88 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 08 88 88 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 09 99 99 99 99 99 99 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 09' + '99 99 99 99 99 99 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 07 77 77 77 77 77 77 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07' + '77 77 77 77 77 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 0F FF FF FF FF FF FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F' + 'F8 88 88 88 88 88 00 00 87 77 77 77 77 77 77 77' + '77 77 77 77 00 00 00 0F 7F FF FF FF FF FF 00 08' + '7F FF F7 AA FF FF 77 77 77 77 77 70 00 00 00 0F' + 'FF FF FF FF FF FF 00 07 FF FF FA AA AF 77 77 77' + '77 77 77 00 00 00 00 0F F8 88 88 88 88 88 00 07' + 'FF FF FA AA A7 78 88 88 88 88 87 80 00 00 00 0F' + 'FF FF FF FF FF FF 00 07 FF FF FF AA 77 70 00 00' + '00 00 07 77 00 00 00 0F FF FF FF FF FF FF 00 07' + 'FF FF F0 00 00 00 00 00 00 00 00 00 00 00 00 0F' + 'F8 88 88 88 88 88 00 07 FF FF F8 00 00 00 00 00' + '00 00 00 00 00 00 00 07 FF FF FF FF FF FF 00 07' + 'FF FF F7 77 77 77 77 77 77 77 77 77 00 00 00 0F' + 'FF FF FF FF FF FF 00 07 FF FF FF FF F7 77 77 77' + '77 77 77 77 00 00 00 00 00 00 00 00 00 00 00 07' + 'FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00' + '00 00 88 88 80 00 00 07 F7 7F FF 77 77 7F FF FF' + 'FF FF FF FF 00 00 00 00 00 08 88 88 00 00 00 07' + '77 77 77 77 77 77 77 77 77 7F 77 F7 08 00 00 00' + '00 88 88 80 00 00 00 07 F7 77 77 77 77 77 77 77' + '77 77 77 77 08 00 00 00 88 88 88 00 00 00 00 07' + '77 77 77 77 77 77 77 77 77 77 77 77 08 80 00 08' + '88 88 80 00 00 00 00 07 77 77 77 77 77 77 77 77' + '77 77 77 77 08 80 00 08 88 88 88 88 88 88 00 08' + '77 77 77 77 77 77 77 77 77 77 77 77 08 88 88 08' + 'FF F7 77 77 77 77 00 08 77 77 77 77 77 77 77 77' + '77 77 77 77 08 88 88 08 F7 88 87 77 77 77 00 00' + '77 77 77 77 77 77 77 77 77 77 77 77 08 88 88 08' + 'F7 88 87 77 77 77 00 00 77 77 77 77 77 77 77 77' + '77 77 77 77 08 88 88 08 F7 88 87 77 77 77 00 00' + '87 77 77 77 77 77 77 77 77 77 77 77 08 88 88 08' + 'F7 88 87 77 77 77 00 00 87 77 77 77 77 77 77 77' + '77 77 77 77 08 88 88 07 F7 88 8F 77 77 77 00 00' + '87 77 77 77 77 77 77 77 77 77 77 77 08 88 88 07' + 'FF 77 7F 77 77 77 00 00 87 77 77 77 77 77 77 77' + '77 77 77 77 00 00 00 07 77 77 77 77 77 77 00 00' + '07 77 77 77 77 77 77 77 77 77 77 77 77 77 77 80' + '00 00 00 00 00 00 00 00 07 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 80 00 00 00 00 00 00 00 00' + '08 77 77 77 77 77 77 77 77 77 77 77 77 77 77 80' + '00 00 00 00 00 00 00 00 08 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 00 00 00 00 00 00 00 00 00' + '08 77 77 77 77 77 77 77 77 77 77 77 77 77 77 00' + '00 00 00 00 00 00 00 00 00 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 00 00 00 00 00 00 00 00 00' + '00 77 77 77 77 77 77 77 77 77 77 77 77 77 77 00' + '00 00 00 00 00 00 00 00 00 87 77 77 77 77 77 77' + '77 77 77 77 77 77 78 00 00 00 00 00 00 00 00 00' + '00 87 77 77 77 77 77 77 77 77 77 77 77 77 78 00' + '00 00 00 00 00 00 00 00 00 87 77 77 77 77 77 77' + '77 77 77 77 77 77 70 00 00 00 00 00 00 00 00 00' + '00 08 77 77 77 77 77 77 77 77 77 77 77 77 80 00' + '00 00 00 00 00 00 00 00 00 00 08 88 88 88 88 88' + '88 88 88 88 88 80 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF F0 00 00 00 00 FF FF FF F0 00 00 00 00 FF FF' + 'FF F0 00 00 00 00 FF FF FF F0 00 00 00 00 FF FF' + 'FF F3 00 00 00 00 FF FF FF F0 00 00 00 00 F0 00' + '00 00 00 00 00 00 C0 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 C0 00 00 00 00 00 00 00 C0 00' + '00 00 00 00 00 00 C0 00 00 00 00 00 00 00 C0 00' + '00 00 03 FF 00 00 C0 00 00 00 03 FF 00 00 C0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 F0 00' + '00 00 07 FF 00 00 F0 00 00 00 0F FF 00 00 F0 00' + '00 00 0F FF 00 00 F0 00 00 00 1F FF 00 00 F8 00' + '00 00 3F FF 00 00 FE 00 00 00 7F FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 00 24 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 24 00 00 00 6C 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF FF C0 C0 FF FF C0' + 'C0 FF FF C0 C0 FF FF C0 C0 FF FF C0 C0 FF FF C0' + 'C0 FF FF C0 C0 FF FF C0 C0 FF FF C0 C0 FF FF C0' + 'C0 FF FF C0 C0 FF FF C0 C0 FF FF C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 FF 3C 3C 3C FF 3C 3C 3C FF 3C 3C 3C FF 3C 3C' + '3C FF 3C 3C 3C FF 00 00 00 FF 7F 60 60 FF 7F 60' + '60 FF 7F 60 60 FF 7F 60 60 FF 7F 60 60 FF 7F 60' + '60 FF 7F 60 60 FF 7F 60 60 FF 7F 60 60 FF 7F 60' + '60 FF 7F 60 60 FF 7F 60 60 FF 7F 60 60 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C' + '8C FF 8C 8C 8C FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 FF 16 16 14 FF 36 36 30 FF 36 36 30 FF 22 22' + '1F FF 04 04 04 FF 00 00 00 FF C0 00 00 FF C0 00' + '00 FF C0 00 00 FF C0 00 00 FF C0 00 00 FF C0 00' + '00 FF C0 00 00 FF C0 00 00 FF C0 00 00 FF C0 00' + '00 FF C0 00 00 FF C0 00 00 FF C0 00 00 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 FF 28 28 24 FF 00 00 00 B4 00 00 00 9C 8C 8C' + '8C FF 0C 0C 0C FF 00 00 00 FF D5 40 40 FF D5 40' + '40 FF D5 40 40 FF D5 40 40 FF D5 40 40 FF D5 40' + '40 FF D5 40 40 FF D5 40 40 FF D5 40 40 FF D5 40' + '40 FF D5 40 40 FF D5 40 40 FF D5 40 40 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 FF 2A 2A 25 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 0C 0C 0C FF 00 00 00 FF EA 80 80 FF EA 80' + '80 FF EA 80 80 FF EA 80 80 FF EA 80 80 FF EA 80' + '80 FF EA 80 80 FF EA 80 80 FF EA 80 80 FF EA 80' + '80 FF EA 80 80 FF EA 80 80 FF EA 80 80 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 16 00 00 00 34 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 FF 12 12 10 FF 2B 2B 26 FF 30 30 2C FF 22 22' + '1F FF 10 10 10 FF 00 00 00 FF FF C0 C0 FF FF C0' + 'C0 FF FF C0 C0 FF FF C0 C0 FF FF C0 C0 FF FF C0' + 'C0 FF FF C0 C0 FF FF C0 C0 FF FF C0 C0 FF FF C0' + 'C0 FF FF C0 C0 FF FF C0 C0 FF FF C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 69 00 00' + '00 C5 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 FF 04 04 04 FF 0C 0C 0C FF 0C 0C 0C FF 10 10' + '10 FF 18 18 18 FF 00 00 00 FF ED ED ED FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF 00 00' + '00 00 00 00 00 05 00 00 00 9B 00 00 00 FF 00 00' + '00 FF 21 21 21 FF 2C 2C 2C FF 2B 2B 2B FF 2C 2C' + '2C FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 00 00' + '00 FF 0C 0C 0C FF 0C 0C 0C FF 10 10 10 FF 18 18' + '18 FF 17 17 17 FF 00 00 00 FF EC EC EC FF E7 E7' + 'E7 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 00 00' + '00 00 00 00 00 54 00 00 00 FF 26 26 26 FF 90 90' + '90 FF B8 B4 B6 FF AD AD AD FF AB AC AC FF AD A8' + 'AB FF CD CD CD FF CC CC CC FF CB CB CB FF C9 C9' + 'C9 FF C4 C4 C4 FF C3 C3 C3 FF C2 C2 C2 FF C2 C2' + 'C2 FF C3 C3 C3 FF C0 C0 C0 FF C1 C1 C1 FF BF BF' + 'BF FF BF BF BF FF BC BC BC FF BD BD BD FF BA BA' + 'BA FF BD BD BD FF BD BD BD FF BD BD BD FF 00 00' + '00 FF 0C 0C 0C FF 10 10 10 FF 18 18 18 FF 18 18' + '18 FF 1E 1E 1E FF 00 00 00 FF EB EB EB FF DB DB' + 'DB FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E1 E1' + 'E1 FF E1 E1 E1 FF E1 E1 E1 FF E2 E2 E2 FF E3 E3' + 'E3 FF E3 E3 E3 FF E3 E3 E3 FF E4 E4 E4 FF 00 00' + '00 03 00 00 00 AD 01 01 01 FF 8A 8A 8A FF AD A8' + 'AB FF EB EB EB FF E8 E8 E8 FF E8 E8 E8 FF E8 E8' + 'E8 FF D4 D4 D4 FF 00 C0 00 FF 00 C0 00 FF E7 E7' + 'E7 FF E8 E8 E8 FF E8 E8 E8 FF E3 E3 E3 FF DD DD' + 'DD FF D8 D8 D8 FF D2 D2 D2 FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF CD CD CD FF CD CD CD FF C8 C9' + 'C9 FF CD CD CD FF AA AA AA FF 2E 2E 2E FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 18 18 18 FF 1F 1F' + '1F FF 18 18 18 FF 00 00 00 FF EA EA EA FF E6 E6' + 'E6 FF E7 E7 E7 FF E8 E8 E8 FF E8 E8 E8 FF E9 E9' + 'E9 FF EA EA EA FF EA EA EA FF EA EA EA FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EC EC EC FF 00 00' + '00 15 00 00 00 F0 19 19 19 FF AD A8 AB FF EB EB' + 'EB FF EB EB EB FF E8 E8 E8 FF E8 E8 E8 FF E8 E8' + 'E8 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 C0' + '00 FF E1 E1 E1 FF DF DF DF FF D5 D5 D5 FF CC CC' + 'CC FF D2 D2 D2 FF CB CB CB FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF 40 40 40 FF 2E 2E 2E FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 1F 1F 1F FF 15 15' + '15 FF 13 13 13 FF 00 00 00 FF E9 E9 E9 FF E7 E7' + 'E7 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 00 00' + '00 30 00 00 00 FA 29 29 29 FF AD A8 AB FF EA EA' + 'EA FF EB EB EB FF EB EB EB FF E8 E8 E8 FF E8 E8' + 'E8 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF' + '00 FF CB CB CB FF C8 C8 C8 FF 66 66 66 FF 66 66' + '66 FF 66 66 66 FF 66 66 66 FF 66 66 66 FF 66 66' + '66 FF 66 66 66 FF 66 66 66 FF 66 66 66 FF 66 66' + '66 FF CD CD CD FF 93 93 93 FF 40 40 40 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 0E 0E' + '0E FF 10 10 10 FF 00 00 00 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF 00 00' + '00 34 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EC EC' + 'EC FF EB EB EB FF EB EB EB FF E8 E8 E8 FF E8 E8' + 'E8 FF E8 E8 E8 FF 00 FF 00 FF 00 FF 00 FF B5 B5' + 'B5 FF B5 B5 B5 FF B6 B6 B6 FF 3B 3B 3B FF 3B 3B' + '3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B' + '3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B' + '3B FF B6 B6 B6 FF B6 B6 B6 FF B6 B6 B6 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 0A 0A' + '0A FF 0D 0D 0D FF 00 00 00 FF E8 E8 E8 FF E7 E7' + 'E7 FF E3 E3 E3 FF E3 E3 E3 FF E3 E3 E3 FF E3 E3' + 'E3 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5 E5 FF E6 E6' + 'E6 FF E6 E6 E6 FF E6 E6 E6 FF E7 E7 E7 FF 00 00' + '00 33 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EE EE' + 'EE FF E8 E8 E8 FF EB EB EB FF E8 E8 E8 FF E8 E8' + 'E8 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 24 24 24 FF 1F 1F 1F FF 05 05 05 FF 07 07' + '07 FF 0A 0A 0A FF 00 00 00 FF E5 E5 E5 FF E7 E7' + 'E7 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 00 00' + '00 33 00 00 00 F9 27 27 27 FF D1 D1 D1 FF EF EF' + 'EF FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF 80 80 80 FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B' + '3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B' + '3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B' + '3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B' + '3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B 3B FF 00 00' + '00 FF 2B 2B 2B FF 11 11 11 FF 02 02 02 FF 03 03' + '03 FF 03 03 03 FF 00 00 00 FF DC DC DC FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF 00 00' + '00 33 00 00 00 F9 27 27 27 FF D2 D2 D2 FF F2 F2' + 'F2 FF EA EA EA FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF A7 A7 A7 FF A7 A7 A7 FF AB AB AB FF AE AE' + 'AE FF B0 B0 B0 FF AF AF AF FF AF AF AF FF AF AF' + 'AF FF AF AF AF FF AF AF AF FF AF AF AF FF AB AB' + 'AB FF AB AB AB FF AB AB AB FF AB AB AB FF AB AB' + 'AB FF AB AB AB FF AB AB AB FF AB AB AB FF 00 00' + '00 FF 32 32 32 FF 0C 0C 0C FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF E5 E5 E5 FF E5 E5' + 'E5 FF E6 E6 E6 FF E7 E7 E7 FF E7 E7 E7 FF E8 E8' + 'E8 FF E9 E9 E9 FF E9 E9 E9 FF E9 E9 E9 FF EA EA' + 'EA FF EA EA EA FF EA EA EA FF EB EB EB FF 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF F3 F3' + 'F3 FF EB EB EB FF ED ED ED FF EB EB EB FF E9 E9' + 'E9 FF E8 E8 E8 FF E6 E6 E6 FF E4 E4 E4 FF E2 E2' + 'E2 FF DB DB DB FF DC DC DC FF D8 D8 D8 FF D9 D9' + 'D9 FF D2 D2 D2 FF D2 D2 D2 FF CF CF CF FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF 00 00' + '00 FF 37 37 37 FF 02 02 02 FF 03 03 03 FF 04 04' + '04 FF 04 04 04 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF F7 F7' + 'F7 FF F8 F8 F8 FF F6 F6 F6 FF F6 F6 F6 FF F6 F6' + 'F6 FF F5 F5 F5 FF F5 F5 F5 FF F4 F4 F4 FF F4 F4' + 'F4 FF F3 F3 F3 FF F3 F3 F3 FF F3 F3 F3 FF F2 F2' + 'F2 FF F2 F2 F2 FF F1 F1 F1 FF F1 F1 F1 FF F1 F1' + 'F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF EF EF' + 'EF FF EF EF EF FF EE EE EE FF EE EE EE FF 00 00' + '00 FF 37 37 37 FF 07 07 07 FF 09 09 09 FF 0B 0B' + '0B FF 0D 0D 0D FF 10 10 10 FF 13 13 13 FF 19 19' + '19 FF 1E 1E 1E FF 27 27 27 FF 34 34 34 FF 42 42' + '42 FF 46 46 46 FF 46 46 46 FF 46 46 46 FF 46 46' + '46 FF 2C 2C 2C FF 2C 2C 2C FF 2C 2C 2C FF 00 00' + '00 33 00 00 00 F9 24 24 24 FF D6 D6 D6 FF FF FF' + 'FF FF E9 E9 E9 FF E1 E1 E1 FF E2 E2 E2 FF E2 E2' + 'E2 FF E0 E0 E0 FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF 00 00' + '00 FF 3F 3F 3F FF 0D 0D 0D FF 11 11 11 FF 12 12' + '12 FF 16 16 16 FF 1B 1B 1B FF 21 21 21 FF 26 26' + '26 FF 30 30 30 FF 3C 3C 3C FF 44 44 44 FF 47 47' + '47 FF 46 46 46 FF 46 46 46 FF 46 46 46 FF 2C 2C' + '2C FF 2C 2C 2C FF 2C 2C 2C FF 2C 2C 2C FF 00 00' + '00 34 00 00 00 FA 24 24 24 FF DE DE DE FF F8 F8' + 'F8 FF D9 D9 D9 FF C4 C4 C4 FF BB BB BB FF BF BF' + 'BF FF D8 D8 D8 FF DA DA DA FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF 00 00' + '00 FF 44 44 44 FF 23 23 23 FF 17 17 17 FF 1B 1B' + '1B FF 20 20 20 FF 27 27 27 FF 2B 2B 2B FF 35 35' + '35 FF 40 40 40 FF 44 44 44 FF 47 47 47 FF 4A 4A' + '4A FF 46 46 46 FF 46 46 46 FF 2C 2C 2C FF 2C 2C' + '2C FF 2C 2C 2C FF 2C 2C 2C FF 2C 2C 2C FF 00 00' + '00 25 00 00 00 F7 1F 1F 1F FF DA DA DA FF F3 F3' + 'F3 FF C6 C6 C6 FF A9 A9 A9 FF B7 B7 B7 FF B0 B0' + 'B0 FF C3 C3 C3 FF DA DA DA FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF 00 00' + '00 FF 4B 4B 4B FF 2E 2E 2E FF 1F 1F 1F FF 25 25' + '25 FF 2B 2B 2B FF 2F 2F 2F FF 39 39 39 FF 43 43' + '43 FF 44 44 44 FF 47 47 47 FF 4B 4B 4B FF 49 49' + '49 FF 42 42 42 FF 36 36 36 FF 2C 2C 2C FF 23 23' + '23 FF 1C 1C 1C FF 1C 1C 1C FF 14 14 14 FF 00 00' + '00 07 00 00 00 D0 05 05 05 FF C2 C2 C2 FF F6 F6' + 'F6 FF BC BC BC FF B2 B2 B2 FF C3 C3 C3 FF AB AB' + 'AB FF BB BB BB FF D8 D8 D8 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D4 D4 D4 FF D3 D3 D3 FF D3 D3' + 'D3 FF D5 D5 D5 FF D7 D7 D7 FF D8 D8 D8 FF D8 D8' + 'D8 FF D7 D7 D7 FF D5 D5 D5 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D4 D4 D4 FF D5 D5 D5 FF 00 00' + '00 FF 4B 4B 4B FF 4C 4C 4C FF 27 27 27 FF 2E 2E' + '2E FF 33 33 33 FF 3C 3C 3C FF 45 45 45 FF 44 44' + '44 FF 47 47 47 FF 4B 4B 4B FF 4B 4B 4B FF 45 45' + '45 FF 3C 3C 3C FF 32 32 32 FF 2A 2A 2A FF 25 25' + '25 FF 1C 1C 1C FF 1C 1C 1C FF 16 16 16 FF 00 00' + '00 00 00 00 00 9C 00 00 00 FF A4 A4 A4 FF F4 F4' + 'F4 FF CF CF CF FF C5 C5 C5 FF D2 D2 D2 FF BF BF' + 'BF FF C9 C9 C9 FF D3 D3 D3 FF D2 D2 D2 FF D0 D0' + 'D0 FF D3 D3 D3 FF D0 D0 D0 FF D0 D0 D0 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D0 D0' + 'D0 FF D0 D0 D0 FF D4 D4 D4 FF D0 D0 D0 FF 00 00' + '00 FF 52 52 52 FF 57 57 57 FF 3C 3C 3C FF 35 35' + '35 FF 3F 3F 3F FF 00 00 00 FF 8C 8C 8C FF 8C 8C' + '8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C' + '8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C' + '8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C 8C FF 00 00' + '00 00 00 00 00 73 00 00 00 FF 7E 7E 7E FF EF EF' + 'EF FF D1 D1 D1 FF CF CF CF FF CB CB CB FF CF CF' + 'CF FF D1 D1 D1 FF CE CE CE FF CF CF CF FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF E1 E1 E1 FF 00 00' + '00 FF 57 57 57 FF 5E 5E 5E FF 5D 5D 5D FF 49 49' + '49 FF 45 45 45 FF 00 00 00 FF 84 84 84 FF FD F9' + 'F7 FF F9 EE E8 FF F6 E4 D9 FF F3 D9 CB FF F0 CF' + 'BC FF ED C5 AE FF EA BB A0 FF E9 B6 99 FF E9 B6' + '99 FF E9 B6 99 FF E9 B6 99 FF E9 B6 99 FF 00 00' + '00 00 00 00 00 59 00 00 00 FF 59 59 59 FF E9 E9' + 'E9 FF D0 D0 D0 FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF CA CA CA FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D4 D4 D4 FF D5 D5 D5 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D5 D5' + 'D5 FF D5 D5 D5 FF DB DB DB FF E4 E4 E4 FF 00 00' + '00 FF 5E 5E 5E FF 5E 5E 5E FF 65 65 65 FF 6A 6A' + '6A FF 44 44 44 FF 00 00 00 FF 8E 8E 8E FF FF FF' + 'FF FF D0 CB C8 FF 8B 86 84 FF 87 80 7D FF 83 7A' + '75 FF D0 B3 A3 FF EC C0 A7 FF E9 B6 99 FF E9 B6' + '99 FF E9 B6 99 FF E9 B6 99 FF E9 B6 99 FF 00 00' + '00 00 00 00 00 3E 00 00 00 FE 40 40 40 FF D7 D7' + 'D7 FF D2 D2 D2 FF CA CA CA FF CB CB CB FF CA CA' + 'CA FF D4 D4 D4 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D1 D1 D1 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D3 D3' + 'D3 FF D2 D2 D2 FF D3 D3 D3 FF D3 D3 D3 FF D2 D2' + 'D2 FF D2 D2 D2 FF D1 D1 D1 FF D0 D0 D0 FF 00 00' + '00 FF 5E 5E 5E FF 5E 5E 5E FF 65 65 65 FF 6A 6A' + '6A FF 44 44 44 FF 00 00 00 FF 8E 8E 8E FF FF FF' + 'FF FF D0 CB C8 FF 8B 86 84 FF 87 80 7D FF 83 7A' + '75 FF D0 B3 A3 FF EC C0 A7 FF E9 B6 99 FF E9 B6' + '99 FF E9 B6 99 FF E9 B6 99 FF E9 B6 99 FF 00 00' + '00 00 00 00 00 25 00 00 00 F8 22 22 22 FF B7 B7' + 'B7 FF DB DB DB FF CA CA CA FF CB CB CB FF CE CE' + 'CE FF D3 D3 D3 FF D3 D3 D3 FF CF CF CF FF D1 D1' + 'D1 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF CF CF CF FF D3 D3 D3 FF D3 D3 D3 FF CE CE' + 'CE FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF CE CE CE FF 00 00' + '00 FF 5E 5E 5E FF 65 65 65 FF 6A 6A 6A FF 6A 6A' + '6A FF 71 71 71 FF 00 00 00 FF 97 97 97 FF FF FF' + 'FF FF B8 B6 B6 FF 54 54 54 FF 4F 4F 4F FF 5B 58' + '57 FF F0 D0 BE FF ED C6 AF FF EA BC A1 FF E9 B6' + '99 FF E9 B6 99 FF E9 B6 99 FF E9 B6 99 FF 00 00' + '00 00 00 00 00 0C 00 00 00 E1 07 07 07 FF 9F 9F' + '9F FF DD DD DD FF CC CC CC FF CD CD CD FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF 00 00' + '00 FF 65 65 65 FF 6A 6A 6A FF 6A 6A 6A FF 71 71' + '71 FF 79 79 79 FF 00 00 00 FF 9E 9E 9E FF FF FF' + 'FF FF AF AF AF FF 52 52 52 FF 4E 4E 4E FF 6D 6A' + '67 FF F2 D6 C7 FF EF CC B8 FF EC C2 AA FF E9 B8' + '9C FF E9 B6 99 FF E9 B6 99 FF E9 B6 99 FF 00 00' + '00 00 00 00 00 00 00 00 00 B2 00 00 00 FF 83 83' + '83 FF DD DD DD FF CF CF CF FF D1 D1 D1 FF D3 D3' + 'D3 FF D3 D3 D3 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF CF CF CF FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF 00 00' + '00 FF 65 65 65 FF 6A 6A 6A FF 71 71 71 FF 7E 7E' + '7E FF 79 79 79 FF 00 00 00 FF AA AA AA FF FF FF' + 'FF FF A6 A6 A6 FF 50 50 50 FF 4C 4C 4C FF 7B 77' + '75 FF F4 DD D0 FF F1 D2 C2 FF EE C8 B3 FF EB BE' + 'A5 FF E9 B6 99 FF E9 B6 99 FF E9 B6 99 FF 00 00' + '00 00 00 00 00 00 00 00 00 80 00 00 00 FF 5F 5F' + '5F FF DC DC DC FF D1 D1 D1 FF D2 D2 D2 FF D3 D3' + 'D3 FF D3 D3 D3 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF 00 00' + '00 FF 65 65 65 FF 71 71 71 FF 79 79 79 FF 7E 7E' + '7E FF 7E 7E 7E FF 00 00 00 FF B1 B1 B1 FF FF FF' + 'FF FF E0 E0 E0 FF DF DF DF FF DC D9 D7 FF D9 D1' + 'CC FF F6 E4 D9 FF F3 D9 CB FF F0 CF BC FF ED C5' + 'AE FF EA BB A0 FF EA BB A0 FF E9 B6 99 FF 00 00' + '00 00 00 00 00 00 00 00 00 4B 00 00 00 FE 41 41' + '41 FF D8 D8 D8 FF D4 D4 D4 FF D2 D2 D2 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF A3 A3 9E FF DA DA' + 'D8 FF DA DA D8 FF DA DA D8 FF DA DA D8 FF D7 D2' + 'CE FF D5 CB C4 FF D2 C3 B9 FF D0 BC B0 FF CE B6' + 'A6 FF CC AF 9D FF CC AF 9D FF CA A8 94 FF 00 00' + '00 00 00 00 00 00 00 00 00 1A 00 00 00 F2 2C 2C' + '2C FF CC CC CC FF D6 D6 D6 FF D5 D5 D5 FF D3 D3' + 'D3 FF D3 D3 D3 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF CC CC CC FF C9 C9 C9 FF C6 C6' + 'C6 FF C4 C4 C4 FF C2 C2 C2 FF B3 B3 B3 FF BD BD' + 'BD FF D0 D0 D0 FF 99 99 99 FF 09 09 09 FF 00 00' + '00 CF 00 00 00 19 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 00 00 00 D8 18 18' + '18 FF B0 B0 B0 FF DB DB DB FF DB DB DB FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF D9 D9 D9 FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DA DA DA FF DD DD' + 'DD FF DD DD DD FF E7 E7 E7 FF D9 D9 D9 FF CC CC' + 'CC FF CA CA CA FF 7A 7A 7A FF 02 02 02 FF 00 00' + '00 B8 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 02 00 00 00 BF 08 08' + '08 FF 97 97 97 FF DC DC DC FF DF DF DF FF DC DC' + 'DC FF DE DE DE FF DE DE DE FF DE DE DE FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF DD DD DD FF DC DC' + 'DC FF C6 C6 C6 FF 53 53 53 FF 00 00 00 FF 00 00' + '00 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 A4 00 00' + '00 FF 77 77 77 FF D3 D3 D3 FF E2 E2 E2 FF E1 E1' + 'E1 FF DE DE DE FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E1 E1 E1 FF E1 E1 E1 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E3 E3 E3 FF D9 D9' + 'D9 FF BB BB BB FF 39 39 39 FF 00 00 00 FF 00 00' + '00 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 89 00 00' + '00 FF 4B 4B 4B FF C9 C9 C9 FF E5 E5 E5 FF E3 E3' + 'E3 FF E4 E4 E4 FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5' + 'E5 FF E5 E5 E5 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E4 E4 E4 FF E6 E6 E6 FF D6 D6' + 'D6 FF A8 A8 A8 FF 20 20 20 FF 00 00 00 FD 00 00' + '00 4E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 62 00 00' + '00 FF 35 35 35 FF BD BD BD FF E6 E6 E6 FF E6 E6' + 'E6 FF E6 E6 E6 FF E7 E7 E7 FF E7 E7 E7 FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E6 E6 E6 FF E8 E8 E8 FF D4 D4' + 'D4 FF 9A 9A 9A FF 0B 0B 0B FF 00 00 00 ED 00 00' + '00 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2D 00 00' + '00 F9 1E 1E 1E FF AB AB AB FF E4 E4 E4 FF ED ED' + 'ED FF E7 E7 E7 FF E6 E6 E6 FF EC EC EC FF EB EB' + 'EB FF EA EA EA FF ED ED ED FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EC EC EC FF EA EA' + 'EA FF E5 E5 E5 FF EB EB EB FF EB EB EB FF D6 D6' + 'D6 FF 8A 8A 8A FF 00 00 00 FF 00 00 00 C3 00 00' + '00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00' + '00 DD 08 08 08 FF 99 99 99 FF E4 E4 E4 FF DF DF' + 'DF FF BD BD BD FF C1 C1 C1 FF D6 D6 D6 FF EC EC' + 'EC FF ED ED ED FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EB EB EB FF EB EB' + 'EB FF EC EC EC FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EE EE EE FF E4 E4 E4 FF C2 C2' + 'C2 FF BE BE BE FF D1 D1 D1 FF EC EC EC FF D4 D4' + 'D4 FF 75 75 75 FF 00 00 00 FF 00 00 00 9C 00 00' + '00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 AE 00 00 00 FF 8D 8D 8D FF E0 E0 E0 FF C4 C4' + 'C4 FF B2 B2 B2 FF B8 B8 B8 FF B2 B2 B2 FF EB EB' + 'EB FF F1 F1 F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F3 F3 F3 FF D5 D5 D5 FF B0 B0' + 'B0 FF B6 B6 B6 FF B7 B7 B7 FF EB EB EB FF CD CD' + 'CD FF 61 61 61 FF 00 00 00 FF 00 00 00 85 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 80 00 00 00 FF 64 64 64 FF CE CE CE FF DD DD' + 'DD FF DC DC DC FF D5 D5 D5 FF E4 E4 E4 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF FA FA FA FF F2 F2 F2 FF DF DF' + 'DF FF D8 D8 D8 FF DC DC DC FF D7 D7 D7 FF B0 B0' + 'B0 FF 34 34 34 FF 00 00 00 FF 00 00 00 67 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 44 00 00 00 FF 19 19 19 FF 80 80 80 FF BE BE' + 'BE FF D3 D3 D3 FF D7 D7 D7 FF DB DB DB FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D9 D9 D9 FF D9 D9' + 'D9 FF D7 D7 D7 FF CD CD CD FF B0 B0 B0 FF 5D 5D' + '5D FF 06 06 06 FF 00 00 00 ED 00 00 00 2B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 02 00 00 00 9C 00 00 00 FF 0C 0C 0C FF 3D 3D' + '3D FF 49 49 49 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 49 49 49 FF 49 49 49 FF 2F 2F 2F FF 02 02' + '02 FF 00 00 00 FF 00 00 00 5C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 06 00 00 00 7F 00 00 00 F1 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 D6 00 00 00 5C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2C 00 00' + '00 7E 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 70 00 00' + '00 1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF F0 00 00 00 00 FF FF FF F0 00 00 00 00 FF FF' + 'FF F0 00 00 00 00 FF FF FF F0 00 00 00 00 FF FF' + 'FF F0 00 00 00 00 FF FF FF F0 00 00 00 00 FF FF' + 'FF F0 00 00 00 00 F0 00 00 00 00 00 00 00 C0 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 C0 00' + '00 00 00 00 00 00 C0 00 00 00 00 00 00 00 C0 00' + '00 00 00 00 00 00 C0 00 00 00 03 FF 00 00 C0 00' + '00 00 03 FF 00 00 C0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 F0 00 00 00 07 FF 00 00 F0 00' + '00 00 0F FF 00 00 F0 00 00 00 0F FF 00 00 F0 00' + '00 00 1F FF 00 00 F8 00 00 00 3F FF 00 00 FE 00' + '00 00 7F FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 20 00 00 00' + '00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 24 00 00 00 6C 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 3C 3C 3C FF 3C 3C 3C FF 3C 3C 3C FF 3C 3C' + '3C FF 7F 60 60 FF 7F 60 60 FF 7F 60 60 FF 7F 60' + '60 FF 7F 60 60 FF 7F 60 60 FF 7F 60 60 FF 7F 60' + '60 FF 7F 60 60 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 8C 8C 8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C' + '8C FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 00 00 00 00 00 00 00' + '00 04 00 00 00 14 00 00 00 26 00 00 00 2D 00 00' + '00 2D 00 00 00 2D 00 00 00 2D 00 00 00 2D 00 00' + '00 2D 00 00 00 2D 00 00 00 2D 00 00 00 2D 00 00' + '00 2D 00 00 00 2D 00 00 00 2D 00 00 00 2D 00 00' + '00 2D 28 28 24 FF 00 00 00 8F 8C 8C 8C FF 0C 0C' + '0C FF D5 40 40 FF D5 40 40 FF D5 40 40 FF D5 40' + '40 FF D5 40 40 FF D5 40 40 FF D5 40 40 FF D5 40' + '40 FF D5 40 40 FF 00 00 00 00 00 00 00 07 00 00' + '00 23 00 00 00 55 00 00 00 7E 00 00 00 8C 00 00' + '00 8C 00 00 00 8C 00 00 00 8C 00 00 00 8C 00 00' + '00 8C 00 00 00 8C 00 00 00 8C 00 00 00 8C 00 00' + '00 8C 00 00 00 8C 00 00 00 8C 00 00 00 8C 00 00' + '00 8C 2A 2A 25 FF 00 00 00 FF 00 00 00 FF 0C 0C' + '0C FF EA 80 80 FF EA 80 80 FF EA 80 80 FF EA 80' + '80 FF EA 80 80 FF EA 80 80 FF EA 80 80 FF EA 80' + '80 FF EA 80 80 FF 00 00 00 00 00 00 00 1F 00 00' + '00 C2 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 04 04 04 FF 0C 0C 0C FF 10 10 10 FF 18 18' + '18 FF ED ED ED FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF 00 00 00 00 00 00 00 C0 00 00' + '00 FF 21 21 21 FF 2C 2C 2C FF 2C 2C 2C FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 0C 0C 0C FF 0C 0C 0C FF 18 18 18 FF 17 17' + '17 FF EC EC EC FF E7 E7 E7 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 00 00 00 06 01 01 01 FF 8A 8A' + '8A FF EB EB EB FF E8 E8 E8 FF E8 E8 E8 FF D4 D4' + 'D4 FF 00 C0 00 FF E7 E7 E7 FF E8 E8 E8 FF E3 E3' + 'E3 FF D8 D8 D8 FF D2 D2 D2 FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF C8 C9 C9 FF AA AA AA FF 2E 2E' + '2E FF 00 00 00 FF 00 00 00 FF 1F 1F 1F FF 18 18' + '18 FF EA EA EA FF E6 E6 E6 FF E8 E8 E8 FF E8 E8' + 'E8 FF EA EA EA FF EA EA EA FF EB EB EB FF EB EB' + 'EB FF EC EC EC FF 00 00 00 1B 19 19 19 FF AD A8' + 'AB FF EB EB EB FF E8 E8 E8 FF E8 E8 E8 FF 00 FF' + '00 FF 00 FF 00 FF 00 C0 00 FF DF DF DF FF D5 D5' + 'D5 FF D2 D2 D2 FF CB CB CB FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF CD CD CD FF 40 40 40 FF 2E 2E' + '2E FF 00 00 00 FF 00 00 00 FF 15 15 15 FF 13 13' + '13 FF E9 E9 E9 FF E7 E7 E7 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 00 00 00 3A 28 28 28 FF D1 D1' + 'D1 FF EB EB EB FF EB EB EB FF E8 E8 E8 FF E8 E8' + 'E8 FF 00 FF 00 FF B5 B5 B5 FF B6 B6 B6 FF 3B 3B' + '3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B' + '3B FF 3B 3B 3B FF 3B 3B 3B FF B6 B6 B6 FF B6 B6' + 'B6 FF 00 00 00 FF 00 00 00 FF 0A 0A 0A FF 0D 0D' + '0D FF E8 E8 E8 FF E7 E7 E7 FF E3 E3 E3 FF E3 E3' + 'E3 FF E4 E4 E4 FF E4 E4 E4 FF E6 E6 E6 FF E6 E6' + 'E6 FF E7 E7 E7 FF 00 00 00 39 28 28 28 FF D1 D1' + 'D1 FF E8 E8 E8 FF EB EB EB FF E8 E8 E8 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 24 24 24 FF 1F 1F 1F FF 07 07 07 FF 0A 0A' + '0A FF E5 E5 E5 FF E7 E7 E7 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 99 99 99 FF 99 99 99 FF 99 99' + '99 FF 99 99 99 FF 00 00 00 39 27 27 27 FF D2 D2' + 'D2 FF EA EA EA FF EB EB EB FF EB EB EB FF A7 A7' + 'A7 FF AB AB AB FF AE AE AE FF AF AF AF FF AF AF' + 'AF FF AF AF AF FF AF AF AF FF AB AB AB FF AB AB' + 'AB FF AB AB AB FF AB AB AB FF AB AB AB FF AB AB' + 'AB FF 32 32 32 FF 0C 0C 0C FF 00 00 00 FF 00 00' + '00 FF E5 E5 E5 FF E5 E5 E5 FF E7 E7 E7 FF E7 E7' + 'E7 FF E9 E9 E9 FF E9 E9 E9 FF EA EA EA FF EA EA' + 'EA FF EB EB EB FF 00 00 00 39 26 26 26 FF D3 D3' + 'D3 FF EB EB EB FF ED ED ED FF E9 E9 E9 FF E8 E8' + 'E8 FF E4 E4 E4 FF E2 E2 E2 FF DC DC DC FF D8 D8' + 'D8 FF D2 D2 D2 FF D2 D2 D2 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF 37 37 37 FF 02 02 02 FF 04 04 04 FF 04 04' + '04 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 37 24 24 24 FF D6 D6' + 'D6 FF E9 E9 E9 FF E1 E1 E1 FF E2 E2 E2 FF E0 E0' + 'E0 FF DF DF DF FF DF DF DF FF DF DF DF FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF 3F 3F 3F FF 0D 0D 0D FF 12 12 12 FF 16 16' + '16 FF 21 21 21 FF 26 26 26 FF 3C 3C 3C FF 44 44' + '44 FF 46 46 46 FF 46 46 46 FF 2C 2C 2C FF 2C 2C' + '2C FF 2C 2C 2C FF 00 00 00 34 24 24 24 FF DE DE' + 'DE FF D9 D9 D9 FF C4 C4 C4 FF BF BF BF FF D8 D8' + 'D8 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF 44 44 44 FF 23 23 23 FF 1B 1B 1B FF 20 20' + '20 FF 2B 2B 2B FF 35 35 35 FF 44 44 44 FF 47 47' + '47 FF 46 46 46 FF 46 46 46 FF 2C 2C 2C FF 2C 2C' + '2C FF 2C 2C 2C FF 00 00 00 07 05 05 05 FF C2 C2' + 'C2 FF BC BC BC FF B2 B2 B2 FF AB AB AB FF BB BB' + 'BB FF D5 D5 D5 FF D5 D5 D5 FF D4 D4 D4 FF D3 D3' + 'D3 FF D5 D5 D5 FF D7 D7 D7 FF D8 D8 D8 FF D7 D7' + 'D7 FF D3 D3 D3 FF D3 D3 D3 FF D4 D4 D4 FF D5 D5' + 'D5 FF 4B 4B 4B FF 4C 4C 4C FF 2E 2E 2E FF 33 33' + '33 FF 45 45 45 FF 44 44 44 FF 4B 4B 4B FF 4B 4B' + '4B FF 3C 3C 3C FF 32 32 32 FF 25 25 25 FF 1C 1C' + '1C FF 16 16 16 FF 00 00 00 00 00 00 00 FF A4 A4' + 'A4 FF CF CF CF FF C5 C5 C5 FF BF BF BF FF C9 C9' + 'C9 FF D2 D2 D2 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D0 D0 D0 FF D4 D4 D4 FF D0 D0' + 'D0 FF 52 52 52 FF 57 57 57 FF 35 35 35 FF 3F 3F' + '3F FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C' + '8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C 8C FF 8C 8C' + '8C FF 8C 8C 8C FF 00 00 00 00 00 00 00 FF 59 59' + '59 FF D0 D0 D0 FF CD CD CD FF CD CD CD FF CA CA' + 'CA FF D3 D3 D3 FF D3 D3 D3 FF D4 D4 D4 FF D5 D5' + 'D5 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D5 D5 D5 FF DB DB DB FF E4 E4' + 'E4 FF 5E 5E 5E FF 5E 5E 5E FF 6A 6A 6A FF 44 44' + '44 FF 8E 8E 8E FF FF FF FF FF 8B 86 84 FF 87 80' + '7D FF D0 B3 A3 FF EC C0 A7 FF E9 B6 99 FF E9 B6' + '99 FF E9 B6 99 FF 00 00 00 00 00 00 00 FF 40 40' + '40 FF D2 D2 D2 FF CA CA CA FF CA CA CA FF D4 D4' + 'D4 FF D3 D3 D3 FF D3 D3 D3 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D3 D3 D3 FF D2 D2' + 'D2 FF D3 D3 D3 FF D2 D2 D2 FF D1 D1 D1 FF D0 D0' + 'D0 FF 5E 5E 5E FF 5E 5E 5E FF 6A 6A 6A FF 44 44' + '44 FF 8E 8E 8E FF FF FF FF FF 8B 86 84 FF 87 80' + '7D FF D0 B3 A3 FF EC C0 A7 FF E9 B6 99 FF E9 B6' + '99 FF E9 B6 99 FF 00 00 00 00 00 00 00 F4 07 07' + '07 FF DD DD DD FF CC CC CC FF D3 D3 D3 FF D3 D3' + 'D3 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF 65 65 65 FF 6A 6A 6A FF 71 71 71 FF 79 79' + '79 FF 9E 9E 9E FF FF FF FF FF 52 52 52 FF 4E 4E' + '4E FF F2 D6 C7 FF EF CC B8 FF E9 B8 9C FF E9 B6' + '99 FF E9 B6 99 FF 00 00 00 00 00 00 00 BA 00 00' + '00 FF DD DD DD FF CF CF CF FF D3 D3 D3 FF D3 D3' + 'D3 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF CF CF CF FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF 3C 3C 3C FF 6A 6A 6A FF 71 71 71 FF 79 79' + '79 FF AA AA AA FF FF FF FF FF 50 50 50 FF 4C 4C' + '4C FF F4 DD D0 FF F1 D2 C2 FF EB BE A5 FF E9 B6' + '99 FF E9 B6 99 FF 00 00 00 00 00 00 00 4D 00 00' + '00 FF D8 D8 D8 FF D4 D4 D4 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF A3 A3 9E FF DA DA D8 FF DA DA D8 FF DA DA' + 'D8 FF D5 CB C4 FF D2 C3 B9 FF CE B6 A6 FF CC AF' + '9D FF CA A8 94 FF 00 00 00 00 00 00 00 1A 00 00' + '00 FF CC CC CC FF D6 D6 D6 FF D3 D3 D3 FF D3 D3' + 'D3 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF CC CC CC FF C9 C9' + 'C9 FF C4 C4 C4 FF C2 C2 C2 FF BD BD BD FF D0 D0' + 'D0 FF 09 09 09 FF 00 00 00 FF 00 00 00 6C 00 00' + '00 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00' + '00 D2 97 97 97 FF DC DC DC FF DC DC DC FF DE DE' + 'DE FF DE DE DE FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF E7 E7 E7 FF E7 E7 E7 FF DC DC DC FF C6 C6' + 'C6 FF 00 00 00 FF 00 00 00 FF 00 00 00 59 00 00' + '00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 AF 77 77 77 FF D3 D3 D3 FF E1 E1 E1 FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E1 E1 E1 FF E1 E1' + 'E1 FF E7 E7 E7 FF E7 E7 E7 FF D9 D9 D9 FF BB BB' + 'BB FF 00 00 00 FF 00 00 00 FF 00 00 00 40 00 00' + '00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 66 35 35 35 FF BD BD BD FF E6 E6 E6 FF E6 E6' + 'E6 FF E7 E7 E7 FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E6 E6 E6 FF D4 D4 D4 FF 9A 9A' + '9A FF 00 00 00 FF 00 00 00 A4 00 00 00 2B 00 00' + '00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 2D 1E 1E 1E FF AB AB AB FF ED ED ED FF E7 E7' + 'E7 FF EC EC EC FF EB EB EB FF ED ED ED FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EC EC' + 'EC FF E5 E5 E5 FF EB EB EB FF D6 D6 D6 FF 8A 8A' + '8A FF 00 00 00 FF 00 00 00 7B 00 00 00 1B 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 FF 8D 8D 8D FF C4 C4 C4 FF B2 B2' + 'B2 FF B2 B2 B2 FF EB EB EB FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F3 F3 F3 FF D5 D5' + 'D5 FF B6 B6 B6 FF B7 B7 B7 FF CD CD CD FF 61 61' + '61 FF 00 00 00 FF 00 00 00 50 00 00 00 0F 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 FF 64 64 64 FF DD DD DD FF DC DC' + 'DC FF E4 E4 E4 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF FA FA FA FF F2 F2' + 'F2 FF D8 D8 D8 FF DC DC DC FF B0 B0 B0 FF 34 34' + '34 FF 00 00 00 E5 00 00 00 31 00 00 00 04 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 9C 00 00 00 FF 3D 3D 3D FF 49 49' + '49 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 49 49 49 FF 49 49 49 FF 02 02 02 FF 00 00' + '00 FF 00 00 00 49 00 00 00 14 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 06 00 00 00 7F 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FA 00 00' + '00 7C 00 00 00 12 00 00 00 04 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF E0 00 FF FF E0 00 FF FF' + 'E0 00 C0 00 00 00 80 00 00 00 80 00 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 00 00 00 80 00 00 00 80 00' + '00 00 80 00 00 00 80 00 00 00 80 00 00 00 80 00' + '00 1F 80 00 00 1F C0 00 00 1F C0 00 00 1F C0 00' + '00 1F E0 00 00 3F E0 00 00 3F E0 00 00 7F E0 00' + '00 7F FF FF FF FF 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 FF 00 00 00 FF 00 00 00 FF FF C0' + 'C0 FF FF C0 C0 FF FF C0 C0 FF FF C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 FF 36 36 30 FF 00 00 00 FF C0 00' + '00 FF C0 00 00 FF C0 00 00 FF C0 00 00 FF 00 00' + '00 00 00 00 00 16 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 FF 30 30 2C FF 00 00 00 FF FF C0' + 'C0 FF FF C0 C0 FF FF C0 C0 FF FF C0 C0 FF 00 00' + '00 54 90 90 90 FF AB AC AC FF CC CC CC FF C4 C4' + 'C4 FF C2 C2 C2 FF C1 C1 C1 FF BC BC BC FF BD BD' + 'BD FF 00 00 00 FF 18 18 18 FF 00 00 00 FF E0 E0' + 'E0 FF E1 E1 E1 FF E2 E2 E2 FF E3 E3 E3 FF 00 00' + '00 FA EA EA EA FF E8 E8 E8 FF 00 FF 00 FF CB CB' + 'CB FF 66 66 66 FF 66 66 66 FF 66 66 66 FF CD CD' + 'CD FF 00 00 00 FF 00 00 00 FF 00 00 00 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF 00 00' + '00 F9 EF EF EF FF EB EB EB FF 3B 3B 3B FF 3B 3B' + '3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B 3B FF 3B 3B' + '3B FF 00 00 00 FF 02 02 02 FF 00 00 00 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF 00 00' + '00 F9 F7 F7 F7 FF F6 F6 F6 FF F5 F5 F5 FF F3 F3' + 'F3 FF F2 F2 F2 FF F1 F1 F1 FF F0 F0 F0 FF EF EF' + 'EF FF 00 00 00 FF 09 09 09 FF 10 10 10 FF 1E 1E' + '1E FF 42 42 42 FF 46 46 46 FF 2C 2C 2C FF 00 00' + '00 F7 F3 F3 F3 FF B7 B7 B7 FF DA DA DA FF D8 D8' + 'D8 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D8 D8' + 'D8 FF 00 00 00 FF 1F 1F 1F FF 2F 2F 2F FF 44 44' + '44 FF 49 49 49 FF 2C 2C 2C FF 1C 1C 1C FF 00 00' + '00 73 EF EF EF FF CB CB CB FF CE CE CE FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF 00 00 00 FF 5D 5D 5D FF 00 00 00 FF F9 EE' + 'E8 FF F0 CF BC FF E9 B6 99 FF E9 B6 99 FF 00 00' + '00 25 B7 B7 B7 FF CB CB CB FF D3 D3 D3 FF D0 D0' + 'D0 FF D0 D0 D0 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF 00 00 00 FF 6A 6A 6A FF 00 00 00 FF B8 B6' + 'B6 FF 5B 58 57 FF EA BC A1 FF E9 B6 99 FF 00 00' + '00 00 5F 5F 5F FF D2 D2 D2 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF 00 00 00 FF 79 79 79 FF 00 00 00 FF E0 E0' + 'E0 FF D9 D1 CC FF F0 CF BC FF EA BB A0 FF 00 00' + '00 00 18 18 18 FF DB DB DB FF DE DE DE FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF D9 D9 D9 FF 7A 7A 7A FF 00 00' + '00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 FF E5 E5 E5 FF EB EB EB FF EB EB' + 'EB FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5' + 'E5 FF E7 E7 E7 FF E6 E6 E6 FF 20 20 20 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 DD E4 E4 E4 FF C1 C1 C1 FF ED ED' + 'ED FF EE EE EE FF EB EB EB FF ED ED ED FF ED ED' + 'ED FF C2 C2 C2 FF EC EC EC FF 00 00 00 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 44 80 80 80 FF D7 D7 D7 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D9 D9 D9 FF B0 B0 B0 FF 00 00 00 ED 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 2C 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 70 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 80' + '00 00 FF 80 00 00 80 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 00 00 00 80 07 00 00 80 0F' + '00 00 80 0F 00 00 80 0F 00 00 C0 1F 00 00' +} */ + + +/* BINRES drive.ico */ +8 ICON drive.ico +/* { + '00 00 01 00 08 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 86 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 2E 09 00 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 96 0E 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 7E 11 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 A6 12 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 4E 21 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 F6 46 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 9E 57 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 11 00 00 00 00 11 00 00 11 11 11 00 22 22' + '22 00 33 33 33 00 44 44 44 00 55 55 55 00 66 66' + '66 00 77 77 77 00 7F 7F 7F 00 00 CC 66 00 66 99' + '99 00 33 CC 99 00 66 CC 99 00 88 88 88 00 99 99' + '99 00 AA AA AA 00 BB BB BB 00 99 CC 99 00 CC CC' + 'CC 00 DD DD DD 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 18 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 54 00 56 00 00 EC FD 7F 1A 02' + '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 54 00' + '00 00 00 00 00 00 03 00 00 00 5C 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 50 6C' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 64 72 69 76 65 2E 69 63 6F' + '00 00 1A 93 4B 00 14 1A 95 00 1F 3B D4 77 13 00' + '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 18 6C' + '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' + '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' + '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 18 6C' + '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 18 18 18 18 18 18 18 18 18 18 18 18 18 18' + '18 18 18 18 18 02 18 18 18 18 00 00 00 00 00 00' + '00 18 18 03 03 04 03 04 03 03 04 03 03 04 03 03' + '04 03 03 04 03 03 03 04 01 18 18 00 00 00 00 00' + '18 18 06 12 14 12 12 12 12 11 12 12 12 12 12 12' + '12 12 12 12 12 11 0F 10 0C 04 18 18 00 00 00 00' + '18 18 12 16 16 11 07 08 0F 10 11 12 12 11 12 12' + '12 12 12 12 12 12 0D 0B 10 0F 18 18 00 00 00 00' + '18 03 14 16 16 11 06 0F 0F 10 11 11 11 11 10 10' + '11 11 10 11 11 12 13 0E 12 0F 18 18 00 00 00 00' + '18 03 14 16 16 12 09 09 0F 10 10 11 12 0F 0F 10' + '0F 10 0F 10 11 14 12 12 14 10 18 18 00 00 00 00' + '18 03 15 16 16 12 08 0F 0F 10 11 11 12 10 09 0F' + '10 0F 0F 0F 11 14 14 12 14 0F 18 18 00 00 00 00' + '18 03 14 17 15 16 15 15 15 15 15 14 15 14 15 14' + '14 14 14 14 14 14 14 12 14 0F 18 18 00 00 00 00' + '18 03 14 17 17 16 17 17 16 17 16 17 16 17 16 17' + '16 17 16 17 16 16 16 17 15 10 18 18 00 00 00 00' + '18 03 15 16 15 15 15 15 15 15 15 15 15 15 15 15' + '15 15 15 15 15 15 15 15 17 10 18 18 00 00 00 00' + '18 03 15 15 11 11 14 15 15 14 15 15 14 15 14 15' + '14 15 14 15 14 12 11 12 16 10 18 18 00 00 00 00' + '18 18 11 15 12 12 12 14 14 15 15 15 15 16 15 16' + '15 15 15 14 15 11 12 12 16 09 18 18 00 00 00 00' + '18 18 0F 16 14 14 14 15 15 15 16 15 15 15 15 15' + '15 16 15 15 14 15 14 14 16 07 18 18 00 00 00 00' + '00 18 08 16 14 14 14 15 15 15 14 15 15 14 15 14' + '15 14 15 15 16 14 14 14 15 05 18 00 00 00 00 00' + '00 18 05 15 14 14 15 15 14 14 14 14 14 14 14 14' + '14 14 14 14 14 15 14 14 14 03 18 00 00 00 00 00' + '00 18 04 14 14 14 15 14 14 14 15 14 14 14 14 14' + '12 14 14 14 14 14 14 14 11 18 18 00 00 00 00 00' + '00 18 18 12 15 14 15 14 15 14 14 14 15 14 14 12' + '14 12 12 14 14 14 12 15 0F 18 18 00 00 00 00 00' + '00 18 18 10 15 14 14 15 14 15 14 15 14 14 15 15' + '14 12 14 12 12 12 12 14 08 18 18 00 00 00 00 00' + '00 18 18 09 15 15 14 15 14 15 15 15 15 15 14 15' + '15 15 15 15 15 12 14 14 06 18 18 00 00 00 00 00' + '00 00 18 06 15 15 15 14 16 15 15 15 15 15 15 15' + '15 15 15 15 14 15 15 14 05 18 00 00 00 00 00 00' + '00 00 18 05 14 16 15 15 14 15 15 16 15 16 16 15' + '16 15 15 15 15 15 15 11 03 18 00 00 00 00 00 00' + '00 00 18 04 11 15 16 16 16 15 15 15 15 15 15 15' + '15 15 15 15 16 16 15 10 18 18 00 00 00 00 00 00' + '00 00 18 18 11 16 14 14 15 16 16 15 16 15 15 16' + '15 16 16 15 12 15 15 09 18 18 00 00 00 00 00 00' + '00 00 18 18 0F 15 14 12 16 17 17 17 17 17 17 17' + '17 17 17 15 14 14 15 07 18 18 00 00 00 00 00 00' + '00 00 00 18 04 10 15 15 15 15 15 15 15 15 15 15' + '15 15 15 15 15 14 09 03 18 00 00 00 00 00 00 00' + '00 00 00 18 18 03 04 04 04 04 04 04 04 04 04 04' + '04 04 04 04 04 04 18 18 18 00 00 00 00 00 00 00' + '00 00 00 00 18 18 18 18 18 18 18 18 18 18 18 18' + '18 18 18 18 18 18 18 18 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF FF FF FF FF FF FF F0 00 00 0F E0 00' + '00 07 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 F0 00 00 0F F0 00 00 0F F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F8 00 00 1F F8 00' + '00 1F FC 00 00 3F FF FF FF FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 11 00 11 11' + '11 00 22 00 00 00 22 22 22 00 44 44 44 00 55 55' + '55 00 66 66 66 00 77 77 77 00 7F 7F 7F 00 33 CC' + '99 00 88 88 88 00 99 99 99 00 AA AA AA 00 BB BB' + 'BB 00 99 CC 99 00 CC CC CC 00 DD DD DD 00 EE EE' + 'EE 00 00 00 00 00 CC CC CC 00 DD DD DD 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 77 13 00 00 00 18 0A' + '38 00 00 00 38 00 18 6C 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' + 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 86 00' + '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 77 38 9F 07 00 CD 8B F5 77 78 13' + '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 54 00' + '56 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 40 9F' + '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' + 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' + 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' + 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 77 00 EC FD 7F 54 00 00 00 00 00 00 00 03 00' + '00 00 5C 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 50 6C 0C 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 64' + '72 69 76 65 2E 69 63 6F 00 00 1A 93 4B 00 14 1A' + '95 00 1F 3B D4 77 13 00 00 00 98 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 18 6C 38 00 86 00 00 00 00 00' + '00 00 C9 F1 E7 77 86 00 00 00 A4 1A 95 00 08 00' + '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 18 6C 38 00 86 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 13 13 02 02 02 02 02 02 02' + '02 02 03 01 13 00 00 13 0C 0E 0B 0C 0D 0E 0D 0E' + '0E 0D 0A 07 13 00 00 02 11 10 07 0B 0D 0D 0C 0C' + '0C 0E 0F 0C 13 00 00 02 11 11 0C 0D 0E 0E 0C 0D' + '0C 0E 10 0D 13 00 00 02 11 12 12 12 11 11 12 11' + '11 11 11 0E 13 00 00 13 10 0E 10 10 11 11 11 11' + '11 10 10 0E 13 00 00 13 0D 10 10 11 11 11 11 11' + '11 10 11 0B 13 00 00 13 0B 11 11 11 10 10 10 11' + '10 10 11 07 13 00 00 13 07 11 10 10 11 10 10 0E' + '10 10 10 06 13 00 00 13 05 10 11 11 10 11 11 10' + '11 10 10 04 13 00 00 13 04 11 11 11 11 11 11 11' + '11 11 0E 02 13 00 00 00 13 0E 11 12 12 12 12 12' + '11 12 0D 13 00 00 00 00 13 08 10 11 11 12 11 12' + '10 10 07 13 00 00 00 00 13 13 04 02 04 02 04 02' + '04 02 13 13 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 FF FF 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 80 00 00 00 00 80 82 00 00 00 00 00' + '87 77 77 77 77 77 77 77 77 87 88 88 00 00 00 00' + '7F F7 88 87 87 77 77 77 77 77 2E 88 00 00 00 00' + '7F F8 88 88 78 78 77 88 77 77 77 78 00 00 00 00' + 'F7 F7 88 78 77 77 88 87 88 77 77 78 00 00 00 08' + '7F 77 88 88 87 78 88 78 88 77 77 77 00 00 00 00' + '7F FF 77 77 F7 77 77 77 77 77 77 78 00 00 00 00' + '7F FF FF FF FF FF FF FF FF 7F FF F8 00 00 00 04' + '7F 77 F7 FF 7F 7F 77 F7 F7 FF 77 F8 00 00 00 00' + 'F7 77 7F 77 7F 77 F7 F7 7F 77 77 77 00 00 00 00' + '77 77 77 77 F7 FF 7F 77 F7 77 77 F8 00 00 00 00' + '8F 77 77 FF 7F 77 F7 FF 7F 77 77 F8 00 00 00 00' + '8F 77 7F F7 F7 7F 7F 77 F7 7F 7F 78 00 00 00 00' + '8F 77 F7 77 7F 77 77 F7 7F 77 77 70 00 00 00 00' + '87 7F 77 7F 77 F7 7F 77 77 7F 77 70 00 00 00 00' + '07 77 F7 77 F7 77 77 77 77 77 7F 80 00 00 00 00' + '08 7F 77 F7 77 7F 77 77 77 77 77 80 00 00 00 00' + '08 F7 7F 7F 7F 77 F7 F7 F7 77 77 80 00 00 00 00' + '08 7F 77 F7 F7 FF 7F 7F 7F 77 F7 80 00 00 00 00' + '04 7F 7F 7F 7F 7F F7 F7 F7 F7 77 00 00 00 00 00' + '08 8F FF 77 F7 F7 7F 7F 7F 7F F8 00 00 00 00 00' + '00 77 77 FF 7F 7F F7 F7 FF 77 F8 00 00 00 00 00' + '00 8F 77 FF FF FF FF FF F7 7F 78 00 00 00 00 00' + '00 48 7F 77 F7 F7 7F 7F 77 F7 80 00 00 00 00 00' + '00 00 80 48 08 04 80 80 48 04 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF FF FF FF FF FF FF F0 00 00 0F E0 00' + '00 07 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 F0 00 00 0F F0 00 00 0F F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F8 00 00 1F F8 00' + '00 1F FC 00 00 3F FF FF FF FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' + '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '80 00 00 02 00 00 00 87 88 77 77 77 68 00 00 F7' + '88 87 87 87 78 00 08 77 87 77 87 87 77 00 00 FF' + 'F7 FF 7F 7F 77 00 00 77 77 F7 F7 F7 77 00 00 77' + '7F 77 F7 7F 78 00 00 87 F7 7F 77 F7 F8 00 00 8F' + '77 F7 77 77 78 00 00 87 7F 77 7F 77 78 00 00 47' + 'F7 F7 F7 F7 70 00 00 07 F7 FF 7F 7F 70 00 00 08' + '7F 7F F7 F7 80 00 00 00 04 08 00 40 00 00 00 00' + '00 00 00 00 00 00 FF FF 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 FF FF 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 11 00 11 11 11 00 22 22 22 00 33 33' + '33 00 44 44 44 00 55 55 55 00 66 66 66 00 77 77' + '77 00 7F 7F 7F 00 00 99 66 00 33 99 66 00 00 CC' + '66 00 33 CC 66 00 66 99 99 00 88 88 88 00 99 99' + '99 00 AA AA AA 00 BB BB BB 00 99 CC 99 00 99 FF' + '99 00 99 CC CC 00 CC CC CC 00 DD DD DD 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 18 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 54 00 56 00 00 EC FD 7F 1A 02' + '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 54 00' + '00 00 00 00 00 00 03 00 00 00 5C 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 50 6C' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 64 72 69 76 65 2E 69 63 6F' + '00 00 1A 93 4B 00 14 1A 95 00 1F 3B D4 77 13 00' + '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 18 6C' + '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' + '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' + '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 18 6C' + '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' + '1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' + '1A 1A 1A 1A 1A 1A 1A 00 00 00 00 00 00 00 00 00' + '00 00 00 00 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' + '1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' + '1A 1A 1A 1A 1A 1A 1A 1A 1A 00 00 00 00 00 00 00' + '00 00 00 1A 1A 1A 1A 02 03 03 04 03 03 04 03 03' + '04 03 03 04 03 03 03 04 03 03 03 03 04 03 03 04' + '03 03 03 04 01 1A 1A 1A 1A 00 00 00 00 00 00 00' + '00 00 00 1A 1A 03 10 16 16 16 16 16 16 16 16 16' + '12 16 12 12 16 12 12 12 16 12 12 12 12 12 12 11' + '12 12 11 11 11 07 1A 1A 1A 00 00 00 00 00 00 00' + '00 00 1A 1A 1A 0F 17 18 18 17 0F 0F 10 10 10 11' + '12 16 12 16 16 16 16 17 16 16 16 17 16 16 16 16' + '16 11 0B 0B 13 12 06 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 02 16 18 17 17 16 04 05 06 08 0F 0F' + '11 10 11 11 12 11 10 12 10 12 10 16 10 12 10 16' + '12 0D 0C 0A 0B 16 08 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 03 16 18 17 18 17 05 06 08 0F 10 10' + '10 11 11 12 12 10 10 12 0F 12 10 12 10 12 0F 12' + '16 10 15 14 0E 16 0F 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 04 17 18 18 17 16 07 08 08 0F 0F 10' + '10 11 11 11 12 11 08 12 08 11 0F 12 0F 12 08 16' + '16 12 11 10 16 12 10 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 03 16 18 17 18 17 07 08 08 0F 0F 10' + '11 11 11 11 12 10 08 11 07 10 08 11 0F 11 07 12' + '12 16 12 16 12 16 0F 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 03 17 18 18 17 17 07 07 08 0F 0F 0F' + '10 11 10 11 12 0F 07 11 06 10 07 12 07 11 06 16' + '16 12 16 12 12 16 0F 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 03 16 18 18 18 17 11 11 11 11 11 12' + '11 12 12 12 12 12 11 12 11 12 12 12 11 12 11 12' + '16 12 16 12 16 12 10 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 03 17 18 18 18 18 17 18 18 18 17 17' + '18 17 17 17 17 17 17 17 17 17 16 17 16 16 16 16' + '16 16 12 16 12 16 0F 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 03 16 18 19 19 18 19 19 18 18 18 19' + '18 19 18 19 18 18 18 18 18 18 18 18 18 18 18 18' + '18 18 18 18 17 17 0F 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 03 17 19 17 17 18 17 17 18 17 17 17' + '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17' + '18 17 18 17 19 18 0F 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 03 17 19 17 16 12 12 17 16 17 17 16' + '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17' + '16 12 12 16 17 19 10 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 03 17 18 16 11 11 11 16 17 17 16 17' + '17 16 17 16 17 17 16 17 16 17 16 17 16 17 17 16' + '11 12 11 12 16 19 10 1A 1A 1A 00 00 00 00 00 00' + '00 00 1A 1A 1A 12 19 12 11 16 11 12 17 16 17 17' + '16 17 16 17 16 16 17 16 17 16 17 16 17 17 16 16' + '11 12 12 11 17 19 08 1A 1A 1A 00 00 00 00 00 00' + '00 00 00 1A 1A 11 18 16 16 16 16 16 16 17 16 16' + '17 17 17 18 18 18 18 18 17 18 17 17 16 16 17 16' + '16 16 12 16 16 18 06 1A 1A 00 00 00 00 00 00 00' + '00 00 00 1A 1A 08 18 17 16 16 16 16 16 16 17 18' + '18 17 17 17 17 17 17 17 17 17 17 18 18 18 16 16' + '16 16 16 16 17 17 04 1A 1A 00 00 00 00 00 00 00' + '00 00 00 1A 1A 06 18 16 16 16 16 16 17 18 18 17' + '16 17 17 17 16 17 17 16 17 17 16 17 17 17 18 17' + '16 16 16 16 17 12 03 1A 1A 00 00 00 00 00 00 00' + '00 00 00 1A 1A 05 17 16 16 16 16 16 18 17 16 16' + '16 17 16 16 16 17 16 16 17 16 16 17 16 16 17 18' + '16 16 16 16 17 11 1A 1A 1A 00 00 00 00 00 00 00' + '00 00 00 1A 1A 03 12 17 16 16 16 18 16 16 17 16' + '17 16 17 16 16 16 16 16 16 16 16 16 16 16 16 16' + '18 16 16 16 17 0F 1A 1A 1A 00 00 00 00 00 00 00' + '00 00 00 1A 1A 1A 10 17 16 16 17 16 17 16 16 16' + '16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16' + '16 17 12 16 17 06 1A 1A 1A 00 00 00 00 00 00 00' + '00 00 00 00 1A 1A 0F 17 17 16 17 16 16 17 16 17' + '16 17 16 16 16 16 16 16 12 16 12 16 16 16 12 16' + '16 16 16 16 17 05 1A 1A 00 00 00 00 00 00 00 00' + '00 00 00 00 1A 1A 06 17 16 16 16 17 16 16 16 16' + '16 16 16 16 17 16 16 12 16 12 16 12 16 12 16 12' + '16 12 16 16 17 03 1A 1A 00 00 00 00 00 00 00 00' + '00 00 00 00 1A 1A 05 17 16 17 16 16 17 16 17 16' + '17 16 17 16 16 17 16 16 16 12 16 12 12 12 16 12' + '12 16 12 16 11 03 1A 1A 00 00 00 00 00 00 00 00' + '00 00 00 00 1A 1A 03 16 17 16 16 17 16 17 16 17' + '16 17 16 16 17 16 16 17 16 17 16 16 16 16 12 16' + '16 11 12 16 11 1A 1A 1A 00 00 00 00 00 00 00 00' + '00 00 00 00 1A 1A 02 12 17 17 16 16 17 17 17 17' + '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 16' + '16 16 16 16 08 1A 1A 1A 00 00 00 00 00 00 00 00' + '00 00 00 00 1A 1A 1A 10 17 17 17 16 17 17 17 17' + '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17' + '16 17 17 16 06 1A 1A 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1A 1A 08 17 17 18 17 16 17 17 17' + '17 17 18 17 17 18 17 17 17 17 17 17 18 17 17 16' + '17 17 17 12 04 1A 1A 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1A 1A 06 16 17 17 18 17 17 16 17' + '17 18 17 18 17 17 18 17 17 18 18 17 17 16 16 18' + '17 18 16 11 03 1A 1A 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1A 1A 04 12 18 17 17 18 17 17 16' + '17 17 17 17 18 17 17 18 17 17 17 17 16 17 18 17' + '18 17 17 10 1A 1A 1A 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1A 1A 02 11 18 18 18 18 18 18 18' + '17 17 17 17 17 17 17 17 17 17 17 17 18 18 17 18' + '17 18 17 0F 1A 1A 1A 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1A 1A 1A 11 17 17 12 12 17 18 18' + '18 18 18 18 18 17 18 18 18 18 18 18 18 17 16 12' + '17 18 16 08 1A 1A 1A 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 1A 1A 0F 17 16 11 12 11 18 18' + '18 18 18 18 18 18 18 18 18 18 18 18 18 17 11 12' + '11 18 16 07 1A 1A 1A 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 1A 1A 07 16 17 17 17 17 19 19' + '19 19 19 19 19 19 19 19 19 19 19 19 19 18 17 17' + '17 17 11 04 1A 1A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 1A 1A 02 0F 12 17 17 17 17 17' + '17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17' + '17 11 07 1A 1A 1A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 1A 1A 1A 1A 05 05 05 05 05 05' + '05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05' + '05 04 1A 1A 1A 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 1A 1A 1A 1A 1A 1A 1A 1A 1A' + '1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' + '1A 1A 1A 1A 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 1A 1A 1A 1A 1A 1A 1A' + '1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A 1A' + '1A 1A 1A 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF 00' + '00 00 00 7F 00 00 FC 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FF 00' + '00 00 00 7F 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 01 FF 00 00 FF 80' + '00 00 03 FF 00 00 FF E0 00 00 07 FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00' + '00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 16 00 00 00 34 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 35 00 00 00 18 00 00 00 04 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 05 00 00 00 69 00 00 00 C5 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F1 00 00 00 B1 00 00 00 5C 00 00 00 0D 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00' + '00 9B 00 00 00 FF 00 00 00 FF 21 21 21 FF 2C 2C' + '2C FF 2B 2B 2B FF 2C 2C 2C FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2E 2C 2D FF 2E 2C 2D FF 13 13' + '13 FF 00 00 00 FF 00 00 00 F6 00 00 00 69 00 00' + '00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00' + '00 FF 26 26 26 FF 90 90 90 FF CA CA CA FF CD CD' + 'CD FF CB CB CB FF CE CE CE FF CD CD CD FF CC CC' + 'CC FF CB CB CB FF C9 C9 C9 FF C7 C7 C7 FF C6 C6' + 'C6 FF C5 C5 C5 FF C4 C4 C4 FF C3 C3 C3 FF C2 C2' + 'C2 FF C2 C2 C2 FF C3 C3 C3 FF C0 C0 C0 FF C1 C1' + 'C1 FF BF BF BF FF BF BF BF FF BC BC BC FF BD BD' + 'BD FF BA BA BA FF BB BB BB FF B5 B5 B5 FF B3 B4' + 'B3 FF B8 B4 B6 FF AD AD AD FF AB AC AC FF AD A8' + 'AB FF 63 63 63 FF 09 09 09 FF 00 00 00 EF 00 00' + '00 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 03 00 00 00 AD 01 01' + '01 FF 8A 8A 8A FF EB EB EB FF E8 E8 E8 FF E7 E7' + 'E7 FF D5 D5 D5 FF 85 85 85 FF 88 88 88 FF 92 92' + '92 FF 98 98 98 FF A2 A2 A2 FF AD AD AD FF BA BA' + 'BA FF C0 C0 C0 FF C3 C3 C3 FF C6 C6 C6 FF CB CB' + 'CB FF CA CA CA FF CA CA CA FF D6 D6 D6 FF CA CA' + 'CA FF D3 D3 D3 FF CB CB CB FF D7 D7 D7 FF CC CC' + 'CC FF D4 D4 D4 FF C7 C7 C7 FF C8 C9 C9 FF C6 C2' + 'C4 FF 9D B3 A8 FF 20 A8 63 FF 1C A8 60 FF 90 AF' + 'A0 FF BF BB BD FF 4F 4F 4F FF 00 00 00 FF 00 00' + '00 81 00 00 00 04 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 15 00 00 00 F0 19 19' + '19 FF C7 C7 C7 FF EC EC EC FF E2 E2 E2 FF E6 E6' + 'E6 FF CB CB CB FF 3B 3B 3B FF 3F 3F 3F FF 56 56' + '56 FF 72 72 72 FF 87 87 87 FF 92 92 92 FF 9D 9D' + '9D FF A5 A5 A5 FF A8 A8 A8 FF AC AC AC FF B7 B7' + 'B7 FF A9 A9 A9 FF 9C 9C 9C FF BD BD BD FF 99 99' + '99 FF B7 B7 B7 FF A1 A1 A1 FF C3 C3 C3 FF A3 A3' + 'A3 FF BD BD BD FF 98 98 98 FF C5 C4 C4 FF C7 BF' + 'C3 FF 51 A7 7C FF 17 CE 71 FF 0A BF 61 FF 2F 99' + '64 FF C3 BD C0 FF 84 83 84 FF 01 01 01 FF 00 00' + '00 A3 00 00 00 0B 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 30 00 00 00 FA 29 29' + '29 FF D1 D1 D1 FF EA EA EA FF E4 E4 E4 FF E7 E7' + 'E7 FF CD CD CD FF 47 47 47 FF 5F 5F 5F FF 79 79' + '79 FF 87 87 87 FF 8F 8F 8F FF 97 97 97 FF A0 A0' + 'A0 FF A7 A7 A7 FF AA AA AA FF AE AE AE FF B9 B9' + 'B9 FF A4 A4 A4 FF 90 90 90 FF B8 B8 B8 FF 8A 8A' + '8A FF AF AF AF FF 94 94 94 FF BF BF BF FF 97 97' + '97 FF B7 B7 B7 FF 88 88 88 FF C4 C3 C3 FF C6 C3' + 'C5 FF 95 B2 A3 FF 91 D6 B4 FF 91 D8 B5 FF 83 AB' + '97 FF C4 C1 C3 FF 8E 8E 8E FF 01 01 01 FF 00 00' + '00 B7 00 00 00 13 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 34 00 00 00 F9 28 28' + '28 FF D1 D1 D1 FF EC EC EC FF E6 E6 E6 FF E7 E7' + 'E7 FF D1 D1 D1 FF 68 68 68 FF 74 74 74 FF 7E 7E' + '7E FF 85 85 85 FF 8E 8E 8E FF 97 97 97 FF A0 A0' + 'A0 FF A7 A7 A7 FF AA AA AA FF AE AE AE FF BA BA' + 'BA FF 9F 9F 9F FF 83 83 83 FF B3 B3 B3 FF 7C 7C' + '7C FF A8 A8 A8 FF 87 87 87 FF BB BB BB FF 8A 8A' + '8A FF B2 B2 B2 FF 79 79 79 FF C2 C2 C2 FF C4 C4' + 'C4 FF C6 C3 C4 FF 99 AC A2 FF 96 AB A0 FF C2 BE' + 'C0 FF C4 C4 C4 FF 8D 8D 8D FF 01 01 01 FF 00 00' + '00 BA 00 00 00 14 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 28 28' + '28 FF D1 D1 D1 FF EE EE EE FF E7 E7 E7 FF E8 E8' + 'E8 FF D6 D6 D6 FF 70 70 70 FF 71 71 71 FF 7D 7D' + '7D FF 85 85 85 FF 8E 8E 8E FF 97 97 97 FF A0 A0' + 'A0 FF A7 A7 A7 FF AA AA AA FF AE AE AE FF BB BB' + 'BB FF 98 98 98 FF 73 73 73 FF AD AD AD FF 6A 6A' + '6A FF A0 A0 A0 FF 78 78 78 FF B7 B7 B7 FF 7C 7C' + '7C FF AB AB AB FF 67 67 67 FF C2 C2 C2 FF C6 C6' + 'C6 FF C4 C3 C4 FF C7 C4 C5 FF C6 C2 C4 FF BF BF' + 'BF FF C5 C5 C5 FF 8D 8D 8D FF 01 01 01 FF 00 00' + '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 27 27' + '27 FF D1 D1 D1 FF EF EF EF FF E9 E9 E9 FF EB EB' + 'EB FF D6 D6 D6 FF 6A 6A 6A FF 6C 6C 6C FF 78 78' + '78 FF 81 81 81 FF 8A 8A 8A FF 93 93 93 FF 9C 9C' + '9C FF A3 A3 A3 FF A6 A6 A6 FF AB AB AB FF B9 B9' + 'B9 FF 90 90 90 FF 66 66 66 FF A5 A5 A5 FF 5B 5B' + '5B FF 98 98 98 FF 6B 6B 6B FF B1 B1 B1 FF 70 70' + '70 FF A4 A4 A4 FF 58 58 58 FF C1 C1 C1 FF C8 C8' + 'C8 FF C5 C5 C5 FF C3 C3 C3 FF C2 C2 C2 FF C1 C1' + 'C1 FF C6 C6 C6 FF 8E 8E 8E FF 01 01 01 FF 00 00' + '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 27 27' + '27 FF D2 D2 D2 FF F2 F2 F2 FF EB EB EB FF EA EA' + 'EA FF DF DF DF FF A7 A7 A7 FF A7 A7 A7 FF AB AB' + 'AB FF AE AE AE FF B0 B0 B0 FF B3 B3 B3 FF B6 B6' + 'B6 FF B9 B9 B9 FF B9 B9 B9 FF BA BA BA FF BD BD' + 'BD FF B7 B7 B7 FF B1 B1 B1 FF BE BE BE FF AF AF' + 'AF FF BA BA BA FF B1 B1 B1 FF BE BE BE FF B0 B0' + 'B0 FF BA BA BA FF AB AB AB FF C5 C5 C5 FF C8 C8' + 'C8 FF C6 C6 C6 FF C4 C4 C4 FF C3 C3 C3 FF C2 C2' + 'C2 FF C9 C9 C9 FF 8E 8E 8E FF 00 00 00 FF 00 00' + '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 26 26' + '26 FF D3 D3 D3 FF F3 F3 F3 FF EB EB EB FF EB EB' + 'EB FF EA EA EA FF ED ED ED FF EB EB EB FF E9 E9' + 'E9 FF E8 E8 E8 FF E6 E6 E6 FF E4 E4 E4 FF E2 E2' + 'E2 FF E1 E1 E1 FF DF DF DF FF DE DE DE FF DB DB' + 'DB FF DB DB DB FF DC DC DC FF D8 D8 D8 FF D9 D9' + 'D9 FF D6 D6 D6 FF D6 D6 D6 FF D2 D2 D2 FF D2 D2' + 'D2 FF CF CF CF FF D0 D0 D0 FF CB CB CB FF CA CA' + 'CA FF C9 C9 C9 FF C7 C7 C7 FF C4 C4 C4 FF C0 C0' + 'C0 FF CA CA CA FF 8E 8E 8E FF 00 00 00 FF 00 00' + '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 26 26' + '26 FF D3 D3 D3 FF F7 F7 F7 FF F8 F8 F8 FF F6 F6' + 'F6 FF F6 F6 F6 FF F6 F6 F6 FF F5 F5 F5 FF F5 F5' + 'F5 FF F4 F4 F4 FF F4 F4 F4 FF F3 F3 F3 FF F3 F3' + 'F3 FF F3 F3 F3 FF F2 F2 F2 FF F2 F2 F2 FF F1 F1' + 'F1 FF F1 F1 F1 FF F1 F1 F1 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF EF EF EF FF EF EF EF FF EE EE' + 'EE FF EE EE EE FF ED ED ED FF ED ED ED FF ED ED' + 'ED FF EC EC EC FF EC EC EC FF EB EB EB FF E0 E0' + 'E0 FF D0 D0 D0 FF 8D 8D 8D FF 00 00 00 FF 00 00' + '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 33 00 00 00 F9 24 24' + '24 FF D6 D6 D6 FF FF FF FF FF E9 E9 E9 FF E1 E1' + 'E1 FF E2 E2 E2 FF E2 E2 E2 FF E0 E0 E0 FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E2 E2' + 'E2 FF E3 E3 E3 FF E3 E3 E3 FF E3 E3 E3 FF F8 F8' + 'F8 FF EF EF EF FF 8C 8C 8C FF 00 00 00 FF 00 00' + '00 B9 00 00 00 14 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 34 00 00 00 FA 24 24' + '24 FF DE DE DE FF F8 F8 F8 FF D9 D9 D9 FF C4 C4' + 'C4 FF BB BB BB FF BF BF BF FF D8 D8 D8 FF DA DA' + 'DA FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF DB DB DB FF CF CF' + 'CF FF BC BC BC FF BB BB BB FF D1 D1 D1 FF DE DE' + 'DE FF FF FF FF FF 9A 9A 9A FF 00 00 00 FF 00 00' + '00 BA 00 00 00 14 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 25 00 00 00 F7 1F 1F' + '1F FF DA DA DA FF F3 F3 F3 FF C6 C6 C6 FF A9 A9' + 'A9 FF B7 B7 B7 FF B0 B0 B0 FF C3 C3 C3 FF DA DA' + 'DA FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D9 D9 D9 FF D2 D2 D2 FF A8 A8' + 'A8 FF B6 B6 B6 FF B1 B1 B1 FF B5 B5 B5 FF D8 D8' + 'D8 FF FC FC FC FF 9C 9C 9C FF 00 00 00 FF 00 00' + '00 AE 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 07 00 00 00 D0 05 05' + '05 FF C2 C2 C2 FF F6 F6 F6 FF BC BC BC FF B2 B2' + 'B2 FF C3 C3 C3 FF AB AB AB FF BB BB BB FF D8 D8' + 'D8 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D4 D4' + 'D4 FF D3 D3 D3 FF D3 D3 D3 FF D5 D5 D5 FF D7 D7' + 'D7 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7 D7 FF D5 D5' + 'D5 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D4 D4' + 'D4 FF D5 D5 D5 FF D7 D7 D7 FF C9 C9 C9 FF A6 A6' + 'A6 FF C3 C3 C3 FF B3 B3 B3 FF AD AD AD FF D6 D6' + 'D6 FF F5 F5 F5 FF 76 76 76 FF 00 00 00 FF 00 00' + '00 8C 00 00 00 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 9C 00 00' + '00 FF A4 A4 A4 FF F4 F4 F4 FF CF CF CF FF C5 C5' + 'C5 FF D2 D2 D2 FF BF BF BF FF C9 C9 C9 FF D3 D3' + 'D3 FF D2 D2 D2 FF D0 D0 D0 FF D3 D3 D3 FF DD DD' + 'DD FF E1 E1 E1 FF E3 E3 E3 FF E6 E6 E6 FF EA EA' + 'EA FF ED ED ED FF ED ED ED FF EB EB EB FF E7 E7' + 'E7 FF E4 E4 E4 FF E2 E2 E2 FF DE DE DE FF D4 D4' + 'D4 FF D0 D0 D0 FF D2 D2 D2 FF D3 D3 D3 FF C5 C5' + 'C5 FF D0 D0 D0 FF C2 C2 C2 FF BF BF BF FF D9 D9' + 'D9 FF E8 E8 E8 FF 56 56 56 FF 00 00 00 FF 00 00' + '00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 73 00 00' + '00 FF 7E 7E 7E FF EF EF EF FF D1 D1 D1 FF CF CF' + 'CF FF CB CB CB FF CF CF CF FF D1 D1 D1 FF CE CE' + 'CE FF CF CF CF FF DF DF DF FF F0 F0 F0 FF EC EC' + 'EC FF E1 E1 E1 FF DE DE DE FF DD DD DD FF DC DC' + 'DC FF DB DB DB FF DB DB DB FF DC DC DC FF DD DD' + 'DD FF DE DE DE FF E1 E1 E1 FF EC EC EC FF F1 F1' + 'F1 FF E1 E1 E1 FF D1 D1 D1 FF CE CE CE FF D0 D0' + 'D0 FF CB CB CB FF CE CE CE FF D1 D1 D1 FF D9 D9' + 'D9 FF D4 D4 D4 FF 3F 3F 3F FF 00 00 00 FF 00 00' + '00 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 59 00 00' + '00 FF 59 59 59 FF E9 E9 E9 FF D0 D0 D0 FF CD CD' + 'CD FF CD CD CD FF CD CD CD FF CA CA CA FF D6 D6' + 'D6 FF ED ED ED FF E6 E6 E6 FF DC DC DC FF D4 D4' + 'D4 FF D5 D5 D5 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D5 D5 D5 FF D5 D5 D5 FF DB DB' + 'DB FF E4 E4 E4 FF ED ED ED FF DA DA DA FF CA CA' + 'CA FF CD CD CD FF CD CD CD FF CB CB CB FF DF DF' + 'DF FF B8 B8 B8 FF 22 22 22 FF 00 00 00 FB 00 00' + '00 3A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00' + '00 FE 40 40 40 FF D7 D7 D7 FF D2 D2 D2 FF CA CA' + 'CA FF CB CB CB FF CA CA CA FF D4 D4 D4 FF E9 E9' + 'E9 FF DC DC DC FF D0 D0 D0 FF D1 D1 D1 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D1 D1' + 'D1 FF D0 D0 D0 FF D8 D8 D8 FF EA EA EA FF D8 D8' + 'D8 FF C9 C9 C9 FF CA CA CA FF C9 C9 C9 FF E0 E0' + 'E0 FF A0 A0 A0 FF 08 08 08 FF 00 00 00 EB 00 00' + '00 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 25 00 00' + '00 F8 22 22 22 FF B7 B7 B7 FF DB DB DB FF CA CA' + 'CA FF CB CB CB FF CE CE CE FF E4 E4 E4 FF D4 D4' + 'D4 FF CF CF CF FF D1 D1 D1 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF CF FF CD CD' + 'CD FF CE CE CE FF CE CE CE FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF CC CC CC FF D0 D0 D0 FF E2 E2' + 'E2 FF CF CF CF FF C7 C7 C7 FF C9 C9 C9 FF E2 E2' + 'E2 FF 80 80 80 FF 00 00 00 FF 00 00 00 C2 00 00' + '00 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00' + '00 E1 07 07 07 FF 9F 9F 9F FF DD DD DD FF CC CC' + 'CC FF CD CD CD FF DB DB DB FF D6 D6 D6 FF CE CE' + 'CE FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF CF FF CC CC' + 'CC FF C9 C9 C9 FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF C8 C8 C8 FF CF CF' + 'CF FF DA DA DA FF C7 C7 C7 FF C9 C9 C9 FF E2 E2' + 'E2 FF 5A 5A 5A FF 00 00 00 FF 00 00 00 94 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 B2 00 00 00 FF 83 83 83 FF DD DD DD FF CF CF' + 'CF FF D1 D1 D1 FF DB DB DB FF D1 D1 D1 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF' + 'CF FF C9 C9 C9 FF C5 C5 C5 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C7 C7' + 'C7 FF D3 D3 D3 FF C8 C8 C8 FF C9 C9 C9 FF DE DE' + 'DE FF 42 42 42 FF 00 00 00 FF 00 00 00 6C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 80 00 00 00 FF 5F 5F 5F FF DC DC DC FF D1 D1' + 'D1 FF D2 D2 D2 FF D4 D4 D4 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D0 D0 D0 FF C8 C8 C8 FF C3 C3 C3 FF C3 C3' + 'C3 FF C3 C3 C3 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' + 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' + 'C4 FF C7 C7 C7 FF C5 C5 C5 FF CB CB CB FF CC CC' + 'CC FF 2D 2D 2D FF 00 00 00 F8 00 00 00 40 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 4B 00 00 00 FE 41 41 41 FF D8 D8 D8 FF D4 D4' + 'D4 FF D2 D2 D2 FF D0 D0 D0 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF CD CD CD FF C7 C7' + 'C7 FF C4 C4 C4 FF C2 C2 C2 FF C1 C1 C1 FF C0 C0' + 'C0 FF C1 C1 C1 FF C1 C1 C1 FF C1 C1 C1 FF C2 C2' + 'C2 FF BF BF BF FF C0 C0 C0 FF CE CE CE FF B2 B2' + 'B2 FF 1A 1A 1A FF 00 00 00 E5 00 00 00 28 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1A 00 00 00 F2 2C 2C 2C FF CC CC CC FF D6 D6' + 'D6 FF D5 D5 D5 FF CC CC CC FF D5 D5 D5 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D7 D7 D7 FF D6 D6' + 'D6 FF D5 D5 D5 FF D3 D3 D3 FF CF CF CF FF CC CC' + 'CC FF C9 C9 C9 FF C6 C6 C6 FF C4 C4 C4 FF C2 C2' + 'C2 FF B3 B3 B3 FF BD BD BD FF D0 D0 D0 FF 99 99' + '99 FF 09 09 09 FF 00 00 00 CF 00 00 00 19 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 09 00 00 00 D8 18 18 18 FF B0 B0 B0 FF DB DB' + 'DB FF DB DB DB FF D0 D0 D0 FF D2 D2 D2 FF DB DB' + 'DB FF D9 D9 D9 FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DB DB DB FF DB DB' + 'DB FF DA DA DA FF D9 D9 D9 FF D9 D9 D9 FF CF CF' + 'CF FF C5 C5 C5 FF CC CC CC FF CA CA CA FF 7A 7A' + '7A FF 02 02 02 FF 00 00 00 B8 00 00 00 0A 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 02 00 00 00 BF 08 08 08 FF 97 97 97 FF DC DC' + 'DC FF DF DF DF FF DC DC DC FF CE CE CE FF D6 D6' + 'D6 FF DE DE DE FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DE DE DE FF D8 D8 D8 FF CE CE' + 'CE FF DD DD DD FF DC DC DC FF C6 C6 C6 FF 53 53' + '53 FF 00 00 00 FF 00 00 00 A0 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 A4 00 00 00 FF 77 77 77 FF D3 D3' + 'D3 FF E2 E2 E2 FF E1 E1 E1 FF DE DE DE FF CE CE' + 'CE FF D7 D7 D7 FF E1 E1 E1 FF E2 E2 E2 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E1 E1' + 'E1 FF E1 E1 E1 FF D9 D9 D9 FF CD CD CD FF DA DA' + 'DA FF E3 E3 E3 FF D9 D9 D9 FF BB BB BB FF 39 39' + '39 FF 00 00 00 FF 00 00 00 7E 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 89 00 00 00 FF 4B 4B 4B FF C9 C9' + 'C9 FF E5 E5 E5 FF E3 E3 E3 FF E4 E4 E4 FF E1 E1' + 'E1 FF D7 D7 D7 FF D2 D2 D2 FF DA DA DA FF E4 E4' + 'E4 FF E5 E5 E5 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E5 E5 E5 FF E5 E5 E5 FF DC DC' + 'DC FF D2 D2 D2 FF D6 D6 D6 FF E0 E0 E0 FF E4 E4' + 'E4 FF E6 E6 E6 FF D6 D6 D6 FF A8 A8 A8 FF 20 20' + '20 FF 00 00 00 FD 00 00 00 4E 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 62 00 00 00 FF 35 35 35 FF BD BD' + 'BD FF E6 E6 E6 FF E6 E6 E6 FF E6 E6 E6 FF E7 E7' + 'E7 FF E7 E7 E7 FF DF DF DF FF D2 D2 D2 FF D3 D3' + 'D3 FF DE DE DE FF E3 E3 E3 FF E3 E3 E3 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E3 E3' + 'E3 FF E3 E3 E3 FF DE DE DE FF D4 D4 D4 FF D1 D1' + 'D1 FF DD DD DD FF E7 E7 E7 FF E7 E7 E7 FF E6 E6' + 'E6 FF E8 E8 E8 FF D4 D4 D4 FF 9A 9A 9A FF 0B 0B' + '0B FF 00 00 00 ED 00 00 00 2C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 2D 00 00 00 F9 1E 1E 1E FF AB AB' + 'AB FF E4 E4 E4 FF ED ED ED FF E7 E7 E7 FF E6 E6' + 'E6 FF EC EC EC FF EB EB EB FF EA EA EA FF E4 E4' + 'E4 FF E0 E0 E0 FF DF DF DF FF DF DF DF FF DD DD' + 'DD FF DC DC DC FF DC DC DC FF DD DD DD FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E2 E2 E2 FF E9 E9' + 'E9 FF EC EC EC FF EA EA EA FF E5 E5 E5 FF EB EB' + 'EB FF EB EB EB FF D6 D6 D6 FF 8A 8A 8A FF 00 00' + '00 FF 00 00 00 C3 00 00 00 17 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 09 00 00 00 DD 08 08 08 FF 99 99' + '99 FF E4 E4 E4 FF DF DF DF FF BD BD BD FF C1 C1' + 'C1 FF D6 D6 D6 FF EC EC EC FF ED ED ED FF ED ED' + 'ED FF EE EE EE FF EE EE EE FF ED ED ED FF EC EC' + 'EC FF EB EB EB FF EB EB EB FF EC EC EC FF ED ED' + 'ED FF EE EE EE FF EE EE EE FF ED ED ED FF EE EE' + 'EE FF E4 E4 E4 FF C2 C2 C2 FF BE BE BE FF D1 D1' + 'D1 FF EC EC EC FF D4 D4 D4 FF 75 75 75 FF 00 00' + '00 FF 00 00 00 9C 00 00 00 06 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 AE 00 00 00 FF 8D 8D' + '8D FF E0 E0 E0 FF C4 C4 C4 FF B2 B2 B2 FF B8 B8' + 'B8 FF B2 B2 B2 FF EB EB EB FF F1 F1 F1 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F3 F3' + 'F3 FF D5 D5 D5 FF B0 B0 B0 FF B6 B6 B6 FF B7 B7' + 'B7 FF EB EB EB FF CD CD CD FF 61 61 61 FF 00 00' + '00 FF 00 00 00 85 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 80 00 00 00 FF 64 64' + '64 FF CE CE CE FF DD DD DD FF DC DC DC FF D5 D5' + 'D5 FF E4 E4 E4 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF FA FA' + 'FA FF F2 F2 F2 FF DF DF DF FF D8 D8 D8 FF DC DC' + 'DC FF D7 D7 D7 FF B0 B0 B0 FF 34 34 34 FF 00 00' + '00 FF 00 00 00 67 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 44 00 00 00 FF 19 19' + '19 FF 80 80 80 FF BE BE BE FF D3 D3 D3 FF D7 D7' + 'D7 FF DB DB DB FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D9 D9 D9 FF D9 D9 D9 FF D7 D7 D7 FF CD CD' + 'CD FF B0 B0 B0 FF 5D 5D 5D FF 06 06 06 FF 00 00' + '00 ED 00 00 00 2B 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 02 00 00 00 9C 00 00' + '00 FF 0C 0C 0C FF 3D 3D 3D FF 49 49 49 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 49 49 49 FF 49 49' + '49 FF 2F 2F 2F FF 02 02 02 FF 00 00 00 FF 00 00' + '00 5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00' + '00 7F 00 00 00 F1 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 D6 00 00 00 5C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 2C 00 00 00 7E 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 70 00 00 00 1A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF 00 00 00 00 7F 00 00 FC 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FF 00 00 00 00 7F 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 01 FF 00 00 FF 80 00 00 03 FF 00 00 FF E0' + '00 00 07 FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 15 00 00 00 54 00 00 00 63 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 63 00 00 00 50 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 33 00 00' + '00 D7 0D 0D 0D FF 1B 1B 1B FF 1C 1C 1C FF 1E 1E' + '1E FF 1D 1D 1D FF 1D 1D 1D FF 1C 1C 1C FF 1B 1B' + '1B FF 1B 1B 1B FF 1B 1B 1B FF 1A 1A 1A FF 1A 1A' + '1A FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A' + '1A FF 1A 1A 1A FF 1A 1A 1A FF 1A 1A 1A FF 20 1C' + '1E FF 22 1B 1F FF 09 09 09 FF 00 00 00 C3 00 00' + '00 29 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 07 00 00 00 C9 40 40' + '40 FF BA BA BA FF CB CB CB FF BE BE BE FF B3 B3' + 'B3 FF B4 B4 B4 FF B4 B4 B4 FF B7 B7 B7 FF BB BB' + 'BB FF BB BB BB FF BB BB BB FF BC BC BC FF BE BE' + 'BE FF BD BD BD FF BC BC BC FF BB BB BB FF BA BA' + 'BA FF BA BA BA FF B4 B4 B4 FF B1 AE AF FF 8C A4' + '98 FF 80 A5 93 FF 90 91 91 FF 21 21 21 FF 00 00' + '00 AB 00 00 00 07 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 3D 08 08 08 FD B7 B7' + 'B7 FF F2 F2 F2 FF EE EE EE FF AF AF AF FF 51 51' + '51 FF 6E 6E 6E FF 89 89 89 FF 9A 9A 9A FF AB AB' + 'AB FF B3 B3 B3 FF BC BC BC FF B5 B5 B5 FF B5 B5' + 'B5 FF BC BC BC FF BD BD BD FF BE BE BE FF B7 B7' + 'B7 FF C0 C0 C0 FF C4 C1 C3 FF B7 BF BA FF 2A BF' + '75 FF 0E C0 67 FF 8C B8 A2 FF 80 79 7C FF 00 00' + '00 EC 00 00 00 25 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 58 19 19 19 FF CE CE' + 'CE FF EB EB EB FF EB EB EB FF AA AA AA FF 56 56' + '56 FF 7A 7A 7A FF 8C 8C 8C FF 96 96 96 FF A2 A2' + 'A2 FF A9 A9 A9 FF B4 B4 B4 FF A1 A1 A1 FF 97 97' + '97 FF A1 A1 A1 FF A5 A5 A5 FF A5 A5 A5 FF 9B 9B' + '9B FF A7 A7 A7 FF B3 B1 B2 FF BC C1 BE FF 87 C6' + 'A6 FF 85 CC A8 FF A6 BC B1 FF 94 90 92 FF 02 02' + '02 F9 00 00 00 36 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 5A 18 18 18 FF CC CC' + 'CC FF ED ED ED FF EC EC EC FF B9 B9 B9 FF 6D 6D' + '6D FF 7D 7D 7D FF 8B 8B 8B FF 96 96 96 FF A2 A2' + 'A2 FF A9 A9 A9 FF B6 B6 B6 FF 96 96 96 FF 82 82' + '82 FF 8E 8E 8E FF 93 93 93 FF 94 94 94 FF 86 86' + '86 FF 95 95 95 FF A6 A6 A6 FF C8 C8 C8 FF C2 C0' + 'C1 FF BF BD BE FF C9 C6 C7 FF 8E 8E 8E FF 01 01' + '01 FA 00 00 00 37 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 5A 17 17 17 FF CD CD' + 'CD FF F0 F0 F0 FF ED ED ED FF BF BF BF FF 77 77' + '77 FF 85 85 85 FF 91 91 91 FF 9A 9A 9A FF A4 A4' + 'A4 FF AA AA AA FF B5 B5 B5 FF 97 97 97 FF 83 83' + '83 FF 8D 8D 8D FF 92 92 92 FF 93 93 93 FF 86 86' + '86 FF 93 93 93 FF A7 A7 A7 FF CA CA CA FF C4 C3' + 'C4 FF C3 C2 C2 FF C8 C8 C8 FF 8E 8E 8E FF 00 00' + '00 FA 00 00 00 37 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 5A 17 17 17 FF CE CE' + 'CE FF F2 F2 F2 FF EC EC EC FF E6 E6 E6 FF DC DC' + 'DC FF DB DB DB FF DA DA DA FF DA DA DA FF D9 D9' + 'D9 FF D8 D8 D8 FF D7 D7 D7 FF D4 D4 D4 FF D4 D4' + 'D4 FF D2 D2 D2 FF D0 D0 D0 FF CF CF CF FF CC CC' + 'CC FF CB CB CB FF CB CB CB FF CC CC CC FF CA CA' + 'CA FF C7 C7 C7 FF C9 C9 C9 FF 8D 8D 8D FF 00 00' + '00 FA 00 00 00 37 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 5A 17 17 17 FF D0 D0' + 'D0 FF FF FF FF FF F8 F8 F8 FF F8 F8 F8 FF F9 F9' + 'F9 FF F8 F8 F8 FF F7 F7 F7 FF F7 F7 F7 FF F6 F6' + 'F6 FF F6 F6 F6 FF F5 F5 F5 FF F5 F5 F5 FF F5 F5' + 'F5 FF F4 F4 F4 FF F4 F4 F4 FF F4 F4 F4 FF F3 F3' + 'F3 FF F3 F3 F3 FF F2 F2 F2 FF F1 F1 F1 FF F2 F2' + 'F2 FF F3 F3 F3 FF E8 E8 E8 FF 8D 8D 8D FF 00 00' + '00 FA 00 00 00 37 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 5B 17 17 17 FF D7 D7' + 'D7 FF F4 F4 F4 FF DB DB DB FF D8 D8 D8 FF DD DD' + 'DD FF DF DF DF FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DF DF' + 'DF FF DF DF DF FF E0 E0 E0 FF DD DD DD FF D8 D8' + 'D8 FF E0 E0 E0 FF FB FB FB FF 9C 9C 9C FF 00 00' + '00 FA 00 00 00 38 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 51 11 11 11 FF D3 D3' + 'D3 FF D9 D9 D9 FF AD AD AD FF B0 B0 B0 FF BE BE' + 'BE FF D9 D9 D9 FF D8 D8 D8 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D7 D7 D7 FF D7 D7' + 'D7 FF D9 D9 D9 FF D3 D3 D3 FF AF AF AF FF B1 B1' + 'B1 FF B8 B8 B8 FF ED ED ED FF A0 A0 A0 FF 00 00' + '00 F7 00 00 00 2E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 2B 00 00 00 F8 B3 B3' + 'B3 FF DC DC DC FF B9 B9 B9 FF BA BA BA FF BC BC' + 'BC FF D5 D5 D5 FF D3 D3 D3 FF D4 D4 D4 FF D8 D8' + 'D8 FF DF DF DF FF E3 E3 E3 FF E4 E4 E4 FF E4 E4' + 'E4 FF E3 E3 E3 FF DF DF DF FF D9 D9 D9 FF D4 D4' + 'D4 FF D3 D3 D3 FF CF CF CF FF BA BA BA FF B8 B8' + 'B8 FF B8 B8 B8 FF E9 E9 E9 FF 7C 7C 7C FF 00 00' + '00 DE 00 00 00 17 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 0C 00 00 00 E2 89 89' + '89 FF E5 E5 E5 FF CE CE CE FF D0 D0 D0 FF D0 D0' + 'D0 FF D1 D1 D1 FF DE DE DE FF E5 E5 E5 FF E5 E5' + 'E5 FF E2 E2 E2 FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF E2 E2 E2 FF E6 E6 E6 FF E5 E5' + 'E5 FF DF DF DF FF D2 D2 D2 FF CF CF CF FF CF CF' + 'CF FF D0 D0 D0 FF E6 E6 E6 FF 54 54 54 FF 00 00' + '00 BC 00 00 00 07 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 BB 64 64' + '64 FF E2 E2 E2 FF CB CB CB FF CB CB CB FF CE CE' + 'CE FF E2 E2 E2 FF E0 E0 E0 FF D7 D7 D7 FF D3 D3' + 'D3 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4' + 'D4 FF D4 D4 D4 FF D4 D4 D4 FF D3 D3 D3 FF D7 D7' + 'D7 FF DF DF DF FF E4 E4 E4 FF D1 D1 D1 FF CB CB' + 'CB FF CF CF CF FF D7 D7 D7 FF 34 34 34 FF 00 00' + '00 99 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 93 3E 3E' + '3E FF DB DB DB FF CC CC CC FF CC CC CC FF DC DC' + 'DC FF D7 D7 D7 FF CF CF CF FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF CF CF CF FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF CC CC CC FF D3 D3 D3 FF DC DC DC FF C9 C9' + 'C9 FF CF CF CF FF C2 C2 C2 FF 1A 1A 1A FF 00 00' + '00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 6B 21 21' + '21 FF C9 C9 C9 FF D2 D2 D2 FF D3 D3 D3 FF D7 D7' + 'D7 FF CF CF CF FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF CF CF CF FF CA CA CA FF C7 C7' + 'C7 FF C8 C8 C8 FF C8 C8 C8 FF C8 C8 C8 FF C8 C8' + 'C8 FF C8 C8 C8 FF C7 C7 C7 FF CF CF CF FF CC CC' + 'CC FF D0 D0 D0 FF A9 A9 A9 FF 04 04 04 FF 00 00' + '00 4D 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 44 0B 0B' + '0B FF B1 B1 B1 FF D8 D8 D8 FF D2 D2 D2 FF D2 D2' + 'D2 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D2 D2 D2 FF D1 D1 D1 FF C9 C9' + 'C9 FF C4 C4 C4 FF C3 C3 C3 FF C3 C3 C3 FF C4 C4' + 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C5 C5 C5 FF C5 C5' + 'C5 FF D2 D2 D2 FF 86 86 86 FF 00 00 00 F3 00 00' + '00 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00' + '00 F4 93 93 93 FF DF DF DF FF D2 D2 D2 FF D2 D2' + 'D2 FF D5 D5 D5 FF D4 D4 D4 FF D4 D4 D4 FF D4 D4' + 'D4 FF D4 D4 D4 FF D4 D4 D4 FF D5 D5 D5 FF D5 D5' + 'D5 FF D2 D2 D2 FF CD CD CD FF C7 C7 C7 FF C3 C3' + 'C3 FF C2 C2 C2 FF C2 C2 C2 FF BE BE BE FF BC BC' + 'BC FF D0 D0 D0 FF 67 67 67 FF 00 00 00 D9 00 00' + '00 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 0B 00 00' + '00 DE 75 75 75 FF DE DE DE FF D7 D7 D7 FF D1 D1' + 'D1 FF DA DA DA FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF DA DA DA FF DA DA DA FF DA DA DA FF D8 D8' + 'D8 FF D6 D6 D6 FF D5 D5 D5 FF C7 C7 C7 FF C5 C5' + 'C5 FF CD CD CD FF 4B 4B 4B FF 00 00 00 BD 00 00' + '00 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 B7 53 53 53 FF D9 D9 D9 FF E1 E1 E1 FF D5 D5' + 'D5 FF D5 D5 D5 FF DF DF DF FF DF DF DF FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF DE DE DE FF DF DF' + 'DF FF E0 E0 E0 FF D7 D7 D7 FF D6 D6 D6 FF DE DE' + 'DE FF C3 C3 C3 FF 2C 2C 2C FF 00 00 00 9A 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 90 31 31 31 FF CB CB CB FF E5 E5 E5 FF E4 E4' + 'E4 FF DA DA DA FF D7 D7 D7 FF DD DD DD FF E2 E2' + 'E2 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E2 E2 E2 FF DE DE' + 'DE FF D7 D7 D7 FF D9 D9 D9 FF E4 E4 E4 FF DF DF' + 'DF FF AB AB AB FF 17 17 17 FF 00 00 00 73 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 67 1A 1A 1A FF B3 B3 B3 FF E8 E8 E8 FF EA EA' + 'EA FF EA EA EA FF E5 E5 E5 FF DE DE DE FF DD DD' + 'DD FF DD DD DD FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF DD DD DD FF DC DC DC FF DD DD' + 'DD FF E5 E5 E5 FF E9 E9 E9 FF EC EC EC FF DF DF' + 'DF FF 95 95 95 FF 04 04 04 FF 00 00 00 4D 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 41 07 07 07 FE 9F 9F 9F FF E8 E8 E8 FF CD CD' + 'CD FF CB CB CB FF E7 E7 E7 FF EF EF EF FF ED ED' + 'ED FF EA EA EA FF E9 E9 E9 FF E7 E7 E7 FF E7 E7' + 'E7 FF E8 E8 E8 FF EA EA EA FF EC EC EC FF F0 F0' + 'F0 FF DB DB DB FF C6 C6 C6 FF DC DC DC FF E1 E1' + 'E1 FF 78 78 78 FF 00 00 00 F4 00 00 00 29 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1E 00 00 00 F4 83 83 83 FF E0 E0 E0 FF C9 C9' + 'C9 FF C6 C6 C6 FF EA EA EA FF FA FA FA FF F8 F8' + 'F8 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8' + 'F8 FF F8 F8 F8 FF F8 F8 F8 FF F8 F8 F8 FF FB FB' + 'FB FF D9 D9 D9 FF C4 C4 C4 FF D1 D1 D1 FF D2 D2' + 'D2 FF 50 50 50 FF 00 00 00 DA 00 00 00 15 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 BB 24 24 24 FF 98 98 98 FF CF CF' + 'CF FF D2 D2 D2 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D2 D2 D2 FF C8 C8 C8 FF 7C 7C' + '7C FF 0D 0D 0D FF 00 00 00 9A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 31 00 00 00 DF 0F 0F 0F FF 29 29' + '29 FF 29 29 29 FF 28 28 28 FF 28 28 28 FF 28 28' + '28 FF 28 28 28 FF 28 28 28 FF 28 28 28 FF 28 28' + '28 FF 28 28 28 FF 28 28 28 FF 28 28 28 FF 28 28' + '28 FF 28 28 28 FF 2A 2A 2A FF 26 26 26 FF 08 08' + '08 FF 00 00 00 C8 00 00 00 1D 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 14 00 00 00 62 00 00' + '00 87 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 86 00 00' + '00 55 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF FF FF FF FF FF FF F0 00 00 0F E0 00' + '00 07 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 F0 00 00 0F F0 00 00 0F F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F8 00 00 1F F8 00' + '00 1F FC 00 00 3F FF FF FF FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 20 00 00 00' + '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 11 04 04' + '04 8A 16 16 16 A8 1B 1B 1B A8 18 18 18 A8 16 16' + '16 A8 15 15 15 A8 16 16 16 A8 15 15 15 A8 15 15' + '15 A8 14 13 14 A8 19 12 16 A8 05 03 04 84 00 00' + '00 0F 00 00 00 00 00 00 00 00 05 05 05 83 9B 9B' + '9B FF C1 C1 C1 FF 83 83 83 FF 9A 9A 9A FF AD AD' + 'AD FF B2 B2 B2 FF B3 B3 B3 FF B5 B5 B5 FF B2 B1' + 'B2 FF AC B2 AF FF 59 B0 84 FF 5B 6C 64 FF 04 01' + '03 71 00 00 00 00 00 00 00 00 13 13 13 B3 DC DC' + 'DC FF CB CB CB FF 65 65 65 FF 8A 8A 8A FF A7 A7' + 'A7 FF AB AB AB FF 95 95 95 FF A2 A2 A2 FF 95 94' + '95 FF BA BF BC FF 8F CC AD FF 93 A1 9A FF 09 06' + '07 95 00 00 00 00 00 00 00 00 13 13 13 B2 D7 D7' + 'D7 FF DE DE DE FF A1 A1 A1 FF AC AC AC FF BA BA' + 'BA FF B7 B7 B7 FF A2 A2 A2 FF A9 A9 A9 FF 9D 9D' + '9D FF C2 C1 C1 FF CF C9 CC FF A2 A0 A1 FF 06 06' + '06 93 00 00 00 00 00 00 00 00 14 14 14 B3 D9 D9' + 'D9 FF ED ED ED FF EA EA EA FF E8 E8 E8 FF E5 E5' + 'E5 FF E5 E5 E5 FF E6 E6 E6 FF E4 E4 E4 FF E4 E4' + 'E4 FF DF DF DF FF E3 E3 E3 FF B2 B2 B2 FF 04 05' + '05 94 00 00 00 00 00 00 00 00 11 11 11 A5 C6 C6' + 'C6 FF BC BC BC FF CA CA CA FF D9 D9 D9 FF DA DA' + 'DA FF DA DA DA FF DB DB DB FF DA DA DA FF DA DA' + 'DA FF C6 C6 C6 FF C5 C5 C5 FF B4 B4 B4 FF 04 04' + '04 8B 00 00 00 00 00 00 00 00 04 04 04 7B A8 A8' + 'A8 FF CE CE CE FF CF CF CF FF DC DC DC FF DD DD' + 'DD FF DE DE DE FF DE DE DE FF DE DE DE FF DC DC' + 'DC FF CF CF CF FF D4 D4 D4 FF 91 91 91 FF 00 00' + '00 69 00 00 00 00 00 00 00 00 00 00 00 53 85 85' + '85 FF DB DB DB FF D7 D7 D7 FF D3 D3 D3 FF D0 D0' + 'D0 FF CE CE CE FF CD CD CD FF CE CE CE FF D0 D0' + 'D0 FF D6 D6 D6 FF D9 D9 D9 FF 6E 6E 6E FE 00 00' + '00 43 00 00 00 00 00 00 00 00 00 00 00 2E 64 64' + '64 FA DD DD DD FF D3 D3 D3 FF D0 D0 D0 FF D1 D1' + 'D1 FF CF CF CF FF C8 C8 C8 FF C4 C4 C4 FF C4 C4' + 'C4 FF C5 C5 C5 FF CF CF CF FF 4D 4D 4D F3 00 00' + '00 20 00 00 00 00 00 00 00 00 00 00 00 0E 42 42' + '42 E8 D7 D7 D7 FF D6 D6 D6 FF D9 D9 D9 FF D8 D8' + 'D8 FF D8 D8 D8 FF D7 D7 D7 FF D4 D4 D4 FF D3 D3' + 'D3 FF CD CD CD FF C5 C5 C5 FF 2C 2C 2C D8 00 00' + '00 0A 00 00 00 00 00 00 00 00 00 00 00 02 22 22' + '22 C5 D1 D1 D1 FF E3 E3 E3 FF DC DC DC FF DF DF' + 'DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF DE DE' + 'DE FF E5 E5 E5 FF C0 C0 C0 FF 11 11 11 B6 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 08 08' + '08 A1 BE BE BE FF E1 E1 E1 FF EA EA EA FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EC EC EC FF E5 E5' + 'E5 FF E5 E5 E5 FF A3 A3 A3 FF 01 01 01 93 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 74 78 78 78 FF C7 C7 C7 FF D9 D9 D9 FF DE DE' + 'DE FF DD DD DD FF DD DD DD FF DF DF DF FF D4 D4' + 'D4 FF C7 C7 C7 FF 60 60 60 FF 00 00 00 65 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 11 04 04 04 94 1D 1D 1D CC 1C 1C 1C CC 1C 1C' + '1C CC 1C 1C 1C CC 1C 1C 1C CC 1C 1C 1C CC 1D 1D' + '1D CC 1B 1B 1B CB 02 02 02 88 00 00 00 0C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 FF FF 00 00' +} */ + +/* BINRES netdrive.ico */ +9 ICON netdrive.ico +/* { + '00 00 01 00 09 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 96 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 3E 09 00 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 A6 0E 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 8E 11 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 B6 12 00 00 30 30 00 00 01 00 04 00 68 06' + '00 00 5E 21 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 C6 27 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 6E 4D 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 16 5E 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 02 02 02 00 04 04 04 00 05 06 06 00 06 06' + '06 00 09 09 09 00 0A 0A 0A 00 0C 0C 0C 00 12 12' + '12 00 14 14 14 00 15 15 15 00 16 16 16 00 1D 1D' + '1D 00 1F 1F 1F 00 21 21 21 00 22 22 22 00 23 23' + '23 00 24 24 24 00 25 25 25 00 26 26 26 00 38 38' + '38 00 39 39 39 00 3B 3B 3B 00 00 67 67 00 43 43' + '43 00 46 46 46 00 4A 4A 4A 00 54 4C 50 00 53 53' + '53 00 55 55 55 00 56 56 56 00 58 58 58 00 59 59' + '59 00 5A 58 59 00 5A 5A 5A 00 5B 5B 5B 00 5C 5C' + '5C 00 5D 5D 5D 00 5E 5E 5E 00 65 58 5F 00 60 60' + '60 00 61 61 61 00 62 62 62 00 64 64 64 00 67 67' + '67 00 69 69 69 00 71 71 71 00 72 72 72 00 73 73' + '73 00 75 75 75 00 78 78 78 00 7A 7A 7A 00 7B 7B' + '7B 00 7C 7C 7C 00 7F 7F 7F 00 24 A7 64 00 3C AD' + '74 00 25 DC 7F 00 7D AA 94 00 18 FF FF 00 56 D8' + 'D8 00 81 81 81 00 83 83 83 00 89 89 89 00 8A 8A' + '8A 00 8B 8B 8B 00 8F 8F 8F 00 91 89 8C 00 90 90' + '90 00 91 91 91 00 94 94 94 00 95 95 95 00 97 97' + '97 00 99 99 99 00 9A 9A 9A 00 9C 9C 9C 00 9D 9D' + '9D 00 9E 9E 9E 00 9F 9F 9F 00 A0 91 91 00 94 B6' + 'A4 00 93 BD A9 00 A0 A0 A0 00 A1 A1 A1 00 A3 A3' + 'A3 00 A4 A4 A4 00 A5 A5 A5 00 A8 A8 A8 00 A9 A9' + 'A9 00 AA AA AA 00 AC AC AC 00 AD AD AD 00 AE AE' + 'AE 00 AF AF AF 00 B7 AF AF 00 AD B9 B3 00 B0 B0' + 'B0 00 B1 B1 B1 00 B2 B2 B2 00 B3 B3 B3 00 B4 B4' + 'B4 00 B5 B5 B5 00 B6 B6 B6 00 B7 B7 B7 00 B9 B9' + 'B9 00 BC BC BC 00 BD BD BD 00 BE BE BE 00 BF BF' + 'BF 00 89 CF CF 00 C0 C0 C0 00 C1 C1 C1 00 C2 C0' + 'C1 00 C2 C2 C2 00 C3 C3 C3 00 C4 C1 C2 00 C5 C2' + 'C4 00 C4 C4 C4 00 C5 C5 C5 00 C6 C5 C6 00 C6 C6' + 'C6 00 C8 C3 C5 00 CC C4 C8 00 C8 C8 C8 00 C9 C9' + 'C9 00 CB C9 CA 00 CA CA CA 00 CB CB CB 00 CC CC' + 'CC 00 CD CD CD 00 CE CE CE 00 CF CF CF 00 D2 C1' + 'CA 00 D3 C8 CD 00 D0 D0 D0 00 D1 D1 D1 00 D2 D2' + 'D2 00 D3 D3 D3 00 D4 D4 D4 00 D5 D5 D5 00 D6 D6' + 'D6 00 D7 D7 D7 00 D8 D8 D8 00 D9 D9 D9 00 DA DA' + 'DA 00 DB DB DB 00 DC DC DC 00 DD DD DD 00 DE DE' + 'DE 00 DF DF DF 00 E0 E0 E0 00 E1 E1 E1 00 E2 E2' + 'E2 00 E3 E3 E3 00 E4 E4 E4 00 E5 E5 E5 00 E6 E6' + 'E6 00 E7 E7 E7 00 E8 E8 E8 00 E9 E9 E9 00 EA EA' + 'EA 00 EB EB EB 00 EC EC EC 00 ED ED ED 00 EE EE' + 'EE 00 EF EF EF 00 F0 F0 F0 00 F1 F1 F1 00 F2 F2' + 'F2 00 F4 F4 F4 00 F5 F5 F5 00 F6 F6 F6 00 F7 F7' + 'F7 00 F8 F8 F8 00 F9 F9 F9 00 FC FC FC 00 FD FD' + 'FD 00 FF FF FF 00 00 00 00 00 62 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 08 6C' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 6E 65 74 64 72 69 76 65 2E' + '69 63 6F 00 4B 00 14 1A 95 00 1F 3B D4 77 15 00' + '00 00 A8 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 B0 6C' + '38 00 96 00 00 00 00 00 00 00 C9 F1 E7 77 96 00' + '00 00 A4 1A 95 00 09 00 00 00 00 00 00 00 96 00' + '00 00 96 00 00 00 09 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 B0 6C' + '38 00 96 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 B2 B2' + 'B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 17 17 B2' + 'B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 62 62' + '62 62 62 62 62 62 62 62 62 62 62 5E 6D 3B 3B 6D' + '5E 62 62 62 62 62 62 62 62 62 62 62 62 62 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3C 3C 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 4F 4F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 0D 0D B2' + 'B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 00 00 00 00 00 00' + '00 B2 B2 09 26 26 2C 2B 2A 28 26 25 24 1E 1D 22' + '20 1F 1F 1F 1E 21 27 1B 05 B2 B2 00 00 00 00 00' + '00 B2 09 6E AA A0 58 64 68 6F 86 88 8C 8D 92 92' + '91 93 90 8E 82 79 38 51 43 03 B2 00 00 00 00 00' + '00 B2 1E AC 9C 9A 0C 1A 33 41 4C 54 5D 59 4E 4B' + '59 66 56 48 85 3A 39 37 84 13 B2 00 00 00 00 00' + '00 B2 25 A8 9D 99 1C 34 40 46 54 58 64 59 47 44' + '52 60 4A 3F 7D 70 50 5F 73 13 B2 00 00 00 00 00' + '00 B2 23 A9 9F 9E 24 2F 3E 42 4E 56 63 53 32 2E' + '41 52 3D 2C 7F 77 7A 74 6E 12 B2 00 00 00 00 00' + '00 B2 23 AB A2 9E 3D 44 4A 52 58 5B 64 5A 4B 49' + '54 5C 4C 45 7B 76 6F 6F 72 11 B2 00 00 00 00 00' + '00 B2 22 AD A6 A5 AF AE AA A8 A4 A2 9F 9D A0 9E' + '9A 96 96 96 8C 8A 88 7F 75 10 B2 00 00 00 00 00' + '00 B2 20 B1 A5 A3 A2 9D 9D 9C 9D 9D 9E 9D 9D 9D' + '9D 9D 9D 9C 9F A3 A2 AE 8B 0E B2 00 00 00 00 00' + '00 B2 25 B1 78 61 69 8E 8D 8D 8D 8D 8C 8C 8C 8C' + '8D 8D 8D 8E 87 65 65 8C AB 13 B2 00 00 00 00 00' + '00 B2 18 B1 5D 67 57 87 8D 8B 89 87 8A 8B 8B 8A' + '87 88 8A 90 68 62 58 7B 9E 0C B2 00 00 00 00 00' + '00 B2 10 9E 82 86 78 86 82 8F 9A 99 9C A0 A0 9D' + '9A 9B 91 83 83 83 75 8E 6B 06 B2 00 00 00 00 00' + '00 B2 08 87 87 80 81 81 9F 9C 90 8E 8D 8C 8C 8D' + '8E 91 9C 9F 86 7E 81 98 48 B2 B2 00 00 00 00 00' + '00 B2 01 55 8E 7C 81 9B 89 82 86 86 83 86 86 86' + '86 86 81 83 9C 83 78 9F 29 B2 B2 00 00 00 00 00' + '00 B2 B2 31 9A 7C 90 88 82 86 83 86 81 7E 7F 7F' + '7F 7F 7F 7E 80 90 72 A5 15 B2 B2 00 00 00 00 00' + '00 00 B2 19 A0 83 8E 82 86 86 86 86 86 80 71 72' + '75 76 76 76 72 81 76 A1 0A B2 00 00 00 00 00 00' + '00 00 B2 0F A4 87 87 88 87 87 87 87 87 88 81 75' + '6E 6C 6B 6E 6E 6E 78 8C 01 B2 00 00 00 00 00 00' + '00 00 B2 02 94 8F 80 8E 8C 8D 8D 8D 8D 8D 8D 8E' + '8D 8A 86 80 7C 67 7C 63 B2 B2 00 00 00 00 00 00' + '00 00 B2 B2 76 99 89 89 94 92 91 91 91 91 91 91' + '92 92 93 95 8C 89 93 3F B2 B2 00 00 00 00 00 00' + '00 00 00 B2 45 9C 99 8B 8C 96 99 97 97 97 97 97' + '97 99 95 8E 88 9D 8E 1F B2 00 00 00 00 00 00 00' + '00 00 00 B2 2C 9C 9D 9D 95 87 8F 98 99 9A 9A 99' + '98 8F 87 95 9E A1 82 14 B2 00 00 00 00 00 00 00' + '00 00 00 B2 16 93 A0 8F A2 A4 9C 98 97 94 94 97' + '98 9A A4 9A 91 A7 78 0C B2 00 00 00 00 00 00 00' + '00 00 00 B2 13 94 6F 5B 76 A8 A6 A6 A6 A5 A5 A6' + 'A6 A6 A3 65 5B 9D 6A 0B B2 00 00 00 00 00 00 00' + '00 00 00 B2 07 4D A2 9A AB B0 AF AF AF AF AF AF' + 'AF AF AF A7 9C 9B 30 B2 B2 00 00 00 00 00 00 00' + '00 00 00 B2 B2 0B 31 34 33 32 32 32 32 32 32 32' + '32 32 32 33 35 2D 04 B2 00 00 00 00 00 00 00 00' + '00 00 00 00 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2 B2' + 'B2 B2 B2 B2 B2 B2 B2 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF 00 00 00 00 00 00 00 00 FF FE 7F FF FF FE' + '7F FF F0 00 00 0F E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F0 00 00 0F F8 00' + '00 1F F8 00 00 1F F8 00 00 1F F8 00 00 1F F8 00' + '00 1F F8 00 00 3F FC 00 00 7F FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 0C 0C 0C 00 15 15' + '15 00 1F 12 12 00 19 19 19 00 25 20 22 00 29 29' + '29 00 35 35 35 00 3E 3E 3E 00 40 40 40 00 57 57' + '57 00 6D 6D 6D 00 73 73 73 00 75 75 75 00 78 78' + '78 00 7B 7B 7B 00 7D 7D 7D 00 7F 7F 7F 00 89 7D' + '7D 00 66 8E 7A 00 86 7B 81 00 5E CA 93 00 4F D8' + 'D8 00 85 85 85 00 8C 8C 8C 00 8F 8F 8F 00 90 90' + '90 00 91 91 91 00 97 97 97 00 98 95 97 00 99 99' + '99 00 9B 9A 9B 00 9B 9B 9B 00 9F 9F 9F 00 A1 A1' + 'A1 00 A3 A3 A3 00 A5 A5 A5 00 A9 A9 A9 00 AC AC' + 'AC 00 AE AE AE 00 B2 B2 B2 00 B3 B3 B3 00 B4 B4' + 'B4 00 B6 B6 B6 00 B8 B8 B8 00 BA BA BA 00 BF BF' + 'BF 00 C1 C1 C1 00 C2 C2 C2 00 C0 C7 C4 00 C4 C4' + 'C4 00 C7 C7 C7 00 CB C9 CA 00 CA CA CA 00 CC CC' + 'CC 00 CD CD CD 00 CF CF CF 00 D4 C9 CF 00 D0 D0' + 'D0 00 D1 D1 D1 00 D2 D2 D2 00 D3 D3 D3 00 D4 D4' + 'D4 00 D5 D5 D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8' + 'D8 00 D9 D9 D9 00 DA DA DA 00 DB DB DB 00 DF DF' + 'DF 00 E0 E0 E0 00 E1 E1 E1 00 E3 E3 E3 00 E4 E4' + 'E4 00 E6 E6 E6 00 E7 E7 E7 00 E9 E9 E9 00 EA EA' + 'EA 00 EC EC EC 00 ED ED ED 00 EF EF EF 00 F0 F0' + 'F0 00 F3 F3 F3 00 F4 F4 F4 00 F7 F7 F7 00 FC FC' + 'FC 00 00 00 00 00 A9 A9 A9 00 AA AA AA 00 AC AC' + 'AC 00 AD AD AD 00 AE AE AE 00 AF AF AF 00 B7 AF' + 'AF 00 AD B9 B3 00 B0 B0 B0 00 B1 B1 B1 00 B2 B2' + 'B2 00 B3 B3 B3 00 B4 B4 B4 00 B5 B5 B5 00 B6 B6' + 'B6 00 B7 B7 B7 00 B9 B9 B9 00 BC BC BC 00 BD BD' + 'BD 00 BE BE BE 00 BF BF BF 00 89 CF CF 00 C0 C0' + 'C0 00 C1 C1 C1 00 C2 C0 C1 00 C2 C2 C2 00 C3 C3' + 'C3 00 C4 C1 C2 00 C5 C2 C4 00 C4 C4 C4 00 C5 C5' + 'C5 00 C6 C5 C6 00 C6 C6 C6 00 C8 C3 C5 00 CC C4' + 'C8 00 C8 C8 C8 00 C9 C9 C9 00 CB C9 CA 00 CA CA' + 'CA 00 CB CB CB 00 CC CC CC 00 CD CD CD 00 CE CE' + 'CE 00 CF CF CF 00 D2 C1 CA 00 D3 C8 CD 00 D0 D0' + 'D0 00 D1 D1 D1 00 D2 D2 D2 00 D3 D3 D3 00 D4 D4' + 'D4 00 D5 D5 D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8' + 'D8 00 D9 D9 D9 00 DA DA DA 00 DB DB DB 00 DC DC' + 'DC 00 DD DD DD 00 DE DE DE 00 DF DF DF 00 E0 E0' + 'E0 00 E1 E1 E1 00 E2 E2 E2 00 E3 E3 E3 00 E4 E4' + 'E4 00 E5 E5 E5 00 E6 E6 E6 00 E7 E7 E7 00 E8 E8' + 'E8 00 E9 E9 E9 00 EA EA EA 00 EB EB EB 00 EC EC' + 'EC 00 ED ED ED 00 EE EE EE 00 EF EF EF 00 F0 F0' + 'F0 00 F1 F1 F1 00 F2 F2 F2 00 F4 F4 F4 00 F5 F5' + 'F5 00 F6 F6 F6 00 F7 F7 F7 00 F8 F8 F8 00 F9 F9' + 'F9 00 FC FC FC 00 FD FD FD 00 FF FF FF 00 00 00' + '00 00 62 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 08 6C 0C 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 6E' + '65 74 64 72 69 76 65 2E 69 63 6F 00 4B 00 14 1A' + '95 00 1F 3B D4 77 15 00 00 00 A8 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 B0 6C 38 00 96 00 00 00 00 00' + '00 00 C9 F1 E7 77 96 00 00 00 A4 1A 95 00 09 00' + '00 00 00 00 00 00 96 00 00 00 96 00 00 00 09 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 B0 6C 38 00 96 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 17 17 17 17 17 17 12 16 16 12' + '17 17 17 17 17 17 00 00 00 57 57 57 57 03 03 57' + '57 57 57 57 00 00 00 00 07 2B 1A 1C 21 20 21 23' + '22 1D 13 05 00 00 00 57 2B 56 08 18 25 2A 1E 29' + '1F 31 15 14 00 00 00 57 27 55 0B 19 24 26 10 20' + '0F 34 39 0D 00 00 00 57 28 56 56 54 52 4F 51 4E' + '4E 4A 51 0E 00 00 00 57 2A 2C 2E 40 3D 3F 3F 3E' + '42 2C 33 1B 00 00 00 00 11 43 35 47 47 48 48 47' + '48 37 46 0A 00 00 00 00 09 46 43 38 38 36 36 37' + '36 43 4B 04 00 00 00 00 01 50 3B 3A 3A 3A 32 2E' + '2E 30 48 57 00 00 00 00 57 4C 3C 45 43 43 44 44' + '41 36 30 57 00 00 00 00 57 2C 4F 42 46 49 49 47' + '43 52 1B 57 00 00 00 00 57 19 43 4F 53 51 51 53' + '49 4D 0C 57 00 00 00 00 00 06 2E 30 30 30 30 30' + '2F 2D 02 00 00 00 00 00 00 00 57 57 57 57 57 57' + '57 57 00 00 00 00 FF FF 00 00 00 00 00 00 E0 03' + '00 00 C0 03 00 00 80 03 00 00 80 03 00 00 80 03' + '00 00 80 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 E0 07' + '00 00 F0 0F 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 06 60 00 00 00 00 00 00 00 77 77' + '77 77 77 77 77 7E E7 77 77 77 77 77 77 77 00 00' + '00 00 00 00 00 0E E0 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 08 80 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 88 88 88 88 88 88 88 88 88 88 00 00 00 00 00' + '07 FF 77 77 77 77 77 77 77 77 67 80 00 00 00 00' + '8F FF 08 88 87 77 88 77 78 78 66 70 00 00 00 00' + '8F FF 88 88 77 77 88 77 88 77 77 70 00 00 00 00' + '8F FF 88 88 87 77 88 87 88 77 77 70 00 00 00 00' + '8F FF 88 87 77 77 88 77 88 77 77 70 00 00 00 00' + '8F FF FF FF FF FF FF FF FF 77 77 70 00 00 00 00' + '8F FF FF FF FF FF FF FF FF FF FF 70 00 00 00 00' + '8F 77 77 77 77 77 77 77 77 77 77 F0 00 00 00 00' + '8F 77 77 77 77 77 77 77 77 77 77 F0 00 00 00 00' + '0F 77 77 77 FF FF FF FF 77 77 77 70 00 00 00 00' + '07 77 77 FF 77 77 77 77 FF 77 7F 80 00 00 00 00' + '07 77 7F 77 77 77 77 77 77 F7 7F 80 00 00 00 00' + '08 F7 77 77 77 77 77 77 77 77 7F 00 00 00 00 00' + '08 F7 77 77 77 77 77 77 77 77 7F 00 00 00 00 00' + '00 F7 77 77 77 77 77 77 77 77 77 00 00 00 00 00' + '00 77 77 77 77 77 77 77 77 77 77 00 00 00 00 00' + '00 7F 77 77 77 77 77 77 77 77 78 00 00 00 00 00' + '00 8F F7 7F FF FF FF FF 77 7F 78 00 00 00 00 00' + '00 8F FF 77 7F FF FF F7 77 FF 70 00 00 00 00 00' + '00 07 F7 FF FF F7 7F FF FF 7F 70 00 00 00 00 00' + '00 07 77 7F FF FF FF FF F7 7F 70 00 00 00 00 00' + '00 08 FF FF FF FF FF FF FF FF 80 00 00 00 00 00' + '00 00 88 88 88 88 88 88 88 88 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF 00 00 00 00 00 00 00 00 FF FE 7F FF FF FE' + '7F FF F0 00 00 0F E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F0 00 00 0F F8 00' + '00 1F F8 00 00 1F F8 00 00 1F F8 00 00 1F F8 00' + '00 1F F8 00 00 3F FC 00 00 7F FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' + '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 88 88' + '88 8E E8 88 88 88 00 00 00 00 00 00 00 00 00 07' + '88 88 87 78 80 00 00 7F 08 77 87 87 88 00 00 7F' + '88 77 88 87 78 00 00 7F FF FF FF FF F8 00 00 77' + '77 77 77 77 78 00 00 87 7F FF FF F7 78 00 00 07' + '77 77 77 77 F0 00 00 0F 77 77 77 77 F0 00 00 0F' + '77 77 77 77 70 00 00 07 F7 7F FF 7F 80 00 00 08' + '7F FF FF FF 80 00 00 00 77 77 77 77 00 00 00 00' + '00 00 00 00 00 00 FF FF 00 00 00 00 00 00 E0 03' + '00 00 C0 03 00 00 80 03 00 00 80 03 00 00 80 03' + '00 00 80 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 E0 07' + '00 00 F0 0F 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 01 01 01 00 02 02 02 00 05 05 05 00 06 06' + '06 00 07 07 07 00 08 08 08 00 09 09 09 00 0B 0B' + '0B 00 0C 0C 0C 00 13 13 13 00 18 18 18 00 19 19' + '19 00 1A 1A 1A 00 1E 1E 1E 00 1F 1F 1F 00 20 20' + '20 00 21 21 21 00 22 22 22 00 24 24 24 00 26 26' + '26 00 27 27 27 00 28 28 28 00 29 29 29 00 2A 2A' + '2A 00 2B 2B 2B 00 2C 2C 2C 00 2D 2D 2D 00 2E 2C' + '2D 00 2F 2F 2F 00 34 34 34 00 35 35 35 00 39 39' + '39 00 3B 3B 3B 00 3D 3D 3D 00 3F 3F 3F 00 40 40' + '40 00 41 41 41 00 42 42 42 00 47 47 47 00 48 48' + '48 00 49 49 49 00 4B 4B 4B 00 4F 4F 4F 00 53 53' + '53 00 56 56 56 00 58 58 58 00 59 59 59 00 5A 5A' + '5A 00 5B 5B 5B 00 5D 5D 5D 00 5F 5F 5F 00 61 61' + '61 00 63 63 63 00 64 64 64 00 66 66 66 00 67 67' + '67 00 68 68 68 00 6A 6A 6A 00 6B 6B 6B 00 6C 6C' + '6C 00 70 70 70 00 71 71 71 00 72 72 72 00 73 73' + '73 00 74 74 74 00 75 75 75 00 76 76 76 00 77 77' + '77 00 78 78 78 00 79 79 79 00 7A 7A 7A 00 7C 7C' + '7C 00 7D 7D 7D 00 7E 7E 7E 00 7F 7F 7F 00 2F 99' + '64 00 1C A8 60 00 0A BF 61 00 20 A8 63 00 51 A7' + '7C 00 17 CE 71 00 00 DC DC 00 00 FF FF 00 6B FF' + 'FF 00 80 80 80 00 81 81 81 00 83 83 83 00 84 83' + '84 00 85 85 85 00 87 87 87 00 88 88 88 00 8A 8A' + '8A 00 8C 8C 8C 00 8D 8D 8D 00 8E 8E 8E 00 8F 8F' + '8F 00 90 90 90 00 92 92 92 00 93 93 93 00 94 94' + '94 00 97 97 97 00 98 98 98 00 99 99 99 00 9A 9A' + '9A 00 9C 9C 9C 00 9D 9D 9D 00 9F 9F 9F 00 83 AB' + '97 00 96 AB A0 00 90 AF A0 00 99 AC A2 00 95 B2' + 'A3 00 9D B3 A8 00 A0 A0 A0 00 A1 A1 A1 00 A2 A2' + 'A2 00 A3 A3 A3 00 A4 A4 A4 00 A5 A5 A5 00 A6 A6' + 'A6 00 A7 A7 A7 00 A8 A8 A8 00 A9 A9 A9 00 AA AA' + 'AA 00 AB AB AB 00 AD A8 AB 00 AB AC AC 00 AC AC' + 'AC 00 AD AD AD 00 AE AE AE 00 AF AF AF 00 B0 B0' + 'B0 00 B1 B1 B1 00 B2 B2 B2 00 B3 B3 B3 00 B3 B4' + 'B3 00 B5 B5 B5 00 B6 B6 B6 00 B7 B7 B7 00 B8 B4' + 'B6 00 B8 B8 B8 00 B9 B9 B9 00 BA BA BA 00 BB BB' + 'BB 00 BF BB BD 00 BC BC BC 00 BD BD BD 00 BE BE' + 'BE 00 BF BF BF 00 91 D6 B4 00 91 D8 B5 00 C3 BD' + 'C0 00 C2 BE C0 00 C7 BF C3 00 C0 C0 C0 00 C1 C1' + 'C1 00 C2 C2 C2 00 C3 C3 C3 00 C4 C1 C3 00 C4 C3' + 'C3 00 C4 C3 C4 00 C6 C2 C4 00 C6 C3 C4 00 C6 C3' + 'C5 00 C4 C4 C4 00 C5 C4 C4 00 C5 C5 C5 00 C7 C4' + 'C5 00 C6 C6 C6 00 C7 C7 C7 00 C8 C8 C8 00 C8 C9' + 'C9 00 C9 C9 C9 00 CA CA CA 00 CB CB CB 00 CC CC' + 'CC 00 CD CD CD 00 CE CE CE 00 CF CF CF 00 D0 D0' + 'D0 00 D1 D1 D1 00 D2 D2 D2 00 D3 D3 D3 00 D4 D4' + 'D4 00 D5 D5 D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8' + 'D8 00 D9 D9 D9 00 DA DA DA 00 DB DB DB 00 DC DC' + 'DC 00 DD DD DD 00 DE DE DE 00 DF DF DF 00 E0 E0' + 'E0 00 E1 E1 E1 00 E2 E2 E2 00 E3 E3 E3 00 E4 E4' + 'E4 00 E5 E5 E5 00 E6 E6 E6 00 E7 E7 E7 00 E8 E8' + 'E8 00 E9 E9 E9 00 EA EA EA 00 EB EB EB 00 EC EC' + 'EC 00 ED ED ED 00 EE EE EE 00 EF EF EF 00 F0 F0' + 'F0 00 F1 F1 F1 00 F2 F2 F2 00 F3 F3 F3 00 F4 F4' + 'F4 00 F5 F5 F5 00 F6 F6 F6 00 F7 F7 F7 00 F8 F8' + 'F8 00 F9 F9 F9 00 FA FA FA 00 FC FC FC 00 FF FF' + 'FF 00 00 00 00 00 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 B0 6C' + '38 00 96 00 00 00 00 00 00 00 C9 F1 E7 77 96 00' + '00 00 A4 1A 95 00 09 00 00 00 00 00 00 00 96 00' + '00 00 96 00 00 00 09 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 B0 6C' + '38 00 96 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E1 E1' + 'E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1' + 'E1 E1 E1 E1 E1 52 52 E1 E1 E1 E1 E1 E1 E1 E1 E1' + 'E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 55 55' + '55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55' + '55 55 55 55 52 53 53 52 55 55 55 55 55 55 55 55' + '55 55 55 55 55 55 55 55 55 55 55 55 55 55 9B 9B' + '9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B' + '9B 9B 9B 9B 54 54 54 54 9B 9B 9B 9B 9B 9B 9B 9B' + '9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 54 54 E1 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 9B 9B E1 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 9B 9B E1 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1' + 'E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1' + 'E1 E1 E1 E1 E1 E1 E1 00 00 00 00 00 00 00 00 00' + '00 00 00 E1 E1 E1 E1 11 1A 19 1A 19 19 19 19 19' + '19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 19' + '19 19 1C 1C 0A E1 E1 E1 00 00 00 00 00 00 00 00' + '00 00 00 E1 E1 14 61 AE B1 AF B2 B1 B0 AF AD AA' + 'A9 A7 A5 9E 9D 9D 9E 9B 9C 95 95 92 93 8F 90 89' + '88 8C 81 7F 7E 35 07 E1 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 01 5C CF CC CB B9 59 5B 62 66 74 81' + '8F 9B 9E A9 AF AE AE BA AE B7 AF BB B0 B8 AA AC' + 'A2 71 4F 4D 6E 91 2B E1 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 0C AA D0 C6 CA AF 21 23 2D 3F 5A 62' + '6A 77 7A 80 8B 7B 69 93 67 8B 73 9E 75 93 66 A6' + '9A 50 51 4E 4C 98 58 01 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 17 B5 CE C8 CB B1 27 33 46 5A 60 65' + '72 79 7C 82 8E 76 61 8D 5C 83 64 95 65 8B 5B A0' + 'A4 70 96 97 6C 9F 5F 01 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 16 B5 D0 CA CB B5 39 41 4A 59 5F 65' + '72 79 7C 82 8F 6B 57 87 48 7A 5A 90 5C 86 46 9D' + 'A5 A3 6F 6D 99 A5 5E 01 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 16 B5 D2 CB CC BA 3D 3E 49 59 5F 65' + '72 79 7C 82 90 66 40 81 3A 72 45 8B 48 7D 38 9D' + 'A9 A1 A8 A2 95 A7 5E 01 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 15 B5 D3 CD CF BA 3A 3C 45 56 5C 63' + '69 75 78 7D 8E 61 37 77 31 66 3B 85 3D 76 2E 9C' + 'AB A7 9E 9D 9C A9 5F 01 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 15 B6 D6 CF CE C3 79 79 7D 82 84 87' + '8A 8E 8E 8F 93 8B 85 94 83 8F 85 94 84 8F 7D A7' + 'AB A9 A5 9E 9D AD 5F E1 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 14 B7 D7 CF CF CE D1 CF CD CC CA C8' + 'C6 C5 C3 C2 BF BF C0 BC BD BA BA B6 B6 B3 B4 AF' + 'AE AD AA A5 9B AE 5F E1 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 14 B7 DB DC DA DA DA D9 D9 D8 D8 D7' + 'D7 D7 D6 D6 D5 D5 D5 D4 D4 D4 D3 D3 D2 D2 D1 D1' + 'D1 D0 D0 CF C4 B4 5E E1 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 13 BA E0 CD C5 C6 C6 C4 C3 C3 C3 C3' + 'C3 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4' + 'C6 C7 C7 C7 DC D3 5D E1 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 13 C2 DC BD A5 90 95 BC BE BD BD BD' + 'BD BD BD BD BD BD BD BD BD BD BD BD BD BD BD BF' + 'B3 92 90 B5 C2 E0 68 E1 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 0F BE D7 A9 7B 8B 84 9E BE BC BC BC' + 'BC BC BB BB BB BB BB BB BB BB BC BC BC BC BD B6' + '7A 8A 85 89 BC DF 69 E1 E1 00 00 00 00 00 00 00' + '00 00 E1 E1 03 9D DA 92 86 9E 7D 90 BC B9 B9 B9' + 'B8 B7 B7 B9 BB BC BC BB B9 B7 B7 B7 B8 B9 BB AD' + '78 9E 87 81 BA D9 43 E1 E1 00 00 00 00 00 00 00' + '00 00 00 E1 E1 76 D8 B3 A7 B6 95 AD B7 B6 B4 B7' + 'C1 C5 C7 CA CE D1 D1 CF CB C8 C6 C2 B8 B4 B6 B7' + 'A7 B4 9D 95 BD CC 2D E1 E1 00 00 00 00 00 00 00' + '00 00 00 E1 E1 4A D3 B5 B3 AF B3 B5 B2 B3 C3 D4' + 'D0 C5 C2 C1 C0 BF BF C0 C1 C2 C5 D0 D5 C5 B5 B2' + 'B4 AF B2 B5 BD B8 23 E1 E1 00 00 00 00 00 00 00' + '00 00 00 E1 E1 2F CD B4 B1 B1 B1 AE BA D1 CA C0' + 'B8 B9 BA BA BA BA BA BA BA BA B9 B9 BF C8 D1 BE' + 'AE B1 B1 AF C3 8D 12 E1 E1 00 00 00 00 00 00 00' + '00 00 00 E1 E1 24 BB B6 AE AF AE B8 CD C0 B4 B5' + 'B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B5 B4 BC CE' + 'BC AD AE AD C4 72 06 E1 E1 00 00 00 00 00 00 00' + '00 00 00 E1 E1 12 8B BF AE AF B2 C8 B8 B3 B5 B4' + 'B4 B4 B4 B3 B1 B2 B2 B2 B2 B2 B2 B2 B2 B2 B0 B4' + 'C6 B3 AA AD C6 55 E1 E1 E1 00 00 00 00 00 00 00' + '00 00 00 E1 E1 05 6B C1 B0 B1 BF BA B2 B4 B4 B4' + 'B4 B4 B4 B3 B0 AD AE AE AE AE AE AE AE AE AE AB' + 'B3 BE AA AD C6 30 E1 E1 E1 00 00 00 00 00 00 00' + '00 00 00 00 E1 E1 57 C1 B3 B5 BF B5 B4 B4 B4 B4' + 'B4 B4 B4 B4 B3 AD A7 A9 A9 A9 A9 A9 A9 A9 A9 A9' + 'AA B7 AB AD C2 26 E1 E1 00 00 00 00 00 00 00 00' + '00 00 00 00 E1 E1 33 C0 B5 B6 B8 B5 B5 B5 B5 B5' + 'B5 B5 B5 B5 B5 B4 AB 9E 9E 9E A5 A5 A5 A5 A5 A5' + 'A5 AA A7 AF B0 1B E1 E1 00 00 00 00 00 00 00 00' + '00 00 00 00 E1 E1 25 BC B8 B6 B4 B7 B7 B7 B7 B7' + 'B7 B7 B7 B7 B7 B7 B7 B1 AA A5 9D 9C 9B 9C 9C 9C' + '9D 95 9B B2 86 0D E1 E1 00 00 00 00 00 00 00 00' + '00 00 00 00 E1 E1 1A B0 BA B9 B0 B9 BA BA BA BA' + 'BA BA BA BA BA BA BA BB BA B9 B7 B3 B0 AD A9 A5' + '9D 87 93 B4 67 07 E1 E1 00 00 00 00 00 00 00 00' + '00 00 00 00 E1 E1 0B 84 BF BF B4 B6 BF BD BE BE' + 'BE BE BE BE BE BE BE BE BE BE BE BF BF BE BD BD' + 'B3 A7 B0 AE 47 02 E1 E1 00 00 00 00 00 00 00 00' + '00 00 00 00 E1 E1 06 65 C0 C3 C0 B2 BA C2 C1 C1' + 'C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C1 C2 BC' + 'B2 C1 C0 A9 2C E1 E1 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 E1 E1 44 B7 C6 C5 C2 B2 BB C5 C6' + 'C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C4 C5 C5 BD B1' + 'BE C7 BD 90 20 E1 E1 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 E1 E1 2A AD C9 C7 C8 C5 BB B6 BE' + 'C8 C9 C8 C8 C8 C8 C8 C8 C8 C8 C9 C9 C0 B6 BA C4' + 'C8 CA BA 7A 10 E1 E1 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 E1 E1 1F 93 CA CA CA CB CB C3 B6' + 'B7 C2 C7 C7 C8 C8 C8 C8 C7 C7 C2 B8 B5 C1 CB CB' + 'CA CC B8 68 08 E1 E1 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 E1 E1 0E 7D C8 D1 CB CA D0 CF CE' + 'C8 C4 C3 C3 C1 C0 C0 C1 C3 C3 C3 C6 CD D0 CE C9' + 'CF CF BA 5C E1 E1 E1 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 E1 E1 06 67 C8 C3 93 9C BA D0 D1' + 'D1 D2 D2 D1 D0 CF CF D0 D1 D2 D2 D1 D2 C8 9D 94' + 'B5 D0 B8 42 E1 E1 E1 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 E1 E1 5E C4 A5 86 8D 86 CF D5' + 'D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D4 D7 B9 84 8A' + '8B CF B1 34 E1 E1 E1 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 E1 E1 36 B2 C1 C0 B9 C8 DD DD' + 'DD DD DD DD DD DD DD DD DD DD DD DD DE D6 C3 BC' + 'C0 BB 84 1E E1 E1 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 E1 E1 0C 55 94 B7 BB BF BC BC' + 'BC BC BC BC BC BC BC BC BC BC BC BC BC BD BD BB' + 'B1 84 32 04 E1 E1 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 E1 E1 E1 09 22 29 28 28 28 28' + '28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 29' + '29 1D 02 E1 E1 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 E1 E1 E1 E1 E1 E1 E1 E1 E1' + 'E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1' + 'E1 E1 E1 E1 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 E1 E1 E1 E1 E1 E1 E1' + 'E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1 E1' + 'E1 E1 E1 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FE 3F FF FF 00 00 FF FF' + 'FE 3F FF FF 00 00 FF FF FE 3F FF FF 00 00 FC 00' + '00 00 00 7F 00 00 F8 00 00 00 00 3F 00 00 F8 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FF 00 00 00 00 7F 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 01 FF 00 00 FF 80 00 00 03 FF 00 00 FF E0' + '00 00 07 FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 04 00 00 00' + '00 00 80 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 0E E0 00 00 00 00 00 00 00 00 00 00 00 88 88' + '88 88 88 88 88 88 88 88 88 EE EE 88 88 88 88 88' + '88 88 88 88 88 88 77 77 77 77 77 77 77 77 77 77' + '77 EE EE 77 77 77 77 77 77 77 77 77 77 77 00 00' + '00 00 00 00 00 00 00 00 00 0E E0 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 07 70 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 07 70 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 87 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 78 00 00 00 00 00 00' + '00 08 FF F7 88 88 77 77 77 77 77 77 77 77 77 77' + '66 87 80 00 00 00 00 00 00 07 FF F7 00 88 88 87' + '77 77 87 87 77 77 87 78 66 67 80 00 00 00 00 00' + '00 07 FF F7 88 88 88 77 77 77 87 87 87 87 87 77' + '77 87 80 00 00 00 00 00 00 07 FF F7 88 88 88 77' + '77 78 87 87 87 87 87 77 77 77 80 00 00 00 00 00' + '00 07 FF F7 88 88 88 77 77 78 87 87 87 87 87 77' + '77 77 80 00 00 00 00 00 00 07 FF F7 88 88 88 87' + '77 78 87 88 87 87 87 77 77 77 80 00 00 00 00 00' + '00 07 FF F7 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 80 00 00 00 00 00 00 07 FF FF FF FF FF FF' + '77 77 77 77 77 77 77 77 77 77 80 00 00 00 00 00' + '00 07 FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF F7 80 00 00 00 00 00 00 07 FF FF FF 77 77 7F' + 'FF FF FF FF FF FF FF FF FF FF 80 00 00 00 00 00' + '00 07 F7 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 7F 80 00 00 00 00 00 00 07 F7 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 7F 80 00 00 00 00 00' + '00 07 F7 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 7F 80 00 00 00 00 00 00 07 F7 77 77 77 77 7F' + 'FF FF FF FF F7 77 77 77 77 7F 80 00 00 00 00 00' + '00 08 F7 77 77 77 7F FF 77 77 77 77 FF FF 77 77' + '77 77 00 00 00 00 00 00 00 08 F7 77 77 7F F7 77' + '77 77 77 77 77 7F F7 77 77 77 00 00 00 00 00 00' + '00 00 77 77 77 F7 77 77 77 77 77 77 77 77 7F 77' + '77 F7 00 00 00 00 00 00 00 00 77 77 7F 77 77 77' + '77 77 77 77 77 77 77 F7 77 F8 00 00 00 00 00 00' + '00 00 87 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 F8 00 00 00 00 00 00 00 00 87 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 78 00 00 00 00 00 00' + '00 00 87 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 70 00 00 00 00 00 00 00 00 87 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 70 00 00 00 00 00 00' + '00 00 07 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 80 00 00 00 00 00 00 00 00 07 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 80 00 00 00 00 00 00' + '00 00 08 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 80 00 00 00 00 00 00 00 00 08 7F F7 77 77 77' + '77 77 77 77 77 77 77 7F 77 00 00 00 00 00 00 00' + '00 00 08 7F FF F7 77 77 77 77 77 77 77 77 7F FF' + '77 00 00 00 00 00 00 00 00 00 00 7F FF FF 77 77' + '77 77 77 77 77 77 FF FF 78 00 00 00 00 00 00 00' + '00 00 00 7F FF FF FF FF 77 77 77 77 7F FF FF FF' + '78 00 00 00 00 00 00 00 00 00 00 8F 77 77 FF FF' + 'FF FF FF FF FF FF 77 7F 78 00 00 00 00 00 00 00' + '00 00 00 8F 77 77 FF FF FF FF FF FF FF F7 77 7F' + '78 00 00 00 00 00 00 00 00 00 00 87 77 7F FF FF' + 'FF FF FF FF FF FF 77 77 70 00 00 00 00 00 00 00' + '00 00 00 08 77 77 77 77 77 77 77 77 77 77 77 77' + '80 00 00 00 00 00 00 00 00 00 00 00 08 88 88 88' + '88 88 88 88 88 88 88 80 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FE 3F FF FF 00 00 FF FF FE 3F FF FF 00 00 FF FF' + 'FE 3F FF FF 00 00 FC 00 00 00 00 7F 00 00 F8 00' + '00 00 00 3F 00 00 F8 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FF 00' + '00 00 00 7F 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 01 FF 00 00 FF 80' + '00 00 03 FF 00 00 FF E0 00 00 07 FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 00 24 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 48 00 00' + '00 78 00 00 00 78 00 00 00 48 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 DC DC FF 00 DC' + 'DC FF 00 00 00 B4 00 00 00 9C 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 00 DC DC FF 00 FF FF FF 00 FF' + 'FF FF 00 DC DC FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF 6B FF FF FF 6B FF FF FF 6B FF' + 'FF FF 6B FF FF FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 6B FF FF FF 6B FF' + 'FF FF 00 00 00 90 00 00 00 30 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C0 C0 C0 FF C0 C0' + 'C0 FF 00 00 00 92 00 00 00 37 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 16 00 00 00 34 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 C0 C0 C0 FF C0 C0' + 'C0 FF 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 35 00 00 00 18 00 00' + '00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 69 00 00' + '00 C5 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F1 00 00 00 B1 00 00' + '00 5C 00 00 00 0D 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 05 00 00 00 9B 00 00 00 FF 00 00' + '00 FF 21 21 21 FF 2C 2C 2C FF 2B 2B 2B FF 2C 2C' + '2C FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2E 2C' + '2D FF 2E 2C 2D FF 13 13 13 FF 00 00 00 FF 00 00' + '00 F6 00 00 00 69 00 00 00 09 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 54 00 00 00 FF 26 26 26 FF 90 90' + '90 FF CA CA CA FF CD CD CD FF CB CB CB FF CE CE' + 'CE FF CD CD CD FF CC CC CC FF CB CB CB FF C9 C9' + 'C9 FF C7 C7 C7 FF C6 C6 C6 FF C5 C5 C5 FF C4 C4' + 'C4 FF C3 C3 C3 FF C2 C2 C2 FF C2 C2 C2 FF C3 C3' + 'C3 FF C0 C0 C0 FF C1 C1 C1 FF BF BF BF FF BF BF' + 'BF FF BC BC BC FF BD BD BD FF BA BA BA FF BB BB' + 'BB FF B5 B5 B5 FF B3 B4 B3 FF B8 B4 B6 FF AD AD' + 'AD FF AB AC AC FF AD A8 AB FF 63 63 63 FF 09 09' + '09 FF 00 00 00 EF 00 00 00 42 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 03 00 00 00 AD 01 01 01 FF 8A 8A 8A FF EB EB' + 'EB FF E8 E8 E8 FF E7 E7 E7 FF D5 D5 D5 FF 85 85' + '85 FF 88 88 88 FF 92 92 92 FF 98 98 98 FF A2 A2' + 'A2 FF AD AD AD FF BA BA BA FF C0 C0 C0 FF C3 C3' + 'C3 FF C6 C6 C6 FF CB CB CB FF CA CA CA FF CA CA' + 'CA FF D6 D6 D6 FF CA CA CA FF D3 D3 D3 FF CB CB' + 'CB FF D7 D7 D7 FF CC CC CC FF D4 D4 D4 FF C7 C7' + 'C7 FF C8 C9 C9 FF C6 C2 C4 FF 9D B3 A8 FF 20 A8' + '63 FF 1C A8 60 FF 90 AF A0 FF BF BB BD FF 4F 4F' + '4F FF 00 00 00 FF 00 00 00 81 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 15 00 00 00 F0 19 19 19 FF C7 C7 C7 FF EC EC' + 'EC FF E2 E2 E2 FF E6 E6 E6 FF CB CB CB FF 3B 3B' + '3B FF 3F 3F 3F FF 56 56 56 FF 72 72 72 FF 87 87' + '87 FF 92 92 92 FF 9D 9D 9D FF A5 A5 A5 FF A8 A8' + 'A8 FF AC AC AC FF B7 B7 B7 FF A9 A9 A9 FF 9C 9C' + '9C FF BD BD BD FF 99 99 99 FF B7 B7 B7 FF A1 A1' + 'A1 FF C3 C3 C3 FF A3 A3 A3 FF BD BD BD FF 98 98' + '98 FF C5 C4 C4 FF C7 BF C3 FF 51 A7 7C FF 17 CE' + '71 FF 0A BF 61 FF 2F 99 64 FF C3 BD C0 FF 84 83' + '84 FF 01 01 01 FF 00 00 00 A3 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 30 00 00 00 FA 29 29 29 FF D1 D1 D1 FF EA EA' + 'EA FF E4 E4 E4 FF E7 E7 E7 FF CD CD CD FF 47 47' + '47 FF 5F 5F 5F FF 79 79 79 FF 87 87 87 FF 8F 8F' + '8F FF 97 97 97 FF A0 A0 A0 FF A7 A7 A7 FF AA AA' + 'AA FF AE AE AE FF B9 B9 B9 FF A4 A4 A4 FF 90 90' + '90 FF B8 B8 B8 FF 8A 8A 8A FF AF AF AF FF 94 94' + '94 FF BF BF BF FF 97 97 97 FF B7 B7 B7 FF 88 88' + '88 FF C4 C3 C3 FF C6 C3 C5 FF 95 B2 A3 FF 91 D6' + 'B4 FF 91 D8 B5 FF 83 AB 97 FF C4 C1 C3 FF 8E 8E' + '8E FF 01 01 01 FF 00 00 00 B7 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 34 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EC EC' + 'EC FF E6 E6 E6 FF E7 E7 E7 FF D1 D1 D1 FF 68 68' + '68 FF 74 74 74 FF 7E 7E 7E FF 85 85 85 FF 8E 8E' + '8E FF 97 97 97 FF A0 A0 A0 FF A7 A7 A7 FF AA AA' + 'AA FF AE AE AE FF BA BA BA FF 9F 9F 9F FF 83 83' + '83 FF B3 B3 B3 FF 7C 7C 7C FF A8 A8 A8 FF 87 87' + '87 FF BB BB BB FF 8A 8A 8A FF B2 B2 B2 FF 79 79' + '79 FF C2 C2 C2 FF C4 C4 C4 FF C6 C3 C4 FF 99 AC' + 'A2 FF 96 AB A0 FF C2 BE C0 FF C4 C4 C4 FF 8D 8D' + '8D FF 01 01 01 FF 00 00 00 BA 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EE EE' + 'EE FF E7 E7 E7 FF E8 E8 E8 FF D6 D6 D6 FF 70 70' + '70 FF 71 71 71 FF 7D 7D 7D FF 85 85 85 FF 8E 8E' + '8E FF 97 97 97 FF A0 A0 A0 FF A7 A7 A7 FF AA AA' + 'AA FF AE AE AE FF BB BB BB FF 98 98 98 FF 73 73' + '73 FF AD AD AD FF 6A 6A 6A FF A0 A0 A0 FF 78 78' + '78 FF B7 B7 B7 FF 7C 7C 7C FF AB AB AB FF 67 67' + '67 FF C2 C2 C2 FF C6 C6 C6 FF C4 C3 C4 FF C7 C4' + 'C5 FF C6 C2 C4 FF BF BF BF FF C5 C5 C5 FF 8D 8D' + '8D FF 01 01 01 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 27 27 27 FF D1 D1 D1 FF EF EF' + 'EF FF E9 E9 E9 FF EB EB EB FF D6 D6 D6 FF 6A 6A' + '6A FF 6C 6C 6C FF 78 78 78 FF 81 81 81 FF 8A 8A' + '8A FF 93 93 93 FF 9C 9C 9C FF A3 A3 A3 FF A6 A6' + 'A6 FF AB AB AB FF B9 B9 B9 FF 90 90 90 FF 66 66' + '66 FF A5 A5 A5 FF 5B 5B 5B FF 98 98 98 FF 6B 6B' + '6B FF B1 B1 B1 FF 70 70 70 FF A4 A4 A4 FF 58 58' + '58 FF C1 C1 C1 FF C8 C8 C8 FF C5 C5 C5 FF C3 C3' + 'C3 FF C2 C2 C2 FF C1 C1 C1 FF C6 C6 C6 FF 8E 8E' + '8E FF 01 01 01 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 27 27 27 FF D2 D2 D2 FF F2 F2' + 'F2 FF EB EB EB FF EA EA EA FF DF DF DF FF A7 A7' + 'A7 FF A7 A7 A7 FF AB AB AB FF AE AE AE FF B0 B0' + 'B0 FF B3 B3 B3 FF B6 B6 B6 FF B9 B9 B9 FF B9 B9' + 'B9 FF BA BA BA FF BD BD BD FF B7 B7 B7 FF B1 B1' + 'B1 FF BE BE BE FF AF AF AF FF BA BA BA FF B1 B1' + 'B1 FF BE BE BE FF B0 B0 B0 FF BA BA BA FF AB AB' + 'AB FF C5 C5 C5 FF C8 C8 C8 FF C6 C6 C6 FF C4 C4' + 'C4 FF C3 C3 C3 FF C2 C2 C2 FF C9 C9 C9 FF 8E 8E' + '8E FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF F3 F3' + 'F3 FF EB EB EB FF EB EB EB FF EA EA EA FF ED ED' + 'ED FF EB EB EB FF E9 E9 E9 FF E8 E8 E8 FF E6 E6' + 'E6 FF E4 E4 E4 FF E2 E2 E2 FF E1 E1 E1 FF DF DF' + 'DF FF DE DE DE FF DB DB DB FF DB DB DB FF DC DC' + 'DC FF D8 D8 D8 FF D9 D9 D9 FF D6 D6 D6 FF D6 D6' + 'D6 FF D2 D2 D2 FF D2 D2 D2 FF CF CF CF FF D0 D0' + 'D0 FF CB CB CB FF CA CA CA FF C9 C9 C9 FF C7 C7' + 'C7 FF C4 C4 C4 FF C0 C0 C0 FF CA CA CA FF 8E 8E' + '8E FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF F7 F7' + 'F7 FF F8 F8 F8 FF F6 F6 F6 FF F6 F6 F6 FF F6 F6' + 'F6 FF F5 F5 F5 FF F5 F5 F5 FF F4 F4 F4 FF F4 F4' + 'F4 FF F3 F3 F3 FF F3 F3 F3 FF F3 F3 F3 FF F2 F2' + 'F2 FF F2 F2 F2 FF F1 F1 F1 FF F1 F1 F1 FF F1 F1' + 'F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF EF EF' + 'EF FF EF EF EF FF EE EE EE FF EE EE EE FF ED ED' + 'ED FF ED ED ED FF ED ED ED FF EC EC EC FF EC EC' + 'EC FF EB EB EB FF E0 E0 E0 FF D0 D0 D0 FF 8D 8D' + '8D FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 24 24 24 FF D6 D6 D6 FF FF FF' + 'FF FF E9 E9 E9 FF E1 E1 E1 FF E2 E2 E2 FF E2 E2' + 'E2 FF E0 E0 E0 FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3' + 'E3 FF E3 E3 E3 FF F8 F8 F8 FF EF EF EF FF 8C 8C' + '8C FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 34 00 00 00 FA 24 24 24 FF DE DE DE FF F8 F8' + 'F8 FF D9 D9 D9 FF C4 C4 C4 FF BB BB BB FF BF BF' + 'BF FF D8 D8 D8 FF DA DA DA FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF DB DB DB FF CF CF CF FF BC BC BC FF BB BB' + 'BB FF D1 D1 D1 FF DE DE DE FF FF FF FF FF 9A 9A' + '9A FF 00 00 00 FF 00 00 00 BA 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 25 00 00 00 F7 1F 1F 1F FF DA DA DA FF F3 F3' + 'F3 FF C6 C6 C6 FF A9 A9 A9 FF B7 B7 B7 FF B0 B0' + 'B0 FF C3 C3 C3 FF DA DA DA FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D9 D9' + 'D9 FF D2 D2 D2 FF A8 A8 A8 FF B6 B6 B6 FF B1 B1' + 'B1 FF B5 B5 B5 FF D8 D8 D8 FF FC FC FC FF 9C 9C' + '9C FF 00 00 00 FF 00 00 00 AE 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 07 00 00 00 D0 05 05 05 FF C2 C2 C2 FF F6 F6' + 'F6 FF BC BC BC FF B2 B2 B2 FF C3 C3 C3 FF AB AB' + 'AB FF BB BB BB FF D8 D8 D8 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D4 D4 D4 FF D3 D3 D3 FF D3 D3' + 'D3 FF D5 D5 D5 FF D7 D7 D7 FF D8 D8 D8 FF D8 D8' + 'D8 FF D7 D7 D7 FF D5 D5 D5 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D4 D4 D4 FF D5 D5 D5 FF D7 D7' + 'D7 FF C9 C9 C9 FF A6 A6 A6 FF C3 C3 C3 FF B3 B3' + 'B3 FF AD AD AD FF D6 D6 D6 FF F5 F5 F5 FF 76 76' + '76 FF 00 00 00 FF 00 00 00 8C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 9C 00 00 00 FF A4 A4 A4 FF F4 F4' + 'F4 FF CF CF CF FF C5 C5 C5 FF D2 D2 D2 FF BF BF' + 'BF FF C9 C9 C9 FF D3 D3 D3 FF D2 D2 D2 FF D0 D0' + 'D0 FF D3 D3 D3 FF DD DD DD FF E1 E1 E1 FF E3 E3' + 'E3 FF E6 E6 E6 FF EA EA EA FF ED ED ED FF ED ED' + 'ED FF EB EB EB FF E7 E7 E7 FF E4 E4 E4 FF E2 E2' + 'E2 FF DE DE DE FF D4 D4 D4 FF D0 D0 D0 FF D2 D2' + 'D2 FF D3 D3 D3 FF C5 C5 C5 FF D0 D0 D0 FF C2 C2' + 'C2 FF BF BF BF FF D9 D9 D9 FF E8 E8 E8 FF 56 56' + '56 FF 00 00 00 FF 00 00 00 72 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 73 00 00 00 FF 7E 7E 7E FF EF EF' + 'EF FF D1 D1 D1 FF CF CF CF FF CB CB CB FF CF CF' + 'CF FF D1 D1 D1 FF CE CE CE FF CF CF CF FF DF DF' + 'DF FF F0 F0 F0 FF EC EC EC FF E1 E1 E1 FF DE DE' + 'DE FF DD DD DD FF DC DC DC FF DB DB DB FF DB DB' + 'DB FF DC DC DC FF DD DD DD FF DE DE DE FF E1 E1' + 'E1 FF EC EC EC FF F1 F1 F1 FF E1 E1 E1 FF D1 D1' + 'D1 FF CE CE CE FF D0 D0 D0 FF CB CB CB FF CE CE' + 'CE FF D1 D1 D1 FF D9 D9 D9 FF D4 D4 D4 FF 3F 3F' + '3F FF 00 00 00 FF 00 00 00 55 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 59 00 00 00 FF 59 59 59 FF E9 E9' + 'E9 FF D0 D0 D0 FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF CA CA CA FF D6 D6 D6 FF ED ED ED FF E6 E6' + 'E6 FF DC DC DC FF D4 D4 D4 FF D5 D5 D5 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D5 D5' + 'D5 FF D5 D5 D5 FF DB DB DB FF E4 E4 E4 FF ED ED' + 'ED FF DA DA DA FF CA CA CA FF CD CD CD FF CD CD' + 'CD FF CB CB CB FF DF DF DF FF B8 B8 B8 FF 22 22' + '22 FF 00 00 00 FB 00 00 00 3A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 3E 00 00 00 FE 40 40 40 FF D7 D7' + 'D7 FF D2 D2 D2 FF CA CA CA FF CB CB CB FF CA CA' + 'CA FF D4 D4 D4 FF E9 E9 E9 FF DC DC DC FF D0 D0' + 'D0 FF D1 D1 D1 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D1 D1 D1 FF D0 D0 D0 FF D8 D8' + 'D8 FF EA EA EA FF D8 D8 D8 FF C9 C9 C9 FF CA CA' + 'CA FF C9 C9 C9 FF E0 E0 E0 FF A0 A0 A0 FF 08 08' + '08 FF 00 00 00 EB 00 00 00 22 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 25 00 00 00 F8 22 22 22 FF B7 B7' + 'B7 FF DB DB DB FF CA CA CA FF CB CB CB FF CE CE' + 'CE FF E4 E4 E4 FF D4 D4 D4 FF CF CF CF FF D1 D1' + 'D1 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF CF CF CF FF CD CD CD FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF CE CE CE FF CC CC' + 'CC FF D0 D0 D0 FF E2 E2 E2 FF CF CF CF FF C7 C7' + 'C7 FF C9 C9 C9 FF E2 E2 E2 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 C2 00 00 00 0E 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0C 00 00 00 E1 07 07 07 FF 9F 9F' + '9F FF DD DD DD FF CC CC CC FF CD CD CD FF DB DB' + 'DB FF D6 D6 D6 FF CE CE CE FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF CF CF CF FF CC CC CC FF C9 C9 C9 FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF C8 C8 C8 FF CF CF CF FF DA DA DA FF C7 C7' + 'C7 FF C9 C9 C9 FF E2 E2 E2 FF 5A 5A 5A FF 00 00' + '00 FF 00 00 00 94 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 B2 00 00 00 FF 83 83' + '83 FF DD DD DD FF CF CF CF FF D1 D1 D1 FF DB DB' + 'DB FF D1 D1 D1 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF CF CF CF FF C9 C9 C9 FF C5 C5' + 'C5 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C7 C7 C7 FF D3 D3 D3 FF C8 C8' + 'C8 FF C9 C9 C9 FF DE DE DE FF 42 42 42 FF 00 00' + '00 FF 00 00 00 6C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 80 00 00 00 FF 5F 5F' + '5F FF DC DC DC FF D1 D1 D1 FF D2 D2 D2 FF D4 D4' + 'D4 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D0 D0 D0 FF C8 C8' + 'C8 FF C3 C3 C3 FF C3 C3 C3 FF C3 C3 C3 FF C4 C4' + 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' + 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C7 C7 C7 FF C5 C5' + 'C5 FF CB CB CB FF CC CC CC FF 2D 2D 2D FF 00 00' + '00 F8 00 00 00 40 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 4B 00 00 00 FE 41 41' + '41 FF D8 D8 D8 FF D4 D4 D4 FF D2 D2 D2 FF D0 D0' + 'D0 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF CD CD CD FF C7 C7 C7 FF C4 C4 C4 FF C2 C2' + 'C2 FF C1 C1 C1 FF C0 C0 C0 FF C1 C1 C1 FF C1 C1' + 'C1 FF C1 C1 C1 FF C2 C2 C2 FF BF BF BF FF C0 C0' + 'C0 FF CE CE CE FF B2 B2 B2 FF 1A 1A 1A FF 00 00' + '00 E5 00 00 00 28 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 1A 00 00 00 F2 2C 2C' + '2C FF CC CC CC FF D6 D6 D6 FF D5 D5 D5 FF CC CC' + 'CC FF D5 D5 D5 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D7 D7 D7 FF D6 D6 D6 FF D5 D5 D5 FF D3 D3' + 'D3 FF CF CF CF FF CC CC CC FF C9 C9 C9 FF C6 C6' + 'C6 FF C4 C4 C4 FF C2 C2 C2 FF B3 B3 B3 FF BD BD' + 'BD FF D0 D0 D0 FF 99 99 99 FF 09 09 09 FF 00 00' + '00 CF 00 00 00 19 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 00 00 00 D8 18 18' + '18 FF B0 B0 B0 FF DB DB DB FF DB DB DB FF D0 D0' + 'D0 FF D2 D2 D2 FF DB DB DB FF D9 D9 D9 FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DB DB DB FF DB DB DB FF DA DA DA FF D9 D9' + 'D9 FF D9 D9 D9 FF CF CF CF FF C5 C5 C5 FF CC CC' + 'CC FF CA CA CA FF 7A 7A 7A FF 02 02 02 FF 00 00' + '00 B8 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 02 00 00 00 BF 08 08' + '08 FF 97 97 97 FF DC DC DC FF DF DF DF FF DC DC' + 'DC FF CE CE CE FF D6 D6 D6 FF DE DE DE FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DE DE' + 'DE FF D8 D8 D8 FF CE CE CE FF DD DD DD FF DC DC' + 'DC FF C6 C6 C6 FF 53 53 53 FF 00 00 00 FF 00 00' + '00 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 A4 00 00' + '00 FF 77 77 77 FF D3 D3 D3 FF E2 E2 E2 FF E1 E1' + 'E1 FF DE DE DE FF CE CE CE FF D7 D7 D7 FF E1 E1' + 'E1 FF E2 E2 E2 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E1 E1 E1 FF E1 E1 E1 FF D9 D9' + 'D9 FF CD CD CD FF DA DA DA FF E3 E3 E3 FF D9 D9' + 'D9 FF BB BB BB FF 39 39 39 FF 00 00 00 FF 00 00' + '00 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 89 00 00' + '00 FF 4B 4B 4B FF C9 C9 C9 FF E5 E5 E5 FF E3 E3' + 'E3 FF E4 E4 E4 FF E1 E1 E1 FF D7 D7 D7 FF D2 D2' + 'D2 FF DA DA DA FF E4 E4 E4 FF E5 E5 E5 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5' + 'E5 FF E5 E5 E5 FF DC DC DC FF D2 D2 D2 FF D6 D6' + 'D6 FF E0 E0 E0 FF E4 E4 E4 FF E6 E6 E6 FF D6 D6' + 'D6 FF A8 A8 A8 FF 20 20 20 FF 00 00 00 FD 00 00' + '00 4E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 62 00 00' + '00 FF 35 35 35 FF BD BD BD FF E6 E6 E6 FF E6 E6' + 'E6 FF E6 E6 E6 FF E7 E7 E7 FF E7 E7 E7 FF DF DF' + 'DF FF D2 D2 D2 FF D3 D3 D3 FF DE DE DE FF E3 E3' + 'E3 FF E3 E3 E3 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E3 E3 E3 FF E3 E3 E3 FF DE DE' + 'DE FF D4 D4 D4 FF D1 D1 D1 FF DD DD DD FF E7 E7' + 'E7 FF E7 E7 E7 FF E6 E6 E6 FF E8 E8 E8 FF D4 D4' + 'D4 FF 9A 9A 9A FF 0B 0B 0B FF 00 00 00 ED 00 00' + '00 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2D 00 00' + '00 F9 1E 1E 1E FF AB AB AB FF E4 E4 E4 FF ED ED' + 'ED FF E7 E7 E7 FF E6 E6 E6 FF EC EC EC FF EB EB' + 'EB FF EA EA EA FF E4 E4 E4 FF E0 E0 E0 FF DF DF' + 'DF FF DF DF DF FF DD DD DD FF DC DC DC FF DC DC' + 'DC FF DD DD DD FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF E2 E2 E2 FF E9 E9 E9 FF EC EC EC FF EA EA' + 'EA FF E5 E5 E5 FF EB EB EB FF EB EB EB FF D6 D6' + 'D6 FF 8A 8A 8A FF 00 00 00 FF 00 00 00 C3 00 00' + '00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00' + '00 DD 08 08 08 FF 99 99 99 FF E4 E4 E4 FF DF DF' + 'DF FF BD BD BD FF C1 C1 C1 FF D6 D6 D6 FF EC EC' + 'EC FF ED ED ED FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EB EB EB FF EB EB' + 'EB FF EC EC EC FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EE EE EE FF E4 E4 E4 FF C2 C2' + 'C2 FF BE BE BE FF D1 D1 D1 FF EC EC EC FF D4 D4' + 'D4 FF 75 75 75 FF 00 00 00 FF 00 00 00 9C 00 00' + '00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 AE 00 00 00 FF 8D 8D 8D FF E0 E0 E0 FF C4 C4' + 'C4 FF B2 B2 B2 FF B8 B8 B8 FF B2 B2 B2 FF EB EB' + 'EB FF F1 F1 F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F3 F3 F3 FF D5 D5 D5 FF B0 B0' + 'B0 FF B6 B6 B6 FF B7 B7 B7 FF EB EB EB FF CD CD' + 'CD FF 61 61 61 FF 00 00 00 FF 00 00 00 85 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 80 00 00 00 FF 64 64 64 FF CE CE CE FF DD DD' + 'DD FF DC DC DC FF D5 D5 D5 FF E4 E4 E4 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF FA FA FA FF F2 F2 F2 FF DF DF' + 'DF FF D8 D8 D8 FF DC DC DC FF D7 D7 D7 FF B0 B0' + 'B0 FF 34 34 34 FF 00 00 00 FF 00 00 00 67 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 44 00 00 00 FF 19 19 19 FF 80 80 80 FF BE BE' + 'BE FF D3 D3 D3 FF D7 D7 D7 FF DB DB DB FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D9 D9 D9 FF D9 D9' + 'D9 FF D7 D7 D7 FF CD CD CD FF B0 B0 B0 FF 5D 5D' + '5D FF 06 06 06 FF 00 00 00 ED 00 00 00 2B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 02 00 00 00 9C 00 00 00 FF 0C 0C 0C FF 3D 3D' + '3D FF 49 49 49 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 49 49 49 FF 49 49 49 FF 2F 2F 2F FF 02 02' + '02 FF 00 00 00 FF 00 00 00 5C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 06 00 00 00 7F 00 00 00 F1 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 D6 00 00 00 5C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2C 00 00' + '00 7E 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 70 00 00' + '00 1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FE 1F FF FF 00 00 FF FF' + 'FE 1F FF FF 00 00 FF 00 00 00 00 7F 00 00 FC 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FF 00 00 00 00 7F 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 01 FF 00 00 FF 80 00 00 03 FF 00 00 FF E0' + '00 00 07 FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 20 00 00 00' + '00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 DC DC FF 00 DC DC FF 00 00 00 9C 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 00 FF FF FF 00 FF FF FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 6B FF FF FF 6B FF FF FF 00 00 00 30 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 C0 C0 C0 FF C0 C0 C0 FF 00 00 00 37 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 C5 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F1 00 00' + '00 B1 00 00 00 0D 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 05 00 00 00 9B 00 00 00 FF 21 21' + '21 FF 2B 2B 2B FF 2C 2C 2C FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2B 2B' + '2B FF 2B 2B 2B FF 2E 2C 2D FF 13 13 13 FF 00 00' + '00 FF 00 00 00 69 00 00 00 09 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 AD 01 01 01 FF EB EB EB FF E8 E8' + 'E8 FF D5 D5 D5 FF 85 85 85 FF 92 92 92 FF 98 98' + '98 FF AD AD AD FF BA BA BA FF C3 C3 C3 FF C6 C6' + 'C6 FF CA CA CA FF CA CA CA FF CA CA CA FF D3 D3' + 'D3 FF D7 D7 D7 FF CC CC CC FF C7 C7 C7 FF C8 C9' + 'C9 FF 9D B3 A8 FF 20 A8 63 FF 90 AF A0 FF BF BB' + 'BD FF 00 00 00 FF 00 00 00 81 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 F0 19 19 19 FF EC EC EC FF E2 E2' + 'E2 FF CB CB CB FF 3B 3B 3B FF 56 56 56 FF 72 72' + '72 FF 92 92 92 FF 9D 9D 9D FF A8 A8 A8 FF AC AC' + 'AC FF A9 A9 A9 FF 9C 9C 9C FF 99 99 99 FF B7 B7' + 'B7 FF C3 C3 C3 FF A3 A3 A3 FF 98 98 98 FF C5 C4' + 'C4 FF 51 A7 7C FF 17 CE 71 FF 2F 99 64 FF C3 BD' + 'C0 FF 01 01 01 FF 00 00 00 A3 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 F9 28 28 28 FF EC EC EC FF E6 E6' + 'E6 FF D1 D1 D1 FF 68 68 68 FF 7E 7E 7E FF 85 85' + '85 FF 97 97 97 FF A0 A0 A0 FF AA AA AA FF AE AE' + 'AE FF 9F 9F 9F FF 83 83 83 FF 7C 7C 7C FF A8 A8' + 'A8 FF BB BB BB FF 8A 8A 8A FF 79 79 79 FF C2 C2' + 'C2 FF C6 C3 C4 FF 99 AC A2 FF C2 BE C0 FF C4 C4' + 'C4 FF 01 01 01 FF 00 00 00 BA 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 F9 28 28 28 FF EE EE EE FF E7 E7' + 'E7 FF D6 D6 D6 FF 70 70 70 FF 7D 7D 7D FF 85 85' + '85 FF 97 97 97 FF A0 A0 A0 FF AA AA AA FF AE AE' + 'AE FF 98 98 98 FF 73 73 73 FF 6A 6A 6A FF A0 A0' + 'A0 FF B7 B7 B7 FF 7C 7C 7C FF 67 67 67 FF C2 C2' + 'C2 FF C4 C3 C4 FF C7 C4 C5 FF BF BF BF FF C5 C5' + 'C5 FF 01 01 01 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 F9 27 27 27 FF F2 F2 F2 FF EB EB' + 'EB FF DF DF DF FF A7 A7 A7 FF AB AB AB FF AE AE' + 'AE FF B3 B3 B3 FF B6 B6 B6 FF B9 B9 B9 FF BA BA' + 'BA FF B7 B7 B7 FF B1 B1 B1 FF AF AF AF FF BA BA' + 'BA FF BE BE BE FF B0 B0 B0 FF AB AB AB FF C5 C5' + 'C5 FF C6 C6 C6 FF C4 C4 C4 FF C2 C2 C2 FF C9 C9' + 'C9 FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 F9 26 26 26 FF F3 F3 F3 FF EB EB' + 'EB FF EA EA EA FF ED ED ED FF E9 E9 E9 FF E8 E8' + 'E8 FF E4 E4 E4 FF E2 E2 E2 FF DF DF DF FF DE DE' + 'DE FF DB DB DB FF DC DC DC FF D9 D9 D9 FF D6 D6' + 'D6 FF D2 D2 D2 FF D2 D2 D2 FF D0 D0 D0 FF CB CB' + 'CB FF C9 C9 C9 FF C7 C7 C7 FF C0 C0 C0 FF CA CA' + 'CA FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 F9 24 24 24 FF FF FF FF FF E9 E9' + 'E9 FF E2 E2 E2 FF E2 E2 E2 FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E3 E3 E3 FF E3 E3 E3 FF F8 F8 F8 FF EF EF' + 'EF FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 FA 24 24 24 FF F8 F8 F8 FF D9 D9' + 'D9 FF BB BB BB FF BF BF BF FF DA DA DA FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF DB DB' + 'DB FF BC BC BC FF BB BB BB FF DE DE DE FF FF FF' + 'FF FF 00 00 00 FF 00 00 00 BA 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 D0 05 05 05 FF F6 F6 F6 FF BC BC' + 'BC FF C3 C3 C3 FF AB AB AB FF D8 D8 D8 FF D5 D5' + 'D5 FF D5 D5 D5 FF D4 D4 D4 FF D3 D3 D3 FF D5 D5' + 'D5 FF D8 D8 D8 FF D8 D8 D8 FF D5 D5 D5 FF D3 D3' + 'D3 FF D3 D3 D3 FF D4 D4 D4 FF D7 D7 D7 FF C9 C9' + 'C9 FF C3 C3 C3 FF B3 B3 B3 FF D6 D6 D6 FF F5 F5' + 'F5 FF 00 00 00 FF 00 00 00 8C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 9C 00 00 00 FF F4 F4 F4 FF CF CF' + 'CF FF D2 D2 D2 FF BF BF BF FF D3 D3 D3 FF D2 D2' + 'D2 FF D3 D3 D3 FF DD DD DD FF E3 E3 E3 FF E6 E6' + 'E6 FF ED ED ED FF ED ED ED FF E7 E7 E7 FF E4 E4' + 'E4 FF DE DE DE FF D4 D4 D4 FF D2 D2 D2 FF D3 D3' + 'D3 FF D0 D0 D0 FF C2 C2 C2 FF D9 D9 D9 FF E8 E8' + 'E8 FF 00 00 00 FF 00 00 00 72 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 59 00 00 00 FF E9 E9 E9 FF D0 D0' + 'D0 FF CD CD CD FF CD CD CD FF D6 D6 D6 FF ED ED' + 'ED FF DC DC DC FF D4 D4 D4 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D5 D5 D5 FF DB DB DB FF ED ED ED FF DA DA' + 'DA FF CD CD CD FF CD CD CD FF DF DF DF FF B8 B8' + 'B8 FF 00 00 00 FB 00 00 00 3A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 3E 00 00 00 FE D7 D7 D7 FF D2 D2' + 'D2 FF CB CB CB FF CA CA CA FF E9 E9 E9 FF DC DC' + 'DC FF D1 D1 D1 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D1 D1 D1 FF D8 D8 D8 FF EA EA' + 'EA FF C9 C9 C9 FF CA CA CA FF E0 E0 E0 FF A0 A0' + 'A0 FF 00 00 00 EB 00 00 00 22 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0C 00 00 00 E1 9F 9F 9F FF DD DD' + 'DD FF CD CD CD FF DB DB DB FF CE CE CE FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF' + 'CF FF C9 C9 C9 FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF C8 C8' + 'C8 FF DA DA DA FF C7 C7 C7 FF E2 E2 E2 FF 5A 5A' + '5A FF 00 00 00 94 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 B2 83 83 83 FF DD DD' + 'DD FF D1 D1 D1 FF DB DB DB FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF C9 C9 C9 FF C5 C5 C5 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF D3 D3 D3 FF C8 C8 C8 FF DE DE DE FF 42 42' + '42 FF 00 00 00 6C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 4B 41 41 41 FF D8 D8' + 'D8 FF D2 D2 D2 FF D0 D0 D0 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF C7 C7 C7 FF C4 C4' + 'C4 FF C1 C1 C1 FF C0 C0 C0 FF C1 C1 C1 FF C1 C1' + 'C1 FF BF BF BF FF C0 C0 C0 FF B2 B2 B2 FF 1A 1A' + '1A FF 00 00 00 28 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 1A 2C 2C 2C FF CC CC' + 'CC FF D5 D5 D5 FF CC CC CC FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D5 D5' + 'D5 FF CF CF CF FF CC CC CC FF C6 C6 C6 FF C4 C4' + 'C4 FF B3 B3 B3 FF BD BD BD FF 99 99 99 FF 09 09' + '09 FF 00 00 00 19 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 02 08 08 08 FF 97 97' + '97 FF DF DF DF FF DC DC DC FF D6 D6 D6 FF DE DE' + 'DE FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DE DE DE FF D8 D8' + 'D8 FF DD DD DD FF DC DC DC FF 53 53 53 FF 00 00' + '00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 FF 77 77' + '77 FF E2 E2 E2 FF E1 E1 E1 FF CE CE CE FF D7 D7' + 'D7 FF E2 E2 E2 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E1 E1 E1 FF D9 D9 D9 FF CD CD' + 'CD FF E3 E3 E3 FF D9 D9 D9 FF 39 39 39 FF 00 00' + '00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 FF 35 35' + '35 FF E6 E6 E6 FF E6 E6 E6 FF E7 E7 E7 FF E7 E7' + 'E7 FF D2 D2 D2 FF D3 D3 D3 FF E3 E3 E3 FF E3 E3' + 'E3 FF E4 E4 E4 FF E4 E4 E4 FF E3 E3 E3 FF E3 E3' + 'E3 FF D4 D4 D4 FF D1 D1 D1 FF E7 E7 E7 FF E7 E7' + 'E7 FF E8 E8 E8 FF D4 D4 D4 FF 0B 0B 0B FF 00 00' + '00 ED 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 F9 1E 1E' + '1E FF E4 E4 E4 FF ED ED ED FF E6 E6 E6 FF EC EC' + 'EC FF EA EA EA FF E4 E4 E4 FF DF DF DF FF DF DF' + 'DF FF DC DC DC FF DC DC DC FF DF DF DF FF DF DF' + 'DF FF E2 E2 E2 FF E9 E9 E9 FF EA EA EA FF E5 E5' + 'E5 FF EB EB EB FF D6 D6 D6 FF 00 00 00 FF 00 00' + '00 C3 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 AE 00 00' + '00 FF E0 E0 E0 FF C4 C4 C4 FF B8 B8 B8 FF B2 B2' + 'B2 FF F1 F1 F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F3 F3 F3 FF B0 B0 B0 FF B6 B6' + 'B6 FF EB EB EB FF CD CD CD FF 00 00 00 FF 00 00' + '00 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00' + '00 FF CE CE CE FF DD DD DD FF D5 D5 D5 FF E4 E4' + 'E4 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF FA FA FA FF DF DF DF FF D8 D8' + 'D8 FF D7 D7 D7 FF B0 B0 B0 FF 00 00 00 FF 00 00' + '00 67 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00' + '00 9C 0C 0C 0C FF 3D 3D 3D FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 49 49' + '49 FF 2F 2F 2F FF 02 02 02 FF 00 00 00 5C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 06 00 00 00 F1 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 D6 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF 00 00 00 00 00 00' + '00 00 FF FE 3F FF FF FE 3F FF F0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 F0 00 00 0F F0 00 00 0F F0 00' + '00 0F F0 00 00 1F F8 00 00 1F F8 00 00 1F F8 00' + '00 1F F8 00 00 1F F8 00 00 1F F8 00 00 3F FC 00' + '00 7F FF FF FF FF 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 78 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF 6B FF FF FF 6B FF' + 'FF FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 04 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 26 26 26 FF CD CD CD FF CD CD' + 'CD FF C9 C9 C9 FF C5 C5 C5 FF C2 C2 C2 FF C0 C0' + 'C0 FF BF BF BF FF BA BA BA FF B3 B4 B3 FF AB AC' + 'AC FF 09 09 09 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 30 D1 D1 D1 FF E7 E7 E7 FF 5F 5F' + '5F FF 8F 8F 8F FF A7 A7 A7 FF B9 B9 B9 FF B8 B8' + 'B8 FF 94 94 94 FF B7 B7 B7 FF C6 C3 C5 FF 91 D8' + 'B5 FF 8E 8E 8E FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 33 D1 D1 D1 FF EB EB EB FF 6C 6C' + '6C FF 8A 8A 8A FF A3 A3 A3 FF B9 B9 B9 FF A5 A5' + 'A5 FF 6B 6B 6B FF A4 A4 A4 FF C8 C8 C8 FF C2 C2' + 'C2 FF 8E 8E 8E FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 33 D3 D3 D3 FF F6 F6 F6 FF F5 F5' + 'F5 FF F4 F4 F4 FF F3 F3 F3 FF F1 F1 F1 FF F0 F0' + 'F0 FF EF EF EF FF EE EE EE FF ED ED ED FF EB EB' + 'EB FF 8D 8D 8D FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 25 DA DA DA FF A9 A9 A9 FF C3 C3' + 'C3 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7 D7 FF D7 D7' + 'D7 FF D8 D8 D8 FF D8 D8 D8 FF A8 A8 A8 FF B5 B5' + 'B5 FF 9C 9C 9C FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 7E 7E 7E FF CF CF CF FF D1 D1' + 'D1 FF DF DF DF FF E1 E1 E1 FF DC DC DC FF DC DC' + 'DC FF E1 E1 E1 FF E1 E1 E1 FF D0 D0 D0 FF D1 D1' + 'D1 FF 3F 3F 3F FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 22 22 22 FF CA CA CA FF E4 E4' + 'E4 FF D1 D1 D1 FF D0 D0 D0 FF CD CD CD FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF E2 E2 E2 FF C9 C9' + 'C9 FF 00 00 00 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF C3 C3' + 'C3 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4 C4 FF CB CB' + 'CB FF 00 00 00 F8 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 D8 DB DB DB FF D2 D2' + 'D2 FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF CF CF CF FF CA CA' + 'CA FF 00 00 00 B8 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 89 C9 C9 C9 FF E4 E4' + 'E4 FF D2 D2 D2 FF E5 E5 E5 FF E4 E4 E4 FF E4 E4' + 'E4 FF E5 E5 E5 FF D2 D2 D2 FF E4 E4 E4 FF A8 A8' + 'A8 FF 00 00 00 4E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 99 99 99 FF BD BD' + 'BD FF EC EC EC FF EE EE EE FF EC EC EC FF EC EC' + 'EC FF EE EE EE FF E4 E4 E4 FF D1 D1 D1 FF 75 75' + '75 FF 00 00 00 06 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 19 19 19 FF D3 D3' + 'D3 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D9 D9 D9 FF CD CD CD FF 06 06' + '06 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 E0 03 00 00 C0 03 00 00 80 03' + '00 00 80 03 00 00 80 03 00 00 80 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 E0 07 00 00 F0 0F 00 00' +} */ + +/* BINRES netdrive2.ico */ +10 ICON netdrive2.ico +/* { + '00 00 01 00 09 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 96 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 3E 09 00 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 A6 0E 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 8E 11 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 B6 12 00 00 30 30 00 00 01 00 04 00 68 06' + '00 00 5E 23 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 C6 29 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 6E 4F 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 16 5E 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 02 02 02 00 04 04 04 00 05 06 06 00 06 06' + '06 00 00 00 0D 00 09 09 09 00 0A 0A 0A 00 0C 0C' + '0C 00 12 12 12 00 14 14 14 00 15 15 15 00 16 16' + '16 00 1F 1F 10 00 1D 1D 1D 00 00 00 20 00 00 00' + '2C 00 00 00 2D 00 21 21 21 00 22 22 22 00 23 23' + '23 00 24 24 24 00 25 25 25 00 26 26 26 00 38 38' + '38 00 39 39 39 00 3B 3B 3B 00 43 43 43 00 46 46' + '46 00 4A 4A 4A 00 54 4C 50 00 53 53 53 00 55 55' + '55 00 56 56 56 00 59 59 52 00 5A 5A 53 00 5C 5C' + '55 00 5D 5D 56 00 58 58 58 00 59 59 59 00 5A 58' + '59 00 5A 5A 5A 00 5B 5B 5B 00 5C 5C 5C 00 5D 5D' + '5D 00 5E 5E 5E 00 65 58 5F 00 60 60 60 00 61 61' + '61 00 62 62 62 00 64 64 64 00 67 67 67 00 69 69' + '69 00 71 71 71 00 72 72 72 00 73 73 73 00 75 75' + '75 00 78 78 78 00 7A 7A 7A 00 7B 7B 7B 00 7C 7C' + '7C 00 7F 7F 7F 00 24 A7 64 00 3C AD 74 00 25 DC' + '7F 00 7C 7C A3 00 00 00 C9 00 00 00 CD 00 00 00' + 'D3 00 00 00 D8 00 00 00 FF 00 2B 2B FF 00 7D AA' + '94 00 81 81 81 00 83 83 83 00 89 89 89 00 8A 8A' + '8A 00 8B 8B 8B 00 8F 8F 8F 00 91 89 8C 00 90 90' + '90 00 91 91 91 00 94 94 94 00 95 95 95 00 97 97' + '97 00 99 99 99 00 9A 9A 9A 00 9C 9C 9C 00 9D 9D' + '9D 00 9E 9E 9E 00 9F 9F 9F 00 94 B6 A4 00 93 BD' + 'A9 00 A0 A0 A0 00 A1 A1 A1 00 A3 A3 A3 00 A4 A4' + 'A4 00 A5 A5 A5 00 A8 A8 A8 00 A9 A9 A9 00 AA AA' + 'AA 00 AC AC AC 00 AD AD AD 00 AE AE AE 00 AF AF' + 'AF 00 B8 B8 A7 00 AA AA BC 00 AD B9 B3 00 B0 B0' + 'B0 00 B1 B1 B1 00 B2 B2 B2 00 B3 B3 B3 00 B4 B4' + 'B4 00 B5 B5 B5 00 B6 B6 B6 00 B7 B7 B7 00 B9 B9' + 'B9 00 BC BC BC 00 BD BD BD 00 BE BE BE 00 BF BF' + 'BF 00 C0 C0 C0 00 C1 C1 C1 00 C2 C0 C1 00 C2 C2' + 'C2 00 C3 C3 C3 00 C4 C1 C2 00 C5 C2 C4 00 C4 C4' + 'C4 00 C5 C5 C5 00 C6 C5 C6 00 C6 C6 C6 00 C8 C3' + 'C5 00 CC C4 C8 00 C8 C8 C8 00 C9 C9 C9 00 CB C9' + 'CA 00 CA CA CA 00 CB CB CB 00 CC CC CC 00 CD CD' + 'CD 00 CE CE CE 00 CF CF CF 00 D2 C1 CA 00 D3 C8' + 'CD 00 D0 D0 D0 00 D1 D1 D1 00 D2 D2 D2 00 D3 D3' + 'D3 00 D4 D4 D4 00 D5 D5 D5 00 D6 D6 D6 00 D7 D7' + 'D7 00 D8 D8 D8 00 D9 D9 D9 00 DA DA DA 00 DB DB' + 'DB 00 DC DC DC 00 DD DD DD 00 DE DE DE 00 DF DF' + 'DF 00 E0 E0 E0 00 E1 E1 E1 00 E2 E2 E2 00 E3 E3' + 'E3 00 E4 E4 E4 00 E5 E5 E5 00 E6 E6 E6 00 E7 E7' + 'E7 00 E8 E8 E8 00 E9 E9 E9 00 EA EA EA 00 EB EB' + 'EB 00 EC EC EC 00 ED ED ED 00 EE EE EE 00 EF EF' + 'EF 00 F0 F0 F0 00 F1 F1 F1 00 F2 F2 F2 00 F4 F4' + 'F4 00 F5 F5 F5 00 F6 F6 F6 00 F7 F7 F7 00 F8 F8' + 'F8 00 F9 F9 F9 00 FC FC FC 00 FD FD FD 00 FF FF' + 'FF 00 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 08 6C' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 6E 65 74 64 72 69 76 65 32' + '2E 69 63 6F 00 00 14 1A 95 00 1F 3B D4 77 15 00' + '00 00 A8 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 B0 6C' + '38 00 96 00 00 00 00 00 00 00 C9 F1 E7 77 96 00' + '00 00 A4 1A 95 00 09 00 00 00 00 00 00 00 96 00' + '00 00 96 00 00 00 09 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 B0 6C' + '38 00 96 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 42 45 BD 00 45' + '42 BD 00 00 00 00 00 00 00 00 00 00 00 00 BD BD' + 'BD BD BD BD BD BD BD BD BD BD BD 05 46 43 43 46' + '05 BD BD BD BD BD BD BD BD BD BD BD BD BD 6E 6E' + '6E 6E 6E 6E 6E 6E 6E 6E 6E 6E 6E 69 41 46 46 41' + '69 6E 6E 6E 6E 6E 6E 6E 6E 6E 6E 6E 6E 6E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 47 46 46 47' + 'BD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 44 46 6A 6A 46' + '44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 BD BD BD BD BD BD BD BD BD 10 0F 0D 0D 0F' + '11 BD BD BD BD BD BD BD BD 00 00 00 00 00 00 00' + '00 BD BD 0A 2D 2D 33 32 31 2F 2D 25 24 21 20 23' + '22 26 26 26 21 28 2E 1E 06 BD 00 00 00 00 00 00' + '00 BD 0A 79 B5 AB 63 70 74 7A 91 93 97 98 9D 9D' + '9C 9E 9B 99 8D 84 3F 5C 4F 03 BD 00 00 00 00 00' + '00 BD 21 B7 A7 A5 0E 1D 3A 4D 58 5F 68 64 5A 57' + '64 72 61 54 90 48 40 3E 8F 17 BD 00 00 00 00 00' + '00 BD 2C B3 A8 A4 1F 3B 4C 52 5F 63 70 64 53 50' + '5D 6C 56 4B 88 7B 5B 6B 7E 17 BD 00 00 00 00 00' + '00 BD 2A B4 AA A9 2B 36 4A 4E 5A 61 6F 5E 39 35' + '4D 5D 49 33 8A 82 85 7F 79 16 BD 00 00 00 00 00' + '00 BD 2A B6 AD A9 49 50 56 5D 63 66 70 65 57 55' + '5F 67 58 51 86 81 7A 7A 7D 15 BD 00 00 00 00 00' + '00 BD 29 B8 B1 B0 BA B9 B5 B3 AF AD AA A8 AB A9' + 'A5 A1 A1 A1 97 95 93 8A 80 14 BD 00 00 00 00 00' + '00 BD 27 BC B0 AE AD A8 A8 A7 A8 A8 A9 A8 A8 A8' + 'A8 A8 A8 A7 AA AE AD B9 96 12 BD 00 00 00 00 00' + '00 BD 2C BC 83 6D 75 99 98 98 98 98 97 97 97 97' + '98 98 98 99 92 71 71 97 B6 17 BD 00 00 00 00 00' + '00 BD 1B BC 68 73 62 92 98 96 94 92 95 96 96 95' + '92 93 95 9B 74 6E 63 86 A9 0E BD 00 00 00 00 00' + '00 BD 14 A9 8D 91 83 91 8D 9A A5 A4 A7 AB AB A8' + 'A5 A6 9C 8E 8E 8E 80 99 77 07 BD 00 00 00 00 00' + '00 BD 09 92 92 8B 8C 8C AA A7 9B 99 98 97 97 98' + '99 9C A7 AA 91 89 8C A3 54 BD BD 00 00 00 00 00' + '00 BD 01 60 99 87 8C A6 94 8D 91 91 8E 91 91 91' + '91 91 8C 8E A7 8E 83 AA 30 BD BD 00 00 00 00 00' + '00 BD BD 38 A5 87 9B 93 8D 91 8E 91 8C 89 8A 8A' + '8A 8A 8A 89 8B 9B 7D B0 19 BD BD 00 00 00 00 00' + '00 00 BD 1C AB 8E 99 8D 91 91 91 91 91 8B 7C 7D' + '80 81 81 81 7D 8C 81 AC 0B BD 00 00 00 00 00 00' + '00 00 BD 13 AF 92 92 93 92 92 92 92 92 93 8C 80' + '79 78 77 79 79 79 83 97 01 BD 00 00 00 00 00 00' + '00 00 BD 02 9F 9A 8B 99 97 98 98 98 98 98 98 99' + '98 95 91 8B 87 73 87 6F BD BD 00 00 00 00 00 00' + '00 00 BD BD 81 A4 94 94 9F 9D 9C 9C 9C 9C 9C 9C' + '9D 9D 9E A0 97 94 9E 4B BD BD 00 00 00 00 00 00' + '00 00 00 BD 51 A7 A4 96 97 A1 A4 A2 A2 A2 A2 A2' + 'A2 A4 A0 99 93 A8 99 26 BD 00 00 00 00 00 00 00' + '00 00 00 BD 33 A7 A8 A8 A0 92 9A A3 A4 A5 A5 A4' + 'A3 9A 92 A0 A9 AC 8D 18 BD 00 00 00 00 00 00 00' + '00 00 00 BD 1A 9E AB 9A AD AF A7 A3 A2 9F 9F A2' + 'A3 A5 AF A5 9C B2 83 0E BD 00 00 00 00 00 00 00' + '00 00 00 BD 17 9F 7A 66 81 B3 B1 B1 B1 B0 B0 B1' + 'B1 B1 AE 71 66 A8 76 0C BD 00 00 00 00 00 00 00' + '00 00 00 BD 08 59 AD A5 B6 BB BA BA BA BA BA BA' + 'BA BA BA B2 A7 A6 37 BD BD 00 00 00 00 00 00 00' + '00 00 00 BD BD 0C 38 3B 3A 39 39 39 39 39 39 39' + '39 39 39 3A 3C 34 04 BD 00 00 00 00 00 00 00 00' + '00 00 00 00 BD BD BD BD BD BD BD BD BD BD BD BD' + 'BD BD BD BD BD BD BD 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF F8' + '8F FF 00 00 00 00 00 00 00 00 FF FC 1F FF FF F8' + '1F FF F0 00 00 1F E0 00 00 0F E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F0 00 00 0F F8 00' + '00 1F F8 00 00 1F F8 00 00 1F F8 00 00 1F F8 00' + '00 1F F8 00 00 3F FC 00 00 7F FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 06 06 06 00 09 09' + '09 00 19 19 19 00 22 22 22 00 26 26 26 00 3F 3F' + '3F 00 5F 5F 5F 00 6B 6B 6B 00 6C 6C 6C 00 75 75' + '75 00 7E 7E 7E 00 7F 7F 7F 00 00 00 FF 00 8A 8A' + '8A 00 8D 8D 8D 00 8E 8E 8E 00 8F 8F 8F 00 94 94' + '94 00 99 99 99 00 9C 9C 9C 00 A3 A3 A3 00 A4 A4' + 'A4 00 A5 A5 A5 00 A7 A7 A7 00 A8 A8 A8 00 A9 A9' + 'A9 00 AB AC AC 00 B3 B4 B3 00 B5 B5 B5 00 B7 B7' + 'B7 00 B8 B8 B8 00 B9 B9 B9 00 BA BA BA 00 BD BD' + 'BD 00 BF BF BF 00 91 D8 B5 00 C0 C0 C0 00 C2 C2' + 'C2 00 C3 C3 C3 00 C6 C3 C5 00 C4 C4 C4 00 C5 C5' + 'C5 00 C8 C8 C8 00 C9 C9 C9 00 CA CA CA 00 CB CB' + 'CB 00 CD CD CD 00 CE CE CE 00 CF CF CF 00 D0 D0' + 'D0 00 D1 D1 D1 00 D2 D2 D2 00 D3 D3 D3 00 D7 D7' + 'D7 00 D8 D8 D8 00 D9 D9 D9 00 DA DA DA 00 DB DB' + 'DB 00 DC DC DC 00 DF DF DF 00 E1 E1 E1 00 E2 E2' + 'E2 00 E4 E4 E4 00 E5 E5 E5 00 E7 E7 E7 00 EB EB' + 'EB 00 EC EC EC 00 ED ED ED 00 EE EE EE 00 EF EF' + 'EF 00 F0 F0 F0 00 F1 F1 F1 00 F3 F3 F3 00 F4 F4' + 'F4 00 F5 F5 F5 00 F6 F6 F6 00 00 00 00 00 8F 8F' + '8F 00 91 89 8C 00 90 90 90 00 91 91 91 00 94 94' + '94 00 95 95 95 00 97 97 97 00 99 99 99 00 9A 9A' + '9A 00 9C 9C 9C 00 9D 9D 9D 00 9E 9E 9E 00 9F 9F' + '9F 00 94 B6 A4 00 93 BD A9 00 A0 A0 A0 00 A1 A1' + 'A1 00 A3 A3 A3 00 A4 A4 A4 00 A5 A5 A5 00 A8 A8' + 'A8 00 A9 A9 A9 00 AA AA AA 00 AC AC AC 00 AD AD' + 'AD 00 AE AE AE 00 AF AF AF 00 B8 B8 A7 00 AA AA' + 'BC 00 AD B9 B3 00 B0 B0 B0 00 B1 B1 B1 00 B2 B2' + 'B2 00 B3 B3 B3 00 B4 B4 B4 00 B5 B5 B5 00 B6 B6' + 'B6 00 B7 B7 B7 00 B9 B9 B9 00 BC BC BC 00 BD BD' + 'BD 00 BE BE BE 00 BF BF BF 00 C0 C0 C0 00 C1 C1' + 'C1 00 C2 C0 C1 00 C2 C2 C2 00 C3 C3 C3 00 C4 C1' + 'C2 00 C5 C2 C4 00 C4 C4 C4 00 C5 C5 C5 00 C6 C5' + 'C6 00 C6 C6 C6 00 C8 C3 C5 00 CC C4 C8 00 C8 C8' + 'C8 00 C9 C9 C9 00 CB C9 CA 00 CA CA CA 00 CB CB' + 'CB 00 CC CC CC 00 CD CD CD 00 CE CE CE 00 CF CF' + 'CF 00 D2 C1 CA 00 D3 C8 CD 00 D0 D0 D0 00 D1 D1' + 'D1 00 D2 D2 D2 00 D3 D3 D3 00 D4 D4 D4 00 D5 D5' + 'D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8 D8 00 D9 D9' + 'D9 00 DA DA DA 00 DB DB DB 00 DC DC DC 00 DD DD' + 'DD 00 DE DE DE 00 DF DF DF 00 E0 E0 E0 00 E1 E1' + 'E1 00 E2 E2 E2 00 E3 E3 E3 00 E4 E4 E4 00 E5 E5' + 'E5 00 E6 E6 E6 00 E7 E7 E7 00 E8 E8 E8 00 E9 E9' + 'E9 00 EA EA EA 00 EB EB EB 00 EC EC EC 00 ED ED' + 'ED 00 EE EE EE 00 EF EF EF 00 F0 F0 F0 00 F1 F1' + 'F1 00 F2 F2 F2 00 F4 F4 F4 00 F5 F5 F5 00 F6 F6' + 'F6 00 F7 F7 F7 00 F8 F8 F8 00 F9 F9 F9 00 FC FC' + 'FC 00 FD FD FD 00 FF FF FF 00 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 08 6C 0C 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 6E' + '65 74 64 72 69 76 65 32 2E 69 63 6F 00 00 14 1A' + '95 00 1F 3B D4 77 15 00 00 00 A8 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 B0 6C 38 00 96 00 00 00 00 00' + '00 00 C9 F1 E7 77 96 00 00 00 A4 1A 95 00 09 00' + '00 00 00 00 00 00 96 00 00 00 96 00 00 00 09 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 B0 6C 38 00 96 00 00 00 58 1A' + '95 00 00 00 00 00 4D 4D 4D 4D 4D 4D 4D 0D 0D 4D' + '4D 4D 4D 4D 4D 4D 25 25 25 25 25 25 25 0D 0D 25' + '25 25 25 25 25 25 00 00 00 4D 4D 4D 4D 4D 4D 4D' + '4D 4D 4D 4D 00 00 00 00 05 2F 2F 2C 2A 26 25 23' + '21 1C 1B 02 00 00 00 4D 33 41 07 11 18 20 1F 12' + '1E 28 24 10 00 00 00 4D 33 42 09 0E 15 20 17 08' + '16 2B 26 10 00 00 00 4D 35 4C 4B 4A 49 48 47 46' + '45 44 42 0F 00 00 00 4D 39 1A 27 37 37 36 36 37' + '37 19 1D 14 00 00 00 00 0B 31 33 3C 3D 3B 3B 3D' + '3D 32 33 06 00 00 00 00 04 2D 3F 33 32 2F 30 30' + '30 3E 2C 4D 00 00 00 00 4D 33 33 33 33 33 27 29' + '29 29 2E 4D 00 00 00 00 4D 3A 34 39 39 39 39 39' + '39 31 2D 4D 00 00 00 00 4D 2C 3F 34 40 3F 3F 40' + '34 3F 19 4D 00 00 00 00 4D 13 22 43 45 43 43 45' + '3F 33 0A 4D 00 00 00 00 00 03 35 37 37 37 37 37' + '38 2F 01 00 00 00 00 00 00 00 4D 4D 4D 4D 4D 4D' + '4D 4D 00 00 00 00 00 00 00 00 00 00 00 00 E0 03' + '00 00 C0 03 00 00 80 03 00 00 80 03 00 00 80 03' + '00 00 80 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 E0 07' + '00 00 F0 0F 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 0C C0 0C C0 00 00 00 00 00 00 00 00' + '00 00 00 00 00 CC CC 00 00 00 00 00 00 00 77 77' + '77 77 77 77 77 8C C8 77 77 77 77 77 77 77 00 00' + '00 00 00 00 00 CC CC 00 00 00 00 00 00 00 00 00' + '00 00 00 00 0C C7 7C C0 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 88 88 88 88 88 88 88 88 88 88 00 00 00 00 00' + '07 FF 77 77 77 77 77 77 77 77 67 80 00 00 00 00' + '8F FF 08 88 87 77 88 77 78 78 66 70 00 00 00 00' + '8F FF 88 88 77 77 88 77 88 77 77 70 00 00 00 00' + '8F FF 88 88 87 77 88 87 88 77 77 70 00 00 00 00' + '8F FF 88 87 77 77 88 77 88 77 77 70 00 00 00 00' + '8F FF FF FF FF FF FF FF FF 77 77 70 00 00 00 00' + '8F FF FF FF FF FF FF FF FF FF FF 70 00 00 00 00' + '8F 77 77 77 77 77 77 77 77 77 77 F0 00 00 00 00' + '8F 77 77 77 77 77 77 77 77 77 77 F0 00 00 00 00' + '0F 77 77 77 FF FF FF FF 77 77 77 70 00 00 00 00' + '07 77 77 FF 77 77 77 77 FF 77 7F 80 00 00 00 00' + '07 77 7F 77 77 77 77 77 77 F7 7F 80 00 00 00 00' + '08 F7 77 77 77 77 77 77 77 77 7F 00 00 00 00 00' + '08 F7 77 77 77 77 77 77 77 77 7F 00 00 00 00 00' + '00 F7 77 77 77 77 77 77 77 77 77 00 00 00 00 00' + '00 77 77 77 77 77 77 77 77 77 77 00 00 00 00 00' + '00 7F 77 77 77 77 77 77 77 77 78 00 00 00 00 00' + '00 8F F7 7F FF FF FF FF 77 7F 78 00 00 00 00 00' + '00 8F FF 77 7F FF FF F7 77 FF 70 00 00 00 00 00' + '00 07 F7 FF FF F7 7F FF FF 7F 70 00 00 00 00 00' + '00 07 77 7F FF FF FF FF F7 7F 70 00 00 00 00 00' + '00 08 FF FF FF FF FF FF FF FF 80 00 00 00 00 00' + '00 00 88 88 88 88 88 88 88 88 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF F8' + '8F FF 00 00 00 00 00 00 00 00 FF FC 1F FF FF F8' + '1F FF F0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F0 00 00 0F F8 00' + '00 1F F8 00 00 1F F8 00 00 1F F8 00 00 1F F8 00' + '00 1F F8 00 00 3F FC 00 00 7F FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' + '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 0C C0 00 00 00 77 77' + '77 7C C7 77 77 77 00 00 00 00 00 00 00 00 00 07' + '77 77 77 77 70 00 00 7F 88 77 78 77 78 00 00 7F' + '88 77 78 77 78 00 00 7F FF FF FF FF F8 00 00 77' + '77 77 77 77 78 00 00 87 77 F7 7F F7 70 00 00 07' + 'F7 77 77 7F 70 00 00 07 77 77 77 77 70 00 00 07' + '77 77 77 77 70 00 00 07 F7 FF FF 7F 70 00 00 08' + '7F FF FF F7 80 00 00 00 77 77 77 77 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 03' + '00 00 C0 03 00 00 80 03 00 00 80 03 00 00 80 03' + '00 00 80 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 E0 07' + '00 00 F0 0F 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 FF FF 00 00 FF FF 00 00 00 30 00 00' + '00 00 00 00 FF FF 00 00 FF FF 00 00 00 30 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 FF FF 00 00 FF FF 00 00' + 'FF FF 00 00 FF FF 00 00 00 9C 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 00 00 FF FF 00 00' + 'FF FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 FF FF 00 00 FF FF 00 00' + 'FF FF 00 00 FF FF 00 00 00 3C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 01 00 00 00 04 00 00 00 09 00 00' + '00 09 00 00 00 09 00 00 00 09 00 00 00 09 00 00' + '00 09 00 00 FF FF 00 00 FF FF C0 C0 C0 FF C0 C0' + 'C0 FF 00 00 FF FF 00 00 FF FF 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 05 00 00 00 C5 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F1 00 00 00 B1 00 00 00 0D 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00' + '00 9B 00 00 00 FF 21 21 21 FF 2B 2B 2B FF 2C 2C' + '2C FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2B 2B 2B FF 2B 2B 2B FF 2E 2C' + '2D FF 13 13 13 FF 00 00 00 FF 00 00 00 69 00 00' + '00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 AD 01 01' + '01 FF EB EB EB FF E8 E8 E8 FF D5 D5 D5 FF 85 85' + '85 FF 92 92 92 FF 98 98 98 FF AD AD AD FF BA BA' + 'BA FF C3 C3 C3 FF C6 C6 C6 FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF D3 D3 D3 FF D7 D7 D7 FF CC CC' + 'CC FF C7 C7 C7 FF C8 C9 C9 FF 9D B3 A8 FF 20 A8' + '63 FF 90 AF A0 FF BF BB BD FF 00 00 00 FF 00 00' + '00 81 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 F0 19 19' + '19 FF EC EC EC FF E2 E2 E2 FF CB CB CB FF 3B 3B' + '3B FF 56 56 56 FF 72 72 72 FF 92 92 92 FF 9D 9D' + '9D FF A8 A8 A8 FF AC AC AC FF A9 A9 A9 FF 9C 9C' + '9C FF 99 99 99 FF B7 B7 B7 FF C3 C3 C3 FF A3 A3' + 'A3 FF 98 98 98 FF C5 C4 C4 FF 51 A7 7C FF 17 CE' + '71 FF 2F 99 64 FF C3 BD C0 FF 01 01 01 FF 00 00' + '00 A3 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 F9 28 28' + '28 FF EC EC EC FF E6 E6 E6 FF D1 D1 D1 FF 68 68' + '68 FF 7E 7E 7E FF 85 85 85 FF 97 97 97 FF A0 A0' + 'A0 FF AA AA AA FF AE AE AE FF 9F 9F 9F FF 83 83' + '83 FF 7C 7C 7C FF A8 A8 A8 FF BB BB BB FF 8A 8A' + '8A FF 79 79 79 FF C2 C2 C2 FF C6 C3 C4 FF 99 AC' + 'A2 FF C2 BE C0 FF C4 C4 C4 FF 01 01 01 FF 00 00' + '00 BA 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 F9 28 28' + '28 FF EE EE EE FF E7 E7 E7 FF D6 D6 D6 FF 70 70' + '70 FF 7D 7D 7D FF 85 85 85 FF 97 97 97 FF A0 A0' + 'A0 FF AA AA AA FF AE AE AE FF 98 98 98 FF 73 73' + '73 FF 6A 6A 6A FF A0 A0 A0 FF B7 B7 B7 FF 7C 7C' + '7C FF 67 67 67 FF C2 C2 C2 FF C4 C3 C4 FF C7 C4' + 'C5 FF BF BF BF FF C5 C5 C5 FF 01 01 01 FF 00 00' + '00 B9 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 F9 27 27' + '27 FF F2 F2 F2 FF EB EB EB FF DF DF DF FF A7 A7' + 'A7 FF AB AB AB FF AE AE AE FF B3 B3 B3 FF B6 B6' + 'B6 FF B9 B9 B9 FF BA BA BA FF B7 B7 B7 FF B1 B1' + 'B1 FF AF AF AF FF BA BA BA FF BE BE BE FF B0 B0' + 'B0 FF AB AB AB FF C5 C5 C5 FF C6 C6 C6 FF C4 C4' + 'C4 FF C2 C2 C2 FF C9 C9 C9 FF 00 00 00 FF 00 00' + '00 B9 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 F9 26 26' + '26 FF F3 F3 F3 FF EB EB EB FF EA EA EA FF ED ED' + 'ED FF E9 E9 E9 FF E8 E8 E8 FF E4 E4 E4 FF E2 E2' + 'E2 FF DF DF DF FF DE DE DE FF DB DB DB FF DC DC' + 'DC FF D9 D9 D9 FF D6 D6 D6 FF D2 D2 D2 FF D2 D2' + 'D2 FF D0 D0 D0 FF CB CB CB FF C9 C9 C9 FF C7 C7' + 'C7 FF C0 C0 C0 FF CA CA CA FF 00 00 00 FF 00 00' + '00 B9 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 F9 24 24' + '24 FF FF FF FF FF E9 E9 E9 FF E2 E2 E2 FF E2 E2' + 'E2 FF DF DF DF FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E3 E3 E3 FF E3 E3' + 'E3 FF F8 F8 F8 FF EF EF EF FF 00 00 00 FF 00 00' + '00 B9 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 FA 24 24' + '24 FF F8 F8 F8 FF D9 D9 D9 FF BB BB BB FF BF BF' + 'BF FF DA DA DA FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF DB DB DB FF BC BC BC FF BB BB' + 'BB FF DE DE DE FF FF FF FF FF 00 00 00 FF 00 00' + '00 BA 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 D0 05 05' + '05 FF F6 F6 F6 FF BC BC BC FF C3 C3 C3 FF AB AB' + 'AB FF D8 D8 D8 FF D5 D5 D5 FF D5 D5 D5 FF D4 D4' + 'D4 FF D3 D3 D3 FF D5 D5 D5 FF D8 D8 D8 FF D8 D8' + 'D8 FF D5 D5 D5 FF D3 D3 D3 FF D3 D3 D3 FF D4 D4' + 'D4 FF D7 D7 D7 FF C9 C9 C9 FF C3 C3 C3 FF B3 B3' + 'B3 FF D6 D6 D6 FF F5 F5 F5 FF 00 00 00 FF 00 00' + '00 8C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 9C 00 00' + '00 FF F4 F4 F4 FF CF CF CF FF D2 D2 D2 FF BF BF' + 'BF FF D3 D3 D3 FF D2 D2 D2 FF D3 D3 D3 FF DD DD' + 'DD FF E3 E3 E3 FF E6 E6 E6 FF ED ED ED FF ED ED' + 'ED FF E7 E7 E7 FF E4 E4 E4 FF DE DE DE FF D4 D4' + 'D4 FF D2 D2 D2 FF D3 D3 D3 FF D0 D0 D0 FF C2 C2' + 'C2 FF D9 D9 D9 FF E8 E8 E8 FF 00 00 00 FF 00 00' + '00 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 59 00 00' + '00 FF E9 E9 E9 FF D0 D0 D0 FF CD CD CD FF CD CD' + 'CD FF D6 D6 D6 FF ED ED ED FF DC DC DC FF D4 D4' + 'D4 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D5 D5 D5 FF DB DB' + 'DB FF ED ED ED FF DA DA DA FF CD CD CD FF CD CD' + 'CD FF DF DF DF FF B8 B8 B8 FF 00 00 00 FB 00 00' + '00 3A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00' + '00 FE D7 D7 D7 FF D2 D2 D2 FF CB CB CB FF CA CA' + 'CA FF E9 E9 E9 FF DC DC DC FF D1 D1 D1 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D1 D1' + 'D1 FF D8 D8 D8 FF EA EA EA FF C9 C9 C9 FF CA CA' + 'CA FF E0 E0 E0 FF A0 A0 A0 FF 00 00 00 EB 00 00' + '00 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00' + '00 E1 9F 9F 9F FF DD DD DD FF CD CD CD FF DB DB' + 'DB FF CE CE CE FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF CF CF CF FF C9 C9 C9 FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF C8 C8 C8 FF DA DA DA FF C7 C7' + 'C7 FF E2 E2 E2 FF 5A 5A 5A FF 00 00 00 94 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 B2 83 83 83 FF DD DD DD FF D1 D1 D1 FF DB DB' + 'DB FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF C9 C9 C9 FF C5 C5' + 'C5 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C6 C6 C6 FF D3 D3 D3 FF C8 C8' + 'C8 FF DE DE DE FF 42 42 42 FF 00 00 00 6C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 4B 41 41 41 FF D8 D8 D8 FF D2 D2 D2 FF D0 D0' + 'D0 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF C7 C7 C7 FF C4 C4 C4 FF C1 C1 C1 FF C0 C0' + 'C0 FF C1 C1 C1 FF C1 C1 C1 FF BF BF BF FF C0 C0' + 'C0 FF B2 B2 B2 FF 1A 1A 1A FF 00 00 00 28 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1A 2C 2C 2C FF CC CC CC FF D5 D5 D5 FF CC CC' + 'CC FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D5 D5 D5 FF CF CF CF FF CC CC' + 'CC FF C6 C6 C6 FF C4 C4 C4 FF B3 B3 B3 FF BD BD' + 'BD FF 99 99 99 FF 09 09 09 FF 00 00 00 19 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 02 08 08 08 FF 97 97 97 FF DF DF DF FF DC DC' + 'DC FF D6 D6 D6 FF DE DE DE FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DE DE DE FF D8 D8 D8 FF DD DD DD FF DC DC' + 'DC FF 53 53 53 FF 00 00 00 FF 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 FF 77 77 77 FF E2 E2 E2 FF E1 E1' + 'E1 FF CE CE CE FF D7 D7 D7 FF E2 E2 E2 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E1 E1' + 'E1 FF D9 D9 D9 FF CD CD CD FF E3 E3 E3 FF D9 D9' + 'D9 FF 39 39 39 FF 00 00 00 FF 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 FF 35 35 35 FF E6 E6 E6 FF E6 E6' + 'E6 FF E7 E7 E7 FF E7 E7 E7 FF D2 D2 D2 FF D3 D3' + 'D3 FF E3 E3 E3 FF E3 E3 E3 FF E4 E4 E4 FF E4 E4' + 'E4 FF E3 E3 E3 FF E3 E3 E3 FF D4 D4 D4 FF D1 D1' + 'D1 FF E7 E7 E7 FF E7 E7 E7 FF E8 E8 E8 FF D4 D4' + 'D4 FF 0B 0B 0B FF 00 00 00 ED 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 F9 1E 1E 1E FF E4 E4 E4 FF ED ED' + 'ED FF E6 E6 E6 FF EC EC EC FF EA EA EA FF E4 E4' + 'E4 FF DF DF DF FF DF DF DF FF DC DC DC FF DC DC' + 'DC FF DF DF DF FF DF DF DF FF E2 E2 E2 FF E9 E9' + 'E9 FF EA EA EA FF E5 E5 E5 FF EB EB EB FF D6 D6' + 'D6 FF 00 00 00 FF 00 00 00 C3 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 AE 00 00 00 FF E0 E0 E0 FF C4 C4' + 'C4 FF B8 B8 B8 FF B2 B2 B2 FF F1 F1 F1 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F3 F3' + 'F3 FF B0 B0 B0 FF B6 B6 B6 FF EB EB EB FF CD CD' + 'CD FF 00 00 00 FF 00 00 00 85 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 80 00 00 00 FF CE CE CE FF DD DD' + 'DD FF D5 D5 D5 FF E4 E4 E4 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF FA FA' + 'FA FF DF DF DF FF D8 D8 D8 FF D7 D7 D7 FF B0 B0' + 'B0 FF 00 00 00 FF 00 00 00 67 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 02 00 00 00 9C 0C 0C 0C FF 3D 3D' + '3D FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 49 49 49 FF 2F 2F 2F FF 02 02' + '02 FF 00 00 00 5C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 06 00 00 00 F1 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 D6 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF F8' + '8F FF 00 00 00 00 00 00 00 00 FF FC 1F FF F8 00' + '1F FF F0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 E0 00' + '00 07 E0 00 00 07 E0 00 00 07 E0 00 00 07 F0 00' + '00 0F F0 00 00 0F F0 00 00 0F F0 00 00 1F F8 00' + '00 1F F8 00 00 1F F8 00 00 1F F8 00 00 1F F8 00' + '00 1F F8 00 00 3F FC 00 00 7F FF FF FF FF 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 04 00 00 00' + '00 00 80 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + 'CC 00 00 CC 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 CC C0 0C CC 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '0C CC CC C0 00 00 00 00 00 00 00 00 00 00 88 88' + '88 88 88 88 88 88 88 88 88 CC CC 88 88 88 88 88' + '88 88 88 88 88 88 77 77 77 77 77 77 77 77 77 77' + '77 CC CC 77 77 77 77 77 77 77 77 77 77 77 00 00' + '00 00 00 00 00 00 00 00 0C CC CC C0 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + 'CC C7 7C CC 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 CC 07 70 CC 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 87 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 78 00 00 00 00 00 00' + '00 08 FF F7 88 88 77 77 77 77 77 77 77 77 77 77' + '66 87 80 00 00 00 00 00 00 07 FF F7 00 88 88 87' + '77 77 87 87 77 77 87 78 66 67 80 00 00 00 00 00' + '00 07 FF F7 88 88 88 77 77 77 87 87 87 87 87 77' + '77 87 80 00 00 00 00 00 00 07 FF F7 88 88 88 77' + '77 78 87 87 87 87 87 77 77 77 80 00 00 00 00 00' + '00 07 FF F7 88 88 88 77 77 78 87 87 87 87 87 77' + '77 77 80 00 00 00 00 00 00 07 FF F7 88 88 88 87' + '77 78 87 88 87 87 87 77 77 77 80 00 00 00 00 00' + '00 07 FF F7 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 80 00 00 00 00 00 00 07 FF FF FF FF FF FF' + '77 77 77 77 77 77 77 77 77 77 80 00 00 00 00 00' + '00 07 FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF F7 80 00 00 00 00 00 00 07 FF FF FF 77 77 7F' + 'FF FF FF FF FF FF FF FF FF FF 80 00 00 00 00 00' + '00 07 F7 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 7F 80 00 00 00 00 00 00 07 F7 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 7F 80 00 00 00 00 00' + '00 07 F7 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 7F 80 00 00 00 00 00 00 07 F7 77 77 77 77 7F' + 'FF FF FF FF F7 77 77 77 77 7F 80 00 00 00 00 00' + '00 08 F7 77 77 77 7F FF 77 77 77 77 FF FF 77 77' + '77 77 00 00 00 00 00 00 00 08 F7 77 77 7F F7 77' + '77 77 77 77 77 7F F7 77 77 77 00 00 00 00 00 00' + '00 00 77 77 77 F7 77 77 77 77 77 77 77 77 7F 77' + '77 F7 00 00 00 00 00 00 00 00 77 77 7F 77 77 77' + '77 77 77 77 77 77 77 F7 77 F8 00 00 00 00 00 00' + '00 00 87 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 F8 00 00 00 00 00 00 00 00 87 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 78 00 00 00 00 00 00' + '00 00 87 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 70 00 00 00 00 00 00 00 00 87 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 70 00 00 00 00 00 00' + '00 00 07 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 80 00 00 00 00 00 00 00 00 07 77 77 77 77 77' + '77 77 77 77 77 77 77 77 77 80 00 00 00 00 00 00' + '00 00 08 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 80 00 00 00 00 00 00 00 00 08 7F F7 77 FF FF' + 'FF FF FF FF FF FF 77 7F 77 00 00 00 00 00 00 00' + '00 00 08 7F FF F7 77 FF FF FF FF FF FF 77 7F FF' + '77 00 00 00 00 00 00 00 00 00 00 7F FF FF 77 77' + 'FF FF FF FF 77 77 FF FF 78 00 00 00 00 00 00 00' + '00 00 00 7F FF FF FF FF 77 77 77 77 7F FF FF FF' + '78 00 00 00 00 00 00 00 00 00 00 8F 77 77 FF FF' + 'FF FF FF FF FF FF 77 7F 78 00 00 00 00 00 00 00' + '00 00 00 8F 77 77 FF FF FF FF FF FF FF F7 77 7F' + '78 00 00 00 00 00 00 00 00 00 00 87 77 7F FF FF' + 'FF FF FF FF FF FF 77 77 70 00 00 00 00 00 00 00' + '00 00 00 08 77 77 77 77 77 77 77 77 77 77 77 77' + '80 00 00 00 00 00 00 00 00 00 00 00 08 88 88 88' + '88 88 88 88 88 88 88 80 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF F1 C7 FF FF 00 00 FF FF' + 'F0 07 FF FF 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'F8 0F FF FF 00 00 FF FF F0 07 FF FF 00 00 FF FF' + 'F2 07 FF FF 00 00 FC 00 00 00 00 7F 00 00 F8 00' + '00 00 00 3F 00 00 F8 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FF 00' + '00 00 00 7F 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 01 FF 00 00 FF 80' + '00 00 03 FF 00 00 FF E0 00 00 07 FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 00 24 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + 'FF FF 00 00 FF FF 00 00 00 30 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 FF FF 00 00 FF FF 00 00' + '00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 30 00 00 00 24 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + 'FF FF 00 00 FF FF 00 00 FF FF 00 00 00 30 00 00' + '00 30 00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00' + '00 3C 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00' + 'FF FF 00 00 FF FF 00 00 FF FF 00 00 00 9C 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 90 00 00 00 90 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 00 00 FF FF 00 00 FF FF 00 00' + 'FF FF 00 00 FF FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF 00 00 FF FF 00 00 FF FF 00 00' + 'FF FF 00 00 FF FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00' + 'FF FF 00 00 FF FF 00 00 FF FF 00 00 00 3C 00 00' + '00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00' + 'FF FF 00 00 FF FF 00 00 FF FF C0 C0 C0 FF C0 C0' + 'C0 FF 00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00' + '00 15 00 00 00 09 00 00 00 09 00 00 00 09 00 00' + '00 09 00 00 00 09 00 00 00 09 00 00 00 09 00 00' + '00 09 00 00 00 09 00 00 00 09 00 00 00 07 00 00' + '00 04 00 00 00 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 16 00 00 00 34 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + 'FF FF 00 00 FF FF 00 00 00 37 C0 C0 C0 FF C0 C0' + 'C0 FF 00 00 00 37 00 00 FF FF 00 00 FF FF 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 35 00 00 00 18 00 00' + '00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 69 00 00' + '00 C5 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F1 00 00 00 B1 00 00' + '00 5C 00 00 00 0D 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 05 00 00 00 9B 00 00 00 FF 00 00' + '00 FF 21 21 21 FF 2C 2C 2C FF 2B 2B 2B FF 2C 2C' + '2C FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2E 2C' + '2D FF 2E 2C 2D FF 13 13 13 FF 00 00 00 FF 00 00' + '00 F6 00 00 00 69 00 00 00 09 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 54 00 00 00 FF 26 26 26 FF 90 90' + '90 FF CA CA CA FF CD CD CD FF CB CB CB FF CE CE' + 'CE FF CD CD CD FF CC CC CC FF CB CB CB FF C9 C9' + 'C9 FF C7 C7 C7 FF C6 C6 C6 FF C5 C5 C5 FF C4 C4' + 'C4 FF C3 C3 C3 FF C2 C2 C2 FF C2 C2 C2 FF C3 C3' + 'C3 FF C0 C0 C0 FF C1 C1 C1 FF BF BF BF FF BF BF' + 'BF FF BC BC BC FF BD BD BD FF BA BA BA FF BB BB' + 'BB FF B5 B5 B5 FF B3 B4 B3 FF B8 B4 B6 FF AD AD' + 'AD FF AB AC AC FF AD A8 AB FF 63 63 63 FF 09 09' + '09 FF 00 00 00 EF 00 00 00 42 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 03 00 00 00 AD 01 01 01 FF 8A 8A 8A FF EB EB' + 'EB FF E8 E8 E8 FF E7 E7 E7 FF D5 D5 D5 FF 85 85' + '85 FF 88 88 88 FF 92 92 92 FF 98 98 98 FF A2 A2' + 'A2 FF AD AD AD FF BA BA BA FF C0 C0 C0 FF C3 C3' + 'C3 FF C6 C6 C6 FF CB CB CB FF CA CA CA FF CA CA' + 'CA FF D6 D6 D6 FF CA CA CA FF D3 D3 D3 FF CB CB' + 'CB FF D7 D7 D7 FF CC CC CC FF D4 D4 D4 FF C7 C7' + 'C7 FF C8 C9 C9 FF C6 C2 C4 FF 9D B3 A8 FF 20 A8' + '63 FF 1C A8 60 FF 90 AF A0 FF BF BB BD FF 4F 4F' + '4F FF 00 00 00 FF 00 00 00 81 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 15 00 00 00 F0 19 19 19 FF C7 C7 C7 FF EC EC' + 'EC FF E2 E2 E2 FF E6 E6 E6 FF CB CB CB FF 3B 3B' + '3B FF 3F 3F 3F FF 56 56 56 FF 72 72 72 FF 87 87' + '87 FF 92 92 92 FF 9D 9D 9D FF A5 A5 A5 FF A8 A8' + 'A8 FF AC AC AC FF B7 B7 B7 FF A9 A9 A9 FF 9C 9C' + '9C FF BD BD BD FF 99 99 99 FF B7 B7 B7 FF A1 A1' + 'A1 FF C3 C3 C3 FF A3 A3 A3 FF BD BD BD FF 98 98' + '98 FF C5 C4 C4 FF C7 BF C3 FF 51 A7 7C FF 17 CE' + '71 FF 0A BF 61 FF 2F 99 64 FF C3 BD C0 FF 84 83' + '84 FF 01 01 01 FF 00 00 00 A3 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 30 00 00 00 FA 29 29 29 FF D1 D1 D1 FF EA EA' + 'EA FF E4 E4 E4 FF E7 E7 E7 FF CD CD CD FF 47 47' + '47 FF 5F 5F 5F FF 79 79 79 FF 87 87 87 FF 8F 8F' + '8F FF 97 97 97 FF A0 A0 A0 FF A7 A7 A7 FF AA AA' + 'AA FF AE AE AE FF B9 B9 B9 FF A4 A4 A4 FF 90 90' + '90 FF B8 B8 B8 FF 8A 8A 8A FF AF AF AF FF 94 94' + '94 FF BF BF BF FF 97 97 97 FF B7 B7 B7 FF 88 88' + '88 FF C4 C3 C3 FF C6 C3 C5 FF 95 B2 A3 FF 91 D6' + 'B4 FF 91 D8 B5 FF 83 AB 97 FF C4 C1 C3 FF 8E 8E' + '8E FF 01 01 01 FF 00 00 00 B7 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 34 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EC EC' + 'EC FF E6 E6 E6 FF E7 E7 E7 FF D1 D1 D1 FF 68 68' + '68 FF 74 74 74 FF 7E 7E 7E FF 85 85 85 FF 8E 8E' + '8E FF 97 97 97 FF A0 A0 A0 FF A7 A7 A7 FF AA AA' + 'AA FF AE AE AE FF BA BA BA FF 9F 9F 9F FF 83 83' + '83 FF B3 B3 B3 FF 7C 7C 7C FF A8 A8 A8 FF 87 87' + '87 FF BB BB BB FF 8A 8A 8A FF B2 B2 B2 FF 79 79' + '79 FF C2 C2 C2 FF C4 C4 C4 FF C6 C3 C4 FF 99 AC' + 'A2 FF 96 AB A0 FF C2 BE C0 FF C4 C4 C4 FF 8D 8D' + '8D FF 01 01 01 FF 00 00 00 BA 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EE EE' + 'EE FF E7 E7 E7 FF E8 E8 E8 FF D6 D6 D6 FF 70 70' + '70 FF 71 71 71 FF 7D 7D 7D FF 85 85 85 FF 8E 8E' + '8E FF 97 97 97 FF A0 A0 A0 FF A7 A7 A7 FF AA AA' + 'AA FF AE AE AE FF BB BB BB FF 98 98 98 FF 73 73' + '73 FF AD AD AD FF 6A 6A 6A FF A0 A0 A0 FF 78 78' + '78 FF B7 B7 B7 FF 7C 7C 7C FF AB AB AB FF 67 67' + '67 FF C2 C2 C2 FF C6 C6 C6 FF C4 C3 C4 FF C7 C4' + 'C5 FF C6 C2 C4 FF BF BF BF FF C5 C5 C5 FF 8D 8D' + '8D FF 01 01 01 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 27 27 27 FF D1 D1 D1 FF EF EF' + 'EF FF E9 E9 E9 FF EB EB EB FF D6 D6 D6 FF 6A 6A' + '6A FF 6C 6C 6C FF 78 78 78 FF 81 81 81 FF 8A 8A' + '8A FF 93 93 93 FF 9C 9C 9C FF A3 A3 A3 FF A6 A6' + 'A6 FF AB AB AB FF B9 B9 B9 FF 90 90 90 FF 66 66' + '66 FF A5 A5 A5 FF 5B 5B 5B FF 98 98 98 FF 6B 6B' + '6B FF B1 B1 B1 FF 70 70 70 FF A4 A4 A4 FF 58 58' + '58 FF C1 C1 C1 FF C8 C8 C8 FF C5 C5 C5 FF C3 C3' + 'C3 FF C2 C2 C2 FF C1 C1 C1 FF C6 C6 C6 FF 8E 8E' + '8E FF 01 01 01 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 27 27 27 FF D2 D2 D2 FF F2 F2' + 'F2 FF EB EB EB FF EA EA EA FF DF DF DF FF A7 A7' + 'A7 FF A7 A7 A7 FF AB AB AB FF AE AE AE FF B0 B0' + 'B0 FF B3 B3 B3 FF B6 B6 B6 FF B9 B9 B9 FF B9 B9' + 'B9 FF BA BA BA FF BD BD BD FF B7 B7 B7 FF B1 B1' + 'B1 FF BE BE BE FF AF AF AF FF BA BA BA FF B1 B1' + 'B1 FF BE BE BE FF B0 B0 B0 FF BA BA BA FF AB AB' + 'AB FF C5 C5 C5 FF C8 C8 C8 FF C6 C6 C6 FF C4 C4' + 'C4 FF C3 C3 C3 FF C2 C2 C2 FF C9 C9 C9 FF 8E 8E' + '8E FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF F3 F3' + 'F3 FF EB EB EB FF EB EB EB FF EA EA EA FF ED ED' + 'ED FF EB EB EB FF E9 E9 E9 FF E8 E8 E8 FF E6 E6' + 'E6 FF E4 E4 E4 FF E2 E2 E2 FF E1 E1 E1 FF DF DF' + 'DF FF DE DE DE FF DB DB DB FF DB DB DB FF DC DC' + 'DC FF D8 D8 D8 FF D9 D9 D9 FF D6 D6 D6 FF D6 D6' + 'D6 FF D2 D2 D2 FF D2 D2 D2 FF CF CF CF FF D0 D0' + 'D0 FF CB CB CB FF CA CA CA FF C9 C9 C9 FF C7 C7' + 'C7 FF C4 C4 C4 FF C0 C0 C0 FF CA CA CA FF 8E 8E' + '8E FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF F7 F7' + 'F7 FF F8 F8 F8 FF F6 F6 F6 FF F6 F6 F6 FF F6 F6' + 'F6 FF F5 F5 F5 FF F5 F5 F5 FF F4 F4 F4 FF F4 F4' + 'F4 FF F3 F3 F3 FF F3 F3 F3 FF F3 F3 F3 FF F2 F2' + 'F2 FF F2 F2 F2 FF F1 F1 F1 FF F1 F1 F1 FF F1 F1' + 'F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF EF EF' + 'EF FF EF EF EF FF EE EE EE FF EE EE EE FF ED ED' + 'ED FF ED ED ED FF ED ED ED FF EC EC EC FF EC EC' + 'EC FF EB EB EB FF E0 E0 E0 FF D0 D0 D0 FF 8D 8D' + '8D FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 33 00 00 00 F9 24 24 24 FF D6 D6 D6 FF FF FF' + 'FF FF E9 E9 E9 FF E1 E1 E1 FF E2 E2 E2 FF E2 E2' + 'E2 FF E0 E0 E0 FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E2 E2 E2 FF E3 E3 E3 FF E3 E3' + 'E3 FF E3 E3 E3 FF F8 F8 F8 FF EF EF EF FF 8C 8C' + '8C FF 00 00 00 FF 00 00 00 B9 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 34 00 00 00 FA 24 24 24 FF DE DE DE FF F8 F8' + 'F8 FF D9 D9 D9 FF C4 C4 C4 FF BB BB BB FF BF BF' + 'BF FF D8 D8 D8 FF DA DA DA FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF DB DB DB FF CF CF CF FF BC BC BC FF BB BB' + 'BB FF D1 D1 D1 FF DE DE DE FF FF FF FF FF 9A 9A' + '9A FF 00 00 00 FF 00 00 00 BA 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 25 00 00 00 F7 1F 1F 1F FF DA DA DA FF F3 F3' + 'F3 FF C6 C6 C6 FF A9 A9 A9 FF B7 B7 B7 FF B0 B0' + 'B0 FF C3 C3 C3 FF DA DA DA FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D9 D9' + 'D9 FF D2 D2 D2 FF A8 A8 A8 FF B6 B6 B6 FF B1 B1' + 'B1 FF B5 B5 B5 FF D8 D8 D8 FF FC FC FC FF 9C 9C' + '9C FF 00 00 00 FF 00 00 00 AE 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 07 00 00 00 D0 05 05 05 FF C2 C2 C2 FF F6 F6' + 'F6 FF BC BC BC FF B2 B2 B2 FF C3 C3 C3 FF AB AB' + 'AB FF BB BB BB FF D8 D8 D8 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D4 D4 D4 FF D3 D3 D3 FF D3 D3' + 'D3 FF D5 D5 D5 FF D7 D7 D7 FF D8 D8 D8 FF D8 D8' + 'D8 FF D7 D7 D7 FF D5 D5 D5 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D4 D4 D4 FF D5 D5 D5 FF D7 D7' + 'D7 FF C9 C9 C9 FF A6 A6 A6 FF C3 C3 C3 FF B3 B3' + 'B3 FF AD AD AD FF D6 D6 D6 FF F5 F5 F5 FF 76 76' + '76 FF 00 00 00 FF 00 00 00 8C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 9C 00 00 00 FF A4 A4 A4 FF F4 F4' + 'F4 FF CF CF CF FF C5 C5 C5 FF D2 D2 D2 FF BF BF' + 'BF FF C9 C9 C9 FF D3 D3 D3 FF D2 D2 D2 FF D0 D0' + 'D0 FF D3 D3 D3 FF DD DD DD FF E1 E1 E1 FF E3 E3' + 'E3 FF E6 E6 E6 FF EA EA EA FF ED ED ED FF ED ED' + 'ED FF EB EB EB FF E7 E7 E7 FF E4 E4 E4 FF E2 E2' + 'E2 FF DE DE DE FF D4 D4 D4 FF D0 D0 D0 FF D2 D2' + 'D2 FF D3 D3 D3 FF C5 C5 C5 FF D0 D0 D0 FF C2 C2' + 'C2 FF BF BF BF FF D9 D9 D9 FF E8 E8 E8 FF 56 56' + '56 FF 00 00 00 FF 00 00 00 72 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 73 00 00 00 FF 7E 7E 7E FF EF EF' + 'EF FF D1 D1 D1 FF CF CF CF FF CB CB CB FF CF CF' + 'CF FF D1 D1 D1 FF CE CE CE FF CF CF CF FF DF DF' + 'DF FF F0 F0 F0 FF EC EC EC FF E1 E1 E1 FF DE DE' + 'DE FF DD DD DD FF DC DC DC FF DB DB DB FF DB DB' + 'DB FF DC DC DC FF DD DD DD FF DE DE DE FF E1 E1' + 'E1 FF EC EC EC FF F1 F1 F1 FF E1 E1 E1 FF D1 D1' + 'D1 FF CE CE CE FF D0 D0 D0 FF CB CB CB FF CE CE' + 'CE FF D1 D1 D1 FF D9 D9 D9 FF D4 D4 D4 FF 3F 3F' + '3F FF 00 00 00 FF 00 00 00 55 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 59 00 00 00 FF 59 59 59 FF E9 E9' + 'E9 FF D0 D0 D0 FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF CA CA CA FF D6 D6 D6 FF ED ED ED FF E6 E6' + 'E6 FF DC DC DC FF D4 D4 D4 FF D5 D5 D5 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D5 D5' + 'D5 FF D5 D5 D5 FF DB DB DB FF E4 E4 E4 FF ED ED' + 'ED FF DA DA DA FF CA CA CA FF CD CD CD FF CD CD' + 'CD FF CB CB CB FF DF DF DF FF B8 B8 B8 FF 22 22' + '22 FF 00 00 00 FB 00 00 00 3A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 3E 00 00 00 FE 40 40 40 FF D7 D7' + 'D7 FF D2 D2 D2 FF CA CA CA FF CB CB CB FF CA CA' + 'CA FF D4 D4 D4 FF E9 E9 E9 FF DC DC DC FF D0 D0' + 'D0 FF D1 D1 D1 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D1 D1 D1 FF D0 D0 D0 FF D8 D8' + 'D8 FF EA EA EA FF D8 D8 D8 FF C9 C9 C9 FF CA CA' + 'CA FF C9 C9 C9 FF E0 E0 E0 FF A0 A0 A0 FF 08 08' + '08 FF 00 00 00 EB 00 00 00 22 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 25 00 00 00 F8 22 22 22 FF B7 B7' + 'B7 FF DB DB DB FF CA CA CA FF CB CB CB FF CE CE' + 'CE FF E4 E4 E4 FF D4 D4 D4 FF CF CF CF FF D1 D1' + 'D1 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF CF CF CF FF CD CD CD FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF CE CE CE FF CC CC' + 'CC FF D0 D0 D0 FF E2 E2 E2 FF CF CF CF FF C7 C7' + 'C7 FF C9 C9 C9 FF E2 E2 E2 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 C2 00 00 00 0E 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0C 00 00 00 E1 07 07 07 FF 9F 9F' + '9F FF DD DD DD FF CC CC CC FF CD CD CD FF DB DB' + 'DB FF D6 D6 D6 FF CE CE CE FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF CF CF CF FF CC CC CC FF C9 C9 C9 FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF C8 C8 C8 FF CF CF CF FF DA DA DA FF C7 C7' + 'C7 FF C9 C9 C9 FF E2 E2 E2 FF 5A 5A 5A FF 00 00' + '00 FF 00 00 00 94 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 B2 00 00 00 FF 83 83' + '83 FF DD DD DD FF CF CF CF FF D1 D1 D1 FF DB DB' + 'DB FF D1 D1 D1 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF CF CF CF FF C9 C9 C9 FF C5 C5' + 'C5 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C7 C7 C7 FF D3 D3 D3 FF C8 C8' + 'C8 FF C9 C9 C9 FF DE DE DE FF 42 42 42 FF 00 00' + '00 FF 00 00 00 6C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 80 00 00 00 FF 5F 5F' + '5F FF DC DC DC FF D1 D1 D1 FF D2 D2 D2 FF D4 D4' + 'D4 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D0 D0 D0 FF C8 C8' + 'C8 FF C3 C3 C3 FF C3 C3 C3 FF C3 C3 C3 FF C4 C4' + 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' + 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C7 C7 C7 FF C5 C5' + 'C5 FF CB CB CB FF CC CC CC FF 2D 2D 2D FF 00 00' + '00 F8 00 00 00 40 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 4B 00 00 00 FE 41 41' + '41 FF D8 D8 D8 FF D4 D4 D4 FF D2 D2 D2 FF D0 D0' + 'D0 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF CD CD CD FF C7 C7 C7 FF C4 C4 C4 FF C2 C2' + 'C2 FF C1 C1 C1 FF C0 C0 C0 FF C1 C1 C1 FF C1 C1' + 'C1 FF C1 C1 C1 FF C2 C2 C2 FF BF BF BF FF C0 C0' + 'C0 FF CE CE CE FF B2 B2 B2 FF 1A 1A 1A FF 00 00' + '00 E5 00 00 00 28 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 1A 00 00 00 F2 2C 2C' + '2C FF CC CC CC FF D6 D6 D6 FF D5 D5 D5 FF CC CC' + 'CC FF D5 D5 D5 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D7 D7 D7 FF D6 D6 D6 FF D5 D5 D5 FF D3 D3' + 'D3 FF CF CF CF FF CC CC CC FF C9 C9 C9 FF C6 C6' + 'C6 FF C4 C4 C4 FF C2 C2 C2 FF B3 B3 B3 FF BD BD' + 'BD FF D0 D0 D0 FF 99 99 99 FF 09 09 09 FF 00 00' + '00 CF 00 00 00 19 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 00 00 00 D8 18 18' + '18 FF B0 B0 B0 FF DB DB DB FF DB DB DB FF D0 D0' + 'D0 FF D2 D2 D2 FF DB DB DB FF D9 D9 D9 FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DB DB DB FF DB DB DB FF DA DA DA FF D9 D9' + 'D9 FF D9 D9 D9 FF CF CF CF FF C5 C5 C5 FF CC CC' + 'CC FF CA CA CA FF 7A 7A 7A FF 02 02 02 FF 00 00' + '00 B8 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 02 00 00 00 BF 08 08' + '08 FF 97 97 97 FF DC DC DC FF DF DF DF FF DC DC' + 'DC FF CE CE CE FF D6 D6 D6 FF DE DE DE FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DE DE' + 'DE FF D8 D8 D8 FF CE CE CE FF DD DD DD FF DC DC' + 'DC FF C6 C6 C6 FF 53 53 53 FF 00 00 00 FF 00 00' + '00 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 A4 00 00' + '00 FF 77 77 77 FF D3 D3 D3 FF E2 E2 E2 FF E1 E1' + 'E1 FF DE DE DE FF CE CE CE FF D7 D7 D7 FF E1 E1' + 'E1 FF E2 E2 E2 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E1 E1 E1 FF E1 E1 E1 FF D9 D9' + 'D9 FF CD CD CD FF DA DA DA FF E3 E3 E3 FF D9 D9' + 'D9 FF BB BB BB FF 39 39 39 FF 00 00 00 FF 00 00' + '00 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 89 00 00' + '00 FF 4B 4B 4B FF C9 C9 C9 FF E5 E5 E5 FF E3 E3' + 'E3 FF E4 E4 E4 FF E1 E1 E1 FF D7 D7 D7 FF D2 D2' + 'D2 FF DA DA DA FF E4 E4 E4 FF E5 E5 E5 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5' + 'E5 FF E5 E5 E5 FF DC DC DC FF D2 D2 D2 FF D6 D6' + 'D6 FF E0 E0 E0 FF E4 E4 E4 FF E6 E6 E6 FF D6 D6' + 'D6 FF A8 A8 A8 FF 20 20 20 FF 00 00 00 FD 00 00' + '00 4E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 62 00 00' + '00 FF 35 35 35 FF BD BD BD FF E6 E6 E6 FF E6 E6' + 'E6 FF E6 E6 E6 FF E7 E7 E7 FF E7 E7 E7 FF DF DF' + 'DF FF D2 D2 D2 FF D3 D3 D3 FF DE DE DE FF E3 E3' + 'E3 FF E3 E3 E3 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E3 E3 E3 FF E3 E3 E3 FF DE DE' + 'DE FF D4 D4 D4 FF D1 D1 D1 FF DD DD DD FF E7 E7' + 'E7 FF E7 E7 E7 FF E6 E6 E6 FF E8 E8 E8 FF D4 D4' + 'D4 FF 9A 9A 9A FF 0B 0B 0B FF 00 00 00 ED 00 00' + '00 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2D 00 00' + '00 F9 1E 1E 1E FF AB AB AB FF E4 E4 E4 FF ED ED' + 'ED FF E7 E7 E7 FF E6 E6 E6 FF EC EC EC FF EB EB' + 'EB FF EA EA EA FF E4 E4 E4 FF E0 E0 E0 FF DF DF' + 'DF FF DF DF DF FF DD DD DD FF DC DC DC FF DC DC' + 'DC FF DD DD DD FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF E2 E2 E2 FF E9 E9 E9 FF EC EC EC FF EA EA' + 'EA FF E5 E5 E5 FF EB EB EB FF EB EB EB FF D6 D6' + 'D6 FF 8A 8A 8A FF 00 00 00 FF 00 00 00 C3 00 00' + '00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00' + '00 DD 08 08 08 FF 99 99 99 FF E4 E4 E4 FF DF DF' + 'DF FF BD BD BD FF C1 C1 C1 FF D6 D6 D6 FF EC EC' + 'EC FF ED ED ED FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EB EB EB FF EB EB' + 'EB FF EC EC EC FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EE EE EE FF E4 E4 E4 FF C2 C2' + 'C2 FF BE BE BE FF D1 D1 D1 FF EC EC EC FF D4 D4' + 'D4 FF 75 75 75 FF 00 00 00 FF 00 00 00 9C 00 00' + '00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 AE 00 00 00 FF 8D 8D 8D FF E0 E0 E0 FF C4 C4' + 'C4 FF B2 B2 B2 FF B8 B8 B8 FF B2 B2 B2 FF EB EB' + 'EB FF F1 F1 F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F3 F3 F3 FF D5 D5 D5 FF B0 B0' + 'B0 FF B6 B6 B6 FF B7 B7 B7 FF EB EB EB FF CD CD' + 'CD FF 61 61 61 FF 00 00 00 FF 00 00 00 85 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 80 00 00 00 FF 64 64 64 FF CE CE CE FF DD DD' + 'DD FF DC DC DC FF D5 D5 D5 FF E4 E4 E4 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF FA FA FA FF F2 F2 F2 FF DF DF' + 'DF FF D8 D8 D8 FF DC DC DC FF D7 D7 D7 FF B0 B0' + 'B0 FF 34 34 34 FF 00 00 00 FF 00 00 00 67 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 44 00 00 00 FF 19 19 19 FF 80 80 80 FF BE BE' + 'BE FF D3 D3 D3 FF D7 D7 D7 FF DB DB DB FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D9 D9 D9 FF D9 D9' + 'D9 FF D7 D7 D7 FF CD CD CD FF B0 B0 B0 FF 5D 5D' + '5D FF 06 06 06 FF 00 00 00 ED 00 00 00 2B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 02 00 00 00 9C 00 00 00 FF 0C 0C 0C FF 3D 3D' + '3D FF 49 49 49 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 49 49 49 FF 49 49 49 FF 2F 2F 2F FF 02 02' + '02 FF 00 00 00 FF 00 00 00 5C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 06 00 00 00 7F 00 00 00 F1 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 D6 00 00 00 5C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2C 00 00' + '00 7E 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 70 00 00' + '00 1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'F1 C7 FF FF 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF F8 07 FF FF 00 00 FF FF' + 'E0 00 00 3F 00 00 FF 00 00 00 00 7F 00 00 FC 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FF 00 00 00 00 7F 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 01 FF 00 00 FF 80 00 00 03 FF 00 00 FF E0' + '00 00 07 FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 08 00 00 00' + '00 00 00 09 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 01 01 01 00 02 02' + '02 00 05 05 05 00 06 06 06 00 07 07 07 00 08 08' + '08 00 09 09 09 00 0B 0B 0B 00 0C 0C 0C 00 13 13' + '13 00 18 18 18 00 19 19 19 00 1A 1A 1A 00 1E 1E' + '1E 00 1F 1F 1F 00 20 20 20 00 21 21 21 00 22 22' + '22 00 24 24 24 00 26 26 26 00 27 27 27 00 28 28' + '28 00 29 29 29 00 2A 2A 2A 00 2B 2B 2B 00 2C 2C' + '2C 00 2D 2D 2D 00 2E 2C 2D 00 2F 2F 2F 00 34 34' + '34 00 35 35 35 00 39 39 39 00 3B 3B 3B 00 3D 3D' + '3D 00 3F 3F 3F 00 40 40 40 00 41 41 41 00 42 42' + '42 00 47 47 47 00 48 48 48 00 49 49 49 00 4B 4B' + '4B 00 4F 4F 4F 00 53 53 53 00 56 56 56 00 58 58' + '58 00 59 59 59 00 5A 5A 5A 00 5B 5B 5B 00 5D 5D' + '5D 00 5F 5F 5F 00 61 61 61 00 63 63 63 00 64 64' + '64 00 66 66 66 00 67 67 67 00 68 68 68 00 6A 6A' + '6A 00 6B 6B 6B 00 6C 6C 6C 00 70 70 70 00 71 71' + '71 00 72 72 72 00 73 73 73 00 74 74 74 00 75 75' + '75 00 76 76 76 00 77 77 77 00 78 78 78 00 79 79' + '79 00 7A 7A 7A 00 7C 7C 7C 00 7D 7D 7D 00 7E 7E' + '7E 00 7F 7F 7F 00 2F 99 64 00 1C A8 60 00 0A BF' + '61 00 20 A8 63 00 51 A7 7C 00 17 CE 71 00 00 00' + 'FF 00 80 80 80 00 81 81 81 00 83 83 83 00 84 83' + '84 00 85 85 85 00 87 87 87 00 88 88 88 00 8A 8A' + '8A 00 8C 8C 8C 00 8D 8D 8D 00 8E 8E 8E 00 8F 8F' + '8F 00 90 90 90 00 92 92 92 00 93 93 93 00 94 94' + '94 00 97 97 97 00 98 98 98 00 99 99 99 00 9A 9A' + '9A 00 9C 9C 9C 00 9D 9D 9D 00 9F 9F 9F 00 83 AB' + '97 00 96 AB A0 00 90 AF A0 00 99 AC A2 00 95 B2' + 'A3 00 9D B3 A8 00 A0 A0 A0 00 A1 A1 A1 00 A2 A2' + 'A2 00 A3 A3 A3 00 A4 A4 A4 00 A5 A5 A5 00 A6 A6' + 'A6 00 A7 A7 A7 00 A8 A8 A8 00 A9 A9 A9 00 AA AA' + 'AA 00 AB AB AB 00 AD A8 AB 00 AB AC AC 00 AC AC' + 'AC 00 AD AD AD 00 AE AE AE 00 AF AF AF 00 B0 B0' + 'B0 00 B1 B1 B1 00 B2 B2 B2 00 B3 B3 B3 00 B3 B4' + 'B3 00 B5 B5 B5 00 B6 B6 B6 00 B7 B7 B7 00 B8 B4' + 'B6 00 B8 B8 B8 00 B9 B9 B9 00 BA BA BA 00 BB BB' + 'BB 00 BF BB BD 00 BC BC BC 00 BD BD BD 00 BE BE' + 'BE 00 BF BF BF 00 91 D6 B4 00 91 D8 B5 00 C3 BD' + 'C0 00 C2 BE C0 00 C7 BF C3 00 C0 C0 C0 00 C1 C1' + 'C1 00 C2 C2 C2 00 C3 C3 C3 00 C4 C1 C3 00 C4 C3' + 'C3 00 C4 C3 C4 00 C6 C2 C4 00 C6 C3 C4 00 C6 C3' + 'C5 00 C4 C4 C4 00 C5 C4 C4 00 C5 C5 C5 00 C7 C4' + 'C5 00 C6 C6 C6 00 C7 C7 C7 00 C8 C8 C8 00 C8 C9' + 'C9 00 C9 C9 C9 00 CA CA CA 00 CB CB CB 00 CC CC' + 'CC 00 CD CD CD 00 CE CE CE 00 CF CF CF 00 D0 D0' + 'D0 00 D1 D1 D1 00 D2 D2 D2 00 D3 D3 D3 00 D4 D4' + 'D4 00 D5 D5 D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8' + 'D8 00 D9 D9 D9 00 DA DA DA 00 DB DB DB 00 DC DC' + 'DC 00 DD DD DD 00 DE DE DE 00 DF DF DF 00 E0 E0' + 'E0 00 E1 E1 E1 00 E2 E2 E2 00 E3 E3 E3 00 E4 E4' + 'E4 00 E5 E5 E5 00 E6 E6 E6 00 E7 E7 E7 00 E8 E8' + 'E8 00 E9 E9 E9 00 EA EA EA 00 EB EB EB 00 EC EC' + 'EC 00 ED ED ED 00 EE EE EE 00 EF EF EF 00 F0 F0' + 'F0 00 F1 F1 F1 00 F2 F2 F2 00 F3 F3 F3 00 F4 F4' + 'F4 00 F5 F5 F5 00 F6 F6 F6 00 F7 F7 F7 00 F8 F8' + 'F8 00 F9 F9 F9 00 FA FA FA 00 FC FC FC 00 FF FF' + 'FF 00 00 00 00 00 10 DA 4B 00 F8 0F 0D 01 71 CC' + '43 00 F8 0F 0D 01 40 E3 0C 01 A4 1A 95 00 2C A3' + 'AF 00 C4 F5 AF 00 03 00 00 00 40 E3 0C 01 2F 0C' + '00 00 B8 10 0D 01 30 00 00 00 00 00 00 00 40 00' + '00 00 F8 0F 0D 01 C0 00 00 00 30 00 00 00 00 09' + '00 00 00 24 00 00 00 00 00 00 00 00 00 00 30 00' + '00 00 30 00 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 00 24 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 52 52 DF 00 00 00' + '52 52 DF 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 52 52 52 DF 00 52' + '52 52 DF 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 DF DF DF DF DF DF DF DF DF DF' + 'DF DF DF DF DF DF DF DF DF DF DF 52 52 52 52 52' + '52 DF DF DF DF DF DF DF DF DF DF DF DF DF DF DF' + 'DF DF DF DF DF DF 53 53 53 53 53 53 53 53 53 53' + '53 53 53 53 53 53 53 53 53 53 53 53 52 52 52 52' + '53 53 53 53 53 53 53 53 53 53 53 53 53 53 53 53' + '53 53 53 53 53 53 99 99 99 99 99 99 99 99 99 99' + '99 99 99 99 99 99 99 99 99 99 99 99 52 52 52 52' + '99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99' + '99 99 99 99 99 99 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 52 52 52 52 52' + '52 DF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 52 52 52 99 99 52' + '52 52 DF 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 52 52 00 99 99 DF' + '52 52 DF 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 DF DF DF DF' + 'DF DF DF DF DF DF DF DF DF DF DF DF DF DF DF DF' + 'DF DF DF DF DF DF DF DF DF DF DF DF DF DF DF 00' + '00 00 00 00 00 00 00 00 00 00 00 DF DF DF DF 11' + '1A 19 1A 19 19 19 19 19 19 19 19 19 19 19 18 18' + '18 18 18 18 18 18 18 19 19 19 1C 1C 0A DF DF DF' + '00 00 00 00 00 00 00 00 00 00 00 DF DF 14 5F AC' + 'AF AD B0 AF AE AD AB A8 A7 A5 A3 9C 9B 9B 9C 99' + '9A 93 93 90 91 8D 8E 87 86 8A 7F 7D 7C 35 07 DF' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 01 5A CD CA' + 'C9 B7 57 59 60 64 72 7F 8D 99 9C A7 AD AC AC B8' + 'AC B5 AD B9 AE B6 A8 AA A0 6F 4F 4D 6C 8F 2B DF' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 0C A8 CE C4' + 'C8 AD 21 23 2D 3F 58 60 68 75 78 7E 89 79 67 91' + '65 89 71 9C 73 91 64 A4 98 50 51 4E 4C 96 56 01' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 17 B3 CC C6' + 'C9 AF 27 33 46 58 5E 63 70 77 7A 80 8C 74 5F 8B' + '5A 81 62 93 63 89 59 9E A2 6E 94 95 6A 9D 5D 01' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 16 B3 CE C8' + 'C9 B3 39 41 4A 57 5D 63 70 77 7A 80 8D 69 55 85' + '48 78 58 8E 5A 84 46 9B A3 A1 6D 6B 97 A3 5C 01' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 16 B3 D0 C9' + 'CA B8 3D 3E 49 57 5D 63 70 77 7A 80 8E 64 40 7F' + '3A 70 45 89 48 7B 38 9B A7 9F A6 A0 93 A5 5C 01' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 15 B3 D1 CB' + 'CD B8 3A 3C 45 54 5A 61 67 73 76 7B 8C 5F 37 75' + '31 64 3B 83 3D 74 2E 9A A9 A5 9C 9B 9A A7 5D 01' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 15 B4 D4 CD' + 'CC C1 77 77 7B 80 82 85 88 8C 8C 8D 91 89 83 92' + '81 8D 83 92 82 8D 7B A5 A9 A7 A3 9C 9B AB 5D DF' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 14 B5 D5 CD' + 'CD CC CF CD CB CA C8 C6 C4 C3 C1 C0 BD BD BE BA' + 'BB B8 B8 B4 B4 B1 B2 AD AC AB A8 A3 99 AC 5D DF' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 14 B5 D9 DA' + 'D8 D8 D8 D7 D7 D6 D6 D5 D5 D5 D4 D4 D3 D3 D3 D2' + 'D2 D2 D1 D1 D0 D0 CF CF CF CE CE CD C2 B2 5C DF' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 13 B8 DE CB' + 'C3 C4 C4 C2 C1 C1 C1 C1 C1 C2 C2 C2 C2 C2 C2 C2' + 'C2 C2 C2 C2 C2 C2 C2 C2 C4 C5 C5 C5 DA D1 5B DF' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 13 C0 DA BB' + 'A3 8E 93 BA BC BB BB BB BB BB BB BB BB BB BB BB' + 'BB BB BB BB BB BB BB BD B1 90 8E B3 C0 DE 66 DF' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 0F BC D5 A7' + '79 89 82 9C BC BA BA BA BA BA B9 B9 B9 B9 B9 B9' + 'B9 B9 BA BA BA BA BB B4 78 88 83 87 BA DD 67 DF' + 'DF 00 00 00 00 00 00 00 00 00 DF DF 03 9B D8 90' + '84 9C 7B 8E BA B7 B7 B7 B6 B5 B5 B7 B9 BA BA B9' + 'B7 B5 B5 B5 B6 B7 B9 AB 76 9C 85 7F B8 D7 43 DF' + 'DF 00 00 00 00 00 00 00 00 00 00 DF DF 74 D6 B1' + 'A5 B4 93 AB B5 B4 B2 B5 BF C3 C5 C8 CC CF CF CD' + 'C9 C6 C4 C0 B6 B2 B4 B5 A5 B2 9B 93 BB CA 2D DF' + 'DF 00 00 00 00 00 00 00 00 00 00 DF DF 4A D1 B3' + 'B1 AD B1 B3 B0 B1 C1 D2 CE C3 C0 BF BE BD BD BE' + 'BF C0 C3 CE D3 C3 B3 B0 B2 AD B0 B3 BB B6 23 DF' + 'DF 00 00 00 00 00 00 00 00 00 00 DF DF 2F CB B2' + 'AF AF AF AC B8 CF C8 BE B6 B7 B8 B8 B8 B8 B8 B8' + 'B8 B8 B7 B7 BD C6 CF BC AC AF AF AD C1 8B 12 DF' + 'DF 00 00 00 00 00 00 00 00 00 00 DF DF 24 B9 B4' + 'AC AD AC B6 CB BE B2 B3 B4 B4 B4 B4 B4 B4 B4 B4' + 'B4 B4 B4 B4 B3 B2 BA CC BA AB AC AB C2 70 06 DF' + 'DF 00 00 00 00 00 00 00 00 00 00 DF DF 12 89 BD' + 'AC AD B0 C6 B6 B1 B3 B2 B2 B2 B2 B1 AF B0 B0 B0' + 'B0 B0 B0 B0 B0 B0 AE B2 C4 B1 A8 AB C4 53 DF DF' + 'DF 00 00 00 00 00 00 00 00 00 00 DF DF 05 69 BF' + 'AE AF BD B8 B0 B2 B2 B2 B2 B2 B2 B1 AE AB AC AC' + 'AC AC AC AC AC AC AC A9 B1 BC A8 AB C4 30 DF DF' + 'DF 00 00 00 00 00 00 00 00 00 00 00 DF DF 55 BF' + 'B1 B3 BD B3 B2 B2 B2 B2 B2 B2 B2 B2 B1 AB A5 A7' + 'A7 A7 A7 A7 A7 A7 A7 A7 A8 B5 A9 AB C0 26 DF DF' + '00 00 00 00 00 00 00 00 00 00 00 00 DF DF 33 BE' + 'B3 B4 B6 B3 B3 B3 B3 B3 B3 B3 B3 B3 B3 B2 A9 9C' + '9C 9C A3 A3 A3 A3 A3 A3 A3 A8 A5 AD AE 1B DF DF' + '00 00 00 00 00 00 00 00 00 00 00 00 DF DF 25 BA' + 'B6 B4 B2 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 AF' + 'A8 A3 9B 9A 99 9A 9A 9A 9B 93 99 B0 84 0D DF DF' + '00 00 00 00 00 00 00 00 00 00 00 00 DF DF 1A AE' + 'B8 B7 AE B7 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B9' + 'B8 B7 B5 B1 AE AB A7 A3 9B 85 91 B2 65 07 DF DF' + '00 00 00 00 00 00 00 00 00 00 00 00 DF DF 0B 82' + 'BD BD B2 B4 BD BB BC BC BC BC BC BC BC BC BC BC' + 'BC BC BC BD BD BC BB BB B1 A5 AE AC 47 02 DF DF' + '00 00 00 00 00 00 00 00 00 00 00 00 DF DF 06 63' + 'BE C1 BE B0 B8 C0 BF BF BF BF BF BF BF BF BF BF' + 'BF BF BF BF BF BF C0 BA B0 BF BE A7 2C DF DF 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF 44' + 'B5 C4 C3 C0 B0 B9 C3 C4 C2 C2 C2 C2 C2 C2 C2 C2' + 'C2 C2 C2 C2 C3 C3 BB AF BC C5 BB 8E 20 DF DF 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF 2A' + 'AB C7 C5 C6 C3 B9 B4 BC C6 C7 C6 C6 C6 C6 C6 C6' + 'C6 C6 C7 C7 BE B4 B8 C2 C6 C8 B8 78 10 DF DF 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF 1F' + '91 C8 C8 C8 C9 C9 C1 B4 B5 C0 C5 C5 C6 C6 C6 C6' + 'C5 C5 C0 B6 B3 BF C9 C9 C8 CA B6 66 08 DF DF 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF 0E' + '7B C6 CF C9 C8 CE CD CC C6 C2 C1 C1 BF BE BE BF' + 'C1 C1 C1 C4 CB CE CC C7 CD CD B8 5A DF DF DF 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF 06' + '65 C6 C1 91 9A B8 CE CF CF D0 D0 CF CE CD CD CE' + 'CF D0 D0 CF D0 C6 9B 92 B3 CE B6 42 DF DF DF 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF' + '5C C2 A3 84 8B 84 CD D3 D2 D2 D2 D2 D2 D2 D2 D2' + 'D2 D2 D2 D2 D5 B7 82 88 89 CD AF 34 DF DF DF 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF' + '36 B0 BF BE B7 C6 DB DB DB DB DB DB DB DB DB DB' + 'DB DB DB DB DC D4 C1 BA BE B9 82 1E DF DF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF' + '0C 53 92 B5 B9 BD BA BA BA BA BA BA BA BA BA BA' + 'BA BA BA BA BA BB BB B9 AF 82 32 04 DF DF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 DF DF' + 'DF 09 22 29 28 28 28 28 28 28 28 28 28 28 28 28' + '28 28 28 28 28 28 28 29 29 1D 02 DF DF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DF' + 'DF DF DF DF DF DF DF DF DF DF DF DF DF DF DF DF' + 'DF DF DF DF DF DF DF DF DF DF DF DF 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 DF DF DF DF DF DF DF DF DF DF DF DF DF DF DF' + 'DF DF DF DF DF DF DF DF DF DF DF 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF F1 C7 FF FF 00 00 FF FF' + 'F0 87 FF FF 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'F8 0F FF FF 00 00 FF FF F0 07 FF FF 00 00 FF FF' + 'F2 07 FF FF 00 00 FC 00 00 00 00 7F 00 00 F8 00' + '00 00 00 3F 00 00 F8 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 3F 00 00 FC 00 00 00 00 3F 00 00 FC 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FE 00' + '00 00 00 7F 00 00 FE 00 00 00 00 7F 00 00 FF 00' + '00 00 00 7F 00 00 FF 00 00 00 00 FF 00 00 FF 00' + '00 00 00 FF 00 00 FF 00 00 00 01 FF 00 00 FF 80' + '00 00 03 FF 00 00 FF E0 00 00 07 FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 24 00 00 00 30 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 FF FF 00 00' + 'FF FF 00 00 00 3C 00 00 00 30 00 00 00 30 00 00' + '00 30 00 00 00 30 00 00 00 30 00 00 00 30 C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF 00 00 FF FF 00 00' + 'FF FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0' + 'C0 FF C0 C0 C0 FF C0 C0 C0 FF C0 C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 04 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 26 26 26 FF CD CD CD FF CD CD' + 'CD FF C9 C9 C9 FF C5 C5 C5 FF C2 C2 C2 FF C0 C0' + 'C0 FF BF BF BF FF BA BA BA FF B3 B4 B3 FF AB AC' + 'AC FF 09 09 09 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 30 D1 D1 D1 FF E7 E7 E7 FF 5F 5F' + '5F FF 8F 8F 8F FF A7 A7 A7 FF B9 B9 B9 FF B8 B8' + 'B8 FF 94 94 94 FF B7 B7 B7 FF C6 C3 C5 FF 91 D8' + 'B5 FF 8E 8E 8E FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 33 D1 D1 D1 FF EB EB EB FF 6C 6C' + '6C FF 8A 8A 8A FF A3 A3 A3 FF B9 B9 B9 FF A5 A5' + 'A5 FF 6B 6B 6B FF A4 A4 A4 FF C8 C8 C8 FF C2 C2' + 'C2 FF 8E 8E 8E FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 33 D3 D3 D3 FF F6 F6 F6 FF F5 F5' + 'F5 FF F4 F4 F4 FF F3 F3 F3 FF F1 F1 F1 FF F0 F0' + 'F0 FF EF EF EF FF EE EE EE FF ED ED ED FF EB EB' + 'EB FF 8D 8D 8D FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 25 DA DA DA FF A9 A9 A9 FF C3 C3' + 'C3 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7 D7 FF D7 D7' + 'D7 FF D8 D8 D8 FF D8 D8 D8 FF A8 A8 A8 FF B5 B5' + 'B5 FF 9C 9C 9C FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 7E 7E 7E FF CF CF CF FF D1 D1' + 'D1 FF DF DF DF FF E1 E1 E1 FF DC DC DC FF DC DC' + 'DC FF E1 E1 E1 FF E1 E1 E1 FF D0 D0 D0 FF D1 D1' + 'D1 FF 3F 3F 3F FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 22 22 22 FF CA CA CA FF E4 E4' + 'E4 FF D1 D1 D1 FF D0 D0 D0 FF CD CD CD FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF E2 E2 E2 FF C9 C9' + 'C9 FF 00 00 00 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF C3 C3' + 'C3 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4 C4 FF CB CB' + 'CB FF 00 00 00 F8 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 D8 DB DB DB FF D2 D2' + 'D2 FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF CF CF CF FF CA CA' + 'CA FF 00 00 00 B8 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 89 C9 C9 C9 FF E4 E4' + 'E4 FF D2 D2 D2 FF E5 E5 E5 FF E4 E4 E4 FF E4 E4' + 'E4 FF E5 E5 E5 FF D2 D2 D2 FF E4 E4 E4 FF A8 A8' + 'A8 FF 00 00 00 4E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 99 99 99 FF BD BD' + 'BD FF EC EC EC FF EE EE EE FF EC EC EC FF EC EC' + 'EC FF EE EE EE FF E4 E4 E4 FF D1 D1 D1 FF 75 75' + '75 FF 00 00 00 06 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 19 19 19 FF D3 D3' + 'D3 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D9 D9 D9 FF CD CD CD FF 06 06' + '06 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 E0 03 00 00 C0 03 00 00 80 03' + '00 00 80 03 00 00 80 03 00 00 80 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 E0 07 00 00 F0 0F 00 00' +} */ + +/* BINRES cdrom.ico */ +11 ICON cdrom.ico +/* { + '00 00 01 00 09 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 96 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 3E 09 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 A6 0E 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 4E 1F 00 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 76 20 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 5E 23 00 00 30 30 00 00 01 00 04 00 68 06' + '00 00 C6 27 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 2E 2E 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 D6 3C 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 01 01 01 00 01 02 02 00 02 03 03 00 05 05' + '05 00 06 06 06 00 07 07 07 00 09 09 09 00 0B 0B' + '0B 00 10 10 10 00 13 13 13 00 18 18 18 00 1B 1C' + '1B 00 1E 1E 1E 00 22 26 23 00 23 29 24 00 24 2E' + '25 00 3B 40 3C 00 3E 40 3F 00 40 41 40 00 41 43' + '42 00 42 44 43 00 46 48 47 00 4E 50 4F 00 50 52' + '51 00 54 55 55 00 56 56 56 00 57 57 57 00 57 58' + '58 00 59 59 59 00 5A 5A 5A 00 5A 5B 5B 00 5B 5C' + '5C 00 5D 5E 5E 00 5F 68 5F 00 71 71 72 00 72 72' + '73 00 74 74 74 00 77 76 77 00 78 76 77 00 72 78' + '72 00 79 76 78 00 7A 76 78 00 7B 77 79 00 7D 78' + '7A 00 7F 78 7B 00 7F 7F 7F 00 80 7A 7D 00 81 7C' + '7F 00 0E CE 0E 00 14 C2 15 00 10 CE 10 00 6D 90' + '6D 00 82 7D 80 00 84 80 83 00 86 83 85 00 8D 8B' + '8C 00 90 8F 90 00 95 96 95 00 97 97 97 00 98 98' + '98 00 98 99 99 00 99 9A 9A 00 9B 9C 9B 00 9F A0' + '9F 00 A7 A7 A7 00 A9 A8 A9 00 AB AA AA 00 AD AC' + 'AC 00 AE AE AE 00 B1 B0 B1 00 B3 B2 B3 00 B4 B3' + 'B4 00 B6 B6 B6 00 B8 B8 B8 00 B9 B9 B9 00 BB BB' + 'BB 00 BE BE BE 00 C0 C0 C0 00 C2 C3 C2 00 C3 C3' + 'C2 00 C5 C2 C3 00 C7 C1 C4 00 C9 C3 C5 00 CA C6' + 'C7 00 CA C8 C8 00 CA C9 C9 00 CB CA CA 00 CC CB' + 'CB 00 CD CB CB 00 CD CC CC 00 CD CD CD 00 CE CE' + 'CE 00 CE CF CF 00 CF CF CF 00 D0 D0 D0 00 D1 D1' + 'D1 00 D2 D2 D2 00 D4 D3 D3 00 D4 D4 D4 00 D5 D4' + 'D4 00 D7 D4 D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8' + 'D8 00 D9 D9 D9 00 DA DA DA 00 DB DB DB 00 DC DC' + 'DC 00 DD DD DD 00 DE DE DE 00 FB D6 D7 00 FD D4' + 'D5 00 FE D4 D6 00 FE D4 DF 00 F7 D9 DA 00 F0 DE' + 'DF 00 EA DB E2 00 FE D3 E9 00 FE D3 ED 00 FE D4' + 'EF 00 F2 DA E8 00 F9 DA EF 00 FE D4 F1 00 FE D5' + 'F4 00 FE D6 F6 00 FC DB F4 00 FE D8 F9 00 FE DB' + 'F9 00 FE DC F8 00 E1 E0 E0 00 E7 E5 E6 00 E7 E6' + 'E6 00 E7 E7 E7 00 EA E3 E3 00 E8 E8 E8 00 E9 E9' + 'E9 00 EA EA EA 00 EB EB EB 00 EC EC EC 00 ED ED' + 'ED 00 EF EE EE 00 F0 EE EF 00 F0 EF F0 00 F1 F0' + 'F0 00 F1 F1 F1 00 F2 F2 F2 00 F2 F3 F3 00 F3 F5' + 'F5 00 F7 F6 F8 00 FA F7 FA 00 FB FA FB 00 FC F8' + 'FC 00 00 00 00 00 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 54 00' + '00 00 00 00 00 00 03 00 00 00 5C 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 88 36' + '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 63 64 72 6F 6D 2E 69 63 6F' + '00 00 1A 93 4B 00 14 1A 95 00 1F 3B D4 77 15 00' + '00 00 A8 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 B0 6C' + '38 00 96 00 00 00 00 00 00 00 C9 F1 E7 77 96 00' + '00 00 A4 1A 95 00 09 00 00 00 00 00 00 00 96 00' + '00 00 96 00 00 00 09 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 B0 6C' + '38 00 96 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 99 99 0D 09 08 0C 99 99 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 99 21 11 45 4C 5D 55 21 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 99 23 4D 97 7F 7F 76 71 72 74 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 99 23 75 80 7B 7B 72 71 71 71 94 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 10 28 98 7C 78 7B 72 71 71 6F 94 92 00 00' + '99 99 99 99 99 99 99 99 99 99 99 99 99 99 99 99' + '99 10 1F 59 7D 78 78 7B 71 71 6F 93 92 92 00 99' + '08 15 19 17 21 23 1F 1D 1D 1E 1E 1D 1D 1C 1C 1F' + '1F 12 40 81 78 78 78 7B 71 71 8E 91 92 92 99 99' + '37 6A 82 83 50 32 98 8B 84 82 67 64 64 64 61 63' + '1B 17 75 7C 78 7B 78 78 7B 7F 7F 7B 93 92 99 03' + '65 94 89 81 31 31 33 79 5C 5E 5A 5B 5B 5B 67 24' + '0E 23 97 7A 92 77 7B 78 7F 53 6F 7F 8E 8F 99 07' + '83 8D 89 98 34 31 41 52 4E 4E 4E 4E 4E 4E 50 4E' + '2F 27 97 93 93 8C 7A 7F 48 40 23 70 7E 90 99 05' + '92 8B 93 3A 2B 38 2A 25 25 25 25 25 25 25 25 26' + '23 3A 97 92 92 93 92 7E 10 00 00 3A 81 93 99 04' + '92 8F 91 44 39 3A 3F 3F 3F 3F 3F 3D 3C 3C 3C 3E' + '35 40 97 92 92 93 76 7E 11 99 00 52 7E 8D 99 03' + '90 8F 89 90 8A 89 87 86 82 82 82 82 82 82 82 83' + '47 3D 97 92 92 93 8E 7C 53 38 52 81 7E 76 99 02' + '96 96 8A 8D 88 87 87 87 88 88 87 87 87 87 85 8B' + '4B 23 97 92 92 92 8F 8D 7F 81 7F 7F 77 7B 99 01' + '97 82 46 46 66 68 67 67 67 67 66 66 66 67 67 6A' + '50 22 95 93 92 92 92 94 72 71 71 76 7B 78 99 99' + '94 5F 44 44 51 69 66 64 63 63 67 68 66 63 63 64' + '82 23 49 97 92 92 92 94 6F 71 71 76 7B 78 00 99' + '55 86 58 55 5C 5F 60 60 61 64 63 63 63 64 5F 62' + '62 84 20 65 94 92 92 71 71 71 71 76 78 78 00 99' + '3F 86 5A 5C 5B 60 63 63 64 66 66 66 66 66 64 68' + '82 68 3B 2D 97 95 6F 71 71 71 77 7B 7B 7C 00 99' + '22 82 55 56 64 61 60 60 60 5F 61 60 60 61 60 5F' + '5C 62 69 3A 38 73 6F 71 71 77 7B 7B 81 75 00 99' + '11 6C 57 5F 62 5F 5F 5E 5E 5F 62 60 62 62 62 62' + '60 62 5C 5B 39 36 57 72 81 81 98 98 48 3A 00 99' + '0B 57 62 61 60 5E 5F 5F 5F 5E 5E 62 62 62 62 62' + '62 62 66 4D 4A 0C 02 13 19 18 16 15 99 00 00 99' + '08 4A 66 61 61 60 60 60 60 60 61 61 61 61 61 61' + '61 61 64 4C 48 0F 99 00 00 00 00 00 00 00 00 99' + '99 3A 82 66 67 67 67 67 67 67 67 67 63 64 64 64' + '63 64 5E 54 5A 10 99 00 00 00 00 00 00 00 00 99' + '99 23 8A 6D 6E 6D 6B 6B 6B 6B 6B 6B 6C 6D 6D 6C' + '6E 83 84 6E 46 0A 99 00 00 00 00 00 00 00 00 00' + '99 11 84 86 82 82 82 82 86 82 82 82 82 82 82 82' + '83 85 84 83 38 02 99 00 00 00 00 00 00 00 00 00' + '99 0B 82 87 85 88 8B 8A 8A 87 88 88 88 88 87 84' + '85 87 85 84 23 99 99 00 00 00 00 00 00 00 00 00' + '99 99 56 90 69 83 8B 8B 8A 8A 8A 89 8A 8B 8B 8B' + '87 69 89 8B 17 99 99 00 00 00 00 00 00 00 00 00' + '99 99 4F 6B 43 45 92 8F 8F 8F 8F 8D 8F 8F 8F 94' + '54 42 5A 92 12 99 99 00 00 00 00 00 00 00 00 00' + '00 99 24 6E 88 8B 97 97 97 97 97 97 97 97 97 97' + '95 87 83 4C 06 99 00 00 00 00 00 00 00 00 00 00' + '00 99 07 1A 30 2C 29 29 29 29 29 29 29 29 29 29' + '2B 2F 23 10 99 99 00 00 00 00 00 00 00 00 00 00' + '00 00 99 99 99 99 99 99 99 99 99 99 99 99 99 99' + '99 99 99 99 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF 00 FF FF FE 00 FF FF FC 00 FF FF F8 00 FF FF' + 'F0 00 C0 00 00 00 80 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 18 00 00 00 08 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 80 00 00 00 80 00 00 00 80 00 00 00 80 00' + '00 01 80 00 00 7F 80 00 00 7F 80 00 00 7F C0 00' + '00 7F C0 00 00 7F C0 00 00 7F C0 00 00 7F E0 00' + '00 FF E0 00 00 FF F0 00 03 FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 05 05 05 00 0C 0F' + '0F 00 0D 11 0E 00 15 15 15 00 36 36 36 00 39 39' + '39 00 40 43 41 00 44 47 45 00 53 53 53 00 5B 60' + '5D 00 67 68 68 00 64 6A 69 00 69 69 69 00 6B 6C' + '6B 00 6E 6E 6E 00 6F 6E 6E 00 6F 70 70 00 72 72' + '72 00 7D 7D 7D 00 7E 7E 7E 00 7F 7F 7F 00 00 FF' + '00 00 75 99 75 00 88 6C 88 00 84 7E 84 00 8B 7E' + '82 00 80 80 80 00 84 84 84 00 93 93 93 00 97 97' + '97 00 9A 98 98 00 9B 9B 9B 00 9D 9D 9D 00 9F 9F' + '9F 00 A0 A0 A0 00 A5 A5 A5 00 A6 A6 A6 00 A8 A2' + 'A8 00 B8 AC B8 00 BB BB BB 00 A6 D4 A6 00 D8 AE' + 'C6 00 CB BD C9 00 C0 C0 C0 00 C2 C2 C2 00 C2 C3' + 'C3 00 C3 C3 C3 00 C8 C8 C8 00 C9 C9 C9 00 CE CE' + 'CE 00 CF CF CF 00 D3 C2 CD 00 D0 D0 D0 00 D1 D1' + 'D1 00 D2 D2 D2 00 D3 D3 D3 00 D6 D0 D6 00 D4 D4' + 'D4 00 D5 D5 D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8' + 'D8 00 D9 D9 D9 00 DA DA DA 00 DB DB DB 00 DC DC' + 'DC 00 DE DE DE 00 FF D2 CD 00 FF D2 CE 00 E2 C2' + 'DA 00 FF D8 D7 00 FF D4 D8 00 FA DD DA 00 FD DC' + 'DC 00 FF DE DF 00 F4 D7 EA 00 FF D3 E8 00 FF D6' + 'E8 00 FF D7 EF 00 FF D3 F1 00 FF D3 F2 00 FF D3' + 'F3 00 FF D4 F5 00 FF D7 F7 00 FF D9 F7 00 FD D9' + 'FB 00 E1 E1 E1 00 E3 E4 E3 00 E4 E4 E4 00 E5 E5' + 'E5 00 E6 E6 E6 00 E8 E8 E8 00 E9 E9 E9 00 EA EA' + 'EA 00 EA EB EB 00 EB EB EB 00 ED ED ED 00 FF E3' + 'E1 00 F5 EA EF 00 FF EF EF 00 FD E7 F4 00 FB ED' + 'F4 00 FE E7 FA 00 FF E2 FF 00 FF E9 FF 00 FF ED' + 'FE 00 FF EE FF 00 EE F9 F7 00 F1 F1 F1 00 F1 F3' + 'F2 00 F2 F2 F2 00 F3 F3 F3 00 F0 F5 F2 00 F0 F6' + 'F3 00 F0 F7 F7 00 F4 F4 F4 00 F5 F5 F5 00 F6 F6' + 'F6 00 FF F0 FF 00 FF F3 FF 00 FF F6 FF 00 F9 F9' + 'F9 00 FA FA FA 00 FB FB FB 00 FC FC FC 00 FD FD' + 'FD 00 FF FD FE 00 FE FE FE 00 FF FF FF 00 00 00' + '00 00 E7 E5 E6 00 E7 E6 E6 00 E7 E7 E7 00 EA E3' + 'E3 00 E8 E8 E8 00 E9 E9 E9 00 EA EA EA 00 EB EB' + 'EB 00 EC EC EC 00 ED ED ED 00 EF EE EE 00 F0 EE' + 'EF 00 F0 EF F0 00 F1 F0 F0 00 F1 F1 F1 00 F2 F2' + 'F2 00 F2 F3 F3 00 F3 F5 F5 00 F7 F6 F8 00 FA F7' + 'FA 00 FB FA FB 00 FC F8 FC 00 00 00 00 00 FF FF' + 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' + 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 77 00 EC FD 7F 54 00 00 00 00 00 00 00 03 00' + '00 00 5C 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 88 36 0C 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 63' + '64 72 6F 6D 2E 69 63 6F 00 00 1A 93 4B 00 14 1A' + '95 00 1F 3B D4 77 15 00 00 00 A8 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 B0 6C 38 00 96 00 00 00 00 00' + '00 00 C9 F1 E7 77 96 00 00 00 A4 1A 95 00 09 00' + '00 00 00 00 00 00 96 00 00 00 96 00 00 00 09 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 B0 6C 38 00 96 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 03 0A 0C 02 00 00 00 00 00 00 00 00 00 00' + '00 0E 6B 68 4B 64 00 82 82 82 82 82 82 82 82 82' + '11 77 53 45 49 73 82 10 26 17 27 25 22 21 23 08' + '4C 52 50 4E 67 71 82 7F 79 16 29 39 33 38 28 09' + '81 63 55 2B 2A 66 82 81 30 18 19 14 14 13 1B 1C' + '80 72 6A 82 07 79 82 81 74 6D 61 60 60 60 6F 1E' + '7E 6E 65 46 56 4F 82 7D 24 38 3D 3B 3D 3C 41 1D' + '5F 74 6C 47 48 51 82 3D 32 32 37 3A 3B 3B 38 58' + '1A 81 4A 44 4D 54 82 20 37 38 35 35 36 37 37 38' + '2E 1F 62 69 78 34 00 0D 43 35 35 35 36 37 37 38' + '36 0B 00 00 00 00 00 06 61 40 3E 3F 3F 3E 3E 42' + '57 12 00 00 00 00 00 01 70 5E 5C 5B 5A 5A 59 60' + '75 05 00 00 00 00 00 82 5D 31 7A 76 74 75 7B 32' + '7C 04 00 00 00 00 00 82 0F 2C 2F 2D 2D 2D 2D 2C' + '1E 82 00 00 00 00 00 00 82 82 82 82 82 82 82 82' + '82 00 00 00 00 00 FF F0 00 00 FF E0 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 0F' + '00 00 80 0F 00 00 80 0F 00 00 80 0F 00 00 80 0F' + '00 00 C0 1F 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 0C 00 00 00 30 00 00 00 48 00 00 00 90 00 00' + '00 90 00 00 00 90 00 00 00 78 00 00 00 30 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3C 86 86' + '86 FF 7A 7A 7A FF AA AA AA FF DA DA DA FF F2 F2' + 'F2 FF CE CE CE FF AA AA AA FF 6E 6E 6E FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 0C 7A 7A 7A FF 80 80' + '80 FF FF FF FF FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 D4 FF FF D4 D4 FF C0 C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00' + '00 13 00 00 00 78 6E 6E 6E FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF F2 F2 F2 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 56 62 62 62 FF E6 E6 E6 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 00 00 00 00 05 00 00 00 69 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 62 62 62 FF 56 56' + '56 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 00 00 00 00 9B 00 00 00 FF 21 21 21 FF 2C 2C' + '2C FF 2C 2C 2C FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 4A 4A 4A FF 62 62' + '62 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 D4 FF FF D4 D4 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 03 01 01 01 FF 8A 8A 8A FF EB EB EB FF E8 E8' + 'E8 FF E8 E8 E8 FF D4 D4 D4 FF 00 C0 00 FF E7 E7' + 'E7 FF E8 E8 E8 FF E3 E3 E3 FF D8 D8 D8 FF D2 D2' + 'D2 FF CD CD CD FF CD CD CD FF CD CD CD FF C8 C9' + 'C9 FF AA AA AA FF 2E 2E 2E FF 62 62 62 FF DA DA' + 'DA FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 FF FF FF D4 FF FF FF D4' + 'FF FF FF D4 F0 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 15 19 19 19 FF AD A8 AB FF EB EB EB FF E8 E8' + 'E8 FF E8 E8 E8 FF 00 FF 00 FF 00 FF 00 FF 00 C0' + '00 FF DF DF DF FF D5 D5 D5 FF D2 D2 D2 FF CB CB' + 'CB FF CD CD CD FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF 40 40 40 FF 2E 2E 2E FF 7A 7A 7A FF F2 F2' + 'F2 FF FF D4 E3 FF F2 F2 F2 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 FF FF FF D4 E3 FF FF D4' + 'E3 FF FF D4 FF FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 34 28 28 28 FF D1 D1 D1 FF EB EB EB FF EB EB' + 'EB FF E8 E8 E8 FF E8 E8 E8 FF 00 FF 00 FF B5 B5' + 'B5 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6' + 'B6 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6' + 'B6 FF B6 B6 B6 FF B6 B6 B6 FF A4 A0 A0 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 F0 FF B6 B6 B6 FF AA AA AA FF 62 62' + '62 FF FF D4 E3 FF FF D4 F0 FF F2 F2 F2 FF 00 00' + '00 33 28 28 28 FF D1 D1 D1 FF E8 E8 E8 FF EB EB' + 'EB FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF B6 B6 B6 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 E3 FF 6E 6E 6E FF 00 00 00 00 00 00' + '00 00 B6 B6 B6 FF FF D4 F0 FF F2 F2 F2 FF 00 00' + '00 33 27 27 27 FF D2 D2 D2 FF EA EA EA FF EB EB' + 'EB FF A7 A7 A7 FF A7 A7 A7 FF AB AB AB FF AE AE' + 'AE FF AF AF AF FF AF AF AF FF AF AF AF FF AF AF' + 'AF FF AB AB AB FF AB AB AB FF AB AB AB FF AB AB' + 'AB FF AB AB AB FF AB AB AB FF CE CE CE FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF FF D4' + 'E3 FF FF D4 E3 FF 80 80 80 FF 00 00 00 78 00 00' + '00 00 FF D4 F0 FF FF D4 F0 FF F2 F2 F2 FF 00 00' + '00 33 26 26 26 FF D3 D3 D3 FF E8 E8 E8 FF E6 E6' + 'E6 FF E2 E2 E2 FF DB DB DB FF D8 D8 D8 FF D9 D9' + 'D9 FF D2 D2 D2 FF CF CF CF FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF CE CE CE FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 F0 FF C0 C0 C0 FF 62 62 62 FF 80 80' + '80 FF FF D4 F0 FF FF D4 F0 FF FF D4 E3 FF 00 00' + '00 33 24 24 24 FF D6 D6 D6 FF E9 E9 E9 FF E1 E1' + 'E1 FF E2 E2 E2 FF E0 E0 E0 FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF 92 92 92 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF FF D4 FF FF FF D4 FF FF FF D4' + 'FF FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 34 24 24 24 FF DE DE DE FF D9 D9 D9 FF C4 C4' + 'C4 FF BF BF BF FF D8 D8 D8 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF 7A 7A 7A FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF FF D4 E3 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 07 05 05 05 FF C2 C2 C2 FF BC BC BC FF B2 B2' + 'B2 FF AB AB AB FF BB BB BB FF D5 D5 D5 FF D5 D5' + 'D5 FF D4 D4 D4 FF D3 D3 D3 FF D5 D5 D5 FF D7 D7' + 'D7 FF D8 D8 D8 FF D7 D7 D7 FF D3 D3 D3 FF D3 D3' + 'D3 FF D4 D4 D4 FF D5 D5 D5 FF 62 62 62 FF 86 86' + '86 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 00 00 00 00 FF A4 A4 A4 FF CF CF CF FF C5 C5' + 'C5 FF BF BF BF FF C9 C9 C9 FF D2 D2 D2 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D0 D0' + 'D0 FF D4 D4 D4 FF D0 D0 D0 FF D3 D3 D3 FF 62 62' + '62 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 00 00 00 00 FF 59 59 59 FF D0 D0 D0 FF CD CD' + 'CD FF CD CD CD FF CA CA CA FF D3 D3 D3 FF D3 D3' + 'D3 FF D4 D4 D4 FF D5 D5 D5 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D5 D5' + 'D5 FF DB DB DB FF E4 E4 E4 FF D3 D3 D3 FF D3 D3' + 'D3 FF 92 92 92 FF F2 F2 F2 FF F2 F2 F2 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 00 00 00 00 FE 40 40 40 FF D2 D2 D2 FF CA CA' + 'CA FF CA CA CA FF D4 D4 D4 FF D3 D3 D3 FF D3 D3' + 'D3 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D3 D3 D3 FF D2 D2 D2 FF D3 D3 D3 FF D2 D2' + 'D2 FF D1 D1 D1 FF D0 D0 D0 FF D3 D3 D3 FF D3 D3' + 'D3 FF 6E 6E 6E FF 92 92 92 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 00 00 00 00 E1 07 07 07 FF DD DD DD FF CC CC' + 'CC FF D3 D3 D3 FF D3 D3 D3 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF C4 C4 C4 FF B3 B3 B3 FF 62 62 62 FF 9E 9E' + '9E FF FF D4 D4 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF CE CE CE FF 9E 9E 9E FF 92 92 92 FF 00 00' + '00 00 00 00 00 B2 00 00 00 FF DD DD DD FF CF CF' + 'CF FF D3 D3 D3 FF D3 D3 D3 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF' + 'CF FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF B3 B3 B3 FF B3 B3 B3 FF 00 00 00 FF 00 00' + '00 FF 62 62 62 FF 86 86 86 FF 86 86 86 FF 86 86' + '86 FF 6E 6E 6E FF 00 00 00 24 00 00 00 00 00 00' + '00 00 00 00 00 4B 00 00 00 FE D8 D8 D8 FF D4 D4' + 'D4 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF B3 B3 B3 FF B3 B3 B3 FF 00 00 00 CF 00 00' + '00 CF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1A 00 00 00 F2 CC CC CC FF D6 D6' + 'D6 FF D3 D3 D3 FF D3 D3 D3 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF C4 C4' + 'C4 FF BD BD BD FF D0 D0 D0 FF 09 09 09 FF 00 00' + '00 CF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 02 00 00 00 BF 97 97 97 FF DC DC' + 'DC FF DC DC DC FF DE DE DE FF DE DE DE FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF E7 E7 E7 FF E7 E7' + 'E7 FF DC DC DC FF C6 C6 C6 FF 00 00 00 FF 00 00' + '00 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 A4 77 77 77 FF D3 D3' + 'D3 FF E1 E1 E1 FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E1 E1 E1 FF E1 E1 E1 FF E7 E7 E7 FF E7 E7' + 'E7 FF D9 D9 D9 FF BB BB BB FF 00 00 00 FF 00 00' + '00 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 62 35 35 35 FF BD BD' + 'BD FF E6 E6 E6 FF E6 E6 E6 FF E7 E7 E7 FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E6 E6' + 'E6 FF D4 D4 D4 FF 9A 9A 9A FF 00 00 00 ED 00 00' + '00 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 2D 1E 1E 1E FF AB AB' + 'AB FF ED ED ED FF E7 E7 E7 FF EC EC EC FF EB EB' + 'EB FF ED ED ED FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EC EC EC FF E5 E5 E5 FF EB EB' + 'EB FF D6 D6 D6 FF 8A 8A 8A FF 00 00 00 C3 00 00' + '00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 FF 8D 8D' + '8D FF C4 C4 C4 FF B2 B2 B2 FF B2 B2 B2 FF EB EB' + 'EB FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F3 F3 F3 FF D5 D5 D5 FF B6 B6 B6 FF B7 B7' + 'B7 FF CD CD CD FF 61 61 61 FF 00 00 00 85 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 FF 64 64' + '64 FF DD DD DD FF DC DC DC FF E4 E4 E4 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF FA FA FA FF F2 F2 F2 FF D8 D8 D8 FF DC DC' + 'DC FF B0 B0 B0 FF 34 34 34 FF 00 00 00 67 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 9C 00 00' + '00 FF 3D 3D 3D FF 49 49 49 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 49 49 49 FF 49 49' + '49 FF 02 02 02 FF 00 00 00 FF 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00' + '00 7F 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 D6 00 00 00 5C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF 00 FF FF FE 00 FF FF FC 00 FF FF E0 00 FF FF' + 'F0 00 80 00 00 00 80 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 18 00 00 00 08 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 80 00 00 00 80 00 00 00 80 00 00 00 80 00' + '00 01 80 00 00 7F 80 00 00 7F 80 00 00 7F C0 00' + '00 7F C0 00 00 7F C0 00 00 7F E0 00 00 7F E0 00' + '00 FF E0 00 01 FF E0 00 01 FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' + '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 08 FF FF 00 00 00 00 00 8F FF FF 08 88' + '88 88 80 FF FF FF 0F FA F7 77 88 FF F7 FF 0F 88' + '88 88 88 FF F0 8F 0F FF FF FF F8 FF F8 FF 0F 77' + '77 77 78 FF FF FF 07 77 77 77 77 7F FF FF 07 77' + '77 77 77 8F FF FF 07 77 77 77 77 70 28 80 08 77' + '77 77 77 70 00 00 00 77 77 77 77 70 00 00 00 77' + '77 77 77 70 00 00 00 77 77 77 77 70 00 00 00 00' + '00 00 00 00 00 00 FF E0 00 00 FF C0 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01' + '00 00 00 07 00 00 80 07 00 00 80 07 00 00 80 0F' + '00 00 C0 1F 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 77 77 88 00 00' + '00 00 00 00 00 00 00 00 00 08 7F FF FF FF 00 00' + '00 00 00 00 00 00 00 00 00 8F FF FF FF FF 00 00' + '00 00 00 00 00 00 00 00 08 FF FF FF FF FF 00 00' + '00 00 00 00 00 00 00 00 87 FF FF FF FF FF 00 08' + '88 88 88 88 88 88 88 80 8F FF FF FF FF FF 00 87' + 'FF 7A FF FF 77 77 77 88 FF FF FF FF FF FF 00 7F' + 'FF AA AF 77 77 77 78 08 FF FF FF F7 FF FF 00 FF' + 'FF 8A 77 77 77 77 77 88 FF FF FF 78 8F FF 00 FF' + 'F8 88 88 88 88 88 88 88 FF FF FF 00 08 FF 00 FF' + 'F7 88 88 88 88 88 88 88 FF FF FF 00 07 FF 00 FF' + 'FF FF FF FF FF FF FF 78 FF FF FF 78 7F FF 00 FF' + 'FF FF FF FF FF FF FF 78 FF FF FF FF FF FF 00 FF' + '77 77 77 77 77 77 77 78 FF FF FF FF FF FF 00 F7' + '77 77 77 77 77 77 77 78 7F FF FF FF FF FF 00 77' + '77 77 77 77 77 77 77 77 87 FF FF FF FF FF 00 87' + '77 77 77 77 77 77 77 77 88 FF FF FF FF FF 00 87' + '77 77 77 77 77 77 77 77 78 8F FF FF FF FF 00 07' + '77 77 77 77 77 77 77 77 77 88 7F FF FF 78 00 07' + '77 77 77 77 77 77 77 77 77 70 02 88 88 70 00 07' + '77 77 77 77 77 77 77 77 77 70 00 00 00 00 00 08' + '77 77 77 77 77 77 77 77 77 70 00 00 00 00 00 08' + '77 77 77 77 77 77 77 77 77 70 00 00 00 00 00 00' + '77 77 77 77 77 77 77 77 77 80 00 00 00 00 00 00' + '77 77 77 77 77 77 77 77 77 80 00 00 00 00 00 00' + '77 77 77 77 77 77 77 77 77 80 00 00 00 00 00 00' + '77 77 77 77 77 77 77 77 77 00 00 00 00 00 00 00' + '87 77 77 77 77 77 77 77 77 00 00 00 00 00 00 00' + '08 88 88 88 88 88 88 88 80 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF 00 FF FF FE 00 FF FF FC 00 FF FF F8 00 FF FF' + 'F0 00 C0 00 00 00 80 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 18 00 00 00 08 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 80 00 00 00 80 00 00 00 80 00 00 00 80 00' + '00 01 80 00 00 7F 80 00 00 7F 80 00 00 7F C0 00' + '00 7F C0 00 00 7F C0 00 00 7F C0 00 00 7F E0 00' + '00 FF E0 00 00 FF F0 00 03 FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 20 00 00 00' + '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 78 6E 6E 6E FF 62 62' + '62 FF 00 00 00 9C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 62 62 62 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'D4 FF FF D4 D4 FF 00 00 00 00 00 00 00 16 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 42 62 62' + '62 FF FF D4 F0 FF FF D4 F0 FF FF D4 D4 FF FF D4' + 'D4 FF F2 F2 F2 FF 00 00 00 54 90 90 90 FF AB AC' + 'AC FF CC CC CC FF C4 C4 C4 FF C2 C2 C2 FF C1 C1' + 'C1 FF BC BC BC FF BD BD BD FF 6E 6E 6E FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 D4 FF FF D4' + 'E3 FF F2 F2 F2 FF 00 00 00 FA EA EA EA FF E8 E8' + 'E8 FF 00 FF 00 FF CB CB CB FF C8 C8 C8 FF C8 C8' + 'C8 FF C8 C8 C8 FF C8 C8 C8 FF 56 56 56 FF F2 F2' + 'F2 FF F2 F2 F2 FF FF D4 F0 FF B6 B6 B6 FF FF B1' + 'C7 FF FF D4 E3 FF 00 00 00 F9 EF EF EF FF EB EB' + 'EB FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 62 62 62 FF F2 F2' + 'F2 FF F2 F2 F2 FF FF D4 F0 FF 00 00 00 78 62 62' + '62 FF F2 F2 F2 FF 00 00 00 F9 F7 F7 F7 FF F6 F6' + 'F6 FF F5 F5 F5 FF F3 F3 F3 FF F2 F2 F2 FF F1 F1' + 'F1 FF F0 F0 F0 FF EF EF EF FF 62 62 62 FF F2 F2' + 'F2 FF F2 F2 F2 FF FF D4 E3 FF FF D4 E3 FF FF D4' + 'FF FF FF D4 F0 FF 00 00 00 F7 F3 F3 F3 FF B7 B7' + 'B7 FF DA DA DA FF D8 D8 D8 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D8 D8 D8 FF D3 D3 D3 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 F0 FF 00 00 00 73 EF EF EF FF CB CB' + 'CB FF CE CE CE FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D3 D3 D3 FF 7A 7A' + '7A FF F2 F2 F2 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'F0 FF FF D4 F0 FF 00 00 00 25 B7 B7 B7 FF CB CB' + 'CB FF D3 D3 D3 FF D0 D0 D0 FF D0 D0 D0 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF C4 C4' + 'C4 FF 80 80 80 FF FF D4 D4 FF FF D4 F0 FF FF D4' + 'F0 FF E6 E6 E6 FF 00 00 00 00 5F 5F 5F FF D2 D2' + 'D2 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF 99 99 99 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 18 18 18 FF DB DB' + 'DB FF DE DE DE FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DD DD DD FF DD DD DD FF DD DD DD FF D9 D9' + 'D9 FF 7A 7A 7A FF 00 00 00 0A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 FF E5 E5' + 'E5 FF EB EB EB FF EB EB EB FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E5 E5 E5 FF E7 E7 E7 FF E6 E6' + 'E6 FF 20 20 20 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 DD E4 E4' + 'E4 FF C1 C1 C1 FF ED ED ED FF EE EE EE FF EB EB' + 'EB FF ED ED ED FF ED ED ED FF C2 C2 C2 FF EC EC' + 'EC FF 00 00 00 FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 44 80 80' + '80 FF D7 D7 D7 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D9 D9 D9 FF B0 B0' + 'B0 FF 00 00 00 ED 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 2C 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF F0 00 00 FF E0 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 0F' + '00 00 80 07 00 00 80 0F 00 00 80 0F 00 00 80 0F' + '00 00 C0 1F 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 04 00 00 00 00 00 80 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 08 88 88 80 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '88 87 77 F7 77 88 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 08 87 FF FF FF FF F7 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87' + 'FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 08 FF FF FF FF FF FF FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 08 8F FF' + 'FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 88 7F FF FF FF FF FF FF FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 08 88 FF FF' + 'FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 08 8F FF FF FF FF FF FF FF FF 00 00' + '87 77 77 77 77 77 77 77 77 77 77 77 88 8F FF FF' + 'FF FF FF FF FF FF 00 08 7F FF F7 AA FF FF 77 77' + '77 77 77 70 88 7F FF FF FF FF FF FF FF FF 00 07' + 'FF FF FA AA AF 77 77 77 77 77 77 00 88 FF FF FF' + 'FF FF FF FF FF FF 00 07 FF FF FA AA A7 77 77 77' + '77 77 77 80 88 FF FF FF FF FF 78 87 FF FF 00 07' + 'FF FF FF AA 77 77 77 77 77 77 77 77 87 FF FF FF' + 'FF F7 87 88 FF FF 00 07 FF FF 88 88 88 88 88 88' + '88 88 88 88 87 FF FF FF FF F8 00 08 7F FF 00 07' + 'FF FF 88 88 88 88 88 88 88 88 88 88 87 FF FF FF' + 'FF F8 00 08 7F FF 00 07 FF FF 77 77 77 77 77 77' + '77 77 77 77 87 FF FF FF FF F8 00 08 FF FF 00 07' + 'FF FF F7 77 77 77 77 77 77 77 77 77 87 FF FF FF' + 'FF F7 88 8F FF FF 00 07 FF FF FF FF FF FF FF FF' + 'FF FF FF FF 87 FF FF FF FF FF FF FF FF FF 00 07' + 'FF FF FF 77 77 7F FF FF FF FF FF FF 88 FF FF FF' + 'FF FF FF FF FF FF 00 07 77 77 77 77 77 77 77 77' + '77 77 77 77 88 FF FF FF FF FF FF FF FF FF 00 07' + '77 77 77 77 77 77 77 77 77 77 77 77 78 7F FF FF' + 'FF FF FF FF FF FF 00 07 77 77 77 77 77 77 77 77' + '77 77 77 77 78 8F FF FF FF FF FF FF FF FF 00 07' + '77 77 77 77 77 77 77 77 77 77 77 77 77 87 FF FF' + 'FF FF FF FF FF FF 00 08 77 77 77 77 77 77 77 77' + '77 77 77 77 77 88 7F FF FF FF FF FF FF FF 00 08' + '77 77 77 77 77 77 77 77 77 77 77 77 77 78 8F FF' + 'FF FF FF FF FF FF 00 00 77 77 77 77 77 77 77 77' + '77 77 77 77 77 77 88 FF FF FF FF FF FF FF 00 00' + '77 77 77 77 77 77 77 77 77 77 77 77 77 77 78 87' + 'FF FF FF FF FF F8 00 00 87 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 88 87 FF FF FF 78 88 00 00' + '87 77 77 77 77 77 77 77 77 77 77 77 77 77 77 80' + '08 88 88 88 80 00 00 00 87 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 80 00 00 00 00 00 00 00 00' + '87 77 77 77 77 77 77 77 77 77 77 77 77 77 77 80' + '00 00 00 00 00 00 00 00 07 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 80 00 00 00 00 00 00 00 00' + '07 77 77 77 77 77 77 77 77 77 77 77 77 77 77 80' + '00 00 00 00 00 00 00 00 08 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 80 00 00 00 00 00 00 00 00' + '08 77 77 77 77 77 77 77 77 77 77 77 77 77 77 00' + '00 00 00 00 00 00 00 00 08 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 00 00 00 00 00 00 00 00 00' + '00 77 77 77 77 77 77 77 77 77 77 77 77 77 78 00' + '00 00 00 00 00 00 00 00 00 77 77 77 77 77 77 77' + '77 77 77 77 77 77 78 00 00 00 00 00 00 00 00 00' + '00 87 77 77 77 77 77 77 77 77 77 77 77 77 78 00' + '00 00 00 00 00 00 00 00 00 87 77 77 77 77 77 77' + '77 77 77 77 77 77 78 00 00 00 00 00 00 00 00 00' + '00 87 77 77 77 77 77 77 77 77 77 77 77 77 70 00' + '00 00 00 00 00 00 00 00 00 08 77 77 77 77 77 77' + '77 77 77 77 77 77 80 00 00 00 00 00 00 00 00 00' + '00 00 08 88 88 88 88 88 88 88 88 88 88 80 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF F0 00 00 00 FF FF FF FF E0 00 00 00 FF FF' + 'FF FF C0 00 00 00 FF FF FF FF 80 00 00 00 FF FF' + 'FF FE 00 00 00 00 FF FF FF FE 00 00 00 00 FF FF' + 'FF FC 00 00 00 00 F0 00 00 00 00 00 00 00 C0 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 E0 00 00 00 00' + '00 00 00 60 00 00 00 00 00 00 00 20 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 C0 00' + '00 00 00 07 00 00 C0 00 00 00 07 FF 00 00 C0 00' + '00 00 07 FF 00 00 C0 00 00 00 07 FF 00 00 C0 00' + '00 00 07 FF 00 00 C0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 F0 00 00 00 07 FF 00 00 F0 00' + '00 00 0F FF 00 00 F0 00 00 00 0F FF 00 00 F0 00' + '00 00 1F FF 00 00 F8 00 00 00 3F FF 00 00 FE 00' + '00 00 7F FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 08 00 00 00' + '00 00 00 09 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 01 01 01 00 02 02' + '02 00 05 05 05 00 06 06 06 00 07 07 07 00 08 08' + '08 00 09 09 09 00 0B 0B 0B 00 0C 0C 0C 00 18 18' + '18 00 19 19 19 00 1E 1E 1E 00 1F 1F 1F 00 20 20' + '20 00 21 21 21 00 22 22 22 00 24 24 24 00 26 26' + '26 00 27 27 27 00 28 28 28 00 29 29 29 00 2A 2A' + '2A 00 2B 2B 2B 00 2C 2C 2C 00 2E 2E 2E 00 2F 2F' + '2F 00 34 34 34 00 35 35 35 00 39 39 39 00 3D 3D' + '3D 00 40 40 40 00 41 41 41 00 48 48 48 00 49 49' + '49 00 4A 4A 4A 00 4B 4B 4B 00 53 53 53 00 56 56' + '56 00 59 59 59 00 5D 5D 5D 00 5F 5F 5F 00 61 61' + '61 00 62 62 62 00 64 64 64 00 6E 6E 6E 00 75 75' + '75 00 77 77 77 00 7A 7A 7A 00 7E 7E 7E 00 7F 7F' + '7F 00 00 C0 00 00 00 FF 00 00 80 80 80 00 83 83' + '83 00 86 86 86 00 8A 8A 8A 00 8D 8D 8D 00 90 90' + '90 00 92 92 92 00 93 93 93 00 97 97 97 00 99 99' + '99 00 9A 9A 9A 00 9E 9E 9E 00 9F 9F 9F 00 A4 A0' + 'A0 00 A4 A4 A4 00 A7 A7 A7 00 A8 A8 A8 00 A9 A9' + 'A9 00 AA AA AA 00 AB AB AB 00 AD A8 AB 00 AB AC' + 'AC 00 AD AD AD 00 AE AE AE 00 AF AF AF 00 B0 B0' + 'B0 00 B2 B2 B2 00 B3 B3 B3 00 B5 B5 B5 00 B6 B6' + 'B6 00 B7 B7 B7 00 B8 B4 B6 00 B8 B8 B8 00 BA BA' + 'BA 00 BB BB BB 00 BC BC BC 00 BD BD BD 00 BE BE' + 'BE 00 BF BF BF 00 FF B1 C7 00 C0 C0 C0 00 C1 C1' + 'C1 00 C2 C2 C2 00 C3 C3 C3 00 C4 C4 C4 00 C5 C5' + 'C5 00 C6 C6 C6 00 C8 C8 C8 00 C8 C9 C9 00 C9 C9' + 'C9 00 CA CA CA 00 CB CB CB 00 CC CC CC 00 CD CD' + 'CD 00 CE CE CE 00 CF CF CF 00 D0 D0 D0 00 D1 D1' + 'D1 00 D2 D2 D2 00 D3 D3 D3 00 D4 D4 D4 00 D5 D5' + 'D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8 D8 00 D9 D9' + 'D9 00 DA DA DA 00 DB DB DB 00 DC DC DC 00 DD DD' + 'DD 00 DE DE DE 00 DF DF DF 00 FF D4 D4 00 FF D4' + 'E3 00 FF D4 F0 00 FF D4 FF 00 E0 E0 E0 00 E1 E1' + 'E1 00 E2 E2 E2 00 E3 E3 E3 00 E4 E4 E4 00 E5 E5' + 'E5 00 E6 E6 E6 00 E7 E7 E7 00 E8 E8 E8 00 E9 E9' + 'E9 00 EA EA EA 00 EB EB EB 00 EC EC EC 00 ED ED' + 'ED 00 EE EE EE 00 EF EF EF 00 F0 F0 F0 00 F1 F1' + 'F1 00 F2 F2 F2 00 F3 F3 F3 00 F4 F4 F4 00 F5 F5' + 'F5 00 F6 F6 F6 00 F7 F7 F7 00 F8 F8 F8 00 F9 F9' + 'F9 00 FA FA FA 00 FF FF FF 00 00 00 00 00 78 EE' + '0C 01 78 EE 0C 01 40 00 00 00 40 00 00 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 70 EE 0C 01 00 24 0D 01 01 01' + 'F5 77 78 01 38 00 78 EE 0C 01 E0 19 0D 01 E8 19' + '0D 01 78 01 38 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 BE B3 E7 77 70 EE 0C 01 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 08 04 00 00 E4 00 00 00 08 04 00 00 08 01' + '00 00 00 00 00 00 00 00 00 00 00 00 01 01 00 00' + '38 00 BC 18 95 00 C0 18 95 00 B0 19 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 81 E9' + '49 00 00 00 38 00 00 00 00 00 78 EE 0C 01 78 EE' + '0C 01 A4 1A 95 00 40 00 00 00 40 00 00 00 B8 10' + 'E9 77 FF FF FF FF C9 F1 E7 77 16 EA 4B 00 F8 00' + '00 00 B4 1A 95 00 DC E3 49 00 E0 A3 4E 00 FF FF' + 'FF FF 10 00 00 00 10 DA 4B 00 78 EE 0C 01 71 CC' + '43 00 78 EE 0C 01 50 7E 0D 01 A4 1A 95 00 F8 A2' + 'AF 00 C4 F5 AF 00 04 00 00 00 50 7E 0D 01 0F 02' + '00 00 B8 EE 0C 01 10 00 00 00 00 00 00 00 20 00' + '00 00 78 EE 0C 01 40 00 00 00 10 00 00 00 00 01' + '00 00 00 04 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 10 00 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 9D 9D 9D 9D 9D 9D' + '9D 9D 9D 9D 9D 9D 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 9D 9D 9D 9D 35 2D 2B' + '2B 2B 35 9D 9D 9D 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 9D 9D 37 2D 30 47 6B 77' + '93 77 6B 47 35 2D 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 9D 9D 30 35 6B 9C 7F 7F 7F' + '7F 7D 7D 7D 7D 5D 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 9D 9D 9D 2B 5D 7F 7F 7F 7F 7F 7F' + '7D 7D 7D 7D 7D 93 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 9D 9D 9D 2D 87 7F 7F 7F 7F 7F 7F 7D' + '7D 7D 7D 7D 93 93 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 9D 26 2B 87 7F 7F 7F 7F 7F 7F 7D 7D' + '7D 7D 7D 93 93 93 00 00 00 00 9D 9D 9D 9D 9D 9D' + '9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D' + '9D 9D 9D 9D 23 2B 5F 7F 7F 7F 7F 7F 7F 7D 7D 7D' + '7D 7D 93 93 93 93 00 00 9D 9D 9D 9D 9D 9D 9D 9D' + '9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D' + '9D 9D 9D 2B 26 3B 7F 7F 7F 7F 7F 7F 7F 7D 7D 7D' + '7D 93 93 93 93 93 00 9D 9D 9D 9D 0F 18 17 18 17' + '17 17 17 17 17 17 17 17 17 17 16 16 16 16 16 16' + '16 16 16 23 2B 93 7F 7F 7F 7F 7F 7F 7F 7D 7D 7D' + '93 93 93 93 93 93 00 9D 9D 12 3A 54 4B 4A 49 6A' + '69 68 66 61 60 5F 5F 60 5D 5E 5B 5B 58 59 56 59' + '59 59 2D 26 40 7F 7F 7F 7F 7F 7F 7F 7F 7D 7D 7F' + '7E 7E 93 93 93 93 9D 9D 01 38 49 8C 89 89 89 71' + '33 33 88 89 89 84 7A 75 6F 6A 6A 6A 6A 6A 65 6A' + '47 19 26 2B 77 7F 7F 7F 7F 7F 7F 7F 7F 80 80 80' + '80 80 7F 93 93 93 9D 9D 0B 49 8C 8C 89 89 89 34' + '34 34 33 82 7C 72 69 6F 68 6A 6A 6A 6A 6A 6A 6A' + '1F 19 26 30 93 93 7E 93 7F 7F 7F 7F 7F 80 7F 7E' + '7E 80 80 93 93 93 9D 9D 15 49 8B 8C 8C 89 89 34' + '34 34 34 68 64 64 64 64 64 64 64 64 64 64 64 64' + '3C 1F 26 3B 93 93 93 93 93 7E 7F 7F 7F 7F 52 35' + '3B 5C 7F 7F 7E 93 9D 9D 14 6E 8D 8C 8C 89 89 89' + '34 34 51 51 52 52 52 52 52 52 52 52 52 52 52 52' + '52 52 26 42 93 93 93 93 93 93 93 7F 7F 52 2D 47' + '2B 30 7E 7F 93 93 9D 9D 14 6E 8F 89 8C 89 35 35' + '35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35' + '35 35 2B 52 93 93 93 93 93 93 93 7F 7E 2D 00 00' + '00 2B 52 7F 93 93 9D 9D 13 6E 90 8C 8C 8C 35 35' + '35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35' + '35 35 2B 52 93 93 93 93 93 93 93 7F 7D 2B 9D 00' + '00 2B 52 7F 93 93 9D 9D 13 6F 93 8B 8C 8C 44 44' + '44 48 4C 4E 4D 4D 4D 4D 4D 4D 48 48 48 48 48 48' + '48 48 2B 6B 93 93 93 93 93 93 7E 7F 7E 35 9D 9D' + '00 30 7F 7F 7E 93 9D 9D 12 70 8A 89 87 85 83 78' + '79 75 76 6F 6F 6C 6D 6D 6D 6D 6D 6D 6D 6D 6D 6D' + '6D 6D 2B 6B 93 93 93 93 93 93 93 7F 7F 5D 30 2B' + '35 87 7F 7F 93 7E 9D 9D 12 70 98 99 97 97 97 96' + '96 95 95 94 94 94 93 93 92 92 92 91 91 91 90 90' + '8F 8F 2B 47 93 93 93 93 93 93 93 7E 7F 7F 7E 7D' + '7E 80 80 7F 7F 7F 9D 9D 11 73 9C 8A 82 83 83 81' + '7C 7C 7C 7C 7C 81 81 81 81 81 81 81 81 81 81 81' + '81 81 2B 3B 93 93 93 93 93 93 93 93 93 80 80 80' + '80 80 7F 7F 7F 7F 9D 9D 11 7B 99 76 61 57 5B 75' + '77 76 76 76 76 76 76 76 76 76 76 76 76 76 76 76' + '76 76 2D 30 93 93 93 93 93 93 93 93 93 7E 7D 7D' + '7D 7D 7F 7F 7F 7F 9D 9D 0D 77 94 63 46 53 4E 60' + '77 75 75 75 75 75 74 74 74 74 74 74 74 74 75 75' + '75 75 70 2B 5D 93 93 93 93 93 93 93 93 93 7D 7D' + '7D 7D 7F 7F 7F 7F 9D 9D 03 5F 97 58 4F 60 48 57' + '75 72 72 72 71 70 70 72 74 75 75 74 72 70 70 70' + '71 72 70 2B 37 93 93 93 93 93 93 93 93 7D 7D 7D' + '7D 7D 7F 7F 7F 7F 00 9D 9D 43 95 6C 62 6F 5B 66' + '70 6F 6D 70 6D 6D 72 72 72 72 72 72 72 72 6D 6D' + '71 6D 70 70 2B 52 93 93 93 93 93 93 7D 7D 7D 7D' + '7D 7D 7F 7F 7F 7F 00 9D 9D 31 90 6E 6C 68 6C 6E' + '6B 6C 72 72 72 72 72 72 72 72 72 72 72 72 72 72' + '72 82 70 70 30 30 5C 93 93 93 93 7D 7D 7D 7D 7D' + '7D 7F 7F 7F 7F 7F 00 9D 9D 27 8A 6D 6A 6A 6A 67' + '70 70 70 70 71 72 73 73 73 73 73 73 73 73 72 72' + '78 85 70 70 70 2D 3B 93 93 93 7D 7D 7D 7D 7D 7D' + '7F 7F 7F 7F 7F 7F 00 9D 9D 1F 74 6F 67 68 67 71' + '70 70 70 6E 6F 6F 6F 6F 6F 6F 70 6F 70 70 6F 6F' + '6E 6D 70 70 70 61 2D 3B 93 7D 7D 7D 7D 7D 7D 7F' + '7F 7F 7F 7F 7F 7F 00 9D 9D 10 53 78 67 68 6B 70' + '70 6C 6E 6D 6D 6D 6D 6C 70 70 6B 70 70 70 70 70' + '70 6B 70 70 70 61 61 2D 35 6B 7D 7D 7D 7D 7F 7F' + '7F 7F 7F 7F 87 3B 00 9D 9D 05 41 7A 69 6A 70 70' + '70 6D 6D 6D 6D 6D 6D 70 70 70 70 70 70 70 70 70' + '70 70 70 70 70 61 61 50 3E 2B 40 5D 7D 7F 7F 7F' + '7F 9C 6B 40 2B 3B 00 00 9D 9D 36 7A 6C 6E 70 70' + '6D 6D 6D 6D 6D 6D 6D 6D 6C 70 70 70 70 70 70 70' + '70 70 70 70 70 70 50 50 3E 9D 9D 30 2B 37 37 37' + '37 2B 2D 00 00 00 00 00 9D 9D 29 79 6E 6F 70 70' + '6E 6E 6E 6E 6E 6E 6E 6E 6E 70 70 70 70 70 70 70' + '70 70 70 70 70 70 50 50 3E 9D 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 9D 9D 20 75 71 6F 70 70' + '70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70' + '70 70 70 70 70 70 50 50 3E 9D 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 9D 9D 18 69 73 72 70 70' + '73 73 73 73 73 73 73 73 73 73 73 70 70 70 70 70' + '70 70 70 70 61 70 59 6D 3E 07 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 9D 9D 0A 4E 78 78 7B 7B' + '7B 76 77 77 77 77 77 77 77 77 77 77 7A 7A 7A 7A' + '7A 77 7A 7A 88 76 69 67 30 02 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 9D 9D 06 3D 79 7C 79 7B' + '7B 7B 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A' + '7A 7A 88 88 88 7A 79 63 25 9D 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 9D 9D 2F 70 83 82 7B' + '7B 7B 7B 7B 81 81 81 81 81 81 81 81 81 81 81 81' + '82 82 88 88 88 84 76 57 1D 9D 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 9D 9D 24 66 86 84 85' + '8C 8C 8C 8C 8C 8C 85 85 85 85 85 85 85 85 86 86' + '88 88 88 88 85 87 73 45 0E 9D 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 9D 9D 1C 59 87 87 87' + '88 88 8C 8C 8C 8C 8C 8C 8C 8C 8C 8C 8C 8C 8C 88' + '88 88 88 88 87 89 71 3F 08 9D 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 9D 9D 0C 48 85 8E 88' + '87 8D 8C 8B 8E 8C 8C 8C 8C 8C 8C 8C 8C 8C 8C 8C' + '8C 8D 8B 86 8C 8C 73 38 9D 9D 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 9D 9D 06 3E 85 7C 59' + '5E 73 8D 8E 8E 8F 8F 8E 8D 8C 8C 8D 8E 8F 8F 8E' + '8F 85 5F 5A 6E 8D 71 2E 9D 9D 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 9D 9D 39 81 61 4F' + '55 4F 8C 92 91 91 91 91 91 91 91 91 91 91 91 91' + '94 72 4E 52 53 8C 6A 2A 9D 9D 9D 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 9D 9D 2C 6B 7A 79' + '72 85 9A 9A 9A 9A 9A 9A 9A 9A 9A 9A 9A 9A 9A 9A' + '9B 93 7C 75 79 74 4E 1B 9D 9D 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 9D 9D 0B 35 5A 70' + '74 78 75 75 75 75 75 75 75 75 75 75 75 75 75 75' + '75 76 76 74 6A 4E 28 04 9D 9D 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 9D 9D 9D 09 1E 22' + '21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21' + '21 21 21 22 22 1A 02 9D 9D 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 9D 9D 9D 9D 9D' + '9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D' + '9D 9D 9D 9D 9D 9D 9D 9D 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 9D 9D 9D' + '9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D 9D' + '9D 9D 9D 9D 9D 9D 9D 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF F0 00 00 00 FF FF' + 'FF FF E0 00 00 00 FF FF FF FF C0 00 00 00 FF FF' + 'FF FF 80 00 00 00 FF FF FF FE 00 00 00 00 FF FF' + 'FF FC 00 00 00 00 FF FF FF FC 00 00 00 00 F0 00' + '00 00 00 00 00 00 C0 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 E0 00 00 00 00 00 00 00 60 00 00 00 00' + '00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 C0 00 00 00 00 07 00 00 C0 00' + '00 00 07 FF 00 00 C0 00 00 00 07 FF 00 00 C0 00' + '00 00 07 FF 00 00 C0 00 00 00 07 FF 00 00 C0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 F0 00' + '00 00 07 FF 00 00 F0 00 00 00 0F FF 00 00 F0 00' + '00 00 0F FF 00 00 F0 00 00 00 1F FF 00 00 F8 00' + '00 00 3F FF 00 00 FE 00 00 00 7F FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 00 24 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 0C 00 00 00 24 00 00 00 30 00 00 00 48 00 00' + '00 78 00 00 00 90 00 00 00 90 00 00 00 90 00 00' + '00 90 00 00 00 78 00 00 00 48 00 00 00 30 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00' + '00 3C 00 00 00 78 00 00 00 90 80 80 80 FF 6E 6E' + '6E FF 62 62 62 FF 62 62 62 FF 62 62 62 FF 80 80' + '80 FF 00 00 00 B4 00 00 00 9C 00 00 00 90 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 0C 00 00 00 3C 86 86' + '86 FF 6E 6E 6E FF 7A 7A 7A FF AA AA AA FF CE CE' + 'CE FF DA DA DA FF F2 F2 F2 FF DA DA DA FF CE CE' + 'CE FF AA AA AA FF 80 80 80 FF 6E 6E 6E FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0C 00 00 00 3C 7A 7A 7A FF 80 80' + '80 FF CE CE CE FF FF FF FF FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF C0 C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 24 00 00 00 48 62 62 62 FF C0 C0 C0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF F2 F2 F2 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00' + '00 78 6E 6E 6E FF E6 E6 E6 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 56 56 56 56 FF 62 62' + '62 FF E6 E6 E6 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 16 00 00 00 34 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 42 00 00 00 42 4A 4A 4A FF 62 62 62 FF C2 C2' + 'C2 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 69 00 00' + '00 C5 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 FF 62 62 62 FF 56 56 56 FF 92 92 92 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 00 00 00 00 05 00 00 00 9B 00 00 00 FF 00 00' + '00 FF 21 21 21 FF 2C 2C 2C FF 2B 2B 2B FF 2C 2C' + '2C FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A 2A FF 2A 2A' + '2A FF 4A 4A 4A FF 62 62 62 FF F2 F2 F2 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 00 00 00 00 54 00 00 00 FF 26 26 26 FF 90 90' + '90 FF B8 B4 B6 FF AD AD AD FF AB AC AC FF AD A8' + 'AB FF CD CD CD FF CC CC CC FF CB CB CB FF C9 C9' + 'C9 FF C4 C4 C4 FF C3 C3 C3 FF C2 C2 C2 FF C2 C2' + 'C2 FF C3 C3 C3 FF C0 C0 C0 FF C1 C1 C1 FF BF BF' + 'BF FF BF BF BF FF BC BC BC FF BD BD BD FF BA BA' + 'BA FF BD BD BD FF BD BD BD FF BD BD BD FF 6E 6E' + '6E FF 56 56 56 FF 9E 9E 9E FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 F0 FF FF D4 E3 FF FF D4 E3 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 03 00 00 00 AD 01 01 01 FF 8A 8A 8A FF AD A8' + 'AB FF EB EB EB FF E8 E8 E8 FF E8 E8 E8 FF E8 E8' + 'E8 FF D4 D4 D4 FF 00 C0 00 FF 00 C0 00 FF E7 E7' + 'E7 FF E8 E8 E8 FF E8 E8 E8 FF E3 E3 E3 FF DD DD' + 'DD FF D8 D8 D8 FF D2 D2 D2 FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF CD CD CD FF CD CD CD FF C8 C9' + 'C9 FF CD CD CD FF AA AA AA FF 2E 2E 2E FF 56 56' + '56 FF 62 62 62 FF DA DA DA FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 FF FF FF D4' + 'FF FF FF D4 FF FF FF D4 FF FF FF D4 FF FF FF D4' + 'F0 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 15 00 00 00 F0 19 19 19 FF AD A8 AB FF EB EB' + 'EB FF EB EB EB FF E8 E8 E8 FF E8 E8 E8 FF E8 E8' + 'E8 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 C0' + '00 FF E1 E1 E1 FF DF DF DF FF D5 D5 D5 FF CC CC' + 'CC FF D2 D2 D2 FF CB CB CB FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF CD CD CD FF 40 40 40 FF 2E 2E 2E FF 56 56' + '56 FF 7A 7A 7A FF F2 F2 F2 FF F2 F2 F2 FF FF D4' + 'E3 FF F2 F2 F2 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 FF FF FF D4' + 'F0 FF FF D4 E3 FF FF D4 E3 FF FF D4 FF FF FF D4' + 'FF FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 30 00 00 00 FA 29 29 29 FF AD A8 AB FF EA EA' + 'EA FF EB EB EB FF EB EB EB FF E8 E8 E8 FF E8 E8' + 'E8 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF' + '00 FF CB CB CB FF C8 C8 C8 FF C8 C8 C8 FF C8 C8' + 'C8 FF C8 C8 C8 FF C8 C8 C8 FF C8 C8 C8 FF C8 C8' + 'C8 FF C8 C8 C8 FF C8 C8 C8 FF C8 C8 C8 FF C8 C8' + 'C8 FF C8 C8 C8 FF 93 93 93 FF 40 40 40 FF 56 56' + '56 FF 92 92 92 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF FF D4 E3 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF B6 B6' + 'B6 FF 80 80 80 FF 92 92 92 FF FF B1 C7 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 E3 FF F2 F2 F2 FF 00 00' + '00 34 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EC EC' + 'EC FF EB EB EB FF EB EB EB FF E8 E8 E8 FF E8 E8' + 'E8 FF E8 E8 E8 FF 00 FF 00 FF 00 FF 00 FF B5 B5' + 'B5 FF B5 B5 B5 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6' + 'B6 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6' + 'B6 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6' + 'B6 FF B6 B6 B6 FF B6 B6 B6 FF B6 B6 B6 FF 56 56' + '56 FF A4 A0 A0 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 F0 FF FF D4 F0 FF B6 B6 B6 FF 6E 6E' + '6E FF AA AA AA FF 62 62 62 FF 7A 7A 7A FF FF D4' + 'E3 FF FF D4 F0 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 33 00 00 00 F9 28 28 28 FF D1 D1 D1 FF EE EE' + 'EE FF E8 E8 E8 FF EB EB EB FF E8 E8 E8 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 62 62' + '62 FF B6 B6 B6 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 F0 FF FF D4 E3 FF 6E 6E 6E FF 00 00' + '00 00 00 00 00 00 00 00 00 00 62 62 62 FF B6 B6' + 'B6 FF FF D4 F0 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 33 00 00 00 F9 27 27 27 FF D1 D1 D1 FF EF EF' + 'EF FF EB EB EB FF EB EB EB FF EB EB EB FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 62 62' + '62 FF B6 B6 B6 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 F0 FF FF D4 D4 FF 62 62 62 FF 00 00' + '00 78 00 00 00 00 00 00 00 00 62 62 62 FF B6 B6' + 'B6 FF FF D4 F0 FF F2 F2 F2 FF F2 F2 F2 FF 00 00' + '00 33 00 00 00 F9 27 27 27 FF D2 D2 D2 FF F2 F2' + 'F2 FF EA EA EA FF EB EB EB FF EB EB EB FF A7 A7' + 'A7 FF A7 A7 A7 FF A7 A7 A7 FF AB AB AB FF AE AE' + 'AE FF B0 B0 B0 FF AF AF AF FF AF AF AF FF AF AF' + 'AF FF AF AF AF FF AF AF AF FF AF AF AF FF AB AB' + 'AB FF AB AB AB FF AB AB AB FF AB AB AB FF AB AB' + 'AB FF AB AB AB FF AB AB AB FF AB AB AB FF 62 62' + '62 FF CE CE CE FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF FF D4' + 'E3 FF FF D4 F0 FF FF D4 E3 FF 80 80 80 FF 00 00' + '00 78 00 00 00 78 00 00 00 00 7A 7A 7A FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 E3 FF F2 F2 F2 FF 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF E9 E9' + 'E9 FF E8 E8 E8 FF E6 E6 E6 FF E4 E4 E4 FF E2 E2' + 'E2 FF DB DB DB FF DC DC DC FF D8 D8 D8 FF D9 D9' + 'D9 FF D2 D2 D2 FF D2 D2 D2 FF CF CF CF FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF 62 62' + '62 FF CE CE CE FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 F0 FF FF D4 F0 FF C0 C0 C0 FF 7A 7A' + '7A FF 62 62 62 FF 80 80 80 FF E6 E6 E6 FF FF D4' + 'F0 FF FF D4 F0 FF F2 F2 F2 FF FF D4 E3 FF 00 00' + '00 33 00 00 00 F9 26 26 26 FF D3 D3 D3 FF F7 F7' + 'F7 FF F8 F8 F8 FF F6 F6 F6 FF F6 F6 F6 FF F6 F6' + 'F6 FF F5 F5 F5 FF F5 F5 F5 FF F4 F4 F4 FF F4 F4' + 'F4 FF F3 F3 F3 FF F3 F3 F3 FF F3 F3 F3 FF F2 F2' + 'F2 FF F2 F2 F2 FF F1 F1 F1 FF F1 F1 F1 FF F1 F1' + 'F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF EF EF' + 'EF FF EF EF EF FF EE EE EE FF EE EE EE FF 62 62' + '62 FF AA AA AA FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 E3 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'E3 FF FF D4 D4 FF FF D4 E3 FF FF D4 FF FF FF D4' + 'FF FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 33 00 00 00 F9 24 24 24 FF D6 D6 D6 FF FF FF' + 'FF FF E9 E9 E9 FF E1 E1 E1 FF E2 E2 E2 FF E2 E2' + 'E2 FF E0 E0 E0 FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF 62 62' + '62 FF 92 92 92 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF FF D4 FF FF FF D4' + 'FF FF FF D4 FF FF FF D4 FF FF FF D4 FF FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 34 00 00 00 FA 24 24 24 FF DE DE DE FF F8 F8' + 'F8 FF D9 D9 D9 FF C4 C4 C4 FF BB BB BB FF BF BF' + 'BF FF D8 D8 D8 FF DA DA DA FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF 6E 6E' + '6E FF 7A 7A 7A FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF FF D4 E3 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 25 00 00 00 F7 1F 1F 1F FF DA DA DA FF F3 F3' + 'F3 FF C6 C6 C6 FF A9 A9 A9 FF B7 B7 B7 FF B0 B0' + 'B0 FF C3 C3 C3 FF DA DA DA FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D3 D3' + 'D3 FF 62 62 62 FF C0 C0 C0 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 07 00 00 00 D0 05 05 05 FF C2 C2 C2 FF F6 F6' + 'F6 FF BC BC BC FF B2 B2 B2 FF C3 C3 C3 FF AB AB' + 'AB FF BB BB BB FF D8 D8 D8 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D4 D4 D4 FF D3 D3 D3 FF D3 D3' + 'D3 FF D5 D5 D5 FF D7 D7 D7 FF D8 D8 D8 FF D8 D8' + 'D8 FF D7 D7 D7 FF D5 D5 D5 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D4 D4 D4 FF D5 D5 D5 FF D3 D3' + 'D3 FF 62 62 62 FF 86 86 86 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 00 00 00 00 9C 00 00 00 FF A4 A4 A4 FF F4 F4' + 'F4 FF CF CF CF FF C5 C5 C5 FF D2 D2 D2 FF BF BF' + 'BF FF C9 C9 C9 FF D3 D3 D3 FF D2 D2 D2 FF D0 D0' + 'D0 FF D3 D3 D3 FF D0 D0 D0 FF D0 D0 D0 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D0 D0' + 'D0 FF D0 D0 D0 FF D4 D4 D4 FF D0 D0 D0 FF D3 D3' + 'D3 FF D3 D3 D3 FF 62 62 62 FF B6 B6 B6 FF F2 F2' + 'F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF F2 F2 F2 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 00 00 00 00 73 00 00 00 FF 7E 7E 7E FF EF EF' + 'EF FF D1 D1 D1 FF CF CF CF FF CB CB CB FF CF CF' + 'CF FF D1 D1 D1 FF CE CE CE FF CF CF CF FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5' + 'D5 FF D5 D5 D5 FF D5 D5 D5 FF E1 E1 E1 FF D3 D3' + 'D3 FF D3 D3 D3 FF 7A 7A 7A FF 7A 7A 7A FF FF B1' + 'C7 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2' + 'F2 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 00 00 00 00 59 00 00 00 FF 59 59 59 FF E9 E9' + 'E9 FF D0 D0 D0 FF CD CD CD FF CD CD CD FF CD CD' + 'CD FF CA CA CA FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D4 D4 D4 FF D5 D5 D5 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D5 D5' + 'D5 FF D5 D5 D5 FF DB DB DB FF E4 E4 E4 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF 6E 6E 6E FF 92 92' + '92 FF F2 F2 F2 FF F2 F2 F2 FF F2 F2 F2 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 00 00 00 00 3E 00 00 00 FE 40 40 40 FF D7 D7' + 'D7 FF D2 D2 D2 FF CA CA CA FF CB CB CB FF CA CA' + 'CA FF D4 D4 D4 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D1 D1 D1 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D3 D3' + 'D3 FF D2 D2 D2 FF D3 D3 D3 FF D3 D3 D3 FF D2 D2' + 'D2 FF D2 D2 D2 FF D1 D1 D1 FF D0 D0 D0 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF C4 C4 C4 FF 6E 6E' + '6E FF 92 92 92 FF F2 F2 F2 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'D4 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF 00 00' + '00 00 00 00 00 25 00 00 00 F8 22 22 22 FF B7 B7' + 'B7 FF DB DB DB FF CA CA CA FF CB CB CB FF CE CE' + 'CE FF D3 D3 D3 FF D3 D3 D3 FF CF CF CF FF D1 D1' + 'D1 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF CF CF CF FF D3 D3 D3 FF D3 D3 D3 FF CE CE' + 'CE FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF CE CE CE FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF C4 C4 C4 FF C4 C4' + 'C4 FF 6E 6E 6E FF 80 80 80 FF CE CE CE FF FF D4' + 'D4 FF FF D4 D4 FF FF D4 D4 FF FF D4 D4 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF E6 E6 E6 FF 92 92 92 FF 00 00' + '00 00 00 00 00 0C 00 00 00 E1 07 07 07 FF 9F 9F' + '9F FF DD DD DD FF CC CC CC FF CD CD CD FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF C4 C4 C4 FF C4 C4' + 'C4 FF B3 B3 B3 FF 99 99 99 FF 62 62 62 FF 9E 9E' + '9E FF C0 C0 C0 FF FF D4 D4 FF FF D4 F0 FF FF D4' + 'F0 FF FF D4 F0 FF FF D4 F0 FF FF FF FF FF CE CE' + 'CE FF 9E 9E 9E FF 62 62 62 FF 92 92 92 FF 00 00' + '00 00 00 00 00 00 00 00 00 B2 00 00 00 FF 83 83' + '83 FF DD DD DD FF CF CF CF FF D1 D1 D1 FF D3 D3' + 'D3 FF D3 D3 D3 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF CF CF CF FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF B3 B3' + 'B3 FF B3 B3 B3 FF 99 99 99 FF 00 00 00 FF 00 00' + '00 FF 7A 7A 7A FF 62 62 62 FF 86 86 86 FF 86 86' + '86 FF 86 86 86 FF 86 86 86 FF 62 62 62 FF 6E 6E' + '6E FF 00 00 00 24 00 00 00 0C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 80 00 00 00 FF 5F 5F' + '5F FF DC DC DC FF D1 D1 D1 FF D2 D2 D2 FF D3 D3' + 'D3 FF D3 D3 D3 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF B3 B3' + 'B3 FF B3 B3 B3 FF 99 99 99 FF 00 00 00 CF 00 00' + '00 CF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 4B 00 00 00 FE 41 41' + '41 FF D8 D8 D8 FF D4 D4 D4 FF D2 D2 D2 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF B3 B3' + 'B3 FF B3 B3 B3 FF 99 99 99 FF 00 00 00 CF 00 00' + '00 CF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 1A 00 00 00 F2 2C 2C' + '2C FF CC CC CC FF D6 D6 D6 FF D5 D5 D5 FF D3 D3' + 'D3 FF D3 D3 D3 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF C4 C4 C4 FF D3 D3 D3 FF BD BD' + 'BD FF D0 D0 D0 FF 99 99 99 FF 09 09 09 FF 00 00' + '00 CF 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 00 00 00 D8 18 18' + '18 FF B0 B0 B0 FF DB DB DB FF DB DB DB FF DE DE' + 'DE FF DE DE DE FF DE DE DE FF D9 D9 D9 FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DA DA DA FF DD DD' + 'DD FF DD DD DD FF E7 E7 E7 FF D9 D9 D9 FF CC CC' + 'CC FF CA CA CA FF 7A 7A 7A FF 02 02 02 FF 00 00' + '00 B8 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 02 00 00 00 BF 08 08' + '08 FF 97 97 97 FF DC DC DC FF DF DF DF FF DC DC' + 'DC FF DE DE DE FF DE DE DE FF DE DE DE FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF DD DD DD FF DC DC' + 'DC FF C6 C6 C6 FF 53 53 53 FF 00 00 00 FF 00 00' + '00 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 A4 00 00' + '00 FF 77 77 77 FF D3 D3 D3 FF E2 E2 E2 FF E1 E1' + 'E1 FF DE DE DE FF DE DE DE FF DE DE DE FF DE DE' + 'DE FF DE DE DE FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E1 E1 E1 FF E1 E1 E1 FF E7 E7' + 'E7 FF E7 E7 E7 FF E7 E7 E7 FF E3 E3 E3 FF D9 D9' + 'D9 FF BB BB BB FF 39 39 39 FF 00 00 00 FF 00 00' + '00 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 89 00 00' + '00 FF 4B 4B 4B FF C9 C9 C9 FF E5 E5 E5 FF E3 E3' + 'E3 FF E4 E4 E4 FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E5 E5' + 'E5 FF E5 E5 E5 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E4 E4 E4 FF E6 E6 E6 FF D6 D6' + 'D6 FF A8 A8 A8 FF 20 20 20 FF 00 00 00 FD 00 00' + '00 4E 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 62 00 00' + '00 FF 35 35 35 FF BD BD BD FF E6 E6 E6 FF E6 E6' + 'E6 FF E6 E6 E6 FF E7 E7 E7 FF E7 E7 E7 FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF E7 E7 E7 FF E7 E7 E7 FF E7 E7 E7 FF E7 E7' + 'E7 FF E7 E7 E7 FF E6 E6 E6 FF E8 E8 E8 FF D4 D4' + 'D4 FF 9A 9A 9A FF 0B 0B 0B FF 00 00 00 ED 00 00' + '00 2C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2D 00 00' + '00 F9 1E 1E 1E FF AB AB AB FF E4 E4 E4 FF ED ED' + 'ED FF E7 E7 E7 FF E6 E6 E6 FF EC EC EC FF EB EB' + 'EB FF EA EA EA FF ED ED ED FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EB EB EB FF EB EB' + 'EB FF EB EB EB FF EB EB EB FF EC EC EC FF EA EA' + 'EA FF E5 E5 E5 FF EB EB EB FF EB EB EB FF D6 D6' + 'D6 FF 8A 8A 8A FF 00 00 00 FF 00 00 00 C3 00 00' + '00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 09 00 00' + '00 DD 08 08 08 FF 99 99 99 FF E4 E4 E4 FF DF DF' + 'DF FF BD BD BD FF C1 C1 C1 FF D6 D6 D6 FF EC EC' + 'EC FF ED ED ED FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EB EB EB FF EB EB' + 'EB FF EC EC EC FF ED ED ED FF EE EE EE FF EE EE' + 'EE FF ED ED ED FF EE EE EE FF E4 E4 E4 FF C2 C2' + 'C2 FF BE BE BE FF D1 D1 D1 FF EC EC EC FF D4 D4' + 'D4 FF 75 75 75 FF 00 00 00 FF 00 00 00 9C 00 00' + '00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 AE 00 00 00 FF 8D 8D 8D FF E0 E0 E0 FF C4 C4' + 'C4 FF B2 B2 B2 FF B8 B8 B8 FF B2 B2 B2 FF EB EB' + 'EB FF F1 F1 F1 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F3 F3 F3 FF D5 D5 D5 FF B0 B0' + 'B0 FF B6 B6 B6 FF B7 B7 B7 FF EB EB EB FF CD CD' + 'CD FF 61 61 61 FF 00 00 00 FF 00 00 00 85 00 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 80 00 00 00 FF 64 64 64 FF CE CE CE FF DD DD' + 'DD FF DC DC DC FF D5 D5 D5 FF E4 E4 E4 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF FA FA FA FF F2 F2 F2 FF DF DF' + 'DF FF D8 D8 D8 FF DC DC DC FF D7 D7 D7 FF B0 B0' + 'B0 FF 34 34 34 FF 00 00 00 FF 00 00 00 67 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 44 00 00 00 FF 19 19 19 FF 80 80 80 FF BE BE' + 'BE FF D3 D3 D3 FF D7 D7 D7 FF DB DB DB FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D9 D9 D9 FF D9 D9' + 'D9 FF D7 D7 D7 FF CD CD CD FF B0 B0 B0 FF 5D 5D' + '5D FF 06 06 06 FF 00 00 00 ED 00 00 00 2B 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 02 00 00 00 9C 00 00 00 FF 0C 0C 0C FF 3D 3D' + '3D FF 49 49 49 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 49 49 49 FF 49 49 49 FF 2F 2F 2F FF 02 02' + '02 FF 00 00 00 FF 00 00 00 5C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 06 00 00 00 7F 00 00 00 F1 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 D6 00 00 00 5C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2C 00 00' + '00 7E 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 70 00 00' + '00 1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF F0 00 00 00 FF FF FF FF E0 00 00 00 FF FF' + 'FF FF C0 00 00 00 FF FF FF FF 80 00 00 00 FF FF' + 'FF FF 00 00 00 00 FF FF FF FE 00 00 00 00 FF FF' + 'FF FC 00 00 00 00 F0 00 00 00 00 00 00 00 C0 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 E0 00 00 00 00' + '00 00 00 60 00 00 00 00 00 00 00 20 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 C0 00' + '00 00 00 01 00 00 C0 00 00 00 07 FF 00 00 C0 00' + '00 00 07 FF 00 00 C0 00 00 00 07 FF 00 00 C0 00' + '00 00 03 FF 00 00 C0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 F0 00 00 00 07 FF 00 00 F0 00' + '00 00 0F FF 00 00 F0 00 00 00 0F FF 00 00 F0 00' + '00 00 1F FF 00 00 F8 00 00 00 3F FF 00 00 FE 00' + '00 00 7F FF 00 00 FF FF FF FF FF FF 00 00' +} */ + +/* BINRES ramdisk.ico */ +12 ICON ramdisk.ico +/* { + '00 00 01 00 07 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 76 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 5E 03 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 C6 08 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 EE 09 00 00 30 30 00 00 01 00 04 00 68 06' + '00 00 96 18 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 FE 1E 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 A6 44 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 88 00 66 00 00 00 00 00 00 00 00 00 00' + '00 00 08 08 80 E6 00 00 00 00 00 00 00 00 00 00' + '00 00 80 08 07 EE 00 00 00 00 00 00 00 00 00 00' + '00 08 00 08 00 0E 00 60 00 00 00 00 00 00 00 00' + '00 80 00 80 80 08 00 66 00 00 00 00 00 00 00 00' + '08 00 08 00 08 00 80 E6 00 00 00 00 00 00 00 00' + '80 00 80 00 00 80 07 EE 00 00 00 00 00 00 00 08' + '00 08 00 00 00 08 00 0E 00 60 00 00 00 00 00 80' + '00 80 00 08 00 00 80 08 00 66 00 00 00 00 00 80' + '08 00 00 80 80 00 08 00 80 E6 00 00 00 00 00 80' + '80 00 08 08 08 00 00 80 07 EE 00 00 00 00 00 88' + '00 00 80 80 80 00 00 08 00 0E 00 60 00 00 66 07' + '00 00 08 08 00 00 00 00 80 08 00 66 00 00 66 00' + '70 00 00 80 00 08 00 00 08 00 80 E6 00 00 EE EE' + '07 00 00 00 00 00 80 00 00 80 07 EE 00 00 0E E0' + '00 70 00 00 08 00 08 00 00 08 00 0E 00 60 00 00' + '66 07 00 00 00 80 00 80 00 00 80 08 00 66 00 00' + '66 00 70 00 00 08 00 08 00 00 08 00 80 E6 00 00' + 'EE EE 07 00 00 00 80 00 80 00 00 80 07 EE 00 00' + '0E E0 00 70 00 00 08 00 00 00 00 08 00 0E 00 00' + '00 00 66 07 00 00 00 80 00 00 00 00 80 08 00 00' + '00 00 66 00 70 00 00 00 08 88 00 00 08 08 00 00' + '00 00 EE EE 07 00 00 00 80 80 80 00 00 87 00 00' + '00 00 0E E0 00 70 00 00 88 08 80 00 00 70 00 00' + '00 00 00 00 66 07 00 00 80 80 80 00 07 00 00 00' + '00 00 00 00 66 00 70 00 08 88 00 00 70 00 00 00' + '00 00 00 00 EE EE 07 00 00 00 00 07 00 00 00 00' + '00 00 00 00 0E E0 00 70 00 00 00 70 00 00 00 00' + '00 00 00 00 00 00 66 07 00 00 07 00 00 00 00 00' + '00 00 00 00 00 00 66 00 70 00 70 00 00 00 00 00' + '00 00 00 00 00 00 EE EE 07 07 00 00 00 00 00 00' + '00 00 00 00 00 00 0E E0 00 70 00 00 00 00 FF CC' + 'FF FF FF 84 FF FF FF 00 FF FF FE 00 DF FF FC 00' + 'CF FF F8 00 4F FF F0 00 0F FF E0 00 0D FF C0 00' + '0C FF C0 00 04 FF C0 00 00 FF C0 00 00 DF 00 00' + '00 CF 00 00 00 4F 08 00 00 0F 9C 00 00 0D F0 00' + '00 0C F0 00 00 04 F0 80 00 00 F9 C0 00 00 FF 00' + '00 00 FF 00 00 00 FF 08 00 00 FF 9C 00 01 FF F0' + '00 03 FF F0 00 07 FF F0 80 0F FF F9 C0 1F FF FF' + '00 3F FF FF 00 7F FF FF 08 FF FF FF 9D FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 1C 04 04 00 18 18' + '18 00 1A 1A 1A 00 1C 1C 1C 00 36 0E 0E 00 3C 14' + '14 00 34 1C 1C 00 20 20 20 00 24 24 24 00 28 28' + '28 00 30 30 30 00 38 38 38 00 3C 3C 3C 00 40 28' + '28 00 46 46 46 00 48 48 48 00 4C 4C 4C 00 50 50' + '50 00 52 52 52 00 54 54 54 00 56 56 56 00 58 58' + '58 00 68 68 68 00 74 74 74 00 78 78 78 00 7E 7E' + '7E 00 7F 7F 7F 00 00 92 92 00 00 9C 9C 00 00 BC' + 'BC 00 00 C0 C0 00 00 D0 D0 00 00 DF DF 00 00 E3' + 'E3 00 00 E5 E5 00 00 F7 F7 00 00 FB FB 00 00 FF' + 'FF 00 90 90 90 00 A8 A8 A8 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 77 11 00 00 00 B8 09' + '38 00 00 00 38 00 70 63 0C 01 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' + 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 76 00' + '00 00 76 00 00 00 07 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 77 38 9F 07 00 CD 8B F5 77 78 13' + '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 58 00' + '5A 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 40 9F' + '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' + 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' + 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' + 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 77 00 EC FD 7F 58 00 00 00 00 00 00 00 03 00' + '00 00 60 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 88 36 0C 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 72' + '61 6D 64 69 73 6B 2E 69 63 6F 00 93 4B 00 14 1A' + '95 00 1F 3B D4 77 11 00 00 00 88 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 70 63 0C 01 76 00 00 00 00 00' + '00 00 C9 F1 E7 77 76 00 00 00 A4 1A 95 00 07 00' + '00 00 00 00 00 00 76 00 00 00 76 00 00 00 07 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 70 63 0C 01 76 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 18 00 1F 00 00' + '00 00 00 00 00 00 00 00 00 00 04 0F 07 26 00 00' + '00 00 00 00 00 00 00 00 00 08 08 04 13 01 00 20' + '00 00 00 00 00 00 00 00 08 08 0A 29 29 15 07 26' + '00 00 00 00 00 00 00 11 04 0A 29 29 29 29 15 01' + '00 20 00 00 00 00 00 1A 03 29 0B 29 29 29 29 15' + '07 26 00 00 00 00 1C 05 0C 29 29 0B 29 29 29 29' + '15 01 00 20 00 00 21 25 00 0D 29 29 0B 29 29 29' + '29 15 07 26 00 00 00 00 1D 06 0D 29 29 16 12 29' + '29 29 15 01 00 1E 00 00 24 25 00 0D 29 29 14 09' + '29 29 29 15 07 23 00 00 00 00 1D 06 0D 29 29 0A' + '02 12 29 29 13 0E 00 00 00 00 24 25 00 0D 29 29' + '19 17 12 29 29 28 00 00 00 00 00 00 1D 06 0D 29' + '10 19 04 29 27 00 00 00 00 00 00 00 24 25 00 0D' + '29 29 29 27 00 00 00 00 00 00 00 00 00 00 1D 06' + '0D 29 27 00 00 00 00 00 00 00 00 00 00 00 21 22' + '00 1A 00 00 00 00 FA FF 00 00 F0 FF 00 00 E0 BF' + '00 00 C0 3F 00 00 80 2F 00 00 80 0F 00 00 00 0B' + '00 00 20 03 00 00 C0 02 00 00 C8 00 00 00 F0 00' + '00 00 F2 00 00 00 FC 01 00 00 FC 83 00 00 FF 07' + '00 00 FF 2F 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 04 00 00 00 00 00 80 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '08 0E 00 00 00 00 00 00 08 0E 00 00 00 00 00 00' + '00 80 0E 00 00 00 00 00 00 08 0E 00 00 00 08 00' + '00 00 80 0E 00 00 08 00 00 00 08 0E 00 00 60 00' + '00 00 00 80 0E 00 EE 00 00 00 00 08 0E 00 00 60' + '00 08 80 00 80 06 00 EE 00 00 80 00 08 0E 00 00' + '60 00 00 08 00 80 00 00 EE 00 00 88 80 07 00 00' + '00 60 00 88 00 80 00 00 00 EE 00 00 08 00 00 00' + '00 00 60 00 80 00 00 00 00 00 EE 08 00 00 FA FF' + '00 00 F0 FF 00 00 E0 BF 00 00 C0 3F 00 00 80 2F' + '00 00 80 0F 00 00 00 0B 00 00 20 03 00 00 C0 02' + '00 00 C8 00 00 00 F0 00 00 00 F2 00 00 00 FC 01' + '00 00 FC 83 00 00 FF 07 00 00 FF 2F 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 08 00 00 00' + '00 00 00 09 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 01 01 01 00 02 02' + '02 00 05 05 05 00 06 06 06 00 07 07 07 00 08 08' + '08 00 09 09 09 00 0B 0B 0B 00 0C 0C 0C 00 18 18' + '18 00 19 19 19 00 1E 1E 1E 00 1F 1F 1F 00 20 20' + '20 00 21 21 21 00 22 22 22 00 24 24 24 00 26 26' + '26 00 27 27 27 00 28 28 28 00 29 29 29 00 2B 2B' + '2B 00 2C 2C 2C 00 2F 2F 2F 00 34 34 34 00 35 35' + '35 00 39 39 39 00 3B 3B 3B 00 3D 3D 3D 00 3F 3F' + '3F 00 40 40 40 00 41 41 41 00 47 47 47 00 48 48' + '48 00 49 49 49 00 4B 4B 4B 00 53 53 53 00 56 56' + '56 00 59 59 59 00 5D 5D 5D 00 5F 5F 5F 00 61 61' + '61 00 64 64 64 00 68 68 68 00 6A 6A 6A 00 6C 6C' + '6C 00 70 70 70 00 71 71 71 00 72 72 72 00 74 74' + '74 00 75 75 75 00 77 77 77 00 78 78 78 00 79 79' + '79 00 7A 7A 7A 00 7D 7D 7D 00 7E 7E 7E 00 7F 7F' + '7F 00 00 80 80 00 00 FF FF 00 80 80 80 00 81 81' + '81 00 83 83 83 00 85 85 85 00 87 87 87 00 88 88' + '88 00 8A 8A 8A 00 8D 8D 8D 00 8E 8E 8E 00 8F 8F' + '8F 00 90 90 90 00 92 92 92 00 93 93 93 00 97 97' + '97 00 98 98 98 00 99 99 99 00 9A 9A 9A 00 9C 9C' + '9C 00 9D 9D 9D 00 9F 9F 9F 00 A0 A0 A0 00 A2 A2' + 'A2 00 A4 A4 A4 00 A5 A5 A5 00 A7 A7 A7 00 A8 A8' + 'A8 00 A9 A9 A9 00 AB AB AB 00 AD AD AD 00 AE AE' + 'AE 00 B0 B0 B0 00 B2 B2 B2 00 B3 B3 B3 00 B6 B6' + 'B6 00 B7 B7 B7 00 B8 B8 B8 00 B9 B9 B9 00 BA BA' + 'BA 00 BB BB BB 00 BC BC BC 00 BD BD BD 00 BE BE' + 'BE 00 BF BF BF 00 C0 C0 C0 00 C1 C1 C1 00 C2 C2' + 'C2 00 C3 C3 C3 00 C4 C4 C4 00 C5 C5 C5 00 C6 C6' + 'C6 00 C7 C7 C7 00 C8 C8 C8 00 C9 C9 C9 00 CA CA' + 'CA 00 CB CB CB 00 CC CC CC 00 CD CD CD 00 CE CE' + 'CE 00 CF CF CF 00 D0 D0 D0 00 D1 D1 D1 00 D2 D2' + 'D2 00 D3 D3 D3 00 D4 D4 D4 00 D5 D5 D5 00 D6 D6' + 'D6 00 D7 D7 D7 00 D8 D8 D8 00 D9 D9 D9 00 DA DA' + 'DA 00 DB DB DB 00 DC DC DC 00 DD DD DD 00 DE DE' + 'DE 00 DF DF DF 00 E0 E0 E0 00 E1 E1 E1 00 E2 E2' + 'E2 00 E3 E3 E3 00 E4 E4 E4 00 E5 E5 E5 00 E6 E6' + 'E6 00 E7 E7 E7 00 E8 E8 E8 00 E9 E9 E9 00 EA EA' + 'EA 00 EB EB EB 00 EC EC EC 00 ED ED ED 00 EE EE' + 'EE 00 EF EF EF 00 F0 F0 F0 00 F1 F1 F1 00 F2 F2' + 'F2 00 F3 F3 F3 00 F4 F4 F4 00 F5 F5 F5 00 F6 F6' + 'F6 00 F7 F7 F7 00 F8 F8 F8 00 F9 F9 F9 00 FA FA' + 'FA 00 FF FF FF 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 77 00 EC FD 7F 58 00 00 00 00 00 00 00 03 00' + '00 00 60 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 88 36 0C 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 72' + '61 6D 64 69 73 6B 2E 69 63 6F 00 93 4B 00 14 1A' + '95 00 1F 3B D4 77 11 00 00 00 88 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 70 63 0C 01 76 00 00 00 00 00' + '00 00 C9 F1 E7 77 76 00 00 00 A4 1A 95 00 07 00' + '00 00 00 00 00 00 76 00 00 00 76 00 00 00 07 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 70 63 0C 01 76 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 A4 A4' + 'A4 A4 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 A4 A4 3D' + '3D A4 A4 3B 3B A4 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 A4 A4 3D A4' + '3D 3D A4 3C 3B A4 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 A4 A4 3D A4 A4' + '3D A4 68 3C 3C A4 00 A4 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 A4 A4 3D A4 A4 A4' + '3D A4 A4 A4 3C A4 00 3B A4 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 A4 A4 3D A4 A4 A4 3D' + 'A4 3D A4 A4 3D A4 00 3B 3B 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 A4 3D A4 A4 A4 3D A4' + 'A4 A4 3D A4 A4 3D 00 3C 3B A4 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 A4 A4 A4 A4 A4 A4' + 'A4 A4 A4 A4 A4 A4 A4 A4 A4 3D A4 A4 A4 3D A4 A4' + 'A4 A4 A4 3D A4 A4 68 3C 3C A4 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 A4 A4 A4 A4 A4 A4 A4 A4' + 'A4 A4 A4 A4 A4 A4 A4 A4 3D A4 A4 A4 3D A4 A4 A4' + 'A4 A4 A4 A4 3D A4 A4 A4 3C A4 00 3B A4 00 00 00' + '00 00 00 00 00 00 00 A4 A4 A4 A4 0F 17 16 17 16' + '16 16 16 16 16 16 16 3D A4 A4 A4 3D A4 A4 A4 A4' + '3D A4 A4 A4 A4 3D A4 A4 3D A4 00 3B 3B A4 00 00' + '00 00 00 00 00 00 00 A4 A4 12 47 72 75 73 76 75' + '74 73 71 6F 6E 6D 6C 3D A4 A4 3D A4 A4 A4 A4 3D' + 'A4 3D A4 A4 A4 A4 3D A4 A4 3D A4 3C 3B A4 00 00' + '00 00 00 00 00 00 A4 A4 01 43 93 90 8F 7D 40 42' + '48 4B 52 59 62 68 6B 3D A4 3D A4 A4 A4 A4 3D A4' + '3D A4 3D A4 A4 A4 A4 3D A4 A4 68 3C 3C A4 00 A4' + '00 00 00 00 00 00 A4 A4 0B 6F 94 8A 8E 73 1C 1E' + '26 31 41 48 4F 54 56 3D 3D A4 A4 A4 A4 3D A4 3D' + 'A4 3D A4 A4 A4 A4 A4 A4 3D A4 A4 A4 3C A4 00 3B' + 'A4 00 00 00 00 00 A4 A4 15 79 92 8C 8F 75 21 29' + '36 41 46 4A 51 3B 3B A4 68 A4 A4 A4 A4 A4 3D A4' + '3D A4 A4 A4 A4 A4 A4 A4 A4 3D A4 A4 3D A4 00 3B' + '3B A4 00 00 00 00 A4 A4 14 79 94 8E 8F 79 2C 32' + '39 40 45 4A 51 3B 3B A4 A4 68 A4 A4 A4 A4 A4 3D' + 'A4 A4 A4 A4 3D A4 A4 A4 A4 A4 3D A4 A4 3D A4 3C' + '3B A4 00 00 00 00 A4 A4 14 79 96 8F 90 7E 2F 30' + '38 40 45 4A 51 3C 3C 3C 3C 4E 68 A4 A4 A4 A4 A4' + 'A4 A4 A4 A4 A4 3D A4 A4 A4 A4 A4 3D A4 A4 68 3C' + '3C A4 00 A4 00 00 A4 A4 13 79 97 91 93 7E 2D 2E' + '35 3E 43 49 4E 4E 3C 3C 4E 4E 4E 68 A4 A4 A4 A4' + 'A4 A4 3D A4 A4 A4 3D A4 A4 A4 A4 A4 3D A4 A4 A4' + '3C A4 00 3B A4 00 A4 A4 13 7A 9A 93 92 87 55 55' + '58 5A 5B 5D 5E 61 61 62 65 3B 3B A4 68 A4 A4 A4' + 'A4 A4 A4 3D A4 A4 A4 3D A4 A4 A4 A4 A4 3D A4 A4' + '3D A4 A4 3B 3B A4 A4 A4 12 7B 9B 93 93 92 95 93' + '91 90 8E 8C 8A 89 87 86 83 3B 3B A4 A4 68 A4 A4' + 'A4 A4 A4 A4 3D A4 A4 A4 3D A4 A4 A4 A4 A4 3D A4' + 'A4 3D A4 3C 3B A4 A4 A4 12 7B 9F A0 9E 9E 9E 9D' + '9D 9C 9C 9B 9B 9B 9A 9A 99 3C 3C 3C 3C 99 68 A4' + 'A4 A4 A4 A4 A4 3D A4 A4 A4 3D A4 A4 A4 A4 A4 3D' + 'A4 A4 68 3C 3C A4 A4 A4 11 7E A3 91 89 8A 8A 88' + '87 87 87 87 87 88 88 88 88 88 3C 3C 81 81 81 68' + 'A4 A4 A4 A4 A4 A4 3D A4 A4 A4 A4 A4 A4 A4 A4 A4' + '3D A4 A4 A4 3C A4 A4 A4 11 86 A0 81 6C 63 67 80' + '82 81 81 81 81 81 81 81 81 81 81 81 81 3B 3B A4' + '68 A4 A4 A4 A4 A4 A4 3D A4 A4 A4 A4 A4 A4 A4 A4' + 'A4 3D A4 A4 3D A4 A4 A4 0D 82 9B 6E 57 5F 5B 6B' + '82 80 80 80 80 80 7F 7F 7F 7F 7F 7F 7F 3B 3B A4' + 'A4 68 A4 A4 A4 A4 A4 A4 A4 A4 3D 3D 3D A4 A4 A4' + 'A4 A4 3D A4 3D A4 A4 A4 03 6A 9E 64 5C 6B 58 63' + '80 7D 7D 7D 7C 7B 7B 7D 7F 80 80 7F 7D 3C 3C 3C' + '3C 7F 68 A4 A4 A4 A4 A4 A4 3D A4 3D A4 3D A4 A4' + 'A4 A4 A4 3D 68 A4 00 A4 A4 53 9C 77 6D 7A 67 71' + '7B 7A 78 7B 85 89 8B 8E 92 95 95 93 8F 8F 3C 3C' + '8F 8F 7F 68 A4 A4 A4 A4 A4 3D 3D A4 3D 3D A4 A4' + 'A4 A4 A4 68 A4 A4 00 A4 A4 39 97 79 77 73 77 79' + '76 77 87 98 94 89 86 85 84 83 83 84 85 86 89 94' + '99 3B 3B A4 68 A4 A4 A4 A4 3D A4 3D A4 3D A4 A4' + 'A4 A4 68 A4 A4 00 00 A4 A4 27 91 78 75 75 75 72' + '7E 95 8E 84 7C 7D 7E 7E 7E 7E 7E 7E 7E 7E 7D 7D' + '83 3B 3B A4 A4 68 A4 A4 A4 A4 3D 3D 3D A4 A4 A4' + 'A4 68 A4 A4 00 00 00 A4 A4 1F 7F 7A 72 73 72 7C' + '91 84 78 79 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A 7A' + '79 3C 3C 3C 3C 4C 68 A4 A4 A4 A4 A4 A4 A4 A4 A4' + '68 A4 A4 00 00 00 00 A4 A4 10 5F 83 72 73 76 8C' + '7C 77 79 78 78 78 78 77 75 76 76 76 76 76 76 76' + '76 76 3C 3C 77 77 4C 68 A4 A4 A4 A4 A4 A4 A4 68' + 'A4 A4 00 00 00 00 00 A4 A4 05 50 85 74 75 83 7E' + '76 78 78 78 78 78 78 77 74 71 72 72 72 72 72 72' + '72 72 72 70 77 3B 3B A4 68 A4 A4 A4 A4 A4 68 A4' + 'A4 00 00 00 00 00 00 00 A4 A4 3F 85 77 79 83 79' + '78 78 78 78 78 78 78 78 77 71 6D 6E 6E 6E 6E 6E' + '6E 6E 6E 6E 6F 3B 3B A4 A4 68 A4 A4 A4 68 A4 A4' + '00 00 00 00 00 00 00 00 A4 A4 29 84 79 7A 7C 79' + '79 79 79 79 79 79 79 79 79 78 70 6B 6B 6B 6C 6C' + '6C 6C 6C 6C 6C 3C 3C 3C 3C 07 68 A4 68 A4 A4 00' + '00 00 00 00 00 00 00 00 A4 A4 20 80 7C 7A 78 7B' + '7B 7B 7B 7B 7B 7B 7B 7B 7B 7B 7B 75 6F 6C 6A 69' + '68 69 69 69 6A 6A 3C 3C 4C 07 A4 68 A4 A4 00 00' + '00 00 00 00 00 00 00 00 A4 A4 17 74 7E 7D 74 7D' + '7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7F 7E 7D 7B 77' + '74 71 6E 6C 6A 5D 65 78 4C 07 A4 A4 00 00 00 00' + '00 00 00 00 00 00 00 00 A4 A4 0A 5B 83 83 78 7A' + '83 81 82 82 82 82 82 82 82 82 82 82 82 82 82 83' + '83 82 81 81 77 6D 74 72 37 02 A4 00 00 00 00 00' + '00 00 00 00 00 00 00 00 A4 A4 06 4A 84 87 84 76' + '7E 86 85 85 85 85 85 85 85 85 85 85 85 85 85 85' + '85 85 86 80 76 85 84 6E 25 A4 A4 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 A4 A4 34 7B 8A 89 86' + '76 7F 89 8A 88 88 88 88 88 88 88 88 88 88 88 88' + '89 89 81 75 82 8B 81 63 1B A4 A4 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 A4 A4 24 71 8D 8B 8C' + '89 7F 7A 82 8C 8D 8C 8C 8C 8C 8C 8C 8C 8C 8D 8D' + '84 7A 7E 88 8C 8E 7E 56 0E A4 A4 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 A4 A4 1A 65 8E 8E 8E' + '8F 8F 87 7A 7B 86 8B 8B 8C 8C 8C 8C 8B 8B 86 7C' + '79 85 8F 8F 8E 90 7C 4D 08 A4 A4 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 A4 A4 0C 58 8C 95 8F' + '8E 94 93 92 8C 88 87 87 85 84 84 85 87 87 87 8A' + '91 94 92 8D 93 93 7E 43 A4 A4 A4 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 A4 A4 06 4C 8C 87 65' + '69 7E 94 95 95 96 96 95 94 93 93 94 95 96 96 95' + '96 8C 6A 66 79 94 7C 33 A4 A4 A4 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 A4 A4 44 88 6C 5C' + '60 5C 93 99 98 98 98 98 98 98 98 98 98 98 98 98' + '9B 7D 5B 5E 5F 93 75 2A A4 A4 A4 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 A4 A4 2B 76 85 84' + '7D 8C A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1 A1' + 'A2 9A 87 80 84 7F 5B 19 A4 A4 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 A4 A4 0B 3D 66 7B' + '7F 83 80 80 80 80 80 80 80 80 80 80 80 80 80 80' + '80 81 81 7F 75 5B 28 04 A4 A4 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 A4 A4 A4 09 1D 23' + '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22' + '22 22 22 23 23 18 02 A4 A4 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 A4 A4 A4 A4 A4' + 'A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4' + 'A4 A4 A4 A4 A4 A4 A4 A4 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 A4 A4 A4' + 'A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4 A4' + 'A4 A4 A4 A4 A4 A4 A4 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF 0F FF FF 00 00 FF FF' + 'FE 00 FF FF 00 00 FF FF FC 00 FF FF 00 00 FF FF' + 'F8 00 BF FF 00 00 FF FF F0 00 9F FF 00 00 FF FF' + 'E0 00 9F FF 00 00 FF FF E0 00 8F FF 00 00 F0 00' + '00 00 0F FF 00 00 C0 00 00 00 09 FF 00 00 80 00' + '00 00 08 FF 00 00 80 00 00 00 00 FF 00 00 00 00' + '00 00 00 BF 00 00 00 00 00 00 00 9F 00 00 00 00' + '00 00 00 8F 00 00 00 00 00 00 00 0F 00 00 00 00' + '00 00 00 0B 00 00 00 00 00 00 00 09 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 01 00 00 80 00 00 00 00 03 00 00 80 00' + '00 00 00 07 00 00 80 00 00 00 00 0F 00 00 80 00' + '00 00 00 1F 00 00 C0 00 00 00 00 3F 00 00 C0 00' + '00 00 00 7F 00 00 C0 00 00 00 00 FF 00 00 C0 00' + '00 00 03 FF 00 00 C0 00 00 00 07 FF 00 00 C0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 F0 00' + '00 00 07 FF 00 00 F0 00 00 00 0F FF 00 00 F0 00' + '00 00 0F FF 00 00 F0 00 00 00 1F FF 00 00 F8 00' + '00 00 3F FF 00 00 FE 00 00 00 7F FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 04 00 00 00 00 00 80 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 08 80 06 60 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 88 0E 60 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 08 00 80 7E E0 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 80 00 80 00 E0 06 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '08 00 08 08 00 80 06 60 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 80 00 80 00 80 08 0E 60' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08' + '00 08 00 00 08 00 7E E0 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 80 00 80 00 00 00 80 00 E0' + '06 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00' + '08 00 00 80 00 08 00 80 06 60 00 00 00 00 00 00' + '87 77 77 77 77 77 78 00 80 00 08 08 00 00 80 08' + '0E 60 00 00 00 00 00 08 FF F7 88 88 77 77 78 08' + '00 00 80 80 80 00 08 00 7E E0 00 00 00 00 00 07' + 'FF F7 00 88 88 87 78 80 00 08 08 08 00 00 00 80' + '00 E0 06 00 00 00 00 07 FF F7 88 88 88 76 60 70' + '00 00 80 80 00 00 00 08 00 80 06 60 00 00 00 07' + 'FF F7 88 88 88 76 60 07 00 00 08 00 00 80 00 00' + '80 08 0E 60 00 00 00 07 FF F7 88 88 88 7E EE E8' + '70 00 00 00 00 08 00 00 08 00 7E E0 00 00 00 07' + 'FF F7 88 88 88 88 EE 88 87 00 00 00 80 00 80 00' + '00 80 00 E0 06 00 00 07 FF F7 77 77 77 77 77 76' + '60 70 00 00 08 00 08 00 00 08 00 80 06 60 00 07' + 'FF FF FF FF FF FF 77 76 60 07 00 00 00 80 00 80' + '00 00 80 08 0E 60 00 07 FF FF FF FF FF FF FF FE' + 'EE EF 70 00 00 08 00 08 00 00 08 00 7E E0 00 07' + 'FF FF FF 77 77 7F FF FF EE 77 77 00 00 00 80 00' + '00 00 00 80 00 E0 00 07 77 77 F7 77 77 77 77 77' + '77 76 60 70 00 00 08 00 00 00 00 08 00 80 00 07' + '77 77 F7 77 77 77 77 77 77 76 60 07 00 00 00 00' + '88 80 00 00 80 80 00 07 77 7F F7 77 77 77 77 77' + '77 7E EE E7 70 00 00 08 08 08 00 00 08 70 00 07' + 'FF FF 77 77 77 7F FF FF FF FF EE FF 77 00 00 08' + '80 88 00 00 07 00 00 08 77 77 77 77 7F FF 77 77' + '77 77 FF F6 60 70 00 08 08 08 00 00 70 00 00 08' + '77 77 77 7F F7 77 77 77 77 77 77 76 60 07 00 00' + '88 80 00 07 00 00 00 00 77 77 77 F7 77 77 77 77' + '77 77 77 7E EE E8 70 00 00 00 00 70 00 00 00 00' + '77 77 7F 77 77 77 77 77 77 77 77 77 EE 77 87 00' + '00 00 07 00 00 00 00 00 87 77 77 77 77 77 77 77' + '77 77 77 77 77 76 60 70 00 00 70 00 00 00 00 00' + '87 77 77 77 77 77 77 77 77 77 77 77 77 76 60 07' + '00 07 00 00 00 00 00 00 87 77 77 77 77 77 77 77' + '77 77 77 77 77 7E EE E0 70 70 00 00 00 00 00 00' + '87 77 77 77 77 77 77 77 77 77 77 77 77 77 EE 80' + '07 00 00 00 00 00 00 00 07 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 80 00 00 00 00 00 00 00 00' + '07 77 77 77 77 77 77 77 77 77 77 77 77 77 77 80' + '00 00 00 00 00 00 00 00 08 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 80 00 00 00 00 00 00 00 00' + '08 77 77 77 77 77 77 77 77 77 77 77 77 77 77 00' + '00 00 00 00 00 00 00 00 08 77 77 77 77 77 77 77' + '77 77 77 77 77 77 77 00 00 00 00 00 00 00 00 00' + '00 77 77 77 77 77 77 77 77 77 77 77 77 77 78 00' + '00 00 00 00 00 00 00 00 00 7F FF FF F7 77 77 77' + '77 77 77 7F FF FF 78 00 00 00 00 00 00 00 00 00' + '00 8F 77 77 F7 77 77 77 77 77 77 FF 77 7F 78 00' + '00 00 00 00 00 00 00 00 00 8F 77 77 F7 77 77 77' + '77 77 77 F7 77 7F 78 00 00 00 00 00 00 00 00 00' + '00 87 77 7F F7 77 77 77 77 77 77 FF 77 77 70 00' + '00 00 00 00 00 00 00 00 00 08 77 77 77 77 77 77' + '77 77 77 77 77 77 80 00 00 00 00 00 00 00 00 00' + '00 00 08 88 88 88 88 88 88 88 88 88 88 80 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF 01 FF FF 00 00 FF FF FE 00 FF FF 00 00 FF FF' + 'FC 00 FF FF 00 00 FF FF F8 00 BF FF 00 00 FF FF' + 'F0 00 9F FF 00 00 FF FF F0 00 8F FF 00 00 FF FF' + 'E0 00 8F FF 00 00 F0 00 00 00 0F FF 00 00 C0 00' + '00 00 09 FF 00 00 80 00 00 00 08 FF 00 00 80 00' + '00 00 00 FF 00 00 00 00 00 00 00 BF 00 00 00 00' + '00 00 00 9F 00 00 00 00 00 00 00 8F 00 00 00 00' + '00 00 00 0F 00 00 00 00 00 00 00 0B 00 00 00 00' + '00 00 00 09 00 00 00 00 00 00 00 08 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00' + '00 00 00 00 00 00 80 00 00 00 00 01 00 00 80 00' + '00 00 00 03 00 00 80 00 00 00 00 07 00 00 80 00' + '00 00 00 0F 00 00 80 00 00 00 00 1F 00 00 C0 00' + '00 00 00 3F 00 00 C0 00 00 00 00 7F 00 00 C0 00' + '00 00 00 FF 00 00 C0 00 00 00 03 FF 00 00 C0 00' + '00 00 07 FF 00 00 C0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 F0 00 00 00 07 FF 00 00 F0 00' + '00 00 0F FF 00 00 F0 00 00 00 0F FF 00 00 F0 00' + '00 00 1F FF 00 00 F8 00 00 00 3F FF 00 00 FE 00' + '00 00 7F FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00' + '00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3C 00 00' + '00 78 00 00 00 78 00 00 00 3C 00 00 00 30 00 00' + '00 6C 00 00 00 6C 00 00 00 24 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 3C 80 80 80 FF 80 80' + '80 FF 00 00 00 B4 00 00 00 84 00 80 80 FF 00 80' + '80 FF 00 00 00 90 00 00 00 30 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 3C 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 80 80 80 FF 00 00 00 B4 00 FF FF FF 00 80' + '80 FF 00 00 00 90 00 00 00 30 00 00 00 0C 00 00' + '00 18 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 3C 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF C0 C0 C0 FF 00 FF FF FF 00 FF' + 'FF FF 00 00 00 90 00 00 00 30 00 00 00 24 00 00' + '00 54 00 00 00 3C 00 00 00 0C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3C 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 FF' + 'FF FF 00 00 00 9C 00 00 00 48 00 80 80 FF 00 00' + '00 84 00 00 00 78 00 00 00 24 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 3E 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 B4 00 00 00 84 00 80 80 FF 00 80' + '80 FF 00 00 00 90 00 00 00 30 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 3E 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 00 00 FF FF FF 00 80' + '80 FF 00 00 00 90 00 00 00 30 00 00 00 00 00 00' + '00 18 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 16 00 00 00 34 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 3E 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF C0 C0 C0 FF 00 FF FF FF 00 FF' + 'FF FF 00 00 00 90 00 00 00 30 00 00 00 00 00 00' + '00 54 00 00 00 3C 00 00 00 0C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 05 00 00 00 69 00 00 00 C5 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 FF' + 'FF FF 00 00 00 90 00 00 00 30 00 80 80 FF 00 00' + '00 84 00 00 00 78 00 00 00 24 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00' + '00 9B 00 00 00 FF 00 00 00 FF 21 21 21 FF 2C 2C' + '2C FF 2B 2B 2B FF 2C 2C 2C FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B 2B FF 2B 2B' + '2B FF 2B 2B 2B FF 2B 2B 2B FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 90 00 00 00 30 00 80 80 FF 00 80' + '80 FF 00 00 00 90 00 00 00 30 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 54 00 00' + '00 FF 26 26 26 FF 90 90 90 FF CA CA CA FF CD CD' + 'CD FF CB CB CB FF CE CE CE FF CD CD CD FF CC CC' + 'CC FF CB CB CB FF C9 C9 C9 FF C7 C7 C7 FF C6 C6' + 'C6 FF C5 C5 C5 FF C4 C4 C4 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 84 00 FF FF FF 00 80' + '80 FF 00 00 00 90 00 00 00 30 00 00 00 0C 00 00' + '00 18 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 03 00 00 00 AD 01 01' + '01 FF 8A 8A 8A FF EB EB EB FF E8 E8 E8 FF E7 E7' + 'E7 FF D5 D5 D5 FF 85 85 85 FF 88 88 88 FF 92 92' + '92 FF 98 98 98 FF A2 A2 A2 FF AD AD AD FF BA BA' + 'BA FF C0 C0 C0 FF C3 C3 C3 FF 80 80 80 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF C0 C0 C0 FF 00 FF FF FF 00 FF' + 'FF FF 00 00 00 90 00 00 00 30 00 00 00 24 00 00' + '00 54 00 00 00 3C 00 00 00 0C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 15 00 00 00 F0 19 19' + '19 FF C7 C7 C7 FF EC EC EC FF E2 E2 E2 FF E6 E6' + 'E6 FF CB CB CB FF 3B 3B 3B FF 3F 3F 3F FF 56 56' + '56 FF 72 72 72 FF 87 87 87 FF 92 92 92 FF 9D 9D' + '9D FF A5 A5 A5 FF A8 A8 A8 FF 80 80 80 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 FF' + 'FF FF 00 00 00 9C 00 00 00 48 00 80 80 FF 00 00' + '00 84 00 00 00 78 00 00 00 24 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 30 00 00 00 FA 29 29' + '29 FF D1 D1 D1 FF EA EA EA FF E4 E4 E4 FF E7 E7' + 'E7 FF CD CD CD FF 47 47 47 FF 5F 5F 5F FF 79 79' + '79 FF 87 87 87 FF 8F 8F 8F FF 97 97 97 FF A0 A0' + 'A0 FF 00 80 80 FF 00 80 80 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 B4 00 00 00 84 00 80 80 FF 00 80' + '80 FF 00 00 00 90 00 00 00 30 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 34 00 00 00 F9 28 28' + '28 FF D1 D1 D1 FF EC EC EC FF E6 E6 E6 FF E7 E7' + 'E7 FF D1 D1 D1 FF 68 68 68 FF 74 74 74 FF 7E 7E' + '7E FF 85 85 85 FF 8E 8E 8E FF 97 97 97 FF A0 A0' + 'A0 FF 00 80 80 FF 00 80 80 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 B4 00 FF FF FF 00 80' + '80 FF 00 00 00 90 00 00 00 30 00 00 00 0C 00 00' + '00 18 00 00 00 0C 00 00 00 33 00 00 00 F9 28 28' + '28 FF D1 D1 D1 FF EE EE EE FF E7 E7 E7 FF E8 E8' + 'E8 FF D6 D6 D6 FF 70 70 70 FF 71 71 71 FF 7D 7D' + '7D FF 85 85 85 FF 8E 8E 8E FF 97 97 97 FF A0 A0' + 'A0 FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 FF' + 'FF FF 9C 9C 9C FF C0 C0 C0 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF C0 C0 C0 FF 00 FF FF FF 00 FF' + 'FF FF 00 00 00 90 00 00 00 30 00 00 00 24 00 00' + '00 54 00 00 00 3C 00 00 00 33 00 00 00 F9 27 27' + '27 FF D1 D1 D1 FF EF EF EF FF E9 E9 E9 FF EB EB' + 'EB FF D6 D6 D6 FF 6A 6A 6A FF 6C 6C 6C FF 78 78' + '78 FF 81 81 81 FF 8A 8A 8A FF 93 93 93 FF 9C 9C' + '9C FF 9C 9C 9C FF 00 FF FF FF 00 FF FF FF 9C 9C' + '9C FF 9C 9C 9C FF 9C 9C 9C FF C0 C0 C0 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 FF' + 'FF FF 00 00 00 9C 00 00 00 48 00 80 80 FF 00 00' + '00 84 00 00 00 78 00 00 00 33 00 00 00 F9 27 27' + '27 FF D2 D2 D2 FF F2 F2 F2 FF EB EB EB FF EA EA' + 'EA FF DF DF DF FF A7 A7 A7 FF A7 A7 A7 FF AB AB' + 'AB FF AE AE AE FF B0 B0 B0 FF B3 B3 B3 FF B6 B6' + 'B6 FF B9 B9 B9 FF B9 B9 B9 FF BA BA BA FF BD BD' + 'BD FF 00 80 80 FF 00 80 80 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 B4 00 00 00 84 00 80 80 FF 00 80' + '80 FF 00 00 00 90 00 00 00 33 00 00 00 F9 26 26' + '26 FF D3 D3 D3 FF F3 F3 F3 FF EB EB EB FF EB EB' + 'EB FF EA EA EA FF ED ED ED FF EB EB EB FF E9 E9' + 'E9 FF E8 E8 E8 FF E6 E6 E6 FF E4 E4 E4 FF E2 E2' + 'E2 FF E1 E1 E1 FF DF DF DF FF DE DE DE FF DB DB' + 'DB FF 00 80 80 FF 00 80 80 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 B4 00 FF FF FF 00 80' + '80 FF 00 00 00 90 00 00 00 33 00 00 00 F9 26 26' + '26 FF D3 D3 D3 FF F7 F7 F7 FF F8 F8 F8 FF F6 F6' + 'F6 FF F6 F6 F6 FF F6 F6 F6 FF F5 F5 F5 FF F5 F5' + 'F5 FF F4 F4 F4 FF F4 F4 F4 FF F3 F3 F3 FF F3 F3' + 'F3 FF F3 F3 F3 FF F2 F2 F2 FF F2 F2 F2 FF F1 F1' + 'F1 FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 FF' + 'FF FF F1 F1 F1 FF C0 C0 C0 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF C0 C0 C0 FF 00 FF FF FF 00 FF' + 'FF FF 00 00 00 90 00 00 00 33 00 00 00 F9 24 24' + '24 FF D6 D6 D6 FF FF FF FF FF E9 E9 E9 FF E1 E1' + 'E1 FF E2 E2 E2 FF E2 E2 E2 FF E0 E0 E0 FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF DF DF DF FF DF DF' + 'DF FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF 00 FF FF FF 00 FF FF FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF C0 C0 C0 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 FF' + 'FF FF 00 00 00 90 00 00 00 34 00 00 00 FA 24 24' + '24 FF DE DE DE FF F8 F8 F8 FF D9 D9 D9 FF C4 C4' + 'C4 FF BB BB BB FF BF BF BF FF D8 D8 D8 FF DA DA' + 'DA FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9 D9 FF D9 D9' + 'D9 FF 00 80 80 FF 00 80 80 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 90 00 00 00 25 00 00 00 F7 1F 1F' + '1F FF DA DA DA FF F3 F3 F3 FF C6 C6 C6 FF A9 A9' + 'A9 FF B7 B7 B7 FF B0 B0 B0 FF C3 C3 C3 FF DA DA' + 'DA FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7 D7 FF D7 D7' + 'D7 FF 00 80 80 FF 00 80 80 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 78 00 00 00 07 00 00 00 D0 05 05' + '05 FF C2 C2 C2 FF F6 F6 F6 FF BC BC BC FF B2 B2' + 'B2 FF C3 C3 C3 FF AB AB AB FF BB BB BB FF D8 D8' + 'D8 FF D5 D5 D5 FF D5 D5 D5 FF D5 D5 D5 FF D4 D4' + 'D4 FF D3 D3 D3 FF D3 D3 D3 FF D5 D5 D5 FF D7 D7' + 'D7 FF D8 D8 D8 FF D8 D8 D8 FF D7 D7 D7 FF D5 D5' + 'D5 FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 FF' + 'FF FF D7 D7 D7 FF C0 C0 C0 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF C0 C0' + 'C0 FF 00 00 00 3C 00 00 00 00 00 00 00 9C 00 00' + '00 FF A4 A4 A4 FF F4 F4 F4 FF CF CF CF FF C5 C5' + 'C5 FF D2 D2 D2 FF BF BF BF FF C9 C9 C9 FF D3 D3' + 'D3 FF D2 D2 D2 FF D0 D0 D0 FF D3 D3 D3 FF DD DD' + 'DD FF E1 E1 E1 FF E3 E3 E3 FF E6 E6 E6 FF EA EA' + 'EA FF ED ED ED FF ED ED ED FF EB EB EB FF E7 E7' + 'E7 FF E7 E7 E7 FF 00 FF FF FF 00 FF FF FF E7 E7' + 'E7 FF E7 E7 E7 FF D7 D7 D7 FF C0 C0 C0 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF C0 C0 C0 FF 00 00' + '00 3C 00 00 00 0C 00 00 00 00 00 00 00 73 00 00' + '00 FF 7E 7E 7E FF EF EF EF FF D1 D1 D1 FF CF CF' + 'CF FF CB CB CB FF CF CF CF FF D1 D1 D1 FF CE CE' + 'CE FF CF CF CF FF DF DF DF FF F0 F0 F0 FF EC EC' + 'EC FF E1 E1 E1 FF DE DE DE FF DD DD DD FF DC DC' + 'DC FF DB DB DB FF DB DB DB FF DC DC DC FF DD DD' + 'DD FF DE DE DE FF E1 E1 E1 FF EC EC EC FF F1 F1' + 'F1 FF 00 80 80 FF 00 80 80 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF C0 C0 C0 FF 00 00 00 3C 00 00' + '00 0C 00 00 00 00 00 00 00 00 00 00 00 59 00 00' + '00 FF 59 59 59 FF E9 E9 E9 FF D0 D0 D0 FF CD CD' + 'CD FF CD CD CD FF CD CD CD FF CA CA CA FF D6 D6' + 'D6 FF ED ED ED FF E6 E6 E6 FF DC DC DC FF D4 D4' + 'D4 FF D5 D5 D5 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D5 D5 D5 FF D5 D5 D5 FF DB DB' + 'DB FF 00 80 80 FF 00 80 80 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 80 80 80 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 00 00 3C 00 00 00 0C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 00' + '00 FE 40 40 40 FF D7 D7 D7 FF D2 D2 D2 FF CA CA' + 'CA FF CB CB CB FF CA CA CA FF D4 D4 D4 FF E9 E9' + 'E9 FF DC DC DC FF D0 D0 D0 FF D1 D1 D1 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2' + 'D2 FF D2 D2 D2 FF D2 D2 D2 FF D2 D2 D2 FF D1 D1' + 'D1 FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 FF' + 'FF FF 99 99 99 FF C0 C0 C0 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 3C 00 00 00 0C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 25 00 00' + '00 F8 22 22 22 FF B7 B7 B7 FF DB DB DB FF CA CA' + 'CA FF CB CB CB FF CE CE CE FF E4 E4 E4 FF D4 D4' + 'D4 FF CF CF CF FF D1 D1 D1 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF CF FF CD CD' + 'CD FF CE CE CE FF CE CE CE FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF CE CE CE FF CE CE CE FF CE CE' + 'CE FF CE CE CE FF 00 FF FF FF 00 FF FF FF CF CF' + 'CF FF CF CF CF FF 99 99 99 FF C0 C0 C0 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF C0 C0 C0 FF 00 00' + '00 3C 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00' + '00 E1 07 07 07 FF 9F 9F 9F FF DD DD DD FF CC CC' + 'CC FF CD CD CD FF DB DB DB FF D6 D6 D6 FF CE CE' + 'CE FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF CF FF CC CC' + 'CC FF C9 C9 C9 FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF CA CA CA FF CA CA' + 'CA FF CA CA CA FF CA CA CA FF C8 C8 C8 FF CF CF' + 'CF FF 00 80 80 FF 00 80 80 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF C0 C0 C0 FF 00 00 00 3C 00 00' + '00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 B2 00 00 00 FF 83 83 83 FF DD DD DD FF CF CF' + 'CF FF D1 D1 D1 FF DB DB DB FF D1 D1 D1 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0' + 'D0 FF D0 D0 D0 FF D0 D0 D0 FF D0 D0 D0 FF CF CF' + 'CF FF C9 C9 C9 FF C5 C5 C5 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6' + 'C6 FF C6 C6 C6 FF C6 C6 C6 FF C6 C6 C6 FF C7 C7' + 'C7 FF 00 80 80 FF 00 80 80 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 00 00 3C 00 00 00 0C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 80 00 00 00 FF 5F 5F 5F FF DC DC DC FF D1 D1' + 'D1 FF D2 D2 D2 FF D4 D4 D4 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D0 D0 D0 FF C8 C8 C8 FF C3 C3 C3 FF C3 C3' + 'C3 FF C3 C3 C3 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' + 'C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4 C4 FF C4 C4' + 'C4 FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 FF' + 'FF FF 09 09 09 FF C0 C0 C0 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 3D 00 00 00 0C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 4B 00 00 00 FE 41 41 41 FF D8 D8 D8 FF D4 D4' + 'D4 FF D2 D2 D2 FF D0 D0 D0 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3 D3 FF D3 D3' + 'D3 FF D3 D3 D3 FF D3 D3 D3 FF CD CD CD FF C7 C7' + 'C7 FF C4 C4 C4 FF C2 C2 C2 FF C1 C1 C1 FF C0 C0' + 'C0 FF C1 C1 C1 FF C1 C1 C1 FF C1 C1 C1 FF C2 C2' + 'C2 FF C2 C2 C2 FF 00 FF FF FF 00 FF FF FF 99 99' + '99 FF 09 09 09 FF 00 00 00 CF C0 C0 C0 FF 00 00' + '00 40 00 00 00 0E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1A 00 00 00 F2 2C 2C 2C FF CC CC CC FF D6 D6' + 'D6 FF D5 D5 D5 FF CC CC CC FF D5 D5 D5 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6 D6 FF D6 D6' + 'D6 FF D6 D6 D6 FF D6 D6 D6 FF D7 D7 D7 FF D6 D6' + 'D6 FF D5 D5 D5 FF D3 D3 D3 FF CF CF CF FF CC CC' + 'CC FF C9 C9 C9 FF C6 C6 C6 FF C4 C4 C4 FF C2 C2' + 'C2 FF B3 B3 B3 FF BD BD BD FF D0 D0 D0 FF 99 99' + '99 FF 09 09 09 FF 00 00 00 CF 00 00 00 3E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 09 00 00 00 D8 18 18 18 FF B0 B0 B0 FF DB DB' + 'DB FF DB DB DB FF D0 D0 D0 FF D2 D2 D2 FF DB DB' + 'DB FF D9 D9 D9 FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DA DA DA FF DA DA' + 'DA FF DA DA DA FF DA DA DA FF DB DB DB FF DB DB' + 'DB FF DA DA DA FF D9 D9 D9 FF D9 D9 D9 FF CF CF' + 'CF FF C5 C5 C5 FF CC CC CC FF CA CA CA FF 7A 7A' + '7A FF 02 02 02 FF 00 00 00 B8 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 02 00 00 00 BF 08 08 08 FF 97 97 97 FF DC DC' + 'DC FF DF DF DF FF DC DC DC FF CE CE CE FF D6 D6' + 'D6 FF DE DE DE FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DD DD DD FF DD DD DD FF DD DD' + 'DD FF DD DD DD FF DE DE DE FF D8 D8 D8 FF CE CE' + 'CE FF DD DD DD FF DC DC DC FF C6 C6 C6 FF 53 53' + '53 FF 00 00 00 FF 00 00 00 A0 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 A4 00 00 00 FF 77 77 77 FF D3 D3' + 'D3 FF E2 E2 E2 FF E1 E1 E1 FF DE DE DE FF CE CE' + 'CE FF D7 D7 D7 FF E1 E1 E1 FF E2 E2 E2 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0' + 'E0 FF E0 E0 E0 FF E0 E0 E0 FF E0 E0 E0 FF E1 E1' + 'E1 FF E1 E1 E1 FF D9 D9 D9 FF CD CD CD FF DA DA' + 'DA FF E3 E3 E3 FF D9 D9 D9 FF BB BB BB FF 39 39' + '39 FF 00 00 00 FF 00 00 00 7E 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 89 00 00 00 FF 4B 4B 4B FF C9 C9' + 'C9 FF E5 E5 E5 FF E3 E3 E3 FF E4 E4 E4 FF E1 E1' + 'E1 FF D7 D7 D7 FF D2 D2 D2 FF DA DA DA FF E4 E4' + 'E4 FF E5 E5 E5 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4' + 'E4 FF E4 E4 E4 FF E5 E5 E5 FF E5 E5 E5 FF DC DC' + 'DC FF D2 D2 D2 FF D6 D6 D6 FF E0 E0 E0 FF E4 E4' + 'E4 FF E6 E6 E6 FF D6 D6 D6 FF A8 A8 A8 FF 20 20' + '20 FF 00 00 00 FD 00 00 00 4E 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 62 00 00 00 FF 35 35 35 FF BD BD' + 'BD FF E6 E6 E6 FF E6 E6 E6 FF E6 E6 E6 FF E7 E7' + 'E7 FF E7 E7 E7 FF DF DF DF FF D2 D2 D2 FF D3 D3' + 'D3 FF DE DE DE FF E3 E3 E3 FF E3 E3 E3 FF E4 E4' + 'E4 FF E4 E4 E4 FF E4 E4 E4 FF E4 E4 E4 FF E3 E3' + 'E3 FF E3 E3 E3 FF DE DE DE FF D4 D4 D4 FF D1 D1' + 'D1 FF DD DD DD FF E7 E7 E7 FF E7 E7 E7 FF E6 E6' + 'E6 FF E8 E8 E8 FF D4 D4 D4 FF 9A 9A 9A FF 0B 0B' + '0B FF 00 00 00 ED 00 00 00 2C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 2D 00 00 00 F9 1E 1E 1E FF AB AB' + 'AB FF E4 E4 E4 FF ED ED ED FF E7 E7 E7 FF E6 E6' + 'E6 FF EC EC EC FF EB EB EB FF EA EA EA FF E4 E4' + 'E4 FF E0 E0 E0 FF DF DF DF FF DF DF DF FF DD DD' + 'DD FF DC DC DC FF DC DC DC FF DD DD DD FF DF DF' + 'DF FF DF DF DF FF DF DF DF FF E2 E2 E2 FF E9 E9' + 'E9 FF EC EC EC FF EA EA EA FF E5 E5 E5 FF EB EB' + 'EB FF EB EB EB FF D6 D6 D6 FF 8A 8A 8A FF 00 00' + '00 FF 00 00 00 C3 00 00 00 17 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 09 00 00 00 DD 08 08 08 FF 99 99' + '99 FF E4 E4 E4 FF DF DF DF FF BD BD BD FF C1 C1' + 'C1 FF D6 D6 D6 FF EC EC EC FF ED ED ED FF ED ED' + 'ED FF EE EE EE FF EE EE EE FF ED ED ED FF EC EC' + 'EC FF EB EB EB FF EB EB EB FF EC EC EC FF ED ED' + 'ED FF EE EE EE FF EE EE EE FF ED ED ED FF EE EE' + 'EE FF E4 E4 E4 FF C2 C2 C2 FF BE BE BE FF D1 D1' + 'D1 FF EC EC EC FF D4 D4 D4 FF 75 75 75 FF 00 00' + '00 FF 00 00 00 9C 00 00 00 06 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 AE 00 00 00 FF 8D 8D' + '8D FF E0 E0 E0 FF C4 C4 C4 FF B2 B2 B2 FF B8 B8' + 'B8 FF B2 B2 B2 FF EB EB EB FF F1 F1 F1 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0' + 'F0 FF F0 F0 F0 FF F0 F0 F0 FF F0 F0 F0 FF F3 F3' + 'F3 FF D5 D5 D5 FF B0 B0 B0 FF B6 B6 B6 FF B7 B7' + 'B7 FF EB EB EB FF CD CD CD FF 61 61 61 FF 00 00' + '00 FF 00 00 00 85 00 00 00 01 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 80 00 00 00 FF 64 64' + '64 FF CE CE CE FF DD DD DD FF DC DC DC FF D5 D5' + 'D5 FF E4 E4 E4 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9' + 'F9 FF F9 F9 F9 FF F9 F9 F9 FF F9 F9 F9 FF FA FA' + 'FA FF F2 F2 F2 FF DF DF DF FF D8 D8 D8 FF DC DC' + 'DC FF D7 D7 D7 FF B0 B0 B0 FF 34 34 34 FF 00 00' + '00 FF 00 00 00 67 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 44 00 00 00 FF 19 19' + '19 FF 80 80 80 FF BE BE BE FF D3 D3 D3 FF D7 D7' + 'D7 FF DB DB DB FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8 D8 FF D8 D8' + 'D8 FF D9 D9 D9 FF D9 D9 D9 FF D7 D7 D7 FF CD CD' + 'CD FF B0 B0 B0 FF 5D 5D 5D FF 06 06 06 FF 00 00' + '00 ED 00 00 00 2B 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 02 00 00 00 9C 00 00' + '00 FF 0C 0C 0C FF 3D 3D 3D FF 49 49 49 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 48 48 48 FF 48 48' + '48 FF 48 48 48 FF 48 48 48 FF 49 49 49 FF 49 49' + '49 FF 2F 2F 2F FF 02 02 02 FF 00 00 00 FF 00 00' + '00 B9 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00' + '00 7F 00 00 00 F1 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 D6 00 00 00 5C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 2C 00 00 00 7E 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 70 00 00 00 1A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF 80 7F FF 00 00 FF FF' + 'FF 00 7F FF 00 00 FF FF FE 00 0F FF 00 00 FF FF' + 'FC 00 07 FF 00 00 FF FF F8 00 07 FF 00 00 FF FF' + 'F0 00 07 FF 00 00 FF FF E0 00 84 FF 00 00 F0 00' + '00 00 04 7F 00 00 C0 00 00 00 00 7F 00 00 80 00' + '00 00 00 7F 00 00 80 00 00 00 00 0F 00 00 00 00' + '00 00 00 07 00 00 00 00 00 00 00 07 00 00 00 00' + '00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00' + '00 00 00 01 00 00 80 00 00 00 00 03 00 00 80 00' + '00 00 00 07 00 00 80 00 00 00 00 0F 00 00 80 00' + '00 00 00 1F 00 00 C0 00 00 00 00 3F 00 00 C0 00' + '00 00 00 7F 00 00 C0 00 00 00 00 FF 00 00 C0 00' + '00 00 03 FF 00 00 C0 00 00 00 07 FF 00 00 C0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 E0 00' + '00 00 07 FF 00 00 E0 00 00 00 07 FF 00 00 F0 00' + '00 00 07 FF 00 00 F0 00 00 00 0F FF 00 00 F0 00' + '00 00 0F FF 00 00 F0 00 00 00 1F FF 00 00 F8 00' + '00 00 3F FF 00 00 FE 00 00 00 7F FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 0C 00 00 00 3C 80 80 80 FF 80 80 80 FF 00 00' + '00 B4 00 00 00 84 00 80 80 FF 00 80 80 FF 00 00' + '00 90 00 00 00 30 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00' + '00 3C 80 80 80 FF 00 00 00 FF 80 80 80 FF 80 80' + '80 FF 00 00 00 B4 00 FF FF FF 00 80 80 FF 00 00' + '00 90 00 00 00 30 00 00 00 0C 00 00 00 18 00 00' + '00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 0C 00 00 00 3C 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF C0 C0 C0 FF 00 FF FF FF 00 FF FF FF 00 00' + '00 90 00 00 00 30 00 00 00 24 00 00 00 54 00 00' + '00 3C 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0C 00 00 00 3C 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 FF FF FF 00 00' + '00 9C 00 00 00 48 00 80 80 FF 00 00 00 84 00 00' + '00 78 00 00 00 24 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 0C 00 00 00 3C 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 B4 00 00 00 84 00 80 80 FF 00 80 80 FF 00 00' + '00 90 00 00 00 30 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00 00' + '00 3C 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 B4 00 FF FF FF 00 80 80 FF 00 00' + '00 90 00 00 00 30 00 00 00 0C 00 00 00 18 00 00' + '00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 0C 00 00 00 3C 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 FF FF FF 00 FF FF FF 00 00' + '00 90 00 00 00 30 00 00 00 24 00 00 00 54 00 00' + '00 3C 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 24 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 FF FF FF 00 00' + '00 9C 00 00 00 48 00 80 80 FF 00 00 00 84 00 00' + '00 78 00 00 00 24 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 B4 00 00 00 84 00 80 80 FF 00 80 80 FF 00 00' + '00 90 00 00 00 30 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 B4 00 FF FF FF 00 80 80 FF 00 00' + '00 90 00 00 00 30 00 00 00 0C 00 00 00 18 00 00' + '00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 0C 00 00 00 24 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 FF FF FF 00 FF FF FF 00 00' + '00 90 00 00 00 30 00 00 00 24 00 00 00 54 00 00' + '00 3C 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 24 00 00 00 6C 80 80 80 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 FF FF FF 00 00' + '00 9C 00 00 00 48 00 80 80 FF 00 00 00 84 00 00' + '00 78 00 00 00 24 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF C0 C0 C0 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 B4 00 00 00 84 00 80 80 FF 00 80 80 FF 00 00' + '00 90 00 00 00 30 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 B4 00 FF FF FF 00 80 80 FF 00 00' + '00 90 00 00 00 30 00 00 00 0C 00 00 00 18 00 FF' + 'FF FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 00' + '00 48 C0 C0 C0 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 FF FF FF 00 FF FF FF 00 00' + '00 90 00 00 00 30 00 00 00 24 00 00 00 54 00 00' + '00 00 00 FF FF FF 00 FF FF FF 00 00 00 24 00 00' + '00 30 00 00 00 6C C0 C0 C0 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 FF FF FF 00 00' + '00 9C 00 00 00 48 00 80 80 FF 00 00 00 84 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF C0 C0 C0 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 B4 00 00 00 84 00 80 80 FF 00 80 80 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 B4 00 FF FF FF 00 80 80 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF' + 'FF FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 00' + '00 48 C0 C0 C0 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 FF FF FF 00 FF FF FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 FF FF FF 00 FF FF FF 00 00 00 24 00 00' + '00 30 00 00 00 6C C0 C0 C0 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 FF FF FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF C0 C0 C0 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 00 00 00 FF 80 80 80 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF' + 'FF FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 00' + '00 48 C0 C0 C0 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 80 80 80 FF C0 C0 C0 FF 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 FF FF FF 00 FF FF FF 00 00 00 24 00 00' + '00 30 00 00 00 6C C0 C0 C0 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 80 80 80 FF 00 00 00 FF 80 80 80 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF C0 C0 C0 FF 00 00 00 3C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF C0 C0 C0 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 80 80 80 FF 00 00 00 FF 80 80' + '80 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 00 00 3C 00 00 00 0C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 80 80 80 FF 80 80 80 FF 80 80 80 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 3C 00 00 00 0C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF' + 'FF FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 00' + '00 48 C0 C0 C0 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF C0 C0 C0 FF 00 00' + '00 3C 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 FF FF FF 00 FF FF FF 00 00 00 24 00 00' + '00 30 00 00 00 6C C0 C0 C0 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF C0 C0 C0 FF 00 00 00 3C 00 00' + '00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF C0 C0 C0 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF C0 C0 C0 FF 00 00 00 3C 00 00 00 0C 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80' + '80 FF 00 80 80 FF 00 00 00 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF C0 C0' + 'C0 FF 00 00 00 3C 00 00 00 0C 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF' + 'FF FF 00 FF FF FF 00 FF FF FF 00 FF FF FF 00 00' + '00 3C C0 C0 C0 FF 00 00 00 FF C0 C0 C0 FF 00 00' + '00 3C 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 FF FF FF 00 FF FF FF 00 00 00 24 00 00' + '00 0C 00 00 00 00 C0 C0 C0 FF 00 00 00 18 00 00' + '00 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00' + '3F FF FE 00 07 FF FC 00 03 FF F8 00 03 FF F0 00' + '03 FF E0 00 00 7F C0 00 00 3F C0 00 00 3F C0 00' + '00 3F C0 00 00 07 00 00 00 03 00 00 00 03 00 00' + '00 03 00 00 00 00 00 00 00 00 80 00 00 00 F0 00' + '00 00 F0 00 00 00 F0 00 00 00 F8 00 00 00 FF 00' + '00 00 FF 00 00 00 FF 00 00 00 FF 80 00 00 FF F0' + '00 00 FF F0 00 01 FF F0 00 03 FF F8 00 07 FF FF' + '00 0F FF FF 00 1F FF FF 00 3F FF FF 84 7F' +} */ + + + +/* BINRES mycomputer.ico */ +15 ICON mycomputer.ico +/* { + '00 00 01 00 09 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 96 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 3E 09 00 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 A6 0E 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 8E 11 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 B6 12 00 00 30 30 00 00 01 00 04 00 68 06' + '00 00 5E 21 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 C6 27 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 6E 4D 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 16 5E 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 01 00 00 00 02 00 00 00 03 00 00 00 00 00' + '05 00 11 11 11 00 22 22 22 00 33 33 33 00 44 44' + '44 00 55 55 55 00 66 66 66 00 6F 6D 70 00 77 77' + '77 00 7F 7F 7F 00 99 33 00 00 CC 33 00 00 99 66' + '33 00 CC 66 00 00 CC 66 33 00 D0 60 38 00 CC 99' + '33 00 CC 99 66 00 FF 99 66 00 FF CC 66 00 88 88' + '88 00 99 99 99 00 AA AA AA 00 BB BB BB 00 CC 99' + '99 00 CC CC CC 00 DD DD DD 00 FF CC CC 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 15 00 00 00 78 0A 38 00 00 00 38 00 B0 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 96 00 00 00 96 00 00 00 09 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 5E 00 60 00 00 EC FD 7F 1A 02' + '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 5E 00' + '00 00 00 00 00 00 03 00 00 00 66 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 C0 CE' + '0B 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 6D 79 63 6F 6D 70 75 74 65' + '72 2E 69 63 6F 00 14 1A 95 00 1F 3B D4 77 15 00' + '00 00 A8 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 B0 6C' + '38 00 96 00 00 00 00 00 00 00 C9 F1 E7 77 96 00' + '00 00 A4 1A 95 00 09 00 00 00 00 00 00 00 96 00' + '00 00 96 00 00 00 09 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 B0 6C' + '38 00 96 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 22 22 22 22 22 01 01 01 02 02' + '02 03 04 03 22 22 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 22 0B 1B 1A 1A 1A 1A 19 19 19' + '19 18 0D 18 07 22 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 22 05 1E 21 20 1E 1E 1D 1D 1D 1B' + '1B 1B 19 1A 0D 22 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 22 06 20 21 20 20 20 20 1E 1E 1D' + '1D 1D 1A 1A 18 04 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 05 1D 21 21 21 20 20 20 1E 1E' + '1D 1D 1A 1B 0D 22 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 22 19 21 21 21 21 20 1E 1E 1E' + '1E 1D 1B 1D 09 22 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 22 06 1E 21 21 21 20 1A 1B 20' + '1E 1E 1D 19 05 22 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 22 08 20 21 21 21 1E 1E 20' + '20 20 1A 06 22 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 22 07 1B 21 21 21 21 21' + '1E 18 06 22 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 22 03 07 0A 1A 18 09' + '06 22 22 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 22 22 22 22 22 22 22 22 22 22 04 0C 08 22' + '22 22 22 22 22 22 22 22 22 22 00 00 00 00 00 00' + '00 22 06 19 1A 1A 1A 1A 1A 1A 1A 1A 1A 1D 1B 1A' + '19 19 19 19 19 19 19 19 0C 05 22 00 00 00 00 00' + '22 04 1B 21 21 21 21 21 21 21 20 20 20 1E 1E 1E' + '1E 1E 1E 1E 1E 1E 1D 1D 1E 0D 22 00 00 00 00 00' + '22 06 20 21 20 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E' + '1E 1E 1D 1D 1D 1D 1D 1D 1D 1A 04 00 00 00 00 00' + '22 06 20 21 1C 12 12 14 14 15 15 15 15 15 15 15' + '15 15 14 13 12 12 12 1B 1D 1A 04 00 00 00 00 00' + '22 06 20 21 1C 11 12 12 13 14 14 14 14 14 14 14' + '14 13 12 12 12 12 12 1B 1E 1A 04 00 00 00 00 00' + '22 06 20 21 1C 11 12 12 12 13 13 14 14 14 14 13' + '13 12 12 12 12 11 11 1B 1E 1A 04 00 00 00 00 00' + '22 06 20 21 1C 0F 12 12 12 12 12 12 12 12 12 12' + '12 12 12 12 12 11 11 1B 1E 1A 04 00 00 00 00 00' + '22 06 20 21 1C 0E 11 12 12 12 12 12 12 12 12 12' + '12 12 12 11 11 0E 0E 1B 1E 1A 04 00 00 00 00 00' + '22 06 20 21 15 0E 0E 11 11 12 12 12 12 12 12 12' + '12 12 11 0F 0E 0E 0E 1B 1E 1A 03 00 00 00 00 00' + '22 06 20 21 15 0E 0E 11 12 12 12 12 12 12 12 12' + '12 12 12 12 0E 0E 0E 1B 1E 1A 03 00 00 00 00 00' + '22 06 1E 21 15 0E 12 12 12 13 13 14 14 14 14 14' + '13 13 12 12 12 11 0E 1D 20 1A 02 00 00 00 00 00' + '22 06 1E 21 15 11 12 12 13 14 14 14 15 15 15 14' + '14 14 13 12 12 12 11 1B 20 1A 01 00 00 00 00 00' + '22 06 1E 21 15 12 12 13 14 14 15 15 15 15 15 15' + '15 14 14 13 12 12 12 1D 20 1A 01 00 00 00 00 00' + '22 06 1E 21 15 12 13 14 14 15 15 16 16 16 16 16' + '15 15 14 14 13 12 12 1D 21 1A 22 00 00 00 00 00' + '22 06 1E 21 15 12 14 14 15 15 16 16 16 16 16 16' + '16 15 15 14 13 12 12 1F 21 1A 22 00 00 00 00 00' + '22 06 1E 21 15 12 15 15 15 15 15 16 17 17 17 16' + '15 15 15 15 15 12 10 1F 21 1A 22 00 00 00 00 00' + '22 05 1E 21 20 1E 20 20 20 20 20 20 20 20 20 20' + '20 20 20 20 20 1E 1E 21 21 1A 22 00 00 00 00 00' + '22 22 18 21 21 21 21 21 21 21 21 21 21 21 21 21' + '21 21 21 21 21 21 21 21 20 09 22 00 00 00 00 00' + '00 22 05 09 0C 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B' + '0B 0B 0B 0B 0B 0B 0B 0B 08 02 22 00 00 00 00 00' + '00 00 22 22 22 22 22 22 22 22 22 22 22 22 22 22' + '22 22 22 22 22 22 22 22 22 22 00 00 00 00 FF FF' + 'FF FF FF 00 00 FF FF 00 00 FF FE 00 00 FF FE 00' + '00 FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF 80' + '01 FF FF C0 03 FF FF E0 07 FF F0 00 00 0F E0 00' + '00 07 C0 00 00 07 C0 00 00 07 C0 00 00 07 C0 00' + '00 07 C0 00 00 07 C0 00 00 07 C0 00 00 07 C0 00' + '00 07 C0 00 00 07 C0 00 00 07 C0 00 00 07 C0 00' + '00 07 C0 00 00 07 C0 00 00 07 C0 00 00 07 C0 00' + '00 07 C0 00 00 07 E0 00 00 07 F0 00 00 0F 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 01 00 00 00 02 00' + '00 00 03 00 00 00 00 00 05 00 08 00 00 00 11 11' + '11 00 22 22 22 00 33 33 33 00 44 44 44 00 55 55' + '55 00 66 66 66 00 6F 6D 70 00 77 77 77 00 7F 7F' + '7F 00 99 33 00 00 CC 66 00 00 CC 66 33 00 D0 60' + '38 00 CC 66 66 00 CC 99 33 00 CC 99 66 00 FF 99' + '66 00 FF CC 66 00 88 88 88 00 99 99 99 00 AA AA' + 'AA 00 BB BB BB 00 CC 99 99 00 CC CC 99 00 FF CC' + '99 00 CC CC CC 00 DD DD DD 00 EE EE EE 00 FF FF' + 'FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 77 15 00 00 00 78 0A' + '38 00 00 00 38 00 B0 6C 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' + 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 96 00' + '00 00 96 00 00 00 09 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 77 38 9F 07 00 CD 8B F5 77 78 13' + '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 5E 00' + '60 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 40 9F' + '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' + 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' + 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' + 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 77 00 EC FD 7F 5E 00 00 00 00 00 00 00 03 00' + '00 00 66 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 C0 CE 0B 01 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 6D' + '79 63 6F 6D 70 75 74 65 72 2E 69 63 6F 00 14 1A' + '95 00 1F 3B D4 77 15 00 00 00 A8 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 B0 6C 38 00 96 00 00 00 00 00' + '00 00 C9 F1 E7 77 96 00 00 00 A4 1A 95 00 09 00' + '00 00 00 00 00 00 96 00 00 00 96 00 00 00 09 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 B0 6C 38 00 96 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 01 05 05 05 05 05' + '05 01 00 00 00 00 00 00 00 00 0A 1F 1B 1A 1A 19' + '18 08 00 00 00 00 00 00 00 00 0D 22 21 21 20 1F' + '1B 09 00 00 00 00 00 00 00 00 08 21 22 20 20 21' + '1B 07 00 00 00 00 00 00 00 00 00 0A 20 21 21 1B' + '08 00 00 00 00 00 00 00 02 04 04 23 06 0D 0B 06' + '23 05 05 02 00 00 00 03 19 1F 1F 1F 1B 1F 1B 1B' + '1B 1B 1B 0C 23 00 00 06 21 1E 1E 1E 1E 1E 1E 1D' + '1C 15 1D 1B 05 00 00 07 21 15 10 11 12 14 14 11' + '11 10 15 1B 05 00 00 07 21 15 10 11 11 11 11 11' + '11 0F 15 1B 05 00 00 06 21 11 0F 11 11 11 11 11' + '11 0F 15 1B 05 00 00 06 21 13 11 12 14 14 14 14' + '11 10 15 1B 05 00 00 06 20 15 11 14 15 16 15 15' + '14 11 15 1F 05 00 00 06 20 15 14 15 16 17 17 16' + '15 11 1C 1F 04 00 00 05 1F 22 21 21 21 21 21 21' + '21 21 22 1A 23 00 00 00 07 09 09 09 09 09 09 09' + '09 09 09 06 00 00 F0 0F 00 00 F0 0F 00 00 F0 0F' + '00 00 F0 0F 00 00 F8 1F 00 00 C0 03 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 C0 03 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 08 77 77 78 88 88 88 80 00 00 00 00 00 00' + '00 00 07 FF 77 77 77 77 87 80 00 00 00 00 00 00' + '00 00 0F FF FF FF 77 77 77 80 00 00 00 00 00 00' + '00 00 07 FF FF FF 77 77 77 80 00 00 00 00 00 00' + '00 00 08 FF FF FF 77 77 77 80 00 00 00 00 00 00' + '00 00 00 FF FF F7 7F F7 78 00 00 00 00 00 00 00' + '00 00 00 8F FF F7 7F FF 70 00 00 00 00 00 00 00' + '00 00 00 00 7F FF FF 78 00 00 00 00 00 00 00 00' + '00 00 00 00 00 87 88 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 08 80 00 00 00 00 00 00 00 00 00' + '08 77 77 77 77 77 77 88 88 88 88 80 00 00 00 00' + '7F FF FF FF FF FF 7F 77 77 77 77 78 00 00 00 00' + 'FF FF 77 77 77 77 77 77 77 77 77 77 00 00 00 00' + 'FF 73 33 88 87 77 77 88 83 33 37 77 00 00 00 00' + 'FF 73 33 33 88 88 88 83 33 33 37 77 00 00 00 00' + 'FF 73 33 33 33 88 33 33 33 33 37 77 00 00 00 00' + 'FF 73 33 33 33 33 33 33 33 33 37 77 00 00 00 00' + 'FF 83 33 33 33 33 33 33 33 33 37 77 00 00 00 00' + 'FF 83 33 33 33 33 33 33 33 33 37 77 00 00 00 00' + 'FF 83 33 33 33 33 33 33 33 33 37 F7 00 00 00 00' + 'FF 83 33 33 33 38 33 33 33 33 37 F7 00 00 00 00' + 'FF 83 33 33 88 88 88 83 33 33 37 F7 00 00 00 00' + '7F 83 33 88 88 87 88 88 83 33 37 F7 00 00 00 00' + '7F 83 38 88 77 77 77 78 88 33 37 F7 00 00 00 00' + '7F 83 38 88 77 77 77 78 88 33 37 F7 00 00 00 00' + '7F 83 88 87 77 77 77 77 88 83 37 F7 00 00 00 00' + '7F FF FF FF FF FF FF FF FF FF 7F F7 00 00 00 00' + '8F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 00' + '08 88 88 88 88 88 88 88 88 88 88 80 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00' + '00 FF FE 00 00 7F FE 00 00 7F FE 00 00 7F FE 00' + '00 7F FE 00 00 7F FE 00 00 7F FF 00 00 FF FF 00' + '00 FF FF 80 01 FF F0 00 00 0F E0 00 00 07 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 E0 00 00 07 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' + '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '87 77 78 80 00 00 00 00 8F FF 77 78 00 00 00 00' + '0F FF 7F 70 00 00 00 00 08 FF F7 80 00 00 00 00' + '00 08 80 00 00 00 00 87 77 77 77 77 78 00 00 F7' + '77 77 77 78 77 00 00 F8 33 88 83 33 87 00 00 F8' + '33 33 33 33 87 00 00 F3 33 33 33 33 87 00 00 F3' + '38 88 88 33 87 00 00 F8 38 88 88 83 87 00 00 F8' + '88 77 78 83 77 00 00 7F FF FF FF FF F7 00 00 08' + '88 88 88 88 80 00 E0 0F 00 00 E0 07 00 00 E0 07' + '00 00 E0 07 00 00 F0 0F 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 01 00 00 00 02 00 00 00 03 00 00 00 00 00' + '05 00 08 00 00 00 11 11 11 00 22 22 22 00 33 33' + '33 00 44 44 44 00 55 55 55 00 6D 65 5C 00 69 6E' + '65 00 6F 6D 70 00 77 77 77 00 7F 7F 7F 00 99 33' + '00 00 CC 33 00 00 99 66 33 00 98 69 38 00 CC 66' + '00 00 CC 66 33 00 D0 60 38 00 CC 99 33 00 CC 99' + '66 00 FF 99 66 00 FF CC 66 00 88 88 88 00 99 99' + '99 00 AA AA AA 00 BB BB BB 00 CC 99 99 00 FF CC' + '99 00 CC CC CC 00 DD DD DD 00 EE EE EE 00 FF FF' + 'FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 15 00 00 00 78 0A 38 00 00 00 38 00 B0 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 96 00 00 00 96 00 00 00 09 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 5E 00 60 00 00 EC FD 7F 1A 02' + '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 5E 00' + '00 00 00 00 00 00 03 00 00 00 66 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 C0 CE' + '0B 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 6D 79 63 6F 6D 70 75 74 65' + '72 2E 69 63 6F 00 14 1A 95 00 1F 3B D4 77 15 00' + '00 00 A8 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 B0 6C' + '38 00 96 00 00 00 00 00 00 00 C9 F1 E7 77 96 00' + '00 00 A4 1A 95 00 09 00 00 00 00 00 00 00 96 00' + '00 00 96 00 00 00 09 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 B0 6C' + '38 00 96 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 25 25 25 25 25' + '25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25' + '25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 25 25 25 25 25 25' + '25 25 25 25 01 01 01 01 01 02 02 03 04 04 03 25' + '25 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 25 25 07 1C 1E 1E 1D' + '1D 1D 1D 1D 1D 1D 1D 1C 1C 1C 1C 1B 1B 1B 1B 0A' + '03 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 25 25 0A 24 24 23 23' + '22 22 22 22 21 21 21 21 1E 1E 1E 1D 1C 1C 1C 1D' + '07 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 25 25 0F 24 24 23 23' + '22 22 22 22 21 21 21 21 1E 1E 1E 1E 1D 1C 1C 1D' + '09 25 25 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 25 25 1C 24 24 24 23' + '23 23 23 23 23 22 22 22 21 21 21 1E 1D 1D 1D 1E' + '09 25 25 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 25 25 1B 24 24 24 24' + '24 24 24 24 24 23 23 22 22 22 21 21 1E 1D 1D 1E' + '09 25 25 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 25 25 0B 24 24 24 23' + '23 23 22 22 22 22 22 21 21 21 1E 1E 1D 1D 1E 1E' + '07 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 25 08 23 24 24 24' + '24 24 24 23 23 23 23 22 22 22 22 21 1E 1E 1E 1C' + '06 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 25 04 1C 24 24 24' + '24 24 24 24 22 1E 21 22 23 22 22 21 21 1E 1E 09' + '25 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 25 25 06 21 24 24' + '24 24 24 24 1D 1C 1C 21 23 22 22 21 21 22 1B 25' + '25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 25 25 09 21 24' + '24 24 24 24 23 22 22 23 23 23 22 22 22 0E 06 25' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 25 25 08 1E' + '24 24 24 24 24 24 24 24 23 23 23 21 0E 05 25 25' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 25 25 05' + '0A 21 24 24 24 24 24 24 24 22 1C 08 25 25 25 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 25 25' + '25 06 09 0C 1B 1D 1D 0F 0A 08 04 25 25 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 25 25 25 25 25 25 25 25 25 25 25' + '25 25 25 25 04 0F 09 25 25 25 25 25 25 25 25 25' + '25 25 25 25 25 25 25 00 00 00 00 00 00 00 00 00' + '00 00 00 25 25 25 25 25 25 25 25 25 25 25 25 25' + '25 25 25 25 0A 1E 1B 07 25 25 25 25 25 25 25 25' + '25 25 25 25 25 25 25 25 25 00 00 00 00 00 00 00' + '00 00 25 25 04 0A 1D 1D 1D 1D 1D 1D 1D 1D 1D 1D' + '1D 1D 1D 1D 21 21 21 1E 1D 1D 1D 1D 1C 1C 1C 1C' + '1C 1C 1C 1C 1C 1C 08 25 25 00 00 00 00 00 00 00' + '00 00 25 25 0E 24 24 24 24 24 24 24 24 24 23 23' + '23 23 23 23 23 22 22 22 22 22 22 22 22 22 22 22' + '22 21 21 21 21 22 21 08 25 25 00 00 00 00 00 00' + '00 25 25 06 22 24 24 24 23 23 23 23 23 23 23 23' + '23 23 22 22 22 22 22 22 22 22 22 21 21 21 21 21' + '21 21 21 21 1E 1E 22 1D 25 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 23 23 23 23 23 23 23 23 23' + '23 23 23 23 23 23 22 22 22 22 22 22 22 22 22 22' + '22 22 21 22 21 1E 21 1D 04 25 00 00 00 00 00 00' + '00 25 25 09 23 24 24 21 18 18 18 1F 1F 1F 20 20' + '20 20 20 20 20 20 20 20 20 20 20 20 1F 1F 1F 18' + '18 18 18 1F 22 21 21 1D 04 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 14 15 15 15 15 16 17 17' + '17 17 17 18 18 18 17 17 17 17 17 16 15 15 15 15' + '15 14 14 15 22 21 21 1D 04 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 14 15 15 15 15 16 17 17' + '17 17 17 18 18 18 18 17 17 17 17 16 15 15 15 15' + '15 15 14 15 22 21 21 1D 04 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 14 15 15 15 15 15 16 16' + '17 17 17 17 17 17 17 17 17 16 16 15 15 15 15 15' + '15 15 14 15 22 21 21 1D 04 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 14 15 15 15 15 15 15 15' + '16 16 16 17 17 17 16 16 16 15 15 15 15 15 15 15' + '15 14 10 15 22 21 21 1D 04 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 11 14 15 15 15 15 15 15' + '15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15' + '14 14 10 15 22 21 22 1D 04 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 10 14 14 15 15 15 15 15' + '15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 14' + '14 10 10 15 23 21 22 1D 04 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 10 11 14 14 15 15 15 15' + '15 15 15 15 15 15 15 15 15 15 15 15 15 14 14 14' + '10 10 10 15 23 21 22 1D 03 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 10 10 10 14 14 14 14 15' + '15 15 15 15 15 15 15 15 15 15 15 15 14 14 14 10' + '10 10 10 15 23 21 22 1D 03 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 10 10 10 10 14 14 15 15' + '15 15 15 15 15 15 15 15 15 15 15 15 15 14 14 10' + '10 10 10 15 23 22 22 1D 03 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 10 10 10 10 15 15 15 15' + '15 15 15 16 16 16 16 15 15 15 15 15 15 15 15 14' + '10 10 10 15 23 22 22 1D 02 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 1F 10 10 14 15 15 15 15 15' + '16 16 16 17 17 17 17 17 16 16 16 15 15 15 15 15' + '15 10 10 15 23 22 22 1D 02 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 18 10 14 15 15 15 15 16 16' + '17 17 17 17 17 17 17 17 17 17 17 16 15 15 15 15' + '15 15 10 15 23 22 22 1D 02 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 18 10 15 15 15 16 16 17 17' + '17 17 18 18 18 18 18 18 17 17 17 17 16 16 15 15' + '15 15 15 15 23 22 22 1D 01 25 00 00 00 00 00 00' + '00 25 25 08 23 24 24 18 14 15 15 15 16 17 17 17' + '18 18 18 18 18 18 18 18 18 18 17 17 17 17 16 15' + '15 15 15 15 23 22 22 1D 01 25 00 00 00 00 00 00' + '00 25 25 08 22 24 24 18 15 15 15 16 17 17 17 18' + '18 18 18 18 19 19 18 18 18 18 18 18 17 17 17 16' + '15 15 15 15 23 22 23 1D 25 25 00 00 00 00 00 00' + '00 25 25 08 22 24 24 18 15 15 16 17 17 17 18 18' + '18 19 19 19 19 19 19 19 19 18 18 18 18 17 17 16' + '16 15 15 15 23 23 23 1D 25 25 00 00 00 00 00 00' + '00 25 25 08 22 24 24 18 14 16 16 17 17 18 18 18' + '19 19 19 19 19 19 19 19 19 19 18 18 18 17 17 17' + '16 15 15 15 23 24 24 1D 25 25 00 00 00 00 00 00' + '00 25 25 07 22 24 24 18 10 15 17 17 17 18 18 19' + '19 19 19 1A 1A 1A 1A 19 19 19 19 18 18 17 17 17' + '16 15 15 15 23 24 24 1D 25 25 00 00 00 00 00 00' + '00 25 25 07 22 24 24 1F 12 15 18 18 18 18 18 18' + '18 18 18 1A 1A 1A 1A 18 18 18 18 18 18 18 18 18' + '18 15 12 13 24 24 24 1D 25 25 00 00 00 00 00 00' + '00 25 25 07 22 24 24 23 23 23 23 23 23 23 23 23' + '23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 22' + '22 22 22 23 24 24 24 1D 25 25 00 00 00 00 00 00' + '00 25 25 06 21 24 24 24 24 24 24 24 24 24 24 24' + '24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24' + '24 24 24 24 24 24 24 0F 25 25 00 00 00 00 00 00' + '00 00 25 25 0A 22 24 24 24 24 24 24 24 24 24 24' + '24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24' + '24 24 24 24 24 24 1D 07 25 25 00 00 00 00 00 00' + '00 00 25 25 01 08 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F' + '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0E 0E 0E' + '0E 0E 0E 0E 0E 0A 06 25 25 00 00 00 00 00 00 00' + '00 00 00 25 25 25 25 25 25 25 25 25 25 25 25 25' + '25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25' + '25 25 25 25 25 25 25 25 25 00 00 00 00 00 00 00' + '00 00 00 00 00 25 25 25 25 25 25 25 25 25 25 25' + '25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25' + '25 25 25 25 25 25 25 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF F8 00 00 1F FF 00 00 FF F0' + '00 00 0F FF 00 00 FF E0 00 00 0F FF 00 00 FF E0' + '00 00 0F FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' + '00 00 07 FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' + '00 00 0F FF 00 00 FF F0 00 00 0F FF 00 00 FF F0' + '00 00 0F FF 00 00 FF F0 00 00 1F FF 00 00 FF F8' + '00 00 3F FF 00 00 FF FC 00 00 3F FF 00 00 FF FE' + '00 00 7F FF 00 00 FF FF 00 01 FF FF 00 00 FE 00' + '00 00 00 7F 00 00 F8 00 00 00 00 1F 00 00 F0 00' + '00 00 00 1F 00 00 F0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 1F 00 00 F8 00' + '00 00 00 1F 00 00 FE 00 00 00 00 7F 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 04 00 00 00' + '00 00 80 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 87 77 77 77 77 78 88 88 88 88 00' + '00 00 00 00 00 00 00 00 00 00 00 00 08 FF FF FF' + '77 77 77 77 77 88 87 00 00 00 00 00 00 00 00 00' + '00 00 00 00 08 FF FF F7 77 77 77 77 77 78 87 00' + '00 00 00 00 00 00 00 00 00 00 00 00 08 FF FF FF' + 'FF FF 77 77 77 77 77 80 00 00 00 00 00 00 00 00' + '00 00 00 00 08 FF FF FF FF FF FF 77 77 77 77 00' + '00 00 00 00 00 00 00 00 00 00 00 00 08 FF FF FF' + 'F7 77 77 77 77 77 77 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 FF FF FF FF FF FF F7 77 77 78 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 8F FF FF' + 'FF 77 7F FF 77 77 78 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 07 FF FF FF 78 87 FF 77 77 80 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 7F FF' + 'FF F7 FF FF 77 78 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 07 FF FF FF FF FF F7 80 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87' + 'FF FF FF FF 80 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 08 87 78 80 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 08 80 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 87 80 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 08 77 77 77 77 77 77' + '77 77 77 77 77 77 77 78 88 78 00 00 00 00 00 00' + '00 8F FF FF FF FF FF FF FF FF FF FF F7 77 77 77' + '77 77 70 00 00 00 00 00 00 7F FF FF FF FF FF FF' + 'FF F7 77 77 77 77 77 77 77 77 77 00 00 00 00 00' + '00 FF FF FF FF FF FF FF FF FF FF FF F7 77 77 77' + '77 77 77 00 00 00 00 00 00 FF F7 87 77 77 77 77' + '77 77 77 77 77 77 77 78 87 F7 77 00 00 00 00 00' + '00 FF F7 33 33 33 38 88 88 88 88 88 33 33 33 33' + '33 F7 77 00 00 00 00 00 00 FF F7 33 33 33 38 88' + '88 88 88 88 83 33 33 33 33 F7 77 00 00 00 00 00' + '00 FF F7 33 33 33 33 38 88 88 88 83 33 33 33 33' + '33 F7 77 00 00 00 00 00 00 FF F7 33 33 33 33 33' + '33 33 33 33 33 33 33 33 33 F7 77 00 00 00 00 00' + '00 FF F7 33 33 33 33 33 33 33 33 33 33 33 33 33' + '33 F7 77 00 00 00 00 00 00 FF F7 33 33 33 33 33' + '33 33 33 33 33 33 33 33 13 F7 77 00 00 00 00 00' + '00 FF F7 13 33 33 33 33 33 33 33 33 33 33 33 33' + '13 F7 77 00 00 00 00 00 00 FF F7 13 33 33 33 33' + '33 33 33 33 33 33 33 31 13 F7 77 00 00 00 00 00' + '00 FF F8 11 33 33 33 33 33 33 33 33 33 33 33 11' + '13 F7 77 00 00 00 00 00 00 FF F8 11 13 33 33 33' + '33 33 33 33 33 33 33 11 13 F7 77 00 00 00 00 00' + '00 FF F8 11 33 33 33 33 38 88 83 33 33 33 33 33' + '13 F7 F7 00 00 00 00 00 00 FF F8 13 33 33 33 88' + '88 88 88 88 83 33 33 33 33 F7 F7 00 00 00 00 00' + '00 FF F8 33 33 33 88 88 88 88 88 88 88 33 33 33' + '33 F7 F7 00 00 00 00 00 00 FF F8 33 33 38 88 88' + '88 88 88 88 88 83 33 33 33 F7 F7 00 00 00 00 00' + '00 FF F8 33 33 88 88 88 88 77 78 88 88 88 33 33' + '38 FF F7 00 00 00 00 00 00 FF F8 33 38 88 88 87' + '77 77 77 78 88 88 83 33 38 FF F7 00 00 00 00 00' + '00 FF F8 33 38 88 88 77 77 77 77 77 88 88 88 33' + '33 FF F7 00 00 00 00 00 00 FF F8 33 38 88 87 77' + '77 77 77 77 78 88 83 33 33 FF F7 00 00 00 00 00' + '00 FF F8 38 88 88 87 77 77 77 77 77 78 88 88 88' + '38 FF F7 00 00 00 00 00 00 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF F7 00 00 00 00 00' + '00 7F FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF F8 00 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 70 00 00 00 00 00' + '00 00 88 88 88 88 88 88 88 88 88 88 88 88 88 88' + '88 88 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF 00 00 FF F8' + '00 00 1F FF 00 00 FF F0 00 00 0F FF 00 00 FF E0' + '00 00 0F FF 00 00 FF E0 00 00 0F FF 00 00 FF E0' + '00 00 07 FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' + '00 00 07 FF 00 00 FF E0 00 00 0F FF 00 00 FF F0' + '00 00 0F FF 00 00 FF F0 00 00 0F FF 00 00 FF F0' + '00 00 1F FF 00 00 FF F8 00 00 3F FF 00 00 FF FC' + '00 00 3F FF 00 00 FF FE 00 00 7F FF 00 00 FF FF' + '00 01 FF FF 00 00 FE 00 00 00 00 7F 00 00 F8 00' + '00 00 00 1F 00 00 F0 00 00 00 00 1F 00 00 F0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 E0 00 00 00 00 0F 00 00 E0 00' + '00 00 00 0F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 1F 00 00 F8 00 00 00 00 1F 00 00 FE 00' + '00 00 00 7F 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 20 00 00 00 00 00 00 24 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 0C 00 00 00 2F 00 00 00 38 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 38 00 00 00 2A 00 00 00 0B 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 43 00 00 00 B0 00 00 00 F4 00 00 00 F8 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F8 00 00 00 DA 00 00 00 85 00 00 00 28 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00' + '00 E2 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 01 01 01 FF 01 01 01 FF 01 01' + '01 FF 01 01 01 FF 01 01 01 FF 02 02 02 FF 02 02' + '02 FF 03 03 03 FF 04 04 04 FF 04 04 04 FF 03 03' + '03 FF 00 00 00 FF 00 00 00 FF 00 00 00 AF 00 00' + '00 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 65 00 00' + '00 FF 20 20 20 FF 9B 9B 9B FF B9 B9 B9 FF B5 B5' + 'B5 FF B2 B2 B2 FF B0 B0 B0 FF AE AE AE FF AB AB' + 'AB FF A9 A9 A9 FF A7 A7 A7 FF A4 A4 A4 FF A2 A2' + 'A2 FF 9F 9F 9F FF 9C 9C 9C FF 9B 9B 9B FF 96 96' + '96 FF 8C 8C 8C FF 86 86 86 FF 88 88 88 FF 8E 8E' + '8E FF 5A 5A 5A FF 03 03 03 FF 00 00 00 E9 00 00' + '00 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 A6 00 00' + '00 FF 59 59 59 FF FF FF FF FF FA FA FA FF F1 F1' + 'F1 FF EB EB EB FF E4 E4 E4 FF E0 E0 E0 FF DC DC' + 'DC FF D8 D8 D8 FF D4 D4 D4 FF D0 D0 D0 FF CB CB' + 'CB FF C7 C7 C7 FF C3 C3 C3 FF BF BF BF FF BB BB' + 'BB FF B0 B0 B0 FF 9E 9E 9E FF 97 97 97 FF 9E 9E' + '9E FF B0 B0 B0 FF 25 25 25 FF 00 00 00 FD 00 00' + '00 5A 00 00 00 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 C6 00 00' + '00 FF 82 82 82 FF FF FF FF FF F7 F7 F7 FF F1 F1' + 'F1 FF E9 E9 E9 FF E4 E4 E4 FF DF DF DF FF DA DA' + 'DA FF D6 D6 D6 FF D2 D2 D2 FF CE CE CE FF CA CA' + 'CA FF C7 C7 C7 FF C3 C3 C3 FF BF BF BF FF BB BB' + 'BB FF B8 B8 B8 FF A9 A9 A9 FF 9C 9C 9C FF 98 98' + '98 FF AF AF AF FF 3D 3D 3D FF 00 00 00 FF 00 00' + '00 7C 00 00 00 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 00 00 00 D4 00 00' + '00 FF 92 92 92 FF FF FF FF FF FF FF FF FF F9 F9' + 'F9 FF F6 F6 F6 FF F6 F6 F6 FF F3 F3 F3 FF EF EF' + 'EF FF EC EC EC FF E6 E6 E6 FF E1 E1 E1 FF DC DC' + 'DC FF D6 D6 D6 FF D1 D1 D1 FF CC CC CC FF C6 C6' + 'C6 FF C3 C3 C3 FF AF AF AF FF A5 A5 A5 FF A8 A8' + 'A8 FF B6 B6 B6 FF 44 44 44 FF 00 00 00 FF 00 00' + '00 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 B5 00 00' + '00 FF 84 84 84 FF FF FF FF FF FF FF FF FF F7 F7' + 'F7 FF FB FB FB FF FD FD FD FF FC FC FC FF FC FC' + 'FC FF FA FA FA FF F8 F8 F8 FF F1 F1 F1 FF EB EB' + 'EB FF E5 E5 E5 FF DF DF DF FF D9 D9 D9 FF D3 D3' + 'D3 FF CF CF CF FF B5 B5 B5 FF A3 A3 A3 FF AD AD' + 'AD FF BB BB BB FF 3D 3D 3D FF 00 00 00 FF 00 00' + '00 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 88 00 00' + '00 FF 5F 5F 5F FF FF FF FF FF FF FF FF FF FB FB' + 'FB FF EF EF EF FF EE EE EE FF E9 E9 E9 FF E3 E3' + 'E3 FF DF DF DF FF DD DD DD FF DA DA DA FF D5 D5' + 'D5 FF D0 D0 D0 FF CC CC CC FF C7 C7 C7 FF C3 C3' + 'C3 FF BE BE BE FF B0 B0 B0 FF B2 B2 B2 FF B4 B4' + 'B4 FF BA BA BA FF 28 28 28 FF 00 00 00 F7 00 00' + '00 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 34 00 00' + '00 FA 2E 2E 2E FF ED ED ED FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FE FE FE FF FA FA' + 'FA FF F5 F5 F5 FF F4 F4 F4 FF EF EF EF FF EB EB' + 'EB FF E5 E5 E5 FF E0 E0 E0 FF DC DC DC FF D8 D8' + 'D8 FF D2 D2 D2 FF C2 C2 C2 FF BA BA BA FF C1 C1' + 'C1 FF 97 97 97 FF 0A 0A 0A FF 00 00 00 D5 00 00' + '00 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00' + '00 C8 04 04 04 FF 97 97 97 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FD FD FD FF DF DF DF FF BE BE BE FF C4 C4' + 'C4 FF E4 E4 E4 FF E6 E6 E6 FF E1 E1 E1 FF DD DD' + 'DD FF D1 D1 D1 FF C5 C5 C5 FF C2 C2 C2 FF BF BF' + 'BF FF 43 43 43 FF 00 00 00 FF 00 00 00 9A 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 6C 00 00 00 FF 18 18 18 FF D1 D1 D1 FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FE FE FE FF B2 B2 B2 FF 9D 9D 9D FF 98 98' + '98 FF D1 D1 D1 FF ED ED ED FF E5 E5 E5 FF DF DF' + 'DF FF D1 D1 D1 FF CC CC CC FF D5 D5 D5 FF 84 84' + '84 FF 00 00 00 FF 00 00 00 E2 00 00 00 29 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 96 00 00 00 FF 3E 3E 3E FF D1 D1' + 'D1 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF ED ED ED FF DE DE DE FF E1 E1' + 'E1 FF EC EC EC FF EE EE EE FF E7 E7 E7 FF DC DC' + 'DC FF DC DC DC FF D7 D7 D7 FF 7B 7B 7B FF 14 14' + '14 FF 00 00 00 FF 00 00 00 5F 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1A 00 00 00 C6 00 00 00 FF 35 35' + '35 FF C3 C3 C3 FF F9 F9 F9 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FC FC FC FF FC FC' + 'FC FF F7 F7 F7 FF F0 F0 F0 FF EC EC EC FF EB EB' + 'EB FF CF CF CF FF 77 77 77 FF 07 07 07 FF 00 00' + '00 FD 00 00 00 8F 00 00 00 05 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 05 00 00 00 B6 00 00' + '00 FF 08 08 08 FF 58 58 58 FF CB CB CB FF FD FD' + 'FD FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF F9 F9 F9 FF E3 E3 E3 FF 9E 9E' + '9E FF 31 31 31 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00' + '00 0C 00 00 00 14 00 00 00 14 00 00 00 14 00 00' + '00 14 00 00 00 14 00 00 00 0E 00 00 00 1F 00 00' + '00 7B 00 00 00 E9 00 00 00 FF 10 10 10 FF 3E 3E' + '3E FF 69 69 69 FF 89 89 89 FF B1 B1 B1 FF A2 A2' + 'A2 FF 7E 7E 7E FF 57 57 57 FF 2C 2C 2C FF 04 04' + '04 FF 00 00 00 FF 00 00 00 BF 00 00 00 4F 00 00' + '00 14 00 00 00 11 00 00 00 14 00 00 00 14 00 00' + '00 14 00 00 00 14 00 00 00 14 00 00 00 0C 00 00' + '00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 04 00 00 00 4C 00 00 00 8A 00 00' + '00 AD 00 00 00 BB 00 00 00 B9 00 00 00 B9 00 00' + '00 B9 00 00 00 B9 00 00 00 B9 00 00 00 B5 00 00' + '00 AB 00 00 00 D1 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 04 04 04 FF 7E 7E 7E FF 4B 4B' + '4B FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 F1 00 00 00 BA 00 00 00 AF 00 00' + '00 B7 00 00 00 B9 00 00 00 B9 00 00 00 B9 00 00' + '00 B9 00 00 00 B9 00 00 00 B8 00 00 00 A5 00 00' + '00 85 00 00 00 43 00 00 00 0A 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 06 00 00 00 95 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 54 54 54 FF BD BD BD FF 8A 8A' + '8A FF 1B 1B 1B FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 F0 00 00 00 69 00 00 00 0D 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 7A 00 00 00 FF 04 04 04 FF 5A 5A 5A FF A7 A7' + 'A7 FF AD AD AD FF AB AB AB FF AA AA AA FF AA AA' + 'AA FF AA AA AA FF A9 A9 A9 FF A9 A9 A9 FF A8 A8' + 'A8 FF A8 A8 A8 FF A8 A8 A8 FF A7 A7 A7 FF A6 A6' + 'A6 FF A9 A9 A9 FF C5 C5 C5 FF D3 D3 D3 FF C6 C6' + 'C6 FF B4 B4 B4 FF A3 A3 A3 FF A3 A3 A3 FF A3 A3' + 'A3 FF A2 A2 A2 FF A1 A1 A1 FF A1 A1 A1 FF A1 A1' + 'A1 FF A0 A0 A0 FF A0 A0 A0 FF 9F 9F 9F FF 9F 9F' + '9F FF 9E 9E 9E FF A1 A1 A1 FF 94 94 94 FF 31 31' + '31 FF 00 00 00 FF 00 00 00 F6 00 00 00 5C 00 00' + '00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00' + '00 EA 00 00 00 FF 78 78 78 FF FA FA FA FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FE FE FE FF FB FB' + 'FB FF FA FA FA FF F8 F8 F8 FF F7 F7 F7 FF F4 F4' + 'F4 FF F3 F3 F3 FF F2 F2 F2 FF F0 F0 F0 FF EF EF' + 'EF FF EC EC EC FF E6 E6 E6 FF E2 E2 E2 FF E2 E2' + 'E2 FF E3 E3 E3 FF E4 E4 E4 FF E2 E2 E2 FF E0 E0' + 'E0 FF DE DE DE FF DC DC DC FF DB DB DB FF D9 D9' + 'D9 FF D8 D8 D8 FF D6 D6 D6 FF D4 D4 D4 FF D3 D3' + 'D3 FF D0 D0 D0 FF CF CF CF FF DD DD DD FF CB CB' + 'CB FF 39 39 39 FF 00 00 00 FF 00 00 00 AF 00 00' + '00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 78 00 00' + '00 FF 17 17 17 FF DF DF DF FF FF FF FF FF F7 F7' + 'F7 FF F6 F8 F8 FF F5 F6 F8 FF F3 F4 F5 FF F1 F3' + 'F4 FF EF F0 F2 FF ED EF F0 FF EC ED EE FF E9 EA' + 'EB FF E8 E9 EA FF E6 E7 E9 FF E4 E6 E7 FF E2 E3' + 'E4 FF E0 E1 E3 FF DF E0 E1 FF DD DE DF FF DB DC' + 'DD FF D9 DB DC FF D8 D8 D9 FF D6 D7 D8 FF D4 D5' + 'D7 FF D2 D4 D4 FF D0 D1 D3 FF CE D0 D1 FF CD CE' + 'CF FF CB CD CE FF CA CB CD FF C7 C9 CA FF C6 C8' + 'C9 FF C4 C6 C7 FF C2 C3 C3 FF C0 C0 C0 FF D9 D9' + 'D9 FF A4 A4 A4 FF 00 00 00 FF 00 00 00 EE 00 00' + '00 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 39 39 39 FF F0 F0 F0 FF FF FF FF FF F9 F9' + 'F9 FF F6 F0 EB FF F5 EF EA FF F5 EE EA FF F3 EE' + 'E9 FF F3 ED E9 FF F2 EC E8 FF F2 EC E8 FF F0 EC' + 'E6 FF F0 EB E6 FF F0 EA E6 FF EF EA E4 FF ED E8' + 'E4 FF ED E8 E3 FF EC E7 E2 FF EB E6 E1 FF E9 E5' + 'E0 FF E8 E4 DF FF E7 E2 DD FF E6 E1 DC FF E5 DF' + 'DB FF E3 DE D9 FF E2 DD D8 FF E1 DB D6 FF DF DA' + 'D4 FF DE D8 D3 FF DD D7 D2 FF DB D5 D0 FF D9 D3' + 'CE FF DB D5 D2 FF D3 D2 D2 FF C3 C3 C3 FF CB CB' + 'CB FF AE AE AE FF 05 05 05 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 3C 3C 3C FF F1 F1 F1 FF FF FF FF FF FB FF' + 'FF FF E2 CA B9 FF D8 9B 70 FF DC A2 79 FF DE A7' + '7D FF E1 AA 81 FF E3 AF 85 FF E5 B2 88 FF E8 B6' + '8C FF E9 B9 8E FF EB BB 91 FF ED BE 94 FF EE C0' + '95 FF EF C1 96 FF EF C2 97 FF EF C2 97 FF EE C1' + '97 FF EE C0 95 FF EC BE 93 FF EB BB 90 FF E9 B8' + '8E FF E7 B5 8B FF E5 B1 87 FF E3 AE 84 FF E1 AA' + '81 FF DF A6 7D FF DC A2 79 FF D9 9E 75 FF D6 97' + '6E FF E0 AB 8B FF E5 E3 E2 FF C4 C5 C6 FF CC CC' + 'CC FF AB AB AB FF 06 06 06 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 3A 3A 3A FF F1 F1 F1 FF FF FF FF FF FD FF' + 'FF FF D0 A9 90 FF BC 56 11 FF C3 63 1F FF C6 69' + '26 FF CA 70 2C FF CD 76 32 FF D1 7B 37 FF D4 81' + '3D FF D7 86 41 FF D9 89 44 FF DC 8D 48 FF DD 90' + '4A FF DF 92 4D FF DF 93 4D FF DF 93 4D FF DE 91' + '4C FF DD 90 4A FF DB 8C 46 FF D8 88 43 FF D6 83' + '3F FF D3 7E 3A FF D0 78 34 FF CC 73 2F FF C8 6D' + '2A FF C5 67 24 FF C1 61 1E FF BD 5A 17 FF B6 4E' + '0A FF C4 6F 38 FF E5 E2 E0 FF C7 C8 C9 FF CF CF' + 'CF FF AC AC AC FF 05 05 05 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 39 39 39 FF F0 F0 F0 FF FF FF FF FF FF FF' + 'FF FF D1 AC 94 FF BC 5A 19 FF C2 66 26 FF C6 6C' + '2C FF CA 72 32 FF CD 77 37 FF D0 7C 3C FF D3 81' + '40 FF D5 85 44 FF D7 88 47 FF D9 8C 4A FF DA 8E' + '4C FF DC 8F 4D FF DC 90 4E FF DC 90 4E FF DB 8F' + '4D FF DA 8D 4B FF D9 8A 49 FF D6 87 46 FF D4 83' + '42 FF D1 7F 3E FF CE 7A 39 FF CB 75 34 FF C8 70' + '30 FF C5 6A 2B FF C1 64 25 FF BD 5E 1F FF B7 53' + '12 FF C6 73 3F FF E6 E3 E1 FF C8 C9 CA FF D0 D0' + 'D0 FF AC AC AC FF 05 05 05 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 38 38 38 FF F0 F0 F0 FF FF FF FF FF FF FF' + 'FF FF D1 AB 92 FF B9 55 14 FF BF 61 22 FF C3 67' + '28 FF C6 6D 2D FF CA 71 31 FF CC 76 36 FF CF 7B' + '3A FF D1 7E 3D FF D3 81 40 FF D5 85 44 FF D6 87' + '45 FF D7 88 47 FF D7 89 47 FF D7 89 47 FF D7 87' + '47 FF D6 86 45 FF D4 83 42 FF D2 80 3F FF D0 7D' + '3C FF CE 79 38 FF CB 74 34 FF C8 6F 2F FF C5 6A' + '2B FF C2 65 26 FF BE 60 21 FF BA 5A 1B FF B4 4E' + '0F FF C4 70 3C FF E6 E3 E2 FF CA CB CC FF D2 D2' + 'D2 FF AC AC AC FF 05 05 05 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 38 38 38 FF F0 F0 F0 FF FF FF FF FF FF FF' + 'FF FF D0 A9 91 FF B7 51 10 FF BD 5C 1D FF C0 62' + '23 FF C3 67 28 FF C6 6C 2C FF C9 71 30 FF CB 75' + '34 FF CE 78 37 FF CF 7B 3A FF D0 7E 3D FF D1 7F' + '3E FF D2 81 40 FF D3 81 40 FF D2 81 40 FF D2 80' + '3F FF D1 7F 3E FF D0 7C 3C FF CE 79 39 FF CD 76' + '36 FF CA 73 32 FF C7 6E 2E FF C5 6A 2A FF C2 66' + '26 FF BF 60 21 FF BC 5B 1C FF B8 55 17 FF B2 4A' + '0A FF C2 6C 39 FF E7 E4 E3 FF CC CD CE FF D4 D4' + 'D4 FF AB AB AB FF 04 04 04 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 36 36 36 FF EF EF EF FF FF FF FF FF FF FF' + 'FF FF CE A7 8F FF B3 4C 0B FF B9 58 18 FF BC 5D' + '1E FF C0 62 23 FF C3 66 27 FF C5 6A 2B FF C7 6E' + '2E FF C9 71 31 FF CB 74 33 FF CC 76 36 FF CD 78' + '37 FF CE 79 39 FF CE 79 39 FF CE 79 39 FF CE 79' + '38 FF CD 77 37 FF CC 75 35 FF CA 72 32 FF C8 70' + '30 FF C6 6C 2D FF C3 68 29 FF C1 64 25 FF BE 60' + '21 FF BC 5B 1C FF B8 56 18 FF B5 50 12 FF AF 45' + '05 FF BF 68 35 FF E8 E5 E3 FF CD CF D0 FF D6 D6' + 'D6 FF AB AB AB FF 04 04 04 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 36 36 36 FF EE EE EE FF FF FF FF FF FF FF' + 'FF FF CC A4 8C FF B0 46 06 FF B6 51 13 FF B9 57' + '18 FF BC 5B 1D FF BF 60 21 FF C1 64 24 FF C3 67' + '28 FF C5 6A 2B FF C6 6D 2D FF C8 6F 2F FF C9 70' + '30 FF C9 72 32 FF C9 72 32 FF C9 72 32 FF C9 72' + '31 FF C8 70 30 FF C7 6E 2E FF C6 6B 2C FF C4 69' + '2A FF C2 66 26 FF BF 62 22 FF BD 5E 1F FF BA 5A' + '1B FF B8 55 17 FF B5 50 12 FF B2 4B 0D FF AC 40' + '00 FF BC 64 31 FF E9 E5 E4 FF D0 D1 D2 FF D8 D8' + 'D8 FF AA AA AA FF 04 04 04 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 35 35 35 FF ED ED ED FF FF FF FF FF FF FF' + 'FF FF CA A0 88 FF AD 40 00 FF B3 4C 0E FF B5 51' + '13 FF B8 56 17 FF BB 5A 1B FF BD 5D 1E FF BF 61' + '21 FF C0 63 24 FF C1 65 25 FF C2 67 28 FF C3 69' + '29 FF C5 69 2A FF C5 6A 2A FF C5 6A 2A FF C4 69' + '29 FF C4 68 28 FF C2 66 27 FF C0 64 24 FF BF 61' + '22 FF BE 5E 20 FF BC 5B 1D FF BA 58 19 FF B7 54' + '16 FF B5 50 12 FF B2 4B 0D FF AF 46 08 FF A8 3B' + '00 FF BB 62 30 FF EA E7 E5 FF D1 D3 D4 FF D9 D9' + 'D9 FF AA AA AA FF 03 03 03 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 34 34 34 FF EC EC EC FF FF FF FF FF FF FF' + 'FF FF C6 9D 85 FF A9 3A 00 FF AF 46 09 FF B2 4B' + '0E FF B4 4F 12 FF B6 53 15 FF B8 55 17 FF B9 58' + '19 FF BB 5C 1D FF BF 60 22 FF C2 66 27 FF C4 68' + '29 FF C5 6A 2A FF C5 6B 2B FF C5 6B 2B FF C5 6B' + '2B FF C5 69 2A FF C3 68 29 FF C1 65 26 FF BF 60' + '22 FF BB 59 1B FF B7 54 15 FF B4 4F 11 FF B3 4D' + '0F FF B1 4A 0C FF AE 45 08 FF AB 40 03 FF A6 38' + '00 FF BA 61 2F FF EA E7 E6 FF D3 D4 D5 FF DB DB' + 'DB FF A9 A9 A9 FF 03 03 03 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 33 33 33 FF EC EC EC FF FF FF FF FF FF FF' + 'FF FF C4 9A 83 FF A6 37 00 FF AC 40 03 FF AE 45' + '07 FF AF 47 0A FF B3 4D 0F FF B9 57 18 FF BE 5F' + '20 FF C4 68 29 FF C6 6D 2D FF C8 70 30 FF CA 72' + '31 FF CA 73 33 FF CB 74 33 FF CB 74 33 FF CB 73' + '33 FF CA 73 32 FF C9 71 31 FF C8 70 30 FF C7 6D' + '2D FF C4 69 2A FF BF 60 22 FF B8 56 18 FF B3 4D' + '0F FF AC 42 04 FF AA 3F 02 FF A9 3E 01 FF A6 38' + '00 FF BA 61 2F FF EB E8 E6 FF D5 D6 D7 FF DC DC' + 'DC FF A9 A9 A9 FF 03 03 03 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 32 32 32 FF EB EB EB FF FF FF FF FF FF FF' + 'FF FF C3 99 81 FF A6 37 00 FF A9 3D 00 FF A9 3D' + '00 FF B1 49 0C FF C0 63 24 FF C6 6D 2D FF C9 71' + '31 FF CA 74 33 FF CB 75 35 FF CD 78 37 FF CE 79' + '39 FF CF 7B 3A FF CF 7B 3B FF CF 7B 3B FF CF 7B' + '3A FF CE 7A 3A FF CD 79 38 FF CC 76 36 FF CB 74' + '34 FF C9 71 32 FF C7 6E 2F FF C6 6B 2B FF C2 66' + '27 FF B7 54 16 FF AA 40 03 FF A8 3C 00 FF A6 38' + '00 FF BA 61 2F FF EC E9 E7 FF D7 D9 D9 FF DF DF' + 'DF FF A8 A8 A8 FF 02 02 02 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 31 31 31 FF EA EA EA FF FF FF FF FF FF FF' + 'FF FF C2 98 80 FF A5 36 00 FF A8 3C 00 FF B7 55' + '17 FF C4 6A 2A FF C8 70 31 FF CA 73 33 FF CD 76' + '36 FF CE 79 39 FF D0 7C 3B FF D1 7F 3E FF D2 80' + '3F FF D3 82 41 FF D3 83 42 FF D3 83 42 FF D3 82' + '41 FF D3 81 40 FF D2 80 3F FF D0 7D 3C FF CF 7B' + '3A FF CD 78 37 FF CB 74 34 FF C9 71 30 FF C7 6E' + '2E FF C5 6A 2B FF BE 5F 20 FF B0 4A 0C FF A5 36' + '00 FF BA 61 2F FF EC E9 E8 FF D8 DA DA FF E0 E0' + 'E0 FF A7 A7 A7 FF 02 02 02 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 30 30 30 FF E9 E9 E9 FF FF FF FF FF FF FF' + 'FF FF C0 96 7E FF A6 37 00 FF B8 55 17 FF C7 6D' + '2E FF C9 71 31 FF CC 75 35 FF CD 79 39 FF D0 7D' + '3C FF D2 80 3F FF D3 83 42 FF D5 86 44 FF D7 87' + '46 FF D8 89 48 FF D8 8A 48 FF D8 8A 48 FF D8 89' + '48 FF D7 88 47 FF D6 87 45 FF D5 84 43 FF D3 82' + '41 FF D1 7E 3D FF CE 7A 3A FF CD 77 36 FF CA 73' + '33 FF C7 6E 2E FF C5 6B 2B FF C0 63 23 FF AD 41' + '02 FF BA 60 2E FF ED EA E9 FF DA DC DD FF E2 E2' + 'E2 FF A7 A7 A7 FF 02 02 02 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2F 2F 2F FF E8 E8 E8 FF FF FF FF FF FE FF' + 'FF FF BD 92 7B FF AF 45 05 FF C7 6D 2D FF C9 71' + '31 FF CC 76 35 FF CF 7A 3A FF D1 7E 3E FF D4 83' + '42 FF D6 86 46 FF D8 8A 48 FF DA 8D 4B FF DB 8F' + '4D FF DC 90 4E FF DC 91 50 FF DC 91 50 FF DC 91' + '4F FF DC 90 4E FF DA 8E 4C FF D9 8B 49 FF D7 88' + '47 FF D5 84 43 FF D2 80 3F FF D0 7C 3B FF CD 78' + '37 FF CB 73 32 FF C7 6E 2E FF C5 6A 2B FF BC 5B' + '1A FF BD 65 33 FF EE EA E9 FF DC DE DF FF E4 E4' + 'E4 FF A7 A7 A7 FF 01 01 01 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2E 2E 2E FF E7 E7 E7 FF FF FF FF FF FE FF' + 'FF FF BD 93 7B FF BA 57 17 FF C9 71 31 FF CB 74' + '34 FF CE 7A 3A FF D2 7F 3E FF D4 84 43 FF D7 88' + '47 FF DA 8C 4A FF DC 8F 4D FF DE 93 51 FF DF 96' + '54 FF E0 98 56 FF E1 99 56 FF E1 99 56 FF E1 99' + '56 FF E0 97 55 FF DE 94 53 FF DD 91 50 FF DB 8E' + '4C FF D8 8A 48 FF D5 85 44 FF D3 81 40 FF D0 7C' + '3C FF CD 77 37 FF C9 72 32 FF C6 6D 2D FF C2 62' + '21 FF C4 70 3D FF ED EA E8 FF DE DF E0 FF E5 E5' + 'E5 FF A6 A6 A6 FF 01 01 01 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2C 2C 2C FF E5 E5 E5 FF FF FF FF FF FD FF' + 'FF FF BE 96 7E FF C2 64 22 FF CB 74 33 FF CE 79' + '38 FF D1 7F 3E FF D5 84 43 FF D7 89 48 FF DA 8E' + '4C FF DE 92 50 FF E0 96 54 FF E2 9A 58 FF E3 9C' + '5A FF E5 9F 5C FF E6 A0 5D FF E6 A0 5D FF E5 A0' + '5D FF E4 9E 5B FF E3 9B 59 FF E1 98 56 FF DF 94' + '52 FF DC 90 4E FF D8 8B 49 FF D6 86 45 FF D3 81' + '40 FF D0 7C 3B FF CC 77 36 FF C9 70 30 FF C4 68' + '26 FF C8 76 43 FF EE EA E9 FF E1 E2 E3 FF E8 E8' + 'E8 FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2C 2C 2C FF E5 E5 E5 FF FF FF FF FF FD FF' + 'FF FF BC 94 7B FF C4 67 24 FF CD 77 37 FF D0 7C' + '3C FF D4 83 42 FF D7 88 47 FF DB 8D 4C FF DE 93' + '51 FF E1 97 56 FF E3 9C 59 FF E6 A0 5D FF E7 A3' + '60 FF E9 A6 63 FF EA A8 64 FF EA A8 64 FF E9 A7' + '64 FF E8 A5 62 FF E7 A2 5F FF E4 9E 5B FF E2 99' + '57 FF DF 95 53 FF DC 8F 4D FF D8 8A 49 FF D6 86' + '44 FF D2 80 3F FF CF 7A 3A FF CB 74 33 FF C6 6B' + '29 FF C7 76 43 FF F6 F2 F0 FF F4 F5 F6 FF F6 F6' + 'F6 FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2B 2B 2B FF E4 E4 E4 FF FF FF FF FF FD FF' + 'FF FF B7 8D 75 FF BC 5A 19 FF CF 7C 3B FF D2 80' + '3E FF D5 85 44 FF D9 8C 4A FF DD 91 4F FF E0 97' + '55 FF E3 9C 5A FF E6 A1 5E FF E9 A5 63 FF EB A9' + '66 FF ED AD 69 FF EF AF 6B FF EF AF 6C FF EE AF' + '6A FF ED AB 68 FF EA A7 65 FF E7 A3 61 FF E4 9E' + '5C FF E1 99 57 FF DE 93 52 FF DA 8E 4C FF D7 88' + '47 FF D4 82 41 FF D0 7C 3C FF CC 77 36 FF C7 6C' + '2A FF C3 6F 3D FF F7 F3 F2 FF F7 F9 FA FF FC FC' + 'FC FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2A 2A 2A FF E3 E3 E3 FF FF FF FF FF FD FF' + 'FF FF B4 88 70 FF AF 41 01 FF D0 78 34 FF D4 81' + '3E FF D8 87 43 FF DC 8D 49 FF E0 93 4F FF E3 9A' + '55 FF E7 A0 5B FF EB A5 60 FF EE AA 65 FF F1 AF' + '6A FF F3 B3 6E FF F5 B6 70 FF F5 B6 70 FF F4 B5' + '6F FF F2 B2 6C FF F0 AD 67 FF EC A7 62 FF E9 A2' + '5D FF E5 9C 58 FF E1 96 52 FF DE 90 4C FF DA 8A' + '46 FF D6 83 40 FF D2 7D 3A FF CF 78 35 FF C1 5F' + '1B FF BB 5F 2C FF F9 F5 F3 FF F9 FB FB FF FE FE' + 'FE FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 2A 2A 2A FF E3 E3 E3 FF FF FF FF FF FD FF' + 'FF FF B4 95 84 FF A0 4F 23 FF B6 71 43 FF CB 89' + '53 FF CE 8D 57 FF D1 92 5B FF D4 97 61 FF D7 9D' + '66 FF DA A2 6A FF DD A7 6E FF E0 AB 73 FF E4 B0' + '78 FF E6 B4 7B FF E7 B7 7F FF E8 B7 7F FF E6 B6' + '7D FF E5 B2 7A FF E2 AE 76 FF DE A9 71 FF DC A4' + '6C FF D9 9F 68 FF D5 99 63 FF D2 94 5D FF CF 8F' + '59 FF CC 8A 54 FF CA 85 4F FF C3 7E 4A FF A7 5A' + '2C FF B3 73 4F FF FA F8 F7 FF FC FD FD FF FF FF' + 'FF FF A5 A5 A5 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 84 00 00' + '00 FF 26 26 26 FF E1 E1 E1 FF FF FF FF FF FF FF' + 'FF FF EC EC ED FF E6 E6 E7 FF E6 E5 E6 FF E9 E7' + 'E5 FF E9 E7 E5 FF E9 E7 E5 FF E9 E7 E5 FF E9 E7' + 'E5 FF E9 E8 E6 FF E9 E8 E6 FF EA E8 E6 FF EA E8' + 'E6 FF EA E8 E6 FF EA E8 E6 FF EA E8 E6 FF EA E8' + 'E6 FF EA E8 E6 FF EA E8 E6 FF E9 E8 E6 FF E8 E7' + 'E5 FF E8 E6 E4 FF E8 E6 E4 FF E8 E6 E4 FF E8 E6' + 'E4 FF E7 E5 E3 FF E7 E5 E3 FF E6 E4 E3 FF E3 E3' + 'E3 FF E9 E9 E9 FF FC FC FC FF FD FD FD FF FF FF' + 'FF FF A4 A4 A4 FF 00 00 00 FF 00 00 00 F7 00 00' + '00 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 7D 00 00' + '00 FF 0D 0D 0D FF C4 C4 C4 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FE FE FE FF FF FF FF FF FB FB' + 'FB FF 7F 7F 7F FF 00 00 00 FF 00 00 00 F2 00 00' + '00 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 37 00 00' + '00 FB 00 00 00 FF 56 56 56 FF E3 E3 E3 FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FD FD FD FF AF AF' + 'AF FF 21 21 21 FF 00 00 00 FF 00 00 00 B9 00 00' + '00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 8D 00 00 00 FF 01 01 01 FF 2F 2F 2F FF 6D 6D' + '6D FF 7D 7D 7D FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C 7C FF 7C 7C' + '7C FF 7C 7C 7C FF 7C 7C 7C FF 7B 7B 7B FF 7B 7B' + '7B FF 7B 7B 7B FF 7A 7A 7A FF 7A 7A 7A FF 7A 7A' + '7A FF 7A 7A 7A FF 77 77 77 FF 57 57 57 FF 18 18' + '18 FF 00 00 00 FF 00 00 00 FF 00 00 00 57 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 19 00 00 00 B9 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 F5 00 00 00 86 00 00 00 04 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 63 00 00 00 D0 00 00' + '00 F3 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F1 00 00 00 EF 00 00' + '00 B2 00 00 00 3D 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF F8' + '00 00 1F FF 00 00 FF F0 00 00 0F FF 00 00 FF E0' + '00 00 07 FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' + '00 00 03 FF 00 00 FF C0 00 00 03 FF 00 00 FF C0' + '00 00 07 FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' + '00 00 07 FF 00 00 FF E0 00 00 07 FF 00 00 FF E0' + '00 00 0F FF 00 00 FF F0 00 00 0F FF 00 00 FF F8' + '00 00 1F FF 00 00 FF F8 00 00 1F FF 00 00 FF FC' + '00 00 7F FF 00 00 FE 00 00 00 00 7F 00 00 F8 00' + '00 00 00 1F 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' + '00 00 00 07 00 00 F0 00 00 00 00 0F 00 00 F0 00' + '00 00 00 0F 00 00 FC 00 00 00 00 3F 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 20 00 00 00' + '00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 0B 00 00 00 4B 00 00' + '00 63 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 63 00 00' + '00 3D 00 00 00 05 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 04 00 00 00 AF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 01 01 01 FF 01 01' + '01 FF 01 01 01 FF 02 02 02 FF 02 02 02 FF 02 02' + '02 FF 03 03 03 FF 05 05 05 FF 03 03 03 FF 00 00' + '00 FA 00 00 00 80 00 00 00 03 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 3E 00 00 00 FD 6E 6E 6E FF B7 B7' + 'B7 FF AD AD AD FF A9 A9 A9 FF A5 A5 A5 FF A2 A2' + 'A2 FF 9F 9F 9F FF 9B 9B 9B FF 97 97 97 FF 94 94' + '94 FF 8C 8C 8C FF 83 83 83 FF 85 85 85 FF 38 38' + '38 FF 00 00 00 EA 00 00 00 27 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 67 0F 0F 0F FF D8 D8 D8 FF FF FF' + 'FF FF ED ED ED FF E2 E2 E2 FF DB DB DB FF D3 D3' + 'D3 FF CD CD CD FF C8 C8 C8 FF C2 C2 C2 FF BC BC' + 'BC FF B4 B4 B4 FF 9F 9F 9F FF A2 A2 A2 FF 7F 7F' + '7F FF 00 00 00 FD 00 00 00 47 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 72 1B 1B 1B FF E6 E6 E6 FF FF FF' + 'FF FF F6 F6 F6 FF F5 F5 F5 FF F1 F1 F1 FF EC EC' + 'EC FF E4 E4 E4 FF DC DC DC FF D4 D4 D4 FF CC CC' + 'CC FF C5 C5 C5 FF AB AB AB FF AD AD AD FF 90 90' + '90 FF 04 04 04 FF 00 00 00 50 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 56 0D 0D 0D FF D4 D4 D4 FF FF FF' + 'FF FF F7 F7 F7 FF F8 F8 F8 FF F3 F3 F3 FF F0 F0' + 'F0 FF EC EC EC FF E3 E3 E3 FF DA DA DA FF D2 D2' + 'D2 FF CA CA CA FF B0 B0 B0 FF B8 B8 B8 FF 82 82' + '82 FF 00 00 00 F8 00 00 00 32 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 1F 00 00 00 ED 94 94 94 FF FF FF' + 'FF FF FE FE FE FF FD FD FD FF FA FA FA FF F3 F3' + 'F3 FF E5 E5 E5 FF E1 E1 E1 FF E0 E0 E0 FF DA DA' + 'DA FF D1 D1 D1 FF BF BF BF FF C5 C5 C5 FF 52 52' + '52 FF 00 00 00 CD 00 00 00 0D 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 97 29 29 29 FF E4 E4' + 'E4 FF FF FF FF FF FF FF FF FF FF FF FF FF F0 F0' + 'F0 FF AB AB AB FF B4 B4 B4 FF E8 E8 E8 FF E4 E4' + 'E4 FF D5 D5 D5 FF D3 D3 D3 FF 9D 9D 9D FF 0C 0C' + '0C FF 00 00 00 6C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 1C 00 00 00 D8 4C 4C' + '4C FF EC EC EC FF FF FF FF FF FF FF FF FF FA FA' + 'FA FF E2 E2 E2 FF E3 E3 E3 FF F0 F0 F0 FF EA EA' + 'EA FF E6 E6 E6 FF B1 B1 B1 FF 23 23 23 FF 00 00' + '00 B7 00 00 00 08 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 2B 00 00' + '00 D5 33 33 33 FF B4 B4 B4 FF F9 F9 F9 FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FB FB FB FF DC DC' + 'DC FF 89 89 89 FF 1A 1A 1A FF 00 00 00 B6 00 00' + '00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 09 00 00 00 28 00 00' + '00 38 00 00 00 37 00 00 00 37 00 00 00 2C 00 00' + '00 50 00 00 00 CC 03 03 03 FF 31 31 31 FF 67 67' + '67 FF A2 A2 A2 FF 90 90 90 FF 59 59 59 FF 22 22' + '22 FF 00 00 00 FF 00 00 00 B4 00 00 00 41 00 00' + '00 2F 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 27 00 00 00 09 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 32 00 00 00 BE 00 00 00 F7 00 00' + '00 FB 00 00 00 FA 00 00 00 FA 00 00 00 FA 00 00' + '00 F3 00 00 00 F2 00 00 00 FF 00 00 00 FF 05 05' + '05 FF 79 79 79 FF 4C 4C 4C FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FD 00 00 00 F0 00 00 00 F6 00 00' + '00 FA 00 00 00 FA 00 00 00 FA 00 00 00 FB 00 00' + '00 F1 00 00 00 AE 00 00 00 29 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 1B 00 00 00 DB 26 26 26 FF 94 94 94 FF AD AD' + 'AD FF AA AA AA FF A9 A9 A9 FF A7 A7 A7 FF A7 A7' + 'A7 FF A6 A6 A6 FF A4 A4 A4 FF A2 A2 A2 FF AB AB' + 'AB FF CD CD CD FF BF BF BF FF A2 A2 A2 FF 9E 9E' + '9E FF 9E 9E 9E FF 9C 9C 9C FF 9C 9C 9C FF 9B 9B' + '9B FF 9A 9A 9A FF 99 99 99 FF 9B 9B 9B FF 77 77' + '77 FF 11 11 11 FF 00 00 00 C1 00 00 00 14 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 6F 06 06 06 FF C0 C0 C0 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FD FF FF FF FA FD FE FF F7 FA' + 'FC FF F4 F7 F9 FF F1 F4 F6 FF EE F1 F3 FF EA EC' + 'EE FF E2 E4 E6 FF E1 E3 E5 FF E2 E5 E7 FF E1 E2' + 'E5 FF DE E0 E2 FF DA DD DF FF D8 DA DD FF D5 D8' + 'DA FF D3 D6 D8 FF D0 D3 D5 FF CE CF CF FF DD DD' + 'DD FF 81 81 81 FF 00 00 00 FF 00 00 00 4E 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 22 22 22 FF EB EB EB FF FF FF FF FF F3 EA' + 'E4 FF F0 E0 D4 FF EF E1 D6 FF EF E1 D6 FF EF E1' + 'D6 FF EE E1 D6 FF ED E1 D6 FF EC E1 D5 FF EC E0' + 'D5 FF EA DE D3 FF E9 DD D2 FF E7 DA CF FF E5 D8' + 'CD FF E2 D5 CA FF DF D2 C7 FF DD CF C4 FF DB CC' + 'C1 FF D8 C9 BE FF D8 C8 BD FF D2 CE CC FF CB CC' + 'CC FF AB AB AB FF 06 06 06 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 24 24 24 FF EB EB EB FF FF FF FF FF D4 AB' + '8F FF C5 67 26 FF CD 77 39 FF D2 81 42 FF D7 89' + '4A FF DC 91 50 FF E0 97 57 FF E3 9C 5C FF E5 9F' + '5E FF E5 9F 5F FF E4 9E 5D FF E2 9A 5A FF DF 94' + '55 FF DA 8D 4E FF D6 85 47 FF D1 7D 3F FF CC 75' + '37 FF C6 6A 2C FF C5 68 2B FF D8 C3 B5 FF CE D1' + 'D3 FF A9 A9 A9 FF 06 06 06 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 22 22 22 FF EA EA EA FF FF FF FF FF D0 A5' + '89 FF BD 5A 16 FF C6 6A 2A FF CB 73 32 FF D0 7A' + '3A FF D4 82 40 FF D7 87 45 FF DA 8C 49 FF DB 8E' + '4B FF DB 8E 4C FF DA 8D 4A FF D8 89 47 FF D5 84' + '42 FF D2 7E 3C FF CD 76 35 FF C8 6E 2E FF C3 66' + '26 FF BD 5B 1A FF BB 59 1A FF D7 C0 B2 FF D1 D5' + 'D8 FF A9 A9 A9 FF 05 05 05 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 22 22 22 FF EA EA EA FF FF FF FF FF D0 A4' + '88 FF BA 54 12 FF C2 65 25 FF C7 6D 2D FF CB 73' + '34 FF CF 7A 39 FF D2 7F 3E FF D3 82 42 FF D4 84' + '43 FF D5 84 43 FF D4 83 42 FF D2 80 3F FF D0 7C' + '3B FF CD 76 36 FF C8 6F 30 FF C4 68 29 FF BF 60' + '21 FF B9 56 17 FF B8 54 17 FF D8 C1 B3 FF D4 D8' + 'DA FF A9 A9 A9 FF 05 05 05 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 21 21 21 FF E9 E9 E9 FF FF FF FF FF CD A0' + '84 FF B5 4C 0B FF BD 5D 1E FF C1 64 25 FF C5 6B' + '2A FF C9 70 30 FF CB 74 34 FF CD 77 37 FF CD 78' + '38 FF CD 78 38 FF CD 78 37 FF CC 75 35 FF CA 72' + '32 FF C7 6D 2D FF C3 67 27 FF BF 60 21 FF BB 58' + '1A FF B5 4F 10 FF B4 4D 11 FF D8 C0 B2 FF D8 DB' + 'DE FF A9 A9 A9 FF 04 04 04 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 20 20 20 FF E8 E8 E8 FF FF FF FF FF CA 9B' + '80 FF B0 44 02 FF B8 54 15 FF BC 5A 1C FF BF 60' + '21 FF C1 65 25 FF C4 68 28 FF C5 6B 2B FF C6 6C' + '2D FF C6 6D 2D FF C6 6C 2D FF C4 69 2A FF C2 66' + '26 FF C0 61 22 FF BD 5D 1E FF B9 57 19 FF B5 50' + '12 FF B0 47 08 FF B0 46 0A FF D8 C0 B2 FF DA DE' + 'E0 FF A8 A8 A8 FF 04 04 04 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 20 20 20 FF E7 E7 E7 FF FF FF FF FF C6 96' + '7B FF AA 3B 00 FF B2 4A 0D FF B4 4F 11 FF B8 55' + '17 FF BD 5E 1F FF C2 65 25 FF C4 69 2A FF C5 6B' + '2C FF C6 6C 2C FF C6 6C 2C FF C4 69 2A FF C2 65' + '26 FF BE 5E 20 FF B8 55 17 FF B3 4C 0E FF AF 46' + '08 FF AB 3F 01 FF AD 43 06 FF DA C2 B4 FF DE E2' + 'E4 FF A7 A7 A7 FF 03 03 03 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1F 1F 1F FF E6 E6 E6 FF FF FF FF FF C2 93' + '78 FF A5 34 00 FF AB 40 03 FF B6 52 14 FF C1 64' + '26 FF C7 6E 2F FF CA 73 33 FF CC 77 36 FF CD 78' + '38 FF CD 79 38 FF CD 78 38 FF CC 77 37 FF CB 74' + '34 FF C8 6F 30 FF C4 69 2A FF BC 5C 1D FF AF 47' + '0A FF A7 3A 00 FF AC 43 06 FF DB C3 B5 FF E0 E4' + 'E7 FF A7 A7 A7 FF 03 03 03 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1E 1E 1E FF E5 E5 E5 FF FF FF FF FF C1 90' + '76 FF A6 36 00 FF BA 59 1A FF C8 6F 2F FF CC 75' + '35 FF CF 7A 3A FF D1 7F 3E FF D3 82 41 FF D4 83' + '42 FF D4 84 43 FF D4 83 42 FF D3 82 41 FF D1 7E' + '3E FF CF 7A 39 FF CC 75 35 FF C9 70 30 FF C3 67' + '27 FF B3 4D 0E FF AC 42 06 FF DC C4 B6 FF E3 E7' + 'EA FF A7 A7 A7 FF 02 02 02 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1D 1D 1D FF E4 E4 E4 FF FF FF FF FF BE 8E' + '73 FF B7 50 0E FF CA 72 32 FF CD 77 37 FF D1 7D' + '3D FF D4 83 43 FF D8 88 47 FF D9 8C 4B FF DB 8F' + '4D FF DB 8F 4D FF DB 8F 4D FF D9 8C 4B FF D8 88' + '47 FF D4 83 43 FF D1 7D 3D FF CD 76 36 FF C9 70' + '30 FF C4 67 27 FF B5 51 14 FF DC C3 B6 FF E6 EA' + 'EC FF A6 A6 A6 FF 01 01 01 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1C 1C 1C FF E2 E2 E2 FF FF FF FF FF C3 96' + '7A FF C4 65 22 FF CD 76 36 FF D2 7E 3E FF D6 85' + '44 FF DA 8C 4B FF DD 92 50 FF E0 97 54 FF E1 99' + '57 FF E2 99 58 FF E1 99 57 FF E0 97 54 FF DD 92' + '50 FF DA 8C 4B FF D6 85 44 FF D2 7E 3E FF CC 76' + '36 FF C7 6D 2D FF C2 65 27 FF DE C6 B9 FF E8 EB' + 'EE FF A6 A6 A6 FF 01 01 01 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1B 1B 1B FF E1 E1 E1 FF FF FF FF FF C5 9A' + '7E FF C8 6C 28 FF D1 7D 3C FF D6 85 44 FF DA 8D' + '4B FF DF 94 52 FF E3 9B 59 FF E6 A1 5E FF E8 A4' + '62 FF E9 A5 62 FF E8 A4 62 FF E6 A1 5E FF E3 9B' + '59 FF DF 94 52 FF DA 8D 4B FF D6 85 44 FF D0 7D' + '3C FF CA 72 31 FF C7 6D 2E FF E5 CE C1 FF F4 F8' + 'FA FF A7 A7 A7 FF 00 00 00 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1A 1A 1A FF E0 E0 E0 FF FF FF FF FF BC 8D' + '70 FF C7 68 23 FF D4 81 3E FF D9 89 46 FF DE 92' + '4E FF E4 9A 56 FF E9 A2 5E FF ED AA 65 FF F0 AE' + '6A FF F1 B0 6B FF F0 AE 6A FF ED AA 65 FF E9 A2' + '5E FF E4 9A 56 FF DE 92 4E FF D9 89 46 FF D4 80' + '3D FF CE 76 33 FF C2 63 23 FF E9 D0 C2 FF FF FF' + 'FF FF AA AA AA FF 00 00 00 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 1A 1A 1A FF E0 E0 E0 FF FF FF FF FF B5 8D' + '76 FF B4 60 29 FF CF 88 4F FF D4 90 56 FF D9 98' + '5D FF DE A0 65 FF E3 A8 6D FF E7 AF 74 FF EB B5' + '79 FF EC B7 7B FF EB B5 79 FF E7 AF 74 FF E3 A8' + '6D FF DE A0 65 FF D8 98 5D FF D3 90 56 FF CF 87' + '4E FF C7 7C 44 FF B0 5D 2B FF E8 D3 C8 FF FF FF' + 'FF FF AB AB AB FF 00 00 00 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 84 15 15 15 FF DB DB DB FF FF FF FF FF EE EC' + 'EC FF E7 E4 E2 FF EB E7 E4 FF EB E8 E5 FF EC E8' + 'E5 FF EC E9 E6 FF EC E9 E6 FF EC EA E7 FF ED EA' + 'E7 FF ED EA E7 FF ED EA E7 FF EC EA E7 FF EC E9' + 'E6 FF EB E8 E5 FF EA E8 E5 FF EA E7 E4 FF EA E6' + 'E3 FF E8 E4 E2 FF E6 E3 E2 FF F8 F8 F7 FF FF FF' + 'FF FF A7 A7 A7 FF 00 00 00 FF 00 00 00 61 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 6C 00 00 00 FF 8E 8E 8E FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF F4 F4' + 'F4 FF 58 58 58 FF 00 00 00 FD 00 00 00 45 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 16 00 00 00 D5 0A 0A 0A FF 53 53 53 FF 74 74' + '74 FF 72 72 72 FF 72 72 72 FF 72 72 72 FF 72 72' + '72 FF 72 72 72 FF 72 72 72 FF 71 71 71 FF 71 71' + '71 FF 71 71 71 FF 71 71 71 FF 71 71 71 FF 71 71' + '71 FF 71 71 71 FF 71 71 71 FF 71 71 71 FF 70 70' + '70 FF 70 70 70 FF 70 70 70 FF 6F 6F 6F FF 3F 3F' + '3F FF 02 02 02 FF 00 00 00 B2 00 00 00 05 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 28 00 00 00 B1 00 00 00 EF 00 00' + '00 F1 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F0 00 00' + '00 F0 00 00 00 F0 00 00 00 F0 00 00 00 F2 00 00' + '00 E8 00 00 00 97 00 00 00 15 00 00 00 00 00 00' + '00 00 00 00 00 00 FF 00 00 FF FE 00 00 7F FE 00' + '00 7F FE 00 00 7F FE 00 00 7F FE 00 00 7F FE 00' + '00 7F FF 00 00 FF FF 00 00 FF FF 80 01 FF F0 00' + '00 0F E0 00 00 07 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' + '00 03 E0 00 00 07 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 03 01 01' + '01 7C 08 08 08 AD 08 08 08 A8 08 08 08 A8 08 08' + '08 A8 08 08 08 A8 08 08 08 AD 01 01 01 6D 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 31 57 57' + '57 FA CE CE CE FF BB BB BB FF B1 B1 B1 FF A8 A8' + 'A8 FF 9D 9D 9D FF 8D 8D 8D FF 30 30 30 F2 00 00' + '00 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 3A 7B 7B' + '7B FC FF FF FF FF F5 F5 F5 FF EC EC EC FF DD DD' + 'DD FF CA CA CA FF BA BA BA FF 4C 4C 4C F7 00 00' + '00 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 0D 37 37' + '37 D7 F5 F5 F5 FF FF FF FF FF E2 E2 E2 FF D9 D9' + 'D9 FF E6 E6 E6 FF B7 B7 B7 FF 1C 1C 1C C5 00 00' + '00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 45 59 59 59 EB E5 E5 E5 FF F1 F1 F1 FF EA EA' + 'EA FF C2 C2 C2 FF 3B 3B 3B E1 00 00 00 35 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 12 02 02 02 78 06 06 06 96 05 06' + '06 8A 00 00 00 C6 16 16 16 FF 77 77 77 FF 66 66' + '66 FF 11 11 11 FF 00 00 00 BC 07 07 07 89 07 07' + '07 96 02 02 02 73 00 00 00 0E 00 00 00 00 00 00' + '00 00 03 03 03 9C 94 94 93 FF D1 D4 D7 FF C7 CD' + 'D0 FF C3 C7 CA FF B9 BD C0 FF C2 C6 C9 FF BB BF' + 'C2 FF B0 B4 B8 FF B2 B7 BA FF B0 B5 B9 FF B1 B4' + 'B6 FF 6E 6D 6D FF 00 00 00 84 00 00 00 00 00 00' + '00 00 19 19 1A CC EC ED ED FF ED C9 B1 FF E6 B4' + '8F FF EB BF 9B FF ED C4 A0 FF EB C3 9E FF E8 C0' + '9B FF E5 BA 95 FF DD AF 8B FF D4 9E 79 FF D9 B9' + 'A5 FF B9 BB BD FF 09 0A 0A A8 00 00 00 00 00 00' + '00 00 1A 1B 1B CC EB EC ED FF CC 86 58 FF C2 5E' + '17 FF CE 75 30 FF D5 80 3B FF D8 85 40 FF D6 82' + '3D FF D1 78 34 FF C8 6A 26 FF BA 4F 08 FF CC 8E' + '68 FF B8 BC C0 FF 09 09 09 A8 00 00 00 00 00 00' + '00 00 19 1A 1A CC EA EB EC FF C7 81 57 FF B9 53' + '12 FF C2 66 26 FF C7 6E 2E FF CA 71 32 FF C8 6F' + '30 FF C4 68 29 FF BD 5C 1E FF B1 45 04 FF C9 8C' + '68 FF BA BE C1 FF 08 09 09 A8 00 00 00 00 00 00' + '00 00 18 19 1A CC E9 EA EB FF BE 73 4A FF AF 44' + '03 FF C0 62 23 FF C6 6D 2D FF C9 71 31 FF C8 70' + '30 FF C4 69 2A FF BB 5A 1B FF A9 39 00 FF C7 88' + '65 FF BC C1 C4 FF 08 08 08 A8 00 00 00 00 00 00' + '00 00 18 18 19 CC E6 E7 E8 FF C1 7A 4F FF C2 62' + '1F FF D0 7C 3C FF D5 85 44 FF D7 88 47 FF D7 87' + '46 FF D3 81 40 FF CC 76 36 FF BB 57 13 FF CC 8F' + '6C FF BD C1 C4 FF 07 08 08 A8 00 00 00 00 00 00' + '00 00 16 17 18 CC E3 E4 E4 FF CD 8D 60 FF D0 78' + '33 FF DA 8C 49 FF E2 98 54 FF E6 9F 5B FF E4 9C' + '59 FF DE 92 4F FF D6 84 42 FF C9 6B 26 FF DA A2' + '7C FF C1 C5 C8 FF 07 07 07 A8 00 00 00 00 00 00' + '00 00 17 17 18 CC E4 E4 E5 FF CA 90 6A FF D5 89' + '4B FF E1 9F 63 FF EB AE 71 FF F0 B9 7A FF EE B5' + '77 FF E6 A7 6A FF DC 97 5B FF CC 7B 3D FF DF AD' + '8D FF D0 D4 D7 FF 06 07 07 A8 00 00 00 00 00 00' + '00 00 09 09 09 C1 CB CC CC FF FA F6 F4 FF F2 EE' + 'EA FF F4 F0 EC FF F4 F1 EE FF F4 F2 EE FF F4 F2' + 'EE FF F4 F0 ED FF F2 EF EA FF F0 EB E8 FF FD FA' + 'F8 FF AF AF AF FF 00 00 00 9F 00 00 00 00 00 00' + '00 00 00 00 00 4A 1E 1E 1D E2 45 46 47 F3 43 45' + '46 F0 42 43 45 F0 42 43 44 F0 42 43 44 F0 42 43' + '44 F0 42 43 44 F0 42 43 44 F0 42 44 45 F0 41 42' + '43 F4 16 16 16 D9 00 00 00 39 00 00 00 00 E0 0F' + '00 00 E0 07 00 00 E0 07 00 00 E0 07 00 00 F0 0F' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' + '00 00 80 01 00 00 80 01 00 00 80 01 00 00' +} */ + + + + +/* BINRES desktop.ico */ +34 ICON desktop.ico +/* { + '00 00 01 00 09 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 96 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 3E 09 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 A6 0E 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 4E 1F 00 00 10 10 00 00 01 00 04 00 28 01' + '00 00 B6 23 00 00 20 20 00 00 01 00 04 00 E8 02' + '00 00 DE 24 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 C6 27 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 6E 36 00 00 30 30 00 00 01 00 04 00 68 06' + '00 00 16 5C 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 11 11 11 00 33 33 33 00 66 33 00 00 44 44' + '44 00 55 55 55 00 66 66 66 00 77 77 77 00 7F 7F' + '7F 00 99 00 00 00 99 33 00 00 99 33 33 00 CC 33' + '00 00 CC 33 33 00 99 66 00 00 99 66 33 00 CC 66' + '00 00 CC 66 33 00 99 66 66 00 CC 66 66 00 FF 66' + '66 00 99 99 33 00 CC 99 33 00 FF 99 33 00 99 99' + '66 00 CC 99 66 00 FF 99 66 00 CC CC 66 00 FF CC' + '66 00 88 88 88 00 99 99 99 00 AA AA AA 00 BB BB' + 'BB 00 CC 99 99 00 FF 99 99 00 CC CC 99 00 FF CC' + '99 00 99 99 CC 00 CC CC CC 00 DD DD DD 00 FF CC' + 'CC 00 CC FF CC 00 CC CC FF 00 CC FF FF 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 15 00 00 00 78 0A 38 00 00 00 38 00 B0 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 96 00 00 00 96 00 00 00 09 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 58 00 5A 00 00 EC FD 7F 1A 02' + '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' + 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' + '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' + 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' + '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' + '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 58 00' + '00 00 00 00 00 00 03 00 00 00 60 00 1A 02 40 9F' + '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' + 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' + '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' + '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 00 63' + '38 00 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' + '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' + 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' + '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' + '68 65 6C 6C 33 32 5C 64 65 73 6B 74 6F 70 2E 69' + '63 6F 00 93 4B 00 14 1A 95 00 1F 3B D4 77 15 00' + '00 00 A8 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' + 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 B0 6C' + '38 00 96 00 00 00 00 00 00 00 C9 F1 E7 77 96 00' + '00 00 A4 1A 95 00 09 00 00 00 00 00 00 00 96 00' + '00 00 96 00 00 00 09 00 00 00 F4 19 95 00 33 3B' + 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' + 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 B0 6C' + '38 00 96 00 00 00 58 1A 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 00 00 00 2E' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 00 2E 2E' + '04 1F 20 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1E' + '21 1F 1F 1E 1E 1F 1E 1F 1E 1F 06 2E 2E 2E 2E 02' + '2C 2D 2D 2D 2D 2D 2D 2C 2C 2D 2C 2C 2C 2C 28 2C' + '29 27 27 27 27 27 26 26 26 26 27 06 2E 2E 2E 07' + '2D 2D 2D 2D 2D 2D 2C 2D 2C 2A 2D 2C 27 2B 2C 27' + '2A 27 27 29 27 27 2A 27 27 26 26 1E 2E 2E 2E 07' + '2D 2D 28 19 21 1B 22 21 24 24 24 23 24 22 23 24' + '24 22 23 22 21 21 1A 19 23 26 26 1F 2E 2E 2E 1D' + '2D 2D 19 11 10 11 16 16 11 16 13 17 19 16 17 13' + '16 16 11 16 11 10 0B 10 19 26 27 1E 2E 2E 2E 07' + '2D 2D 21 0E 11 11 11 11 11 19 17 19 16 1A 13 16' + '19 11 16 11 10 11 11 0E 13 27 26 1F 2E 2E 2E 07' + '2D 2D 21 10 11 11 0F 11 16 11 11 16 11 16 16 11' + '16 11 11 11 11 0F 10 0C 19 27 26 1E 2E 2E 2E 07' + '2D 2D 19 10 0B 10 11 16 11 11 16 11 16 11 11 16' + '11 11 11 10 0F 10 11 0A 19 26 27 1F 2E 2E 2E 07' + '2D 2D 21 0A 10 0F 10 0D 11 11 0F 11 11 16 11 11' + '11 11 11 11 0C 0A 0C 0E 13 2C 27 1E 2E 2E 2E 07' + '2D 2D 18 0C 0E 0D 11 10 0F 10 11 11 11 11 11 11' + '11 0E 11 0A 12 18 0F 09 16 2A 27 1E 2E 2E 2E 07' + '2D 2D 21 0A 0C 0E 0A 11 11 11 11 16 11 11 11 11' + '11 11 10 0F 2B 2D 1E 0A 13 29 27 1E 2E 2E 2E 07' + '2D 2D 19 0A 0A 0A 11 11 16 11 11 11 16 11 11 16' + '11 16 11 12 27 26 2A 03 16 2C 27 1F 2E 2E 2E 07' + '2D 2D 19 0A 10 11 11 11 11 19 16 11 11 19 11 11' + '17 11 11 0F 20 2C 1E 0A 13 27 27 1E 2E 2E 2E 06' + '2D 2D 21 0A 11 11 16 11 16 16 14 16 19 17 19 16' + '19 11 16 11 11 0F 11 0A 16 2C 2C 1E 2E 2E 2E 07' + '2D 2D 18 10 11 16 11 17 13 16 16 1A 16 19 17 19' + '16 1A 11 15 12 15 0F 11 13 27 2C 1E 2E 2E 2E 06' + '2D 2D 19 11 11 11 16 13 16 19 1A 19 19 1A 19 1A' + '14 16 16 21 20 1F 25 0E 19 2C 2C 1E 2E 2E 2E 07' + '2D 2D 13 11 11 16 19 17 19 17 19 1A 1A 1B 1A 19' + '1B 1A 16 12 2C 27 1F 11 19 2C 2D 1E 2E 2E 2E 06' + '2D 2D 18 11 16 1A 11 19 1A 19 1C 1A 1B 1A 1B 1A' + '1A 19 17 19 20 2C 21 0E 13 2D 2D 1E 2E 2E 2E 06' + '2D 2D 12 10 11 16 19 17 19 1A 19 1C 1A 1C 1A 1B' + '1A 19 19 16 12 0F 15 0D 19 2D 2D 1E 2E 2E 2E 06' + '2D 2D 2C 26 27 27 27 27 27 27 27 27 27 27 27 27' + '27 27 27 28 27 27 28 26 2C 2D 2D 1E 2E 2E 2E 02' + '2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D' + '2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 06 2E 2E 2E 2E' + '05 26 26 27 26 27 27 26 27 26 27 27 26 27 26 27' + '27 26 27 26 27 26 27 26 26 26 1D 2E 2E 2E 2E 2E' + '2E 2E 01 01 01 2E 01 01 01 01 2E 01 01 01 01 2E' + '01 01 01 01 2E 01 01 01 01 2E 2E 2E 2E 00 00 00' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E' + '2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 2E 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF FF FF FF FF FF FF C0 00 00 03 80 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00' + '00 03 FF FF FF FF FF FF FF FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 11 00 00 00 00 11' + '00 00 00 00 11 00 11 11 11 00 33 33 33 00 44 44' + '44 00 55 55 55 00 7F 7F 7F 00 99 33 00 00 CC 33' + '00 00 99 66 00 00 99 66 33 00 CC 66 00 00 CC 66' + '33 00 CC 66 66 00 CC 99 33 00 FF 99 33 00 99 99' + '66 00 CC 99 66 00 FF 99 66 00 FF CC 66 00 99 99' + '99 00 AA AA AA 00 BB BB BB 00 CC 99 99 00 FF 99' + '99 00 CC CC 99 00 FF CC 99 00 CC 99 CC 00 99 CC' + 'CC 00 CC CC CC 00 DD DD DD 00 FF CC CC 00 FF FF' + 'CC 00 FF CC FF 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 DD DD DD 00 FF CC CC 00 CC FF CC 00 CC CC' + 'FF 00 CC FF FF 00 EE EE EE 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' + '95 00 00 00 38 00 A8 44 F9 77 15 00 00 00 78 0A' + '38 00 00 00 38 00 B0 6C 38 00 98 17 95 00 00 00' + '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' + 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 96 00' + '00 00 96 00 00 00 09 00 00 00 B0 18 95 00 00 00' + '00 00 CB 44 F9 77 38 9F 07 00 CD 8B F5 77 78 13' + '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 00 00 00 00 58 00' + '5A 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 40 9F' + '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' + '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' + 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' + '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' + 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' + 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' + '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' + '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' + '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' + 'F5 77 00 EC FD 7F 58 00 00 00 00 00 00 00 03 00' + '00 00 60 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' + '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' + 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' + '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' + '95 00 7F E9 4B 00 00 63 38 00 00 00 00 C0 00 00' + '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' + '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' + '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' + '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 64' + '65 73 6B 74 6F 70 2E 69 63 6F 00 93 4B 00 14 1A' + '95 00 1F 3B D4 77 15 00 00 00 A8 00 00 00 4F 3B' + 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' + 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 1A 95 00 B0 6C 38 00 96 00 00 00 00 00' + '00 00 C9 F1 E7 77 96 00 00 00 A4 1A 95 00 09 00' + '00 00 00 00 00 00 96 00 00 00 96 00 00 00 09 00' + '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' + 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' + '4B 00 F8 00 00 00 B0 6C 38 00 96 00 00 00 58 1A' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 26 26 26 26 26 26 26 26 26 26' + '02 26 26 26 26 26 26 16 1F 1F 18 18 18 18 17 18' + '17 17 17 17 07 26 06 25 25 23 22 24 22 24 20 21' + '20 20 20 20 17 01 06 25 13 10 0E 14 13 13 14 13' + '10 0E 0E 19 18 03 06 25 13 09 10 0E 10 0E 10 0E' + '0E 0E 0B 1C 17 26 06 25 0F 0D 0C 0E 0E 10 0E 0E' + '0E 0B 0A 19 1E 26 06 25 0C 0D 0A 0E 0E 0D 0E 0E' + '0E 17 0C 19 18 26 06 25 0E 09 10 0E 0E 0F 10 0E' + '0C 20 0F 19 1F 26 06 25 0F 0E 0E 10 13 11 13 10' + '0E 0C 0C 1B 1D 02 05 25 13 0E 10 13 14 13 11 13' + '0F 1F 12 1A 18 26 06 25 0E 0E 10 14 10 15 13 11' + '13 17 0E 1B 1F 26 05 25 18 1B 21 1B 20 21 21 20' + '1C 18 1B 24 20 26 04 17 24 24 20 24 24 20 24 20' + '24 24 20 24 07 26 26 26 04 26 04 04 26 04 26 04' + '04 26 04 26 26 26 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 FF FF 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 20 00 00 00 00 00 00 10 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 23 00 00 00 58 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 61 00 00 00 61 00 00 00 61 00 00 00 61 00 00' + '00 3D 00 00 00 08 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 6E 00 00 00 E7 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 01 01 01 FF 01 01 01 FF 01 01' + '01 FF 01 01 01 FF 01 01 01 FF 01 01 01 FF 01 01' + '01 FF 01 01 01 FF 02 02 02 FF 02 02 02 FF 02 02' + '02 FF 02 02 02 FF 02 02 02 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 A7 00 00 00 1D 00 00 00 00 00 00' + '00 5D 00 00 00 FF 47 47 47 FF AA AA AA FF B6 B6' + 'B6 FF B2 B2 B2 FF B1 B1 B1 FF B1 B1 B1 FF AF AF' + 'AF FF AE AE AE FF AE AE AE FF AD AD AD FF AC AC' + 'AC FF AC AC AC FF AB AB AB FF AA AA AA FF A9 A9' + 'A9 FF A8 A8 A8 FF A7 A7 A7 FF A7 A7 A7 FF A5 A5' + 'A5 FF A5 A5 A5 FF A4 A4 A4 FF A3 A3 A3 FF A2 A2' + 'A2 FF A1 A1 A1 FF A2 A2 A2 FF A3 A3 A3 FF 64 64' + '64 FF 05 05 05 FF 00 00 00 AB 00 00 00 0A 00 00' + '00 CF 38 38 38 FF F0 F0 F0 FF FF FF FF FF FF FF' + 'FF FF FE FF FF FF FC FC FC FF F9 FA FA FF F7 F7' + 'F7 FF F4 F5 F5 FF F2 F3 F3 FF F0 F1 F1 FF EE EE' + 'EE FF EC EC EC FF E9 EA EA FF E7 E7 E7 FF E5 E5' + 'E5 FF E3 E3 E3 FF E0 E0 E1 FF DE DE DE FF DC DC' + 'DC FF D9 D9 DA FF D7 D7 D8 FF D5 D5 D5 FF D3 D3' + 'D3 FF D0 D0 D0 FF CE CE CE FF CE CE CE FF DE DE' + 'DE FF 66 66 66 FF 00 00 00 FD 00 00 00 41 00 00' + '00 F2 7C 7C 7C FF FF FF FF FF FA FA FA FF FA FC' + 'FD FF F9 FC FF FF F7 FA FC FF F4 F7 FA FF F3 F6' + 'F8 FF F1 F3 F6 FF EE F1 F4 FF EC EF F2 FF EA ED' + 'F0 FF E8 EB ED FF E7 E9 EC FF E4 E7 E9 FF E2 E5' + 'E8 FF E1 E3 E6 FF DF E2 E4 FF DD E0 E2 FF DB DE' + 'E1 FF D9 DD DF FF D8 DB DD FF D6 D9 DC FF D4 D8' + 'DA FF D3 D6 D9 FF D0 D2 D4 FF C6 C6 C6 FF CF CF' + 'CF FF A3 A3 A3 FF 01 01 01 FF 00 00 00 63 00 00' + '00 F0 7E 7E 7E FF FF FF FF FF FD FE FE FF E2 C8' + 'B7 FF DA A0 77 FF DE A9 82 FF E1 AE 86 FF E4 B2' + '8A FF E6 B6 8F FF E9 BB 92 FF EA BD 95 FF EC C0' + '98 FF ED C2 9A FF EE C3 9A FF EE C2 9A FF EC C1' + '99 FF EB BF 97 FF E9 BC 94 FF E7 B8 90 FF E4 B4' + '8C FF E2 B0 88 FF DF AB 84 FF DC A6 7F FF D9 A1' + '7A FF D4 97 6E FF E0 B8 9F FF D1 D2 D3 FF CE CF' + 'CF FF A2 A2 A2 FF 01 01 01 FF 00 00 00 61 00 00' + '00 F0 7D 7D 7D FF FF FF FF FF FF FF FF FF CC A0' + '82 FF BD 56 0F FF C5 66 23 FF CA 6E 2B FF CE 76' + '31 FF D2 7D 38 FF D6 83 3E FF D9 89 43 FF DC 8D' + '47 FF DE 90 4A FF DF 91 4B FF DF 91 4B FF DD 8F' + '49 FF DB 8C 46 FF D8 87 42 FF D6 81 3C FF D1 7B' + '37 FF CD 73 2F FF C8 6C 28 FF C4 64 21 FF BF 5C' + '1A FF B6 4B 06 FF CD 87 5B FF D4 D7 D8 FF D1 D2' + 'D3 FF A1 A1 A1 FF 01 01 01 FF 00 00 00 61 00 00' + '00 F0 7B 7B 7B FF FF FF FF FF FF FF FF FF CE A3' + '87 FF BD 59 16 FF C4 68 29 FF C8 6F 30 FF CC 76' + '35 FF D0 7C 3B FF D3 81 40 FF D6 86 44 FF D7 89' + '48 FF D9 8C 4A FF DA 8C 4B FF DA 8C 4B FF D9 8B' + '49 FF D7 88 47 FF D4 84 43 FF D2 7F 3F FF CF 7A' + '3A FF CB 74 34 FF C7 6D 2D FF C3 66 27 FF BE 5E' + '20 FF B6 4E 0D FF CD 8A 60 FF D6 D8 DA FF D4 D4' + 'D5 FF A1 A1 A1 FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 7B 7B 7B FF FF FF FF FF FF FF FF FF CD A1' + '85 FF B9 52 11 FF C0 61 23 FF C4 68 2A FF C8 6F' + '2F FF CB 74 34 FF CE 79 38 FF D1 7D 3C FF D2 80' + '3F FF D4 82 42 FF D3 83 42 FF D3 83 42 FF D3 82' + '41 FF D1 7F 3E FF D0 7C 3B FF CD 77 37 FF CA 72' + '33 FF C7 6D 2D FF C3 66 28 FF BF 60 21 FF BB 59' + '1A FF B2 49 07 FF CB 86 5D FF D8 D9 DB FF D6 D7' + 'D7 FF A1 A1 A1 FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 7A 7A 7A FF FF FF FF FF FF FF FF FF CB 9E' + '82 FF B5 4C 0A FF BC 5B 1C FF C0 62 22 FF C4 67' + '28 FF C6 6C 2C FF C9 70 31 FF CB 74 34 FF CD 77' + '37 FF CD 79 39 FF CE 79 39 FF CE 79 39 FF CE 78' + '37 FF CC 76 36 FF CB 73 33 FF C8 6F 2F FF C5 6B' + '2B FF C2 65 26 FF BF 60 21 FF BC 59 1A FF B7 53' + '15 FF AE 42 01 FF C8 82 5A FF DA DC DC FF D7 D8' + 'D8 FF A0 A0 A0 FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 78 78 78 FF FF FF FF FF FF FF FF FF C7 99' + '7E FF B1 46 03 FF B8 54 15 FF BB 5A 1B FF BE 5F' + '20 FF C1 64 25 FF C4 68 29 FF C5 6B 2C FF C7 6D' + '2E FF C8 6F 2F FF C8 6F 2F FF C8 6F 2F FF C7 6E' + '2E FF C6 6C 2C FF C5 6A 2A FF C2 66 27 FF C0 62' + '23 FF BF 5E 1E FF B7 51 10 FF A9 44 05 FF B2 47' + '07 FF AC 3C 00 FF C6 7F 57 FF DC DE DF FF DA DB' + 'DB FF 9F 9F 9F FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 77 77 77 FF FF FF FF FF FF FF FF FF C4 94' + '79 FF AC 3D 00 FF B3 4C 0F FF B7 52 14 FF B9 57' + '18 FF BB 5A 1C FF BE 5E 1F FF BF 62 23 FF C2 65' + '26 FF C4 68 28 FF C5 69 2A FF C5 69 2A FF C4 69' + '29 FF C2 66 27 FF C0 62 24 FF BD 5E 1F FF BC 5A' + '1A FF AE 4E 12 FF 9A 6B 4D FF AB 92 82 FF 96 57' + '32 FF A4 31 00 FF C6 7E 55 FF DE E0 E2 FF DD DE' + 'DE FF 9E 9E 9E FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 76 76 76 FF FF FF FF FF FF FF FF FF C0 90' + '76 FF A8 37 00 FF AF 45 07 FF B1 49 0B FF B3 4D' + '10 FF B9 57 18 FF C1 64 25 FF C5 6B 2B FF C7 6E' + '2E FF C8 70 30 FF C9 71 31 FF C9 71 31 FF C9 71' + '31 FF C8 70 2F FF C6 6C 2D FF C4 69 29 FF C3 5F' + '1C FF 93 5C 39 FF DC E4 EA FF ED F3 F6 FF A8 A9' + 'AB FF 86 2F 03 FF C9 7D 52 FF DF E1 E3 FF DE DF' + 'DF FF 9E 9E 9E FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 75 75 75 FF FF FF FF FF FF FF FF FF BE 8F' + '74 FF A6 35 00 FF AA 3D 01 FF B0 49 0B FF BD 5E' + '1F FF C6 6C 2C FF CA 72 32 FF CC 75 35 FF CD 77' + '37 FF CE 78 39 FF CE 7A 39 FF CE 7A 39 FF CE 79' + '39 FF CD 78 37 FF CC 75 36 FF CB 73 32 FF C9 6B' + '28 FF 96 71 57 FF DC E2 E7 FF D4 D0 CE FF C7 CD' + 'D1 FF 7B 34 0B FF CA 7D 50 FF E0 E3 E5 FF E0 E1' + 'E2 FF 9D 9D 9D FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 73 73 73 FF FF FF FF FF FF FF FF FF BD 8D' + '72 FF A6 34 00 FF B2 4C 0F FF C4 68 28 FF CA 72' + '32 FF CC 76 36 FF CF 79 39 FF D1 7D 3D FF D2 80' + '3F FF D3 82 42 FF D4 83 42 FF D4 83 42 FF D3 82' + '41 FF D2 81 40 FF D1 7E 3E FF D0 7B 3A FF D2 78' + '34 FF 9E 60 33 FF B4 B5 B4 FF E9 EF F2 FF AC A2' + '9C FF 8D 2C 00 FF C8 7E 54 FF E3 E5 E6 FF E2 E4' + 'E4 FF 9C 9C 9C FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 72 72 72 FF FF FF FF FF FF FF FF FF BA 8A' + '6E FF AF 43 05 FF C6 6C 2C FF CB 74 33 FF CE 77' + '37 FF D1 7D 3C FF D3 82 41 FF D6 86 44 FF D7 89' + '48 FF D9 8C 4A FF D9 8C 4B FF D9 8C 4B FF D9 8C' + '4A FF D8 8A 49 FF D7 87 46 FF D4 83 42 FF D2 7F' + '3F FF D2 78 34 FF AC 65 2F FF 9A 63 3B FF AD 59' + '21 FF B7 49 08 FF C4 7D 55 FF E5 E6 E7 FF E5 E6' + 'E7 FF 9B 9B 9B FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 6F 6F 6F FF FF FF FF FF FE FF FF FF BA 8B' + '70 FF BF 5D 1A FF CB 73 33 FF CE 78 38 FF D2 7E' + '3E FF D5 84 43 FF D8 8A 48 FF DB 8E 4C FF DE 92' + '50 FF DE 95 53 FF E0 96 54 FF E0 96 54 FF DF 95' + '53 FF DE 93 51 FF DC 8F 4E FF D9 8B 4A FF D8 86' + '43 FF BD 7D 4A FF A6 75 51 FF AA 75 4E FF 9F 6E' + '44 FF B5 59 18 FF CB 86 5D FF E5 E7 E8 FF E7 E7' + 'E8 FF 9A 9A 9A FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 6E 6E 6E FF FF FF FF FF FC FF FF FF BE 92' + '77 FF C6 67 24 FF CD 77 37 FF D1 7E 3E FF D5 85' + '43 FF D9 8B 4A FF DD 91 4F FF E0 96 54 FF E2 9A' + '58 FF E4 9E 5B FF E5 9F 5D FF E5 9F 5C FF E5 9E' + '5C FF E3 9B 59 FF E0 97 56 FF DE 93 51 FF D9 87' + '42 FF B8 97 7C FF B0 BA C2 FF B0 B5 BA FF A3 AA' + 'A9 FF A9 5B 22 FF D5 91 66 FF E7 E8 E9 FF EA EA' + 'EB FF 9A 9A 9A FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 6C 6C 6C FF FF FF FF FF FC FF FF FF BC 90' + '74 FF C8 6B 27 FF D0 7B 3B FF D4 83 42 FF D8 8A' + '48 FF DD 91 4F FF E1 97 56 FF E4 9E 5B FF E7 A2' + '60 FF EA A6 63 FF EA A9 65 FF EB A9 66 FF EA A7' + '64 FF E8 A4 61 FF E6 9F 5D FF E2 99 58 FF E1 91' + '4B FF B3 8D 6C FF D1 D6 DB FF E0 E3 E4 FF B3 AF' + 'AD FF B5 60 24 FF D4 92 67 FF F4 F6 F7 FF FA FA' + 'FB FF 9B 9B 9B FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 6B 6B 6B FF FF FF FF FF FC FF FF FF B3 82' + '67 FF C4 61 1C FF D4 80 3D FF D7 86 44 FF DC 8D' + '4B FF E0 95 52 FF E5 9C 59 FF E9 A3 60 FF ED AA' + '65 FF F0 AF 6A FF F2 B2 6D FF F2 B3 6D FF F1 B0' + '6C FF EE AC 67 FF EA A5 62 FF E6 9F 5B FF E7 99' + '53 FF B5 81 54 FF C4 C5 C6 FF DA DF E1 FF A6 95' + '89 FF BB 5B 17 FF CC 85 5A FF FA FC FD FF FF FF' + 'FF FF 9B 9B 9B FF 00 00 00 FF 00 00 00 61 00 00' + '00 F0 6A 6A 6A FF FF FF FF FF FD FF FF FF AC 84' + '6D FF AA 52 1C FF CB 80 44 FF D2 88 4A FF D6 8F' + '51 FF DB 96 58 FF DF 9E 60 FF E4 A5 66 FF E8 AC' + '6D FF EC B2 72 FF EE B6 76 FF EE B7 77 FF ED B4' + '74 FF E9 AE 6F FF E5 A8 69 FF E1 A1 62 FF DE 9A' + '5B FF CE 8B 50 FF A9 78 50 FF A5 76 50 FF AD 70' + '41 FF AE 59 20 FF C1 85 64 FF FD FF FF FF FF FF' + 'FF FF 9A 9A 9A FF 00 00 00 FF 00 00 00 61 00 00' + '00 F3 69 69 69 FF FF FF FF FF FF FF FF FF E2 E0' + 'E0 FF DA D6 D4 FF DE DA D6 FF DF DB D7 FF E0 DB' + 'D7 FF E0 DC D8 FF E0 DC D8 FF E1 DD D9 FF E1 DD' + 'D9 FF E1 DE D9 FF E1 DE DA FF E1 DE DA FF E1 DE' + 'DA FF E1 DD D9 FF E1 DD D9 FF E0 DC D8 FF DF DB' + 'D7 FF E1 DC D7 FF E4 DC D4 FF E3 DA D2 FF E1 D9' + 'D3 FF D8 D5 D3 FF E5 E3 E2 FF FE FE FE FF FF FF' + 'FF FF 9B 9B 9B FF 00 00 00 FF 00 00 00 63 00 00' + '00 DE 3A 3A 3A FF F2 F2 F2 FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE FE' + 'FE FF 67 67 67 FF 00 00 00 FF 00 00 00 45 00 00' + '00 7A 01 01 01 FF 5D 5D 5D FF C3 C3 C3 FF D3 D3' + 'D3 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1 D1 FF D1 D1' + 'D1 FF D0 D0 D0 FF D0 D0 D0 FF CF CF CF FF CF CF' + 'CF FF CE CE CE FF CF CF CF FF C9 C9 C9 FF 7B 7B' + '7B FF 0B 0B 0B FF 00 00 00 BF 00 00 00 0A 00 00' + '00 07 00 00 00 98 00 00 00 FD 08 08 08 FF 11 11' + '11 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' + '10 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' + '10 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' + '10 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' + '10 FF 10 10 10 FF 10 10 10 FF 10 10 10 FF 10 10' + '10 FF 10 10 10 FF 11 11 11 FF 0C 0C 0C FF 00 00' + '00 FF 00 00 00 C4 00 00 00 24 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 40 00 00 00 7D 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 59 00 00 00 0A 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF FF FF FF FF FF FF C0 00 00 03 80 00' + '00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 01 C0 00' + '00 03 FF FF FF FF FF FF FF FF FF FF FF FF 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 20 00 00 00' + '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 21 00 00 00 92 05 05' + '05 A8 05 05 05 A8 05 05 05 A8 05 05 05 A8 06 06' + '06 A8 06 06 06 A8 06 06 06 A8 06 06 06 A8 06 06' + '06 A8 07 07 07 A8 07 07 07 A8 06 06 06 A8 00 00' + '00 78 00 00 00 0A 0E 0E 0E B9 98 98 98 FF C9 CB' + 'CC FF C2 C4 C6 FF BF C1 C2 FF BC BE BF FF B8 BA' + 'BC FF B6 B8 B9 FF B4 B5 B7 FF B0 B2 B4 FF AE B1' + 'B2 FF AC AE B0 FF AA AC AE FF AC AC AD FF 55 55' + '55 FF 01 01 01 72 43 43 43 F3 FF FF FF FF FD F5' + 'EF FF F8 EC E3 FF F7 EC E3 FF F5 EB E2 FF F2 E9' + 'E0 FF F0 E7 DE FF ED E4 DB FF E9 DF D6 FF E5 DA' + 'D2 FF E1 D5 CC FF DC D0 C7 FF DB D6 D3 FF B0 B0' + 'B1 FF 08 08 08 AB 48 48 49 F1 FD FE FF FF CF 91' + '67 FF CA 71 31 FF D5 85 47 FF DC 90 52 FF E0 99' + '59 FF E2 9B 5B FF E0 98 59 FF DC 90 51 FF D5 84' + '46 FF CB 76 38 FF C4 66 27 FF D4 B1 9B FF B0 B5' + 'B8 FF 08 08 08 A9 46 47 47 F0 FD FE FF FF C8 84' + '58 FF C0 5D 19 FF CA 71 30 FF D0 7B 39 FF D3 81' + '3F FF D4 83 41 FF D3 80 3E FF CF 7A 38 FF C9 6E' + '2E FF C1 61 1F FF B9 51 10 FF D2 AC 96 FF B2 B7' + 'BA FF 08 08 08 A8 45 46 46 F0 FD FE FF FF C3 7D' + '52 FF B8 52 10 FF C0 64 24 FF C5 6B 2B FF C8 70' + '30 FF C9 71 31 FF C8 6F 2F FF C4 6A 2A FF BF 61' + '21 FF B3 50 12 FF B1 44 04 FF D3 AC 96 FF B3 B9' + 'BC FF 07 07 07 A8 44 45 46 F0 FC FE FE FF BC 72' + '48 FF AE 41 02 FF B8 55 17 FF C0 63 23 FF C5 6A' + '2B FF C6 6C 2D FF C5 6B 2B FF C2 63 23 FF B0 5E' + '28 FF BD A9 9D FF A3 61 3D FF D1 A6 8E FF B5 BB' + 'BD FF 06 06 06 A8 43 43 44 F0 FC FD FD FF B7 6D' + '42 FF B1 47 08 FF C5 6A 2B FF CC 76 36 FF D0 7C' + '3B FF D1 7E 3D FF D0 7C 3C FF CF 76 34 FF B4 71' + '41 FF D1 D5 D6 FF A8 79 5E FF CF A4 8C FF B7 BC' + 'BF FF 06 06 06 A8 41 42 43 F0 FA FA FB FF BE 78' + '4D FF C6 69 26 FF D1 7D 3D FF D6 86 45 FF DA 8D' + '4B FF DB 8F 4E FF DB 8D 4C FF D8 88 46 FF CB 7B' + '3E FF 9F 69 41 FF AB 57 21 FF DA B2 9A FF B7 BC' + 'C0 FF 06 06 06 A8 40 41 41 F0 F7 F8 F9 FF C8 88' + '5C FF CF 77 33 FF D8 89 47 FF DF 95 52 FF E4 9E' + '5A FF E6 A1 5E FF E5 9F 5C FF E2 95 4F FF C8 91' + '63 FF BE BF C0 FF B2 86 65 FF E2 B9 9F FF BA C0' + 'C3 FF 05 05 05 A8 3F 40 40 F0 F7 F7 F8 FF BB 79' + '4D FF CD 75 2F FF D8 8B 47 FF E1 9A 55 FF E9 A6' + '61 FF EC AD 67 FF EA A8 63 FF E5 9C 55 FF C9 8A' + '53 FF B9 AF A6 FF AE 72 49 FF E8 BF A5 FF C5 CB' + 'CE FF 04 04 04 A8 3B 3B 3B F4 FF FF FF FF DB C6' + 'BA FF E2 C5 AE FF E8 CE B7 FF EB D4 BC FF EF D9' + 'C1 FF F1 DC C4 FF EF DA C2 FF EC D5 BD FF E7 CD' + 'B6 FF DF C6 B0 FF D8 BA A7 FF F8 ED E7 FF C8 CA' + 'CB FF 02 02 02 AB 0F 0F 0F C7 AA A9 A9 FF E2 E5' + 'E7 FF DE E3 E6 FF DD E1 E5 FF DD E0 E4 FF DC E0' + 'E3 FF DC DF E3 FF DC E0 E3 FF DD E0 E4 FF DD E1' + 'E4 FF DD E0 E2 FF DE E2 E5 FF D8 DA DB FF 66 66' + '65 FF 00 00 00 78 00 00 00 2E 01 01 01 B1 0F 0F' + '0F CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E' + '0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E 0E CC 0E 0E' + '0E CC 0E 0E 0E CC 0E 0E 0E CC 0C 0C 0C CB 00 00' + '00 8D 00 00 00 0D 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 FF FF 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 04 00 00 00 00 00 80 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 77' + '77 77 77 77 77 80 8F FF FF FF F7 77 77 70 8F 83' + '88 88 88 83 37 70 8F 83 33 38 33 33 37 70 8F 83' + '33 33 33 33 37 70 8F 83 33 33 33 37 37 70 8F 83' + '33 33 33 87 87 70 8F 83 38 88 88 38 37 70 6F 83' + '88 87 88 87 87 70 0F 83 88 77 78 87 87 70 0F 77' + '77 77 77 77 7F 70 07 FF FF F7 FF FF F7 80 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + '00 00 80 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 80 01 00 00 FF FF 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 04 00 00 00' + '00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' + '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' + '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' + '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' + 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 87 77 77 77 77 77 77 77 77' + '77 77 77 77 80 00 00 FF FF FF FF FF FF FF FF F7' + '77 77 77 77 78 00 08 FF FF FF FF FF FF FF FF FF' + '77 77 77 77 77 00 08 FF 77 77 77 77 77 77 77 77' + '77 77 78 77 77 00 08 FF 73 33 33 38 88 88 88 83' + '33 33 33 87 77 00 08 FF 73 33 33 38 88 88 88 83' + '33 33 33 87 77 00 08 FF 73 33 33 33 38 88 83 33' + '33 33 33 87 77 00 08 FF 73 33 33 33 33 33 33 33' + '33 33 33 87 77 00 08 FF 83 33 33 33 33 33 33 33' + '33 33 31 87 78 00 08 FF 81 33 33 33 33 33 33 33' + '33 88 31 8F 78 00 08 FF 81 33 33 33 33 33 33 33' + '33 FF 71 8F 78 00 08 FF 81 13 33 33 33 33 33 33' + '38 F7 71 8F F8 00 08 FF 81 33 33 33 38 88 83 33' + '33 7F 71 8F F8 00 08 FF 83 33 33 88 88 88 88 88' + '33 33 33 8F F8 00 08 FF 83 33 38 88 88 88 88 88' + '88 88 83 8F F8 00 08 FF 83 33 88 88 88 88 88 88' + '88 77 73 8F F8 00 08 FF 83 38 88 88 77 77 77 88' + '88 7F 73 8F F8 00 08 FF 83 38 88 87 77 77 77 78' + '88 77 83 8F F8 00 08 FF 83 88 88 87 77 77 77 77' + '88 88 83 8F F8 00 08 FF F7 77 77 77 77 77 77 77' + '77 77 77 FF F8 00 00 FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF F8 00 00 87 77 77 77 77 77 77 77 77' + '77 77 77 77 80 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF 80 00 00 03 80 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00' + '00 01 80 00 00 03 E0 00 00 0F FF FF FF FF FF FF' + 'FF FF FF FF FF FF 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 11 11 11 00 66 33 00 00 66 33 33 00 66 66' + '33 00 44 44 44 00 55 55 55 00 66 66 66 00 77 77' + '77 00 7F 7F 7F 00 99 33 00 00 99 33 33 00 CC 33' + '00 00 CC 33 33 00 99 66 00 00 99 66 33 00 CC 66' + '00 00 CC 66 33 00 FF 66 33 00 99 66 66 00 CC 66' + '66 00 FF 66 66 00 99 99 33 00 CC 99 33 00 FF 99' + '33 00 FF CC 33 00 99 99 66 00 CC 99 66 00 FF 99' + '66 00 CC CC 66 00 FF CC 66 00 88 88 88 00 99 99' + '99 00 AA AA AA 00 BB BB BB 00 CC 99 99 00 FF 99' + '99 00 99 CC 99 00 CC CC 99 00 FF CC 99 00 99 CC' + 'CC 00 CC CC CC 00 DD DD DD 00 FF CC CC 00 FF FF' + 'CC 00 CC CC FF 00 FF CC FF 00 CC FF FF 00 EE EE' + 'EE 00 FF FF FF 00 00 00 00 00 A8 44 F9 77 21 00' + '00 00 B8 0C 38 00 00 00 38 00 F0 B5 0C 01 14 17' + '95 00 00 00 00 00 5C 19 95 00 28 52 0C 01 68 19' + '95 00 77 82 F5 77 98 7F F5 77 3A 8A F5 77 00 04' + '00 00 90 A2 AF 00 10 00 00 00 10 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' + 'F9 77 15 00 00 00 78 0A 38 00 00 00 38 00 B0 6C' + '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' + 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' + 'F5 77 3A 8A F5 77 96 00 00 00 96 00 00 00 09 00' + '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' + '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' + '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 28 81 0C 01 10 AE 0C 01 20 81' + '0C 01 78 01 38 00 78 01 38 00 38 02 38 00 38 56' + '0C 01 01 00 00 00 03 00 00 00 38 02 38 00 F0 56' + '0C 01 F0 56 0C 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' + '00 00 00 00 00 00 58 00 5A 00 30 56 0C 01 30 56' + '0C 01 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' + 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 28 52' + '0C 01 A4 18 95 00 E5 3A F8 77 18 00 00 00 30 56' + '0C 01 00 00 38 00 28 52 0C 01 00 00 00 00 78 19' + '95 00 CA 8C F5 77 78 01 38 00 BE 8E F5 77 08 06' + '38 00 37 90 F5 77 30 52 0C 01 30 52 0C 01 40 00' + '00 00 40 00 00 00 01 00 00 00 18 00 00 00 00 00' + '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' + '95 00 00 00 00 00 00 00 00 00 00 00 00 00 28 52' + '0C 01 28 52 0C 01 01 01 F5 77 78 01 38 00 30 52' + '0C 01 20 81 0C 01 28 81 0C 01 78 01 38 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 BE B3' + 'E7 77 28 52 0C 01 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 08 04 00 00 99 00' + '00 00 08 04 00 00 08 01 00 00 00 00 00 00 00 00' + '00 00 00 00 01 01 00 00 38 00 BC 18 95 00 C0 18' + '95 00 B0 19 95 00 F0 88 FA 77 88 1C F5 77 FF FF' + 'FF FF 37 90 F5 77 81 E9 49 00 00 00 38 00 00 00' + '00 00 30 52 0C 01 30 52 0C 01 A4 1A 95 00 40 00' + '00 00 40 00 00 00 B8 10 E9 77 FF FF FF FF C9 F1' + 'E7 77 16 EA 4B 00 F8 00 00 00 B4 1A 95 00 DC E3' + '49 00 E0 A3 4E 00 FF FF FF FF 10 00 00 00 10 DA' + '4B 00 30 52 0C 01 71 CC 43 00 30 52 0C 01 F0 B5' + '0C 01 A4 1A 95 00 90 A2 AF 00 C4 F5 AF 00 06 00' + '00 00 F0 B5 0C 01 0F 02 00 00 70 52 0C 01 10 00' + '00 00 00 00 00 00 20 00 00 00 30 52 0C 01 40 00' + '00 00 10 00 00 00 00 01 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 10 00 00 00 10 00 00 00 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 20 00 00 00' + '00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 00 00 00 00 00 00' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 00 00 00 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 00 32 32' + '32 32 05 08 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F' + '1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F' + '1F 1F 1F 1F 1F 1F 1F 08 06 32 32 32 32 32 32 32' + '32 1F 31 31 31 31 31 31 31 31 30 31 30 30 30 30' + '30 30 30 2A 30 2A 30 2A 2A 2A 2A 2A 2A 2A 2A 2A' + '29 2A 29 29 29 29 29 29 30 20 01 32 32 32 32 32' + '05 31 31 31 30 31 30 30 30 30 30 30 30 30 2A 30' + '30 2A 2A 30 2A 2A 2A 2A 2A 2A 2A 29 2A 29 29 29' + '29 29 29 29 29 29 22 29 22 30 07 32 32 32 32 32' + '08 31 31 30 31 30 30 31 30 30 30 30 30 2A 30 2A' + '2A 30 2A 2A 2A 2A 2B 2A 2A 29 2A 29 2A 29 29 29' + '29 29 29 29 29 22 29 22 22 2A 21 32 32 32 32 32' + '20 31 31 31 31 31 31 31 31 31 31 31 30 31 31 31' + '2E 2F 31 30 30 31 2F 30 30 31 2A 2C 2D 31 30 30' + '30 30 30 2A 2E 2C 2A 29 29 29 21 32 32 32 32 32' + '1F 31 31 31 2A 1B 1C 1B 1B 1B 23 1B 24 27 1B 26' + '1E 24 1E 26 24 1D 24 27 1E 23 27 24 1E 23 1C 1D' + '23 1B 1B 1C 1B 1B 2A 29 22 2A 21 32 32 32 32 32' + '1F 31 31 31 29 11 0E 11 11 17 11 17 17 11 1C 11' + '1B 18 1B 1C 17 1C 1B 17 15 17 11 1B 11 17 11 11' + '10 11 11 0E 10 0B 2B 29 29 29 21 32 32 32 32 32' + '1F 31 31 31 2A 11 11 11 11 11 17 11 11 1B 17 1C' + '17 1B 14 17 1C 14 18 1B 17 17 1C 11 17 11 17 11' + '11 0F 11 10 0B 10 29 29 29 29 21 32 32 32 32 32' + '1F 31 31 31 2A 0F 10 11 11 11 11 17 11 11 17 11' + '1C 17 17 1C 17 17 1B 12 1B 11 17 1B 11 17 11 11' + '11 11 10 0B 10 11 26 29 29 2A 21 32 32 32 32 32' + '1F 31 31 31 29 10 0F 11 10 11 17 11 11 17 11 1B' + '17 11 1C 11 17 1B 12 1B 11 1B 11 11 17 11 11 11' + '11 10 0F 11 10 0A 2B 29 29 2A 21 32 32 32 32 32' + '1F 31 31 31 2A 11 10 0B 11 11 11 11 17 11 17 11' + '11 1B 11 17 14 11 17 11 17 11 17 11 11 11 11 10' + '11 0F 10 0A 0D 0E 29 2A 29 29 21 32 32 32 32 32' + '1F 31 31 31 2D 10 0B 10 0F 10 11 0E 11 11 11 11' + '17 11 17 11 11 17 11 17 11 17 11 0F 10 11 11 11' + '0E 11 0C 11 0E 0C 2B 29 29 2A 21 32 32 32 32 32' + '1F 31 31 31 2B 0F 10 11 0C 0F 11 11 11 11 11 11' + '11 17 11 11 17 11 17 11 11 11 11 11 11 11 0E 11' + '0D 0E 11 0A 10 0A 29 2A 29 2A 21 32 32 32 32 32' + '1F 31 31 31 29 0F 0C 0B 0E 11 0C 11 10 0F 11 11' + '11 0E 11 17 11 11 11 0F 11 11 10 11 0F 10 11 11' + '0E 10 0A 10 0A 0A 2B 2A 29 2A 21 32 32 32 32 32' + '1F 31 31 31 29 10 0A 10 0C 0F 11 0E 11 10 11 0E' + '11 11 11 10 0F 11 10 11 10 0F 11 11 10 0B 10 0A' + '0B 03 0A 0A 0C 0E 29 2A 2A 2A 20 32 32 32 32 32' + '1F 31 31 31 2A 0A 0E 0C 0F 10 0A 10 0F 0D 0E 11' + '11 11 11 11 11 11 11 11 11 11 11 10 0F 10 0A 1F' + '22 2A 25 0B 0A 0A 27 2A 29 2A 21 32 32 32 32 32' + '08 31 31 31 29 0B 0C 0E 0A 0C 11 0A 10 11 11 11' + '11 17 11 11 17 11 11 17 11 11 11 11 11 11 04 30' + '31 30 29 07 0A 0A 29 2A 29 30 20 32 32 32 32 32' + '1F 31 31 31 29 10 0A 0A 0C 0F 0A 11 11 17 11 11' + '11 11 17 11 11 17 11 11 11 17 11 11 11 10 13 30' + '29 20 30 08 0A 0A 2B 2A 2A 2A 20 32 32 32 32 32' + '1F 31 31 31 29 0A 0A 0C 0E 0C 17 11 11 11 17 11' + '17 11 11 17 15 11 17 11 1B 11 11 17 11 11 0F 29' + '31 30 31 08 02 10 22 30 29 30 20 32 32 32 32 32' + '08 31 31 31 26 0F 0C 0A 11 17 11 11 11 17 11 1B' + '11 17 17 14 17 17 14 17 11 17 17 11 17 11 0F 07' + '2A 31 21 03 0C 0A 2B 2A 2A 2A 21 32 32 32 32 32' + '1F 31 31 31 29 0A 0E 11 11 11 11 17 11 11 17 11' + '1C 11 1B 18 11 1B 18 14 17 14 17 11 14 17 11 0F' + '0F 04 03 10 0B 0A 26 30 2A 2A 20 32 32 32 32 32' + '08 31 31 31 29 0A 10 11 11 11 17 11 17 1B 12 1B' + '11 1C 17 1B 1B 17 1B 18 1B 17 15 17 17 12 17 11' + '11 0F 11 11 10 0A 2B 30 2A 30 20 32 32 32 32 32' + '08 31 31 31 22 0F 11 11 17 11 11 1B 12 17 1B 17' + '1B 17 1C 18 1B 1C 17 1B 1C 17 17 15 17 17 13 13' + '1A 1B 13 0F 11 10 29 2A 2A 30 20 32 32 32 32 32' + '08 31 31 31 22 11 11 11 11 1B 17 11 1B 12 1B 1C' + '17 1C 17 1B 1C 17 1B 1C 17 1C 1B 17 1B 11 23 20' + '21 1F 28 13 0F 10 29 30 2A 30 20 32 32 32 32 32' + '08 31 31 31 22 10 11 17 11 11 1C 17 17 1B 18 1B' + '1C 1B 1C 1B 1C 1C 1B 1B 1C 17 1C 1B 17 14 1A 29' + '2A 2A 22 13 10 0F 2B 30 2A 30 20 32 32 32 32 32' + '08 31 31 31 22 0F 11 11 1B 17 11 17 1B 1C 1B 18' + '1B 1E 1C 1B 1E 1B 1E 1C 1B 1C 1B 18 1B 18 1A 29' + '2A 29 29 1A 11 11 26 31 31 30 20 32 32 32 32 32' + '08 31 31 31 22 0D 17 11 11 1C 17 15 17 1B 1B 1C' + '1B 1C 1D 1C 1B 1E 1B 1C 1E 1B 1C 1B 1C 17 1B 29' + '2A 2A 2A 13 10 11 2B 2F 30 31 20 32 32 32 32 32' + '08 31 31 31 22 0E 11 14 17 11 1B 17 1B 1C 19 1B' + '1C 1D 1C 1C 1E 24 1E 1E 1B 1C 1D 1C 17 1C 13 20' + '29 22 21 0F 11 0C 29 31 31 31 20 32 32 32 32 32' + '08 31 31 31 21 0A 0C 17 17 17 15 17 18 1B 1C 1C' + '1E 1C 1E 1E 24 1E 1C 1C 1E 1C 1C 17 1C 17 18 11' + '16 11 0F 11 10 0A 2B 31 30 31 1F 32 32 32 32 32' + '07 31 31 31 22 1B 20 1B 23 23 1B 26 23 26 23 26' + '23 26 26 23 26 26 26 26 26 23 26 23 26 23 26 23' + '1B 23 1B 23 1F 1A 2A 31 31 31 20 32 32 32 32 32' + '08 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 1F 32 32 32 32 32' + '05 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 30 08 32 32 32 32 32' + '01 20 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31' + '31 31 31 31 31 31 31 31 31 21 01 32 32 32 32 32' + '32 01 07 21 29 22 22 22 22 22 22 22 22 22 22 22' + '22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22' + '22 22 22 22 22 22 22 22 08 01 32 32 32 00 00 32' + '32 32 32 32 01 01 01 01 01 01 01 01 01 01 01 01' + '01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01' + '01 01 01 01 01 01 01 01 32 32 32 32 00 00 00 00' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 00 00 00 00 00' + '00 00 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32' + '32 32 32 32 32 32 32 32 32 32 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 F0 00' + '00 00 00 0F 00 00 C0 00 00 00 00 03 00 00 80 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 01 00 00 80 00 00 00 00 03 00 00 C0 00' + '00 00 00 07 00 00 F0 00 00 00 00 0F 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 28 00' + '00 00 30 00 00 00 60 00 00 00 01 00 20 00 00 00' + '00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 17 00 00 00 32 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 37 00 00 00 37 00 00 00 37 00 00 00 37 00 00' + '00 28 00 00 00 0C 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 19 00 00 00 75 00 00 00 C8 00 00 00 F4 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F7 00 00' + '00 F7 00 00 00 F7 00 00 00 F7 00 00 00 F6 00 00' + '00 D6 00 00 00 90 00 00 00 3F 00 00 00 08 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 1E 00 00' + '00 C7 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 E3 00 00 00 4A 00 00' + '00 06 00 00 00 00 00 00 00 04 00 00 00 B0 00 00' + '00 FF 05 05 05 FF 47 47 47 FF 83 83 83 FF 90 90' + '90 FF 8E 8E 8E FF 8E 8E 8E FF 8E 8E 8E FF 8D 8D' + '8D FF 8D 8D 8D FF 8D 8D 8D FF 8D 8D 8D FF 8C 8C' + '8C FF 8C 8C 8C FF 8C 8C 8C FF 8B 8B 8B FF 8B 8B' + '8B FF 8B 8B 8B FF 8B 8B 8B FF 8B 8B 8B FF 8A 8A' + '8A FF 8A 8A 8A FF 8A 8A 8A FF 89 89 89 FF 89 89' + '89 FF 89 89 89 FF 89 89 89 FF 89 89 89 FF 88 88' + '88 FF 88 88 88 FF 88 88 88 FF 87 87 87 FF 87 87' + '87 FF 87 87 87 FF 87 87 87 FF 87 87 87 FF 87 87' + '87 FF 86 86 86 FF 88 88 88 FF 83 83 83 FF 53 53' + '53 FF 0B 0B 0B FF 00 00 00 FF 00 00 00 D5 00 00' + '00 34 00 00 00 01 00 00 00 52 00 00 00 FF 06 06' + '06 FF 8B 8B 8B FF FB FB FB FF FF FF FF FF FE FE' + 'FE FF FC FC FC FF FA FA FA FF F9 F9 F9 FF F8 F8' + 'F8 FF F6 F6 F6 FF F5 F5 F5 FF F4 F4 F4 FF F2 F2' + 'F2 FF F1 F1 F1 FF F0 F0 F0 FF EE EE EE FF ED ED' + 'ED FF EB EB EB FF EA EA EA FF E9 E9 E9 FF E7 E7' + 'E7 FF E5 E5 E5 FF E5 E5 E5 FF E3 E3 E3 FF E1 E1' + 'E1 FF E0 E0 E0 FF DF DF DF FF DD DD DD FF DC DC' + 'DC FF DB DB DB FF D9 D9 D9 FF D8 D8 D8 FF D6 D6' + 'D6 FF D5 D5 D5 FF D3 D3 D3 FF D2 D2 D2 FF D1 D1' + 'D1 FF CF CF CF FF CD CD CD FF D1 D1 D1 FF EA EA' + 'EA FF 98 98 98 FF 0C 0C 0C FF 00 00 00 FF 00 00' + '00 8D 00 00 00 0A 00 00 00 C3 00 00 00 FF 49 49' + '49 FF FA FA FA FF FE FE FE FF F7 F7 F7 FF F7 F7' + 'F7 FF F5 F5 F5 FF F3 F3 F3 FF F2 F2 F2 FF F0 F0' + 'F0 FF EF EF EF FF EE EE EE FF EC EC EC FF EA EA' + 'EA FF E9 E9 E9 FF E8 E8 E8 FF E6 E6 E6 FF E5 E5' + 'E5 FF E3 E3 E3 FF E2 E2 E2 FF E1 E1 E1 FF DF DF' + 'DF FF DD DD DD FF DC DC DC FF DA DA DA FF D9 D9' + 'D9 FF D8 D8 D8 FF D6 D6 D6 FF D4 D4 D4 FF D3 D3' + 'D3 FF D2 D2 D2 FF D0 D0 D0 FF CF CF CF FF CD CD' + 'CD FF CC CC CC FF CB CB CB FF C9 C9 C9 FF C7 C7' + 'C7 FF C6 C6 C6 FF C5 C5 C5 FF C2 C2 C2 FF C2 C2' + 'C2 FF E6 E6 E6 FF 73 73 73 FF 00 00 00 FF 00 00' + '00 D4 00 00 00 27 00 00 00 F3 00 00 00 FF 84 84' + '84 FF FF FF FF FF FA FA FA FF F8 F8 F8 FF F7 F7' + 'F7 FF F6 F6 F7 FF F4 F5 F5 FF F3 F4 F4 FF F1 F2' + 'F3 FF EF F0 F1 FF EE EF F0 FF ED ED EE FF EA EB' + 'EC FF E9 EA EB FF E8 E8 E9 FF E6 E7 E7 FF E5 E6' + 'E6 FF E3 E4 E5 FF E1 E2 E3 FF E0 E1 E1 FF DF DF' + 'E0 FF DD DE DE FF DC DC DD FF DA DB DB FF D8 D9' + 'DA FF D7 D8 D9 FF D6 D6 D7 FF D4 D4 D5 FF D3 D3' + 'D4 FF D1 D2 D2 FF CF D0 D1 FF CE CF CF FF CD CD' + 'CE FF CB CC CC FF CA CB CB FF C8 C9 CA FF C6 C7' + 'C8 FF C5 C6 C7 FF C4 C4 C4 FF C5 C4 C4 FF C1 C1' + 'C1 FF D7 D7 D7 FF AD AD AD FF 00 00 00 FF 00 00' + '00 F9 00 00 00 38 00 00 00 F0 00 00 00 FF 8F 8F' + '8F FF FF FF FF FF FC FC FC FF FA FA FA FF FB FB' + 'FB FF FC FC FD FF FB FC FC FF FB FB FB FF FA FA' + 'FA FF F9 FA FA FF F9 F9 FA FF F8 F8 F9 FF F7 F8' + 'F8 FF F7 F7 F7 FF F6 F6 F6 FF F5 F5 F6 FF F4 F5' + 'F5 FF F4 F5 F5 FF F3 F4 F4 FF F3 F3 F3 FF F2 F2' + 'F3 FF F2 F2 F2 FF F1 F1 F2 FF F0 F1 F1 FF EF F0' + 'F0 FF EF EF F0 FF EE EF EF FF ED EE EE FF ED ED' + 'EE FF EC ED ED FF EB EC EC FF EB EB EC FF EA EB' + 'EB FF E9 EA EA FF E9 EA EA FF E8 E9 E9 FF E7 E8' + 'E8 FF E8 E8 E8 FF DE DE DE FF C6 C6 C6 FF C4 C4' + 'C4 FF D0 D0 D0 FF AD AD AD FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8D 8D' + '8D FF FF FF FF FF FE FE FE FF FC FC FD FF E3 E1' + 'DF FF D3 99 70 FF D6 93 65 FF D9 99 6B FF DB 9D' + '6E FF DD A1 72 FF E0 A4 76 FF E1 A8 79 FF E4 AC' + '7D FF E6 AF 80 FF E8 B2 83 FF EA B4 85 FF EB B7' + '87 FF EC B9 89 FF ED BA 8B FF EE BB 8B FF EE BB' + '8B FF EE BB 8B FF ED BA 8B FF ED B9 89 FF EB B7' + '87 FF EA B5 86 FF E9 B2 83 FF E6 AF 81 FF E5 AC' + '7E FF E3 A9 7A FF E1 A5 76 FF DF A2 74 FF DD 9E' + '70 FF DB 9A 6C FF D8 97 69 FF D6 93 65 FF D3 8E' + '60 FF D3 8F 62 FF E6 D7 CD FF C9 CC CD FF C5 C5' + 'C5 FF D2 D2 D2 FF AA AA AA FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8B 8B' + '8B FF FF FF FF FF FF FF FF FF FD FF FF FF D8 D3' + 'D1 FF BE 67 2C FF C1 5F 1B FF C5 67 25 FF C8 6C' + '29 FF CB 72 2F FF CE 77 34 FF D0 7C 38 FF D3 80' + '3D FF D6 85 41 FF D9 89 44 FF DB 8C 47 FF DD 8F' + '4B FF DE 91 4C FF DF 93 4E FF E0 95 50 FF E0 95' + '50 FF E0 94 50 FF DF 93 4E FF DE 91 4D FF DC 8F' + '49 FF DB 8B 47 FF D8 88 43 FF D5 84 40 FF D3 7F' + '3C FF D0 7B 37 FF CD 75 32 FF CA 70 2D FF C7 6C' + '29 FF C4 66 23 FF C0 60 1E FF BC 5B 1A FF B9 53' + '11 FF B9 54 13 FF DF C8 B9 FF CC CF D2 FF C6 C6' + 'C6 FF D3 D3 D3 FF AB AB AB FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8B 8B' + '8B FF FF FF FF FF FF FF FF FF FE FF FF FF DA D5' + 'D3 FF BE 6A 32 FF C1 62 21 FF C5 6A 2B FF C7 6F' + '2F FF CA 74 34 FF CD 78 38 FF CF 7D 3C FF D2 81' + '40 FF D5 84 43 FF D7 88 47 FF D8 8B 4A FF DA 8E' + '4C FF DC 90 4E FF DD 92 50 FF DD 92 51 FF DD 92' + '51 FF DD 92 50 FF DD 91 4F FF DB 8F 4E FF DA 8D' + '4B FF D9 8A 49 FF D6 87 46 FF D4 83 42 FF D2 80' + '3F FF CF 7C 3B FF CC 77 37 FF CA 73 32 FF C7 6E' + '2E FF C3 68 29 FF C1 64 24 FF BD 5F 20 FF B9 57' + '18 FF BA 57 1A FF E0 C9 BB FF CD D1 D3 FF C7 C7' + 'C7 FF D5 D5 D5 FF AA AA AA FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8A 8A' + '8A FF FF FF FF FF FF FF FF FF FF FF FF FF DA D6' + 'D3 FF BC 68 30 FF BF 5F 1E FF C3 66 27 FF C5 6B' + '2C FF C8 70 30 FF CB 74 34 FF CD 78 38 FF D0 7C' + '3B FF D2 80 3F FF D4 83 42 FF D6 85 44 FF D7 88' + '47 FF D8 8A 48 FF D9 8B 4A FF DA 8C 4B FF DA 8C' + '4B FF D9 8C 4B FF D9 8B 4A FF D8 8A 48 FF D6 87' + '46 FF D5 85 44 FF D4 82 41 FF D1 7E 3E FF D0 7B' + '3B FF CD 77 37 FF CA 73 33 FF C8 6E 2F FF C5 6A' + '2B FF C2 65 26 FF BF 60 21 FF BC 5B 1C FF B7 53' + '15 FF B8 55 18 FF E0 C9 BB FF CE D2 D4 FF C9 C9' + 'C9 FF D6 D6 D6 FF AA AA AA FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 8A 8A' + '8A FF FF FF FF FF FF FF FF FF FF FF FF FF DA D6' + 'D3 FF BA 65 2D FF BD 5B 1B FF C0 63 24 FF C2 67' + '28 FF C5 6C 2C FF C8 70 30 FF CA 73 34 FF CD 77' + '37 FF CF 7B 3A FF D1 7D 3D FF D2 80 3F FF D4 83' + '42 FF D5 84 43 FF D6 86 45 FF D6 86 45 FF D6 86' + '45 FF D6 86 45 FF D5 85 44 FF D5 84 43 FF D3 82' + '41 FF D2 80 3F FF D1 7D 3C FF CF 7A 39 FF CD 76' + '36 FF CA 73 33 FF C7 6F 2F FF C5 6A 2B FF C2 66' + '27 FF BF 61 22 FF BC 5D 1E FF B9 58 19 FF B5 50' + '12 FF B6 52 15 FF E0 C9 BB FF D0 D4 D6 FF CB CB' + 'CB FF D7 D7 D7 FF A9 A9 A9 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 89 89' + '89 FF FF FF FF FF FF FF FF FF FF FF FF FF DA D6' + 'D3 FF B8 62 2A FF BA 57 17 FF BE 5E 20 FF C0 63' + '24 FF C3 67 28 FF C6 6B 2C FF C8 6F 2F FF CA 72' + '32 FF CC 76 35 FF CD 78 38 FF CF 7B 3A FF D0 7D' + '3C FF D1 7E 3D FF D2 80 3F FF D2 80 3F FF D2 80' + '3F FF D2 80 3F FF D2 7F 3E FF D1 7E 3E FF CF 7C' + '3C FF CE 7A 3A FF CD 77 37 FF CB 74 34 FF CA 71' + '32 FF C7 6E 2E FF C5 6A 2B FF C3 66 27 FF C0 62' + '23 FF BD 5D 1F FF BB 59 1A FF B7 54 16 FF B3 4D' + '0F FF B5 4E 11 FF E0 C9 BA FF D1 D5 D7 FF CC CC' + 'CC FF D8 D8 D8 FF A8 A8 A8 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 88 88' + '88 FF FF FF FF FF FF FF FF FF FF FF FF FF DA D5' + 'D3 FF B6 5E 27 FF B7 53 13 FF BB 5A 1C FF BD 5F' + '20 FF C0 63 24 FF C3 66 27 FF C5 6A 2A FF C7 6D' + '2E FF C9 71 31 FF CA 73 33 FF CC 75 35 FF CD 77' + '37 FF CE 79 38 FF CF 7A 3A FF CF 7B 3A FF CF 7B' + '3A FF CF 7A 3A FF CE 7A 39 FF CE 78 38 FF CC 77' + '36 FF CB 75 35 FF CA 72 32 FF C8 6F 2F FF C7 6D' + '2E FF C4 69 2A FF C2 65 26 FF C0 62 23 FF BD 5E' + '1F FF BA 59 1B FF B8 55 17 FF B5 51 13 FF B1 4A' + '0B FF B2 4B 0E FF E0 C8 BA FF D2 D6 D8 FF CD CD' + 'CD FF D9 D9 D9 FF A7 A7 A7 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 87 87' + '87 FF FF FF FF FF FF FF FF FF FF FF FF FF D8 D4' + 'D1 FF B4 5A 23 FF B5 4E 0F FF B9 56 18 FF BB 5A' + '1B FF BD 5E 1F FF C0 62 23 FF C2 65 25 FF C3 68' + '29 FF C6 6B 2C FF C7 6D 2E FF C8 70 30 FF C9 71' + '31 FF CA 73 32 FF CB 74 34 FF CB 75 34 FF CB 75' + '34 FF CB 74 34 FF CB 74 33 FF CA 72 32 FF C9 71' + '31 FF C8 6F 2F FF C6 6D 2D FF C5 6A 2A FF C3 67' + '28 FF C1 64 25 FF BE 60 22 FF BD 5D 1E FF BA 59' + '1A FF B8 55 17 FF B6 51 13 FF B3 4C 0F FF AF 46' + '07 FF AF 47 0A FF DF C7 BA FF D4 D8 DB FF CF CF' + 'CF FF DB DB DB FF A6 A6 A6 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 86 86' + '86 FF FF FF FF FF FF FF FF FF FF FF FF FF D6 D1' + 'CE FF B1 55 1E FF B2 4A 0B FF B6 51 13 FF B7 54' + '16 FF BA 59 1A FF BC 5D 1E FF BE 60 20 FF BF 62' + '23 FF C2 65 26 FF C3 67 28 FF C4 69 2A FF C5 6B' + '2B FF C6 6C 2C FF C7 6D 2E FF C7 6E 2E FF C7 6E' + '2E FF C7 6E 2E FF C6 6D 2E FF C6 6C 2C FF C5 6A' + '2B FF C4 69 29 FF C3 67 28 FF C1 64 25 FF BF 62' + '23 FF BE 5F 20 FF BC 5C 1D FF BC 58 19 FF BD 54' + '12 FF BA 4F 0D FF B7 4C 0C FF B0 48 0A FF AC 41' + '03 FF AD 43 07 FF DF C7 BA FF D6 DA DC FF D0 D0' + 'D0 FF DC DC DC FF A5 A5 A5 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 85 85' + '85 FF FF FF FF FF FF FF FF FF FF FF FF FF D4 CF' + 'CC FF AE 51 1A FF B0 45 06 FF B3 4D 0F FF B4 50' + '12 FF B7 54 16 FF B9 58 19 FF BB 5A 1C FF BC 5D' + '1F FF BE 60 21 FF BF 62 23 FF C0 63 24 FF C1 65' + '25 FF C3 66 26 FF C3 68 28 FF C3 68 29 FF C3 68' + '29 FF C3 68 29 FF C3 67 28 FF C3 66 27 FF C1 65' + '25 FF C0 63 23 FF BF 61 22 FF BD 5E 1F FF BC 5D' + '1E FF BA 5A 1B FF BB 56 17 FF A5 46 0C FF 7D 43' + '1F FF 77 46 27 FF 8D 3B 0B FF AE 41 02 FF AB 3E' + '00 FF AC 42 06 FF E0 C8 BA FF D7 DB DD FF D2 D2' + 'D2 FF DD DD DD FF A3 A3 A3 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 84 84' + '84 FF FF FF FF FF FF FF FF FF FF FF FF FF D1 CD' + 'CA FF AB 4D 16 FF AC 40 01 FF B0 48 0B FF B2 4C' + '0E FF B4 4F 11 FF B6 52 14 FF B7 54 16 FF B8 57' + '18 FF BA 58 1A FF BD 5D 1E FF C0 63 24 FF C3 67' + '27 FF C4 69 29 FF C5 6B 2B FF C5 6B 2C FF C6 6C' + '2C FF C6 6C 2C FF C5 6B 2C FF C5 6B 2B FF C4 69' + '29 FF C2 67 28 FF C1 64 25 FF BE 5F 20 FF BA 59' + '1A FF BA 53 13 FF 97 45 12 FF 9B 8E 85 FF C5 CB' + 'CF FF D3 DB E0 FF AC AD AD FF 83 44 21 FF A9 38' + '00 FF AC 42 06 FF E0 C8 BB FF D8 DC DE FF D3 D3' + 'D3 FF DF DF DF FF A3 A3 A3 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 83 83' + '83 FF FF FF FF FF FF FF FF FF FF FF FF FF CF CA' + 'C7 FF A8 4A 14 FF A9 3C 00 FF AD 43 06 FF B0 47' + '09 FF B1 4A 0B FF B2 4B 0E FF B4 4F 11 FF B8 56' + '18 FF BF 62 22 FF C4 6A 2A FF C7 6E 2E FF C8 70' + '2F FF C9 70 30 FF CA 72 32 FF CA 72 32 FF CA 72' + '32 FF CA 72 32 FF CA 72 32 FF C9 71 31 FF C9 70' + '30 FF C8 6F 2F FF C7 6E 2E FF C5 6B 2C FF C3 67' + '28 FF C0 5B 18 FF 8D 5B 3C FF EA F2 F7 FF F6 F5' + 'F6 FF E6 E5 E4 FF CD D2 D4 FF 6C 64 5E FF 91 2D' + '00 FF AF 43 06 FF E1 C9 BB FF D9 DD E0 FF D4 D4' + 'D4 FF E0 E0 E0 FF A2 A2 A2 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 82 82' + '82 FF FF FF FF FF FF FF FF FF FF FF FF FF CD C8' + 'C5 FF A8 4A 13 FF A9 3B 00 FF AA 3E 02 FF AA 3F' + '02 FF AD 44 07 FF B9 57 18 FF C1 64 24 FF C6 6C' + '2C FF C9 70 30 FF C9 72 32 FF CA 74 34 FF CC 75' + '35 FF CC 76 36 FF CD 78 37 FF CD 78 38 FF CE 79' + '38 FF CE 79 38 FF CD 78 38 FF CD 77 37 FF CC 76' + '36 FF CB 75 35 FF CA 73 33 FF C9 71 31 FF C8 6F' + '30 FF C3 66 24 FF 8C 6B 54 FF DC E2 E6 FF D1 CE' + 'CC FF B1 A5 9F FF E0 E2 E4 FF 7C 7E 80 FF 74 25' + '00 FF B2 44 05 FF E1 C9 BB FF DB DF E1 FF D5 D5' + 'D5 FF E1 E1 E1 FF A1 A1 A1 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 81 81' + '81 FF FF FF FF FF FF FF FF FF FF FF FF FF CB C6' + 'C3 FF A8 49 13 FF A9 3B 00 FF A8 3C 00 FF AE 46' + '09 FF BC 5C 1E FF C7 6E 2E FF C9 70 30 FF CA 72' + '32 FF CB 75 35 FF CD 77 37 FF CE 7A 3A FF CF 7B' + '3B FF D0 7D 3C FF D1 7E 3E FF D1 7F 3E FF D2 7F' + '3E FF D2 7F 3E FF D1 7E 3E FF D1 7E 3D FF D0 7C' + '3C FF CF 7B 3B FF CE 79 39 FF CC 77 36 FF CC 75' + '34 FF CB 6F 2C FF 89 60 42 FF CA D0 D5 FF F2 F2' + 'F2 FF F2 F1 F0 FF FF FF FF FF 7C 72 6D FF 89 29' + '00 FF AF 43 06 FF E2 CA BC FF DD E1 E3 FF D7 D7' + 'D7 FF E2 E2 E2 FF A0 A0 A0 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 80 80' + '80 FF FF FF FF FF FF FF FF FF FF FF FF FF C9 C4' + 'C1 FF A7 48 13 FF A7 39 00 FF B0 49 0B FF C3 68' + '28 FF C7 6F 2F FF C9 71 31 FF CA 74 34 FF CC 77' + '37 FF CE 7A 3A FF D0 7C 3C FF D1 7F 3E FF D2 81' + '40 FF D4 82 41 FF D5 84 43 FF D5 85 44 FF D5 85' + '44 FF D5 85 44 FF D5 84 43 FF D4 84 43 FF D3 82' + '41 FF D2 81 40 FF D1 7F 3E FF CF 7C 3B FF CE 7A' + '39 FF D1 79 37 FF A6 5D 27 FF 6A 65 62 FF E0 E6' + 'EB FF F5 FA FE FF A6 AE B3 FF 79 3C 18 FF AC 39' + '00 FF AC 42 06 FF E2 CA BC FF DE E2 E4 FF D8 D8' + 'D8 FF E4 E4 E4 FF 9E 9E 9E FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 7E 7E' + '7E FF FF FF FF FF FF FF FF FF FF FF FF FF C7 C2' + 'C0 FF A5 46 11 FF AE 42 05 FF C2 67 27 FF C7 6E' + '2F FF C9 71 31 FF CB 75 35 FF CD 78 38 FF D0 7C' + '3B FF D2 7F 3F FF D3 82 41 FF D4 84 43 FF D6 86' + '46 FF D7 88 47 FF D8 89 48 FF D8 8A 49 FF D8 8B' + '49 FF D8 8B 49 FF D8 8A 49 FF D8 89 48 FF D6 87' + '47 FF D5 86 45 FF D4 84 43 FF D2 81 3F FF D1 7F' + '3D FF CF 7B 3B FF D2 79 37 FF 9C 56 23 FF 7A 59' + '40 FF 81 63 4D FF 74 41 1E FF B8 5B 1D FF B2 48' + '09 FF AB 41 04 FF E2 CA BC FF DF E3 E5 FF DA DA' + 'DA FF E5 E5 E5 FF 9E 9E 9E FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 7D 7D' + '7D FF FF FF FF FF FF FF FF FF FF FF FF FF C5 BF' + 'BD FF A7 48 12 FF BE 5D 1C FF C8 6F 2F FF C9 71' + '31 FF CC 75 35 FF CF 79 39 FF D0 7D 3D FF D3 81' + '40 FF D5 84 43 FF D7 87 46 FF D8 8A 49 FF DA 8C' + '4B FF DB 8E 4C FF DC 90 4E FF DC 91 4F FF DC 91' + '4F FF DC 91 4F FF DC 91 4F FF DB 8F 4D FF DA 8E' + '4C FF D9 8C 4A FF D8 89 48 FF D6 86 45 FF D5 83' + '42 FF D3 81 40 FF CF 7A 38 FF D0 76 32 FF C5 6A' + '26 FF BD 61 1E FF C8 66 22 FF C8 68 27 FF BE 5D' + '1E FF AC 43 07 FF E2 CA BC FF E0 E5 E7 FF DC DC' + 'DC FF E6 E6 E6 FF 9D 9D 9D FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 7B 7B' + '7B FF FF FF FF FF FF FF FF FF FF FF FF FF C1 BC' + 'B9 FF B2 5B 24 FF C7 6C 2A FF C9 70 31 FF CB 75' + '35 FF CE 79 39 FF D1 7E 3D FF D2 82 41 FF D5 85' + '44 FF D8 89 48 FF DA 8C 4B FF DC 8F 4D FF DD 92' + '50 FF DE 94 52 FF DF 96 54 FF E0 97 55 FF E0 97' + '55 FF E0 97 55 FF E0 97 54 FF DF 95 53 FF DE 94' + '52 FF DD 91 50 FF DA 8E 4D FF D9 8B 4A FF D8 88' + '47 FF D6 83 40 FF B2 7D 53 FF 96 7C 69 FF A3 86' + '70 FF AD 8E 79 FF 9A 8A 71 FF 8D 62 37 FF C3 63' + '22 FF B7 54 16 FF E2 CA BC FF E3 E6 E8 FF DD DD' + 'DD FF E7 E7 E7 FF 9B 9B 9B FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 7A 7A' + '7A FF FF FF FF FF FF FF FF FF FF FF FF FF C0 BA' + 'B8 FF B8 64 2D FF C9 6E 2D FF CA 74 33 FF CD 78' + '38 FF D0 7D 3C FF D3 81 40 FF D5 85 44 FF D8 89' + '48 FF DB 8D 4C FF DD 91 4F FF DF 94 52 FF E0 97' + '55 FF E1 99 57 FF E2 9B 58 FF E3 9C 5A FF E4 9D' + '5A FF E4 9D 5A FF E3 9C 5A FF E2 9B 59 FF E1 99' + '57 FF E0 96 55 FF DE 93 51 FF DC 90 4E FF DB 8D' + '4B FF D2 80 3C FF B2 96 7F FF 96 9F A6 FF A4 A8' + 'AB FF 86 8A 8E FF A9 B9 BC FF 86 78 65 FF B9 5C' + '1C FF C1 61 23 FF E3 CB BD FF E2 E6 E8 FF DE DE' + 'DE FF E8 E8 E8 FF 9A 9A 9A FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 78 78' + '78 FF FF FF FF FF FF FF FF FF FF FF FF FF BE B8' + 'B6 FF BA 68 30 FF CB 71 2F FF CD 76 36 FF CF 7B' + '3B FF D2 80 3F FF D5 85 44 FF D7 89 48 FF DA 8E' + '4C FF DD 92 50 FF DF 96 54 FF E1 99 57 FF E3 9C' + '5A FF E5 9E 5C FF E6 A1 5E FF E7 A2 60 FF E7 A3' + '60 FF E7 A3 60 FF E7 A2 5F FF E6 A1 5E FF E4 9E' + '5B FF E3 9C 59 FF E1 98 56 FF DE 95 53 FF DD 92' + '4F FF D5 85 41 FF A9 8A 71 FF C4 C9 CD FF DC DC' + 'DC FF D7 D7 D7 FF C5 C8 CC FF 90 75 64 FF BB 5F' + '1E FF C5 67 29 FF E7 D0 C2 FF EA EE F0 FF E5 E5' + 'E5 FF EB EB EB FF 99 99 99 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 78 78' + '78 FF FF FF FF FF FF FF FF FF FF FF FF FF BA B5' + 'B2 FF B9 67 2F FF CD 74 32 FF CE 79 39 FF D1 7E' + '3E FF D4 83 42 FF D7 88 47 FF DA 8D 4B FF DD 91' + '4F FF E0 96 54 FF E1 9A 57 FF E4 9D 5B FF E6 A1' + '5E FF E8 A4 61 FF E9 A6 63 FF EA A8 65 FF EB A9' + '65 FF EB A9 65 FF EA A7 64 FF E9 A6 63 FF E7 A4' + '60 FF E6 A0 5E FF E4 9D 5A FF E1 99 57 FF DF 94' + '53 FF DF 8F 48 FF AF 89 69 FF C7 CC D0 FF D6 D6' + 'D6 FF D3 D3 D3 FF C8 CD D2 FF A0 7B 5F FF C6 68' + '24 FF C1 65 26 FF E9 D2 C4 FF F7 FB FD FF F4 F4' + 'F4 FF F6 F6 F6 FF 98 98 98 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 76 76' + '76 FF FF FF FF FF FF FF FF FF FF FF FF FF B8 B2' + 'B0 FF B3 5C 25 FF CE 77 35 FF CF 7B 3B FF D2 80' + '40 FF D5 85 44 FF D9 8A 49 FF DB 8F 4D FF DF 95' + '53 FF E2 99 57 FF E3 9E 5B FF E6 A2 5F FF E9 A6' + '63 FF EB A9 65 FF ED AC 68 FF EE AE 6A FF EF AF' + '6B FF EF AF 6B FF EE AD 6A FF ED AB 68 FF EB A8' + '66 FF E8 A5 62 FF E6 A1 5E FF E3 9D 5A FF E1 98' + '56 FF E2 94 4E FF B4 87 5F FF D1 D5 D8 FF E2 E3' + 'E4 FF E0 E1 E2 FF CE D3 D8 FF AA 79 55 FF CD 6F' + '2A FF B9 58 1A FF E8 CF C2 FF F9 FD FF FF F7 F7' + 'F7 FF F8 F8 F8 FF 97 97 97 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 75 75' + '75 FF FF FF FF FF FF FF FF FF FF FF FF FF B7 B1' + 'AF FF A5 47 10 FF C7 6A 28 FF D2 7F 3E FF D3 83' + '42 FF D7 88 47 FF DA 8D 4C FF DD 92 50 FF E0 98' + '56 FF E4 9C 5A FF E6 A1 5F FF E9 A6 63 FF EC AB' + '67 FF EE AE 6B FF F0 B1 6E FF F2 B4 71 FF F3 B5' + '72 FF F3 B5 71 FF F2 B4 70 FF F0 B1 6E FF ED AD' + '6A FF EB A9 66 FF E8 A5 62 FF E5 A0 5E FF E3 9B' + '59 FF E5 97 54 FF B9 81 50 FF A1 9D 9B FF BD BC' + 'BA FF BD BC BA FF A3 A1 A0 FF AD 70 42 FF C9 69' + '26 FF AD 43 06 FF E9 D0 C3 FF FB FE FF FF F8 F8' + 'F8 FF F9 F9 F9 FF 95 95 95 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 74 74' + '74 FF FF FF FF FF FF FF FF FF FF FF FF FF B2 AD' + 'AB FF 9C 3C 06 FF AE 45 06 FF CF 79 35 FF D6 7F' + '3A FF D9 85 3F FF DC 8A 44 FF DF 90 4A FF E3 96' + '4F FF E7 9C 54 FF EA A1 5A FF ED A7 5F FF F1 AC' + '64 FF F3 B1 68 FF F6 B5 6D FF F8 B9 70 FF FA BB' + '72 FF F9 BA 72 FF F8 B8 6F FF F5 B5 6C FF F2 AF' + '68 FF F0 AA 63 FF ED A6 5D FF E9 A0 58 FF E6 9A' + '53 FF E3 95 4E FF DE 8E 48 FF C2 79 3B FF B7 70' + '36 FF B4 6B 31 FF B6 69 2C FF C9 71 2F FF B1 4C' + '0D FF A5 39 00 FF E9 D1 C3 FF FC FF FF FF FA FA' + 'FA FF FB FB FB FF 94 94 94 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F0 00 00 00 FF 73 73' + '73 FF FF FF FF FF FF FF FF FF FF FF FF FF C4 C3' + 'C2 FF AE 93 84 FF B1 93 83 FF C2 A0 86 FF CE A5' + '83 FF CE A7 87 FF D0 AA 89 FF D2 AD 8C FF D3 B0' + '8E FF D5 B2 91 FF D7 B5 93 FF D8 B8 96 FF DA BA' + '98 FF DB BC 9B FF DD BF 9D FF DE C1 9F FF DE C2' + 'A0 FF DE C2 A0 FF DE C0 9E FF DC BE 9C FF DB BC' + '9A FF DA B9 98 FF D8 B7 95 FF D6 B4 92 FF D4 B2' + '90 FF D2 AF 8E FF D2 AC 8B FF D3 AA 88 FF D2 A8' + '85 FF D0 A5 82 FF CE A2 7F FF C1 9E 84 FF B0 92' + '82 FF B2 94 83 FF EC E5 E1 FF FD FE FE FF FC FC' + 'FC FF FC FC FC FF 94 94 94 FF 00 00 00 FF 00 00' + '00 F7 00 00 00 37 00 00 00 F4 00 00 00 FF 72 72' + '72 FF FF FF FF FF FF FF FF FF FF FF FF FF FE FE' + 'FE FF FD FF FF FF FD FF FF FF FA FF FF FF F9 FF' + 'FF FF F9 FE FF FF F9 FE FF FF F9 FE FF FF F8 FD' + 'FF FF F8 FD FF FF F8 FD FF FF F8 FC FF FF F7 FC' + 'FF FF F7 FC FF FF F7 FB FF FF F7 FB FF FF F7 FB' + 'FF FF F7 FB FF FF F7 FB FF FF F7 FB FF FF F7 FC' + 'FF FF F7 FC FF FF F8 FC FF FF F7 FC FF FF F7 FC' + 'FF FF F7 FC FF FF F8 FD FF FF F7 FD FF FF F7 FD' + 'FF FF F7 FD FF FF F7 FD FF FF F8 FD FF FF FA FF' + 'FF FF FA FF FF FF FC FD FD FF FB FB FB FF FD FD' + 'FD FF FB FB FB FF 93 93 93 FF 00 00 00 FF 00 00' + '00 FA 00 00 00 37 00 00 00 DD 00 00 00 FF 4B 4B' + '4B FF F5 F5 F5 FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FE FE FE FF FE FE FE FF FD FD FD FF FF FF' + 'FF FF F0 F0 F0 FF 6D 6D 6D FF 00 00 00 FF 00 00' + '00 E7 00 00 00 27 00 00 00 7A 00 00 00 FF 0E 0E' + '0E FF 9A 9A 9A FF FD FD FD FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF F8 F8' + 'F8 FF A4 A4 A4 FF 1B 1B 1B FF 00 00 00 FF 00 00' + '00 9B 00 00 00 04 00 00 00 0F 00 00 00 D8 00 00' + '00 FF 14 14 14 FF 6E 6E 6E FF AC AC AC FF B9 B9' + 'B9 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8' + 'B8 FF B8 B8 B8 FF B8 B8 B8 FF B8 B8 B8 FF B7 B7' + 'B7 FF B7 B7 B7 FF B7 B7 B7 FF B6 B6 B6 FF B6 B6' + 'B6 FF B6 B6 B6 FF B5 B5 B5 FF B5 B5 B5 FF B5 B5' + 'B5 FF B4 B4 B4 FF B5 B5 B5 FF AB AB AB FF 76 76' + '76 FF 1D 1D 1D FF 00 00 00 FF 00 00 00 FA 00 00' + '00 3C 00 00 00 00 00 00 00 00 00 00 00 52 00 00' + '00 F6 00 00 00 FF 00 00 00 FF 0C 0C 0C FF 16 16' + '16 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 15 15 15 FF 15 15 15 FF 15 15' + '15 FF 15 15 15 FF 16 16 16 FF 10 10 10 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 6F 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 39 00 00 00 B0 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 FF 00 00 00 FF 00 00 00 FF 00 00' + '00 FF 00 00 00 C1 00 00 00 51 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 49 00 00 00 80 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 84 00 00' + '00 84 00 00 00 84 00 00 00 84 00 00 00 82 00 00' + '00 57 00 00 00 0B 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 F0 00 00 00 00 0F 00 00 C0 00' + '00 00 00 03 00 00 80 00 00 00 00 01 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 01 00 00 80 00' + '00 00 00 03 00 00 C0 00 00 00 00 07 00 00 F0 00' + '00 00 00 0F 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 28 00 00 00 30 00 00 00 60 00' + '00 00 01 00 04 00 00 00 00 00 80 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' + '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' + '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' + 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 88 88 88 88 88 88 88 88' + '88 88 88 88 88 88 88 88 88 88 88 80 00 00 00 08' + 'FF FF FF FF FF FF FF FF FF FF FF FF 77 77 77 77' + '77 77 77 F8 00 00 00 8F FF FF FF FF FF FF FF FF' + 'FF 77 77 77 77 77 77 77 77 77 77 7F 80 00 00 8F' + 'FF FF FF FF FF FF FF FF FF 77 77 77 77 77 77 77' + '77 77 77 77 70 00 00 8F FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF 77 77 70 00 00 8F' + 'FF F8 88 87 77 77 77 77 77 77 77 77 77 77 77 88' + '88 88 77 77 70 00 00 8F FF 73 33 33 33 38 88 88' + '88 88 88 88 83 33 33 33 33 33 77 77 70 00 00 8F' + 'FF 73 33 33 33 38 88 88 88 88 88 88 88 33 33 33' + '33 33 77 77 70 00 00 8F FF 73 33 33 33 33 88 88' + '88 88 88 88 83 33 33 33 33 33 77 77 70 00 00 8F' + 'FF 73 33 33 33 33 33 88 88 88 88 83 33 33 33 33' + '33 33 77 77 70 00 00 8F FF 73 33 33 33 33 33 33' + '33 33 33 33 33 33 33 33 33 33 77 77 70 00 00 8F' + 'FF 73 33 33 33 33 33 33 33 33 33 33 33 33 33 33' + '33 33 77 77 70 00 00 8F FF 73 33 33 33 33 33 33' + '33 33 33 33 33 33 33 33 33 33 77 77 70 00 00 8F' + 'FF 73 33 33 33 33 33 33 33 33 33 33 33 33 33 33' + '33 33 77 77 70 00 00 8F FF 73 33 33 33 33 33 33' + '33 33 33 33 33 33 33 33 13 13 77 77 70 00 00 8F' + 'FF 73 13 33 33 33 33 33 33 33 33 33 33 33 38 77' + '73 13 77 77 70 00 00 8F FF 73 13 33 33 33 33 33' + '33 33 33 33 33 33 3F FF 78 13 77 7F 70 00 00 8F' + 'FF 73 11 13 33 33 33 33 33 33 33 33 33 33 8F 77' + 'F8 13 77 7F 70 00 00 8F FF 73 11 33 33 33 33 33' + '33 33 33 33 33 33 87 FF F8 13 7F 7F 70 00 00 8F' + 'FF 73 13 33 33 33 33 38 88 88 88 83 33 33 38 FF' + '71 13 7F 7F 80 00 00 8F FF 73 33 33 33 33 88 88' + '88 88 88 88 83 33 33 38 33 33 7F 7F 80 00 00 8F' + 'FF 73 33 33 33 38 88 88 88 88 88 88 88 83 33 33' + '33 33 7F 7F 80 00 00 8F FF 73 33 33 38 88 88 88' + '88 88 88 88 88 83 88 88 83 33 7F 7F 80 00 00 8F' + 'FF 73 33 33 38 88 88 88 88 88 88 88 88 83 88 78' + '78 33 7F 7F 80 00 00 8F FF 73 33 33 88 88 88 88' + '77 77 77 88 88 88 87 77 78 33 7F FF 80 00 00 8F' + 'FF 73 33 38 88 88 88 77 77 77 77 77 88 88 87 77' + '78 33 7F FF 80 00 00 8F FF 73 33 38 88 88 87 77' + '77 77 77 77 78 88 87 FF 78 33 7F FF 80 00 00 8F' + 'FF 73 33 88 88 88 77 77 77 77 77 77 77 88 88 77' + '78 33 7F FF 80 00 00 8F FF 71 33 33 88 88 77 77' + '77 77 77 77 77 88 83 33 33 31 7F FF 80 00 00 8F' + 'FF 78 87 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 88 FF FF 80 00 00 8F FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF FF 80 00 00 8F' + 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF' + 'FF FF FF FF 80 00 00 08 FF FF FF FF FF FF FF FF' + 'FF FF FF FF FF FF FF FF FF FF FF F7 00 00 00 00' + '87 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77' + '77 77 77 80 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 E0 00 00 00 00 0F 00 00 C0 00' + '00 00 00 07 00 00 80 00 00 00 00 03 00 00 80 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 01 00 00 80 00' + '00 00 00 03 00 00 C0 00 00 00 00 03 00 00 E0 00' + '00 00 00 0F 00 00 F8 00 00 00 00 3F 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00 FF FF' + 'FF FF FF FF 00 00 FF FF FF FF FF FF 00 00' +} */ + + + + +/*--------------------- END FIXME ------------------------*/ + +/* + * Everything that does not depend on language, + * like textless bitmaps etc, go into the + * neutral language. This will prevent them from + * being duplicated for each language. + */ +#include "shell32_xx.rc" + +/* + * Everything specific to any language goes + * in one of the specific files. + * Note that you can and may override resources + * which also have a neutral version. This is to + * get localized bitmaps for example. + */ +#include "shell32_Ca.rc" +#include "shell32_Cn.rc" +#include "shell32_Cs.rc" +#include "shell32_Da.rc" +#include "shell32_De.rc" +#include "shell32_En.rc" +#include "shell32_Eo.rc" +#include "shell32_Es.rc" +#include "shell32_Fi.rc" +#include "shell32_Fr.rc" +#include "shell32_Hu.rc" +#include "shell32_It.rc" +#include "shell32_Ja.rc" +#include "shell32_Ko.rc" +#include "shell32_Nl.rc" +#include "shell32_No.rc" +#include "shell32_Pl.rc" +#include "shell32_Pt.rc" +#include "shell32_Ru.rc" +#include "shell32_Si.rc" +#include "shell32_Sk.rc" +#include "shell32_Sv.rc" +#include "shell32_Uk.rc" +#include "shell32_Wa.rc" +#include "shell32_Zh.rc" diff --git a/reactos/lib/shell32/shresdef.h b/reactos/lib/shell32/shresdef.h new file mode 100644 index 00000000000..c3c454a4806 --- /dev/null +++ b/reactos/lib/shell32/shresdef.h @@ -0,0 +1,92 @@ +/* + * Copyright 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_SHELL_RES_H +#define __WINE_SHELL_RES_H + +/* + columntitles for the shellview +*/ +#define IDS_SHV_COLUMN1 7 +#define IDS_SHV_COLUMN2 8 +#define IDS_SHV_COLUMN3 9 +#define IDS_SHV_COLUMN4 10 +#define IDS_SHV_COLUMN5 11 +#define IDS_SHV_COLUMN6 12 +#define IDS_SHV_COLUMN7 13 +#define IDS_SHV_COLUMN8 14 +#define IDS_SHV_COLUMN9 15 + +#define IDS_DESKTOP 20 +#define IDS_MYCOMPUTER 21 + +#define IDS_SELECT 22 +#define IDS_OPEN 23 +#define IDS_VIEW_LARGE 24 +#define IDS_VIEW_SMALL 25 +#define IDS_VIEW_LIST 26 +#define IDS_VIEW_DETAILS 27 + +#define IDS_CREATEFOLDER_DENIED 30 +#define IDS_CREATEFOLDER_CAPTION 31 +#define IDS_DELETEITEM_CAPTION 32 +#define IDS_DELETEFOLDER_CAPTION 33 +#define IDS_DELETEITEM_TEXT 34 +#define IDS_DELETEMULTIPLE_TEXT 35 +#define IDS_OVERWRITEFILE_CAPTION 36 +#define IDS_OVERWRITEFILE_TEXT 37 + +#define IDS_RESTART_TITLE 40 +#define IDS_RESTART_PROMPT 41 +#define IDS_SHUTDOWN_TITLE 42 +#define IDS_SHUTDOWN_PROMPT 43 + +#define IDS_PROGRAMS 45 +#define IDS_PERSONAL 46 +#define IDS_FAVORITES 47 +#define IDS_STARTUP 48 +#define IDS_RECENT 49 +#define IDS_SENDTO 50 +#define IDS_STARTMENU 51 +#define IDS_MYMUSIC 52 +#define IDS_MYVIDEO 53 +#define IDS_DESKTOPDIRECTORY 54 +#define IDS_NETHOOD 55 +#define IDS_TEMPLATES 56 +#define IDS_APPDATA 57 +#define IDS_PRINTHOOD 58 +#define IDS_LOCAL_APPDATA 59 +#define IDS_INTERNET_CACHE 60 +#define IDS_COOKIES 61 +#define IDS_HISTORY 62 +#define IDS_PROGRAM_FILES 63 +#define IDS_MYPICTURES 64 +#define IDS_PROGRAM_FILES_COMMON 65 +#define IDS_COMMON_DOCUMENTS 66 +#define IDS_ADMINTOOLS 67 +#define IDS_COMMON_MUSIC 68 +#define IDS_COMMON_PICTURES 69 +#define IDS_COMMON_VIDEO 70 +#define IDS_CDBURN_AREA 71 + +/* browse for folder dialog box */ +#define IDD_STATUS 0x3743 +#define IDD_TITLE 0x3742 +#define IDD_TREEVIEW 0x3741 + +#endif diff --git a/reactos/lib/shell32/shv_bg_cmenu.c b/reactos/lib/shell32/shv_bg_cmenu.c new file mode 100644 index 00000000000..40d3afd84a2 --- /dev/null +++ b/reactos/lib/shell32/shv_bg_cmenu.c @@ -0,0 +1,445 @@ +/* + * IContextMenu + * ShellView Background Context Menu (shv_bg_cm) + * + * Copyright 1999 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "wine/debug.h" + +#include "windef.h" +#include "wingdi.h" +#include "pidl.h" +#include "shlguid.h" +#include "shlobj.h" + +#include "shell32_main.h" +#include "shellfolder.h" +#include "undocshell.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/************************************************************************** +* IContextMenu Implementation +*/ +typedef struct +{ + IContextMenu2Vtbl *lpVtbl; + IShellFolder* pSFParent; + DWORD ref; +} BgCmImpl; + + +static struct IContextMenu2Vtbl cmvt; + +/************************************************************************** +* ISVBgCm_Constructor() +*/ +IContextMenu2 *ISvBgCm_Constructor(IShellFolder* pSFParent) +{ + BgCmImpl* cm; + + cm = (BgCmImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BgCmImpl)); + cm->lpVtbl = &cmvt; + cm->ref = 1; + cm->pSFParent = pSFParent; + if(pSFParent) IShellFolder_AddRef(pSFParent); + + TRACE("(%p)->()\n",cm); + return (IContextMenu2*)cm; +} + +/************************************************************************** +* ISVBgCm_fnQueryInterface +*/ +static HRESULT WINAPI ISVBgCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid, LPVOID *ppvObj) +{ + BgCmImpl *This = (BgCmImpl *)iface; + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IContextMenu) || + IsEqualIID(riid, &IID_IContextMenu2)) + { + *ppvObj = This; + } + else if(IsEqualIID(riid, &IID_IShellExtInit)) /*IShellExtInit*/ + { + FIXME("-- LPSHELLEXTINIT pointer requested\n"); + } + + if(*ppvObj) + { + IUnknown_AddRef((IUnknown*)*ppvObj); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +/************************************************************************** +* ISVBgCm_fnAddRef +*/ +static ULONG WINAPI ISVBgCm_fnAddRef(IContextMenu2 *iface) +{ + BgCmImpl *This = (BgCmImpl *)iface; + + TRACE("(%p)->(count=%lu)\n",This, This->ref); + + return ++(This->ref); +} + +/************************************************************************** +* ISVBgCm_fnRelease +*/ +static ULONG WINAPI ISVBgCm_fnRelease(IContextMenu2 *iface) +{ + BgCmImpl *This = (BgCmImpl *)iface; + + TRACE("(%p)->()\n",This); + + if (!--(This->ref)) + { + TRACE(" destroying IContextMenu(%p)\n",This); + + if(This->pSFParent) + IShellFolder_Release(This->pSFParent); + + HeapFree(GetProcessHeap(),0,This); + return 0; + } + + return This->ref; +} + +/************************************************************************** +* ISVBgCm_fnQueryContextMenu() +*/ + +static HRESULT WINAPI ISVBgCm_fnQueryContextMenu( + IContextMenu2 *iface, + HMENU hMenu, + UINT indexMenu, + UINT idCmdFirst, + UINT idCmdLast, + UINT uFlags) +{ + HMENU hMyMenu; + UINT idMax; + HRESULT hr; + + BgCmImpl *This = (BgCmImpl *)iface; + + TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n", + This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags); + + + hMyMenu = LoadMenuA(shell32_hInstance, "MENU_002"); + if (uFlags & CMF_DEFAULTONLY) + { + HMENU ourMenu = GetSubMenu(hMyMenu,0); + UINT oldDef = GetMenuDefaultItem(hMenu,TRUE,GMDI_USEDISABLED); + UINT newDef = GetMenuDefaultItem(ourMenu,TRUE,GMDI_USEDISABLED); + if (newDef != oldDef) + SetMenuDefaultItem(hMenu,newDef,TRUE); + if (newDef!=0xFFFFFFFF) + hr = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, newDef+1); + else + hr = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); + } + else + { + idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu, + idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS); + hr = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, idMax-idCmdFirst+1); + } + DestroyMenu(hMyMenu); + + TRACE("(%p)->returning 0x%lx\n",This,hr); + return hr; +} + +/************************************************************************** +* DoNewFolder +*/ +static void DoNewFolder( + IContextMenu2 *iface, + IShellView *psv) +{ + BgCmImpl *This = (BgCmImpl *)iface; + ISFHelper * psfhlp; + char szName[MAX_PATH]; + + IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlp); + if (psfhlp) + { + LPITEMIDLIST pidl; + ISFHelper_GetUniqueName(psfhlp, szName, MAX_PATH); + ISFHelper_AddFolder(psfhlp, 0, szName, &pidl); + + if(psv) + { + /* if we are in a shellview do labeledit */ + IShellView_SelectItem(psv, + pidl,(SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE + |SVSI_FOCUSED|SVSI_SELECT)); + } + SHFree(pidl); + + ISFHelper_Release(psfhlp); + } +} + +/************************************************************************** +* DoPaste +*/ +static BOOL DoPaste( + IContextMenu2 *iface) +{ + BgCmImpl *This = (BgCmImpl *)iface; + BOOL bSuccess = FALSE; + IDataObject * pda; + + TRACE("\n"); + + if(SUCCEEDED(OleGetClipboard(&pda))) + { + STGMEDIUM medium; + FORMATETC formatetc; + + TRACE("pda=%p\n", pda); + + /* Set the FORMATETC structure*/ + InitFormatEtc(formatetc, RegisterClipboardFormatA(CFSTR_SHELLIDLIST), TYMED_HGLOBAL); + + /* Get the pidls from IDataObject */ + if(SUCCEEDED(IDataObject_GetData(pda,&formatetc,&medium))) + { + LPITEMIDLIST * apidl; + LPITEMIDLIST pidl; + IShellFolder *psfFrom = NULL, *psfDesktop; + + LPIDA lpcida = GlobalLock(medium.u.hGlobal); + TRACE("cida=%p\n", lpcida); + + apidl = _ILCopyCidaToaPidl(&pidl, lpcida); + + /* bind to the source shellfolder */ + SHGetDesktopFolder(&psfDesktop); + if(psfDesktop) + { + IShellFolder_BindToObject(psfDesktop, pidl, NULL, &IID_IShellFolder, (LPVOID*)&psfFrom); + IShellFolder_Release(psfDesktop); + } + + if (psfFrom) + { + /* get source and destination shellfolder */ + ISFHelper *psfhlpdst, *psfhlpsrc; + IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlpdst); + IShellFolder_QueryInterface(psfFrom, &IID_ISFHelper, (LPVOID*)&psfhlpsrc); + + /* do the copy/move */ + if (psfhlpdst && psfhlpsrc) + { + ISFHelper_CopyItems(psfhlpdst, psfFrom, lpcida->cidl, (LPCITEMIDLIST*)apidl); + /* FIXME handle move + ISFHelper_DeleteItems(psfhlpsrc, lpcida->cidl, apidl); + */ + } + if(psfhlpdst) ISFHelper_Release(psfhlpdst); + if(psfhlpsrc) ISFHelper_Release(psfhlpsrc); + IShellFolder_Release(psfFrom); + } + + _ILFreeaPidl(apidl, lpcida->cidl); + SHFree(pidl); + + /* release the medium*/ + ReleaseStgMedium(&medium); + } + IDataObject_Release(pda); + } +#if 0 + HGLOBAL hMem; + + OpenClipboard(NULL); + hMem = GetClipboardData(CF_HDROP); + + if(hMem) + { + char * pDropFiles = (char *)GlobalLock(hMem); + if(pDropFiles) + { + int len, offset = sizeof(DROPFILESTRUCT); + + while( pDropFiles[offset] != 0) + { + len = strlen(pDropFiles + offset); + TRACE("%s\n", pDropFiles + offset); + offset += len+1; + } + } + GlobalUnlock(hMem); + } + CloseClipboard(); +#endif + return bSuccess; +} + +/************************************************************************** +* ISVBgCm_fnInvokeCommand() +*/ +static HRESULT WINAPI ISVBgCm_fnInvokeCommand( + IContextMenu2 *iface, + LPCMINVOKECOMMANDINFO lpcmi) +{ + BgCmImpl *This = (BgCmImpl *)iface; + + LPSHELLBROWSER lpSB; + LPSHELLVIEW lpSV = NULL; + HWND hWndSV = 0; + + TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd); + + /* get the active IShellView */ + if((lpSB = (LPSHELLBROWSER)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0))) + { + if(SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) + { + IShellView_GetWindow(lpSV, &hWndSV); + } + } + + if(HIWORD(lpcmi->lpVerb)) + { + TRACE("%s\n",lpcmi->lpVerb); + + if (! strcmp(lpcmi->lpVerb,CMDSTR_NEWFOLDERA)) + { + DoNewFolder(iface, lpSV); + } + else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWLISTA)) + { + if(hWndSV) SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW,0),0 ); + } + else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWDETAILSA)) + { + if(hWndSV) SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW,0),0 ); + } + else + { + FIXME("please report: unknown verb %s\n",lpcmi->lpVerb); + } + } + else + { + switch(LOWORD(lpcmi->lpVerb)) + { + case FCIDM_SHVIEW_NEWFOLDER: + DoNewFolder(iface, lpSV); + break; + case FCIDM_SHVIEW_INSERT: + DoPaste(iface); + break; + default: + /* if it's a id just pass it to the parent shv */ + SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0),0 ); + break; + } + } + + if (lpSV) + IShellView_Release(lpSV); /* QueryActiveShellView does AddRef*/ + + return NOERROR; +} + +/************************************************************************** + * ISVBgCm_fnGetCommandString() + * + */ +static HRESULT WINAPI ISVBgCm_fnGetCommandString( + IContextMenu2 *iface, + UINT idCommand, + UINT uFlags, + UINT* lpReserved, + LPSTR lpszName, + UINT uMaxNameLen) +{ + BgCmImpl *This = (BgCmImpl *)iface; + + TRACE("(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); + + /* test the existence of the menu items, the file dialog enables + the buttons according to this */ + if (uFlags == GCS_VALIDATEA) + { + if(HIWORD(idCommand)) + { + if (!strcmp((LPSTR)idCommand, CMDSTR_VIEWLISTA) || + !strcmp((LPSTR)idCommand, CMDSTR_VIEWDETAILSA) || + !strcmp((LPSTR)idCommand, CMDSTR_NEWFOLDERA)) + { + return NOERROR; + } + } + } + + FIXME("unknown command string\n"); + return E_FAIL; +} + +/************************************************************************** +* ISVBgCm_fnHandleMenuMsg() +*/ +static HRESULT WINAPI ISVBgCm_fnHandleMenuMsg( + IContextMenu2 *iface, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + BgCmImpl *This = (BgCmImpl *)iface; + + FIXME("(%p)->(msg=%x wp=%x lp=%lx)\n",This, uMsg, wParam, lParam); + + return E_NOTIMPL; +} + +/************************************************************************** +* IContextMenu2 VTable +* +*/ +static struct IContextMenu2Vtbl cmvt = +{ + ISVBgCm_fnQueryInterface, + ISVBgCm_fnAddRef, + ISVBgCm_fnRelease, + ISVBgCm_fnQueryContextMenu, + ISVBgCm_fnInvokeCommand, + ISVBgCm_fnGetCommandString, + ISVBgCm_fnHandleMenuMsg +}; diff --git a/reactos/lib/shell32/shv_item_cmenu.c b/reactos/lib/shell32/shv_item_cmenu.c new file mode 100644 index 00000000000..6db0b03e442 --- /dev/null +++ b/reactos/lib/shell32/shv_item_cmenu.c @@ -0,0 +1,531 @@ +/* + * IContextMenu for items in the shellview + * + * Copyright 1998, 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "winerror.h" +#include "wine/debug.h" + +#include "windef.h" +#include "wingdi.h" +#include "pidl.h" +#include "shlguid.h" +#include "undocshell.h" +#include "shlobj.h" + +#include "shell32_main.h" +#include "shellfolder.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/************************************************************************** +* IContextMenu Implementation +*/ +typedef struct +{ IContextMenu2Vtbl *lpVtbl; + DWORD ref; + IShellFolder* pSFParent; + LPITEMIDLIST pidl; /* root pidl */ + LPITEMIDLIST *apidl; /* array of child pidls */ + UINT cidl; + BOOL bAllValues; +} ItemCmImpl; + + +static struct IContextMenu2Vtbl cmvt; + +/************************************************************************** +* ISvItemCm_CanRenameItems() +*/ +static BOOL ISvItemCm_CanRenameItems(ItemCmImpl *This) +{ UINT i; + DWORD dwAttributes; + + TRACE("(%p)->()\n",This); + + if(This->apidl) + { + for(i = 0; i < This->cidl; i++){} + if(i > 1) return FALSE; /* can't rename more than one item at a time*/ + dwAttributes = SFGAO_CANRENAME; + IShellFolder_GetAttributesOf(This->pSFParent, 1, (LPCITEMIDLIST*)This->apidl, &dwAttributes); + return dwAttributes & SFGAO_CANRENAME; + } + return FALSE; +} + +/************************************************************************** +* ISvItemCm_Constructor() +*/ +IContextMenu2 *ISvItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl, LPCITEMIDLIST *apidl, UINT cidl) +{ ItemCmImpl* cm; + UINT u; + + cm = (ItemCmImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ItemCmImpl)); + cm->lpVtbl = &cmvt; + cm->ref = 1; + cm->pidl = ILClone(pidl); + cm->pSFParent = pSFParent; + + if(pSFParent) IShellFolder_AddRef(pSFParent); + + cm->apidl = _ILCopyaPidl(apidl, cidl); + cm->cidl = cidl; + + cm->bAllValues = 1; + for(u = 0; u < cidl; u++) + { + cm->bAllValues &= (_ILIsValue(apidl[u]) ? 1 : 0); + } + + TRACE("(%p)->()\n",cm); + + return (IContextMenu2*)cm; +} + +/************************************************************************** +* ISvItemCm_fnQueryInterface +*/ +static HRESULT WINAPI ISvItemCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid, LPVOID *ppvObj) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IContextMenu) || + IsEqualIID(riid, &IID_IContextMenu2)) + { + *ppvObj = This; + } + else if(IsEqualIID(riid, &IID_IShellExtInit)) /*IShellExtInit*/ + { + FIXME("-- LPSHELLEXTINIT pointer requested\n"); + } + + if(*ppvObj) + { + IUnknown_AddRef((IUnknown*)*ppvObj); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +/************************************************************************** +* ISvItemCm_fnAddRef +*/ +static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu2 *iface) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + TRACE("(%p)->(count=%lu)\n",This, This->ref); + + return ++(This->ref); +} + +/************************************************************************** +* ISvItemCm_fnRelease +*/ +static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + TRACE("(%p)->()\n",This); + + if (!--(This->ref)) + { + TRACE(" destroying IContextMenu(%p)\n",This); + + if(This->pSFParent) + IShellFolder_Release(This->pSFParent); + + if(This->pidl) + SHFree(This->pidl); + + /*make sure the pidl is freed*/ + _ILFreeaPidl(This->apidl, This->cidl); + + HeapFree(GetProcessHeap(),0,This); + return 0; + } + return This->ref; +} + +/************************************************************************** +* ICM_InsertItem() +*/ +void WINAPI _InsertMenuItem ( + HMENU hmenu, + UINT indexMenu, + BOOL fByPosition, + UINT wID, + UINT fType, + LPSTR dwTypeData, + UINT fState) +{ + MENUITEMINFOA mii; + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + if (fType == MFT_SEPARATOR) + { + mii.fMask = MIIM_ID | MIIM_TYPE; + } + else + { + mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; + mii.dwTypeData = dwTypeData; + mii.fState = fState; + } + mii.wID = wID; + mii.fType = fType; + InsertMenuItemA( hmenu, indexMenu, fByPosition, &mii); +} + +/************************************************************************** +* ISvItemCm_fnQueryContextMenu() +* FIXME: load menu MENU_SHV_FILE out of resources instead if creating +* each menu item by calling _InsertMenuItem() +*/ +static HRESULT WINAPI ISvItemCm_fnQueryContextMenu( + IContextMenu2 *iface, + HMENU hmenu, + UINT indexMenu, + UINT idCmdFirst, + UINT idCmdLast, + UINT uFlags) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags); + + if (idCmdFirst != 0) + FIXME("We should use idCmdFirst=%d and idCmdLast=%d for command ids\n", idCmdFirst, idCmdLast); + + if(!(CMF_DEFAULTONLY & uFlags) && This->cidl>0) + { + if(!(uFlags & CMF_EXPLORE)) + _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_OPEN, MFT_STRING, "&Select", MFS_ENABLED); + + if(This->bAllValues) + { + _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_OPEN, MFT_STRING, "&Open", MFS_ENABLED); + _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_EXPLORE, MFT_STRING, "&Explore", MFS_ENABLED); + } + else + { + _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_EXPLORE, MFT_STRING, "&Explore", MFS_ENABLED); + _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_OPEN, MFT_STRING, "&Open", MFS_ENABLED); + } + + SetMenuDefaultItem(hmenu, 0, MF_BYPOSITION); + + _InsertMenuItem(hmenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0); + _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_COPY, MFT_STRING, "&Copy", MFS_ENABLED); + _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_CUT, MFT_STRING, "&Cut", MFS_ENABLED); + + _InsertMenuItem(hmenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0); + _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_DELETE, MFT_STRING, "&Delete", MFS_ENABLED); + + if(uFlags & CMF_CANRENAME) + _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_RENAME, MFT_STRING, "&Rename", ISvItemCm_CanRenameItems(This) ? MFS_ENABLED : MFS_DISABLED); + + return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (FCIDM_SHVIEWLAST)); + } + return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0); +} + +/************************************************************************** +* DoOpenExplore +* +* for folders only +*/ + +static void DoOpenExplore( + IContextMenu2 *iface, + HWND hwnd, + LPCSTR verb) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + UINT i, bFolderFound = FALSE; + LPITEMIDLIST pidlFQ; + SHELLEXECUTEINFOA sei; + + /* Find the first item in the list that is not a value. These commands + should never be invoked if there isn't at least one folder item in the list.*/ + + for(i = 0; icidl; i++) + { + if(!_ILIsValue(This->apidl[i])) + { + bFolderFound = TRUE; + break; + } + } + + if (!bFolderFound) return; + + pidlFQ = ILCombine(This->pidl, This->apidl[i]); + + ZeroMemory(&sei, sizeof(sei)); + sei.cbSize = sizeof(sei); + sei.fMask = SEE_MASK_IDLIST | SEE_MASK_CLASSNAME; + sei.lpIDList = pidlFQ; + sei.lpClass = "Folder"; + sei.hwnd = hwnd; + sei.nShow = SW_SHOWNORMAL; + sei.lpVerb = verb; + ShellExecuteExA(&sei); + SHFree(pidlFQ); +} + +/************************************************************************** +* DoRename +*/ +static void DoRename( + IContextMenu2 *iface, + HWND hwnd) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + LPSHELLBROWSER lpSB; + LPSHELLVIEW lpSV; + + TRACE("(%p)->(wnd=%p)\n",This, hwnd); + + /* get the active IShellView */ + if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0))) + { + if(SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) + { + TRACE("(sv=%p)\n",lpSV); + IShellView_SelectItem(lpSV, This->apidl[0], + SVSI_DESELECTOTHERS|SVSI_EDIT|SVSI_ENSUREVISIBLE|SVSI_FOCUSED|SVSI_SELECT); + IShellView_Release(lpSV); + } + } +} + +/************************************************************************** + * DoDelete + * + * deletes the currently selected items + */ +static void DoDelete(IContextMenu2 *iface) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + ISFHelper * psfhlp; + + IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlp); + if (psfhlp) + { + ISFHelper_DeleteItems(psfhlp, This->cidl, (LPCITEMIDLIST *)This->apidl); + ISFHelper_Release(psfhlp); + } +} + +/************************************************************************** + * DoCopyOrCut + * + * copies the currently selected items into the clipboard + */ +static BOOL DoCopyOrCut( + IContextMenu2 *iface, + HWND hwnd, + BOOL bCut) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + LPSHELLBROWSER lpSB; + LPSHELLVIEW lpSV; + LPDATAOBJECT lpDo; + + TRACE("(%p)->(wnd=%p,bCut=0x%08x)\n",This, hwnd, bCut); + + /* get the active IShellView */ + if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0))) + { + if (SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) + { + if (SUCCEEDED(IShellView_GetItemObject(lpSV, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&lpDo))) + { + OleSetClipboard(lpDo); + IDataObject_Release(lpDo); + } + IShellView_Release(lpSV); + } + } + return TRUE; +} +/************************************************************************** +* ISvItemCm_fnInvokeCommand() +*/ +static HRESULT WINAPI ISvItemCm_fnInvokeCommand( + IContextMenu2 *iface, + LPCMINVOKECOMMANDINFO lpcmi) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + if (lpcmi->cbSize != sizeof(CMINVOKECOMMANDINFO)) + FIXME("Is an EX structure\n"); + + TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd); + + if( HIWORD(lpcmi->lpVerb)==0 && LOWORD(lpcmi->lpVerb) > FCIDM_SHVIEWLAST) + { + TRACE("Invalid Verb %x\n",LOWORD(lpcmi->lpVerb)); + return E_INVALIDARG; + } + + if (HIWORD(lpcmi->lpVerb) == 0) + { + switch(LOWORD(lpcmi->lpVerb)) + { + case FCIDM_SHVIEW_EXPLORE: + TRACE("Verb FCIDM_SHVIEW_EXPLORE\n"); + DoOpenExplore(iface, lpcmi->hwnd, "explore"); + break; + case FCIDM_SHVIEW_OPEN: + TRACE("Verb FCIDM_SHVIEW_OPEN\n"); + DoOpenExplore(iface, lpcmi->hwnd, "open"); + break; + case FCIDM_SHVIEW_RENAME: + TRACE("Verb FCIDM_SHVIEW_RENAME\n"); + DoRename(iface, lpcmi->hwnd); + break; + case FCIDM_SHVIEW_DELETE: + TRACE("Verb FCIDM_SHVIEW_DELETE\n"); + DoDelete(iface); + break; + case FCIDM_SHVIEW_COPY: + TRACE("Verb FCIDM_SHVIEW_COPY\n"); + DoCopyOrCut(iface, lpcmi->hwnd, FALSE); + break; + case FCIDM_SHVIEW_CUT: + TRACE("Verb FCIDM_SHVIEW_CUT\n"); + DoCopyOrCut(iface, lpcmi->hwnd, TRUE); + break; + default: + FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb)); + } + } + else + { + TRACE("Verb is %s\n",debugstr_a(lpcmi->lpVerb)); + if (strcmp(lpcmi->lpVerb,"delete")==0) + DoDelete(iface); + else + FIXME("Unhandled string verb %s\n",debugstr_a(lpcmi->lpVerb)); + } + return NOERROR; +} + +/************************************************************************** +* ISvItemCm_fnGetCommandString() +*/ +static HRESULT WINAPI ISvItemCm_fnGetCommandString( + IContextMenu2 *iface, + UINT idCommand, + UINT uFlags, + UINT* lpReserved, + LPSTR lpszName, + UINT uMaxNameLen) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + HRESULT hr = E_INVALIDARG; + + TRACE("(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); + + switch(uFlags) + { + case GCS_HELPTEXTA: + case GCS_HELPTEXTW: + hr = E_NOTIMPL; + break; + + case GCS_VERBA: + switch(idCommand) + { + case FCIDM_SHVIEW_RENAME: + strcpy((LPSTR)lpszName, "rename"); + hr = NOERROR; + break; + } + break; + + /* NT 4.0 with IE 3.0x or no IE will always call This with GCS_VERBW. In This + case, you need to do the lstrcpyW to the pointer passed.*/ + case GCS_VERBW: + switch(idCommand) + { case FCIDM_SHVIEW_RENAME: + MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen ); + hr = NOERROR; + break; + } + break; + + case GCS_VALIDATEA: + case GCS_VALIDATEW: + hr = NOERROR; + break; + } + TRACE("-- (%p)->(name=%s)\n",This, lpszName); + return hr; +} + +/************************************************************************** +* ISvItemCm_fnHandleMenuMsg() +* NOTES +* should be only in IContextMenu2 and IContextMenu3 +* is nevertheless called from word95 +*/ +static HRESULT WINAPI ISvItemCm_fnHandleMenuMsg( + IContextMenu2 *iface, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + ItemCmImpl *This = (ItemCmImpl *)iface; + + TRACE("(%p)->(msg=%x wp=%x lp=%lx)\n",This, uMsg, wParam, lParam); + + return E_NOTIMPL; +} + +static struct IContextMenu2Vtbl cmvt = +{ + ISvItemCm_fnQueryInterface, + ISvItemCm_fnAddRef, + ISvItemCm_fnRelease, + ISvItemCm_fnQueryContextMenu, + ISvItemCm_fnInvokeCommand, + ISvItemCm_fnGetCommandString, + ISvItemCm_fnHandleMenuMsg +}; diff --git a/reactos/lib/shell32/systray.c b/reactos/lib/shell32/systray.c new file mode 100644 index 00000000000..b371cd87782 --- /dev/null +++ b/reactos/lib/shell32/systray.c @@ -0,0 +1,397 @@ +/* + * Systray + * + * Copyright 1999 Kai Morich + * + * Manage the systray window. That it actually appears in the docking + * area of KDE is handled in dlls/x11drv/window.c, + * X11DRV_set_wm_hints using KWM_DOCKWINDOW. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#ifdef HAVE_UNISTD_H +# include +#endif +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" +#include "wingdi.h" +#include "winuser.h" +#include "shlobj.h" +#include "shellapi.h" +#include "shell32_main.h" +#include "commctrl.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +typedef struct SystrayItem { + HWND hWnd; + HWND hWndToolTip; + NOTIFYICONDATAA notifyIcon; + struct SystrayItem *nextTrayItem; +} SystrayItem; + +static SystrayItem *systray=NULL; +static int firstSystray=TRUE; /* defer creation of window class until first systray item is created */ + +static BOOL SYSTRAY_Delete(PNOTIFYICONDATAA pnid); + + +#define ICON_SIZE GetSystemMetrics(SM_CXSMICON) +/* space around icon (forces icon to center of KDE systray area) */ +#define ICON_BORDER 4 + + + +static BOOL SYSTRAY_ItemIsEqual(PNOTIFYICONDATAA pnid1, PNOTIFYICONDATAA pnid2) +{ + if (pnid1->hWnd != pnid2->hWnd) return FALSE; + if (pnid1->uID != pnid2->uID) return FALSE; + return TRUE; +} + +static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + HDC hdc; + PAINTSTRUCT ps; + + switch (message) { + case WM_PAINT: + { + RECT rc; + SystrayItem *ptrayItem = systray; + + while (ptrayItem) { + if (ptrayItem->hWnd==hWnd) { + if (ptrayItem->notifyIcon.hIcon) { + hdc = BeginPaint(hWnd, &ps); + GetClientRect(hWnd, &rc); + if (!DrawIconEx(hdc, rc.left+ICON_BORDER, rc.top+ICON_BORDER, ptrayItem->notifyIcon.hIcon, + ICON_SIZE, ICON_SIZE, 0, 0, DI_DEFAULTSIZE|DI_NORMAL)) { + ERR("Paint(SystrayWindow %p) failed -> removing SystrayItem %p\n", hWnd, ptrayItem); + SYSTRAY_Delete(&ptrayItem->notifyIcon); + } + } + break; + } + ptrayItem = ptrayItem->nextTrayItem; + } + EndPaint(hWnd, &ps); + } + break; + + case WM_MOUSEMOVE: + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + { + MSG msg; + SystrayItem *ptrayItem = systray; + + while ( ptrayItem ) { + if (ptrayItem->hWnd == hWnd) { + msg.hwnd=hWnd; + msg.message=message; + msg.wParam=wParam; + msg.lParam=lParam; + msg.time = GetMessageTime (); + msg.pt.x = LOWORD(GetMessagePos ()); + msg.pt.y = HIWORD(GetMessagePos ()); + + SendMessageA(ptrayItem->hWndToolTip, TTM_RELAYEVENT, 0, (LPARAM)&msg); + } + ptrayItem = ptrayItem->nextTrayItem; + } + } + /* fall through */ + + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + { + SystrayItem *ptrayItem = systray; + + while (ptrayItem) { + if (ptrayItem->hWnd == hWnd) { + if (ptrayItem->notifyIcon.hWnd && ptrayItem->notifyIcon.uCallbackMessage) { + if (!PostMessageA(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage, + (WPARAM)ptrayItem->notifyIcon.uID, (LPARAM)message)) { + ERR("PostMessage(SystrayWindow %p) failed -> removing SystrayItem %p\n", hWnd, ptrayItem); + SYSTRAY_Delete(&ptrayItem->notifyIcon); + } + } + break; + } + ptrayItem = ptrayItem->nextTrayItem; + } + } + break; + + default: + return (DefWindowProcA(hWnd, message, wParam, lParam)); + } + return (0); + +} + + +BOOL SYSTRAY_RegisterClass(void) +{ + WNDCLASSA wc; + + wc.style = CS_SAVEBITS|CS_DBLCLKS; + wc.lpfnWndProc = (WNDPROC)SYSTRAY_WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = 0; + wc.hIcon = 0; + wc.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wc.lpszMenuName = NULL; + wc.lpszClassName = "WineSystray"; + + if (!RegisterClassA(&wc)) { + ERR("RegisterClass(WineSystray) failed\n"); + return FALSE; + } + return TRUE; +} + + +BOOL SYSTRAY_ItemInit(SystrayItem *ptrayItem) +{ + RECT rect; + + /* Register the class if this is our first tray item. */ + if ( firstSystray ) { + firstSystray = FALSE; + if ( !SYSTRAY_RegisterClass() ) { + ERR( "RegisterClass(WineSystray) failed\n" ); + return FALSE; + } + } + + /* Initialize the window size. */ + rect.left = 0; + rect.top = 0; + rect.right = ICON_SIZE+2*ICON_BORDER; + rect.bottom = ICON_SIZE+2*ICON_BORDER; + + ZeroMemory( ptrayItem, sizeof(SystrayItem) ); + /* Create tray window for icon. */ + ptrayItem->hWnd = CreateWindowExA( WS_EX_TRAYWINDOW, + "WineSystray", "Wine-Systray", + WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, + rect.right-rect.left, rect.bottom-rect.top, + 0, 0, 0, 0 ); + if ( !ptrayItem->hWnd ) { + ERR( "CreateWindow(WineSystray) failed\n" ); + return FALSE; + } + + /* Create tooltip for icon. */ + ptrayItem->hWndToolTip = CreateWindowA( TOOLTIPS_CLASSA,NULL,TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + ptrayItem->hWnd, 0, 0, 0 ); + if ( !ptrayItem->hWndToolTip ) { + ERR( "CreateWindow(TOOLTIP) failed\n" ); + return FALSE; + } + return TRUE; +} + + +static void SYSTRAY_ItemTerm(SystrayItem *ptrayItem) +{ + if(ptrayItem->notifyIcon.hIcon) + DestroyIcon(ptrayItem->notifyIcon.hIcon); + if(ptrayItem->hWndToolTip) + DestroyWindow(ptrayItem->hWndToolTip); + if(ptrayItem->hWnd) + DestroyWindow(ptrayItem->hWnd); + return; +} + + +void SYSTRAY_ItemSetMessage(SystrayItem *ptrayItem, UINT uCallbackMessage) +{ + ptrayItem->notifyIcon.uCallbackMessage = uCallbackMessage; +} + + +void SYSTRAY_ItemSetIcon(SystrayItem *ptrayItem, HICON hIcon) +{ + if(ptrayItem->notifyIcon.hIcon) + DestroyIcon(ptrayItem->notifyIcon.hIcon); + ptrayItem->notifyIcon.hIcon = CopyIcon(hIcon); + InvalidateRect(ptrayItem->hWnd, NULL, TRUE); +} + + +void SYSTRAY_ItemSetTip(SystrayItem *ptrayItem, CHAR* szTip, int modify) +{ + TTTOOLINFOA ti; + + strncpy(ptrayItem->notifyIcon.szTip, szTip, sizeof(ptrayItem->notifyIcon.szTip)); + ptrayItem->notifyIcon.szTip[sizeof(ptrayItem->notifyIcon.szTip)-1]=0; + + ti.cbSize = sizeof(TTTOOLINFOA); + ti.uFlags = 0; + ti.hwnd = ptrayItem->hWnd; + ti.hinst = 0; + ti.uId = 0; + ti.lpszText = ptrayItem->notifyIcon.szTip; + ti.rect.left = 0; + ti.rect.top = 0; + ti.rect.right = ICON_SIZE+2*ICON_BORDER; + ti.rect.bottom = ICON_SIZE+2*ICON_BORDER; + + if(modify) + SendMessageA(ptrayItem->hWndToolTip, TTM_UPDATETIPTEXTA, 0, (LPARAM)&ti); + else + SendMessageA(ptrayItem->hWndToolTip, TTM_ADDTOOLA, 0, (LPARAM)&ti); +} + + +static BOOL SYSTRAY_Add(PNOTIFYICONDATAA pnid) +{ + SystrayItem **ptrayItem = &systray; + + /* Find last element. */ + while( *ptrayItem ) { + if ( SYSTRAY_ItemIsEqual(pnid, &(*ptrayItem)->notifyIcon) ) + return FALSE; + ptrayItem = &((*ptrayItem)->nextTrayItem); + } + /* Allocate SystrayItem for element and add to end of list. */ + (*ptrayItem) = HeapAlloc(GetProcessHeap(),0,sizeof(SystrayItem)); + + /* Initialize and set data for the tray element. */ + SYSTRAY_ItemInit( (*ptrayItem) ); + (*ptrayItem)->notifyIcon.uID = pnid->uID; /* only needed for callback message */ + (*ptrayItem)->notifyIcon.hWnd = pnid->hWnd; /* only needed for callback message */ + SYSTRAY_ItemSetIcon (*ptrayItem, (pnid->uFlags&NIF_ICON) ?pnid->hIcon :0); + SYSTRAY_ItemSetMessage(*ptrayItem, (pnid->uFlags&NIF_MESSAGE)?pnid->uCallbackMessage:0); + SYSTRAY_ItemSetTip (*ptrayItem, (pnid->uFlags&NIF_TIP) ?pnid->szTip :"", FALSE); + + TRACE("%p: %p %s\n", (*ptrayItem), (*ptrayItem)->notifyIcon.hWnd, + (*ptrayItem)->notifyIcon.szTip); + return TRUE; +} + + +static BOOL SYSTRAY_Modify(PNOTIFYICONDATAA pnid) +{ + SystrayItem *ptrayItem = systray; + + while ( ptrayItem ) { + if ( SYSTRAY_ItemIsEqual(pnid, &ptrayItem->notifyIcon) ) { + if (pnid->uFlags & NIF_ICON) + SYSTRAY_ItemSetIcon(ptrayItem, pnid->hIcon); + if (pnid->uFlags & NIF_MESSAGE) + SYSTRAY_ItemSetMessage(ptrayItem, pnid->uCallbackMessage); + if (pnid->uFlags & NIF_TIP) + SYSTRAY_ItemSetTip(ptrayItem, pnid->szTip, TRUE); + + TRACE("%p: %p %s\n", ptrayItem, ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.szTip); + return TRUE; + } + ptrayItem = ptrayItem->nextTrayItem; + } + return FALSE; /* not found */ +} + + +static BOOL SYSTRAY_Delete(PNOTIFYICONDATAA pnid) +{ + SystrayItem **ptrayItem = &systray; + + while (*ptrayItem) { + if (SYSTRAY_ItemIsEqual(pnid, &(*ptrayItem)->notifyIcon)) { + SystrayItem *next = (*ptrayItem)->nextTrayItem; + TRACE("%p: %p %s\n", *ptrayItem, (*ptrayItem)->notifyIcon.hWnd, (*ptrayItem)->notifyIcon.szTip); + SYSTRAY_ItemTerm(*ptrayItem); + + HeapFree(GetProcessHeap(),0,*ptrayItem); + *ptrayItem = next; + + return TRUE; + } + ptrayItem = &((*ptrayItem)->nextTrayItem); + } + + return FALSE; /* not found */ +} + +/************************************************************************* + * + */ +BOOL SYSTRAY_Init(void) +{ + return TRUE; +} + +/************************************************************************* + * Shell_NotifyIcon [SHELL32.296] + * Shell_NotifyIconA [SHELL32.297] + */ +BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid ) +{ + BOOL flag=FALSE; + TRACE("enter %p %d %ld\n", pnid->hWnd, pnid->uID, dwMessage); + switch(dwMessage) { + case NIM_ADD: + flag = SYSTRAY_Add(pnid); + break; + case NIM_MODIFY: + flag = SYSTRAY_Modify(pnid); + break; + case NIM_DELETE: + flag = SYSTRAY_Delete(pnid); + break; + } + TRACE("leave %p %d %ld=%d\n", pnid->hWnd, pnid->uID, dwMessage, flag); + return flag; +} + +/************************************************************************* + * Shell_NotifyIconW [SHELL32.298] + */ +BOOL WINAPI Shell_NotifyIconW (DWORD dwMessage, PNOTIFYICONDATAW pnid ) +{ + BOOL ret; + + PNOTIFYICONDATAA p = HeapAlloc(GetProcessHeap(),0,sizeof(NOTIFYICONDATAA)); + memcpy(p, pnid, sizeof(NOTIFYICONDATAA)); + WideCharToMultiByte( CP_ACP, 0, pnid->szTip, -1, p->szTip, sizeof(p->szTip), NULL, NULL ); + p->szTip[sizeof(p->szTip)-1] = 0; + + ret = Shell_NotifyIconA(dwMessage, p ); + + HeapFree(GetProcessHeap(),0,p); + return ret; +} diff --git a/reactos/lib/shell32/undocshell.h b/reactos/lib/shell32/undocshell.h new file mode 100644 index 00000000000..42edd1427f5 --- /dev/null +++ b/reactos/lib/shell32/undocshell.h @@ -0,0 +1,585 @@ +/* + * Copyright 1999, 2000 Juergen Schmied + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_UNDOCSHELL_H +#define __WINE_UNDOCSHELL_H + +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "commctrl.h" +#include "shlobj.h" + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ + +/**************************************************************************** + * IDList Functions + */ +BOOL WINAPI ILGetDisplayName( + LPCITEMIDLIST pidl, + LPVOID path); + +/* type parameter for ILGetDisplayNameEx() */ +#define ILGDN_FORPARSING 0 +#define ILGDN_NORMAL 1 +#define ILGDN_INFOLDER 2 + +BOOL WINAPI ILGetDisplayNameEx( + LPSHELLFOLDER psf, + LPCITEMIDLIST pidl, + LPVOID path, + DWORD type); + +LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl); +void WINAPI ILGlobalFree(LPITEMIDLIST pidl); + +LPITEMIDLIST WINAPI SHSimpleIDListFromPathA (LPCSTR lpszPath); +LPITEMIDLIST WINAPI SHSimpleIDListFromPathW (LPCWSTR lpszPath); + +HRESULT WINAPI SHILCreateFromPathA ( + LPCSTR path, + LPITEMIDLIST * ppidl, + DWORD *attributes); + +HRESULT WINAPI SHILCreateFromPathW ( + LPCWSTR path, + LPITEMIDLIST * ppidl, + DWORD *attributes); + +LPITEMIDLIST WINAPI ILCreateFromPathA(LPCSTR path); +LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path); + +/* + string functions +*/ +BOOL WINAPI StrRetToStrNA(LPSTR,DWORD,LPSTRRET,const ITEMIDLIST*); +BOOL WINAPI StrRetToStrNW(LPWSTR,DWORD,LPSTRRET,const ITEMIDLIST*); + + +/**************************************************************************** +* SHChangeNotifyRegister API +*/ +#define SHCNRF_InterruptLevel 0x0001 +#define SHCNRF_ShellLevel 0x0002 +#define SHCNRF_RecursiveInterrupt 0x1000 /* Must be combined with SHCNRF_InterruptLevel */ +#define SHCNRF_NewDelivery 0x8000 /* Messages use shared memory */ + +/**************************************************************************** + * Shell Common Dialogs + */ + +BOOL WINAPI PickIconDlg( + HWND hwndOwner, + LPSTR lpstrFile, + DWORD nMaxFile, + LPDWORD lpdwIconIndex); + +/* RunFileDlg flags */ +#define RFF_NOBROWSE 0x01 +#define RFF_NODEFAULT 0x02 +#define RFF_CALCDIRECTORY 0x04 +#define RFF_NOLABEL 0x08 +#define RFF_NOSEPARATEMEM 0x20 /* NT only */ + +/* RunFileFlg notification structure */ +typedef struct +{ + NMHDR hdr; + LPCSTR lpFile; + LPCSTR lpDirectory; + int nShow; +} NM_RUNFILEDLG, * LPNM_RUNFILEDLG; + +/* RunFileDlg notification return values */ +#define RF_OK 0x00 +#define RF_CANCEL 0x01 +#define RF_RETRY 0x02 + +void WINAPI RunFileDlg( + HWND hwndOwner, + HICON hIcon, + LPCSTR lpstrDirectory, + LPCSTR lpstrTitle, + LPCSTR lpstrDescription, + UINT uFlags); + +void WINAPI ExitWindowsDialog(HWND hwndOwner); + +BOOL WINAPI GetFileNameFromBrowse( + HWND hwndOwner, + LPSTR lpstrFile, + DWORD nMaxFile, + LPCSTR lpstrInitialDir, + LPCSTR lpstrDefExt, + LPCSTR lpstrFilter, + LPCSTR lpstrTitle); + +BOOL WINAPI SHFindComputer( + LPCITEMIDLIST pidlRoot, + LPCITEMIDLIST pidlSavedSearch); + +void WINAPI SHHandleDiskFull(HWND hwndOwner, + UINT uDrive); + +int WINAPI SHOutOfMemoryMessageBox( + HWND hwndOwner, + LPCSTR lpCaption, + UINT uType); + +DWORD WINAPI SHNetConnectionDialog( + HWND hwndOwner, + LPCSTR lpstrRemoteName, + DWORD dwType); + +/**************************************************************************** + * Memory Routines + */ + +/* The Platform SDK's shlobj.h header defines similar functions with a + * leading underscore. However those are unusable because of the leading + * underscore, because they have an incorrect calling convention, and + * because these functions are not exported by name anyway. + */ +HANDLE WINAPI SHAllocShared( + LPVOID pv, + ULONG cb, + DWORD pid); + +BOOL WINAPI SHFreeShared( + HANDLE hMem, + DWORD pid); + +LPVOID WINAPI SHLockShared( + HANDLE hMem, + DWORD pid); + +BOOL WINAPI SHUnlockShared(LPVOID pv); + +/**************************************************************************** + * Cabinet Window Messages + */ + +#define CWM_SETPATH (WM_USER + 2) +#define CWM_WANTIDLE (WM_USER + 3) +#define CWM_GETSETCURRENTINFO (WM_USER + 4) +#define CWM_SELECTITEM (WM_USER + 5) +#define CWM_SELECTITEMSTR (WM_USER + 6) +#define CWM_GETISHELLBROWSER (WM_USER + 7) +#define CWM_TESTPATH (WM_USER + 9) +#define CWM_STATECHANGE (WM_USER + 10) +#define CWM_GETPATH (WM_USER + 12) + +/* CWM_TESTPATH types */ +#define CWTP_ISEQUAL 0 +#define CWTP_ISCHILD 1 + +/* CWM_TESTPATH structure */ +typedef struct +{ + DWORD dwType; + ITEMIDLIST idl; +} CWTESTPATHSTRUCT,* LPCWTESTPATHSTRUCT; + +/**************************************************************************** + * System Imagelist Routines + */ + +int WINAPI Shell_GetCachedImageIndex( + LPCSTR lpszFileName, + UINT nIconIndex, + BOOL bSimulateDoc); + +BOOL WINAPI Shell_GetImageLists( + HIMAGELIST *lphimlLarge, + HIMAGELIST *lphimlSmall); + +HICON WINAPI SHGetFileIcon( + DWORD dwReserved, + LPCSTR lpszPath, + DWORD dwFileAttributes, + UINT uFlags); + +BOOL WINAPI FileIconInit(BOOL bFullInit); + +/**************************************************************************** + * File Menu Routines + */ +/* FileMenu_Create nSelHeight constants */ +#define FM_DEFAULT_SELHEIGHT -1 +#define FM_FULL_SELHEIGHT 0 + +/* FileMenu_Create flags */ +#define FMF_SMALL_ICONS 0x00 +#define FMF_LARGE_ICONS 0x08 +#define FMF_NO_COLUMN_BREAK 0x10 + +HMENU WINAPI FileMenu_Create( + COLORREF crBorderColor, + int nBorderWidth, + HBITMAP hBorderBmp, + int nSelHeight, + UINT uFlags); + +void WINAPI FileMenu_Destroy(HMENU hMenu); + +/* FileMenu_AppendItem constants */ +#define FM_SEPARATOR (LPCSTR)1 +#define FM_BLANK_ICON -1 +#define FM_DEFAULT_HEIGHT 0 + +BOOL WINAPI FileMenu_AppendItem( + HMENU hMenu, + LPCSTR lpszText, + UINT uID, + int iIcon, + HMENU hMenuPopup, + int nItemHeight); + +/* FileMenu_InsertUsingPidl flags */ +#define FMF_NO_EMPTY_ITEM 0x01 +#define FMF_NO_PROGRAM_GROUPS 0x04 + +/* FileMenu_InsertUsingPidl callback function */ +typedef void (CALLBACK *LPFNFMCALLBACK)(LPCITEMIDLIST pidlFolder, LPCITEMIDLIST pidlFile); + +int WINAPI FileMenu_InsertUsingPidl( + HMENU hMenu, + UINT uID, + LPCITEMIDLIST pidl, + UINT uFlags, + UINT uEnumFlags, + LPFNFMCALLBACK lpfnCallback); + +int WINAPI FileMenu_ReplaceUsingPidl( + HMENU hMenu, + UINT uID, + LPCITEMIDLIST pidl, + UINT uEnumFlags, + LPFNFMCALLBACK lpfnCallback); + +void WINAPI FileMenu_Invalidate(HMENU hMenu); + +HMENU WINAPI FileMenu_FindSubMenuByPidl( + HMENU hMenu, + LPCITEMIDLIST pidl); + +BOOL WINAPI FileMenu_TrackPopupMenuEx( + HMENU hMenu, + UINT uFlags, + int x, + int y, + HWND hWnd, + LPTPMPARAMS lptpm); + +BOOL WINAPI FileMenu_GetLastSelectedItemPidls( + UINT uReserved, + LPCITEMIDLIST *ppidlFolder, + LPCITEMIDLIST *ppidlItem); + +LRESULT WINAPI FileMenu_MeasureItem( + HWND hWnd, + LPMEASUREITEMSTRUCT lpmis); + +LRESULT WINAPI FileMenu_DrawItem( + HWND hWnd, + LPDRAWITEMSTRUCT lpdis); + +BOOL WINAPI FileMenu_InitMenuPopup(HMENU hMenu); + +void WINAPI FileMenu_AbortInitMenu(void); + +LRESULT WINAPI FileMenu_HandleMenuChar( + HMENU hMenu, + WPARAM wParam); + +BOOL WINAPI FileMenu_DeleteAllItems(HMENU hMenu); + +BOOL WINAPI FileMenu_DeleteItemByCmd( + HMENU hMenu, + UINT uID); + +BOOL WINAPI FileMenu_DeleteItemByIndex( + HMENU hMenu, + UINT uPos); + +BOOL WINAPI FileMenu_DeleteMenuItemByFirstID( + HMENU hMenu, + UINT uID); + +BOOL WINAPI FileMenu_DeleteSeparator(HMENU hMenu); + +BOOL WINAPI FileMenu_EnableItemByCmd( + HMENU hMenu, + UINT uID, + BOOL bEnable); + +DWORD WINAPI FileMenu_GetItemExtent( + HMENU hMenu, + UINT uPos); + +int WINAPI FileMenu_AppendFilesForPidl( + HMENU hMenu, + LPCITEMIDLIST pidl, + BOOL bAddSeparator); + +int WINAPI FileMenu_AddFilesForPidl( + HMENU hMenu, + UINT uReserved, + UINT uID, + LPCITEMIDLIST pidl, + UINT uFlags, + UINT uEnumFlags, + LPFNFMCALLBACK lpfnCallback); + +/**************************************************************************** + * Drag And Drop Routines + */ + +HRESULT WINAPI SHRegisterDragDrop( + HWND hWnd, + LPDROPTARGET lpDropTarget); + +HRESULT WINAPI SHRevokeDragDrop(HWND hWnd); + +BOOL WINAPI DAD_DragEnter(HWND hWnd); + +BOOL WINAPI DAD_SetDragImageFromListView( + HWND hWnd, + POINT pt); + +BOOL WINAPI DAD_ShowDragImage(BOOL bShow); + +HRESULT WINAPI CIDLData_CreateFromIDArray( + LPCITEMIDLIST pidlFolder, + DWORD cpidlFiles, + LPCITEMIDLIST *lppidlFiles, + LPDATAOBJECT *ppdataObject); + +/**************************************************************************** + * Path Manipulation Routines + */ + +BOOL WINAPI PathAppendAW(LPVOID lpszPath1, LPCVOID lpszPath2); + +LPVOID WINAPI PathCombineAW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile); + +LPVOID WINAPI PathAddBackslashAW(LPVOID path); + +LPVOID WINAPI PathBuildRootAW(LPVOID lpszPath, int drive); + +LPVOID WINAPI PathFindExtensionAW(LPCVOID path); + +LPVOID WINAPI PathFindFileNameAW(LPCVOID path); + +LPVOID WINAPI PathGetExtensionAW(LPCVOID lpszPath, DWORD void1, DWORD void2); + +LPVOID WINAPI PathGetArgsAW(LPVOID lpszPath); + +BOOL WINAPI PathRemoveFileSpecAW(LPVOID lpszPath); + +void WINAPI PathRemoveBlanksAW(LPVOID lpszPath); + +VOID WINAPI PathQuoteSpacesAW(LPVOID path); + +void WINAPI PathUnquoteSpacesAW(LPVOID lpszPath); + +BOOL WINAPI PathIsUNCAW(LPCVOID lpszPath); + +BOOL WINAPI PathIsRelativeAW(LPCVOID lpszPath); + +BOOL WINAPI PathIsRootAW(LPCVOID x); + +BOOL WINAPI PathIsExeAW(LPCVOID lpszPath); + +BOOL WINAPI PathIsDirectoryAW(LPCVOID lpszPath); + +BOOL WINAPI PathFileExistsAW(LPCVOID lpszPath); + +BOOL WINAPI PathMatchSpecAW(LPVOID lpszPath, LPVOID lpszSpec); + +BOOL WINAPI PathMakeUniqueNameAW( + LPVOID lpszBuffer, + DWORD dwBuffSize, + LPCVOID lpszShortName, + LPCVOID lpszLongName, + LPCVOID lpszPathName); + +BOOL WINAPI PathYetAnotherMakeUniqueName( + LPWSTR lpszBuffer, + LPCWSTR lpszPathName, + LPCWSTR lpszShortName, + LPCWSTR lpszLongName); + +BOOL WINAPI PathQualifyA(LPCSTR path); +BOOL WINAPI PathQualifyW(LPCWSTR path); +#define PathQualify WINELIB_NAME_AW(PathQualify) +BOOL WINAPI PathQualifyAW(LPCVOID path); + + +/* PathResolve flags */ +#define PRF_CHECKEXISTANCE 0x01 +#define PRF_EXECUTABLE 0x02 +#define PRF_QUALIFYONPATH 0x04 +#define PRF_WINDOWS31 0x08 + +BOOL WINAPI PathResolveAW(LPVOID lpszPath, LPCVOID *alpszPaths, DWORD dwFlags); + +VOID WINAPI PathSetDlgItemPathAW(HWND hDlg, int nIDDlgItem, LPCVOID lpszPath); + +/* PathProcessCommand flags */ +#define PPCF_QUOTEPATH 0x01 /* implies PPCF_INCLUDEARGS */ +#define PPCF_INCLUDEARGS 0x02 +#define PPCF_NODIRECTORIES 0x10 +#define PPCF_DONTRESOLVE 0x20 +#define PPCF_PATHISRELATIVE 0x40 + +HRESULT WINAPI PathProcessCommandAW(LPCVOID lpszPath, LPVOID lpszBuff, + DWORD dwBuffSize, DWORD dwFlags); + +void WINAPI PathStripPathAW(LPVOID lpszPath); + +BOOL WINAPI PathStripToRootAW(LPVOID lpszPath); + +void WINAPI PathRemoveArgsAW(LPVOID lpszPath); + +void WINAPI PathRemoveExtensionAW(LPVOID lpszPath); + +int WINAPI PathParseIconLocationAW(LPVOID lpszPath); + +BOOL WINAPI PathIsSameRootAW(LPCVOID lpszPath1, LPCVOID lpszPath2); + +BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs); + +/**************************************************************************** + * Shell Namespace Routines + */ + +/* Generic structure used by several messages */ +typedef struct +{ + DWORD dwReserved; + DWORD dwReserved2; + LPCITEMIDLIST pidl; + LPDWORD lpdwUser; +} SFVCBINFO, * LPSFVCBINFO; +typedef const SFVCBINFO * LPCSFVCBINFO; + +/* SFVCB_SELECTIONCHANGED structure */ +typedef struct +{ + UINT uOldState; + UINT uNewState; + LPCITEMIDLIST pidl; + LPDWORD lpdwUser; +} SFVSELECTSTATE, * LPSFVSELECTSTATE; +typedef const SFVSELECTSTATE * LPCSFVSELECTSTATE; + +/* SFVCB_COPYHOOKCALLBACK structure */ +typedef struct +{ + HWND hwnd; + UINT wFunc; + UINT wFlags; + LPCSTR pszSrcFile; + DWORD dwSrcAttribs; + LPCSTR pszDestFile; + DWORD dwDestAttribs; +} SFVCOPYHOOKINFO, * LPSFVCOPYHOOKINFO; +typedef const SFVCOPYHOOKINFO * LPCSFVCOPYHOOKINFO; + +/* SFVCB_GETDETAILSOF structure */ +typedef struct +{ + LPCITEMIDLIST pidl; + int fmt; + int cx; + STRRET lpText; +} SFVCOLUMNINFO, * LPSFVCOLUMNINFO; + +/**************************************************************************** + * Misc Stuff + */ + +/* SHWaitForFileToOpen flags */ +#define SHWFF_ADD 0x01 +#define SHWFF_REMOVE 0x02 +#define SHWFF_WAIT 0x04 + +BOOL WINAPI SHWaitForFileToOpen( + LPCITEMIDLIST pidl, + DWORD dwFlags, + DWORD dwTimeout); + +WORD WINAPI ArrangeWindows( + HWND hwndParent, + DWORD dwReserved, + LPCRECT lpRect, + WORD cKids, + CONST HWND * lpKids); + +/* RegisterShellHook types */ +#define RSH_DEREGISTER 0 +#define RSH_REGISTER 1 +#define RSH_REGISTER_PROGMAN 2 +#define RSH_REGISTER_TASKMAN 3 + +BOOL WINAPI RegisterShellHook( + HWND hWnd, + DWORD dwType); + +/* SHCreateDefClassObject callback function */ +typedef HRESULT (CALLBACK *LPFNCDCOCALLBACK)( + LPUNKNOWN pUnkOuter, + REFIID riidObject, + LPVOID *ppvObject); + +HRESULT WINAPI SHCreateDefClassObject( + REFIID riidFactory, + LPVOID *ppvFactory, + LPFNCDCOCALLBACK lpfnCallback, + LPDWORD lpdwUsage, + REFIID riidObject); + +void WINAPI SHFreeUnusedLibraries(); + +/* SHCreateLinks flags */ +#define SHCLF_PREFIXNAME 0x01 +#define SHCLF_CREATEONDESKTOP 0x02 + +HRESULT WINAPI SHCreateLinks( + HWND hWnd, + LPCSTR lpszDir, + LPDATAOBJECT lpDataObject, + UINT uFlags, + LPITEMIDLIST *lppidlLinks); + +DWORD WINAPI CheckEscapesA(LPSTR string, DWORD len); +DWORD WINAPI CheckEscapesW(LPWSTR string, DWORD len); + +/* policy functions */ +BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* defined(__cplusplus) */ + +#endif /* __WINE_UNDOCSHELL_H */ diff --git a/reactos/lib/shell32/version.h b/reactos/lib/shell32/version.h new file mode 100644 index 00000000000..7ac3ee70761 --- /dev/null +++ b/reactos/lib/shell32/version.h @@ -0,0 +1,28 @@ +/* + * Shared Resource/DllGetVersion version information + * + * Copyright (C) 2004 Robert Shearman + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define WINE_FILEVERSION_MAJOR 6 +#define WINE_FILEVERSION_MINOR 0 +#define WINE_FILEVERSION_BUILD 2600 +#define WINE_FILEVERSION_PLATFORMID 1 + +/* FIXME: when libs/wpp gets fixed to support concatenation we can remove + * this and define it in version.rc */ +#define WINE_FILEVERSION "6.0.2600.1" diff --git a/reactos/lib/shell32/version.rc b/reactos/lib/shell32/version.rc new file mode 100644 index 00000000000..32a8d626adc --- /dev/null +++ b/reactos/lib/shell32/version.rc @@ -0,0 +1,27 @@ +/* + * version information for shell32.dll + * + * Copyright (C) 2003 John K. Hohm + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "version.h" + +#define WINE_OLESELFREGISTER +#define WINE_FILEVERSION WINE_FILEVERSION_MAJOR,WINE_FILEVERSION_MINOR,WINE_FILEVERSION_BUILD,WINE_FILEVERSION_PLATFORMID +#define WINE_FILENAME_STR "shell32.dll" + +#include diff --git a/reactos/lib/shell32/version16.rc b/reactos/lib/shell32/version16.rc new file mode 100644 index 00000000000..27dd1ee6dfd --- /dev/null +++ b/reactos/lib/shell32/version16.rc @@ -0,0 +1,24 @@ +/* + * Copyright 2001 Dmitry Timoshkov + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define WINE_FILEDESCRIPTION_STR "Wine core dll" +#define WINE_FILENAME_STR "shell.dll" +#define WINE_FILEVERSION 4,0,0,0 +#define WINE_FILEVERSION_STR "4.0" + +#include "wine/wine_common_ver.rc"