diff options
author | Joseph Eagar <joeedh@gmail.com> | 2009-08-06 13:56:14 +0400 |
---|---|---|
committer | Joseph Eagar <joeedh@gmail.com> | 2009-08-06 13:56:14 +0400 |
commit | 38de6d14e4e7a55a4109313942df3ae9211b1aeb (patch) | |
tree | 83288d248bc7a4794b8b34e607f3e319e905b381 | |
parent | 416a3bf4a14a951642cace5ee8033c4c20dd9f66 (diff) | |
parent | 1e4fb484001994f4e164aab7b44c9578df59f67d (diff) |
merge with 2.5 (not trunk, last merge message said that on accident) at r22252
533 files changed, 41630 insertions, 19353 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 47daa1e4b9e..d2595bd0138 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -339,17 +339,29 @@ IF(APPLE) ENDIF(OPENAL_FOUND) ENDIF(WITH_OPENAL) - SET(PYTHON /System/Library/Frameworks/Python.framework/Versions/) - SET(PYTHON_VERSION 2.5) - SET(PYTHON_INC "${PYTHON}${PYTHON_VERSION}/include/python${PYTHON_VERSION}" CACHE STRING "") - SET(PYTHON_BINARY ${PYTHON}${PYTHON_VERSION}/bin/python${PYTHON_VERSION} CACHE STRING "") - SET(PYTHON_LIB "") - SET(PYTHON_LIBPATH ${PYTHON}${PYTHON_VERSION}/lib/python${PYTHON_VERSION}/config CACHE STRING "") - IF(CMAKE_SYSTEM_VERSION GREATER 10.4) - SET(PYTHON_LINKFLAGS "-u _PyMac_Error -framework System -framework Python") - ELSE(CMAKE_SYSTEM_VERSION GREATER 10.4) + + SET(PYTHON_VERSION 3.1) + + IF(PYTHON_VERSION MATCHES 3.1) + # we use precompiled libraries for py 3.1 and up by default + + SET(PYTHON ${LIBDIR}/python) + SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "") + SET(PYTHON_BINARY "${PYTHON}/bin/python${PYTHON_VERSION}" CACHE STRING "") + SET(PYTHON_LIB python${PYTHON_VERSION}) + SET(PYTHON_LIBPATH "${PYTHON}/lib/python${PYTHON_VERSION}" CACHE STRING "") + # SET(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled + ELSE(PYTHON_VERSION MATCHES 3.1) + # otherwise, use custom system framework + + SET(PYTHON /System/Library/Frameworks/Python.framework/Versions/) + SET(PYTHON_VERSION 2.5) + SET(PYTHON_INC "${PYTHON}${PYTHON_VERSION}/include/python${PYTHON_VERSION}" CACHE STRING "") + SET(PYTHON_BINARY ${PYTHON}${PYTHON_VERSION}/bin/python${PYTHON_VERSION} CACHE STRING "") + SET(PYTHON_LIB "") + SET(PYTHON_LIBPATH ${PYTHON}${PYTHON_VERSION}/lib/python${PYTHON_VERSION}/config CACHE STRING "") SET(PYTHON_LINKFLAGS "-u _PyMac_Error -framework System -framework Python") - ENDIF(CMAKE_SYSTEM_VERSION GREATER 10.4) + ENDIF(PYTHON_VERSION MATCHES 3.1) SET(GETTEXT ${LIBDIR}/gettext) SET(GETTEXT_INC "${GETTEXT}/include") @@ -370,11 +382,7 @@ IF(APPLE) SET(OPENEXR ${LIBDIR}/openexr) SET(OPENEXR_INC ${OPENEXR}/include/OpenEXR ${OPENEXR}/include) - IF(CMAKE_OSX_ARCHITECTURES MATCHES i386) - SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) - ELSE(CMAKE_OSX_ARCHITECTURES MATCHES i386) - SET(OPENEXR_LIB Iex Half IlmImf Imath) - ENDIF(CMAKE_OSX_ARCHITECTURES MATCHES i386) + SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) SET(OPENEXR_LIBPATH ${OPENEXR}/lib) SET(LLIBS stdc++ SystemStubs) diff --git a/SConstruct b/SConstruct index dab4dde08a3..2f93a77d74b 100644 --- a/SConstruct +++ b/SConstruct @@ -31,6 +31,7 @@ import platform as pltfrm +# Need a better way to do this. Automagical maybe is not the best thing, maybe it is. if pltfrm.architecture()[0] == '64bit': bitness = 64 else: @@ -573,8 +574,8 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc'): if env['WITH_BF_PYTHON']: ver = env["BF_PYTHON_VERSION"].replace(".", "") - dllsources.append('#release/windows/extra/python' + ver + '.zip') - dllsources.append('#release/windows/extra/zlib.pyd') + dllsources.append('${LCGDIR}/release/python' + ver + '.zip') + dllsources.append('${LCGDIR}/release/zlib.pyd') if env['BF_DEBUG'] and not env["BF_NO_PYDEBUG"]: dllsources.append('${BF_PYTHON_LIBPATH}/${BF_PYTHON_LIB}_d.dll') else: @@ -584,6 +585,9 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc'): pass # we link statically to iconv on win64 else: dllsources += ['${BF_ICONV_LIBPATH}/iconv.dll'] + if env['WITH_BF_OPENAL']: + dllsources.append('${LCGDIR}/openal/lib/OpenAL32.dll') + dllsources.append('${LCGDIR}/openal/lib/wrap_oal.dll') if env['WITH_BF_FFMPEG']: dllsources += ['${LCGDIR}/ffmpeg/lib/avcodec-52.dll', '${LCGDIR}/ffmpeg/lib/avformat-52.dll', diff --git a/blenderplayer/CMakeLists.txt b/blenderplayer/CMakeLists.txt index 2d8fc6ff4b9..28fe13cbf64 100644 --- a/blenderplayer/CMakeLists.txt +++ b/blenderplayer/CMakeLists.txt @@ -69,7 +69,6 @@ IF(UNIX) bf_blenkernel verse bf_blenkernel - bf_decimation bf_blenloader bf_blenpluginapi bf_blroutines diff --git a/config/darwin-config.py b/config/darwin-config.py index 785f1cb42a2..d6fcb14b4a9 100644 --- a/config/darwin-config.py +++ b/config/darwin-config.py @@ -10,8 +10,6 @@ import commands # IMPORTANT NOTE : OFFICIAL BUILDS SHOULD BE DONE WITH SDKs USE_SDK=True -BF_PYTHON_VERSION = '2.3' - cmd = 'uname -p' MAC_PROC=commands.getoutput(cmd) cmd = 'uname -r' @@ -29,12 +27,17 @@ else : LCGDIR = '#../lib/darwin-8.x.i386' LIBDIR = '${LCGDIR}' +BF_PYTHON_VERSION = '3.1' + if MAC_PROC== 'powerpc' and BF_PYTHON_VERSION == '2.3': MAC_MIN_VERS = '10.3' MACOSX_SDK='/Developer/SDKs/MacOSX10.3.9.sdk' -else: +elif MAC_CUR_VER=='10.4': MAC_MIN_VERS = '10.4' MACOSX_SDK='/Developer/SDKs/MacOSX10.4u.sdk' +else: + MAC_MIN_VERS = '10.5' + MACOSX_SDK='/Developer/SDKs/MacOSX10.5.sdk' # enable ffmpeg support @@ -46,24 +49,33 @@ if USE_SDK==True: #BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib' #BF_FFMPEG_LIB = 'avformat.a avcodec.a avutil.a' -# python.org libs install in /library we want to use that for 2.5 -# -# if you want py2.5 on leopard without installing -# change value to BF_PYTHON = '/Library/Frameworks/Python.framework/Versions/' -# BEWARE: in that case it will work only on leopard +if BF_PYTHON_VERSION=='3.1': + # python 3.1 uses precompiled libraries in bf svn /lib by default -if BF_PYTHON_VERSION=='2.3': - BF_PYTHON = '/System/Library/Frameworks/Python.framework/Versions/' + BF_PYTHON = LIBDIR + '/python' + BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}' + # BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}' + BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}' + BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib/python${BF_PYTHON_VERSION}' + # BF_PYTHON_LINKFLAGS = '-u _PyMac_Error -framework System' else: - BF_PYTHON = '/Library/Frameworks/Python.framework/Versions/' - -BF_PYTHON_INC = '${BF_PYTHON}${BF_PYTHON_VERSION}/include/python${BF_PYTHON_VERSION}' -BF_PYTHON_BINARY = '${BF_PYTHON}${BF_PYTHON_VERSION}/bin/python${BF_PYTHON_VERSION}' -BF_PYTHON_LIB = '' -BF_PYTHON_LIBPATH = '${BF_PYTHON}${BF_PYTHON_VERSION}/lib/python${BF_PYTHON_VERSION}/config' -BF_PYTHON_LINKFLAGS = '-u _PyMac_Error -framework System -framework Python' -if MAC_CUR_VER=='10.3' or MAC_CUR_VER=='10.4': - BF_PYTHON_LINKFLAGS ='-u __dummy '+BF_PYTHON_LINKFLAGS + # python 2.5 etc. uses built-in framework + + # python.org libs install in /library we want to use that for 2.5 + # + # if you want py2.5 on leopard without installing + # change value to BF_PYTHON = '/Library/Frameworks/Python.framework/Versions/' + # BEWARE: in that case it will work only on leopard + + BF_PYTHON = '/System/Library/Frameworks/Python.framework/Versions/' + + BF_PYTHON_INC = '${BF_PYTHON}${BF_PYTHON_VERSION}/include/python${BF_PYTHON_VERSION}' + BF_PYTHON_BINARY = '${BF_PYTHON}${BF_PYTHON_VERSION}/bin/python${BF_PYTHON_VERSION}' + BF_PYTHON_LIB = '' + BF_PYTHON_LIBPATH = '${BF_PYTHON}${BF_PYTHON_VERSION}/lib/python${BF_PYTHON_VERSION}/config' + BF_PYTHON_LINKFLAGS = '-u _PyMac_Error -framework System -framework Python' + if MAC_CUR_VER=='10.3' or MAC_CUR_VER=='10.4': + BF_PYTHON_LINKFLAGS ='-u __dummy '+BF_PYTHON_LINKFLAGS BF_QUIET = '1' WITH_BF_OPENMP = '0' @@ -139,7 +151,7 @@ BF_GETTEXT_LIB = 'intl' BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE=True -WITH_BF_PLAYER=True +WITH_BF_PLAYER = False WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' diff --git a/config/irix6-config.py b/config/irix6-config.py index 87af6b29eb1..93d6506ccc7 100644 --- a/config/irix6-config.py +++ b/config/irix6-config.py @@ -73,6 +73,7 @@ BF_GETTEXT_LIB = 'gettextpo intl' BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE='false' +WITH_BF_PLAYER = 'false' WITH_BF_BULLET = 'true' BF_BULLET = '#extern/bullet2/src' diff --git a/config/linux2-config.py b/config/linux2-config.py index b6a1eeb2c44..6b6373bb001 100644 --- a/config/linux2-config.py +++ b/config/linux2-config.py @@ -67,7 +67,7 @@ BF_GETTEXT_LIB = 'gettextlib' BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE = True -WITH_BF_PLAYER = True +WITH_BF_PLAYER = False WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' diff --git a/config/linuxcross-config.py b/config/linuxcross-config.py index 5e5c44ecd69..88ad0ddd14e 100644 --- a/config/linuxcross-config.py +++ b/config/linuxcross-config.py @@ -73,6 +73,7 @@ BF_GETTEXT_LIB = 'gnu_gettext' BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE = False +WITH_BF_PLAYER = False WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' diff --git a/config/openbsd3-config.py b/config/openbsd3-config.py index 2b0621e2ed3..92f044394d6 100644 --- a/config/openbsd3-config.py +++ b/config/openbsd3-config.py @@ -60,6 +60,7 @@ BF_GETTEXT_LIB = 'intl iconv' BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE=False +WITH_BF_PLAYER = False WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' diff --git a/config/sunos5-config.py b/config/sunos5-config.py index dc067b6f568..6e970b9cab2 100644 --- a/config/sunos5-config.py +++ b/config/sunos5-config.py @@ -68,6 +68,7 @@ BF_GETTEXT_LIB = 'gettextlib' BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE=False +WITH_BF_PLAYER = False WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' diff --git a/config/win32-mingw-config.py b/config/win32-mingw-config.py index 375b8c36ce8..51cd120dc72 100644 --- a/config/win32-mingw-config.py +++ b/config/win32-mingw-config.py @@ -4,6 +4,7 @@ LIBDIR = "${LCGDIR}" BF_PYTHON = LIBDIR + '/python' BF_PYTHON_VERSION = '3.1' #BF_PYTHON_VERSION = '2.6' +#BF_PYTHON_VERSION = '2.6' WITH_BF_STATICPYTHON = False BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}' BF_PYTHON_BINARY = 'python' @@ -80,6 +81,7 @@ BF_GETTEXT_LIB = 'gnu_gettext' BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE = False +WITH_BF_PLAYER = False WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' diff --git a/config/win32-vc-config.py b/config/win32-vc-config.py index 8b152be437e..30239579567 100644 --- a/config/win32-vc-config.py +++ b/config/win32-vc-config.py @@ -19,7 +19,7 @@ WITH_BF_OPENAL = True WITH_BF_STATICOPENAL = False BF_OPENAL = LIBDIR + '/openal' BF_OPENAL_INC = '${BF_OPENAL}/include ${BF_OPENAL}/include/AL ' -BF_OPENAL_LIB = 'dxguid openal_static' +BF_OPENAL_LIB = 'OpenAL32 wrap_oal' #'dxguid openal_static' BF_OPENAL_LIBPATH = '${BF_OPENAL}/lib' # Warning, this static lib configuration is untested! users of this OS please confirm. BF_OPENAL_LIB_STATIC = '${BF_OPENAL}/lib/libopenal.a' @@ -88,7 +88,7 @@ BF_GETTEXT_LIB = 'gnu_gettext' BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE = True -WITH_BF_PLAYER = True +WITH_BF_PLAYER = False WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' diff --git a/config/win64-vc-config.py b/config/win64-vc-config.py index a8be162ea97..12f89e08482 100644 --- a/config/win64-vc-config.py +++ b/config/win64-vc-config.py @@ -16,13 +16,10 @@ BF_PYTHON_LIB = 'python31' BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib' WITH_BF_OPENAL = False -WITH_BF_STATICOPENAL = False BF_OPENAL = LIBDIR + '/openal' BF_OPENAL_INC = '${BF_OPENAL}/include ${BF_OPENAL}/include/AL ' -BF_OPENAL_LIB = 'dxguid openal_static' +BF_OPENAL_LIB = 'OpenAL32 wrap_oal' #'dxguid openal_static' BF_OPENAL_LIBPATH = '${BF_OPENAL}/lib' -# Warning, this static lib configuration is untested! users of this OS please confirm. -BF_OPENAL_LIB_STATIC = '${BF_OPENAL}/lib/libopenal.a' # TODO - are these useful on win32? # BF_CXX = '/usr' diff --git a/intern/CMakeLists.txt b/intern/CMakeLists.txt index 697d0b6b575..71bd00f71ee 100644 --- a/intern/CMakeLists.txt +++ b/intern/CMakeLists.txt @@ -35,6 +35,7 @@ ADD_SUBDIRECTORY(decimation) ADD_SUBDIRECTORY(iksolver) ADD_SUBDIRECTORY(boolop) ADD_SUBDIRECTORY(opennl) +ADD_SUBDIRECTORY(smoke) IF(WITH_ELBEEM) ADD_SUBDIRECTORY(elbeem) diff --git a/intern/Makefile b/intern/Makefile index 995dc56c7d3..b559ce6978a 100644 --- a/intern/Makefile +++ b/intern/Makefile @@ -32,7 +32,7 @@ SOURCEDIR = intern # include nan_subdirs.mk ALLDIRS = string ghost guardedalloc moto container memutil -ALLDIRS += decimation iksolver bsp SoundSystem opennl elbeem boolop +ALLDIRS += decimation iksolver bsp SoundSystem opennl elbeem boolop smoke all:: @for i in $(ALLDIRS); do \ diff --git a/intern/SConscript b/intern/SConscript index bb8525d5ce5..bdbdc7fd6e9 100644 --- a/intern/SConscript +++ b/intern/SConscript @@ -11,7 +11,8 @@ SConscript(['SoundSystem/SConscript', 'decimation/SConscript', 'iksolver/SConscript', 'boolop/SConscript', - 'opennl/SConscript']) + 'opennl/SConscript', + 'smoke/SConscript']) # NEW_CSG was intended for intern/csg, but # getting it to compile is difficult diff --git a/intern/SoundSystem/openal/SND_OpenALDevice.cpp b/intern/SoundSystem/openal/SND_OpenALDevice.cpp index 424a05246ac..480f4ff6d74 100644 --- a/intern/SoundSystem/openal/SND_OpenALDevice.cpp +++ b/intern/SoundSystem/openal/SND_OpenALDevice.cpp @@ -372,9 +372,6 @@ SND_OpenALDevice::SND_OpenALDevice() { #ifdef __APPLE__ ALenum alc_error = ALC_NO_ERROR; // openal_2.12 -#elif defined(_WIN32) - // alcGetError has no arguments on windows - ALenum alc_error = alcGetError(); // openal_2.14+ #else ALenum alc_error = alcGetError(NULL); // openal_2.14+ #endif @@ -410,9 +407,6 @@ void SND_OpenALDevice::UseCD(void) const void SND_OpenALDevice::MakeCurrent() const { -#ifdef WIN32 - alcMakeContextCurrent(m_context); -#endif } @@ -614,11 +608,7 @@ void SND_OpenALDevice::InitListener() // have the same settings) float lispos[3] = {0,0,0}; float lisvel[3] = {0,0,0}; -#ifdef WIN32 - float lisori[6] = {0,1,0,0,0,1}; -#else float lisori[6] = {0,0,1,0,-1,0}; -#endif alListenerfv(AL_POSITION, lispos); alListenerfv(AL_VELOCITY, lisvel); diff --git a/intern/elbeem/intern/solver_init.cpp b/intern/elbeem/intern/solver_init.cpp index ce54adb48ee..fee011a70ae 100644 --- a/intern/elbeem/intern/solver_init.cpp +++ b/intern/elbeem/intern/solver_init.cpp @@ -1464,7 +1464,7 @@ void LbmFsgrSolver::initMovingObstacles(bool staticInit) { obj->applyTransformation(targetTime, &mMOIVertices,NULL /* no old normals needed */, 0, mMOIVertices.size(), false ); } else { // only do transform update - obj->getMovingPoints(mMOIVertices,pNormals); + obj->getMovingPoints(mMOIVertices,pNormals); // mMOIVertices = mCachedMovPoints mMOIVerticesOld = mMOIVertices; // WARNING - assumes mSimulationTime is global!? obj->applyTransformation(targetTime, &mMOIVertices,pNormals, 0, mMOIVertices.size(), false ); diff --git a/intern/ghost/intern/GHOST_EventManager.cpp b/intern/ghost/intern/GHOST_EventManager.cpp index f9b13115f32..92cea8d8ff7 100644 --- a/intern/ghost/intern/GHOST_EventManager.cpp +++ b/intern/ghost/intern/GHOST_EventManager.cpp @@ -51,6 +51,15 @@ GHOST_EventManager::GHOST_EventManager() GHOST_EventManager::~GHOST_EventManager() { disposeEvents(); + + TConsumerVector::iterator iter= m_consumers.begin(); + while (iter != m_consumers.end()) + { + GHOST_IEventConsumer* consumer = *iter; + delete consumer; + m_consumers.erase(iter); + iter = m_consumers.begin(); + } } diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index fcf78d9ad20..5dba76adb02 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -148,6 +148,13 @@ GHOST_SystemX11( } +GHOST_SystemX11:: +~GHOST_SystemX11() +{ + XCloseDisplay(m_display); +} + + GHOST_TSuccess GHOST_SystemX11:: init( @@ -155,11 +162,9 @@ init( GHOST_TSuccess success = GHOST_System::init(); if (success) { - m_keyboard_vector = new char[32]; - m_displayManager = new GHOST_DisplayManagerX11(this); - if (m_keyboard_vector && m_displayManager) { + if (m_displayManager) { return GHOST_kSuccess; } } @@ -534,11 +539,28 @@ GHOST_SystemX11::processEvent(XEvent *xe) window, data); } } else if (((Atom)xcme.data.l[0]) == m_wm_take_focus) { + XWindowAttributes attr; + Window fwin; + int revert_to; + /* as ICCCM say, we need reply this event * with a SetInputFocus, the data[1] have * the valid timestamp (send by the wm). + * + * Some WM send this event before the + * window is really mapped (for example + * change from virtual desktop), so we need + * to be sure that our windows is mapped + * or this call fail and close blender. */ - XSetInputFocus(m_display, xcme.window, RevertToParent, xcme.data.l[1]); + if (XGetWindowAttributes(m_display, xcme.window, &attr) == True) { + if (XGetInputFocus(m_display, &fwin, &revert_to) == True) { + if (attr.map_state == IsViewable) { + if (fwin != xcme.window) + XSetInputFocus(m_display, xcme.window, RevertToParent, xcme.data.l[1]); + } + } + } } else { /* Unknown client message, ignore */ } @@ -698,9 +720,9 @@ getModifierKeys( // analyse the masks retuned from XQueryPointer. - memset(m_keyboard_vector,0,sizeof(m_keyboard_vector)); + memset((void *)m_keyboard_vector,0,sizeof(m_keyboard_vector)); - XQueryKeymap(m_display,m_keyboard_vector); + XQueryKeymap(m_display,(char *)m_keyboard_vector); // now translate key symobols into keycodes and // test with vector. diff --git a/intern/ghost/intern/GHOST_SystemX11.h b/intern/ghost/intern/GHOST_SystemX11.h index 711a188ffe9..782f08f6737 100644 --- a/intern/ghost/intern/GHOST_SystemX11.h +++ b/intern/ghost/intern/GHOST_SystemX11.h @@ -59,6 +59,12 @@ public: GHOST_SystemX11( ); + /** + * Destructor. + */ + virtual ~GHOST_SystemX11(); + + GHOST_TSuccess init( ); @@ -258,7 +264,7 @@ private : GHOST_TUns64 m_start_time; /// A vector of keyboard key masks - char *m_keyboard_vector; + char m_keyboard_vector[32]; /** * Return the ghost window associated with the diff --git a/intern/ghost/intern/GHOST_WindowManager.cpp b/intern/ghost/intern/GHOST_WindowManager.cpp index 2b0809929c5..af96653db13 100644 --- a/intern/ghost/intern/GHOST_WindowManager.cpp +++ b/intern/ghost/intern/GHOST_WindowManager.cpp @@ -54,6 +54,7 @@ GHOST_WindowManager::GHOST_WindowManager() : GHOST_WindowManager::~GHOST_WindowManager() { + /* m_windows is freed by GHOST_System::disposeWindow */ } diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index 759951802af..366adb3ab86 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -117,18 +117,34 @@ GHOST_WindowWin32::GHOST_WindowWin32( m_maxPressure(0) { if (state != GHOST_kWindowStateFullScreen) { - // take taskbar into account RECT rect; + GHOST_TUns32 tw, th; + + width += GetSystemMetrics(SM_CXSIZEFRAME)*2; + height += GetSystemMetrics(SM_CYSIZEFRAME)*2 + GetSystemMetrics(SM_CYCAPTION); + + // take taskbar into account SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0); - height = rect.bottom - rect.top; - width = rect.right - rect.left; + th = rect.bottom - rect.top; + tw = rect.right - rect.left; + + if(tw < width) + { + width = tw; + left = rect.left; + } + if(th < height) + { + height = th; + top = rect.top; + } m_hWnd = ::CreateWindow( s_windowClassName, // pointer to registered class name title, // pointer to window name WS_OVERLAPPEDWINDOW, // window style - rect.left, // horizontal position of window - rect.top, // vertical position of window + left, // horizontal position of window + top, // vertical position of window width, // window width height, // window height 0, // handle to parent or owner window diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 1525b4eb16d..f9774b6df70 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -187,6 +187,8 @@ GHOST_WindowX11( printf("%s:%d: X11 glxChooseVisual() failed for OpenGL, verify working openGL system!\n", __FILE__, __LINE__); return; } + + memset(&m_xtablet, 0, sizeof(m_xtablet)); // Create a bunch of attributes needed to create an X window. @@ -1323,13 +1325,12 @@ setWindowCustomCursorShape( int fg_color, int bg_color ){ + Colormap colormap= DefaultColormap(m_display, DefaultScreen(m_display)); Pixmap bitmap_pix, mask_pix; XColor fg, bg; - if(XAllocNamedColor(m_display, DefaultColormap(m_display, DefaultScreen(m_display)), - "White", &fg, &fg) == 0) return GHOST_kFailure; - if(XAllocNamedColor(m_display, DefaultColormap(m_display, DefaultScreen(m_display)), - "Black", &bg, &bg) == 0) return GHOST_kFailure; + if(XAllocNamedColor(m_display, colormap, "White", &fg, &fg) == 0) return GHOST_kFailure; + if(XAllocNamedColor(m_display, colormap, "Black", &bg, &bg) == 0) return GHOST_kFailure; if (m_custom_cursor) { XFreeCursor(m_display, m_custom_cursor); @@ -1345,6 +1346,9 @@ setWindowCustomCursorShape( XFreePixmap(m_display, bitmap_pix); XFreePixmap(m_display, mask_pix); + XFreeColors(m_display, colormap, &fg.pixel, 1, 0L); + XFreeColors(m_display, colormap, &bg.pixel, 1, 0L); + return GHOST_kSuccess; } diff --git a/intern/smoke/CMakeLists.txt b/intern/smoke/CMakeLists.txt new file mode 100644 index 00000000000..90768e58be0 --- /dev/null +++ b/intern/smoke/CMakeLists.txt @@ -0,0 +1,38 @@ +# $Id$ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2006, Blender Foundation +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): Daniel Genrich +# +# ***** END GPL LICENSE BLOCK ***** + +SET(INC ${PNG_INC} ${ZLIB_INC} intern ../../extern/bullet2/src ../memutil ../guardealloc) +# ${FFTW3_INC} + +FILE(GLOB SRC intern/*.cpp) + +IF(WITH_OPENMP) + ADD_DEFINITIONS(-DPARALLEL=1) +ENDIF(WITH_OPENMP) + + +BLENDERLIB(bf_smoke "${SRC}" "${INC}") +#, libtype='blender', priority = 0 ) diff --git a/intern/smoke/Makefile b/intern/smoke/Makefile new file mode 100644 index 00000000000..e5144a9c3f8 --- /dev/null +++ b/intern/smoke/Makefile @@ -0,0 +1,54 @@ +# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*- +# vim: tabstop=8 +# +# $Id$ +# +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): Hans Lambermont, GSR +# +# ***** END GPL LICENSE BLOCK ***** +# smoke main makefile. +# + +include nan_definitions.mk + +unexport NAN_QUIET + +LIBNAME = smoke +SOURCEDIR = intern/$(LIBNAME) +DIR = $(OCGDIR)/$(SOURCEDIR) +DIRS = intern +#not ready yet TESTDIRS = test + +include nan_subdirs.mk + +install: $(ALL_OR_DEBUG) + @[ -d $(NAN_SMOKE) ] || mkdir $(NAN_SMOKE) + @[ -d $(NAN_SMOKE)/include ] || mkdir $(NAN_SMOKE)/include + @[ -d $(NAN_SMOKE)/lib/$(DEBUG_DIR) ] || mkdir $(NAN_SMOKE)/lib/$(DEBUG_DIR) + @../tools/cpifdiff.sh $(DIR)/$(DEBUG_DIR)lib$(LIBNAME).a $(NAN_SMOKE)/lib/$(DEBUG_DIR) +ifeq ($(OS),darwin) + ranlib $(NAN_SMOKE)/lib/$(DEBUG_DIR)lib$(LIBNAME).a +endif + @../tools/cpifdiff.sh extern/*.h $(NAN_SMOKE)/include/ + diff --git a/intern/smoke/SConscript b/intern/smoke/SConscript new file mode 100644 index 00000000000..c427764e19e --- /dev/null +++ b/intern/smoke/SConscript @@ -0,0 +1,15 @@ +#!/usr/bin/python +Import ('env') + +sources = env.Glob('intern/*.cpp') + +defs = '' + +if env['WITH_BF_OPENMP']: + defs += ' PARALLEL=1' + +incs = env['BF_PNG_INC'] + ' ' + env['BF_ZLIB_INC'] +incs += ' intern ../../extern/bullet2/src ../memutil ../guardealloc ' +# incs += env['BF_FFTW3_INC'] + +env.BlenderLib ('bf_smoke', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] ) diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h new file mode 100644 index 00000000000..b7819d06edc --- /dev/null +++ b/intern/smoke/extern/smoke_API.h @@ -0,0 +1,62 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 by Daniel Genrich + * All rights reserved. + * + * Contributor(s): None + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef SMOKE_API_H_ +#define SMOKE_API_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct FLUID_3D *smoke_init(int *res, int amplify, float *p0, float *p1, float dt); +void smoke_free(struct FLUID_3D *fluid); + +void smoke_initBlenderRNA(struct FLUID_3D *fluid, float *alpha, float *beta); + +void smoke_step(struct FLUID_3D *fluid); + +float *smoke_get_density(struct FLUID_3D *fluid); +float *smoke_get_bigdensity(struct FLUID_3D *fluid); +float *smoke_get_heat(struct FLUID_3D *fluid); +float *smoke_get_velocity_x(struct FLUID_3D *fluid); +float *smoke_get_velocity_y(struct FLUID_3D *fluid); +float *smoke_get_velocity_z(struct FLUID_3D *fluid); + +unsigned char *smoke_get_obstacle(struct FLUID_3D *fluid); + +size_t smoke_get_index(int x, int max_x, int y, int max_y, int z); +size_t smoke_get_index2d(int x, int max_x, int y); + +void smoke_set_noise(struct FLUID_3D *fluid, int type); + +void smoke_get_bigres(struct FLUID_3D *fluid, int *res); + +#ifdef __cplusplus +} +#endif + +#endif /* SMOKE_API_H_ */
\ No newline at end of file diff --git a/intern/smoke/intern/EIGENVALUE_HELPER.h b/intern/smoke/intern/EIGENVALUE_HELPER.h new file mode 100644 index 00000000000..6ff61c5ca8e --- /dev/null +++ b/intern/smoke/intern/EIGENVALUE_HELPER.h @@ -0,0 +1,47 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +////////////////////////////////////////////////////////////////////// +// Helper function, compute eigenvalues of 3x3 matrix +////////////////////////////////////////////////////////////////////// + +#include "tnt/jama_eig.h" + +////////////////////////////////////////////////////////////////////// +// eigenvalues of 3x3 non-symmetric matrix +////////////////////////////////////////////////////////////////////// +int inline computeEigenvalues3x3( + float dout[3], + float a[3][3]) +{ + TNT::Array2D<float> A = TNT::Array2D<float>(3,3, &a[0][0]); + TNT::Array1D<float> eig = TNT::Array1D<float>(3); + TNT::Array1D<float> eigImag = TNT::Array1D<float>(3); + JAMA::Eigenvalue<float> jeig = JAMA::Eigenvalue<float>(A); + jeig.getRealEigenvalues(eig); + + // complex ones + jeig.getImagEigenvalues(eigImag); + dout[0] = sqrt(eig[0]*eig[0] + eigImag[0]*eigImag[0]); + dout[1] = sqrt(eig[1]*eig[1] + eigImag[1]*eigImag[1]); + dout[2] = sqrt(eig[2]*eig[2] + eigImag[2]*eigImag[2]); + return 0; +} + +#undef rfabs +#undef ROT diff --git a/intern/smoke/intern/FFT_NOISE.h b/intern/smoke/intern/FFT_NOISE.h new file mode 100644 index 00000000000..9ae9682e2a0 --- /dev/null +++ b/intern/smoke/intern/FFT_NOISE.h @@ -0,0 +1,178 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +///////////////////////////////////////////////////////////////////////// +// + +#ifndef FFT_NOISE_H_ +#define FFT_NOISE_H_ + +#if 0 +#include <iostream> +#include <fftw3.h> +#include <MERSENNETWISTER.h> + +#include "WAVELET_NOISE.h" + +#ifndef M_PI +#define M_PI 3.14159265 +#endif + +///////////////////////////////////////////////////////////////////////// +// shift spectrum to the format that FFTW expects +///////////////////////////////////////////////////////////////////////// +static void shift3D(float*& field, int xRes, int yRes, int zRes) +{ + int xHalf = xRes / 2; + int yHalf = yRes / 2; + int zHalf = zRes / 2; + int slabSize = xRes * yRes; + for (int z = 0; z < zHalf; z++) + for (int y = 0; y < yHalf; y++) + for (int x = 0; x < xHalf; x++) + { + int index = x + y * xRes + z * xRes * yRes; + float temp; + int xSwap = xHalf; + int ySwap = yHalf * xRes; + int zSwap = zHalf * xRes * yRes; + + // [0,0,0] to [1,1,1] + temp = field[index]; + field[index] = field[index + xSwap + ySwap + zSwap]; + field[index + xSwap + ySwap + zSwap] = temp; + + // [1,0,0] to [0,1,1] + temp = field[index + xSwap]; + field[index + xSwap] = field[index + ySwap + zSwap]; + field[index + ySwap + zSwap] = temp; + + // [0,1,0] to [1,0,1] + temp = field[index + ySwap]; + field[index + ySwap] = field[index + xSwap + zSwap]; + field[index + xSwap + zSwap] = temp; + + // [0,0,1] to [1,1,0] + temp = field[index + zSwap]; + field[index + zSwap] = field[index + xSwap + ySwap]; + field[index + xSwap + ySwap] = temp; + } +} + +static void generatTile_FFT(float* const noiseTileData, std::string filename) +{ + if (loadTile(noiseTileData, filename)) return; + + int res = NOISE_TILE_SIZE; + int xRes = res; + int yRes = res; + int zRes = res; + int totalCells = xRes * yRes * zRes; + + // create and shift the filter + float* filter = new float[totalCells]; + for (int z = 0; z < zRes; z++) + for (int y = 0; y < yRes; y++) + for (int x = 0; x < xRes; x++) + { + int index = x + y * xRes + z * xRes * yRes; + float diff[] = {abs(x - xRes/2), + abs(y - yRes/2), + abs(z - zRes/2)}; + float radius = sqrtf(diff[0] * diff[0] + + diff[1] * diff[1] + + diff[2] * diff[2]) / (xRes / 2); + radius *= M_PI; + float H = cos((M_PI / 2.0f) * log(4.0f * radius / M_PI) / log(2.0f)); + H = H * H; + float filtered = H; + + // clamp everything outside the wanted band + if (radius >= M_PI / 2.0f) + filtered = 0.0f; + + // make sure to capture all low frequencies + if (radius <= M_PI / 4.0f) + filtered = 1.0f; + + filter[index] = filtered; + } + shift3D(filter, xRes, yRes, zRes); + + // create the noise + float* noise = new float[totalCells]; + int index = 0; + MTRand twister; + for (int z = 0; z < zRes; z++) + for (int y = 0; y < yRes; y++) + for (int x = 0; x < xRes; x++, index++) + noise[index] = twister.randNorm(); + + // create padded field + fftw_complex* forward = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * totalCells); + + // init padded field + index = 0; + for (int z = 0; z < zRes; z++) + for (int y = 0; y < yRes; y++) + for (int x = 0; x < xRes; x++, index++) + { + forward[index][0] = noise[index]; + forward[index][1] = 0.0f; + } + + // forward FFT + fftw_complex* backward = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * totalCells); + fftw_plan forwardPlan = fftw_plan_dft_3d(xRes, yRes, zRes, forward, backward, FFTW_FORWARD, FFTW_ESTIMATE); + fftw_execute(forwardPlan); + fftw_destroy_plan(forwardPlan); + + // apply filter + index = 0; + for (int z = 0; z < zRes; z++) + for (int y = 0; y < yRes; y++) + for (int x = 0; x < xRes; x++, index++) + { + backward[index][0] *= filter[index]; + backward[index][1] *= filter[index]; + } + + // backward FFT + fftw_plan backwardPlan = fftw_plan_dft_3d(xRes, yRes, zRes, backward, forward, FFTW_BACKWARD, FFTW_ESTIMATE); + fftw_execute(backwardPlan); + fftw_destroy_plan(backwardPlan); + + // subtract out the low frequency components + index = 0; + for (int z = 0; z < zRes; z++) + for (int y = 0; y < yRes; y++) + for (int x = 0; x < xRes; x++, index++) + noise[index] -= forward[index][0] / totalCells; + + // save out the noise tile + saveTile(noise, filename); + + fftw_free(forward); + fftw_free(backward); + delete[] filter; + delete[] noise; +} + +#endif + +#endif /* FFT_NOISE_H_ */ diff --git a/intern/smoke/intern/FLUID_3D.cpp b/intern/smoke/intern/FLUID_3D.cpp new file mode 100644 index 00000000000..344883866a8 --- /dev/null +++ b/intern/smoke/intern/FLUID_3D.cpp @@ -0,0 +1,672 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +// FLUID_3D.cpp: implementation of the FLUID_3D class. +// +////////////////////////////////////////////////////////////////////// + +#include "FLUID_3D.h" +#include "IMAGE.h" +#include <INTERPOLATE.h> +#include "SPHERE.h" +#include <zlib.h> + +// boundary conditions of the fluid domain +#define DOMAIN_BC_FRONT 1 +#define DOMAIN_BC_TOP 0 +#define DOMAIN_BC_LEFT 1 +#define DOMAIN_BC_BACK DOMAIN_BC_FRONT +#define DOMAIN_BC_BOTTOM DOMAIN_BC_TOP +#define DOMAIN_BC_RIGHT DOMAIN_BC_LEFT + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +FLUID_3D::FLUID_3D(int *res, int amplify, float *p0, float dt) : + _xRes(res[0]), _yRes(res[1]), _zRes(res[2]), _res(0.0f), _dt(dt) +{ + // set simulation consts + // _dt = dt; // 0.10 + + // start point of array + _p0[0] = p0[0]; + _p0[1] = p0[1]; + _p0[2] = p0[2]; + + _iterations = 100; + _tempAmb = 0; + _heatDiffusion = 1e-3; + _vorticityEps = 2.0; + _totalTime = 0.0f; + _totalSteps = 0; + _res = Vec3Int(_xRes,_yRes,_zRes); + _maxRes = MAX3(_xRes, _yRes, _zRes); + + // initialize wavelet turbulence + _wTurbulence = new WTURBULENCE(_res[0],_res[1],_res[2], amplify); + + // scale the constants according to the refinement of the grid + _dx = 1.0f / (float)_maxRes; + float scaling = 64.0f / _maxRes; + scaling = (scaling < 1.0f) ? 1.0f : scaling; + _vorticityEps /= scaling; + + // allocate arrays + _totalCells = _xRes * _yRes * _zRes; + _slabSize = _xRes * _yRes; + _divergence = new float[_totalCells]; + _pressure = new float[_totalCells]; + _xVelocity = new float[_totalCells]; + _yVelocity = new float[_totalCells]; + _zVelocity = new float[_totalCells]; + _xVelocityOld = new float[_totalCells]; + _yVelocityOld = new float[_totalCells]; + _zVelocityOld = new float[_totalCells]; + _xForce = new float[_totalCells]; + _yForce = new float[_totalCells]; + _zForce = new float[_totalCells]; + _vorticity = new float[_totalCells]; + _density = new float[_totalCells]; + _densityOld = new float[_totalCells]; + _heat = new float[_totalCells]; + _heatOld = new float[_totalCells]; + _residual = new float[_totalCells]; + _direction = new float[_totalCells]; + _q = new float[_totalCells]; + _obstacles = new unsigned char[_totalCells]; + _xVorticity = new float[_totalCells]; + _yVorticity = new float[_totalCells]; + _zVorticity = new float[_totalCells]; + + for (int x = 0; x < _totalCells; x++) + { + _density[x] = 0.0f; + _densityOld[x] = 0.0f; + _heat[x] = 0.0f; + _heatOld[x] = 0.0f; + _divergence[x] = 0.0f; + _pressure[x] = 0.0f; + _xVelocity[x] = 0.0f; + _yVelocity[x] = 0.0f; + _zVelocity[x] = 0.0f; + _xVelocityOld[x] = 0.0f; + _yVelocityOld[x] = 0.0f; + _zVelocityOld[x] = 0.0f; + _xForce[x] = 0.0f; + _yForce[x] = 0.0f; + _zForce[x] = 0.0f; + _xVorticity[x] = 0.0f; + _yVorticity[x] = 0.0f; + _zVorticity[x] = 0.0f; + _residual[x] = 0.0f; + _obstacles[x] = false; + } + + // set side obstacles + int index; + for (int y = 0; y < _yRes; y++) // z + for (int x = 0; x < _xRes; x++) + { + // front slab + index = x + y * _xRes; + if(DOMAIN_BC_BOTTOM==1) _obstacles[index] = 1; + + // back slab + index += _totalCells - _slabSize; + if(DOMAIN_BC_TOP==1) _obstacles[index] = 1; + } + for (int z = 0; z < _zRes; z++) // y + for (int x = 0; x < _xRes; x++) + { + // bottom slab + index = x + z * _slabSize; + if(DOMAIN_BC_FRONT==1) _obstacles[index] = 1; + + // top slab + index += _slabSize - _xRes; + if(DOMAIN_BC_BACK==1) _obstacles[index] = 1; + } + for (int z = 0; z < _zRes; z++) // x + for (int y = 0; y < _yRes; y++) + { + // left slab + index = y * _xRes + z * _slabSize; + if(DOMAIN_BC_LEFT==1) _obstacles[index] = 1; + + // right slab + index += _xRes - 1; + if(DOMAIN_BC_RIGHT==1) _obstacles[index] = 1; + } + + /* + SPHERE *obsSphere = NULL; + obsSphere = new SPHERE(0.375,0.5,0.375, 0.1); // for 4 to 3 domain + addObstacle(obsSphere); + delete obsSphere; + */ +} + +FLUID_3D::~FLUID_3D() +{ + if (_divergence) delete[] _divergence; + if (_pressure) delete[] _pressure; + if (_xVelocity) delete[] _xVelocity; + if (_yVelocity) delete[] _yVelocity; + if (_zVelocity) delete[] _zVelocity; + if (_xVelocityOld) delete[] _xVelocityOld; + if (_yVelocityOld) delete[] _yVelocityOld; + if (_zVelocityOld) delete[] _zVelocityOld; + if (_xForce) delete[] _xForce; + if (_yForce) delete[] _yForce; + if (_zForce) delete[] _zForce; + if (_residual) delete[] _residual; + if (_direction) delete[] _direction; + if (_q) delete[] _q; + if (_density) delete[] _density; + if (_densityOld) delete[] _densityOld; + if (_heat) delete[] _heat; + if (_heatOld) delete[] _heatOld; + if (_xVorticity) delete[] _xVorticity; + if (_yVorticity) delete[] _yVorticity; + if (_zVorticity) delete[] _zVorticity; + if (_vorticity) delete[] _vorticity; + if (_obstacles) delete[] _obstacles; + if (_wTurbulence) delete _wTurbulence; + + printf("deleted fluid\n"); +} + +// init direct access functions from blender +void FLUID_3D::initBlenderRNA(float *alpha, float *beta) +{ + _alpha = alpha; + _beta = beta; + + // XXX TODO DEBUG + // *_alpha = 0; + // *_beta = 0; +} + +////////////////////////////////////////////////////////////////////// +// step simulation once +////////////////////////////////////////////////////////////////////// +void FLUID_3D::step() +{ + // wipe forces + for (int i = 0; i < _totalCells; i++) + _xForce[i] = _yForce[i] = _zForce[i] = 0.0f; + + wipeBoundaries(); + + // run the solvers + addVorticity(); + addBuoyancy(_heat, _density); + addForce(); + project(); + diffuseHeat(); + + // advect everything + advectMacCormack(); + + if(_wTurbulence) { + _wTurbulence->stepTurbulenceFull(_dt/_dx, + _xVelocity, _yVelocity, _zVelocity, _obstacles); + // _wTurbulence->stepTurbulenceReadable(_dt/_dx, + // _xVelocity, _yVelocity, _zVelocity, _obstacles); + } +/* + // no file output + float *src = _density; + string prefix = string("./original.preview/density_fullxy_"); + writeImageSliceXY(src,_res, _res[2]/2, prefix, _totalSteps); +*/ + // artificial damping -- this is necessary because we use a + // collated grid, and at very coarse grid resolutions, banding + // artifacts can occur + artificialDamping(_xVelocity); + artificialDamping(_yVelocity); + artificialDamping(_zVelocity); +/* +// no file output + string pbrtPrefix = string("./pbrt/density_small_"); + IMAGE::dumpPBRT(_totalSteps, pbrtPrefix, _density, _res[0],_res[1],_res[2]); + */ + _totalTime += _dt; + _totalSteps++; +} + +////////////////////////////////////////////////////////////////////// +// helper function to dampen co-located grid artifacts of given arrays in intervals +// (only needed for velocity, strength (w) depends on testcase... +////////////////////////////////////////////////////////////////////// +void FLUID_3D::artificialDamping(float* field) { + const float w = 0.9; + if(_totalSteps % 4 == 1) { + for (int z = 1; z < _res[2]-1; z++) + for (int y = 1; y < _res[1]-1; y++) + for (int x = 1+(y+z)%2; x < _res[0]-1; x+=2) { + const int index = x + y*_res[0] + z * _slabSize; + field[index] = (1-w)*field[index] + 1./6. * w*( + field[index+1] + field[index-1] + + field[index+_res[0]] + field[index-_res[0]] + + field[index+_slabSize] + field[index-_slabSize] ); + } + } + if(_totalSteps % 4 == 3) { + for (int z = 1; z < _res[2]-1; z++) + for (int y = 1; y < _res[1]-1; y++) + for (int x = 1+(y+z+1)%2; x < _res[0]-1; x+=2) { + const int index = x + y*_res[0] + z * _slabSize; + field[index] = (1-w)*field[index] + 1./6. * w*( + field[index+1] + field[index-1] + + field[index+_res[0]] + field[index-_res[0]] + + field[index+_slabSize] + field[index-_slabSize] ); + } + } +} + +////////////////////////////////////////////////////////////////////// +// copy out the boundary in all directions +////////////////////////////////////////////////////////////////////// +void FLUID_3D::copyBorderAll(float* field) +{ + int index; + for (int y = 0; y < _yRes; y++) + for (int x = 0; x < _xRes; x++) + { + // front slab + index = x + y * _xRes; + field[index] = field[index + _slabSize]; + + // back slab + index += _totalCells - _slabSize; + field[index] = field[index - _slabSize]; + } + + for (int z = 0; z < _zRes; z++) + for (int x = 0; x < _xRes; x++) + { + // bottom slab + index = x + z * _slabSize; + field[index] = field[index + _xRes]; + + // top slab + index += _slabSize - _xRes; + field[index] = field[index - _xRes]; + } + + for (int z = 0; z < _zRes; z++) + for (int y = 0; y < _yRes; y++) + { + // left slab + index = y * _xRes + z * _slabSize; + field[index] = field[index + 1]; + + // right slab + index += _xRes - 1; + field[index] = field[index - 1]; + } +} + +////////////////////////////////////////////////////////////////////// +// wipe boundaries of velocity and density +////////////////////////////////////////////////////////////////////// +void FLUID_3D::wipeBoundaries() +{ + setZeroBorder(_xVelocity, _res); + setZeroBorder(_yVelocity, _res); + setZeroBorder(_zVelocity, _res); + setZeroBorder(_density, _res); +} + +////////////////////////////////////////////////////////////////////// +// add forces to velocity field +////////////////////////////////////////////////////////////////////// +void FLUID_3D::addForce() +{ + for (int i = 0; i < _totalCells; i++) + { + _xVelocity[i] += _dt * _xForce[i]; + _yVelocity[i] += _dt * _yForce[i]; + _zVelocity[i] += _dt * _zForce[i]; + } +} + +////////////////////////////////////////////////////////////////////// +// project into divergence free field +////////////////////////////////////////////////////////////////////// +void FLUID_3D::project() +{ + int index, x, y, z; + setObstacleBoundaries(); + + // copy out the boundaries + if(DOMAIN_BC_LEFT == 0) setNeumannX(_xVelocity, _res); + else setZeroX(_xVelocity, _res); + + if(DOMAIN_BC_TOP == 0) setNeumannZ(_zVelocity, _res); + else setZeroZ(_zVelocity, _res); + + if(DOMAIN_BC_FRONT == 0) setNeumannY(_yVelocity, _res); + else setZeroY(_yVelocity, _res); + + // calculate divergence + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + { + float xright = _xVelocity[index + 1]; + float xleft = _xVelocity[index - 1]; + float yup = _yVelocity[index + _xRes]; + float ydown = _yVelocity[index - _xRes]; + float ztop = _zVelocity[index + _slabSize]; + float zbottom = _zVelocity[index - _slabSize]; + + if(_obstacles[index+1]) xright = - _xVelocity[index]; + if(_obstacles[index-1]) xleft = - _xVelocity[index]; + if(_obstacles[index+_xRes]) yup = - _yVelocity[index]; + if(_obstacles[index-_xRes]) ydown = - _yVelocity[index]; + if(_obstacles[index+_slabSize]) ztop = - _zVelocity[index]; + if(_obstacles[index-_slabSize]) zbottom = - _zVelocity[index]; + + _divergence[index] = -_dx * 0.5f * ( + xright - xleft + + yup - ydown + + ztop - zbottom ); + _pressure[index] = 0.0f; + } + copyBorderAll(_pressure); + + // solve Poisson equation + solvePressure(_pressure, _divergence, _obstacles); + + // project out solution + float invDx = 1.0f / _dx; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + { + _xVelocity[index] -= 0.5f * (_pressure[index + 1] - _pressure[index - 1]) * invDx; + _yVelocity[index] -= 0.5f * (_pressure[index + _xRes] - _pressure[index - _xRes]) * invDx; + _zVelocity[index] -= 0.5f * (_pressure[index + _slabSize] - _pressure[index - _slabSize]) * invDx; + } +} + +////////////////////////////////////////////////////////////////////// +// diffuse heat +////////////////////////////////////////////////////////////////////// +void FLUID_3D::diffuseHeat() +{ + SWAP_POINTERS(_heat, _heatOld); + + copyBorderAll(_heatOld); + solveHeat(_heat, _heatOld, _obstacles); + + // zero out inside obstacles + for (int x = 0; x < _totalCells; x++) + if (_obstacles[x]) + _heat[x] = 0.0f; +} + +////////////////////////////////////////////////////////////////////// +// stamp an obstacle in the _obstacles field +////////////////////////////////////////////////////////////////////// +void FLUID_3D::addObstacle(OBSTACLE* obstacle) +{ + int index = 0; + for (int z = 0; z < _zRes; z++) + for (int y = 0; y < _yRes; y++) + for (int x = 0; x < _xRes; x++, index++) + if (obstacle->inside(x * _dx, y * _dx, z * _dx)) { + _obstacles[index] = true; + } +} + +////////////////////////////////////////////////////////////////////// +// calculate the obstacle directional types +////////////////////////////////////////////////////////////////////// +void FLUID_3D::setObstacleBoundaries() +{ + // cull degenerate obstacles , move to addObstacle? + for (int z = 1, index = _slabSize + _xRes + 1; + z < _zRes - 1; z++, index += 2 * _xRes) + for (int y = 1; y < _yRes - 1; y++, index += 2) + for (int x = 1; x < _xRes - 1; x++, index++) + if (_obstacles[index] != EMPTY) + { + const int top = _obstacles[index + _slabSize]; + const int bottom= _obstacles[index - _slabSize]; + const int up = _obstacles[index + _xRes]; + const int down = _obstacles[index - _xRes]; + const int left = _obstacles[index - 1]; + const int right = _obstacles[index + 1]; + + int counter = 0; + if (up) counter++; + if (down) counter++; + if (left) counter++; + if (right) counter++; + if (top) counter++; + if (bottom) counter++; + + if (counter < 3) + _obstacles[index] = EMPTY; + } + + // tag remaining obstacle blocks + for (int z = 1, index = _slabSize + _xRes + 1; + z < _zRes - 1; z++, index += 2 * _xRes) + for (int y = 1; y < _yRes - 1; y++, index += 2) + for (int x = 1; x < _xRes - 1; x++, index++) + { + // could do cascade of ifs, but they are a pain + if (_obstacles[index] != EMPTY) + { + const int top = _obstacles[index + _slabSize]; + const int bottom= _obstacles[index - _slabSize]; + const int up = _obstacles[index + _xRes]; + const int down = _obstacles[index - _xRes]; + const int left = _obstacles[index - 1]; + const int right = _obstacles[index + 1]; + + // unused + // const bool fullz = (top && bottom); + // const bool fully = (up && down); + //const bool fullx = (left && right); + + _xVelocity[index] = + _yVelocity[index] = + _zVelocity[index] = 0.0f; + _pressure[index] = 0.0f; + + // average pressure neighbors + float pcnt = 0.; + if (left && !right) { + _pressure[index] += _pressure[index + 1]; + pcnt += 1.; + } + if (!left && right) { + _pressure[index] += _pressure[index - 1]; + pcnt += 1.; + } + if (up && !down) { + _pressure[index] += _pressure[index - _xRes]; + pcnt += 1.; + } + if (!up && down) { + _pressure[index] += _pressure[index + _xRes]; + pcnt += 1.; + } + if (top && !bottom) { + _pressure[index] += _pressure[index - _xRes]; + pcnt += 1.; + } + if (!top && bottom) { + _pressure[index] += _pressure[index + _xRes]; + pcnt += 1.; + } + _pressure[index] /= pcnt; + + // TODO? set correct velocity bc's + // velocities are only set to zero right now + // this means it's not a full no-slip boundary condition + // but a "half-slip" - still looks ok right now + } + } +} + +////////////////////////////////////////////////////////////////////// +// add buoyancy forces +////////////////////////////////////////////////////////////////////// +void FLUID_3D::addBuoyancy(float *heat, float *density) +{ + int index = 0; + + for (int z = 0; z < _zRes; z++) + for (int y = 0; y < _yRes; y++) + for (int x = 0; x < _xRes; x++, index++) + { + _zForce[index] += *_alpha * density[index] + (*_beta * (heat[index] - _tempAmb)); // DG: was _yForce, changed for Blender + } +} + +////////////////////////////////////////////////////////////////////// +// add vorticity to the force field +////////////////////////////////////////////////////////////////////// +void FLUID_3D::addVorticity() +{ + int x,y,z,index; + if(_vorticityEps<=0.) return; + + // calculate vorticity + float gridSize = 0.5f / _dx; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + { + int up = _obstacles[index + _xRes] ? index : index + _xRes; + int down = _obstacles[index - _xRes] ? index : index - _xRes; + float dy = (up == index || down == index) ? 1.0f / _dx : gridSize; + int out = _obstacles[index + _slabSize] ? index : index + _slabSize; + int in = _obstacles[index - _slabSize] ? index : index - _slabSize; + float dz = (out == index || in == index) ? 1.0f / _dx : gridSize; + int right = _obstacles[index + 1] ? index : index + 1; + int left = _obstacles[index - 1] ? index : index - 1; + float dx = (right == index || right == index) ? 1.0f / _dx : gridSize; + + _xVorticity[index] = (_zVelocity[up] - _zVelocity[down]) * dy + (-_yVelocity[out] + _yVelocity[in]) * dz; + _yVorticity[index] = (_xVelocity[out] - _xVelocity[in]) * dz + (-_zVelocity[right] + _zVelocity[left]) * dx; + _zVorticity[index] = (_yVelocity[right] - _yVelocity[left]) * dx + (-_xVelocity[up] + _xVelocity[down])* dy; + + _vorticity[index] = sqrtf(_xVorticity[index] * _xVorticity[index] + + _yVorticity[index] * _yVorticity[index] + + _zVorticity[index] * _zVorticity[index]); + } + + // calculate normalized vorticity vectors + float eps = _vorticityEps; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + if (!_obstacles[index]) + { + float N[3]; + + int up = _obstacles[index + _xRes] ? index : index + _xRes; + int down = _obstacles[index - _xRes] ? index : index - _xRes; + float dy = (up == index || down == index) ? 1.0f / _dx : gridSize; + int out = _obstacles[index + _slabSize] ? index : index + _slabSize; + int in = _obstacles[index - _slabSize] ? index : index - _slabSize; + float dz = (out == index || in == index) ? 1.0f / _dx : gridSize; + int right = _obstacles[index + 1] ? index : index + 1; + int left = _obstacles[index - 1] ? index : index - 1; + float dx = (right == index || right == index) ? 1.0f / _dx : gridSize; + N[0] = (_vorticity[right] - _vorticity[left]) * dx; + N[1] = (_vorticity[up] - _vorticity[down]) * dy; + N[2] = (_vorticity[out] - _vorticity[in]) * dz; + + float magnitude = sqrtf(N[0] * N[0] + N[1] * N[1] + N[2] * N[2]); + if (magnitude > 0.0f) + { + magnitude = 1.0f / magnitude; + N[0] *= magnitude; + N[1] *= magnitude; + N[2] *= magnitude; + + _xForce[index] += (N[1] * _zVorticity[index] - N[2] * _yVorticity[index]) * _dx * eps; + _yForce[index] -= (N[0] * _zVorticity[index] - N[2] * _xVorticity[index]) * _dx * eps; + _zForce[index] += (N[0] * _yVorticity[index] - N[1] * _xVorticity[index]) * _dx * eps; + } + } +} + +////////////////////////////////////////////////////////////////////// +// Advect using the MacCormack method from the Selle paper +////////////////////////////////////////////////////////////////////// +void FLUID_3D::advectMacCormack() +{ + Vec3Int res = Vec3Int(_xRes,_yRes,_zRes); + + if(DOMAIN_BC_LEFT == 0) copyBorderX(_xVelocity, res); + else setZeroX(_xVelocity, res); + + if(DOMAIN_BC_TOP == 0) copyBorderZ(_zVelocity, res); + else setZeroZ(_zVelocity, res); + + if(DOMAIN_BC_FRONT == 0) copyBorderY(_yVelocity, res); + else setZeroY(_yVelocity, res); + + SWAP_POINTERS(_xVelocity, _xVelocityOld); + SWAP_POINTERS(_yVelocity, _yVelocityOld); + SWAP_POINTERS(_zVelocity, _zVelocityOld); + SWAP_POINTERS(_density, _densityOld); + SWAP_POINTERS(_heat, _heatOld); + + const float dt0 = _dt / _dx; + // use force arrays as temp arrays + for (int x = 0; x < _totalCells; x++) + _xForce[x] = _yForce[x] = 0.0; + float* t1 = _xForce; + float* t2 = _yForce; + + advectFieldMacCormack(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _densityOld, _density, t1,t2, res, NULL); + advectFieldMacCormack(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _heatOld, _heat, t1,t2, res, NULL); + advectFieldMacCormack(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _xVelocityOld, _xVelocity, t1,t2, res, NULL); + advectFieldMacCormack(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _yVelocityOld, _yVelocity, t1,t2, res, NULL); + advectFieldMacCormack(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _zVelocityOld, _zVelocity, t1,t2, res, NULL); + + if(DOMAIN_BC_LEFT == 0) copyBorderX(_xVelocity, res); + else setZeroX(_xVelocity, res); + + if(DOMAIN_BC_TOP == 0) copyBorderZ(_zVelocity, res); + else setZeroZ(_zVelocity, res); + + if(DOMAIN_BC_FRONT == 0) copyBorderY(_yVelocity, res); + else setZeroY(_yVelocity, res); + + setZeroBorder(_density, res); + setZeroBorder(_heat, res); + + for (int x = 0; x < _totalCells; x++) + t1[x] = t2[x] = 0.0; +} diff --git a/intern/smoke/intern/FLUID_3D.h b/intern/smoke/intern/FLUID_3D.h new file mode 100644 index 00000000000..2d212caa6d3 --- /dev/null +++ b/intern/smoke/intern/FLUID_3D.h @@ -0,0 +1,175 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +// FLUID_3D.h: interface for the FLUID_3D class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef FLUID_3D_H +#define FLUID_3D_H + +#include <cstdlib> +#include <cmath> +#include <iostream> +#include "OBSTACLE.h" +#include "WTURBULENCE.h" +#include "VEC3.h" + +using namespace std; +using namespace BasicVector; +class WTURBULENCE; + +class FLUID_3D +{ + public: + FLUID_3D(int *res, int amplify, float *p0, float dt); + FLUID_3D() {}; + virtual ~FLUID_3D(); + + void initBlenderRNA(float *alpha, float *beta); + + // create & allocate vector noise advection + void initVectorNoise(int amplify); + + void addSmokeColumn(); + static void addSmokeTestCase(float* field, Vec3Int res, float value); + + void step(); + void addObstacle(OBSTACLE* obstacle); + + const float* xVelocity() { return _xVelocity; }; + const float* yVelocity() { return _yVelocity; }; + const float* zVelocity() { return _zVelocity; }; + + int xRes() const { return _xRes; }; + int yRes() const { return _yRes; }; + int zRes() const { return _zRes; }; + + public: + // dimensions + int _xRes, _yRes, _zRes, _maxRes; + Vec3Int _res; + int _totalCells; + int _slabSize; + float _dx; + float _p0[3]; + float _p1[3]; + float _totalTime; + int _totalSteps; + int _totalImgDumps; + int _totalVelDumps; + + void artificialDamping(float* field); + + // fields + float* _density; + float* _densityOld; + float* _heat; + float* _heatOld; + float* _pressure; + float* _xVelocity; + float* _yVelocity; + float* _zVelocity; + float* _xVelocityOld; + float* _yVelocityOld; + float* _zVelocityOld; + float* _xForce; + float* _yForce; + float* _zForce; + float* _divergence; + float* _xVorticity; + float* _yVorticity; + float* _zVorticity; + float* _vorticity; + unsigned char* _obstacles; + + // CG fields + float* _residual; + float* _direction; + float* _q; + int _iterations; + + // simulation constants + float _dt; + float _vorticityEps; + float _heatDiffusion; + float *_alpha; // for the buoyancy density term <-- as pointer to get blender RNA in here + float *_beta; // was _buoyancy <-- as pointer to get blender RNA in here + float _tempAmb; /* ambient temperature */ + + // WTURBULENCE object, if active + WTURBULENCE* _wTurbulence; + + // boundary setting functions + void copyBorderAll(float* field); + + // timestepping functions + void wipeBoundaries(); + void addForce(); + void addVorticity(); + void addBuoyancy(float *heat, float *density); + + // solver stuff + void project(); + void diffuseHeat(); + void solvePressure(float* field, float* b, unsigned char* skip); + void solveHeat(float* field, float* b, unsigned char* skip); + + // handle obstacle boundaries + void setObstacleBoundaries(); + + public: + // advection, accessed e.g. by WTURBULENCE class + void advectMacCormack(); + + // boundary setting functions + static void copyBorderX(float* field, Vec3Int res); + static void copyBorderY(float* field, Vec3Int res); + static void copyBorderZ(float* field, Vec3Int res); + static void setNeumannX(float* field, Vec3Int res); + static void setNeumannY(float* field, Vec3Int res); + static void setNeumannZ(float* field, Vec3Int res); + static void setZeroX(float* field, Vec3Int res); + static void setZeroY(float* field, Vec3Int res); + static void setZeroZ(float* field, Vec3Int res); + static void setZeroBorder(float* field, Vec3Int res) { + setZeroX(field, res); + setZeroY(field, res); + setZeroZ(field, res); + }; + + // static advection functions, also used by WTURBULENCE + static void advectFieldSemiLagrange(const float dt, const float* velx, const float* vely, const float* velz, + float* oldField, float* newField, Vec3Int res); + static void advectFieldMacCormack(const float dt, const float* xVelocity, const float* yVelocity, const float* zVelocity, + float* oldField, float* newField, float* temp1, float* temp2, Vec3Int res, const float* obstacles); + + // maccormack helper functions + static void clampExtrema(const float dt, const float* xVelocity, const float* yVelocity, const float* zVelocity, + float* oldField, float* newField, Vec3Int res); + static void clampOutsideRays(const float dt, const float* xVelocity, const float* yVelocity, const float* zVelocity, + float* oldField, float* newField, Vec3Int res, const float* obstacles, const float *oldAdvection); + + // output helper functions + // static void writeImageSliceXY(const float *field, Vec3Int res, int slice, string prefix, int picCnt, float scale=1.); + // static void writeImageSliceYZ(const float *field, Vec3Int res, int slice, string prefix, int picCnt, float scale=1.); + // static void writeImageSliceXZ(const float *field, Vec3Int res, int slice, string prefix, int picCnt, float scale=1.); + // static void writeProjectedIntern(const float *field, Vec3Int res, int dir1, int dir2, string prefix, int picCnt, float scale=1.); +}; + +#endif diff --git a/intern/smoke/intern/FLUID_3D_SOLVERS.cpp b/intern/smoke/intern/FLUID_3D_SOLVERS.cpp new file mode 100644 index 00000000000..5fd8f72d79d --- /dev/null +++ b/intern/smoke/intern/FLUID_3D_SOLVERS.cpp @@ -0,0 +1,319 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +// FLUID_3D.cpp: implementation of the FLUID_3D class. +// +////////////////////////////////////////////////////////////////////// + +#include "FLUID_3D.h" +#define SOLVER_ACCURACY 1e-06 + +////////////////////////////////////////////////////////////////////// +// solve the poisson equation with CG +////////////////////////////////////////////////////////////////////// +void FLUID_3D::solvePressure(float* field, float* b, unsigned char* skip) +{ + int x, y, z, index; + + // i = 0 + int i = 0; + + // r = b - Ax + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + { + // if the cell is a variable + float Acenter = 0.0f; + if (!skip[index]) + { + // set the matrix to the Poisson stencil in order + if (!skip[index + 1]) Acenter += 1.; + if (!skip[index - 1]) Acenter += 1.; + if (!skip[index + _xRes]) Acenter += 1.; + if (!skip[index - _xRes]) Acenter += 1.; + if (!skip[index + _slabSize]) Acenter += 1.; + if (!skip[index - _slabSize]) Acenter += 1.; + } + + _residual[index] = b[index] - (Acenter * field[index] + + field[index - 1] * (skip[index - 1] ? 0.0 : -1.0f)+ + field[index + 1] * (skip[index + 1] ? 0.0 : -1.0f)+ + field[index - _xRes] * (skip[index - _xRes] ? 0.0 : -1.0f)+ + field[index + _xRes] * (skip[index + _xRes] ? 0.0 : -1.0f)+ + field[index - _slabSize] * (skip[index - _slabSize] ? 0.0 : -1.0f)+ + field[index + _slabSize] * (skip[index + _slabSize] ? 0.0 : -1.0f) ); + _residual[index] = (skip[index]) ? 0.0f : _residual[index]; + } + + // d = r + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + _direction[index] = _residual[index]; + + // deltaNew = transpose(r) * r + float deltaNew = 0.0f; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + deltaNew += _residual[index] * _residual[index]; + + // delta0 = deltaNew + // float delta0 = deltaNew; + + // While deltaNew > (eps^2) * delta0 + const float eps = SOLVER_ACCURACY; + float maxR = 2.0f * eps; + while ((i < _iterations) && (maxR > eps)) + { + // q = Ad + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + { + // if the cell is a variable + float Acenter = 0.0f; + if (!skip[index]) + { + // set the matrix to the Poisson stencil in order + if (!skip[index + 1]) Acenter += 1.; + if (!skip[index - 1]) Acenter += 1.; + if (!skip[index + _xRes]) Acenter += 1.; + if (!skip[index - _xRes]) Acenter += 1.; + if (!skip[index + _slabSize]) Acenter += 1.; + if (!skip[index - _slabSize]) Acenter += 1.; + } + + _q[index] = Acenter * _direction[index] + + _direction[index - 1] * (skip[index - 1] ? 0.0 : -1.0f) + + _direction[index + 1] * (skip[index + 1] ? 0.0 : -1.0f) + + _direction[index - _xRes] * (skip[index - _xRes] ? 0.0 : -1.0f) + + _direction[index + _xRes] * (skip[index + _xRes] ? 0.0 : -1.0f)+ + _direction[index - _slabSize] * (skip[index - _slabSize] ? 0.0 : -1.0f) + + _direction[index + _slabSize] * (skip[index + _slabSize] ? 0.0 : -1.0f); + _q[index] = (skip[index]) ? 0.0f : _q[index]; + } + + // alpha = deltaNew / (transpose(d) * q) + float alpha = 0.0f; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + alpha += _direction[index] * _q[index]; + if (fabs(alpha) > 0.0f) + alpha = deltaNew / alpha; + + // x = x + alpha * d + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + field[index] += alpha * _direction[index]; + + // r = r - alpha * q + maxR = 0.0f; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + { + _residual[index] -= alpha * _q[index]; + maxR = (_residual[index] > maxR) ? _residual[index] : maxR; + } + + // deltaOld = deltaNew + float deltaOld = deltaNew; + + // deltaNew = transpose(r) * r + deltaNew = 0.0f; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + deltaNew += _residual[index] * _residual[index]; + + // beta = deltaNew / deltaOld + float beta = deltaNew / deltaOld; + + // d = r + beta * d + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + _direction[index] = _residual[index] + beta * _direction[index]; + + // i = i + 1 + i++; + } + cout << i << " iterations converged to " << maxR << endl; +} + +////////////////////////////////////////////////////////////////////// +// solve the heat equation with CG +////////////////////////////////////////////////////////////////////// +void FLUID_3D::solveHeat(float* field, float* b, unsigned char* skip) +{ + int x, y, z, index; + const float heatConst = _dt * _heatDiffusion / (_dx * _dx); + + // i = 0 + int i = 0; + + // r = b - Ax + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + { + // if the cell is a variable + float Acenter = 1.0f; + if (!skip[index]) + { + // set the matrix to the Poisson stencil in order + if (!skip[index + 1]) Acenter += heatConst; + if (!skip[index - 1]) Acenter += heatConst; + if (!skip[index + _xRes]) Acenter += heatConst; + if (!skip[index - _xRes]) Acenter += heatConst; + if (!skip[index + _slabSize]) Acenter += heatConst; + if (!skip[index - _slabSize]) Acenter += heatConst; + } + + _residual[index] = b[index] - (Acenter * field[index] + + field[index - 1] * (skip[index - 1] ? 0.0 : -heatConst) + + field[index + 1] * (skip[index + 1] ? 0.0 : -heatConst) + + field[index - _xRes] * (skip[index - _xRes] ? 0.0 : -heatConst) + + field[index + _xRes] * (skip[index + _xRes] ? 0.0 : -heatConst) + + field[index - _slabSize] * (skip[index - _slabSize] ? 0.0 : -heatConst) + + field[index + _slabSize] * (skip[index + _slabSize] ? 0.0 : -heatConst)); + _residual[index] = (skip[index]) ? 0.0f : _residual[index]; + } + + // d = r + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + _direction[index] = _residual[index]; + + // deltaNew = transpose(r) * r + float deltaNew = 0.0f; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + deltaNew += _residual[index] * _residual[index]; + + // delta0 = deltaNew + // float delta0 = deltaNew; + + // While deltaNew > (eps^2) * delta0 + const float eps = SOLVER_ACCURACY; + float maxR = 2.0f * eps; + while ((i < _iterations) && (maxR > eps)) + { + // q = Ad + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + { + // if the cell is a variable + float Acenter = 1.0f; + if (!skip[index]) + { + // set the matrix to the Poisson stencil in order + if (!skip[index + 1]) Acenter += heatConst; + if (!skip[index - 1]) Acenter += heatConst; + if (!skip[index + _xRes]) Acenter += heatConst; + if (!skip[index - _xRes]) Acenter += heatConst; + if (!skip[index + _slabSize]) Acenter += heatConst; + if (!skip[index - _slabSize]) Acenter += heatConst; + } + + _q[index] = (Acenter * _direction[index] + + _direction[index - 1] * (skip[index - 1] ? 0.0 : -heatConst) + + _direction[index + 1] * (skip[index + 1] ? 0.0 : -heatConst) + + _direction[index - _xRes] * (skip[index - _xRes] ? 0.0 : -heatConst) + + _direction[index + _xRes] * (skip[index + _xRes] ? 0.0 : -heatConst) + + _direction[index - _slabSize] * (skip[index - _slabSize] ? 0.0 : -heatConst) + + _direction[index + _slabSize] * (skip[index + _slabSize] ? 0.0 : -heatConst)); + + _q[index] = (skip[index]) ? 0.0f : _q[index]; + } + + // alpha = deltaNew / (transpose(d) * q) + float alpha = 0.0f; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + alpha += _direction[index] * _q[index]; + if (fabs(alpha) > 0.0f) + alpha = deltaNew / alpha; + + // x = x + alpha * d + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + field[index] += alpha * _direction[index]; + + // r = r - alpha * q + maxR = 0.0f; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + { + _residual[index] -= alpha * _q[index]; + maxR = (_residual[index] > maxR) ? _residual[index] : maxR; + } + + // deltaOld = deltaNew + float deltaOld = deltaNew; + + // deltaNew = transpose(r) * r + deltaNew = 0.0f; + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + deltaNew += _residual[index] * _residual[index]; + + // beta = deltaNew / deltaOld + float beta = deltaNew / deltaOld; + + // d = r + beta * d + index = _slabSize + _xRes + 1; + for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) + for (y = 1; y < _yRes - 1; y++, index += 2) + for (x = 1; x < _xRes - 1; x++, index++) + _direction[index] = _residual[index] + beta * _direction[index]; + + // i = i + 1 + i++; + } + cout << i << " iterations converged to " << maxR << endl; +} + diff --git a/intern/smoke/intern/FLUID_3D_STATIC.cpp b/intern/smoke/intern/FLUID_3D_STATIC.cpp new file mode 100644 index 00000000000..f2bbcf33075 --- /dev/null +++ b/intern/smoke/intern/FLUID_3D_STATIC.cpp @@ -0,0 +1,657 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +// FLUID_3D.cpp: implementation of the static functions of the FLUID_3D class. +// +////////////////////////////////////////////////////////////////////// + +#include <zlib.h> +#include "FLUID_3D.h" +#include "IMAGE.h" +#include "WTURBULENCE.h" +#include "INTERPOLATE.h" + +////////////////////////////////////////////////////////////////////// +// add a test cube of density to the center +////////////////////////////////////////////////////////////////////// +/* +void FLUID_3D::addSmokeColumn() { + addSmokeTestCase(_density, _res, 1.0); + // addSmokeTestCase(_zVelocity, _res, 1.0); + addSmokeTestCase(_heat, _res, 1.0); + if (_wTurbulence) { + addSmokeTestCase(_wTurbulence->getDensityBig(), _wTurbulence->getResBig(), 1.0); + } +} +*/ + +////////////////////////////////////////////////////////////////////// +// generic static version, so that it can be applied to the +// WTURBULENCE grid as well +////////////////////////////////////////////////////////////////////// +/* +void FLUID_3D::addSmokeTestCase(float* field, Vec3Int res, float value) +{ + const int slabSize = res[0]*res[1]; int maxRes = (int)MAX3V(res); + float dx = 1.0f / (float)maxRes; + + float xTotal = dx * res[0]; + float yTotal = dx * res[1]; + float zTotal = dx * res[2]; + + float heighMin = 0.05; + float heighMax = 0.10; + + for (int y = 0; y < res[1]; y++) + for (int z = (int)(heighMin*res[2]); z <= (int)(heighMax * res[1]); z++) + for (int x = 0; x < res[0]; x++) + { + float xLength = x * dx - xTotal * 0.4f; + float yLength = y * dx - zTotal * 0.5f; + float radius = sqrtf(xLength * xLength + yLength * yLength); + + if (radius < 0.075f * xTotal) + { + int index = x + y * res[0] + z * slabSize; + field[index] = value; + } + } +} +*/ + +////////////////////////////////////////////////////////////////////// +// set x direction to Neumann boundary conditions +////////////////////////////////////////////////////////////////////// +void FLUID_3D::setNeumannX(float* field, Vec3Int res) +{ + const int slabSize = res[0] * res[1]; + int index; + for (int z = 0; z < res[2]; z++) + for (int y = 0; y < res[1]; y++) + { + // left slab + index = y * res[0] + z * slabSize; + field[index] = field[index + 2]; + + // right slab + index += res[0] - 1; + field[index] = field[index - 2]; + } + } + +////////////////////////////////////////////////////////////////////// +// set y direction to Neumann boundary conditions +////////////////////////////////////////////////////////////////////// +void FLUID_3D::setNeumannY(float* field, Vec3Int res) +{ + const int slabSize = res[0] * res[1]; + int index; + for (int z = 0; z < res[2]; z++) + for (int x = 0; x < res[0]; x++) + { + // front slab + index = x + z * slabSize; + field[index] = field[index + 2 * res[0]]; + + // back slab + index += slabSize - res[0]; + field[index] = field[index - 2 * res[0]]; + } +} + +////////////////////////////////////////////////////////////////////// +// set z direction to Neumann boundary conditions +////////////////////////////////////////////////////////////////////// +void FLUID_3D::setNeumannZ(float* field, Vec3Int res) +{ + const int slabSize = res[0] * res[1]; + const int totalCells = res[0] * res[1] * res[2]; + int index; + for (int y = 0; y < res[1]; y++) + for (int x = 0; x < res[0]; x++) + { + // bottom slab + index = x + y * res[0]; + field[index] = field[index + 2 * slabSize]; + + // top slab + index += totalCells - slabSize; + field[index] = field[index - 2 * slabSize]; + } + + // fix, force top slab to only allow outwards flux + for (int y = 0; y < res[1]; y++) + for (int x = 0; x < res[0]; x++) + { + // top slab + index = x + y * res[0]; + index += totalCells - slabSize; + if(field[index]<0.) field[index] = 0.; + index -= slabSize; + if(field[index]<0.) field[index] = 0.; + } +} + +////////////////////////////////////////////////////////////////////// +// set x direction to zero +////////////////////////////////////////////////////////////////////// +void FLUID_3D::setZeroX(float* field, Vec3Int res) +{ + const int slabSize = res[0] * res[1]; + int index; + for (int z = 0; z < res[2]; z++) + for (int y = 0; y < res[1]; y++) + { + // left slab + index = y * res[0] + z * slabSize; + field[index] = 0.0f; + + // right slab + index += res[0] - 1; + field[index] = 0.0f; + } +} + +////////////////////////////////////////////////////////////////////// +// set y direction to zero +////////////////////////////////////////////////////////////////////// +void FLUID_3D::setZeroY(float* field, Vec3Int res) +{ + const int slabSize = res[0] * res[1]; + int index; + for (int z = 0; z < res[2]; z++) + for (int x = 0; x < res[0]; x++) + { + // bottom slab + index = x + z * slabSize; + field[index] = 0.0f; + + // top slab + index += slabSize - res[0]; + field[index] = 0.0f; + } +} + +////////////////////////////////////////////////////////////////////// +// set z direction to zero +////////////////////////////////////////////////////////////////////// +void FLUID_3D::setZeroZ(float* field, Vec3Int res) +{ + const int slabSize = res[0] * res[1]; + const int totalCells = res[0] * res[1] * res[2]; + int index; + for (int y = 0; y < res[1]; y++) + for (int x = 0; x < res[0]; x++) + { + // front slab + index = x + y * res[0]; + field[index] = 0.0f; + + // back slab + index += totalCells - slabSize; + field[index] = 0.0f; + } + } + +////////////////////////////////////////////////////////////////////// +// copy grid boundary +////////////////////////////////////////////////////////////////////// +void FLUID_3D::copyBorderX(float* field, Vec3Int res) +{ + const int slabSize = res[0] * res[1]; + int index; + for (int z = 0; z < res[2]; z++) + for (int y = 0; y < res[1]; y++) + { + // left slab + index = y * res[0] + z * slabSize; + field[index] = field[index + 1]; + + // right slab + index += res[0] - 1; + field[index] = field[index - 1]; + } +} +void FLUID_3D::copyBorderY(float* field, Vec3Int res) +{ + const int slabSize = res[0] * res[1]; + int index; + for (int z = 0; z < res[2]; z++) + for (int x = 0; x < res[0]; x++) + { + // bottom slab + index = x + z * slabSize; + field[index] = field[index + res[0]]; + // top slab + index += slabSize - res[0]; + field[index] = field[index - res[0]]; + } +} +void FLUID_3D::copyBorderZ(float* field, Vec3Int res) +{ + const int slabSize = res[0] * res[1]; + const int totalCells = res[0] * res[1] * res[2]; + int index; + for (int y = 0; y < res[1]; y++) + for (int x = 0; x < res[0]; x++) + { + // front slab + index = x + y * res[0]; + field[index] = field[index + slabSize]; + // back slab + index += totalCells - slabSize; + field[index] = field[index - slabSize]; + } +} + +///////////////////////////////////////////////////////////////////// +// advect field with the semi lagrangian method +////////////////////////////////////////////////////////////////////// +void FLUID_3D::advectFieldSemiLagrange(const float dt, const float* velx, const float* vely, const float* velz, + float* oldField, float* newField, Vec3Int res) +{ + const int xres = res[0]; + const int yres = res[1]; + const int zres = res[2]; + const int slabSize = res[0] * res[1]; + + // scale dt up to grid resolution +#if PARALLEL==1 +#pragma omp parallel for schedule(static) +#endif + for (int z = 0; z < zres; z++) + for (int y = 0; y < yres; y++) + for (int x = 0; x < xres; x++) + { + const int index = x + y * xres + z * xres*yres; + + // backtrace + float xTrace = x - dt * velx[index]; + float yTrace = y - dt * vely[index]; + float zTrace = z - dt * velz[index]; + + // clamp backtrace to grid boundaries + if (xTrace < 0.5) xTrace = 0.5; + if (xTrace > xres - 1.5) xTrace = xres - 1.5; + if (yTrace < 0.5) yTrace = 0.5; + if (yTrace > yres - 1.5) yTrace = yres - 1.5; + if (zTrace < 0.5) zTrace = 0.5; + if (zTrace > zres - 1.5) zTrace = zres - 1.5; + + // locate neighbors to interpolate + const int x0 = (int)xTrace; + const int x1 = x0 + 1; + const int y0 = (int)yTrace; + const int y1 = y0 + 1; + const int z0 = (int)zTrace; + const int z1 = z0 + 1; + + // get interpolation weights + const float s1 = xTrace - x0; + const float s0 = 1.0f - s1; + const float t1 = yTrace - y0; + const float t0 = 1.0f - t1; + const float u1 = zTrace - z0; + const float u0 = 1.0f - u1; + + const int i000 = x0 + y0 * xres + z0 * slabSize; + const int i010 = x0 + y1 * xres + z0 * slabSize; + const int i100 = x1 + y0 * xres + z0 * slabSize; + const int i110 = x1 + y1 * xres + z0 * slabSize; + const int i001 = x0 + y0 * xres + z1 * slabSize; + const int i011 = x0 + y1 * xres + z1 * slabSize; + const int i101 = x1 + y0 * xres + z1 * slabSize; + const int i111 = x1 + y1 * xres + z1 * slabSize; + + // interpolate + // (indices could be computed once) + newField[index] = u0 * (s0 * (t0 * oldField[i000] + + t1 * oldField[i010]) + + s1 * (t0 * oldField[i100] + + t1 * oldField[i110])) + + u1 * (s0 * (t0 * oldField[i001] + + t1 * oldField[i011]) + + s1 * (t0 * oldField[i101] + + t1 * oldField[i111])); + } +} + +///////////////////////////////////////////////////////////////////// +// advect field with the maccormack method +// +// comments are the pseudocode from selle's paper +////////////////////////////////////////////////////////////////////// +void FLUID_3D::advectFieldMacCormack(const float dt, const float* xVelocity, const float* yVelocity, const float* zVelocity, + float* oldField, float* newField, float* temp1, float* temp2, Vec3Int res, const float* obstacles) +{ + float* phiHatN = temp1; + float* phiHatN1 = temp2; + const int sx= res[0]; + const int sy= res[1]; + const int sz= res[2]; + + for (int x = 0; x < sx * sy * sz; x++) + phiHatN[x] = phiHatN1[x] = oldField[x]; + + float*& phiN = oldField; + float*& phiN1 = newField; + + // phiHatN1 = A(phiN) + advectFieldSemiLagrange( dt, xVelocity, yVelocity, zVelocity, phiN, phiHatN1, res); + + // phiHatN = A^R(phiHatN1) + advectFieldSemiLagrange( -1.0*dt, xVelocity, yVelocity, zVelocity, phiHatN1, phiHatN, res); + + // phiN1 = phiHatN1 + (phiN - phiHatN) / 2 + const int border = 0; + for (int z = border; z < sz-border; z++) + for (int y = border; y < sy-border; y++) + for (int x = border; x < sx-border; x++) { + int index = x + y * sx + z * sx*sy; + phiN1[index] = phiHatN1[index] + (phiN[index] - phiHatN[index]) * 0.50f; + //phiN1[index] = phiHatN1[index]; // debug, correction off + } + copyBorderX(phiN1, res); + copyBorderY(phiN1, res); + copyBorderZ(phiN1, res); + + // clamp any newly created extrema + clampExtrema(dt, xVelocity, yVelocity, zVelocity, oldField, newField, res); + + // if the error estimate was bad, revert to first order + clampOutsideRays(dt, xVelocity, yVelocity, zVelocity, oldField, newField, res, obstacles, phiHatN1); +} + + +////////////////////////////////////////////////////////////////////// +// Clamp the extrema generated by the BFECC error correction +////////////////////////////////////////////////////////////////////// +void FLUID_3D::clampExtrema(const float dt, const float* velx, const float* vely, const float* velz, + float* oldField, float* newField, Vec3Int res) +{ + const int xres= res[0]; + const int yres= res[1]; + const int zres= res[2]; + const int slabSize = res[0] * res[1]; + for (int z = 1; z < zres-1; z++) + for (int y = 1; y < yres-1; y++) + for (int x = 1; x < xres-1; x++) + { + const int index = x + y * xres+ z * xres*yres; + // backtrace + float xTrace = x - dt * velx[index]; + float yTrace = y - dt * vely[index]; + float zTrace = z - dt * velz[index]; + + // clamp backtrace to grid boundaries + if (xTrace < 0.5) xTrace = 0.5; + if (xTrace > xres - 1.5) xTrace = xres - 1.5; + if (yTrace < 0.5) yTrace = 0.5; + if (yTrace > yres - 1.5) yTrace = yres - 1.5; + if (zTrace < 0.5) zTrace = 0.5; + if (zTrace > zres - 1.5) zTrace = zres - 1.5; + + // locate neighbors to interpolate + const int x0 = (int)xTrace; + const int x1 = x0 + 1; + const int y0 = (int)yTrace; + const int y1 = y0 + 1; + const int z0 = (int)zTrace; + const int z1 = z0 + 1; + + const int i000 = x0 + y0 * xres + z0 * slabSize; + const int i010 = x0 + y1 * xres + z0 * slabSize; + const int i100 = x1 + y0 * xres + z0 * slabSize; + const int i110 = x1 + y1 * xres + z0 * slabSize; + const int i001 = x0 + y0 * xres + z1 * slabSize; + const int i011 = x0 + y1 * xres + z1 * slabSize; + const int i101 = x1 + y0 * xres + z1 * slabSize; + const int i111 = x1 + y1 * xres + z1 * slabSize; + + float minField = oldField[i000]; + float maxField = oldField[i000]; + + minField = (oldField[i010] < minField) ? oldField[i010] : minField; + maxField = (oldField[i010] > maxField) ? oldField[i010] : maxField; + + minField = (oldField[i100] < minField) ? oldField[i100] : minField; + maxField = (oldField[i100] > maxField) ? oldField[i100] : maxField; + + minField = (oldField[i110] < minField) ? oldField[i110] : minField; + maxField = (oldField[i110] > maxField) ? oldField[i110] : maxField; + + minField = (oldField[i001] < minField) ? oldField[i001] : minField; + maxField = (oldField[i001] > maxField) ? oldField[i001] : maxField; + + minField = (oldField[i011] < minField) ? oldField[i011] : minField; + maxField = (oldField[i011] > maxField) ? oldField[i011] : maxField; + + minField = (oldField[i101] < minField) ? oldField[i101] : minField; + maxField = (oldField[i101] > maxField) ? oldField[i101] : maxField; + + minField = (oldField[i111] < minField) ? oldField[i111] : minField; + maxField = (oldField[i111] > maxField) ? oldField[i111] : maxField; + + newField[index] = (newField[index] > maxField) ? maxField : newField[index]; + newField[index] = (newField[index] < minField) ? minField : newField[index]; + } +} + +////////////////////////////////////////////////////////////////////// +// Reverts any backtraces that go into boundaries back to first +// order -- in this case the error correction term was totally +// incorrect +////////////////////////////////////////////////////////////////////// +void FLUID_3D::clampOutsideRays(const float dt, const float* velx, const float* vely, const float* velz, + float* oldField, float* newField, Vec3Int res, const float* obstacles, const float *oldAdvection) +{ + const int sx= res[0]; + const int sy= res[1]; + const int sz= res[2]; + const int slabSize = res[0] * res[1]; + for (int z = 1; z < sz-1; z++) + for (int y = 1; y < sy-1; y++) + for (int x = 1; x < sx-1; x++) + { + const int index = x + y * sx+ z * slabSize; + // backtrace + float xBackward = x + dt * velx[index]; + float yBackward = y + dt * vely[index]; + float zBackward = z + dt * velz[index]; + float xTrace = x - dt * velx[index]; + float yTrace = y - dt * vely[index]; + float zTrace = z - dt * velz[index]; + + // see if it goes outside the boundaries + bool hasObstacle = + (zTrace < 1.0f) || (zTrace > sz - 2.0f) || + (yTrace < 1.0f) || (yTrace > sy - 2.0f) || + (xTrace < 1.0f) || (xTrace > sx - 2.0f) || + (zBackward < 1.0f) || (zBackward > sz - 2.0f) || + (yBackward < 1.0f) || (yBackward > sy - 2.0f) || + (xBackward < 1.0f) || (xBackward > sx - 2.0f); + // reuse old advection instead of doing another one... + if(hasObstacle) { newField[index] = oldAdvection[index]; continue; } + + // clamp to prevent an out of bounds access when looking into + // the _obstacles array + zTrace = (zTrace < 0.5f) ? 0.5f : zTrace; + zTrace = (zTrace > sz - 1.5f) ? sz - 1.5f : zTrace; + yTrace = (yTrace < 0.5f) ? 0.5f : yTrace; + yTrace = (yTrace > sy - 1.5f) ? sy - 1.5f : yTrace; + xTrace = (xTrace < 0.5f) ? 0.5f : xTrace; + xTrace = (xTrace > sx - 1.5f) ? sx - 1.5f : xTrace; + + // locate neighbors to interpolate, + // do backward first since we will use the forward indices if a + // reversion is actually necessary + zBackward = (zBackward < 0.5f) ? 0.5f : zBackward; + zBackward = (zBackward > sz - 1.5f) ? sz - 1.5f : zBackward; + yBackward = (yBackward < 0.5f) ? 0.5f : yBackward; + yBackward = (yBackward > sy - 1.5f) ? sy - 1.5f : yBackward; + xBackward = (xBackward < 0.5f) ? 0.5f : xBackward; + xBackward = (xBackward > sx - 1.5f) ? sx - 1.5f : xBackward; + + int x0 = (int)xBackward; + int x1 = x0 + 1; + int y0 = (int)yBackward; + int y1 = y0 + 1; + int z0 = (int)zBackward; + int z1 = z0 + 1; + if(obstacles && !hasObstacle) { + hasObstacle = hasObstacle || + obstacles[x0 + y0 * sx + z0*slabSize] || + obstacles[x0 + y1 * sx + z0*slabSize] || + obstacles[x1 + y0 * sx + z0*slabSize] || + obstacles[x1 + y1 * sx + z0*slabSize] || + obstacles[x0 + y0 * sx + z1*slabSize] || + obstacles[x0 + y1 * sx + z1*slabSize] || + obstacles[x1 + y0 * sx + z1*slabSize] || + obstacles[x1 + y1 * sx + z1*slabSize] ; + } + // reuse old advection instead of doing another one... + if(hasObstacle) { newField[index] = oldAdvection[index]; continue; } + + x0 = (int)xTrace; + x1 = x0 + 1; + y0 = (int)yTrace; + y1 = y0 + 1; + z0 = (int)zTrace; + z1 = z0 + 1; + if(obstacles && !hasObstacle) { + hasObstacle = hasObstacle || + obstacles[x0 + y0 * sx + z0*slabSize] || + obstacles[x0 + y1 * sx + z0*slabSize] || + obstacles[x1 + y0 * sx + z0*slabSize] || + obstacles[x1 + y1 * sx + z0*slabSize] || + obstacles[x0 + y0 * sx + z1*slabSize] || + obstacles[x0 + y1 * sx + z1*slabSize] || + obstacles[x1 + y0 * sx + z1*slabSize] || + obstacles[x1 + y1 * sx + z1*slabSize] ; + } // obstacle array + // reuse old advection instead of doing another one... + if(hasObstacle) { newField[index] = oldAdvection[index]; continue; } + + // see if either the forward or backward ray went into + // a boundary + if (hasObstacle) { + // get interpolation weights + float s1 = xTrace - x0; + float s0 = 1.0f - s1; + float t1 = yTrace - y0; + float t0 = 1.0f - t1; + float u1 = zTrace - z0; + float u0 = 1.0f - u1; + + const int i000 = x0 + y0 * sx + z0 * slabSize; + const int i010 = x0 + y1 * sx + z0 * slabSize; + const int i100 = x1 + y0 * sx + z0 * slabSize; + const int i110 = x1 + y1 * sx + z0 * slabSize; + const int i001 = x0 + y0 * sx + z1 * slabSize; + const int i011 = x0 + y1 * sx + z1 * slabSize; + const int i101 = x1 + y0 * sx + z1 * slabSize; + const int i111 = x1 + y1 * sx + z1 * slabSize; + + // interpolate, (indices could be computed once) + newField[index] = u0 * (s0 * ( + t0 * oldField[i000] + + t1 * oldField[i010]) + + s1 * (t0 * oldField[i100] + + t1 * oldField[i110])) + + u1 * (s0 * (t0 * oldField[i001] + + t1 * oldField[i011]) + + s1 * (t0 * oldField[i101] + + t1 * oldField[i111])); + } + } // xyz +} + +////////////////////////////////////////////////////////////////////// +// image output +////////////////////////////////////////////////////////////////////// +/* +void FLUID_3D::writeImageSliceXY(const float *field, Vec3Int res, int slice, string prefix, int picCnt, float scale) { + writeProjectedIntern(field, res, 0,1, prefix, picCnt, scale); +} +void FLUID_3D::writeImageSliceYZ(const float *field, Vec3Int res, int slice, string prefix, int picCnt, float scale) { + writeProjectedIntern(field, res, 1,2, prefix, picCnt, scale); +} +void FLUID_3D::writeImageSliceXZ(const float *field, Vec3Int res, int slice, string prefix, int picCnt, float scale) { + writeProjectedIntern(field, res, 0,2, prefix, picCnt, scale); +} +*/ + +////////////////////////////////////////////////////////////////////// +// Helper function for projecting densities along a dimension +////////////////////////////////////////////////////////////////////// +static int getOtherDir(int dir1, int dir2) { + switch(dir1) { + case 0: + switch(dir2) { + case 1: return 2; + case 2: return 1; } + break; + case 1: + switch(dir2) { + case 0: return 2; + case 2: return 0; } + break; + case 2: + switch(dir2) { + case 0: return 1; + case 1: return 0; } + break; + default: + return 0; + } + return 0; +} + +////////////////////////////////////////////////////////////////////// +// average densities along third spatial direction +////////////////////////////////////////////////////////////////////// +/* +void FLUID_3D::writeProjectedIntern(const float *field, Vec3Int res, + int dir1, int dir2, string prefix, int picCnt, float scale) { + const int nitems = res[dir1]*res[dir2]; + const int otherDir = getOtherDir(dir1,dir2); + float *buf = new float[nitems]; + Vec3Int min = Vec3Int(0); + Vec3Int max = res; + + min[otherDir] = 0; + max[otherDir] = res[otherDir]; + float div = 1./(float)MIN3V(res); // normalize for shorter sides, old: res[otherDir]; + div *= 4.; //slightly increase contrast + for(int i=0; i<nitems; i++) buf[i] = 0.; + + Vec3Int cnt = 0; + for (cnt[2] = min[2]; cnt[2] < max[2]; cnt[2]++) { + for (cnt[1] = min[1]; cnt[1] < max[1]; cnt[1]++) + for (cnt[0] = min[0]; cnt[0] < max[0]; cnt[0]++) + { + const int index = cnt[0] + cnt[1] * res[0] + cnt[2] * res[0]*res[1]; + const int bufindex = cnt[dir1] + cnt[dir2] * res[dir1]; + buf[bufindex] += field[index] * scale *div; + } + } + // IMAGE::dumpNumberedPNG(picCnt, prefix, buf, res[dir1], res[dir2]); + delete[] buf; +} +*/ + diff --git a/intern/smoke/intern/IMAGE.h b/intern/smoke/intern/IMAGE.h new file mode 100644 index 00000000000..a57f164509e --- /dev/null +++ b/intern/smoke/intern/IMAGE.h @@ -0,0 +1,277 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +////////////////////////////////////////////////////////////////////// +// +#ifndef IMAGE_H +#define IMAGE_H + +#include <stdlib.h> +#include <string> +#include <fstream> +#include <sstream> +#include <zlib.h> + +////////////////////////////////////////////////////////////////////// +// NT helper functions +////////////////////////////////////////////////////////////////////// +template < class T > inline T ABS( T a ) { + return (0 < a) ? a : -a ; +} + +template < class T > inline void SWAP_POINTERS( T &a, T &b ) { + T temp = a; + a = b; + b = temp; +} + +template < class T > inline void CLAMP( T &a, T b=0., T c=1.) { + if(a<b) { a=b; return; } + if(a>c) { a=c; return; } +} + +template < class T > inline T MIN( T a, T b) { + return (a < b) ? a : b; +} + +template < class T > inline T MAX( T a, T b) { + return (a > b) ? a : b; +} + +template < class T > inline T MAX3( T a, T b, T c) { + T max = (a > b) ? a : b; + max = (max > c) ? max : c; + return max; +} + +template < class T > inline float MAX3V( T vec) { + float max = (vec[0] > vec[1]) ? vec[0] : vec[1]; + max = (max > vec[2]) ? max : vec[2]; + return max; +} + +template < class T > inline float MIN3V( T vec) { + float min = (vec[0] < vec[1]) ? vec[0] : vec[1]; + min = (min < vec[2]) ? min : vec[2]; + return min; +} + +////////////////////////////////////////////////////////////////////// +// PNG, POV-Ray, and PBRT output functions +////////////////////////////////////////////////////////////////////// +#include <png.h> + +namespace IMAGE { + /* + static int writePng(const char *fileName, unsigned char **rowsp, int w, int h) + { + // defaults + const int colortype = PNG_COLOR_TYPE_RGBA; + const int bitdepth = 8; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + png_bytep *rows = rowsp; + + FILE *fp = NULL; + std::string doing = "open for writing"; + if (!(fp = fopen(fileName, "wb"))) goto fail; + + if(!png_ptr) { + doing = "create png write struct"; + if (!(png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) goto fail; + } + if(!info_ptr) { + doing = "create png info struct"; + if (!(info_ptr = png_create_info_struct(png_ptr))) goto fail; + } + + if (setjmp(png_jmpbuf(png_ptr))) goto fail; + doing = "init IO"; + png_init_io(png_ptr, fp); + doing = "write header"; + png_set_IHDR(png_ptr, info_ptr, w, h, bitdepth, colortype, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + doing = "write info"; + png_write_info(png_ptr, info_ptr); + doing = "write image"; + png_write_image(png_ptr, rows); + doing = "write end"; + png_write_end(png_ptr, NULL); + doing = "write destroy structs"; + png_destroy_write_struct(&png_ptr, &info_ptr); + + fclose( fp ); + return 0; + + fail: + std::cerr << "writePng: could not "<<doing<<" !\n"; + if(fp) fclose( fp ); + if(png_ptr || info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr); + return -1; + } + */ + + ///////////////////////////////////////////////////////////////////////////////// + // write a numbered PNG file out, padded with zeros up to three zeros + ///////////////////////////////////////////////////////////////////////////////// + /* + static void dumpNumberedPNG(int counter, std::string prefix, float* field, int xRes, int yRes) + { + char buffer[256]; + sprintf(buffer,"%04i", counter); + std::string number = std::string(buffer); + + unsigned char pngbuf[xRes*yRes*4]; + unsigned char *rows[yRes]; + float *pfield = field; + for (int j=0; j<yRes; j++) { + for (int i=0; i<xRes; i++) { + float val = *pfield; + if(val>1.) val=1.; + if(val<0.) val=0.; + pngbuf[(j*xRes+i)*4+0] = (unsigned char)(val*255.); + pngbuf[(j*xRes+i)*4+1] = (unsigned char)(val*255.); + pngbuf[(j*xRes+i)*4+2] = (unsigned char)(val*255.); + pfield++; + pngbuf[(j*xRes+i)*4+3] = 255; + } + rows[j] = &pngbuf[(yRes-j-1)*xRes*4]; + } + std::string filenamePNG = prefix + number + std::string(".png"); + writePng(filenamePNG.c_str(), rows, xRes, yRes, false); + printf("Writing %s\n", filenamePNG.c_str()); + + } +*/ + ///////////////////////////////////////////////////////////////////////////////// + // export pbrt volumegrid geometry object + ///////////////////////////////////////////////////////////////////////////////// + /* + static void dumpPBRT(int counter, std::string prefix, float* fieldOrg, int xRes, int yRes, int zRes) + { + char buffer[256]; + sprintf(buffer,"%04i", counter); + std::string number = std::string(buffer); + + std::string filenamePbrt = prefix + number + std::string(".pbrt.gz"); + printf("Writing PBRT %s\n", filenamePbrt.c_str()); + + float *field = new float[xRes*yRes*zRes]; + // normalize values + float maxDensVal = ABS(fieldOrg[0]); + float targetNorm = 0.5; + for (int i = 0; i < xRes * yRes * zRes; i++) { + if(ABS(fieldOrg[i])>maxDensVal) maxDensVal = ABS(fieldOrg[i]); + field[i] = 0.; + } + if(maxDensVal>0.) { + for (int i = 0; i < xRes * yRes * zRes; i++) { + field[i] = ABS(fieldOrg[i]) / maxDensVal * targetNorm; + } + } + + std::fstream fout; + fout.open(filenamePbrt.c_str(), std::ios::out); + + int maxRes = (xRes > yRes) ? xRes : yRes; + maxRes = (maxRes > zRes) ? maxRes : zRes; + + const float xSize = 1.0 / (float)maxRes * (float)xRes; + const float ySize = 1.0 / (float)maxRes * (float)yRes; + const float zSize = 1.0 / (float)maxRes * (float)zRes; + + gzFile file; + file = gzopen(filenamePbrt.c_str(), "wb1"); + if (file == NULL) { + std::cerr << " Couldn't write file " << filenamePbrt << "!!!" << std::endl; + return; + } + + // dimensions + gzprintf(file, "Volume \"volumegrid\" \n"); + gzprintf(file, " \"integer nx\" %i\n", xRes); + gzprintf(file, " \"integer ny\" %i\n", yRes); + gzprintf(file, " \"integer nz\" %i\n", zRes); + gzprintf(file, " \"point p0\" [ 0.0 0.0 0.0 ] \"point p1\" [%f %f %f ] \n", xSize, ySize, zSize); + gzprintf(file, " \"float density\" [ \n"); + for (int i = 0; i < xRes * yRes * zRes; i++) + gzprintf(file, "%f ", field[i]); + gzprintf(file, "] \n \n"); + + gzclose(file); + delete[] field; + } + */ + + ///////////////////////////////////////////////////////////////////////////////// + // 3D df3 export + ///////////////////////////////////////////////////////////////////////////////// +/* + static void dumpDF3(int counter, std::string prefix, float* fieldOrg, int xRes, int yRes, int zRes) + { + char buffer[256]; + + // do deferred copying to final directory, better for network directories + sprintf(buffer,"%04i", counter); + std::string number = std::string(buffer); + std::string filenameDf3 = prefix + number + std::string(".df3.gz"); + printf("Writing DF3 %s\n", filenameDf3.c_str()); + + gzFile file; + file = gzopen(filenameDf3.c_str(), "wb1"); + if (file == NULL) { + std::cerr << " Couldn't write file " << filenameDf3 << "!!!" << std::endl; + return; + } + + // dimensions + const int byteSize = 2; + const unsigned short int onx=xRes,ony=yRes,onz=zRes; + unsigned short int nx,ny,nz; + nx = onx >> 8; + ny = ony >> 8; + nz = onz >> 8; + nx += (onx << 8); + ny += (ony << 8); + nz += (onz << 8); + gzwrite(file, (void*)&nx, sizeof(short)); + gzwrite(file, (void*)&ny, sizeof(short)); + gzwrite(file, (void*)&nz, sizeof(short)); + const int nitems = onx*ony*onz; + const float mul = (float)( (1<<(8*byteSize))-1); + + unsigned short int *buf = new unsigned short int[nitems]; + for (int k = 0; k < onz; k++) + for (int j = 0; j < ony; j++) + for (int i = 0; i < onx; i++) { + float val = fieldOrg[k*(onx*ony)+j*onx+i] ; + CLAMP(val); + buf[k*(onx*ony)+j*onx+i] = (short int)(val*mul); + } + gzwrite(file, (void*)buf, sizeof(unsigned short int)* nitems); + + gzclose(file); + delete[] buf; + } + */ + +}; + + +#endif + diff --git a/intern/smoke/intern/INTERPOLATE.h b/intern/smoke/intern/INTERPOLATE.h new file mode 100644 index 00000000000..6800c3b84b0 --- /dev/null +++ b/intern/smoke/intern/INTERPOLATE.h @@ -0,0 +1,227 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +////////////////////////////////////////////////////////////////////// +#ifndef INTERPOLATE_H +#define INTERPOLATE_H + +#include <iostream> +#include <VEC3.h> + +namespace INTERPOLATE { + +////////////////////////////////////////////////////////////////////// +// linear interpolators +////////////////////////////////////////////////////////////////////// +static inline float lerp(float t, float a, float b) { + return ( a + t * (b - a) ); +} + +static inline float lerp(float* field, float x, float y, int res) { + // clamp backtrace to grid boundaries + if (x < 0.5f) x = 0.5f; + if (x > res - 1.5f) x = res - 1.5f; + if (y < 0.5f) y = 0.5f; + if (y > res - 1.5f) y = res - 1.5f; + + const int x0 = (int)x; + const int y0 = (int)y; + x -= x0; + y -= y0; + float d00, d10, d01, d11; + + // lerp the velocities + d00 = field[x0 + y0 * res]; + d10 = field[(x0 + 1) + y0 * res]; + d01 = field[x0 + (y0 + 1) * res]; + d11 = field[(x0 + 1) + (y0 + 1) * res]; + return lerp(y, lerp(x, d00, d10), + lerp(x, d01, d11)); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// 3d linear interpolation +////////////////////////////////////////////////////////////////////////////////////////// +static inline float lerp3d(float* field, float x, float y, float z, int xres, int yres, int zres) { + // clamp pos to grid boundaries + if (x < 0.5) x = 0.5; + if (x > xres - 1.5) x = xres - 1.5; + if (y < 0.5) y = 0.5; + if (y > yres - 1.5) y = yres - 1.5; + if (z < 0.5) z = 0.5; + if (z > zres - 1.5) z = zres - 1.5; + + // locate neighbors to interpolate + const int x0 = (int)x; + const int x1 = x0 + 1; + const int y0 = (int)y; + const int y1 = y0 + 1; + const int z0 = (int)z; + const int z1 = z0 + 1; + + // get interpolation weights + const float s1 = x - (float)x0; + const float s0 = 1.0f - s1; + const float t1 = y - (float)y0; + const float t0 = 1.0f - t1; + const float u1 = z - (float)z0; + const float u0 = 1.0f - u1; + + const int slabSize = xres*yres; + const int i000 = x0 + y0 * xres + z0 * slabSize; + const int i010 = x0 + y1 * xres + z0 * slabSize; + const int i100 = x1 + y0 * xres + z0 * slabSize; + const int i110 = x1 + y1 * xres + z0 * slabSize; + const int i001 = x0 + y0 * xres + z1 * slabSize; + const int i011 = x0 + y1 * xres + z1 * slabSize; + const int i101 = x1 + y0 * xres + z1 * slabSize; + const int i111 = x1 + y1 * xres + z1 * slabSize; + + // interpolate (indices could be computed once) + return ( u0 * (s0 * (t0 * field[i000] + + t1 * field[i010]) + + s1 * (t0 * field[i100] + + t1 * field[i110])) + + u1 * (s0 * (t0 * field[i001] + + t1 * field[i011]) + + s1 * (t0 * field[i101] + + t1 * field[i111])) ); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// convert field entries of type T to floats, then interpolate +////////////////////////////////////////////////////////////////////////////////////////// +template <class T> +static inline float lerp3dToFloat(T* field1, + float x, float y, float z, int xres, int yres, int zres) { + // clamp pos to grid boundaries + if (x < 0.5) x = 0.5; + if (x > xres - 1.5) x = xres - 1.5; + if (y < 0.5) y = 0.5; + if (y > yres - 1.5) y = yres - 1.5; + if (z < 0.5) z = 0.5; + if (z > zres - 1.5) z = zres - 1.5; + + // locate neighbors to interpolate + const int x0 = (int)x; + const int x1 = x0 + 1; + const int y0 = (int)y; + const int y1 = y0 + 1; + const int z0 = (int)z; + const int z1 = z0 + 1; + + // get interpolation weights + const float s1 = x - (float)x0; + const float s0 = 1.0f - s1; + const float t1 = y - (float)y0; + const float t0 = 1.0f - t1; + const float u1 = z - (float)z0; + const float u0 = 1.0f - u1; + + const int slabSize = xres*yres; + const int i000 = x0 + y0 * xres + z0 * slabSize; + const int i010 = x0 + y1 * xres + z0 * slabSize; + const int i100 = x1 + y0 * xres + z0 * slabSize; + const int i110 = x1 + y1 * xres + z0 * slabSize; + const int i001 = x0 + y0 * xres + z1 * slabSize; + const int i011 = x0 + y1 * xres + z1 * slabSize; + const int i101 = x1 + y0 * xres + z1 * slabSize; + const int i111 = x1 + y1 * xres + z1 * slabSize; + + // interpolate (indices could be computed once) + return (float)( + ( u0 * (s0 * (t0 * (float)field1[i000] + + t1 * (float)field1[i010]) + + s1 * (t0 * (float)field1[i100] + + t1 * (float)field1[i110])) + + u1 * (s0 * (t0 * (float)field1[i001] + + t1 * (float)field1[i011]) + + s1 * (t0 * (float)field1[i101] + + t1 * (float)field1[i111])) ) ); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// interpolate a vector from 3 fields +////////////////////////////////////////////////////////////////////////////////////////// +static inline Vec3 lerp3dVec(float* field1, float* field2, float* field3, + float x, float y, float z, int xres, int yres, int zres) { + // clamp pos to grid boundaries + if (x < 0.5) x = 0.5; + if (x > xres - 1.5) x = xres - 1.5; + if (y < 0.5) y = 0.5; + if (y > yres - 1.5) y = yres - 1.5; + if (z < 0.5) z = 0.5; + if (z > zres - 1.5) z = zres - 1.5; + + // locate neighbors to interpolate + const int x0 = (int)x; + const int x1 = x0 + 1; + const int y0 = (int)y; + const int y1 = y0 + 1; + const int z0 = (int)z; + const int z1 = z0 + 1; + + // get interpolation weights + const float s1 = x - (float)x0; + const float s0 = 1.0f - s1; + const float t1 = y - (float)y0; + const float t0 = 1.0f - t1; + const float u1 = z - (float)z0; + const float u0 = 1.0f - u1; + + const int slabSize = xres*yres; + const int i000 = x0 + y0 * xres + z0 * slabSize; + const int i010 = x0 + y1 * xres + z0 * slabSize; + const int i100 = x1 + y0 * xres + z0 * slabSize; + const int i110 = x1 + y1 * xres + z0 * slabSize; + const int i001 = x0 + y0 * xres + z1 * slabSize; + const int i011 = x0 + y1 * xres + z1 * slabSize; + const int i101 = x1 + y0 * xres + z1 * slabSize; + const int i111 = x1 + y1 * xres + z1 * slabSize; + + // interpolate (indices could be computed once) + return Vec3( + ( u0 * (s0 * (t0 * field1[i000] + + t1 * field1[i010]) + + s1 * (t0 * field1[i100] + + t1 * field1[i110])) + + u1 * (s0 * (t0 * field1[i001] + + t1 * field1[i011]) + + s1 * (t0 * field1[i101] + + t1 * field1[i111])) ) , + ( u0 * (s0 * (t0 * field2[i000] + + t1 * field2[i010]) + + s1 * (t0 * field2[i100] + + t1 * field2[i110])) + + u1 * (s0 * (t0 * field2[i001] + + t1 * field2[i011]) + + s1 * (t0 * field2[i101] + + t1 * field2[i111])) ) , + ( u0 * (s0 * (t0 * field3[i000] + + t1 * field3[i010]) + + s1 * (t0 * field3[i100] + + t1 * field3[i110])) + + u1 * (s0 * (t0 * field3[i001] + + t1 * field3[i011]) + + s1 * (t0 * field3[i101] + + t1 * field3[i111])) ) + ); +} + +}; +#endif diff --git a/intern/smoke/intern/LICENSE.txt b/intern/smoke/intern/LICENSE.txt new file mode 100644 index 00000000000..94a9ed024d3 --- /dev/null +++ b/intern/smoke/intern/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/intern/smoke/intern/LU_HELPER.h b/intern/smoke/intern/LU_HELPER.h new file mode 100644 index 00000000000..b3f3c5a1cb4 --- /dev/null +++ b/intern/smoke/intern/LU_HELPER.h @@ -0,0 +1,56 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +////////////////////////////////////////////////////////////////////// + +#ifndef LU_HELPER_H +#define LU_HELPER_H + +////////////////////////////////////////////////////////////////////// +// Helper function, compute eigenvalues of 3x3 matrix +////////////////////////////////////////////////////////////////////// + +#include "tnt/jama_lu.h" + +////////////////////////////////////////////////////////////////////// +// LU decomposition of 3x3 non-symmetric matrix +////////////////////////////////////////////////////////////////////// +JAMA::LU<float> inline computeLU3x3( + float a[3][3]) +{ + TNT::Array2D<float> A = TNT::Array2D<float>(3,3, &a[0][0]); + JAMA::LU<float> jLU= JAMA::LU<float>(A); + return jLU; +} + +////////////////////////////////////////////////////////////////////// +// LU decomposition of 3x3 non-symmetric matrix +////////////////////////////////////////////////////////////////////// +void inline solveLU3x3( + JAMA::LU<float>& A, + float x[3], + float b[3]) +{ + TNT::Array1D<float> jamaB = TNT::Array1D<float>(3, &b[0]); + TNT::Array1D<float> jamaX = A.solve(jamaB); + + x[0] = jamaX[0]; + x[1] = jamaX[1]; + x[2] = jamaX[2]; +} +#endif diff --git a/intern/smoke/intern/MERSENNETWISTER.h b/intern/smoke/intern/MERSENNETWISTER.h new file mode 100644 index 00000000000..8ad00d8b9c2 --- /dev/null +++ b/intern/smoke/intern/MERSENNETWISTER.h @@ -0,0 +1,429 @@ +// MersenneTwister.h +// Mersenne Twister random number generator -- a C++ class MTRand +// Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus +// Richard J. Wagner v1.0 15 May 2003 rjwagner@writeme.com + +// The Mersenne Twister is an algorithm for generating random numbers. It +// was designed with consideration of the flaws in various other generators. +// The period, 2^19937-1, and the order of equidistribution, 623 dimensions, +// are far greater. The generator is also fast; it avoids multiplication and +// division, and it benefits from caches and pipelines. For more information +// see the inventors' web page at http://www.math.keio.ac.jp/~matumoto/emt.html + +// Reference +// M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-Dimensionally +// Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions on +// Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30. + +// Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, +// Copyright (C) 2000 - 2003, Richard J. Wagner +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The names of its contributors may not be used to endorse or promote +// products derived from this software without specific prior written +// permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// The original code included the following notice: +// +// When you use this, send an email to: matumoto@math.keio.ac.jp +// with an appropriate reference to your work. +// +// It would be nice to CC: rjwagner@writeme.com and Cokus@math.washington.edu +// when you write. + +#ifndef MERSENNETWISTER_H +#define MERSENNETWISTER_H + +// Not thread safe (unless auto-initialization is avoided and each thread has +// its own MTRand object) + +#include <iostream> +#include <limits.h> +#include <stdio.h> +#include <time.h> +#include <math.h> + +class MTRand { +// Data +public: + typedef unsigned long uint32; // unsigned integer type, at least 32 bits + + enum { N = 624 }; // length of state vector + enum { SAVE = N + 1 }; // length of array for save() + +protected: + enum { M = 397 }; // period parameter + + uint32 state[N]; // internal state + uint32 *pNext; // next value to get from state + int left; // number of values left before reload needed + + +//Methods +public: + MTRand( const uint32& oneSeed ); // initialize with a simple uint32 + MTRand( uint32 *const bigSeed, uint32 const seedLength = N ); // or an array + MTRand(); // auto-initialize with /dev/urandom or time() and clock() + + // Do NOT use for CRYPTOGRAPHY without securely hashing several returned + // values together, otherwise the generator state can be learned after + // reading 624 consecutive values. + + // Access to 32-bit random numbers + double rand(); // real number in [0,1] + double rand( const double& n ); // real number in [0,n] + double randExc(); // real number in [0,1) + double randExc( const double& n ); // real number in [0,n) + double randDblExc(); // real number in (0,1) + double randDblExc( const double& n ); // real number in (0,n) + uint32 randInt(); // integer in [0,2^32-1] + uint32 randInt( const uint32& n ); // integer in [0,n] for n < 2^32 + double operator()() { return rand(); } // same as rand() + + // Access to 53-bit random numbers (capacity of IEEE double precision) + double rand53(); // real number in [0,1) + + // Access to nonuniform random number distributions + double randNorm( const double& mean = 0.0, const double& variance = 1.0 ); + + // Re-seeding functions with same behavior as initializers + void seed( const uint32 oneSeed ); + void seed( uint32 *const bigSeed, const uint32 seedLength = N ); + void seed(); + + // Saving and loading generator state + void save( uint32* saveArray ) const; // to array of size SAVE + void load( uint32 *const loadArray ); // from such array + friend std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ); + friend std::istream& operator>>( std::istream& is, MTRand& mtrand ); + +protected: + void initialize( const uint32 oneSeed ); + void reload(); + uint32 hiBit( const uint32& u ) const { return u & 0x80000000UL; } + uint32 loBit( const uint32& u ) const { return u & 0x00000001UL; } + uint32 loBits( const uint32& u ) const { return u & 0x7fffffffUL; } + uint32 mixBits( const uint32& u, const uint32& v ) const + { return hiBit(u) | loBits(v); } + uint32 twist( const uint32& m, const uint32& s0, const uint32& s1 ) const + { return m ^ (mixBits(s0,s1)>>1) ^ (-loBit(s1) & 0x9908b0dfUL); } + static uint32 hash( time_t t, clock_t c ); +}; + + +inline MTRand::MTRand( const uint32& oneSeed ) + { seed(oneSeed); } + +inline MTRand::MTRand( uint32 *const bigSeed, const uint32 seedLength ) + { seed(bigSeed,seedLength); } + +inline MTRand::MTRand() + { seed(); } + +inline double MTRand::rand() + { return double(randInt()) * (1.0/4294967295.0); } + +inline double MTRand::rand( const double& n ) + { return rand() * n; } + +inline double MTRand::randExc() + { return double(randInt()) * (1.0/4294967296.0); } + +inline double MTRand::randExc( const double& n ) + { return randExc() * n; } + +inline double MTRand::randDblExc() + { return ( double(randInt()) + 0.5 ) * (1.0/4294967296.0); } + +inline double MTRand::randDblExc( const double& n ) + { return randDblExc() * n; } + +inline double MTRand::rand53() +{ + uint32 a = randInt() >> 5, b = randInt() >> 6; + return ( a * 67108864.0 + b ) * (1.0/9007199254740992.0); // by Isaku Wada +} + +inline double MTRand::randNorm( const double& mean, const double& variance ) +{ + // Return a real number from a normal (Gaussian) distribution with given + // mean and variance by Box-Muller method + double r = sqrt( -2.0 * log( 1.0-randDblExc()) ) * variance; + double phi = 2.0 * 3.14159265358979323846264338328 * randExc(); + return mean + r * cos(phi); +} + +inline MTRand::uint32 MTRand::randInt() +{ + // Pull a 32-bit integer from the generator state + // Every other access function simply transforms the numbers extracted here + + if( left == 0 ) reload(); + --left; + + register uint32 s1; + s1 = *pNext++; + s1 ^= (s1 >> 11); + s1 ^= (s1 << 7) & 0x9d2c5680UL; + s1 ^= (s1 << 15) & 0xefc60000UL; + return ( s1 ^ (s1 >> 18) ); +} + +inline MTRand::uint32 MTRand::randInt( const uint32& n ) +{ + // Find which bits are used in n + // Optimized by Magnus Jonsson (magnus@smartelectronix.com) + uint32 used = n; + used |= used >> 1; + used |= used >> 2; + used |= used >> 4; + used |= used >> 8; + used |= used >> 16; + + // Draw numbers until one is found in [0,n] + uint32 i; + do + i = randInt() & used; // toss unused bits to shorten search + while( i > n ); + return i; +} + + +inline void MTRand::seed( const uint32 oneSeed ) +{ + // Seed the generator with a simple uint32 + initialize(oneSeed); + reload(); +} + + +inline void MTRand::seed( uint32 *const bigSeed, const uint32 seedLength ) +{ + // Seed the generator with an array of uint32's + // There are 2^19937-1 possible initial states. This function allows + // all of those to be accessed by providing at least 19937 bits (with a + // default seed length of N = 624 uint32's). Any bits above the lower 32 + // in each element are discarded. + // Just call seed() if you want to get array from /dev/urandom + initialize(19650218UL); + register int i = 1; + register uint32 j = 0; + register int k = ( N > seedLength ? N : seedLength ); + for( ; k; --k ) + { + state[i] = + state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1664525UL ); + state[i] += ( bigSeed[j] & 0xffffffffUL ) + j; + state[i] &= 0xffffffffUL; + ++i; ++j; + if( i >= N ) { state[0] = state[N-1]; i = 1; } + if( j >= seedLength ) j = 0; + } + for( k = N - 1; k; --k ) + { + state[i] = + state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1566083941UL ); + state[i] -= i; + state[i] &= 0xffffffffUL; + ++i; + if( i >= N ) { state[0] = state[N-1]; i = 1; } + } + state[0] = 0x80000000UL; // MSB is 1, assuring non-zero initial array + reload(); +} + + +inline void MTRand::seed() +{ + // seed deterministically to produce reproducible runs + seed(123456); + + /* + // Seed the generator with an array from /dev/urandom if available + // Otherwise use a hash of time() and clock() values + + // First try getting an array from /dev/urandom + FILE* urandom = fopen( "/dev/urandom", "rb" ); + if( urandom ) + { + uint32 bigSeed[N]; + register uint32 *s = bigSeed; + register int i = N; + register bool success = true; + while( success && i-- ) + success = fread( s++, sizeof(uint32), 1, urandom ); + fclose(urandom); + if( success ) { seed( bigSeed, N ); return; } + } + + // Was not successful, so use time() and clock() instead + seed( hash( time(NULL), clock() ) ); + */ +} + + +inline void MTRand::initialize( const uint32 seed ) +{ + // Initialize generator state with seed + // See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier. + // In previous versions, most significant bits (MSBs) of the seed affect + // only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. + register uint32 *s = state; + register uint32 *r = state; + register int i = 1; + *s++ = seed & 0xffffffffUL; + for( ; i < N; ++i ) + { + *s++ = ( 1812433253UL * ( *r ^ (*r >> 30) ) + i ) & 0xffffffffUL; + r++; + } +} + + +inline void MTRand::reload() +{ + // Generate N new values in state + // Made clearer and faster by Matthew Bellew (matthew.bellew@home.com) + register uint32 *p = state; + register int i; + for( i = N - M; i--; ++p ) + *p = twist( p[M], p[0], p[1] ); + for( i = M; --i; ++p ) + *p = twist( p[M-N], p[0], p[1] ); + *p = twist( p[M-N], p[0], state[0] ); + + left = N, pNext = state; +} + + +inline MTRand::uint32 MTRand::hash( time_t t, clock_t c ) +{ + // Get a uint32 from t and c + // Better than uint32(x) in case x is floating point in [0,1] + // Based on code by Lawrence Kirby (fred@genesis.demon.co.uk) + + static uint32 differ = 0; // guarantee time-based seeds will change + + uint32 h1 = 0; + unsigned char *p = (unsigned char *) &t; + for( size_t i = 0; i < sizeof(t); ++i ) + { + h1 *= UCHAR_MAX + 2U; + h1 += p[i]; + } + uint32 h2 = 0; + p = (unsigned char *) &c; + for( size_t j = 0; j < sizeof(c); ++j ) + { + h2 *= UCHAR_MAX + 2U; + h2 += p[j]; + } + return ( h1 + differ++ ) ^ h2; +} + + +inline void MTRand::save( uint32* saveArray ) const +{ + register uint32 *sa = saveArray; + register const uint32 *s = state; + register int i = N; + for( ; i--; *sa++ = *s++ ) {} + *sa = left; +} + + +inline void MTRand::load( uint32 *const loadArray ) +{ + register uint32 *s = state; + register uint32 *la = loadArray; + register int i = N; + for( ; i--; *s++ = *la++ ) {} + left = *la; + pNext = &state[N-left]; +} + + +inline std::ostream& operator<<( std::ostream& os, const MTRand& mtrand ) +{ + register const MTRand::uint32 *s = mtrand.state; + register int i = mtrand.N; + for( ; i--; os << *s++ << "\t" ) {} + return os << mtrand.left; +} + + +inline std::istream& operator>>( std::istream& is, MTRand& mtrand ) +{ + register MTRand::uint32 *s = mtrand.state; + register int i = mtrand.N; + for( ; i--; is >> *s++ ) {} + is >> mtrand.left; + mtrand.pNext = &mtrand.state[mtrand.N-mtrand.left]; + return is; +} + +#endif // MERSENNETWISTER_H + +// Change log: +// +// v0.1 - First release on 15 May 2000 +// - Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus +// - Translated from C to C++ +// - Made completely ANSI compliant +// - Designed convenient interface for initialization, seeding, and +// obtaining numbers in default or user-defined ranges +// - Added automatic seeding from /dev/urandom or time() and clock() +// - Provided functions for saving and loading generator state +// +// v0.2 - Fixed bug which reloaded generator one step too late +// +// v0.3 - Switched to clearer, faster reload() code from Matthew Bellew +// +// v0.4 - Removed trailing newline in saved generator format to be consistent +// with output format of built-in types +// +// v0.5 - Improved portability by replacing static const int's with enum's and +// clarifying return values in seed(); suggested by Eric Heimburg +// - Removed MAXINT constant; use 0xffffffffUL instead +// +// v0.6 - Eliminated seed overflow when uint32 is larger than 32 bits +// - Changed integer [0,n] generator to give better uniformity +// +// v0.7 - Fixed operator precedence ambiguity in reload() +// - Added access for real numbers in (0,1) and (0,n) +// +// v0.8 - Included time.h header to properly support time_t and clock_t +// +// v1.0 - Revised seeding to match 26 Jan 2002 update of Nishimura and Matsumoto +// - Allowed for seeding with arrays of any length +// - Added access for real numbers in [0,1) with 53-bit resolution +// - Added access for real numbers from normal (Gaussian) distributions +// - Increased overall speed by optimizing twist() +// - Doubled speed of integer [0,n] generation +// - Fixed out-of-range number generation on 64-bit machines +// - Improved portability by substituting literal constants for long enum's +// - Changed license from GNU LGPL to BSD + diff --git a/intern/smoke/intern/Makefile b/intern/smoke/intern/Makefile new file mode 100644 index 00000000000..2cdd7d3853e --- /dev/null +++ b/intern/smoke/intern/Makefile @@ -0,0 +1,52 @@ +# +# $Id$ +# +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): none yet. +# +# ***** END GPL LICENSE BLOCK ***** +# smoke intern Makefile +# + +LIBNAME = smoke +DIR = $(OCGDIR)/intern/$(LIBNAME) + +include nan_compile.mk + +unexport NAN_QUIET + +CCFLAGS += $(LEVEL_2_CPP_WARNINGS) + +ifeq ($(WITH_BF_OPENMP),true) + CPPFLAGS += -DPARALLEL +endif + +CPPFLAGS += -I. +CPPFLAGS += -I../extern +CPPFLAGS += -I$(NAN_PNG)/include +CPPFLAGS += -I$(NAN_PNG)/include/libpng + +# zlib +ifeq ($(OS),$(findstring $(OS), "solaris windows")) + CPPFLAGS += -I$(NAN_ZLIB)/include +endif diff --git a/intern/smoke/intern/Makefile.FFT b/intern/smoke/intern/Makefile.FFT new file mode 100644 index 00000000000..e45af1df29b --- /dev/null +++ b/intern/smoke/intern/Makefile.FFT @@ -0,0 +1,22 @@ +# common stuff
+LDFLAGS_COMMON = -lfftw3 #-lglut -lglu32 -lopengl32 -lz -lpng
+CFLAGS_COMMON = -c -Wall -I./ #-I/cygdrive/c/lib/glvu/include -D_WIN32
+
+CC = g++
+CFLAGS = ${CFLAGS_COMMON} -O3 -Wno-unused
+LDFLAGS = ${LDFLAGS_COMMON}
+EXECUTABLE = noiseFFT
+
+SOURCES = noiseFFT.cpp
+OBJECTS = $(SOURCES:.cpp=.o)
+
+all: $(SOURCES) $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CC) $(OBJECTS) $(LDFLAGS) -o $@
+
+.cpp.o:
+ $(CC) $(CFLAGS) $< -o $@
+
+clean:
+ rm -f *.o $(EXECUTABLE_LOADER) $(EXECUTABLE)
diff --git a/intern/smoke/intern/Makefile.cygwin b/intern/smoke/intern/Makefile.cygwin new file mode 100644 index 00000000000..c93753a67fe --- /dev/null +++ b/intern/smoke/intern/Makefile.cygwin @@ -0,0 +1,23 @@ +CC = g++
+LDFLAGS = -lz -lpng
+CFLAGS = -O3 -Wno-unused -c -Wall -I./ -D_WIN32
+EXECUTABLE = FLUID_3D
+
+SOURCES = main.cpp FLUID_3D.cpp FLUID_3D_SOLVERS.cpp FLUID_3D_STATIC.cpp SPHERE.cpp WTURBULENCE.cpp
+OBJECTS = $(SOURCES:.cpp=.o)
+
+all: $(SOURCES) $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CC) $(OBJECTS) $(LDFLAGS) -o $@
+
+.cpp.o:
+ $(CC) $(CFLAGS) $< -o $@
+
+SPHERE.o: SPHERE.h
+FLUID_3D.o: FLUID_3D.h FLUID_3D.cpp
+FLUID_3D_SOLVERS.o: FLUID_3D.h FLUID_3D_SOLVERS.cpp
+main.o: FLUID_3D.h FLUID_3D.cpp FLUID_3D_SOLVERS.cpp
+
+clean:
+ rm -f *.o $(EXECUTABLE_LOADER) $(EXECUTABLE)
diff --git a/intern/smoke/intern/Makefile.linux b/intern/smoke/intern/Makefile.linux new file mode 100644 index 00000000000..8e71af465dd --- /dev/null +++ b/intern/smoke/intern/Makefile.linux @@ -0,0 +1,23 @@ +CC = g++
+LDFLAGS = -lz -lpng -fopenmp -lgomp
+CFLAGS = -c -Wall -I./ -fopenmp -DPARALLEL=1 -O3 -Wno-unused
+EXECUTABLE = FLUID_3D
+
+SOURCES = main.cpp FLUID_3D.cpp FLUID_3D_SOLVERS.cpp FLUID_3D_STATIC.cpp SPHERE.cpp WTURBULENCE.cpp
+OBJECTS = $(SOURCES:.cpp=.o)
+
+all: $(SOURCES) $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CC) $(OBJECTS) $(LDFLAGS) -o $@
+
+.cpp.o:
+ $(CC) $(CFLAGS) $< -o $@
+
+SPHERE.o: SPHERE.h
+FLUID_3D.o: FLUID_3D.h FLUID_3D.cpp
+FLUID_3D_SOLVERS.o: FLUID_3D.h FLUID_3D_SOLVERS.cpp
+main.o: FLUID_3D.h FLUID_3D.cpp FLUID_3D_SOLVERS.cpp
+
+clean:
+ rm -f *.o $(EXECUTABLE_LOADER) $(EXECUTABLE)
diff --git a/intern/smoke/intern/Makefile.mac b/intern/smoke/intern/Makefile.mac new file mode 100644 index 00000000000..227aaa10a16 --- /dev/null +++ b/intern/smoke/intern/Makefile.mac @@ -0,0 +1,35 @@ +CC = g++
+
+# uncomment the other two OPENMP_... lines, if your gcc supports OpenMP
+#OPENMP_FLAGS = -fopenmp -DPARALLEL=1 -I/opt/gcc-4.3/usr/local/include
+#OPENMPLD_FLAGS = -fopenmp -lgomp -I/opt/gcc-4.3/usr/local/lib
+OPENMP_FLAGS =
+OPENMPLD_FLAGS =
+
+# assumes MacPorts libpng installation
+PNG_INCLUDE = -I/opt/local/include
+PNG_LIBS = -I/opt/local/lib
+
+LDFLAGS = $(PNG_LIBS)-lz -lpng $(OPENMPLD_FLAGS)
+CFLAGS = -c -Wall -I./ $(PNG_INCLUDE) $(OPENMP_FLAGS) -O3 -Wno-unused
+EXECUTABLE = FLUID_3D
+
+SOURCES = main.cpp FLUID_3D.cpp FLUID_3D_SOLVERS.cpp FLUID_3D_STATIC.cpp SPHERE.cpp WTURBULENCE.cpp
+OBJECTS = $(SOURCES:.cpp=.o)
+
+all: $(SOURCES) $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CC) $(OBJECTS) $(LDFLAGS) -o $@
+
+.cpp.o:
+ $(CC) $(CFLAGS) $< -o $@
+
+SPHERE.o: SPHERE.h
+FLUID_3D.o: FLUID_3D.h FLUID_3D.cpp
+FLUID_3D_SOLVERS.o: FLUID_3D.h FLUID_3D_SOLVERS.cpp
+main.o: FLUID_3D.h FLUID_3D.cpp FLUID_3D_SOLVERS.cpp
+
+clean:
+ rm -f *.o $(EXECUTABLE_LOADER) $(EXECUTABLE)
+
diff --git a/intern/smoke/intern/OBSTACLE.h b/intern/smoke/intern/OBSTACLE.h new file mode 100644 index 00000000000..54e824d275d --- /dev/null +++ b/intern/smoke/intern/OBSTACLE.h @@ -0,0 +1,41 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +// OBSTACLE.h: interface for the OBSTACLE class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef OBSTACLE_H +#define OBSTACLE_H + +enum OBSTACLE_FLAGS { + EMPTY = 0, + MARCHED = 2, + RETIRED = 4 +}; + +class OBSTACLE +{ +public: + OBSTACLE() {}; + virtual ~OBSTACLE() {}; + + virtual bool inside(float x, float y, float z) = 0; +}; + +#endif diff --git a/intern/smoke/intern/SPHERE.cpp b/intern/smoke/intern/SPHERE.cpp new file mode 100644 index 00000000000..4bb18fb81c0 --- /dev/null +++ b/intern/smoke/intern/SPHERE.cpp @@ -0,0 +1,50 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +// SPHERE.cpp: implementation of the SPHERE class. +// +////////////////////////////////////////////////////////////////////// + +#include "SPHERE.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +SPHERE::SPHERE(float x, float y, float z, float radius) : + _radius(radius) +{ + _center[0] = x; + _center[1] = y; + _center[2] = z; +} + +SPHERE::~SPHERE() +{ + +} + +bool SPHERE::inside(float x, float y, float z) +{ + float translate[] = {x - _center[0], y - _center[1], z - _center[2]}; + float magnitude = translate[0] * translate[0] + + translate[1] * translate[1] + + translate[2] * translate[2]; + + return (magnitude < _radius * _radius) ? true : false; +} diff --git a/intern/smoke/intern/SPHERE.h b/intern/smoke/intern/SPHERE.h new file mode 100644 index 00000000000..13bd6e9493c --- /dev/null +++ b/intern/smoke/intern/SPHERE.h @@ -0,0 +1,41 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +// SPHERE.h: interface for the SPHERE class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef SPHERE_H +#define SPHERE_H + +#include "OBSTACLE.h" + +class SPHERE : public OBSTACLE +{ +public: + SPHERE(float x, float y, float z, float radius); + virtual ~SPHERE(); + + bool inside(float x, float y, float z); + +private: + float _center[3]; + float _radius; +}; + +#endif diff --git a/intern/smoke/intern/VEC3.h b/intern/smoke/intern/VEC3.h new file mode 100644 index 00000000000..607f68279a2 --- /dev/null +++ b/intern/smoke/intern/VEC3.h @@ -0,0 +1,984 @@ +/****************************************************************************** + * Copyright 2007 Nils Thuerey + * Basic vector class + *****************************************************************************/ +#ifndef BASICVECTOR_H +#define BASICVECTOR_H + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include <iostream> +#include <sstream> + +// use which fp-precision? 1=float, 2=double +#ifndef FLOATINGPOINT_PRECISION +#if DDF_DEBUG==1 +#define FLOATINGPOINT_PRECISION 2 +#else // DDF_DEBUG==1 +#define FLOATINGPOINT_PRECISION 1 +#endif // DDF_DEBUG==1 +#endif + +// VECTOR_EPSILON is the minimal vector length +// In order to be able to discriminate floating point values near zero, and +// to be sure not to fail a comparison because of roundoff errors, use this +// value as a threshold. + +#if FLOATINGPOINT_PRECISION==1 +typedef float Real; +#define FP_REAL_MAX __FLT_MAX__ +#define VECTOR_EPSILON (1e-5f) +#else +typedef double Real; +#define FP_REAL_MAX __DBL_MAX__ +#define VECTOR_EPSILON (1e-10) +#endif + + +// hardcoded limits for now... +// for e.g. MSVC compiler... +// some of these defines can be needed +// for linux systems as well (e.g. FLT_MAX) +#ifndef __FLT_MAX__ +# ifdef FLT_MAX // try to use it instead +# define __FLT_MAX__ FLT_MAX +# else // FLT_MAX +# define __FLT_MAX__ 3.402823466e+38f +# endif // FLT_MAX +#endif // __FLT_MAX__ +#ifndef __DBL_MAX__ +# ifdef DBL_MAX // try to use it instead +# define __DBL_MAX__ DBL_MAX +# else // DBL_MAX +# define __DBL_MAX__ 1.7976931348623158e+308 +# endif // DBL_MAX +#endif // __DBL_MAX__ + +#ifndef FLT_MAX +#define FLT_MAX __FLT_MAX__ +#endif + +#ifndef DBL_MAX +#define DBL_MAX __DBL_MAX__ +#endif + +#ifndef M_PI +# define M_PI 3.1415926536 +# define M_E 2.7182818284 +#endif + + + +namespace BasicVector { + + +// basic inlined vector class +template<class Scalar> +class Vector3Dim +{ +public: + // Constructor + inline Vector3Dim(); + // Copy-Constructor + inline Vector3Dim(const Vector3Dim<Scalar> &v ); + inline Vector3Dim(const float *); + inline Vector3Dim(const double *); + // construct a vector from one Scalar + inline Vector3Dim(Scalar); + // construct a vector from three Scalars + inline Vector3Dim(Scalar, Scalar, Scalar); + + // get address of array for OpenGL + Scalar *getAddress() { return value; } + + // Assignment operator + inline const Vector3Dim<Scalar>& operator= (const Vector3Dim<Scalar>& v); + // Assignment operator + inline const Vector3Dim<Scalar>& operator= (Scalar s); + // Assign and add operator + inline const Vector3Dim<Scalar>& operator+= (const Vector3Dim<Scalar>& v); + // Assign and add operator + inline const Vector3Dim<Scalar>& operator+= (Scalar s); + // Assign and sub operator + inline const Vector3Dim<Scalar>& operator-= (const Vector3Dim<Scalar>& v); + // Assign and sub operator + inline const Vector3Dim<Scalar>& operator-= (Scalar s); + // Assign and mult operator + inline const Vector3Dim<Scalar>& operator*= (const Vector3Dim<Scalar>& v); + // Assign and mult operator + inline const Vector3Dim<Scalar>& operator*= (Scalar s); + // Assign and div operator + inline const Vector3Dim<Scalar>& operator/= (const Vector3Dim<Scalar>& v); + // Assign and div operator + inline const Vector3Dim<Scalar>& operator/= (Scalar s); + + + // unary operator + inline Vector3Dim<Scalar> operator- () const; + + // binary operator add + inline Vector3Dim<Scalar> operator+ (const Vector3Dim<Scalar>&) const; + // binary operator add + inline Vector3Dim<Scalar> operator+ (Scalar) const; + // binary operator sub + inline Vector3Dim<Scalar> operator- (const Vector3Dim<Scalar>&) const; + // binary operator sub + inline Vector3Dim<Scalar> operator- (Scalar) const; + // binary operator mult + inline Vector3Dim<Scalar> operator* (const Vector3Dim<Scalar>&) const; + // binary operator mult + inline Vector3Dim<Scalar> operator* (Scalar) const; + // binary operator div + inline Vector3Dim<Scalar> operator/ (const Vector3Dim<Scalar>&) const; + // binary operator div + inline Vector3Dim<Scalar> operator/ (Scalar) const; + + // Projection normal to a vector + inline Vector3Dim<Scalar> getOrthogonalntlVector3Dim() const; + // Project into a plane + inline const Vector3Dim<Scalar>& projectNormalTo(const Vector3Dim<Scalar> &v); + + // minimize + inline const Vector3Dim<Scalar> &minimize(const Vector3Dim<Scalar> &); + // maximize + inline const Vector3Dim<Scalar> &maximize(const Vector3Dim<Scalar> &); + + // access operator + inline Scalar& operator[](unsigned int i); + // access operator + inline const Scalar& operator[](unsigned int i) const; + + //! actual values + union { + struct { + Scalar value[3]; + }; + struct { + Scalar x; + Scalar y; + Scalar z; + }; + struct { + Scalar X; + Scalar Y; + Scalar Z; + }; + }; +protected: + +}; + + + + + +//------------------------------------------------------------------------------ +// VECTOR inline FUNCTIONS +//------------------------------------------------------------------------------ + + + +/************************************************************************* + Constructor. + */ +template<class Scalar> +inline Vector3Dim<Scalar>::Vector3Dim( void ) +{ + value[0] = value[1] = value[2] = 0; +} + + + +/************************************************************************* + Copy-Constructor. + */ +template<class Scalar> +inline Vector3Dim<Scalar>::Vector3Dim( const Vector3Dim<Scalar> &v ) +{ + value[0] = v.value[0]; + value[1] = v.value[1]; + value[2] = v.value[2]; +} +template<class Scalar> +inline Vector3Dim<Scalar>::Vector3Dim( const float *fvalue) +{ + value[0] = (Scalar)fvalue[0]; + value[1] = (Scalar)fvalue[1]; + value[2] = (Scalar)fvalue[2]; +} +template<class Scalar> +inline Vector3Dim<Scalar>::Vector3Dim( const double *fvalue) +{ + value[0] = (Scalar)fvalue[0]; + value[1] = (Scalar)fvalue[1]; + value[2] = (Scalar)fvalue[2]; +} + + + +/************************************************************************* + Constructor for a vector from a single Scalar. All components of + the vector get the same value. + \param s The value to set + \return The new vector + */ +template<class Scalar> +inline Vector3Dim<Scalar>::Vector3Dim(Scalar s ) +{ + value[0]= s; + value[1]= s; + value[2]= s; +} + + +/************************************************************************* + Constructor for a vector from three Scalars. + \param s1 The value for the first vector component + \param s2 The value for the second vector component + \param s3 The value for the third vector component + \return The new vector + */ +template<class Scalar> +inline Vector3Dim<Scalar>::Vector3Dim(Scalar s1, Scalar s2, Scalar s3) +{ + value[0]= s1; + value[1]= s2; + value[2]= s3; +} + + + +/************************************************************************* + Copy a Vector3Dim componentwise. + \param v vector with values to be copied + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator=( const Vector3Dim<Scalar> &v ) +{ + value[0] = v.value[0]; + value[1] = v.value[1]; + value[2] = v.value[2]; + return *this; +} + + +/************************************************************************* + Copy a Scalar to each component. + \param s The value to copy + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator=(Scalar s) +{ + value[0] = s; + value[1] = s; + value[2] = s; + return *this; +} + + +/************************************************************************* + Add another Vector3Dim componentwise. + \param v vector with values to be added + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator+=( const Vector3Dim<Scalar> &v ) +{ + value[0] += v.value[0]; + value[1] += v.value[1]; + value[2] += v.value[2]; + return *this; +} + + +/************************************************************************* + Add a Scalar value to each component. + \param s Value to add + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator+=(Scalar s) +{ + value[0] += s; + value[1] += s; + value[2] += s; + return *this; +} + + +/************************************************************************* + Subtract another vector componentwise. + \param v vector of values to subtract + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator-=( const Vector3Dim<Scalar> &v ) +{ + value[0] -= v.value[0]; + value[1] -= v.value[1]; + value[2] -= v.value[2]; + return *this; +} + + +/************************************************************************* + Subtract a Scalar value from each component. + \param s Value to subtract + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator-=(Scalar s) +{ + value[0]-= s; + value[1]-= s; + value[2]-= s; + return *this; +} + + +/************************************************************************* + Multiply with another vector componentwise. + \param v vector of values to multiply with + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator*=( const Vector3Dim<Scalar> &v ) +{ + value[0] *= v.value[0]; + value[1] *= v.value[1]; + value[2] *= v.value[2]; + return *this; +} + + +/************************************************************************* + Multiply each component with a Scalar value. + \param s Value to multiply with + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator*=(Scalar s) +{ + value[0] *= s; + value[1] *= s; + value[2] *= s; + return *this; +} + + +/************************************************************************* + Divide by another Vector3Dim componentwise. + \param v vector of values to divide by + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator/=( const Vector3Dim<Scalar> &v ) +{ + value[0] /= v.value[0]; + value[1] /= v.value[1]; + value[2] /= v.value[2]; + return *this; +} + + +/************************************************************************* + Divide each component by a Scalar value. + \param s Value to divide by + \return Reference to self + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::operator/=(Scalar s) +{ + value[0] /= s; + value[1] /= s; + value[2] /= s; + return *this; +} + + +//------------------------------------------------------------------------------ +// unary operators +//------------------------------------------------------------------------------ + + +/************************************************************************* + Build componentwise the negative this vector. + \return The new (negative) vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> +Vector3Dim<Scalar>::operator-() const +{ + return Vector3Dim<Scalar>(-value[0], -value[1], -value[2]); +} + + + +//------------------------------------------------------------------------------ +// binary operators +//------------------------------------------------------------------------------ + + +/************************************************************************* + Build a vector with another vector added componentwise. + \param v The second vector to add + \return The sum vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> +Vector3Dim<Scalar>::operator+( const Vector3Dim<Scalar> &v ) const +{ + return Vector3Dim<Scalar>(value[0]+v.value[0], + value[1]+v.value[1], + value[2]+v.value[2]); +} + + +/************************************************************************* + Build a vector with a Scalar value added to each component. + \param s The Scalar value to add + \return The sum vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> +Vector3Dim<Scalar>::operator+(Scalar s) const +{ + return Vector3Dim<Scalar>(value[0]+s, + value[1]+s, + value[2]+s); +} + + +/************************************************************************* + Build a vector with another vector subtracted componentwise. + \param v The second vector to subtract + \return The difference vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> +Vector3Dim<Scalar>::operator-( const Vector3Dim<Scalar> &v ) const +{ + return Vector3Dim<Scalar>(value[0]-v.value[0], + value[1]-v.value[1], + value[2]-v.value[2]); +} + + +/************************************************************************* + Build a vector with a Scalar value subtracted componentwise. + \param s The Scalar value to subtract + \return The difference vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> +Vector3Dim<Scalar>::operator-(Scalar s ) const +{ + return Vector3Dim<Scalar>(value[0]-s, + value[1]-s, + value[2]-s); +} + + + +/************************************************************************* + Build a vector with another vector multiplied by componentwise. + \param v The second vector to muliply with + \return The product vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> +Vector3Dim<Scalar>::operator*( const Vector3Dim<Scalar>& v) const +{ + return Vector3Dim<Scalar>(value[0]*v.value[0], + value[1]*v.value[1], + value[2]*v.value[2]); +} + + +/************************************************************************* + Build a Vector3Dim with a Scalar value multiplied to each component. + \param s The Scalar value to multiply with + \return The product vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> +Vector3Dim<Scalar>::operator*(Scalar s) const +{ + return Vector3Dim<Scalar>(value[0]*s, value[1]*s, value[2]*s); +} + + +/************************************************************************* + Build a vector divided componentwise by another vector. + \param v The second vector to divide by + \return The ratio vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> +Vector3Dim<Scalar>::operator/(const Vector3Dim<Scalar>& v) const +{ + return Vector3Dim<Scalar>(value[0]/v.value[0], + value[1]/v.value[1], + value[2]/v.value[2]); +} + + + +/************************************************************************* + Build a vector divided componentwise by a Scalar value. + \param s The Scalar value to divide by + \return The ratio vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> +Vector3Dim<Scalar>::operator/(Scalar s) const +{ + return Vector3Dim<Scalar>(value[0]/s, + value[1]/s, + value[2]/s); +} + + + + + +/************************************************************************* + Get a particular component of the vector. + \param i Number of Scalar to get + \return Reference to the component + */ +template<class Scalar> +inline Scalar& +Vector3Dim<Scalar>::operator[]( unsigned int i ) +{ + return value[i]; +} + + +/************************************************************************* + Get a particular component of a constant vector. + \param i Number of Scalar to get + \return Reference to the component + */ +template<class Scalar> +inline const Scalar& +Vector3Dim<Scalar>::operator[]( unsigned int i ) const +{ + return value[i]; +} + + + +//------------------------------------------------------------------------------ +// BLITZ compatibility functions +//------------------------------------------------------------------------------ + + + +/************************************************************************* + Compute the scalar product with another vector. + \param v The second vector to work with + \return The value of the scalar product + */ +template<class Scalar> +inline Scalar dot(const Vector3Dim<Scalar> &t, const Vector3Dim<Scalar> &v ) +{ + //return t.value[0]*v.value[0] + t.value[1]*v.value[1] + t.value[2]*v.value[2]; + return ((t[0]*v[0]) + (t[1]*v[1]) + (t[2]*v[2])); +} + + +/************************************************************************* + Calculate the cross product of this and another vector + */ +template<class Scalar> +inline Vector3Dim<Scalar> cross(const Vector3Dim<Scalar> &t, const Vector3Dim<Scalar> &v) +{ + Vector3Dim<Scalar> cp( + ((t[1]*v[2]) - (t[2]*v[1])), + ((t[2]*v[0]) - (t[0]*v[2])), + ((t[0]*v[1]) - (t[1]*v[0])) ); + return cp; +} + + + + +/************************************************************************* + Compute a vector that is orthonormal to self. Nothing else can be assumed + for the direction of the new vector. + \return The orthonormal vector + */ +template<class Scalar> +Vector3Dim<Scalar> +Vector3Dim<Scalar>::getOrthogonalntlVector3Dim() const +{ + // Determine the component with max. absolute value + int max= (fabs(value[0]) > fabs(value[1])) ? 0 : 1; + max= (fabs(value[max]) > fabs(value[2])) ? max : 2; + + /************************************************************************* + Choose another axis than the one with max. component and project + orthogonal to self + */ + Vector3Dim<Scalar> vec(0.0); + vec[(max+1)%3]= 1; + vec.normalize(); + vec.projectNormalTo(this->getNormalized()); + return vec; +} + + +/************************************************************************* + Projects the vector into a plane normal to the given vector, which must + have unit length. Self is modified. + \param v The plane normal + \return The projected vector + */ +template<class Scalar> +inline const Vector3Dim<Scalar>& +Vector3Dim<Scalar>::projectNormalTo(const Vector3Dim<Scalar> &v) +{ + Scalar sprod = dot(*this,v); + value[0]= value[0] - v.value[0] * sprod; + value[1]= value[1] - v.value[1] * sprod; + value[2]= value[2] - v.value[2] * sprod; + return *this; +} + + + +//------------------------------------------------------------------------------ +// Other helper functions +//------------------------------------------------------------------------------ + + + +/************************************************************************* + Minimize the vector, i.e. set each entry of the vector to the minimum + of both values. + \param pnt The second vector to compare with + \return Reference to the modified self + */ +template<class Scalar> +inline const Vector3Dim<Scalar> & +Vector3Dim<Scalar>::minimize(const Vector3Dim<Scalar> &pnt) +{ + for (unsigned int i = 0; i < 3; i++) + value[i] = MIN(value[i],pnt[i]); + return *this; +} + + + +/************************************************************************* + Maximize the vector, i.e. set each entry of the vector to the maximum + of both values. + \param pnt The second vector to compare with + \return Reference to the modified self + */ +template<class Scalar> +inline const Vector3Dim<Scalar> & +Vector3Dim<Scalar>::maximize(const Vector3Dim<Scalar> &pnt) +{ + for (unsigned int i = 0; i < 3; i++) + value[i] = MAX(value[i],pnt[i]); + return *this; +} + + + + + + +/************************************************************************/ +// HELPER FUNCTIONS, independent of implementation +/************************************************************************/ + +#define VECTOR_TYPE Vector3Dim<Scalar> + + +/************************************************************************* + Compute the length (norm) of the vector. + \return The value of the norm + */ +template<class Scalar> +inline Scalar norm( const VECTOR_TYPE &v) +{ + Scalar l = v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; + return (fabs(l-1.) < VECTOR_EPSILON*VECTOR_EPSILON) ? 1. : sqrt(l); +} + +// for e.g. min max operator +inline Real normHelper(const Vector3Dim<Real> &v) { + return norm(v); +} +inline Real normHelper(const Real &v) { + return (0. < v) ? v : -v ; +} +inline Real normHelper(const int &v) { + return (0 < v) ? (Real)(v) : (Real)(-v) ; +} + + +/************************************************************************* + Same as getNorm but doesnt sqrt + */ +template<class Scalar> +inline Scalar normNoSqrt( const VECTOR_TYPE &v) +{ + return v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; +} + + +/************************************************************************* + Compute a normalized vector based on this vector. + \return The new normalized vector + */ +template<class Scalar> +inline VECTOR_TYPE getNormalized( const VECTOR_TYPE &v) +{ + Scalar l = v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; + if (fabs(l-1.) < VECTOR_EPSILON*VECTOR_EPSILON) + return v; /* normalized "enough"... */ + else if (l > VECTOR_EPSILON*VECTOR_EPSILON) + { + Scalar fac = 1./sqrt(l); + return VECTOR_TYPE(v[0]*fac, v[1]*fac, v[2]*fac); + } + else + return VECTOR_TYPE((Scalar)0); +} + + +/************************************************************************* + Compute the norm of the vector and normalize it. + \return The value of the norm + */ +template<class Scalar> +inline Scalar normalize( VECTOR_TYPE &v) +{ + Scalar norm; + Scalar l = v[0]*v[0] + v[1]*v[1] + v[2]*v[2]; + if (fabs(l-1.) < VECTOR_EPSILON*VECTOR_EPSILON) { + norm = 1.; + } else if (l > VECTOR_EPSILON*VECTOR_EPSILON) { + norm = sqrt(l); + Scalar fac = 1./norm; + v[0] *= fac; + v[1] *= fac; + v[2] *= fac; + } else { + v[0]= v[1]= v[2]= 0; + norm = 0.; + } + return (Scalar)norm; +} + + +/************************************************************************* + Compute a vector, that is self (as an incoming + vector) reflected at a surface with a distinct normal vector. Note + that the normal is reversed, if the scalar product with it is positive. + \param n The surface normal + \return The new reflected vector + */ +template<class Scalar> +inline VECTOR_TYPE reflectVector(const VECTOR_TYPE &t, const VECTOR_TYPE &n) +{ + VECTOR_TYPE nn= (dot(t, n) > 0.0) ? (n*-1.0) : n; + return ( t - nn * (2.0 * dot(nn, t)) ); +} + + + +/************************************************************************* + * My own refraction calculation + * Taken from Glassner's book, section 5.2 (Heckberts method) + */ +template<class Scalar> +inline VECTOR_TYPE refractVector(const VECTOR_TYPE &t, const VECTOR_TYPE &normal, Scalar nt, Scalar nair, int &refRefl) +{ + Scalar eta = nair / nt; + Scalar n = -dot(t, normal); + Scalar tt = 1.0 + eta*eta* (n*n-1.0); + if(tt<0.0) { + // we have total reflection! + refRefl = 1; + } else { + // normal reflection + tt = eta*n - sqrt(tt); + return( t*eta + normal*tt ); + } + return t; +} + + +/************************************************************************* + Test two ntlVector3Dims for equality based on the equality of their + values within a small threshold. + \param c The second vector to compare + \return TRUE if both are equal + \sa getEpsilon() + */ +template<class Scalar> +inline bool equal(const VECTOR_TYPE &v, const VECTOR_TYPE &c) +{ + return (ABS(v[0]-c[0]) + + ABS(v[1]-c[1]) + + ABS(v[2]-c[2]) < VECTOR_EPSILON); +} + + +/************************************************************************* + * Assume this vector is an RGB color, and convert it to HSV + */ +template<class Scalar> +inline void rgbToHsv( VECTOR_TYPE &V ) +{ + Scalar h=0,s=0,v=0; + Scalar maxrgb, minrgb, delta; + // convert to hsv... + maxrgb = V[0]; + int maxindex = 1; + if(V[2] > maxrgb){ maxrgb = V[2]; maxindex = 2; } + if(V[1] > maxrgb){ maxrgb = V[1]; maxindex = 3; } + minrgb = V[0]; + if(V[2] < minrgb) minrgb = V[2]; + if(V[1] < minrgb) minrgb = V[1]; + + v = maxrgb; + delta = maxrgb-minrgb; + + if(maxrgb > 0) s = delta/maxrgb; + else s = 0; + + h = 0; + if(s > 0) { + if(maxindex == 1) { + h = ((V[1]-V[2])/delta) + 0.0; } + if(maxindex == 2) { + h = ((V[2]-V[0])/delta) + 2.0; } + if(maxindex == 3) { + h = ((V[0]-V[1])/delta) + 4.0; } + h *= 60.0; + if(h < 0.0) h += 360.0; + } + + V[0] = h; + V[1] = s; + V[2] = v; +} + +/************************************************************************* + * Assume this vector is HSV and convert to RGB + */ +template<class Scalar> +inline void hsvToRgb( VECTOR_TYPE &V ) +{ + Scalar h = V[0], s = V[1], v = V[2]; + Scalar r=0,g=0,b=0; + Scalar p,q,t, fracth; + int floorh; + // ...and back to rgb + if(s == 0) { + r = g = b = v; } + else { + h /= 60.0; + floorh = (int)h; + fracth = h - floorh; + p = v * (1.0 - s); + q = v * (1.0 - (s * fracth)); + t = v * (1.0 - (s * (1.0 - fracth))); + switch (floorh) { + case 0: r = v; g = t; b = p; break; + case 1: r = q; g = v; b = p; break; + case 2: r = p; g = v; b = t; break; + case 3: r = p; g = q; b = v; break; + case 4: r = t; g = p; b = v; break; + case 5: r = v; g = p; b = q; break; + } + } + + V[0] = r; + V[1] = g; + V[2] = b; +} + +//------------------------------------------------------------------------------ +// STREAM FUNCTIONS +//------------------------------------------------------------------------------ + + + +//! global string for formatting vector output in utilities.cpp +//extern const char *globVecFormatStr; +static const char *globVecFormatStr = "[%6.4f,%6.4f,%6.4f]"; + +/************************************************************************* + Outputs the object in human readable form using the format + [x,y,z] + */ +template<class Scalar> +std::ostream& +operator<<( std::ostream& os, const BasicVector::Vector3Dim<Scalar>& i ) +{ + char buf[256]; +#if 0 +#if _WIN32 + sprintf(buf,globVecFormatStr, (double)i[0],(double)i[1],(double)i[2]); +#else + snprintf(buf,256,globVecFormatStr, (double)i[0],(double)i[1],(double)i[2]); +#endif + os << std::string(buf); +#endif + return os; +} + + +/************************************************************************* + Reads the contents of the object from a stream using the same format + as the output operator. + */ +template<class Scalar> +std::istream& +operator>>( std::istream& is, BasicVector::Vector3Dim<Scalar>& i ) +{ + char c; + char dummy[3]; + is >> c >> i[0] >> dummy >> i[1] >> dummy >> i[2] >> c; + return is; +} + + +/**************************************************************************/ +// typedefs! +/**************************************************************************/ + +/* get minimal vector length value that can be discriminated. */ +inline Real getVecEpsilon() { return (Real)VECTOR_EPSILON; } + +// a 3D integer vector +typedef Vector3Dim<int> Vec3Int; + +// a 3D vector +typedef Vector3Dim<Real> Vec3; + + +}; // namespace + + +#endif /* BASICVECTOR_H */ diff --git a/intern/smoke/intern/WAVELET_NOISE.h b/intern/smoke/intern/WAVELET_NOISE.h new file mode 100644 index 00000000000..493ed1642fc --- /dev/null +++ b/intern/smoke/intern/WAVELET_NOISE.h @@ -0,0 +1,458 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +////////////////////////////////////////////////////////////////////////////////////////// +// Wavelet noise functions +// +// This code is based on the C code provided in the appendices of: +// +// @article{1073264, +// author = {Robert L. Cook and Tony DeRose}, +// title = {Wavelet noise}, +// journal = {ACM Trans. Graph.}, +// volume = {24}, +// number = {3}, +// year = {2005}, +// issn = {0730-0301}, +// pages = {803--811}, +// doi = {http://doi.acm.org/10.1145/1073204.1073264}, +// publisher = {ACM}, +// address = {New York, NY, USA}, +// } +// +////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef WAVELET_NOISE_H +#define WAVELET_NOISE_H + +#include <MERSENNETWISTER.h> + +#define NOISE_TILE_SIZE 128 +static const int noiseTileSize = NOISE_TILE_SIZE; + +// warning - noiseTileSize has to be 128^3! +#define modFast128(x) ((x) & 127) +#define modFast64(x) ((x) & 63) +#define DOWNCOEFFS 0.000334f,-0.001528f, 0.000410f, 0.003545f,-0.000938f,-0.008233f, 0.002172f, 0.019120f, \ + -0.005040f,-0.044412f, 0.011655f, 0.103311f,-0.025936f,-0.243780f, 0.033979f, 0.655340f, \ + 0.655340f, 0.033979f,-0.243780f,-0.025936f, 0.103311f, 0.011655f,-0.044412f,-0.005040f, \ + 0.019120f, 0.002172f,-0.008233f,-0.000938f, 0.003546f, 0.000410f,-0.001528f, 0.000334f + +////////////////////////////////////////////////////////////////////////////////////////// +// Wavelet downsampling -- periodic boundary conditions +////////////////////////////////////////////////////////////////////////////////////////// +static void downsampleX(float *from, float *to, int n){ + // if these values are not local incorrect results are generated + float downCoeffs[32] = { DOWNCOEFFS }; + const float *a = &downCoeffs[16]; + for (int i = 0; i < n / 2; i++) { + to[i] = 0; + for (int k = 2 * i - 16; k <= 2 * i + 16; k++) + to[i] += a[k - 2 * i] * from[modFast128(k)]; + } +} +static void downsampleY(float *from, float *to, int n){ + // if these values are not local incorrect results are generated + float downCoeffs[32] = { DOWNCOEFFS }; + const float *a = &downCoeffs[16]; + for (int i = 0; i < n / 2; i++) { + to[i * n] = 0; + for (int k = 2 * i - 16; k <= 2 * i + 16; k++) + to[i * n] += a[k - 2 * i] * from[modFast128(k) * n]; + } +} +static void downsampleZ(float *from, float *to, int n){ + // if these values are not local incorrect results are generated + float downCoeffs[32] = { DOWNCOEFFS }; + const float *a = &downCoeffs[16]; + for (int i = 0; i < n / 2; i++) { + to[i * n * n] = 0; + for (int k = 2 * i - 16; k <= 2 * i + 16; k++) + to[i * n * n] += a[k - 2 * i] * from[modFast128(k) * n * n]; + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +// Wavelet downsampling -- Neumann boundary conditions +////////////////////////////////////////////////////////////////////////////////////////// +static void downsampleNeumann(const float *from, float *to, int n, int stride) +{ + // if these values are not local incorrect results are generated + float downCoeffs[32] = { DOWNCOEFFS }; + static const float *const aCoCenter= &downCoeffs[16]; + for (int i = 0; i < n / 2; i++) { + to[i * stride] = 0; + for (int k = 2 * i - 16; k < 2 * i + 16; k++) { + // handle boundary + float fromval; + if (k < 0) { + fromval = from[0]; + } else if(k > n - 1) { + fromval = from[(n - 1) * stride]; + } else { + fromval = from[k * stride]; + } + to[i * stride] += aCoCenter[k - 2 * i] * fromval; + } + } +} +static void downsampleXNeumann(float* to, const float* from, int sx,int sy, int sz) { + for (int iy = 0; iy < sy; iy++) + for (int iz = 0; iz < sz; iz++) { + const int i = iy * sx + iz*sx*sy; + downsampleNeumann(&from[i], &to[i], sx, 1); + } +} +static void downsampleYNeumann(float* to, const float* from, int sx,int sy, int sz) { + for (int ix = 0; ix < sx; ix++) + for (int iz = 0; iz < sz; iz++) { + const int i = ix + iz*sx*sy; + downsampleNeumann(&from[i], &to[i], sy, sx); + } +} +static void downsampleZNeumann(float* to, const float* from, int sx,int sy, int sz) { + for (int ix = 0; ix < sx; ix++) + for (int iy = 0; iy < sy; iy++) { + const int i = ix + iy*sx; + downsampleNeumann(&from[i], &to[i], sz, sx*sy); + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +// Wavelet upsampling - periodic boundary conditions +////////////////////////////////////////////////////////////////////////////////////////// +static float _upCoeffs[4] = {0.25f, 0.75f, 0.75f, 0.25f}; +static void upsampleX(float *from, float *to, int n) { + const float *p = &_upCoeffs[2]; + + for (int i = 0; i < n; i++) { + to[i] = 0; + for (int k = i / 2; k <= i / 2 + 1; k++) + to[i] += p[i - 2 * k] * from[modFast64(k)]; + } +} +static void upsampleY(float *from, float *to, int n) { + const float *p = &_upCoeffs[2]; + + for (int i = 0; i < n; i++) { + to[i * n] = 0; + for (int k = i / 2; k <= i / 2 + 1; k++) + to[i * n] += p[i - 2 * k] * from[modFast64(k) * n]; + } +} +static void upsampleZ(float *from, float *to, int n) { + const float *p = &_upCoeffs[2]; + + for (int i = 0; i < n; i++) { + to[i * n * n] = 0; + for (int k = i / 2; k <= i / 2 + 1; k++) + to[i * n * n] += p[i - 2 * k] * from[modFast64(k) * n * n]; + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +// Wavelet upsampling - Neumann boundary conditions +////////////////////////////////////////////////////////////////////////////////////////// +static void upsampleNeumann(const float *from, float *to, int n, int stride) { + static const float *const pCoCenter = &_upCoeffs[2]; + for (int i = 0; i < n; i++) { + to[i * stride] = 0; + for (int k = i / 2; k <= i / 2 + 1; k++) { + float fromval; + if(k>n/2) { + fromval = from[(n/2) * stride]; + } else { + fromval = from[k * stride]; + } + to[i * stride] += pCoCenter[i - 2 * k] * fromval; + } + } +} +static void upsampleXNeumann(float* to, const float* from, int sx, int sy, int sz) { + for (int iy = 0; iy < sy; iy++) + for (int iz = 0; iz < sz; iz++) { + const int i = iy * sx + iz*sx*sy; + upsampleNeumann(&from[i], &to[i], sx, 1); + } +} +static void upsampleYNeumann(float* to, const float* from, int sx, int sy, int sz) { + for (int ix = 0; ix < sx; ix++) + for (int iz = 0; iz < sz; iz++) { + const int i = ix + iz*sx*sy; + upsampleNeumann(&from[i], &to[i], sy, sx); + } +} +static void upsampleZNeumann(float* to, const float* from, int sx, int sy, int sz) { + for (int ix = 0; ix < sx; ix++) + for (int iy = 0; iy < sy; iy++) { + const int i = ix + iy*sx; + upsampleNeumann(&from[i], &to[i], sz, sx*sy); + } +} + + +////////////////////////////////////////////////////////////////////////////////////////// +// load in an existing noise tile +////////////////////////////////////////////////////////////////////////////////////////// +static bool loadTile(float* const noiseTileData, std::string filename) +{ + FILE* file; + file = fopen(filename.c_str(), "rb"); + + if (file == NULL) { + printf("loadTile: No noise tile '%s' found.\n", filename.c_str()); + return false; + } + + // dimensions + int gridSize = noiseTileSize * noiseTileSize * noiseTileSize; + + // noiseTileData memory is managed by caller + size_t bread = fread((void*)noiseTileData, sizeof(float), gridSize, file); + fclose(file); + printf("Noise tile file '%s' loaded.\n", filename.c_str()); + + if (bread != gridSize) { + printf("loadTile: Noise tile '%s' is wrong size %d.\n", filename.c_str(), bread); + return false; + } + return true; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// write out an existing noise tile +////////////////////////////////////////////////////////////////////////////////////////// +static void saveTile(float* const noiseTileData, std::string filename) +{ + FILE* file; + file = fopen(filename.c_str(), "wb"); + + if (file == NULL) { + printf("saveTile: Noise tile '%s' could not be saved.\n", filename.c_str()); + return; + } + + fwrite((void*)noiseTileData, sizeof(float), noiseTileSize * noiseTileSize * noiseTileSize, file); + fclose(file); + + printf("saveTile: Noise tile file '%s' saved.\n", filename.c_str()); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// create a new noise tile if necessary +////////////////////////////////////////////////////////////////////////////////////////// +static void generateTile_WAVELET(float* const noiseTileData, std::string filename) { + // if a tile already exists, just use that + if (loadTile(noiseTileData, filename)) return; + + const int n = noiseTileSize; + const int n3 = n*n*n; + std::cout <<"Generating new 3d noise tile size="<<n<<"^3 \n"; + MTRand twister; + + float *temp13 = new float[n3]; + float *temp23 = new float[n3]; + float *noise3 = new float[n3]; + + // initialize + for (int i = 0; i < n3; i++) { + temp13[i] = temp23[i] = noise3[i] = 0.; + } + + // Step 1. Fill the tile with random numbers in the range -1 to 1. + for (int i = 0; i < n3; i++) + noise3[i] = twister.randNorm(); + + // Steps 2 and 3. Downsample and upsample the tile + for (int iy = 0; iy < n; iy++) + for (int iz = 0; iz < n; iz++) { + const int i = iy * n + iz*n*n; + downsampleX(&noise3[i], &temp13[i], n); + upsampleX (&temp13[i], &temp23[i], n); + } + for (int ix = 0; ix < n; ix++) + for (int iz = 0; iz < n; iz++) { + const int i = ix + iz*n*n; + downsampleY(&temp23[i], &temp13[i], n); + upsampleY (&temp13[i], &temp23[i], n); + } + for (int ix = 0; ix < n; ix++) + for (int iy = 0; iy < n; iy++) { + const int i = ix + iy*n; + downsampleZ(&temp23[i], &temp13[i], n); + upsampleZ (&temp13[i], &temp23[i], n); + } + + // Step 4. Subtract out the coarse-scale contribution + for (int i = 0; i < n3; i++) + noise3[i] -= temp23[i]; + + // Avoid even/odd variance difference by adding odd-offset version of noise to itself. + int offset = n / 2; + if (offset % 2 == 0) offset++; + + int icnt=0; + for (int ix = 0; ix < n; ix++) + for (int iy = 0; iy < n; iy++) + for (int iz = 0; iz < n; iz++) { + temp13[icnt] = noise3[modFast128(ix+offset) + modFast128(iy+offset)*n + modFast128(iz+offset)*n*n]; + icnt++; + } + + for (int i = 0; i < n3; i++) + noise3[i] += temp13[i]; + + for (int i = 0; i < n3; i++) + noiseTileData[i] = noise3[i]; + + saveTile(noise3, filename); + delete[] temp13; + delete[] temp23; + delete[] noise3; + std::cout <<"Generating new 3d noise done\n"; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// x derivative of noise +////////////////////////////////////////////////////////////////////////////////////////// +static inline float WNoiseDx(Vec3 p, float* data) { + int c[3], mid[3], n = noiseTileSize; + float w[3][3], t, result = 0; + + mid[0] = (int)ceil(p[0] - 0.5); + t = mid[0] - (p[0] - 0.5); + w[0][0] = -t; + w[0][2] = (1.f - t); + w[0][1] = 2.0f * t - 1.0f; + + mid[1] = (int)ceil(p[1] - 0.5); + t = mid[1] - (p[1] - 0.5); + w[1][0] = t * t / 2; + w[1][2] = (1 - t) * (1 - t) / 2; + w[1][1] = 1 - w[1][0] - w[1][2]; + + mid[2] = (int)ceil(p[2] - 0.5); + t = mid[2] - (p[2] - 0.5); + w[2][0] = t * t / 2; + w[2][2] = (1 - t) * (1 - t)/2; + w[2][1] = 1 - w[2][0] - w[2][2]; + + // to optimize, explicitly unroll this loop + for (int z = -1; z <=1; z++) + for (int y = -1; y <=1; y++) + for (int x = -1; x <=1; x++) + { + float weight = 1.0f; + c[0] = modFast128(mid[0] + x); + weight *= w[0][x+1]; + c[1] = modFast128(mid[1] + y); + weight *= w[1][y+1]; + c[2] = modFast128(mid[2] + z); + weight *= w[2][z+1]; + result += weight * data[c[2]*n*n+c[1]*n+c[0]]; + } + return result; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// y derivative of noise +////////////////////////////////////////////////////////////////////////////////////////// +static inline float WNoiseDy(Vec3 p, float* data) { + int c[3], mid[3], n=noiseTileSize; + float w[3][3], t, result =0; + + mid[0] = (int)ceil(p[0] - 0.5); + t = mid[0]-(p[0] - 0.5); + w[0][0] = t * t / 2; + w[0][2] = (1 - t) * (1 - t) / 2; + w[0][1] = 1 - w[0][0] - w[0][2]; + + mid[1] = (int)ceil(p[1] - 0.5); + t = mid[1]-(p[1] - 0.5); + w[1][0] = -t; + w[1][2] = (1.f - t); + w[1][1] = 2.0f * t - 1.0f; + + mid[2] = (int)ceil(p[2] - 0.5); + t = mid[2] - (p[2] - 0.5); + w[2][0] = t * t / 2; + w[2][2] = (1 - t) * (1 - t)/2; + w[2][1] = 1 - w[2][0] - w[2][2]; + + // to optimize, explicitly unroll this loop + for (int z = -1; z <=1; z++) + for (int y = -1; y <=1; y++) + for (int x = -1; x <=1; x++) + { + float weight = 1.0f; + c[0] = modFast128(mid[0] + x); + weight *= w[0][x+1]; + c[1] = modFast128(mid[1] + y); + weight *= w[1][y+1]; + c[2] = modFast128(mid[2] + z); + weight *= w[2][z+1]; + result += weight * data[c[2]*n*n+c[1]*n+c[0]]; + } + + return result; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// z derivative of noise +////////////////////////////////////////////////////////////////////////////////////////// +static inline float WNoiseDz(Vec3 p, float* data) { + int c[3], mid[3], n=noiseTileSize; + float w[3][3], t, result =0; + + mid[0] = (int)ceil(p[0] - 0.5); + t = mid[0]-(p[0] - 0.5); + w[0][0] = t * t / 2; + w[0][2] = (1 - t) * (1 - t) / 2; + w[0][1] = 1 - w[0][0] - w[0][2]; + + mid[1] = (int)ceil(p[1] - 0.5); + t = mid[1]-(p[1] - 0.5); + w[1][0] = t * t / 2; + w[1][2] = (1 - t) * (1 - t) / 2; + w[1][1] = 1 - w[1][0] - w[1][2]; + + mid[2] = (int)ceil(p[2] - 0.5); + t = mid[2] - (p[2] - 0.5); + w[2][0] = -t; + w[2][2] = (1.f - t); + w[2][1] = 2.0f * t - 1.0f; + + // to optimize, explicitly unroll this loop + for (int z = -1; z <=1; z++) + for (int y = -1; y <=1; y++) + for (int x = -1; x <=1; x++) + { + float weight = 1.0f; + c[0] = modFast128(mid[0] + x); + weight *= w[0][x+1]; + c[1] = modFast128(mid[1] + y); + weight *= w[1][y+1]; + c[2] = modFast128(mid[2] + z); + weight *= w[2][z+1]; + result += weight * data[c[2]*n*n+c[1]*n+c[0]]; + } + return result; +} + +#endif + diff --git a/intern/smoke/intern/WTURBULENCE.cpp b/intern/smoke/intern/WTURBULENCE.cpp new file mode 100644 index 00000000000..022c8f28252 --- /dev/null +++ b/intern/smoke/intern/WTURBULENCE.cpp @@ -0,0 +1,965 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +// WTURBULENCE handling +/////////////////////////////////////////////////////////////////////////////////// + +#include "WTURBULENCE.h" +#include "INTERPOLATE.h" +#include "IMAGE.h" +#include <MERSENNETWISTER.h> +#include "WAVELET_NOISE.h" +#include "FFT_NOISE.h" +#include "EIGENVALUE_HELPER.h" +#include "LU_HELPER.h" +#include "SPHERE.h" +#include <zlib.h> + +// needed to access static advection functions +#include "FLUID_3D.h" + +#if PARALLEL==1 +#include <omp.h> +#endif // PARALLEL + +// 2^ {-5/6} +static const float persistence = 0.56123f; + +////////////////////////////////////////////////////////////////////// +// constructor +////////////////////////////////////////////////////////////////////// +WTURBULENCE::WTURBULENCE(int xResSm, int yResSm, int zResSm, int amplify) +{ + // if noise magnitude is below this threshold, its contribution + // is negilgible, so stop evaluating new octaves + _cullingThreshold = 1e-3; + + // factor by which to increase the simulation resolution + _amplify = amplify; + + // manually adjust the overall amount of turbulence + _strength = 2.; + + // add the corresponding octaves of noise + _octaves = (int)log((float)_amplify) / log(2.0f); // XXX DEBUG/ TODO: int casting correct? - dg + + // noise resolution + _xResBig = _amplify * xResSm; + _yResBig = _amplify * yResSm; + _zResBig = _amplify * zResSm; + _resBig = Vec3Int(_xResBig, _yResBig, _zResBig); + _invResBig = Vec3(1./(float)_resBig[0], 1./(float)_resBig[1], 1./(float)_resBig[2]); + _slabSizeBig = _xResBig*_yResBig; + _totalCellsBig = _slabSizeBig * _zResBig; + + // original / small resolution + _xResSm = xResSm; + _yResSm = yResSm; + _zResSm = zResSm; + _resSm = Vec3Int(xResSm, yResSm, zResSm); + _invResSm = Vec3(1./(float)_resSm[0], 1./(float)_resSm[1], 1./(float)_resSm[2] ); + _slabSizeSm = _xResSm*_yResSm; + _totalCellsSm = _slabSizeSm * _zResSm; + + // allocate high resolution density field + _totalStepsBig = 0; + _densityBig = new float[_totalCellsBig]; + _densityBigOld = new float[_totalCellsBig]; + + // allocate high resolution velocity field. Note that this is only + // necessary because we use MacCormack advection. For semi-Lagrangian + // advection, these arrays are not necessary. + _tempBig1 = _tempBig2 = + _bigUx = _bigUy = _bigUz = NULL; + _tempBig1 = new float[_totalCellsBig]; + _tempBig2 = new float[_totalCellsBig]; + _bigUx = new float[_totalCellsBig]; + _bigUy = new float[_totalCellsBig]; + _bigUz = new float[_totalCellsBig]; + + for(int i = 0; i < _totalCellsBig; i++) { + _densityBig[i] = + _densityBigOld[i] = + _bigUx[i] = + _bigUy[i] = + _bigUz[i] = + _tempBig1[i] = + _tempBig2[i] = 0.; + } + + // allocate & init texture coordinates + _tcU = new float[_totalCellsSm]; + _tcV = new float[_totalCellsSm]; + _tcW = new float[_totalCellsSm]; + _tcTemp = new float[_totalCellsSm]; + + // allocate & init energy terms + _energy = new float[_totalCellsSm]; + _highFreqEnergy = new float[_totalCellsSm]; + + // map all + const float dx = 1./(float)(_resSm[0]); + const float dy = 1./(float)(_resSm[1]); + const float dz = 1./(float)(_resSm[2]); + int index = 0; + for (int z = 0; z < _zResSm; z++) + for (int y = 0; y < _yResSm; y++) + for (int x = 0; x < _xResSm; x++, index++) + { + _tcU[index] = x*dx; + _tcV[index] = y*dy; + _tcW[index] = z*dz; + _tcTemp[index] = 0.; + _energy[index] = 0.; + } + + // allocate eigenvalue arrays + _eigMin = new float[_totalCellsSm]; + _eigMax = new float[_totalCellsSm]; + for(int i=0; i < _totalCellsSm; i++) + _eigMin[i] = _eigMax[i] = 0.; + + // noise tiles + _noiseTile = new float[noiseTileSize * noiseTileSize * noiseTileSize]; + std::string noiseTileFilename = std::string("noise.wavelets"); + generateTile_WAVELET(_noiseTile, noiseTileFilename); + /* + std::string noiseTileFilename = std::string("noise.fft"); + generatTile_FFT(_noiseTile, noiseTileFilename); + */ +} + +////////////////////////////////////////////////////////////////////// +// destructor +////////////////////////////////////////////////////////////////////// +WTURBULENCE::~WTURBULENCE() { + delete[] _densityBig; + delete[] _densityBigOld; + + delete[] _bigUx; + delete[] _bigUy; + delete[] _bigUz; + delete[] _tempBig1; + delete[] _tempBig2; + + delete[] _tcU; + delete[] _tcV; + delete[] _tcW; + delete[] _tcTemp; + + delete[] _eigMin; + delete[] _eigMax; + delete[] _noiseTile; + + delete[] _energy; + delete[] _highFreqEnergy; +} + +////////////////////////////////////////////////////////////////////// +// Change noise type +// +// type (1<<1) = wavelet / 2 +// type (1<<2) = FFT / 4 +// type (1<<3) = curl / 8 +////////////////////////////////////////////////////////////////////// +void WTURBULENCE::setNoise(int type) +{ + if(type == 4) // FFT + { + // needs fft + // std::string noiseTileFilename = std::string("noise.fft"); + // generatTile_FFT(_noiseTile, noiseTileFilename); + } + else if(type == 8) // curl + { + // TODO: not supported yet + } + else // standard - wavelet + { + std::string noiseTileFilename = std::string("noise.wavelets"); + generateTile_WAVELET(_noiseTile, noiseTileFilename); + } +} + +////////////////////////////////////////////////////////////////////// +// Get the smallest valid x derivative +// +// Takes the one-sided finite difference in both directions and +// selects the smaller of the two +////////////////////////////////////////////////////////////////////// +static float minDx(int x, int y, int z, float* input, Vec3Int res) +{ + const int index = x + y * res[0] + z * res[0] * res[1]; + const int maxx = res[0]-2; + + // get grid values + float center = input[index]; + float left = (x <= 1) ? FLT_MAX : input[index - 1]; + float right = (x >= maxx) ? FLT_MAX : input[index + 1]; + + const float dx = res[0]; + + // get all the derivative estimates + float dLeft = (x <= 1) ? FLT_MAX : (center - left) * dx; + float dRight = (x >= maxx) ? FLT_MAX : (right - center) * dx; + float dCenter = (x <= 1 || x >= maxx) ? FLT_MAX : (right - left) * dx * 0.5f; + + // if it's on a boundary, only one estimate is valid + if (x <= 1) return dRight; + if (x >= maxx) return dLeft; + + // if it's not on a boundary, get the smallest one + float finalD; + finalD = (fabs(dCenter) < fabs(dRight)) ? dCenter : dRight; + finalD = (fabs(finalD) < fabs(dLeft)) ? finalD : dLeft; + + return finalD; +} + +////////////////////////////////////////////////////////////////////// +// get the smallest valid y derivative +// +// Takes the one-sided finite difference in both directions and +// selects the smaller of the two +////////////////////////////////////////////////////////////////////// +static float minDy(int x, int y, int z, float* input, Vec3Int res) +{ + const int index = x + y * res[0] + z * res[0] * res[1]; + const int maxy = res[1]-2; + + // get grid values + float center = input[index]; + float down = (y <= 1) ? FLT_MAX : input[index - res[0]]; + float up = (y >= maxy) ? FLT_MAX : input[index + res[0]]; + + const float dx = res[1]; // only for square domains + + // get all the derivative estimates + float dDown = (y <= 1) ? FLT_MAX : (center - down) * dx; + float dUp = (y >= maxy) ? FLT_MAX : (up - center) * dx; + float dCenter = (y <= 1 || y >= maxy) ? FLT_MAX : (up - down) * dx * 0.5f; + + // if it's on a boundary, only one estimate is valid + if (y <= 1) return dUp; + if (y >= maxy) return dDown; + + // if it's not on a boundary, get the smallest one + float finalD = (fabs(dCenter) < fabs(dUp)) ? dCenter : dUp; + finalD = (fabs(finalD) < fabs(dDown)) ? finalD : dDown; + + return finalD; +} + +////////////////////////////////////////////////////////////////////// +// get the smallest valid z derivative +// +// Takes the one-sided finite difference in both directions and +// selects the smaller of the two +////////////////////////////////////////////////////////////////////// +static float minDz(int x, int y, int z, float* input, Vec3Int res) +{ + const int slab = res[0]*res[1]; + const int index = x + y * res[0] + z * slab; + const int maxz = res[2]-2; + + // get grid values + float center = input[index]; + float front = (z <= 1) ? FLT_MAX : input[index - slab]; + float back = (z >= maxz) ? FLT_MAX : input[index + slab]; + + const float dx = res[2]; // only for square domains + + // get all the derivative estimates + float dfront = (z <= 1) ? FLT_MAX : (center - front) * dx; + float dback = (z >= maxz) ? FLT_MAX : (back - center) * dx; + float dCenter = (z <= 1 || z >= maxz) ? FLT_MAX : (back - front) * dx * 0.5f; + + // if it's on a boundary, only one estimate is valid + if (z <= 1) return dback; + if (z >= maxz) return dfront; + + // if it's not on a boundary, get the smallest one + float finalD = (fabs(dCenter) < fabs(dback)) ? dCenter : dback; + finalD = (fabs(finalD) < fabs(dfront)) ? finalD : dfront; + + return finalD; +} + +////////////////////////////////////////////////////////////////////// +// handle texture coordinates (advection, reset, eigenvalues), +// Beware -- uses big density maccormack as temporary arrays +////////////////////////////////////////////////////////////////////// +void WTURBULENCE::advectTextureCoordinates (float dtOrg, float* xvel, float* yvel, float* zvel) { + // advection + SWAP_POINTERS(_tcTemp, _tcU); + FLUID_3D::copyBorderX(_tcTemp, _resSm); + FLUID_3D::copyBorderY(_tcTemp, _resSm); + FLUID_3D::copyBorderZ(_tcTemp, _resSm); + FLUID_3D::advectFieldMacCormack(dtOrg, xvel, yvel, zvel, + _tcTemp, _tcU, _tempBig1, _tempBig2, _resSm, NULL); + + SWAP_POINTERS(_tcTemp, _tcV); + FLUID_3D::copyBorderX(_tcTemp, _resSm); + FLUID_3D::copyBorderY(_tcTemp, _resSm); + FLUID_3D::copyBorderZ(_tcTemp, _resSm); + FLUID_3D::advectFieldMacCormack(dtOrg, xvel, yvel, zvel, + _tcTemp, _tcV, _tempBig1, _tempBig2, _resSm, NULL); + + SWAP_POINTERS(_tcTemp, _tcW); + FLUID_3D::copyBorderX(_tcTemp, _resSm); + FLUID_3D::copyBorderY(_tcTemp, _resSm); + FLUID_3D::copyBorderZ(_tcTemp, _resSm); + FLUID_3D::advectFieldMacCormack(dtOrg, xvel, yvel, zvel, + _tcTemp, _tcW, _tempBig1, _tempBig2, _resSm, NULL); +} + +////////////////////////////////////////////////////////////////////// +// Compute the eigenvalues of the advected texture +////////////////////////////////////////////////////////////////////// +void WTURBULENCE::computeEigenvalues() { + // stats + float maxeig = -1.; + float mineig = 10.; + + // texture coordinate eigenvalues + for (int z = 1; z < _zResSm-1; z++) { + for (int y = 1; y < _yResSm-1; y++) + for (int x = 1; x < _xResSm-1; x++) + { + const int index = x+ y *_resSm[0] + z*_slabSizeSm; + + // compute jacobian + float jacobian[3][3] = { + { minDx(x, y, z, _tcU, _resSm), minDx(x, y, z, _tcV, _resSm), minDx(x, y, z, _tcW, _resSm) } , + { minDy(x, y, z, _tcU, _resSm), minDy(x, y, z, _tcV, _resSm), minDy(x, y, z, _tcW, _resSm) } , + { minDz(x, y, z, _tcU, _resSm), minDz(x, y, z, _tcV, _resSm), minDz(x, y, z, _tcW, _resSm) } + }; + + // ONLY compute the eigenvalues after checking that the matrix + // is nonsingular + JAMA::LU<float> LU = computeLU3x3(jacobian); + + if (LU.isNonsingular()) + { + // get the analytic eigenvalues, quite slow right now... + Vec3 eigenvalues = Vec3(1.); + computeEigenvalues3x3( &eigenvalues[0], jacobian); + _eigMax[index] = MAX3V(eigenvalues); + _eigMin[index] = MIN3V(eigenvalues); + maxeig = MAX(_eigMax[index],maxeig); + mineig = MIN(_eigMin[index],mineig); + } + else + { + _eigMax[index] = 10.0f; + _eigMin[index] = 0.1; + } + } + } +} + +////////////////////////////////////////////////////////////////////// +// advect & reset texture coordinates based on eigenvalues +////////////////////////////////////////////////////////////////////// +void WTURBULENCE::resetTextureCoordinates() +{ + // allowed deformation of the textures + const float limit = 2.f; + const float limitInv = 1./limit; + + // standard reset + int resets = 0; + const float dx = 1./(float)(_resSm[0]); + const float dy = 1./(float)(_resSm[1]); + const float dz = 1./(float)(_resSm[2]); + + for (int z = 1; z < _zResSm-1; z++) + for (int y = 1; y < _yResSm-1; y++) + for (int x = 1; x < _xResSm-1; x++) + { + const int index = x+ y *_resSm[0] + z*_slabSizeSm; + if (_eigMax[index] > limit || _eigMin[index] < limitInv) + { + _tcU[index] = (float)x * dx; + _tcV[index] = (float)y * dy; + _tcW[index] = (float)z * dz; + resets++; + } + } +} + +////////////////////////////////////////////////////////////////////// +// Compute the highest frequency component of the wavelet +// decomposition +////////////////////////////////////////////////////////////////////// +void WTURBULENCE::decomposeEnergy() +{ + // do the decomposition -- the goal here is to have + // the energy with the high frequency component stomped out + // stored in _tcTemp when it is done. _highFreqEnergy is only used + // as an additional temp array + + // downsample input + downsampleXNeumann(_highFreqEnergy, _energy, _xResSm, _yResSm, _zResSm); + downsampleYNeumann(_tcTemp, _highFreqEnergy, _xResSm, _yResSm, _zResSm); + downsampleZNeumann(_highFreqEnergy, _tcTemp, _xResSm, _yResSm, _zResSm); + + // upsample input + upsampleZNeumann(_tcTemp, _highFreqEnergy, _xResSm, _yResSm, _zResSm); + upsampleYNeumann(_highFreqEnergy, _tcTemp, _xResSm, _yResSm, _zResSm); + upsampleXNeumann(_tcTemp, _highFreqEnergy, _xResSm, _yResSm, _zResSm); + + // subtract the down and upsampled field from the original field -- + // what should be left over is solely the high frequency component + int index = 0; + for (int z = 0; z < _zResSm; z++) + for (int y = 0; y < _yResSm; y++) { + for (int x = 0; x < _xResSm; x++, index++) { + // brute force reset of boundaries + if(z >= _zResSm - 1 || x >= _xResSm - 1 || y >= _yResSm - 1 || z <= 0 || y <= 0 || x <= 0) + _highFreqEnergy[index] = 0.; + else + _highFreqEnergy[index] = _energy[index] - _tcTemp[index]; + } + } +} + +////////////////////////////////////////////////////////////////////// +// compute velocity from energies and march into obstacles +// for wavelet decomposition +////////////////////////////////////////////////////////////////////// +void WTURBULENCE::computeEnergy(float* xvel, float* yvel, float* zvel, unsigned char *obstacles) +{ + // compute everywhere + for (int x = 0; x < _totalCellsSm; x++) + _energy[x] = 0.5f * (xvel[x] * xvel[x] + yvel[x] * yvel[x] + zvel[x] * zvel[x]); + + FLUID_3D::copyBorderX(_energy, _resSm); + FLUID_3D::copyBorderY(_energy, _resSm); + FLUID_3D::copyBorderZ(_energy, _resSm); + + // pseudo-march the values into the obstacles + // the wavelet upsampler only uses a 3x3 support neighborhood, so + // propagating the values in by 4 should be sufficient + int index; + + // iterate + for (int iter = 0; iter < 4; iter++) + { + index = _slabSizeSm + _xResSm + 1; + for (int z = 1; z < _zResSm - 1; z++, index += 2 * _xResSm) + for (int y = 1; y < _yResSm - 1; y++, index += 2) + for (int x = 1; x < _xResSm - 1; x++, index++) + if (obstacles[index] && obstacles[index] != RETIRED) + { + float sum = 0.0f; + int valid = 0; + + if (!obstacles[index + 1] || obstacles[index + 1] == RETIRED) + { + sum += _energy[index + 1]; + valid++; + } + if (!obstacles[index - 1] || obstacles[index - 1] == RETIRED) + { + sum += _energy[index - 1]; + valid++; + } + if (!obstacles[index + _xResSm] || obstacles[index + _xResSm] == RETIRED) + { + sum += _energy[index + _xResSm]; + valid++; + } + if (!obstacles[index - _xResSm] || obstacles[index - _xResSm] == RETIRED) + { + sum += _energy[index - _xResSm]; + valid++; + } + if (!obstacles[index + _slabSizeSm] || obstacles[index + _slabSizeSm] == RETIRED) + { + sum += _energy[index + _slabSizeSm]; + valid++; + } + if (!obstacles[index - _slabSizeSm] || obstacles[index - _slabSizeSm] == RETIRED) + { + sum += _energy[index - _slabSizeSm]; + valid++; + } + if (valid > 0) + { + _energy[index] = sum / valid; + obstacles[index] = MARCHED; + } + } + index = _slabSizeSm + _xResSm + 1; + for (int z = 1; z < _zResSm - 1; z++, index += 2 * _xResSm) + for (int y = 1; y < _yResSm - 1; y++, index += 2) + for (int x = 1; x < _xResSm - 1; x++, index++) + if (obstacles[index] == MARCHED) + obstacles[index] = RETIRED; + } + index = _slabSizeSm + _xResSm + 1; + for (int z = 1; z < _zResSm - 1; z++, index += 2 * _xResSm) + for (int y = 1; y < _yResSm - 1; y++, index += 2) + for (int x = 1; x < _xResSm - 1; x++, index++) + if (obstacles[index]) + obstacles[index] = 1; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// Evaluate derivatives +////////////////////////////////////////////////////////////////////////////////////////// +Vec3 WTURBULENCE::WVelocity(Vec3 orgPos) +{ + // arbitrarily offset evaluation points + const Vec3 p1 = orgPos + Vec3(NOISE_TILE_SIZE/2,0,0); + const Vec3 p2 = orgPos + Vec3(0,NOISE_TILE_SIZE/2,0); + const Vec3 p3 = orgPos + Vec3(0,0,NOISE_TILE_SIZE/2); + + const float f1y = WNoiseDy(p1, _noiseTile); + const float f1z = WNoiseDz(p1, _noiseTile); + + const float f2x = WNoiseDx(p2, _noiseTile); + const float f2z = WNoiseDz(p2, _noiseTile); + + const float f3x = WNoiseDx(p3, _noiseTile); + const float f3y = WNoiseDy(p3, _noiseTile); + + Vec3 ret = Vec3( + f3y - f2z, + f1z - f3x, + f2x - f1y ); + return ret; +} + +////////////////////////////////////////////////////////////////////////////////////////// +// Evaluate derivatives with Jacobian +////////////////////////////////////////////////////////////////////////////////////////// +Vec3 WTURBULENCE::WVelocityWithJacobian(Vec3 orgPos, float* xUnwarped, float* yUnwarped, float* zUnwarped) +{ + // arbitrarily offset evaluation points + const Vec3 p1 = orgPos + Vec3(NOISE_TILE_SIZE/2,0,0); + const Vec3 p2 = orgPos + Vec3(0,NOISE_TILE_SIZE/2,0); + const Vec3 p3 = orgPos + Vec3(0,0,NOISE_TILE_SIZE/2); + + Vec3 final; + final[0] = WNoiseDx(p1, _noiseTile); + final[1] = WNoiseDy(p1, _noiseTile); + final[2] = WNoiseDz(p1, _noiseTile); + // UNUSED const float f1x = xUnwarped[0] * final[0] + xUnwarped[1] * final[1] + xUnwarped[2] * final[2]; + const float f1y = yUnwarped[0] * final[0] + yUnwarped[1] * final[1] + yUnwarped[2] * final[2]; + const float f1z = zUnwarped[0] * final[0] + zUnwarped[1] * final[1] + zUnwarped[2] * final[2]; + + final[0] = WNoiseDx(p2, _noiseTile); + final[1] = WNoiseDy(p2, _noiseTile); + final[2] = WNoiseDz(p2, _noiseTile); + const float f2x = xUnwarped[0] * final[0] + xUnwarped[1] * final[1] + xUnwarped[2] * final[2]; + // UNUSED const float f2y = yUnwarped[0] * final[0] + yUnwarped[1] * final[1] + yUnwarped[2] * final[2]; + const float f2z = zUnwarped[0] * final[0] + zUnwarped[1] * final[1] + zUnwarped[2] * final[2]; + + final[0] = WNoiseDx(p3, _noiseTile); + final[1] = WNoiseDy(p3, _noiseTile); + final[2] = WNoiseDz(p3, _noiseTile); + const float f3x = xUnwarped[0] * final[0] + xUnwarped[1] * final[1] + xUnwarped[2] * final[2]; + const float f3y = yUnwarped[0] * final[0] + yUnwarped[1] * final[1] + yUnwarped[2] * final[2]; + // UNUSED const float f3z = zUnwarped[0] * final[0] + zUnwarped[1] * final[1] + zUnwarped[2] * final[2]; + + Vec3 ret = Vec3( + f3y - f2z, + f1z - f3x, + f2x - f1y ); + return ret; +} + +////////////////////////////////////////////////////////////////////// +// perform an actual noise advection step +////////////////////////////////////////////////////////////////////// +void WTURBULENCE::stepTurbulenceReadable(float dtOrg, float* xvel, float* yvel, float* zvel, unsigned char *obstacles) +{ + // enlarge timestep to match grid + const float dt = dtOrg * _amplify; + const float invAmp = 1.0f / _amplify; + + // prepare textures + advectTextureCoordinates(dtOrg, xvel,yvel,zvel); + + // compute eigenvalues of the texture coordinates + computeEigenvalues(); + + // do wavelet decomposition of energy + computeEnergy(xvel, yvel, zvel, obstacles); + decomposeEnergy(); + + // zero out coefficients inside of the obstacle + for (int x = 0; x < _totalCellsSm; x++) + if (obstacles[x]) _energy[x] = 0.f; + + float maxVelocity = 0.; + for (int z = 1; z < _zResBig - 1; z++) + for (int y = 1; y < _yResBig - 1; y++) + for (int x = 1; x < _xResBig - 1; x++) + { + // get unit position for both fine and coarse grid + const Vec3 pos = Vec3(x,y,z); + const Vec3 posSm = pos * invAmp; + + // get grid index for both fine and coarse grid + const int index = x + y *_xResBig + z *_slabSizeBig; + const int indexSmall = (int)posSm[0] + (int)posSm[1] * _xResSm + (int)posSm[2] * _slabSizeSm; + + // get a linearly interpolated velocity and texcoords + // from the coarse grid + Vec3 vel = INTERPOLATE::lerp3dVec( xvel,yvel,zvel, + posSm[0], posSm[1], posSm[2], _xResSm,_yResSm,_zResSm); + Vec3 uvw = INTERPOLATE::lerp3dVec( _tcU,_tcV,_tcW, + posSm[0], posSm[1], posSm[2], _xResSm,_yResSm,_zResSm); + + // multiply the texture coordinate by _resSm so that turbulence + // synthesis begins at the first octave that the coarse grid + // cannot capture + Vec3 texCoord = Vec3(uvw[0] * _resSm[0], + uvw[1] * _resSm[1], + uvw[2] * _resSm[2]); + + // retrieve wavelet energy at highest frequency + float energy = INTERPOLATE::lerp3d( + _highFreqEnergy, posSm[0],posSm[1],posSm[2], _xResSm, _yResSm, _zResSm); + + // base amplitude for octave 0 + float coefficient = sqrtf(2.0f * fabs(energy)); + const float amplitude = _strength * fabs(0.5 * coefficient) * persistence; + + // add noise to velocity, but only if the turbulence is + // sufficiently undeformed, and the energy is large enough + // to make a difference + const bool addNoise = _eigMax[indexSmall] < 2. && + _eigMin[indexSmall] > 0.5; + if (addNoise && amplitude > _cullingThreshold) { + // base amplitude for octave 0 + float amplitudeScaled = amplitude; + + for (int octave = 0; octave < _octaves; octave++) + { + // multiply the vector noise times the maximum allowed + // noise amplitude at this octave, and add it to the total + vel += WVelocity(texCoord) * amplitudeScaled; + + // scale coefficient for next octave + amplitudeScaled *= persistence; + texCoord *= 2.0f; + } + } + + // Store velocity + turbulence in big grid for maccormack step + // + // If you wanted to save memory, you would instead perform a + // semi-Lagrangian backtrace for the current grid cell here. Then + // you could just throw the velocity away. + _bigUx[index] = vel[0]; + _bigUy[index] = vel[1]; + _bigUz[index] = vel[2]; + + // compute the velocity magnitude for substepping later + const float velMag = _bigUx[index] * _bigUx[index] + + _bigUy[index] * _bigUy[index] + + _bigUz[index] * _bigUz[index]; + if (velMag > maxVelocity) maxVelocity = velMag; + + // zero out velocity inside obstacles + float obsCheck = INTERPOLATE::lerp3dToFloat( + obstacles, posSm[0], posSm[1], posSm[2], _xResSm, _yResSm, _zResSm); + if (obsCheck > 0.95) + _bigUx[index] = _bigUy[index] = _bigUz[index] = 0.; + } + + // prepare density for an advection + SWAP_POINTERS(_densityBig, _densityBigOld); + + // based on the maximum velocity present, see if we need to substep, + // but cap the maximum number of substeps to 5 + const int maxSubSteps = 25; + const int maxVel = 5; + maxVelocity = sqrt(maxVelocity) * dt; + int totalSubsteps = (int)(maxVelocity / (float)maxVel); + totalSubsteps = (totalSubsteps < 1) ? 1 : totalSubsteps; + totalSubsteps = (totalSubsteps > maxSubSteps) ? maxSubSteps : totalSubsteps; + const float dtSubdiv = dt / (float)totalSubsteps; + + // set boundaries of big velocity grid + FLUID_3D::setZeroX(_bigUx, _resBig); + FLUID_3D::setZeroY(_bigUy, _resBig); + FLUID_3D::setZeroZ(_bigUz, _resBig); + + // do the MacCormack advection, with substepping if necessary + for(int substep = 0; substep < totalSubsteps; substep++) + { + FLUID_3D::advectFieldMacCormack(dtSubdiv, _bigUx, _bigUy, _bigUz, + _densityBigOld, _densityBig, _tempBig1, _tempBig2, _resBig, NULL); + + if (substep < totalSubsteps - 1) + SWAP_POINTERS(_densityBig, _densityBigOld); + } // substep + + // wipe the density borders + FLUID_3D::setZeroBorder(_densityBig, _resBig); + + // reset texture coordinates now in preparation for next timestep + // Shouldn't do this before generating the noise because then the + // eigenvalues stored do not reflect the underlying texture coordinates + resetTextureCoordinates(); + + // output files + /* + string prefix = string("./amplified.preview/density_bigxy_"); + FLUID_3D::writeImageSliceXY(_densityBig, _resBig, _resBig[2]/2, prefix, _totalStepsBig, 1.0f); + //string df3Prefix = string("./df3/density_big_"); + //IMAGE::dumpDF3(_totalStepsBig, df3Prefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); + string pbrtPrefix = string("./pbrt/density_big_"); + IMAGE::dumpPBRT(_totalStepsBig, pbrtPrefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); + */ + _totalStepsBig++; +} + +////////////////////////////////////////////////////////////////////// +// perform the full turbulence algorithm, including OpenMP +// if available +////////////////////////////////////////////////////////////////////// +void WTURBULENCE::stepTurbulenceFull(float dtOrg, float* xvel, float* yvel, float* zvel, unsigned char *obstacles) +{ + // enlarge timestep to match grid + const float dt = dtOrg * _amplify; + const float invAmp = 1.0f / _amplify; + + // prepare textures + advectTextureCoordinates(dtOrg, xvel,yvel,zvel); + + // do wavelet decomposition of energy + computeEnergy(xvel, yvel, zvel, obstacles); + decomposeEnergy(); + + // zero out coefficients inside of the obstacle + for (int x = 0; x < _totalCellsSm; x++) + if (obstacles[x]) _energy[x] = 0.f; + + // parallel region setup + float maxVelMagThreads[8] = { -1., -1., -1., -1., -1., -1., -1., -1. }; +#if PARALLEL==1 +#pragma omp parallel +#endif + { float maxVelMag1 = 0.; +#if PARALLEL==1 + const int id = omp_get_thread_num(), num = omp_get_num_threads(); +#endif + + // vector noise main loop +#if PARALLEL==1 +#pragma omp for schedule(static) +#endif + for (int zSmall = 0; zSmall < _zResSm; zSmall++) + for (int ySmall = 0; ySmall < _yResSm; ySmall++) + for (int xSmall = 0; xSmall < _xResSm; xSmall++) + { + const int indexSmall = xSmall + ySmall * _xResSm + zSmall * _slabSizeSm; + + // compute jacobian + float jacobian[3][3] = { + { minDx(xSmall, ySmall, zSmall, _tcU, _resSm), minDx(xSmall, ySmall, zSmall, _tcV, _resSm), minDx(xSmall, ySmall, zSmall, _tcW, _resSm) } , + { minDy(xSmall, ySmall, zSmall, _tcU, _resSm), minDy(xSmall, ySmall, zSmall, _tcV, _resSm), minDy(xSmall, ySmall, zSmall, _tcW, _resSm) } , + { minDz(xSmall, ySmall, zSmall, _tcU, _resSm), minDz(xSmall, ySmall, zSmall, _tcV, _resSm), minDz(xSmall, ySmall, zSmall, _tcW, _resSm) } + }; + + // get LU factorization of texture jacobian and apply + // it to unit vectors + JAMA::LU<float> LU = computeLU3x3(jacobian); + float xUnwarped[] = {1.0f, 0.0f, 0.0f}; + float yUnwarped[] = {0.0f, 1.0f, 0.0f}; + float zUnwarped[] = {0.0f, 0.0f, 1.0f}; + float xWarped[] = {1.0f, 0.0f, 0.0f}; + float yWarped[] = {0.0f, 1.0f, 0.0f}; + float zWarped[] = {0.0f, 0.0f, 1.0f}; + bool nonSingular = LU.isNonsingular(); +#if 0 + // UNUSED + float eigMax = 10.0f; + float eigMin = 0.1f; +#endif + if (nonSingular) + { + solveLU3x3(LU, xUnwarped, xWarped); + solveLU3x3(LU, yUnwarped, yWarped); + solveLU3x3(LU, zUnwarped, zWarped); + + // compute the eigenvalues while we have the Jacobian available + Vec3 eigenvalues = Vec3(1.); + computeEigenvalues3x3( &eigenvalues[0], jacobian); + _eigMax[indexSmall] = MAX3V(eigenvalues); + _eigMin[indexSmall] = MIN3V(eigenvalues); + } + + // make sure to skip one on the beginning and end + int xStart = (xSmall == 0) ? 1 : 0; + int xEnd = (xSmall == _xResSm - 1) ? _amplify - 1 : _amplify; + int yStart = (ySmall == 0) ? 1 : 0; + int yEnd = (ySmall == _yResSm - 1) ? _amplify - 1 : _amplify; + int zStart = (zSmall == 0) ? 1 : 0; + int zEnd = (zSmall == _zResSm - 1) ? _amplify - 1 : _amplify; + + for (int zBig = zStart; zBig < zEnd; zBig++) + for (int yBig = yStart; yBig < yEnd; yBig++) + for (int xBig = xStart; xBig < xEnd; xBig++) + { + const int x = xSmall * _amplify + xBig; + const int y = ySmall * _amplify + yBig; + const int z = zSmall * _amplify + zBig; + + // get unit position for both fine and coarse grid + const Vec3 pos = Vec3(x,y,z); + const Vec3 posSm = pos * invAmp; + + // get grid index for both fine and coarse grid + const int index = x + y *_xResBig + z *_slabSizeBig; + + // get a linearly interpolated velocity and texcoords + // from the coarse grid + Vec3 vel = INTERPOLATE::lerp3dVec( xvel,yvel,zvel, + posSm[0], posSm[1], posSm[2], _xResSm,_yResSm,_zResSm); + Vec3 uvw = INTERPOLATE::lerp3dVec( _tcU,_tcV,_tcW, + posSm[0], posSm[1], posSm[2], _xResSm,_yResSm,_zResSm); + + // multiply the texture coordinate by _resSm so that turbulence + // synthesis begins at the first octave that the coarse grid + // cannot capture + Vec3 texCoord = Vec3(uvw[0] * _resSm[0], + uvw[1] * _resSm[1], + uvw[2] * _resSm[2]); + + // retrieve wavelet energy at highest frequency + float energy = INTERPOLATE::lerp3d( + _highFreqEnergy, posSm[0],posSm[1],posSm[2], _xResSm, _yResSm, _zResSm); + + // base amplitude for octave 0 + float coefficient = sqrtf(2.0f * fabs(energy)); + const float amplitude = _strength * fabs(0.5 * coefficient) * persistence; + + // add noise to velocity, but only if the turbulence is + // sufficiently undeformed, and the energy is large enough + // to make a difference + const bool addNoise = _eigMax[indexSmall] < 2. && + _eigMin[indexSmall] > 0.5; + if (addNoise && amplitude > _cullingThreshold) { + // base amplitude for octave 0 + float amplitudeScaled = amplitude; + + for (int octave = 0; octave < _octaves; octave++) + { + // multiply the vector noise times the maximum allowed + // noise amplitude at this octave, and add it to the total + vel += WVelocityWithJacobian(texCoord, &xUnwarped[0], &yUnwarped[0], &zUnwarped[0]) * amplitudeScaled; + + // scale coefficient for next octave + amplitudeScaled *= persistence; + texCoord *= 2.0f; + } + } + + // Store velocity + turbulence in big grid for maccormack step + // + // If you wanted to save memory, you would instead perform a + // semi-Lagrangian backtrace for the current grid cell here. Then + // you could just throw the velocity away. + _bigUx[index] = vel[0]; + _bigUy[index] = vel[1]; + _bigUz[index] = vel[2]; + + // compute the velocity magnitude for substepping later + const float velMag = _bigUx[index] * _bigUx[index] + + _bigUy[index] * _bigUy[index] + + _bigUz[index] * _bigUz[index]; + if (velMag > maxVelMag1) maxVelMag1 = velMag; + + // zero out velocity inside obstacles + float obsCheck = INTERPOLATE::lerp3dToFloat( + obstacles, posSm[0], posSm[1], posSm[2], _xResSm, _yResSm, _zResSm); + if (obsCheck > 0.95) + _bigUx[index] = _bigUy[index] = _bigUz[index] = 0.; + } // xyz + +#if PARALLEL==1 + maxVelMagThreads[id] = maxVelMag1; +#else + maxVelMagThreads[0] = maxVelMag1; +#endif + } + } // omp + + // compute maximum over threads + float maxVelMag = maxVelMagThreads[0]; +#if PARALLEL==1 + for (int i = 1; i < 8; i++) + if (maxVelMag < maxVelMagThreads[i]) + maxVelMag = maxVelMagThreads[i]; +#endif + + // prepare density for an advection + SWAP_POINTERS(_densityBig, _densityBigOld); + + // based on the maximum velocity present, see if we need to substep, + // but cap the maximum number of substeps to 5 + const int maxSubSteps = 25; + const int maxVel = 5; + maxVelMag = sqrt(maxVelMag) * dt; + int totalSubsteps = (int)(maxVelMag / (float)maxVel); + totalSubsteps = (totalSubsteps < 1) ? 1 : totalSubsteps; + + totalSubsteps = (totalSubsteps > maxSubSteps) ? maxSubSteps : totalSubsteps; + const float dtSubdiv = dt / (float)totalSubsteps; + + // set boundaries of big velocity grid + FLUID_3D::setZeroX(_bigUx, _resBig); + FLUID_3D::setZeroY(_bigUy, _resBig); + FLUID_3D::setZeroZ(_bigUz, _resBig); + + // do the MacCormack advection, with substepping if necessary + for(int substep = 0; substep < totalSubsteps; substep++) + { + FLUID_3D::advectFieldMacCormack(dtSubdiv, _bigUx, _bigUy, _bigUz, + _densityBigOld, _densityBig, _tempBig1, _tempBig2, _resBig, NULL); + + if (substep < totalSubsteps - 1) + SWAP_POINTERS(_densityBig, _densityBigOld); + } // substep + + // wipe the density borders + FLUID_3D::setZeroBorder(_densityBig, _resBig); + + // reset texture coordinates now in preparation for next timestep + // Shouldn't do this before generating the noise because then the + // eigenvalues stored do not reflect the underlying texture coordinates + resetTextureCoordinates(); + + // output files + // string prefix = string("./amplified.preview/density_bigxy_"); + // FLUID_3D::writeImageSliceXY(_densityBig, _resBig, _resBig[2]/2, prefix, _totalStepsBig, 1.0f); + //string df3prefix = string("./df3/density_big_"); + //IMAGE::dumpDF3(_totalStepsBig, df3prefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); + // string pbrtPrefix = string("./pbrt/density_big_"); + // IMAGE::dumpPBRT(_totalStepsBig, pbrtPrefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); + + _totalStepsBig++; +} + diff --git a/intern/smoke/intern/WTURBULENCE.h b/intern/smoke/intern/WTURBULENCE.h new file mode 100644 index 00000000000..858a47b7dd1 --- /dev/null +++ b/intern/smoke/intern/WTURBULENCE.h @@ -0,0 +1,147 @@ +////////////////////////////////////////////////////////////////////// +// This file is part of Wavelet Turbulence. +// +// Wavelet Turbulence is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Wavelet Turbulence is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Wavelet Turbulence. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright 2008 Theodore Kim and Nils Thuerey +// +// WTURBULENCE handling +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef WTURBULENCE_H +#define WTURBULENCE_H + +#include "VEC3.h" +using namespace BasicVector; +class SIMPLE_PARSER; + +/////////////////////////////////////////////////////////////////////////////// +/// Main WTURBULENCE class, stores large density array etc. +/////////////////////////////////////////////////////////////////////////////// +class WTURBULENCE +{ + public: + // both config files can be NULL, altCfg might override values from noiseCfg + WTURBULENCE(int xResSm, int yResSm, int zResSm, int amplify); + + /// destructor + virtual ~WTURBULENCE(); + + void setNoise(int type); + + // step more readable version -- no rotation correction + void stepTurbulenceReadable(float dt, float* xvel, float* yvel, float* zvel, unsigned char *obstacles); + + // step more complete version -- include rotation correction + // and use OpenMP if available + void stepTurbulenceFull(float dt, float* xvel, float* yvel, float* zvel, unsigned char *obstacles); + + // texcoord functions + void advectTextureCoordinates(float dtOrg, float* xvel, float* yvel, float* zvel); + void resetTextureCoordinates(); + + void computeEnergy(float* xvel, float* yvel, float* zvel, unsigned char *obstacles); + + // evaluate wavelet noise function + Vec3 WVelocity(Vec3 p); + Vec3 WVelocityWithJacobian(Vec3 p, float* xUnwarped, float* yUnwarped, float* zUnwarped); + + // access functions + inline float* getDensityBig() { return _densityBig; } + inline float* getArrayTcU() { return _tcU; } + inline float* getArrayTcV() { return _tcV; } + inline float* getArrayTcW() { return _tcW; } + inline float* getArrayEigMin() { return _eigMin; } + inline float* getArrayEigMax() { return _eigMax; } + + inline Vec3Int getResSm() { return _resSm; } // small resolution + inline Vec3Int getResBig() { return _resBig; } + inline int getOctaves() { return _octaves; } + + protected: + // enlargement factor from original velocity field / simulation + // _Big = _amplify * _Sm + int _amplify; + int _octaves; + float _strength; + + // noise settings + float _cullingThreshold; + float _noiseStrength; + float _noiseSizeScale; + bool _uvwAdvection; + bool _uvwReset; + float _noiseTimeanimSpeed; + int _dumpInterval; + int _noiseControlType; + // debug, scale density for projections output images + float _outputScale; + + // noise resolution + int _xResBig; + int _yResBig; + int _zResBig; + Vec3Int _resBig; + Vec3 _invResBig; + int _totalCellsBig; + int _slabSizeBig; + // original / small resolution + int _xResSm; + int _yResSm; + int _zResSm; + Vec3Int _resSm; + Vec3 _invResSm; + int _totalCellsSm; + int _slabSizeSm; + + float* _densityBig; + float* _densityBigOld; + + // big velocity macCormack fields + float* _bigUx; + float* _bigUy; + float* _bigUz; + // temp arrays for BFECC and MacCormack - they have more convenient + // names in the actual implementations + float* _tempBig1; + float* _tempBig2; + + // texture coordinates for noise + float* _tcU; + float* _tcV; + float* _tcW; + float* _tcTemp; + + float* _eigMin; + float* _eigMax; + + // wavelet decomposition of velocity energies + float* _energy; + + // noise data + float* _noiseTile; + //float* _noiseTileExt; + + // step counter + int _totalStepsBig; + + // highest frequency component of wavelet decomposition + float* _highFreqEnergy; + + void computeEigenvalues(); + void decomposeEnergy(); +}; + +#endif // WTURBULENCE_H + diff --git a/intern/smoke/intern/smoke_API.cpp b/intern/smoke/intern/smoke_API.cpp new file mode 100644 index 00000000000..9c835cf87ee --- /dev/null +++ b/intern/smoke/intern/smoke_API.cpp @@ -0,0 +1,121 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 by Daniel Genrich + * All rights reserved. + * + * Contributor(s): None + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "FLUID_3D.h" + +#include <stdio.h> +#include <stdlib.h> + +// y in smoke is z in blender +extern "C" FLUID_3D *smoke_init(int *res, int amplify, float *p0, float *p1, float dt) +{ + // smoke lib uses y as top-bottom/vertical axis where blender uses z + FLUID_3D *fluid = new FLUID_3D(res, amplify, p0, dt); + + // printf("xres: %d, yres: %d, zres: %d\n", res[0], res[1], res[2]); + + return fluid; +} + +extern "C" void smoke_free(FLUID_3D *fluid) +{ + delete fluid; + fluid = NULL; +} + +extern "C" void smoke_step(FLUID_3D *fluid) +{ + fluid->step(); +} + +extern "C" void smoke_initBlenderRNA(FLUID_3D *fluid, float *alpha, float *beta) +{ + fluid->initBlenderRNA(alpha, beta); +} + +template < class T > inline T ABS( T a ) { + return (0 < a) ? a : -a ; +} + +extern "C" float *smoke_get_density(FLUID_3D *fluid) +{ + return fluid->_density; +} + +extern "C" float *smoke_get_heat(FLUID_3D *fluid) +{ + return fluid->_heat; +} + +extern "C" float *smoke_get_velocity_x(FLUID_3D *fluid) +{ + return fluid->_xVorticity; +} + +extern "C" float *smoke_get_velocity_y(FLUID_3D *fluid) +{ + return fluid->_yVorticity; +} + +extern "C" float *smoke_get_velocity_z(FLUID_3D *fluid) +{ + return fluid->_zVorticity; +} + +extern "C" float *smoke_get_bigdensity(FLUID_3D *fluid) +{ + return fluid->_wTurbulence->getDensityBig(); +} + +extern "C" void smoke_get_bigres(FLUID_3D *fluid, int *res) +{ + Vec3Int r = fluid->_wTurbulence->getResBig(); + res[0] = r[0]; + res[1] = r[1]; + res[2] = r[2]; +} + +extern "C" unsigned char *smoke_get_obstacle(FLUID_3D *fluid) +{ + return fluid->_obstacles; +} + +extern "C" size_t smoke_get_index(int x, int max_x, int y, int max_y, int z /*, int max_z */) +{ + // // const int index = x + y * smd->res[0] + z * smd->res[0]*smd->res[1]; + return x + y * max_x + z * max_x*max_y; +} + +extern "C" size_t smoke_get_index2d(int x, int max_x, int y /*, int max_y, int z, int max_z */) +{ + return x + y * max_x; +} + +extern "C" void smoke_set_noise(FLUID_3D *fluid, int type) +{ + fluid->_wTurbulence->setNoise(type); +} diff --git a/intern/smoke/intern/tnt/jama_eig.h b/intern/smoke/intern/tnt/jama_eig.h new file mode 100644 index 00000000000..0d833be56de --- /dev/null +++ b/intern/smoke/intern/tnt/jama_eig.h @@ -0,0 +1,1050 @@ +#ifndef JAMA_EIG_H +#define JAMA_EIG_H + + +#include "tnt_array1d.h" +#include "tnt_array2d.h" +#include "tnt_math_utils.h" + +#include <algorithm> +// for min(), max() below + +#include <cmath> +// for fabs() below + +using namespace TNT; +using namespace std; + +// NT debugging +//static int gEigenDebug=0; +//if(gEigenDebug) std::cerr<<"n="<<n<<" m="<<m<<" l="<<l<<"\n"; +// m has to be smaller l! in line 262 +// gcc can get confused with abs calls, replaced by fabs + +namespace JAMA +{ + +/** + + Computes eigenvalues and eigenvectors of a real (non-complex) + matrix. +<P> + If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is + diagonal and the eigenvector matrix V is orthogonal. That is, + the diagonal values of D are the eigenvalues, and + V*V' = I, where I is the identity matrix. The columns of V + represent the eigenvectors in the sense that A*V = V*D. + +<P> + If A is not symmetric, then the eigenvalue matrix D is block diagonal + with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + a + i*b, in 2-by-2 blocks, [a, b; -b, a]. That is, if the complex + eigenvalues look like +<pre> + + u + iv . . . . . + . u - iv . . . . + . . a + ib . . . + . . . a - ib . . + . . . . x . + . . . . . y +</pre> + then D looks like +<pre> + + u v . . . . + -v u . . . . + . . a b . . + . . -b a . . + . . . . x . + . . . . . y +</pre> + This keeps V a real matrix in both symmetric and non-symmetric + cases, and A*V = V*D. + + + + <p> + The matrix V may be badly + conditioned, or even singular, so the validity of the equation + A = V*D*inverse(V) depends upon the condition number of V. + + <p> + (Adapted from JAMA, a Java Matrix Library, developed by jointly + by the Mathworks and NIST; see http://math.nist.gov/javanumerics/jama). +**/ + +template <class Real> +class Eigenvalue +{ + + + /** Row and column dimension (square matrix). */ + int n; + + int issymmetric; /* boolean*/ + + /** Arrays for internal storage of eigenvalues. */ + + TNT::Array1D<Real> d; /* real part */ + TNT::Array1D<Real> e; /* img part */ + + /** Array for internal storage of eigenvectors. */ + TNT::Array2D<Real> V; + + /** Array for internal storage of nonsymmetric Hessenberg form. + @serial internal storage of nonsymmetric Hessenberg form. + */ + TNT::Array2D<Real> H; + + + /** Working storage for nonsymmetric algorithm. + @serial working storage for nonsymmetric algorithm. + */ + TNT::Array1D<Real> ort; + + + // Symmetric Householder reduction to tridiagonal form. + + void tred2() { + + // This is derived from the Algol procedures tred2 by + // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + // Fortran subroutine in EISPACK. + + for (int j = 0; j < n; j++) { + d[j] = V[n-1][j]; + } + + // Householder reduction to tridiagonal form. + + for (int i = n-1; i > 0; i--) { + + // Scale to avoid under/overflow. + + Real scale = 0.0; + Real h = 0.0; + for (int k = 0; k < i; k++) { + scale = scale + fabs(d[k]); + } + if (scale == 0.0) { + e[i] = d[i-1]; + for (int j = 0; j < i; j++) { + d[j] = V[i-1][j]; + V[i][j] = 0.0; + V[j][i] = 0.0; + } + } else { + + // Generate Householder vector. + + for (int k = 0; k < i; k++) { + d[k] /= scale; + h += d[k] * d[k]; + } + Real f = d[i-1]; + Real g = sqrt(h); + if (f > 0) { + g = -g; + } + e[i] = scale * g; + h = h - f * g; + d[i-1] = f - g; + for (int j = 0; j < i; j++) { + e[j] = 0.0; + } + + // Apply similarity transformation to remaining columns. + + for (int j = 0; j < i; j++) { + f = d[j]; + V[j][i] = f; + g = e[j] + V[j][j] * f; + for (int k = j+1; k <= i-1; k++) { + g += V[k][j] * d[k]; + e[k] += V[k][j] * f; + } + e[j] = g; + } + f = 0.0; + for (int j = 0; j < i; j++) { + e[j] /= h; + f += e[j] * d[j]; + } + Real hh = f / (h + h); + for (int j = 0; j < i; j++) { + e[j] -= hh * d[j]; + } + for (int j = 0; j < i; j++) { + f = d[j]; + g = e[j]; + for (int k = j; k <= i-1; k++) { + V[k][j] -= (f * e[k] + g * d[k]); + } + d[j] = V[i-1][j]; + V[i][j] = 0.0; + } + } + d[i] = h; + } + + // Accumulate transformations. + + for (int i = 0; i < n-1; i++) { + V[n-1][i] = V[i][i]; + V[i][i] = 1.0; + Real h = d[i+1]; + if (h != 0.0) { + for (int k = 0; k <= i; k++) { + d[k] = V[k][i+1] / h; + } + for (int j = 0; j <= i; j++) { + Real g = 0.0; + for (int k = 0; k <= i; k++) { + g += V[k][i+1] * V[k][j]; + } + for (int k = 0; k <= i; k++) { + V[k][j] -= g * d[k]; + } + } + } + for (int k = 0; k <= i; k++) { + V[k][i+1] = 0.0; + } + } + for (int j = 0; j < n; j++) { + d[j] = V[n-1][j]; + V[n-1][j] = 0.0; + } + V[n-1][n-1] = 1.0; + e[0] = 0.0; + } + + // Symmetric tridiagonal QL algorithm. + + void tql2 () { + + // This is derived from the Algol procedures tql2, by + // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + // Fortran subroutine in EISPACK. + + for (int i = 1; i < n; i++) { + e[i-1] = e[i]; + } + e[n-1] = 0.0; + + Real f = 0.0; + Real tst1 = 0.0; + Real eps = pow(2.0,-52.0); + for (int l = 0; l < n; l++) { + + // Find small subdiagonal element + + tst1 = max(tst1,fabs(d[l]) + fabs(e[l])); + int m = l; + + // Original while-loop from Java code + while (m < n) { + if (fabs(e[m]) <= eps*tst1) { + break; + } + m++; + } + + + // If m == l, d[l] is an eigenvalue, + // otherwise, iterate. + + if (m > l) { + int iter = 0; + do { + iter = iter + 1; // (Could check iteration count here.) + + // Compute implicit shift + + Real g = d[l]; + Real p = (d[l+1] - g) / (2.0 * e[l]); + Real r = hypot(p,1.0); + if (p < 0) { + r = -r; + } + d[l] = e[l] / (p + r); + d[l+1] = e[l] * (p + r); + Real dl1 = d[l+1]; + Real h = g - d[l]; + for (int i = l+2; i < n; i++) { + d[i] -= h; + } + f = f + h; + + // Implicit QL transformation. + + p = d[m]; + Real c = 1.0; + Real c2 = c; + Real c3 = c; + Real el1 = e[l+1]; + Real s = 0.0; + Real s2 = 0.0; + for (int i = m-1; i >= l; i--) { + c3 = c2; + c2 = c; + s2 = s; + g = c * e[i]; + h = c * p; + r = hypot(p,e[i]); + e[i+1] = s * r; + s = e[i] / r; + c = p / r; + p = c * d[i] - s * g; + d[i+1] = h + s * (c * g + s * d[i]); + + // Accumulate transformation. + + for (int k = 0; k < n; k++) { + h = V[k][i+1]; + V[k][i+1] = s * V[k][i] + c * h; + V[k][i] = c * V[k][i] - s * h; + } + } + p = -s * s2 * c3 * el1 * e[l] / dl1; + e[l] = s * p; + d[l] = c * p; + + // Check for convergence. + + } while (fabs(e[l]) > eps*tst1); + } + d[l] = d[l] + f; + e[l] = 0.0; + } + + // Sort eigenvalues and corresponding vectors. + + for (int i = 0; i < n-1; i++) { + int k = i; + Real p = d[i]; + for (int j = i+1; j < n; j++) { + if (d[j] < p) { + k = j; + p = d[j]; + } + } + if (k != i) { + d[k] = d[i]; + d[i] = p; + for (int j = 0; j < n; j++) { + p = V[j][i]; + V[j][i] = V[j][k]; + V[j][k] = p; + } + } + } + } + + // Nonsymmetric reduction to Hessenberg form. + + void orthes () { + + // This is derived from the Algol procedures orthes and ortran, + // by Martin and Wilkinson, Handbook for Auto. Comp., + // Vol.ii-Linear Algebra, and the corresponding + // Fortran subroutines in EISPACK. + + int low = 0; + int high = n-1; + + for (int m = low+1; m <= high-1; m++) { + + // Scale column. + + Real scale = 0.0; + for (int i = m; i <= high; i++) { + scale = scale + fabs(H[i][m-1]); + } + if (scale != 0.0) { + + // Compute Householder transformation. + + Real h = 0.0; + for (int i = high; i >= m; i--) { + ort[i] = H[i][m-1]/scale; + h += ort[i] * ort[i]; + } + Real g = sqrt(h); + if (ort[m] > 0) { + g = -g; + } + h = h - ort[m] * g; + ort[m] = ort[m] - g; + + // Apply Householder similarity transformation + // H = (I-u*u'/h)*H*(I-u*u')/h) + + for (int j = m; j < n; j++) { + Real f = 0.0; + for (int i = high; i >= m; i--) { + f += ort[i]*H[i][j]; + } + f = f/h; + for (int i = m; i <= high; i++) { + H[i][j] -= f*ort[i]; + } + } + + for (int i = 0; i <= high; i++) { + Real f = 0.0; + for (int j = high; j >= m; j--) { + f += ort[j]*H[i][j]; + } + f = f/h; + for (int j = m; j <= high; j++) { + H[i][j] -= f*ort[j]; + } + } + ort[m] = scale*ort[m]; + H[m][m-1] = scale*g; + } + } + + // Accumulate transformations (Algol's ortran). + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + V[i][j] = (i == j ? 1.0 : 0.0); + } + } + + for (int m = high-1; m >= low+1; m--) { + if (H[m][m-1] != 0.0) { + for (int i = m+1; i <= high; i++) { + ort[i] = H[i][m-1]; + } + for (int j = m; j <= high; j++) { + Real g = 0.0; + for (int i = m; i <= high; i++) { + g += ort[i] * V[i][j]; + } + // Double division avoids possible underflow + g = (g / ort[m]) / H[m][m-1]; + for (int i = m; i <= high; i++) { + V[i][j] += g * ort[i]; + } + } + } + } + } + + + // Complex scalar division. + + Real cdivr, cdivi; + void cdiv(Real xr, Real xi, Real yr, Real yi) { + Real r,d; + if (fabs(yr) > fabs(yi)) { + r = yi/yr; + d = yr + r*yi; + cdivr = (xr + r*xi)/d; + cdivi = (xi - r*xr)/d; + } else { + r = yr/yi; + d = yi + r*yr; + cdivr = (r*xr + xi)/d; + cdivi = (r*xi - xr)/d; + } + } + + + // Nonsymmetric reduction from Hessenberg to real Schur form. + + void hqr2 () { + + // This is derived from the Algol procedure hqr2, + // by Martin and Wilkinson, Handbook for Auto. Comp., + // Vol.ii-Linear Algebra, and the corresponding + // Fortran subroutine in EISPACK. + + // Initialize + + int nn = this->n; + int n = nn-1; + int low = 0; + int high = nn-1; + Real eps = pow(2.0,-52.0); + Real exshift = 0.0; + Real p=0,q=0,r=0,s=0,z=0,t,w,x,y; + + // Store roots isolated by balanc and compute matrix norm + + Real norm = 0.0; + for (int i = 0; i < nn; i++) { + if ((i < low) || (i > high)) { + d[i] = H[i][i]; + e[i] = 0.0; + } + for (int j = max(i-1,0); j < nn; j++) { + norm = norm + fabs(H[i][j]); + } + } + + // Outer loop over eigenvalue index + + int iter = 0; + int totIter = 0; + while (n >= low) { + + // NT limit no. of iterations + totIter++; + if(totIter>100) { + //if(totIter>15) std::cout<<"!!!!iter ABORT !!!!!!! "<<totIter<<"\n"; + // NT hack/fix, return large eigenvalues + for (int i = 0; i < nn; i++) { + d[i] = 10000.; + e[i] = 10000.; + } + return; + } + + // Look for single small sub-diagonal element + + int l = n; + while (l > low) { + s = fabs(H[l-1][l-1]) + fabs(H[l][l]); + if (s == 0.0) { + s = norm; + } + if (fabs(H[l][l-1]) < eps * s) { + break; + } + l--; + } + + // Check for convergence + // One root found + + if (l == n) { + H[n][n] = H[n][n] + exshift; + d[n] = H[n][n]; + e[n] = 0.0; + n--; + iter = 0; + + // Two roots found + + } else if (l == n-1) { + w = H[n][n-1] * H[n-1][n]; + p = (H[n-1][n-1] - H[n][n]) / 2.0; + q = p * p + w; + z = sqrt(fabs(q)); + H[n][n] = H[n][n] + exshift; + H[n-1][n-1] = H[n-1][n-1] + exshift; + x = H[n][n]; + + // Real pair + + if (q >= 0) { + if (p >= 0) { + z = p + z; + } else { + z = p - z; + } + d[n-1] = x + z; + d[n] = d[n-1]; + if (z != 0.0) { + d[n] = x - w / z; + } + e[n-1] = 0.0; + e[n] = 0.0; + x = H[n][n-1]; + s = fabs(x) + fabs(z); + p = x / s; + q = z / s; + r = sqrt(p * p+q * q); + p = p / r; + q = q / r; + + // Row modification + + for (int j = n-1; j < nn; j++) { + z = H[n-1][j]; + H[n-1][j] = q * z + p * H[n][j]; + H[n][j] = q * H[n][j] - p * z; + } + + // Column modification + + for (int i = 0; i <= n; i++) { + z = H[i][n-1]; + H[i][n-1] = q * z + p * H[i][n]; + H[i][n] = q * H[i][n] - p * z; + } + + // Accumulate transformations + + for (int i = low; i <= high; i++) { + z = V[i][n-1]; + V[i][n-1] = q * z + p * V[i][n]; + V[i][n] = q * V[i][n] - p * z; + } + + // Complex pair + + } else { + d[n-1] = x + p; + d[n] = x + p; + e[n-1] = z; + e[n] = -z; + } + n = n - 2; + iter = 0; + + // No convergence yet + + } else { + + // Form shift + + x = H[n][n]; + y = 0.0; + w = 0.0; + if (l < n) { + y = H[n-1][n-1]; + w = H[n][n-1] * H[n-1][n]; + } + + // Wilkinson's original ad hoc shift + + if (iter == 10) { + exshift += x; + for (int i = low; i <= n; i++) { + H[i][i] -= x; + } + s = fabs(H[n][n-1]) + fabs(H[n-1][n-2]); + x = y = 0.75 * s; + w = -0.4375 * s * s; + } + + // MATLAB's new ad hoc shift + + if (iter == 30) { + s = (y - x) / 2.0; + s = s * s + w; + if (s > 0) { + s = sqrt(s); + if (y < x) { + s = -s; + } + s = x - w / ((y - x) / 2.0 + s); + for (int i = low; i <= n; i++) { + H[i][i] -= s; + } + exshift += s; + x = y = w = 0.964; + } + } + + iter = iter + 1; // (Could check iteration count here.) + + // Look for two consecutive small sub-diagonal elements + + int m = n-2; + while (m >= l) { + z = H[m][m]; + r = x - z; + s = y - z; + p = (r * s - w) / H[m+1][m] + H[m][m+1]; + q = H[m+1][m+1] - z - r - s; + r = H[m+2][m+1]; + s = fabs(p) + fabs(q) + fabs(r); + p = p / s; + q = q / s; + r = r / s; + if (m == l) { + break; + } + if (fabs(H[m][m-1]) * (fabs(q) + fabs(r)) < + eps * (fabs(p) * (fabs(H[m-1][m-1]) + fabs(z) + + fabs(H[m+1][m+1])))) { + break; + } + m--; + } + + for (int i = m+2; i <= n; i++) { + H[i][i-2] = 0.0; + if (i > m+2) { + H[i][i-3] = 0.0; + } + } + + // Double QR step involving rows l:n and columns m:n + + for (int k = m; k <= n-1; k++) { + int notlast = (k != n-1); + if (k != m) { + p = H[k][k-1]; + q = H[k+1][k-1]; + r = (notlast ? H[k+2][k-1] : 0.0); + x = fabs(p) + fabs(q) + fabs(r); + if (x != 0.0) { + p = p / x; + q = q / x; + r = r / x; + } + } + if (x == 0.0) { + break; + } + s = sqrt(p * p + q * q + r * r); + if (p < 0) { + s = -s; + } + if (s != 0) { + if (k != m) { + H[k][k-1] = -s * x; + } else if (l != m) { + H[k][k-1] = -H[k][k-1]; + } + p = p + s; + x = p / s; + y = q / s; + z = r / s; + q = q / p; + r = r / p; + + // Row modification + + for (int j = k; j < nn; j++) { + p = H[k][j] + q * H[k+1][j]; + if (notlast) { + p = p + r * H[k+2][j]; + H[k+2][j] = H[k+2][j] - p * z; + } + H[k][j] = H[k][j] - p * x; + H[k+1][j] = H[k+1][j] - p * y; + } + + // Column modification + + for (int i = 0; i <= min(n,k+3); i++) { + p = x * H[i][k] + y * H[i][k+1]; + if (notlast) { + p = p + z * H[i][k+2]; + H[i][k+2] = H[i][k+2] - p * r; + } + H[i][k] = H[i][k] - p; + H[i][k+1] = H[i][k+1] - p * q; + } + + // Accumulate transformations + + for (int i = low; i <= high; i++) { + p = x * V[i][k] + y * V[i][k+1]; + if (notlast) { + p = p + z * V[i][k+2]; + V[i][k+2] = V[i][k+2] - p * r; + } + V[i][k] = V[i][k] - p; + V[i][k+1] = V[i][k+1] - p * q; + } + } // (s != 0) + } // k loop + } // check convergence + } // while (n >= low) + //if(totIter>15) std::cout<<"!!!!iter "<<totIter<<"\n"; + + // Backsubstitute to find vectors of upper triangular form + + if (norm == 0.0) { + return; + } + + for (n = nn-1; n >= 0; n--) { + p = d[n]; + q = e[n]; + + // Real vector + + if (q == 0) { + int l = n; + H[n][n] = 1.0; + for (int i = n-1; i >= 0; i--) { + w = H[i][i] - p; + r = 0.0; + for (int j = l; j <= n; j++) { + r = r + H[i][j] * H[j][n]; + } + if (e[i] < 0.0) { + z = w; + s = r; + } else { + l = i; + if (e[i] == 0.0) { + if (w != 0.0) { + H[i][n] = -r / w; + } else { + H[i][n] = -r / (eps * norm); + } + + // Solve real equations + + } else { + x = H[i][i+1]; + y = H[i+1][i]; + q = (d[i] - p) * (d[i] - p) + e[i] * e[i]; + t = (x * s - z * r) / q; + H[i][n] = t; + if (fabs(x) > fabs(z)) { + H[i+1][n] = (-r - w * t) / x; + } else { + H[i+1][n] = (-s - y * t) / z; + } + } + + // Overflow control + + t = fabs(H[i][n]); + if ((eps * t) * t > 1) { + for (int j = i; j <= n; j++) { + H[j][n] = H[j][n] / t; + } + } + } + } + + // Complex vector + + } else if (q < 0) { + int l = n-1; + + // Last vector component imaginary so matrix is triangular + + if (fabs(H[n][n-1]) > fabs(H[n-1][n])) { + H[n-1][n-1] = q / H[n][n-1]; + H[n-1][n] = -(H[n][n] - p) / H[n][n-1]; + } else { + cdiv(0.0,-H[n-1][n],H[n-1][n-1]-p,q); + H[n-1][n-1] = cdivr; + H[n-1][n] = cdivi; + } + H[n][n-1] = 0.0; + H[n][n] = 1.0; + for (int i = n-2; i >= 0; i--) { + Real ra,sa,vr,vi; + ra = 0.0; + sa = 0.0; + for (int j = l; j <= n; j++) { + ra = ra + H[i][j] * H[j][n-1]; + sa = sa + H[i][j] * H[j][n]; + } + w = H[i][i] - p; + + if (e[i] < 0.0) { + z = w; + r = ra; + s = sa; + } else { + l = i; + if (e[i] == 0) { + cdiv(-ra,-sa,w,q); + H[i][n-1] = cdivr; + H[i][n] = cdivi; + } else { + + // Solve complex equations + + x = H[i][i+1]; + y = H[i+1][i]; + vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q; + vi = (d[i] - p) * 2.0 * q; + if ((vr == 0.0) && (vi == 0.0)) { + vr = eps * norm * (fabs(w) + fabs(q) + + fabs(x) + fabs(y) + fabs(z)); + } + cdiv(x*r-z*ra+q*sa,x*s-z*sa-q*ra,vr,vi); + H[i][n-1] = cdivr; + H[i][n] = cdivi; + if (fabs(x) > (fabs(z) + fabs(q))) { + H[i+1][n-1] = (-ra - w * H[i][n-1] + q * H[i][n]) / x; + H[i+1][n] = (-sa - w * H[i][n] - q * H[i][n-1]) / x; + } else { + cdiv(-r-y*H[i][n-1],-s-y*H[i][n],z,q); + H[i+1][n-1] = cdivr; + H[i+1][n] = cdivi; + } + } + + // Overflow control + + t = max(fabs(H[i][n-1]),fabs(H[i][n])); + if ((eps * t) * t > 1) { + for (int j = i; j <= n; j++) { + H[j][n-1] = H[j][n-1] / t; + H[j][n] = H[j][n] / t; + } + } + } + } + } + } + + // Vectors of isolated roots + + for (int i = 0; i < nn; i++) { + if (i < low || i > high) { + for (int j = i; j < nn; j++) { + V[i][j] = H[i][j]; + } + } + } + + // Back transformation to get eigenvectors of original matrix + + for (int j = nn-1; j >= low; j--) { + for (int i = low; i <= high; i++) { + z = 0.0; + for (int k = low; k <= min(j,high); k++) { + z = z + V[i][k] * H[k][j]; + } + V[i][j] = z; + } + } + } + +public: + + + /** Check for symmetry, then construct the eigenvalue decomposition + @param A Square real (non-complex) matrix + */ + + Eigenvalue(const TNT::Array2D<Real> &A) { + n = A.dim2(); + V = Array2D<Real>(n,n); + d = Array1D<Real>(n); + e = Array1D<Real>(n); + + issymmetric = 1; + for (int j = 0; (j < n) && issymmetric; j++) { + for (int i = 0; (i < n) && issymmetric; i++) { + issymmetric = (A[i][j] == A[j][i]); + } + } + + if (issymmetric) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + V[i][j] = A[i][j]; + } + } + + // Tridiagonalize. + tred2(); + + // Diagonalize. + tql2(); + + } else { + H = TNT::Array2D<Real>(n,n); + ort = TNT::Array1D<Real>(n); + + for (int j = 0; j < n; j++) { + for (int i = 0; i < n; i++) { + H[i][j] = A[i][j]; + } + } + + // Reduce to Hessenberg form. + orthes(); + + // Reduce Hessenberg to real Schur form. + hqr2(); + } + } + + + /** Return the eigenvector matrix + @return V + */ + + void getV (TNT::Array2D<Real> &V_) { + V_ = V; + return; + } + + /** Return the real parts of the eigenvalues + @return real(diag(D)) + */ + + void getRealEigenvalues (TNT::Array1D<Real> &d_) { + d_ = d; + return ; + } + + /** Return the imaginary parts of the eigenvalues + in parameter e_. + + @pararm e_: new matrix with imaginary parts of the eigenvalues. + */ + void getImagEigenvalues (TNT::Array1D<Real> &e_) { + e_ = e; + return; + } + + +/** + Computes the block diagonal eigenvalue matrix. + If the original matrix A is not symmetric, then the eigenvalue + matrix D is block diagonal with the real eigenvalues in 1-by-1 + blocks and any complex eigenvalues, + a + i*b, in 2-by-2 blocks, [a, b; -b, a]. That is, if the complex + eigenvalues look like +<pre> + + u + iv . . . . . + . u - iv . . . . + . . a + ib . . . + . . . a - ib . . + . . . . x . + . . . . . y +</pre> + then D looks like +<pre> + + u v . . . . + -v u . . . . + . . a b . . + . . -b a . . + . . . . x . + . . . . . y +</pre> + This keeps V a real matrix in both symmetric and non-symmetric + cases, and A*V = V*D. + + @param D: upon return, the matrix is filled with the block diagonal + eigenvalue matrix. + +*/ + void getD (TNT::Array2D<Real> &D) { + D = Array2D<Real>(n,n); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + D[i][j] = 0.0; + } + D[i][i] = d[i]; + if (e[i] > 0) { + D[i][i+1] = e[i]; + } else if (e[i] < 0) { + D[i][i-1] = e[i]; + } + } + } +}; + +} //namespace JAMA + + +#endif +// JAMA_EIG_H diff --git a/intern/smoke/intern/tnt/jama_lu.h b/intern/smoke/intern/tnt/jama_lu.h new file mode 100644 index 00000000000..a4f96b11502 --- /dev/null +++ b/intern/smoke/intern/tnt/jama_lu.h @@ -0,0 +1,319 @@ +#ifndef JAMA_LU_H +#define JAMA_LU_H + +#include "tnt.h" +#include <algorithm> +//for min(), max() below + +using namespace TNT; +using namespace std; + +namespace JAMA +{ + + /** LU Decomposition. + <P> + For an m-by-n matrix A with m >= n, the LU decomposition is an m-by-n + unit lower triangular matrix L, an n-by-n upper triangular matrix U, + and a permutation vector piv of length m so that A(piv,:) = L*U. + If m < n, then L is m-by-m and U is m-by-n. + <P> + The LU decompostion with pivoting always exists, even if the matrix is + singular, so the constructor will never fail. The primary use of the + LU decomposition is in the solution of square systems of simultaneous + linear equations. This will fail if isNonsingular() returns false. + */ +template <class Real> +class LU +{ + + + + /* Array for internal storage of decomposition. */ + Array2D<Real> LU_; + int m, n, pivsign; + Array1D<int> piv; + + + Array2D<Real> permute_copy(const Array2D<Real> &A, + const Array1D<int> &piv, int j0, int j1) + { + int piv_length = piv.dim(); + + Array2D<Real> X(piv_length, j1-j0+1); + + + for (int i = 0; i < piv_length; i++) + for (int j = j0; j <= j1; j++) + X[i][j-j0] = A[piv[i]][j]; + + return X; + } + + Array1D<Real> permute_copy(const Array1D<Real> &A, + const Array1D<int> &piv) + { + int piv_length = piv.dim(); + if (piv_length != A.dim()) + return Array1D<Real>(); + + Array1D<Real> x(piv_length); + + + for (int i = 0; i < piv_length; i++) + x[i] = A[piv[i]]; + + return x; + } + + + public : + + /** LU Decomposition + @param A Rectangular matrix + @return LU Decomposition object to access L, U and piv. + */ + + LU (const Array2D<Real> &A) : LU_(A.copy()), m(A.dim1()), n(A.dim2()), + piv(A.dim1()) + + { + + // Use a "left-looking", dot-product, Crout/Doolittle algorithm. + + + for (int i = 0; i < m; i++) { + piv[i] = i; + } + pivsign = 1; + Real *LUrowi = 0;; + Array1D<Real> LUcolj(m); + + // Outer loop. + + for (int j = 0; j < n; j++) { + + // Make a copy of the j-th column to localize references. + + for (int i = 0; i < m; i++) { + LUcolj[i] = LU_[i][j]; + } + + // Apply previous transformations. + + for (int i = 0; i < m; i++) { + LUrowi = LU_[i]; + + // Most of the time is spent in the following dot product. + + int kmax = min(i,j); + double s = 0.0; + for (int k = 0; k < kmax; k++) { + s += LUrowi[k]*LUcolj[k]; + } + + LUrowi[j] = LUcolj[i] -= s; + } + + // Find pivot and exchange if necessary. + + int p = j; + for (int i = j+1; i < m; i++) { + if (abs(LUcolj[i]) > abs(LUcolj[p])) { + p = i; + } + } + if (p != j) { + int k=0; + for (k = 0; k < n; k++) { + double t = LU_[p][k]; + LU_[p][k] = LU_[j][k]; + LU_[j][k] = t; + } + k = piv[p]; + piv[p] = piv[j]; + piv[j] = k; + pivsign = -pivsign; + } + + // Compute multipliers. + + if ((j < m) && (LU_[j][j] != 0.0)) { + for (int i = j+1; i < m; i++) { + LU_[i][j] /= LU_[j][j]; + } + } + } + } + + + /** Is the matrix nonsingular? + @return 1 (true) if upper triangular factor U (and hence A) + is nonsingular, 0 otherwise. + */ + + int isNonsingular () { + for (int j = 0; j < n; j++) { + if (LU_[j][j] == 0) + return 0; + } + return 1; + } + + /** Return lower triangular factor + @return L + */ + + Array2D<Real> getL () { + Array2D<Real> L_(m,n); + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (i > j) { + L_[i][j] = LU_[i][j]; + } else if (i == j) { + L_[i][j] = 1.0; + } else { + L_[i][j] = 0.0; + } + } + } + return L_; + } + + /** Return upper triangular factor + @return U portion of LU factorization. + */ + + Array2D<Real> getU () { + Array2D<Real> U_(n,n); + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (i <= j) { + U_[i][j] = LU_[i][j]; + } else { + U_[i][j] = 0.0; + } + } + } + return U_; + } + + /** Return pivot permutation vector + @return piv + */ + + Array1D<int> getPivot () { + return piv; + } + + + /** Compute determinant using LU factors. + @return determinant of A, or 0 if A is not square. + */ + + Real det () { + if (m != n) { + return Real(0); + } + Real d = Real(pivsign); + for (int j = 0; j < n; j++) { + d *= LU_[j][j]; + } + return d; + } + + /** Solve A*X = B + @param B A Matrix with as many rows as A and any number of columns. + @return X so that L*U*X = B(piv,:), if B is nonconformant, returns + 0x0 (null) array. + */ + + Array2D<Real> solve (const Array2D<Real> &B) + { + + /* Dimensions: A is mxn, X is nxk, B is mxk */ + + if (B.dim1() != m) { + return Array2D<Real>(0,0); + } + if (!isNonsingular()) { + return Array2D<Real>(0,0); + } + + // Copy right hand side with pivoting + int nx = B.dim2(); + + + Array2D<Real> X = permute_copy(B, piv, 0, nx-1); + + // Solve L*Y = B(piv,:) + for (int k = 0; k < n; k++) { + for (int i = k+1; i < n; i++) { + for (int j = 0; j < nx; j++) { + X[i][j] -= X[k][j]*LU_[i][k]; + } + } + } + // Solve U*X = Y; + for (int k = n-1; k >= 0; k--) { + for (int j = 0; j < nx; j++) { + X[k][j] /= LU_[k][k]; + } + for (int i = 0; i < k; i++) { + for (int j = 0; j < nx; j++) { + X[i][j] -= X[k][j]*LU_[i][k]; + } + } + } + return X; + } + + + /** Solve A*x = b, where x and b are vectors of length equal + to the number of rows in A. + + @param b a vector (Array1D> of length equal to the first dimension + of A. + @return x a vector (Array1D> so that L*U*x = b(piv), if B is nonconformant, + returns 0x0 (null) array. + */ + + Array1D<Real> solve (const Array1D<Real> &b) + { + + /* Dimensions: A is mxn, X is nxk, B is mxk */ + + if (b.dim1() != m) { + return Array1D<Real>(); + } + if (!isNonsingular()) { + return Array1D<Real>(); + } + + + Array1D<Real> x = permute_copy(b, piv); + + // Solve L*Y = B(piv) + for (int k = 0; k < n; k++) { + for (int i = k+1; i < n; i++) { + x[i] -= x[k]*LU_[i][k]; + } + } + + // Solve U*X = Y; + for (int k = n-1; k >= 0; k--) { + x[k] /= LU_[k][k]; + for (int i = 0; i < k; i++) + x[i] -= x[k]*LU_[i][k]; + } + + + return x; + } + +}; /* class LU */ + +} /* namespace JAMA */ + +#endif +/* JAMA_LU_H */ diff --git a/intern/smoke/intern/tnt/tnt.h b/intern/smoke/intern/tnt/tnt.h new file mode 100644 index 00000000000..92463e08a06 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt.h @@ -0,0 +1,64 @@ +/* +* +* Template Numerical Toolkit (TNT): Linear Algebra Module +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + +#ifndef TNT_H +#define TNT_H + + + +//--------------------------------------------------------------------- +// Define this macro if you want TNT to track some of the out-of-bounds +// indexing. This can encur a small run-time overhead, but is recommended +// while developing code. It can be turned off for production runs. +// +// #define TNT_BOUNDS_CHECK +//--------------------------------------------------------------------- +// + +//#define TNT_BOUNDS_CHECK + + + +#include "tnt_version.h" +#include "tnt_math_utils.h" +#include "tnt_array1d.h" +#include "tnt_array2d.h" +#include "tnt_array3d.h" +#include "tnt_array1d_utils.h" +#include "tnt_array2d_utils.h" +#include "tnt_array3d_utils.h" + +#include "tnt_fortran_array1d.h" +#include "tnt_fortran_array2d.h" +#include "tnt_fortran_array3d.h" +#include "tnt_fortran_array1d_utils.h" +#include "tnt_fortran_array2d_utils.h" +#include "tnt_fortran_array3d_utils.h" + +#include "tnt_sparse_matrix_csr.h" + +#include "tnt_stopwatch.h" +#include "tnt_subscript.h" +#include "tnt_vec.h" +#include "tnt_cmat.h" + + +#endif +// TNT_H diff --git a/intern/smoke/intern/tnt/tnt_array1d.h b/intern/smoke/intern/tnt/tnt_array1d.h new file mode 100644 index 00000000000..858df579863 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_array1d.h @@ -0,0 +1,278 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + + +#ifndef TNT_ARRAY1D_H +#define TNT_ARRAY1D_H + +//#include <cstdlib> +#include <iostream> + +#ifdef TNT_BOUNDS_CHECK +#include <assert.h> +#endif + + +#include "tnt_i_refvec.h" + +namespace TNT +{ + +template <class T> +class Array1D +{ + + private: + + /* ... */ + i_refvec<T> v_; + int n_; + T* data_; /* this normally points to v_.begin(), but + * could also point to a portion (subvector) + * of v_. + */ + + void copy_(T* p, const T* q, int len) const; + void set_(T* begin, T* end, const T& val); + + + public: + + typedef T value_type; + + + Array1D(); + explicit Array1D(int n); + Array1D(int n, const T &a); + Array1D(int n, T *a); + inline Array1D(const Array1D &A); + inline operator T*(); + inline operator const T*(); + inline Array1D & operator=(const T &a); + inline Array1D & operator=(const Array1D &A); + inline Array1D & ref(const Array1D &A); + Array1D copy() const; + Array1D & inject(const Array1D & A); + inline T& operator[](int i); + inline const T& operator[](int i) const; + inline int dim1() const; + inline int dim() const; + ~Array1D(); + + + /* ... extended interface ... */ + + inline int ref_count() const; + inline Array1D<T> subarray(int i0, int i1); + +}; + + + + +template <class T> +Array1D<T>::Array1D() : v_(), n_(0), data_(0) {} + +template <class T> +Array1D<T>::Array1D(const Array1D<T> &A) : v_(A.v_), n_(A.n_), + data_(A.data_) +{ +#ifdef TNT_DEBUG + std::cout << "Created Array1D(const Array1D<T> &A) \n"; +#endif + +} + + +template <class T> +Array1D<T>::Array1D(int n) : v_(n), n_(n), data_(v_.begin()) +{ +#ifdef TNT_DEBUG + std::cout << "Created Array1D(int n) \n"; +#endif +} + +template <class T> +Array1D<T>::Array1D(int n, const T &val) : v_(n), n_(n), data_(v_.begin()) +{ +#ifdef TNT_DEBUG + std::cout << "Created Array1D(int n, const T& val) \n"; +#endif + set_(data_, data_+ n, val); + +} + +template <class T> +Array1D<T>::Array1D(int n, T *a) : v_(a), n_(n) , data_(v_.begin()) +{ +#ifdef TNT_DEBUG + std::cout << "Created Array1D(int n, T* a) \n"; +#endif +} + +template <class T> +inline Array1D<T>::operator T*() +{ + return &(v_[0]); +} + + +template <class T> +inline Array1D<T>::operator const T*() +{ + return &(v_[0]); +} + + + +template <class T> +inline T& Array1D<T>::operator[](int i) +{ +#ifdef TNT_BOUNDS_CHECK + assert(i>= 0); + assert(i < n_); +#endif + return data_[i]; +} + +template <class T> +inline const T& Array1D<T>::operator[](int i) const +{ +#ifdef TNT_BOUNDS_CHECK + assert(i>= 0); + assert(i < n_); +#endif + return data_[i]; +} + + + + +template <class T> +Array1D<T> & Array1D<T>::operator=(const T &a) +{ + set_(data_, data_+n_, a); + return *this; +} + +template <class T> +Array1D<T> Array1D<T>::copy() const +{ + Array1D A( n_); + copy_(A.data_, data_, n_); + + return A; +} + + +template <class T> +Array1D<T> & Array1D<T>::inject(const Array1D &A) +{ + if (A.n_ == n_) + copy_(data_, A.data_, n_); + + return *this; +} + + + + + +template <class T> +Array1D<T> & Array1D<T>::ref(const Array1D<T> &A) +{ + if (this != &A) + { + v_ = A.v_; /* operator= handles the reference counting. */ + n_ = A.n_; + data_ = A.data_; + + } + return *this; +} + +template <class T> +Array1D<T> & Array1D<T>::operator=(const Array1D<T> &A) +{ + return ref(A); +} + +template <class T> +inline int Array1D<T>::dim1() const { return n_; } + +template <class T> +inline int Array1D<T>::dim() const { return n_; } + +template <class T> +Array1D<T>::~Array1D() {} + + +/* ............................ exented interface ......................*/ + +template <class T> +inline int Array1D<T>::ref_count() const +{ + return v_.ref_count(); +} + +template <class T> +inline Array1D<T> Array1D<T>::subarray(int i0, int i1) +{ + if ((i0 > 0) && (i1 < n_) || (i0 <= i1)) + { + Array1D<T> X(*this); /* create a new instance of this array. */ + X.n_ = i1-i0+1; + X.data_ += i0; + + return X; + } + else + { + return Array1D<T>(); + } +} + + +/* private internal functions */ + + +template <class T> +void Array1D<T>::set_(T* begin, T* end, const T& a) +{ + for (T* p=begin; p<end; p++) + *p = a; + +} + +template <class T> +void Array1D<T>::copy_(T* p, const T* q, int len) const +{ + T *end = p + len; + while (p<end ) + *p++ = *q++; + +} + + +} /* namespace TNT */ + +#endif +/* TNT_ARRAY1D_H */ + diff --git a/intern/smoke/intern/tnt/tnt_array1d_utils.h b/intern/smoke/intern/tnt/tnt_array1d_utils.h new file mode 100644 index 00000000000..683e0e2d856 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_array1d_utils.h @@ -0,0 +1,230 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + +#ifndef TNT_ARRAY1D_UTILS_H +#define TNT_ARRAY1D_UTILS_H + +#include <cstdlib> +#include <cassert> + +namespace TNT +{ + + +template <class T> +std::ostream& operator<<(std::ostream &s, const Array1D<T> &A) +{ + int N=A.dim1(); + +#ifdef TNT_DEBUG + s << "addr: " << (void *) &A[0] << "\n"; +#endif + s << N << "\n"; + for (int j=0; j<N; j++) + { + s << A[j] << "\n"; + } + s << "\n"; + + return s; +} + +template <class T> +std::istream& operator>>(std::istream &s, Array1D<T> &A) +{ + int N; + s >> N; + + Array1D<T> B(N); + for (int i=0; i<N; i++) + s >> B[i]; + A = B; + return s; +} + + + +template <class T> +Array1D<T> operator+(const Array1D<T> &A, const Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() != n ) + return Array1D<T>(); + + else + { + Array1D<T> C(n); + + for (int i=0; i<n; i++) + { + C[i] = A[i] + B[i]; + } + return C; + } +} + + + +template <class T> +Array1D<T> operator-(const Array1D<T> &A, const Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() != n ) + return Array1D<T>(); + + else + { + Array1D<T> C(n); + + for (int i=0; i<n; i++) + { + C[i] = A[i] - B[i]; + } + return C; + } +} + + +template <class T> +Array1D<T> operator*(const Array1D<T> &A, const Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() != n ) + return Array1D<T>(); + + else + { + Array1D<T> C(n); + + for (int i=0; i<n; i++) + { + C[i] = A[i] * B[i]; + } + return C; + } +} + + +template <class T> +Array1D<T> operator/(const Array1D<T> &A, const Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() != n ) + return Array1D<T>(); + + else + { + Array1D<T> C(n); + + for (int i=0; i<n; i++) + { + C[i] = A[i] / B[i]; + } + return C; + } +} + + + + + + + + + +template <class T> +Array1D<T>& operator+=(Array1D<T> &A, const Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() == n) + { + for (int i=0; i<n; i++) + { + A[i] += B[i]; + } + } + return A; +} + + + + +template <class T> +Array1D<T>& operator-=(Array1D<T> &A, const Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() == n) + { + for (int i=0; i<n; i++) + { + A[i] -= B[i]; + } + } + return A; +} + + + +template <class T> +Array1D<T>& operator*=(Array1D<T> &A, const Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() == n) + { + for (int i=0; i<n; i++) + { + A[i] *= B[i]; + } + } + return A; +} + + + + +template <class T> +Array1D<T>& operator/=(Array1D<T> &A, const Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() == n) + { + for (int i=0; i<n; i++) + { + A[i] /= B[i]; + } + } + return A; +} + + + + + + +} // namespace TNT + +#endif diff --git a/intern/smoke/intern/tnt/tnt_array2d.h b/intern/smoke/intern/tnt/tnt_array2d.h new file mode 100644 index 00000000000..c791575ebfb --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_array2d.h @@ -0,0 +1,315 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + + +#ifndef TNT_ARRAY2D_H +#define TNT_ARRAY2D_H + +#include <cstdlib> +#include <iostream> +#ifdef TNT_BOUNDS_CHECK +#include <assert.h> +#endif + +#include "tnt_array1d.h" + +namespace TNT +{ + +template <class T> +class Array2D +{ + + + private: + + + + Array1D<T> data_; + Array1D<T*> v_; + int m_; + int n_; + + public: + + typedef T value_type; + Array2D(); + Array2D(int m, int n); + Array2D(int m, int n, T *a); + Array2D(int m, int n, const T &a); + inline Array2D(const Array2D &A); + inline operator T**(); + inline operator const T**(); + inline Array2D & operator=(const T &a); + inline Array2D & operator=(const Array2D &A); + inline Array2D & ref(const Array2D &A); + Array2D copy() const; + Array2D & inject(const Array2D & A); + inline T* operator[](int i); + inline const T* operator[](int i) const; + inline int dim1() const; + inline int dim2() const; + ~Array2D(); + + /* extended interface (not part of the standard) */ + + + inline int ref_count(); + inline int ref_count_data(); + inline int ref_count_dim1(); + Array2D subarray(int i0, int i1, int j0, int j1); + +}; + + +template <class T> +Array2D<T>::Array2D() : data_(), v_(), m_(0), n_(0) {} + +template <class T> +Array2D<T>::Array2D(const Array2D<T> &A) : data_(A.data_), v_(A.v_), + m_(A.m_), n_(A.n_) {} + + + + +template <class T> +Array2D<T>::Array2D(int m, int n) : data_(m*n), v_(m), m_(m), n_(n) +{ + if (m>0 && n>0) + { + T* p = &(data_[0]); + for (int i=0; i<m; i++) + { + v_[i] = p; + p += n; + } + } +} + + + +template <class T> +Array2D<T>::Array2D(int m, int n, const T &val) : data_(m*n), v_(m), + m_(m), n_(n) +{ + if (m>0 && n>0) + { + data_ = val; + T* p = &(data_[0]); + for (int i=0; i<m; i++) + { + v_[i] = p; + p += n; + } + } +} + +template <class T> +Array2D<T>::Array2D(int m, int n, T *a) : data_(m*n, a), v_(m), m_(m), n_(n) +{ + if (m>0 && n>0) + { + T* p = &(data_[0]); + + for (int i=0; i<m; i++) + { + v_[i] = p; + p += n; + } + } +} + + +template <class T> +inline T* Array2D<T>::operator[](int i) +{ +#ifdef TNT_BOUNDS_CHECK + assert(i >= 0); + assert(i < m_); +#endif + +return v_[i]; + +} + + +template <class T> +inline const T* Array2D<T>::operator[](int i) const +{ +#ifdef TNT_BOUNDS_CHECK + assert(i >= 0); + assert(i < m_); +#endif + +return v_[i]; + +} + +template <class T> +Array2D<T> & Array2D<T>::operator=(const T &a) +{ + /* non-optimzied, but will work with subarrays in future verions */ + + for (int i=0; i<m_; i++) + for (int j=0; j<n_; j++) + v_[i][j] = a; + return *this; +} + + + + +template <class T> +Array2D<T> Array2D<T>::copy() const +{ + Array2D A(m_, n_); + + for (int i=0; i<m_; i++) + for (int j=0; j<n_; j++) + A[i][j] = v_[i][j]; + + + return A; +} + + +template <class T> +Array2D<T> & Array2D<T>::inject(const Array2D &A) +{ + if (A.m_ == m_ && A.n_ == n_) + { + for (int i=0; i<m_; i++) + for (int j=0; j<n_; j++) + v_[i][j] = A[i][j]; + } + return *this; +} + + + + +template <class T> +Array2D<T> & Array2D<T>::ref(const Array2D<T> &A) +{ + if (this != &A) + { + v_ = A.v_; + data_ = A.data_; + m_ = A.m_; + n_ = A.n_; + + } + return *this; +} + + + +template <class T> +Array2D<T> & Array2D<T>::operator=(const Array2D<T> &A) +{ + return ref(A); +} + +template <class T> +inline int Array2D<T>::dim1() const { return m_; } + +template <class T> +inline int Array2D<T>::dim2() const { return n_; } + + +template <class T> +Array2D<T>::~Array2D() {} + + + + +template <class T> +inline Array2D<T>::operator T**() +{ + return &(v_[0]); +} +template <class T> +inline Array2D<T>::operator const T**() +{ + return &(v_[0]); +} + +/* ............... extended interface ............... */ +/** + Create a new view to a subarray defined by the boundaries + [i0][i0] and [i1][j1]. The size of the subarray is + (i1-i0) by (j1-j0). If either of these lengths are zero + or negative, the subarray view is null. + +*/ +template <class T> +Array2D<T> Array2D<T>::subarray(int i0, int i1, int j0, int j1) +{ + Array2D<T> A; + int m = i1-i0+1; + int n = j1-j0+1; + + /* if either length is zero or negative, this is an invalide + subarray. return a null view. + */ + if (m<1 || n<1) + return A; + + A.data_ = data_; + A.m_ = m; + A.n_ = n; + A.v_ = Array1D<T*>(m); + T* p = &(data_[0]) + i0 * n_ + j0; + for (int i=0; i<m; i++) + { + A.v_[i] = p + i*n_; + + } + return A; +} + +template <class T> +inline int Array2D<T>::ref_count() +{ + return ref_count_data(); +} + + + +template <class T> +inline int Array2D<T>::ref_count_data() +{ + return data_.ref_count(); +} + +template <class T> +inline int Array2D<T>::ref_count_dim1() +{ + return v_.ref_count(); +} + + + + +} /* namespace TNT */ + +#endif +/* TNT_ARRAY2D_H */ + diff --git a/intern/smoke/intern/tnt/tnt_array2d_utils.h b/intern/smoke/intern/tnt/tnt_array2d_utils.h new file mode 100644 index 00000000000..7041ed37857 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_array2d_utils.h @@ -0,0 +1,287 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + +#ifndef TNT_ARRAY2D_UTILS_H +#define TNT_ARRAY2D_UTILS_H + +#include <cstdlib> +#include <cassert> + +namespace TNT +{ + + +template <class T> +std::ostream& operator<<(std::ostream &s, const Array2D<T> &A) +{ + int M=A.dim1(); + int N=A.dim2(); + + s << M << " " << N << "\n"; + + for (int i=0; i<M; i++) + { + for (int j=0; j<N; j++) + { + s << A[i][j] << " "; + } + s << "\n"; + } + + + return s; +} + +template <class T> +std::istream& operator>>(std::istream &s, Array2D<T> &A) +{ + + int M, N; + + s >> M >> N; + + Array2D<T> B(M,N); + + for (int i=0; i<M; i++) + for (int j=0; j<N; j++) + { + s >> B[i][j]; + } + + A = B; + return s; +} + + +template <class T> +Array2D<T> operator+(const Array2D<T> &A, const Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() != m || B.dim2() != n ) + return Array2D<T>(); + + else + { + Array2D<T> C(m,n); + + for (int i=0; i<m; i++) + { + for (int j=0; j<n; j++) + C[i][j] = A[i][j] + B[i][j]; + } + return C; + } +} + +template <class T> +Array2D<T> operator-(const Array2D<T> &A, const Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() != m || B.dim2() != n ) + return Array2D<T>(); + + else + { + Array2D<T> C(m,n); + + for (int i=0; i<m; i++) + { + for (int j=0; j<n; j++) + C[i][j] = A[i][j] - B[i][j]; + } + return C; + } +} + + +template <class T> +Array2D<T> operator*(const Array2D<T> &A, const Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() != m || B.dim2() != n ) + return Array2D<T>(); + + else + { + Array2D<T> C(m,n); + + for (int i=0; i<m; i++) + { + for (int j=0; j<n; j++) + C[i][j] = A[i][j] * B[i][j]; + } + return C; + } +} + + + + +template <class T> +Array2D<T> operator/(const Array2D<T> &A, const Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() != m || B.dim2() != n ) + return Array2D<T>(); + + else + { + Array2D<T> C(m,n); + + for (int i=0; i<m; i++) + { + for (int j=0; j<n; j++) + C[i][j] = A[i][j] / B[i][j]; + } + return C; + } +} + + + + + +template <class T> +Array2D<T>& operator+=(Array2D<T> &A, const Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() == m || B.dim2() == n ) + { + for (int i=0; i<m; i++) + { + for (int j=0; j<n; j++) + A[i][j] += B[i][j]; + } + } + return A; +} + + + +template <class T> +Array2D<T>& operator-=(Array2D<T> &A, const Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() == m || B.dim2() == n ) + { + for (int i=0; i<m; i++) + { + for (int j=0; j<n; j++) + A[i][j] -= B[i][j]; + } + } + return A; +} + + + +template <class T> +Array2D<T>& operator*=(Array2D<T> &A, const Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() == m || B.dim2() == n ) + { + for (int i=0; i<m; i++) + { + for (int j=0; j<n; j++) + A[i][j] *= B[i][j]; + } + } + return A; +} + + + + + +template <class T> +Array2D<T>& operator/=(Array2D<T> &A, const Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() == m || B.dim2() == n ) + { + for (int i=0; i<m; i++) + { + for (int j=0; j<n; j++) + A[i][j] /= B[i][j]; + } + } + return A; +} + +/** + Matrix Multiply: compute C = A*B, where C[i][j] + is the dot-product of row i of A and column j of B. + + + @param A an (m x n) array + @param B an (n x k) array + @return the (m x k) array A*B, or a null array (0x0) + if the matrices are non-conformant (i.e. the number + of columns of A are different than the number of rows of B.) + + +*/ +template <class T> +Array2D<T> matmult(const Array2D<T> &A, const Array2D<T> &B) +{ + if (A.dim2() != B.dim1()) + return Array2D<T>(); + + int M = A.dim1(); + int N = A.dim2(); + int K = B.dim2(); + + Array2D<T> C(M,K); + + for (int i=0; i<M; i++) + for (int j=0; j<K; j++) + { + T sum = 0; + + for (int k=0; k<N; k++) + sum += A[i][k] * B [k][j]; + + C[i][j] = sum; + } + + return C; + +} + +} // namespace TNT + +#endif diff --git a/intern/smoke/intern/tnt/tnt_array3d.h b/intern/smoke/intern/tnt/tnt_array3d.h new file mode 100644 index 00000000000..c210d2ed598 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_array3d.h @@ -0,0 +1,296 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + + +#ifndef TNT_ARRAY3D_H +#define TNT_ARRAY3D_H + +#include <cstdlib> +#include <iostream> +#ifdef TNT_BOUNDS_CHECK +#include <assert.h> +#endif + +#include "tnt_array1d.h" +#include "tnt_array2d.h" + +namespace TNT +{ + +template <class T> +class Array3D +{ + + + private: + Array1D<T> data_; + Array2D<T*> v_; + int m_; + int n_; + int g_; + + + public: + + typedef T value_type; + + Array3D(); + Array3D(int m, int n, int g); + Array3D(int m, int n, int g, T val); + Array3D(int m, int n, int g, T *a); + + inline operator T***(); + inline operator const T***(); + inline Array3D(const Array3D &A); + inline Array3D & operator=(const T &a); + inline Array3D & operator=(const Array3D &A); + inline Array3D & ref(const Array3D &A); + Array3D copy() const; + Array3D & inject(const Array3D & A); + + inline T** operator[](int i); + inline const T* const * operator[](int i) const; + inline int dim1() const; + inline int dim2() const; + inline int dim3() const; + ~Array3D(); + + /* extended interface */ + + inline int ref_count(){ return data_.ref_count(); } + Array3D subarray(int i0, int i1, int j0, int j1, + int k0, int k1); +}; + +template <class T> +Array3D<T>::Array3D() : data_(), v_(), m_(0), n_(0) {} + +template <class T> +Array3D<T>::Array3D(const Array3D<T> &A) : data_(A.data_), + v_(A.v_), m_(A.m_), n_(A.n_), g_(A.g_) +{ +} + + + +template <class T> +Array3D<T>::Array3D(int m, int n, int g) : data_(m*n*g), v_(m,n), + m_(m), n_(n), g_(g) +{ + + if (m>0 && n>0 && g>0) + { + T* p = & (data_[0]); + int ng = n_*g_; + + for (int i=0; i<m_; i++) + { + T* ping = p+ i*ng; + for (int j=0; j<n; j++) + v_[i][j] = ping + j*g_; + } + } +} + + + +template <class T> +Array3D<T>::Array3D(int m, int n, int g, T val) : data_(m*n*g, val), + v_(m,n), m_(m), n_(n), g_(g) +{ + if (m>0 && n>0 && g>0) + { + + T* p = & (data_[0]); + int ng = n_*g_; + + for (int i=0; i<m_; i++) + { + T* ping = p+ i*ng; + for (int j=0; j<n; j++) + v_[i][j] = ping + j*g_; + } + } +} + + + +template <class T> +Array3D<T>::Array3D(int m, int n, int g, T* a) : + data_(m*n*g, a), v_(m,n), m_(m), n_(n), g_(g) +{ + + if (m>0 && n>0 && g>0) + { + T* p = & (data_[0]); + int ng = n_*g_; + + for (int i=0; i<m_; i++) + { + T* ping = p+ i*ng; + for (int j=0; j<n; j++) + v_[i][j] = ping + j*g_; + } + } +} + + + +template <class T> +inline T** Array3D<T>::operator[](int i) +{ +#ifdef TNT_BOUNDS_CHECK + assert(i >= 0); + assert(i < m_); +#endif + +return v_[i]; + +} + +template <class T> +inline const T* const * Array3D<T>::operator[](int i) const +{ return v_[i]; } + +template <class T> +Array3D<T> & Array3D<T>::operator=(const T &a) +{ + for (int i=0; i<m_; i++) + for (int j=0; j<n_; j++) + for (int k=0; k<g_; k++) + v_[i][j][k] = a; + + return *this; +} + +template <class T> +Array3D<T> Array3D<T>::copy() const +{ + Array3D A(m_, n_, g_); + for (int i=0; i<m_; i++) + for (int j=0; j<n_; j++) + for (int k=0; k<g_; k++) + A.v_[i][j][k] = v_[i][j][k]; + + return A; +} + + +template <class T> +Array3D<T> & Array3D<T>::inject(const Array3D &A) +{ + if (A.m_ == m_ && A.n_ == n_ && A.g_ == g_) + + for (int i=0; i<m_; i++) + for (int j=0; j<n_; j++) + for (int k=0; k<g_; k++) + v_[i][j][k] = A.v_[i][j][k]; + + return *this; +} + + + +template <class T> +Array3D<T> & Array3D<T>::ref(const Array3D<T> &A) +{ + if (this != &A) + { + m_ = A.m_; + n_ = A.n_; + g_ = A.g_; + v_ = A.v_; + data_ = A.data_; + } + return *this; +} + +template <class T> +Array3D<T> & Array3D<T>::operator=(const Array3D<T> &A) +{ + return ref(A); +} + + +template <class T> +inline int Array3D<T>::dim1() const { return m_; } + +template <class T> +inline int Array3D<T>::dim2() const { return n_; } + +template <class T> +inline int Array3D<T>::dim3() const { return g_; } + + + +template <class T> +Array3D<T>::~Array3D() {} + +template <class T> +inline Array3D<T>::operator T***() +{ + return v_; +} + + +template <class T> +inline Array3D<T>::operator const T***() +{ + return v_; +} + +/* extended interface */ +template <class T> +Array3D<T> Array3D<T>::subarray(int i0, int i1, int j0, + int j1, int k0, int k1) +{ + + /* check that ranges are valid. */ + if (!( 0 <= i0 && i0 <= i1 && i1 < m_ && + 0 <= j0 && j0 <= j1 && j1 < n_ && + 0 <= k0 && k0 <= k1 && k1 < g_)) + return Array3D<T>(); /* null array */ + + + Array3D<T> A; + A.data_ = data_; + A.m_ = i1-i0+1; + A.n_ = j1-j0+1; + A.g_ = k1-k0+1; + A.v_ = Array2D<T*>(A.m_,A.n_); + T* p = &(data_[0]) + i0*n_*g_ + j0*g_ + k0; + + for (int i=0; i<A.m_; i++) + { + T* ping = p + i*n_*g_; + for (int j=0; j<A.n_; j++) + A.v_[i][j] = ping + j*g_ ; + } + + return A; +} + + + +} /* namespace TNT */ + +#endif +/* TNT_ARRAY3D_H */ + diff --git a/intern/smoke/intern/tnt/tnt_array3d_utils.h b/intern/smoke/intern/tnt/tnt_array3d_utils.h new file mode 100644 index 00000000000..5acdc1d5dd2 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_array3d_utils.h @@ -0,0 +1,236 @@ + + +#ifndef TNT_ARRAY3D_UTILS_H +#define TNT_ARRAY3D_UTILS_H + +#include <cstdlib> +#include <cassert> + +namespace TNT +{ + + +template <class T> +std::ostream& operator<<(std::ostream &s, const Array3D<T> &A) +{ + int M=A.dim1(); + int N=A.dim2(); + int K=A.dim3(); + + s << M << " " << N << " " << K << "\n"; + + for (int i=0; i<M; i++) + { + for (int j=0; j<N; j++) + { + for (int k=0; k<K; k++) + s << A[i][j][k] << " "; + s << "\n"; + } + s << "\n"; + } + + + return s; +} + +template <class T> +std::istream& operator>>(std::istream &s, Array3D<T> &A) +{ + + int M, N, K; + + s >> M >> N >> K; + + Array3D<T> B(M,N,K); + + for (int i=0; i<M; i++) + for (int j=0; j<N; j++) + for (int k=0; k<K; k++) + s >> B[i][j][k]; + + A = B; + return s; +} + + + +template <class T> +Array3D<T> operator+(const Array3D<T> &A, const Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() != m || B.dim2() != n || B.dim3() != p ) + return Array3D<T>(); + + else + { + Array3D<T> C(m,n,p); + + for (int i=0; i<m; i++) + for (int j=0; j<n; j++) + for (int k=0; k<p; k++) + C[i][j][k] = A[i][j][k] + B[i][j][k]; + + return C; + } +} + + +template <class T> +Array3D<T> operator-(const Array3D<T> &A, const Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() != m || B.dim2() != n || B.dim3() != p ) + return Array3D<T>(); + + else + { + Array3D<T> C(m,n,p); + + for (int i=0; i<m; i++) + for (int j=0; j<n; j++) + for (int k=0; k<p; k++) + C[i][j][k] = A[i][j][k] - B[i][j][k]; + + return C; + } +} + + + + +template <class T> +Array3D<T> operator*(const Array3D<T> &A, const Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() != m || B.dim2() != n || B.dim3() != p ) + return Array3D<T>(); + + else + { + Array3D<T> C(m,n,p); + + for (int i=0; i<m; i++) + for (int j=0; j<n; j++) + for (int k=0; k<p; k++) + C[i][j][k] = A[i][j][k] * B[i][j][k]; + + return C; + } +} + + +template <class T> +Array3D<T> operator/(const Array3D<T> &A, const Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() != m || B.dim2() != n || B.dim3() != p ) + return Array3D<T>(); + + else + { + Array3D<T> C(m,n,p); + + for (int i=0; i<m; i++) + for (int j=0; j<n; j++) + for (int k=0; k<p; k++) + C[i][j][k] = A[i][j][k] / B[i][j][k]; + + return C; + } +} + + + +template <class T> +Array3D<T>& operator+=(Array3D<T> &A, const Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() == m && B.dim2() == n && B.dim3() == p ) + { + for (int i=0; i<m; i++) + for (int j=0; j<n; j++) + for (int k=0; k<p; k++) + A[i][j][k] += B[i][j][k]; + } + + return A; +} + +template <class T> +Array3D<T>& operator-=(Array3D<T> &A, const Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() == m && B.dim2() == n && B.dim3() == p ) + { + for (int i=0; i<m; i++) + for (int j=0; j<n; j++) + for (int k=0; k<p; k++) + A[i][j][k] -= B[i][j][k]; + } + + return A; +} + +template <class T> +Array3D<T>& operator*=(Array3D<T> &A, const Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() == m && B.dim2() == n && B.dim3() == p ) + { + for (int i=0; i<m; i++) + for (int j=0; j<n; j++) + for (int k=0; k<p; k++) + A[i][j][k] *= B[i][j][k]; + } + + return A; +} + + +template <class T> +Array3D<T>& operator/=(Array3D<T> &A, const Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() == m && B.dim2() == n && B.dim3() == p ) + { + for (int i=0; i<m; i++) + for (int j=0; j<n; j++) + for (int k=0; k<p; k++) + A[i][j][k] /= B[i][j][k]; + } + + return A; +} + + + + + +} // namespace TNT + +#endif diff --git a/intern/smoke/intern/tnt/tnt_cmat.h b/intern/smoke/intern/tnt/tnt_cmat.h new file mode 100644 index 00000000000..5ff4c4898c3 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_cmat.h @@ -0,0 +1,580 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + +// C compatible matrix: row-oriented, 0-based [i][j] and 1-based (i,j) indexing +// + +#ifndef TNT_CMAT_H +#define TNT_CMAT_H + +#include "tnt_subscript.h" +#include "tnt_vec.h" +#include <cstdlib> +#include <cassert> +#include <iostream> +#include <sstream> + +namespace TNT +{ + + +template <class T> +class Matrix +{ + + + public: + + typedef Subscript size_type; + typedef T value_type; + typedef T element_type; + typedef T* pointer; + typedef T* iterator; + typedef T& reference; + typedef const T* const_iterator; + typedef const T& const_reference; + + Subscript lbound() const { return 1;} + + protected: + Subscript m_; + Subscript n_; + Subscript mn_; // total size + T* v_; + T** row_; + T* vm1_ ; // these point to the same data, but are 1-based + T** rowm1_; + + // internal helper function to create the array + // of row pointers + + void initialize(Subscript M, Subscript N) + { + mn_ = M*N; + m_ = M; + n_ = N; + + v_ = new T[mn_]; + row_ = new T*[M]; + rowm1_ = new T*[M]; + + assert(v_ != NULL); + assert(row_ != NULL); + assert(rowm1_ != NULL); + + T* p = v_; + vm1_ = v_ - 1; + for (Subscript i=0; i<M; i++) + { + row_[i] = p; + rowm1_[i] = p-1; + p += N ; + + } + + rowm1_ -- ; // compensate for 1-based offset + } + + void copy(const T* v) + { + Subscript N = m_ * n_; + Subscript i; + +#ifdef TNT_UNROLL_LOOPS + Subscript Nmod4 = N & 3; + Subscript N4 = N - Nmod4; + + for (i=0; i<N4; i+=4) + { + v_[i] = v[i]; + v_[i+1] = v[i+1]; + v_[i+2] = v[i+2]; + v_[i+3] = v[i+3]; + } + + for (i=N4; i< N; i++) + v_[i] = v[i]; +#else + + for (i=0; i< N; i++) + v_[i] = v[i]; +#endif + } + + void set(const T& val) + { + Subscript N = m_ * n_; + Subscript i; + +#ifdef TNT_UNROLL_LOOPS + Subscript Nmod4 = N & 3; + Subscript N4 = N - Nmod4; + + for (i=0; i<N4; i+=4) + { + v_[i] = val; + v_[i+1] = val; + v_[i+2] = val; + v_[i+3] = val; + } + + for (i=N4; i< N; i++) + v_[i] = val; +#else + + for (i=0; i< N; i++) + v_[i] = val; + +#endif + } + + + + void destroy() + { + /* do nothing, if no memory has been previously allocated */ + if (v_ == NULL) return ; + + /* if we are here, then matrix was previously allocated */ + if (v_ != NULL) delete [] (v_); + if (row_ != NULL) delete [] (row_); + + /* return rowm1_ back to original value */ + rowm1_ ++; + if (rowm1_ != NULL ) delete [] (rowm1_); + } + + + public: + + operator T**(){ return row_; } + operator T**() const { return row_; } + + + Subscript size() const { return mn_; } + + // constructors + + Matrix() : m_(0), n_(0), mn_(0), v_(0), row_(0), vm1_(0), rowm1_(0) {}; + + Matrix(const Matrix<T> &A) + { + initialize(A.m_, A.n_); + copy(A.v_); + } + + Matrix(Subscript M, Subscript N, const T& value = T()) + { + initialize(M,N); + set(value); + } + + Matrix(Subscript M, Subscript N, const T* v) + { + initialize(M,N); + copy(v); + } + + Matrix(Subscript M, Subscript N, const char *s) + { + initialize(M,N); + //std::istrstream ins(s); + std::istringstream ins(s); + + Subscript i, j; + + for (i=0; i<M; i++) + for (j=0; j<N; j++) + ins >> row_[i][j]; + } + + // destructor + // + ~Matrix() + { + destroy(); + } + + + // reallocating + // + Matrix<T>& newsize(Subscript M, Subscript N) + { + if (num_rows() == M && num_cols() == N) + return *this; + + destroy(); + initialize(M,N); + + return *this; + } + + + + + // assignments + // + Matrix<T>& operator=(const Matrix<T> &A) + { + if (v_ == A.v_) + return *this; + + if (m_ == A.m_ && n_ == A.n_) // no need to re-alloc + copy(A.v_); + + else + { + destroy(); + initialize(A.m_, A.n_); + copy(A.v_); + } + + return *this; + } + + Matrix<T>& operator=(const T& scalar) + { + set(scalar); + return *this; + } + + + Subscript dim(Subscript d) const + { +#ifdef TNT_BOUNDS_CHECK + assert( d >= 1); + assert( d <= 2); +#endif + return (d==1) ? m_ : ((d==2) ? n_ : 0); + } + + Subscript num_rows() const { return m_; } + Subscript num_cols() const { return n_; } + + + + + inline T* operator[](Subscript i) + { +#ifdef TNT_BOUNDS_CHECK + assert(0<=i); + assert(i < m_) ; +#endif + return row_[i]; + } + + inline const T* operator[](Subscript i) const + { +#ifdef TNT_BOUNDS_CHECK + assert(0<=i); + assert(i < m_) ; +#endif + return row_[i]; + } + + inline reference operator()(Subscript i) + { +#ifdef TNT_BOUNDS_CHECK + assert(1<=i); + assert(i <= mn_) ; +#endif + return vm1_[i]; + } + + inline const_reference operator()(Subscript i) const + { +#ifdef TNT_BOUNDS_CHECK + assert(1<=i); + assert(i <= mn_) ; +#endif + return vm1_[i]; + } + + + + inline reference operator()(Subscript i, Subscript j) + { +#ifdef TNT_BOUNDS_CHECK + assert(1<=i); + assert(i <= m_) ; + assert(1<=j); + assert(j <= n_); +#endif + return rowm1_[i][j]; + } + + + + inline const_reference operator() (Subscript i, Subscript j) const + { +#ifdef TNT_BOUNDS_CHECK + assert(1<=i); + assert(i <= m_) ; + assert(1<=j); + assert(j <= n_); +#endif + return rowm1_[i][j]; + } + + + + +}; + + +/* *************************** I/O ********************************/ + +template <class T> +std::ostream& operator<<(std::ostream &s, const Matrix<T> &A) +{ + Subscript M=A.num_rows(); + Subscript N=A.num_cols(); + + s << M << " " << N << "\n"; + + for (Subscript i=0; i<M; i++) + { + for (Subscript j=0; j<N; j++) + { + s << A[i][j] << " "; + } + s << "\n"; + } + + + return s; +} + +template <class T> +std::istream& operator>>(std::istream &s, Matrix<T> &A) +{ + + Subscript M, N; + + s >> M >> N; + + if ( !(M == A.num_rows() && N == A.num_cols() )) + { + A.newsize(M,N); + } + + + for (Subscript i=0; i<M; i++) + for (Subscript j=0; j<N; j++) + { + s >> A[i][j]; + } + + + return s; +} + +// *******************[ basic matrix algorithms ]*************************** + + +template <class T> +Matrix<T> operator+(const Matrix<T> &A, + const Matrix<T> &B) +{ + Subscript M = A.num_rows(); + Subscript N = A.num_cols(); + + assert(M==B.num_rows()); + assert(N==B.num_cols()); + + Matrix<T> tmp(M,N); + Subscript i,j; + + for (i=0; i<M; i++) + for (j=0; j<N; j++) + tmp[i][j] = A[i][j] + B[i][j]; + + return tmp; +} + +template <class T> +Matrix<T> operator-(const Matrix<T> &A, + const Matrix<T> &B) +{ + Subscript M = A.num_rows(); + Subscript N = A.num_cols(); + + assert(M==B.num_rows()); + assert(N==B.num_cols()); + + Matrix<T> tmp(M,N); + Subscript i,j; + + for (i=0; i<M; i++) + for (j=0; j<N; j++) + tmp[i][j] = A[i][j] - B[i][j]; + + return tmp; +} + +template <class T> +Matrix<T> mult_element(const Matrix<T> &A, + const Matrix<T> &B) +{ + Subscript M = A.num_rows(); + Subscript N = A.num_cols(); + + assert(M==B.num_rows()); + assert(N==B.num_cols()); + + Matrix<T> tmp(M,N); + Subscript i,j; + + for (i=0; i<M; i++) + for (j=0; j<N; j++) + tmp[i][j] = A[i][j] * B[i][j]; + + return tmp; +} + + +template <class T> +Matrix<T> transpose(const Matrix<T> &A) +{ + Subscript M = A.num_rows(); + Subscript N = A.num_cols(); + + Matrix<T> S(N,M); + Subscript i, j; + + for (i=0; i<M; i++) + for (j=0; j<N; j++) + S[j][i] = A[i][j]; + + return S; +} + + + +template <class T> +inline Matrix<T> matmult(const Matrix<T> &A, + const Matrix<T> &B) +{ + +#ifdef TNT_BOUNDS_CHECK + assert(A.num_cols() == B.num_rows()); +#endif + + Subscript M = A.num_rows(); + Subscript N = A.num_cols(); + Subscript K = B.num_cols(); + + Matrix<T> tmp(M,K); + T sum; + + for (Subscript i=0; i<M; i++) + for (Subscript k=0; k<K; k++) + { + sum = 0; + for (Subscript j=0; j<N; j++) + sum = sum + A[i][j] * B[j][k]; + + tmp[i][k] = sum; + } + + return tmp; +} + +template <class T> +inline Matrix<T> operator*(const Matrix<T> &A, + const Matrix<T> &B) +{ + return matmult(A,B); +} + +template <class T> +inline int matmult(Matrix<T>& C, const Matrix<T> &A, + const Matrix<T> &B) +{ + + assert(A.num_cols() == B.num_rows()); + + Subscript M = A.num_rows(); + Subscript N = A.num_cols(); + Subscript K = B.num_cols(); + + C.newsize(M,K); + + T sum; + + const T* row_i; + const T* col_k; + + for (Subscript i=0; i<M; i++) + for (Subscript k=0; k<K; k++) + { + row_i = &(A[i][0]); + col_k = &(B[0][k]); + sum = 0; + for (Subscript j=0; j<N; j++) + { + sum += *row_i * *col_k; + row_i++; + col_k += K; + } + C[i][k] = sum; + } + + return 0; +} + + +template <class T> +Vector<T> matmult(const Matrix<T> &A, const Vector<T> &x) +{ + +#ifdef TNT_BOUNDS_CHECK + assert(A.num_cols() == x.dim()); +#endif + + Subscript M = A.num_rows(); + Subscript N = A.num_cols(); + + Vector<T> tmp(M); + T sum; + + for (Subscript i=0; i<M; i++) + { + sum = 0; + const T* rowi = A[i]; + for (Subscript j=0; j<N; j++) + sum = sum + rowi[j] * x[j]; + + tmp[i] = sum; + } + + return tmp; +} + +template <class T> +inline Vector<T> operator*(const Matrix<T> &A, const Vector<T> &x) +{ + return matmult(A,x); +} + +} // namespace TNT + +#endif +// CMAT_H diff --git a/intern/smoke/intern/tnt/tnt_fortran_array1d.h b/intern/smoke/intern/tnt/tnt_fortran_array1d.h new file mode 100644 index 00000000000..ad3bba0c0a7 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_fortran_array1d.h @@ -0,0 +1,267 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + + +#ifndef TNT_FORTRAN_ARRAY1D_H +#define TNT_FORTRAN_ARRAY1D_H + +#include <cstdlib> +#include <iostream> + +#ifdef TNT_BOUNDS_CHECK +#include <assert.h> +#endif + + +#include "tnt_i_refvec.h" + +namespace TNT +{ + +template <class T> +class Fortran_Array1D +{ + + private: + + i_refvec<T> v_; + int n_; + T* data_; /* this normally points to v_.begin(), but + * could also point to a portion (subvector) + * of v_. + */ + + void initialize_(int n); + void copy_(T* p, const T* q, int len) const; + void set_(T* begin, T* end, const T& val); + + + public: + + typedef T value_type; + + + Fortran_Array1D(); + explicit Fortran_Array1D(int n); + Fortran_Array1D(int n, const T &a); + Fortran_Array1D(int n, T *a); + inline Fortran_Array1D(const Fortran_Array1D &A); + inline Fortran_Array1D & operator=(const T &a); + inline Fortran_Array1D & operator=(const Fortran_Array1D &A); + inline Fortran_Array1D & ref(const Fortran_Array1D &A); + Fortran_Array1D copy() const; + Fortran_Array1D & inject(const Fortran_Array1D & A); + inline T& operator()(int i); + inline const T& operator()(int i) const; + inline int dim1() const; + inline int dim() const; + ~Fortran_Array1D(); + + + /* ... extended interface ... */ + + inline int ref_count() const; + inline Fortran_Array1D<T> subarray(int i0, int i1); + +}; + + + + +template <class T> +Fortran_Array1D<T>::Fortran_Array1D() : v_(), n_(0), data_(0) {} + +template <class T> +Fortran_Array1D<T>::Fortran_Array1D(const Fortran_Array1D<T> &A) : v_(A.v_), n_(A.n_), + data_(A.data_) +{ +#ifdef TNT_DEBUG + std::cout << "Created Fortran_Array1D(const Fortran_Array1D<T> &A) \n"; +#endif + +} + + +template <class T> +Fortran_Array1D<T>::Fortran_Array1D(int n) : v_(n), n_(n), data_(v_.begin()) +{ +#ifdef TNT_DEBUG + std::cout << "Created Fortran_Array1D(int n) \n"; +#endif +} + +template <class T> +Fortran_Array1D<T>::Fortran_Array1D(int n, const T &val) : v_(n), n_(n), data_(v_.begin()) +{ +#ifdef TNT_DEBUG + std::cout << "Created Fortran_Array1D(int n, const T& val) \n"; +#endif + set_(data_, data_+ n, val); + +} + +template <class T> +Fortran_Array1D<T>::Fortran_Array1D(int n, T *a) : v_(a), n_(n) , data_(v_.begin()) +{ +#ifdef TNT_DEBUG + std::cout << "Created Fortran_Array1D(int n, T* a) \n"; +#endif +} + +template <class T> +inline T& Fortran_Array1D<T>::operator()(int i) +{ +#ifdef TNT_BOUNDS_CHECK + assert(i>= 1); + assert(i <= n_); +#endif + return data_[i-1]; +} + +template <class T> +inline const T& Fortran_Array1D<T>::operator()(int i) const +{ +#ifdef TNT_BOUNDS_CHECK + assert(i>= 1); + assert(i <= n_); +#endif + return data_[i-1]; +} + + + + +template <class T> +Fortran_Array1D<T> & Fortran_Array1D<T>::operator=(const T &a) +{ + set_(data_, data_+n_, a); + return *this; +} + +template <class T> +Fortran_Array1D<T> Fortran_Array1D<T>::copy() const +{ + Fortran_Array1D A( n_); + copy_(A.data_, data_, n_); + + return A; +} + + +template <class T> +Fortran_Array1D<T> & Fortran_Array1D<T>::inject(const Fortran_Array1D &A) +{ + if (A.n_ == n_) + copy_(data_, A.data_, n_); + + return *this; +} + + + + + +template <class T> +Fortran_Array1D<T> & Fortran_Array1D<T>::ref(const Fortran_Array1D<T> &A) +{ + if (this != &A) + { + v_ = A.v_; /* operator= handles the reference counting. */ + n_ = A.n_; + data_ = A.data_; + + } + return *this; +} + +template <class T> +Fortran_Array1D<T> & Fortran_Array1D<T>::operator=(const Fortran_Array1D<T> &A) +{ + return ref(A); +} + +template <class T> +inline int Fortran_Array1D<T>::dim1() const { return n_; } + +template <class T> +inline int Fortran_Array1D<T>::dim() const { return n_; } + +template <class T> +Fortran_Array1D<T>::~Fortran_Array1D() {} + + +/* ............................ exented interface ......................*/ + +template <class T> +inline int Fortran_Array1D<T>::ref_count() const +{ + return v_.ref_count(); +} + +template <class T> +inline Fortran_Array1D<T> Fortran_Array1D<T>::subarray(int i0, int i1) +{ +#ifdef TNT_DEBUG + std::cout << "entered subarray. \n"; +#endif + if ((i0 > 0) && (i1 < n_) || (i0 <= i1)) + { + Fortran_Array1D<T> X(*this); /* create a new instance of this array. */ + X.n_ = i1-i0+1; + X.data_ += i0; + + return X; + } + else + { +#ifdef TNT_DEBUG + std::cout << "subarray: null return.\n"; +#endif + return Fortran_Array1D<T>(); + } +} + + +/* private internal functions */ + + +template <class T> +void Fortran_Array1D<T>::set_(T* begin, T* end, const T& a) +{ + for (T* p=begin; p<end; p++) + *p = a; + +} + +template <class T> +void Fortran_Array1D<T>::copy_(T* p, const T* q, int len) const +{ + T *end = p + len; + while (p<end ) + *p++ = *q++; + +} + + +} /* namespace TNT */ + +#endif +/* TNT_FORTRAN_ARRAY1D_H */ + diff --git a/intern/smoke/intern/tnt/tnt_fortran_array1d_utils.h b/intern/smoke/intern/tnt/tnt_fortran_array1d_utils.h new file mode 100644 index 00000000000..b037b173f77 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_fortran_array1d_utils.h @@ -0,0 +1,242 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + +#ifndef TNT_FORTRAN_ARRAY1D_UTILS_H +#define TNT_FORTRAN_ARRAY1D_UTILS_H + +#include <iostream> + +namespace TNT +{ + + +/** + Write an array to a character outstream. Output format is one that can + be read back in via the in-stream operator: one integer + denoting the array dimension (n), followed by n elements, + one per line. + +*/ +template <class T> +std::ostream& operator<<(std::ostream &s, const Fortran_Array1D<T> &A) +{ + int N=A.dim1(); + + s << N << "\n"; + for (int j=1; j<=N; j++) + { + s << A(j) << "\n"; + } + s << "\n"; + + return s; +} + +/** + Read an array from a character stream. Input format + is one integer, denoting the dimension (n), followed + by n whitespace-separated elments. Newlines are ignored + + <p> + Note: the array being read into references new memory + storage. If the intent is to fill an existing conformant + array, use <code> cin >> B; A.inject(B) ); </code> + instead or read the elements in one-a-time by hand. + + @param s the charater to read from (typically <code>std::in</code>) + @param A the array to read into. +*/ +template <class T> +std::istream& operator>>(std::istream &s, Fortran_Array1D<T> &A) +{ + int N; + s >> N; + + Fortran_Array1D<T> B(N); + for (int i=1; i<=N; i++) + s >> B(i); + A = B; + return s; +} + + +template <class T> +Fortran_Array1D<T> operator+(const Fortran_Array1D<T> &A, const Fortran_Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() != n ) + return Fortran_Array1D<T>(); + + else + { + Fortran_Array1D<T> C(n); + + for (int i=1; i<=n; i++) + { + C(i) = A(i) + B(i); + } + return C; + } +} + + + +template <class T> +Fortran_Array1D<T> operator-(const Fortran_Array1D<T> &A, const Fortran_Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() != n ) + return Fortran_Array1D<T>(); + + else + { + Fortran_Array1D<T> C(n); + + for (int i=1; i<=n; i++) + { + C(i) = A(i) - B(i); + } + return C; + } +} + + +template <class T> +Fortran_Array1D<T> operator*(const Fortran_Array1D<T> &A, const Fortran_Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() != n ) + return Fortran_Array1D<T>(); + + else + { + Fortran_Array1D<T> C(n); + + for (int i=1; i<=n; i++) + { + C(i) = A(i) * B(i); + } + return C; + } +} + + +template <class T> +Fortran_Array1D<T> operator/(const Fortran_Array1D<T> &A, const Fortran_Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() != n ) + return Fortran_Array1D<T>(); + + else + { + Fortran_Array1D<T> C(n); + + for (int i=1; i<=n; i++) + { + C(i) = A(i) / B(i); + } + return C; + } +} + + + + + + + + + +template <class T> +Fortran_Array1D<T>& operator+=(Fortran_Array1D<T> &A, const Fortran_Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() == n) + { + for (int i=1; i<=n; i++) + { + A(i) += B(i); + } + } + return A; +} + + + + +template <class T> +Fortran_Array1D<T>& operator-=(Fortran_Array1D<T> &A, const Fortran_Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() == n) + { + for (int i=1; i<=n; i++) + { + A(i) -= B(i); + } + } + return A; +} + + + +template <class T> +Fortran_Array1D<T>& operator*=(Fortran_Array1D<T> &A, const Fortran_Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() == n) + { + for (int i=1; i<=n; i++) + { + A(i) *= B(i); + } + } + return A; +} + + + + +template <class T> +Fortran_Array1D<T>& operator/=(Fortran_Array1D<T> &A, const Fortran_Array1D<T> &B) +{ + int n = A.dim1(); + + if (B.dim1() == n) + { + for (int i=1; i<=n; i++) + { + A(i) /= B(i); + } + } + return A; +} + + +} // namespace TNT + +#endif diff --git a/intern/smoke/intern/tnt/tnt_fortran_array2d.h b/intern/smoke/intern/tnt/tnt_fortran_array2d.h new file mode 100644 index 00000000000..f3075366d37 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_fortran_array2d.h @@ -0,0 +1,225 @@ +/* +* +* Template Numerical Toolkit (TNT): Two-dimensional Fortran numerical array +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + + +#ifndef TNT_FORTRAN_ARRAY2D_H +#define TNT_FORTRAN_ARRAY2D_H + +#include <cstdlib> +#include <iostream> + +#ifdef TNT_BOUNDS_CHECK +#include <assert.h> +#endif + +#include "tnt_i_refvec.h" + +namespace TNT +{ + +template <class T> +class Fortran_Array2D +{ + + + private: + i_refvec<T> v_; + int m_; + int n_; + T* data_; + + + void initialize_(int n); + void copy_(T* p, const T* q, int len); + void set_(T* begin, T* end, const T& val); + + public: + + typedef T value_type; + + Fortran_Array2D(); + Fortran_Array2D(int m, int n); + Fortran_Array2D(int m, int n, T *a); + Fortran_Array2D(int m, int n, const T &a); + inline Fortran_Array2D(const Fortran_Array2D &A); + inline Fortran_Array2D & operator=(const T &a); + inline Fortran_Array2D & operator=(const Fortran_Array2D &A); + inline Fortran_Array2D & ref(const Fortran_Array2D &A); + Fortran_Array2D copy() const; + Fortran_Array2D & inject(const Fortran_Array2D & A); + inline T& operator()(int i, int j); + inline const T& operator()(int i, int j) const ; + inline int dim1() const; + inline int dim2() const; + ~Fortran_Array2D(); + + /* extended interface */ + + inline int ref_count() const; + +}; + +template <class T> +Fortran_Array2D<T>::Fortran_Array2D() : v_(), m_(0), n_(0), data_(0) {} + + +template <class T> +Fortran_Array2D<T>::Fortran_Array2D(const Fortran_Array2D<T> &A) : v_(A.v_), + m_(A.m_), n_(A.n_), data_(A.data_) {} + + + +template <class T> +Fortran_Array2D<T>::Fortran_Array2D(int m, int n) : v_(m*n), m_(m), n_(n), + data_(v_.begin()) {} + +template <class T> +Fortran_Array2D<T>::Fortran_Array2D(int m, int n, const T &val) : + v_(m*n), m_(m), n_(n), data_(v_.begin()) +{ + set_(data_, data_+m*n, val); +} + + +template <class T> +Fortran_Array2D<T>::Fortran_Array2D(int m, int n, T *a) : v_(a), + m_(m), n_(n), data_(v_.begin()) {} + + + + +template <class T> +inline T& Fortran_Array2D<T>::operator()(int i, int j) +{ +#ifdef TNT_BOUNDS_CHECK + assert(i >= 1); + assert(i <= m_); + assert(j >= 1); + assert(j <= n_); +#endif + + return v_[ (j-1)*m_ + (i-1) ]; + +} + +template <class T> +inline const T& Fortran_Array2D<T>::operator()(int i, int j) const +{ +#ifdef TNT_BOUNDS_CHECK + assert(i >= 1); + assert(i <= m_); + assert(j >= 1); + assert(j <= n_); +#endif + + return v_[ (j-1)*m_ + (i-1) ]; + +} + + +template <class T> +Fortran_Array2D<T> & Fortran_Array2D<T>::operator=(const T &a) +{ + set_(data_, data_+m_*n_, a); + return *this; +} + +template <class T> +Fortran_Array2D<T> Fortran_Array2D<T>::copy() const +{ + + Fortran_Array2D B(m_,n_); + + B.inject(*this); + return B; +} + + +template <class T> +Fortran_Array2D<T> & Fortran_Array2D<T>::inject(const Fortran_Array2D &A) +{ + if (m_ == A.m_ && n_ == A.n_) + copy_(data_, A.data_, m_*n_); + + return *this; +} + + + +template <class T> +Fortran_Array2D<T> & Fortran_Array2D<T>::ref(const Fortran_Array2D<T> &A) +{ + if (this != &A) + { + v_ = A.v_; + m_ = A.m_; + n_ = A.n_; + data_ = A.data_; + } + return *this; +} + +template <class T> +Fortran_Array2D<T> & Fortran_Array2D<T>::operator=(const Fortran_Array2D<T> &A) +{ + return ref(A); +} + +template <class T> +inline int Fortran_Array2D<T>::dim1() const { return m_; } + +template <class T> +inline int Fortran_Array2D<T>::dim2() const { return n_; } + + +template <class T> +Fortran_Array2D<T>::~Fortran_Array2D() +{ +} + +template <class T> +inline int Fortran_Array2D<T>::ref_count() const { return v_.ref_count(); } + + + + +template <class T> +void Fortran_Array2D<T>::set_(T* begin, T* end, const T& a) +{ + for (T* p=begin; p<end; p++) + *p = a; + +} + +template <class T> +void Fortran_Array2D<T>::copy_(T* p, const T* q, int len) +{ + T *end = p + len; + while (p<end ) + *p++ = *q++; + +} + + +} /* namespace TNT */ + +#endif +/* TNT_FORTRAN_ARRAY2D_H */ + diff --git a/intern/smoke/intern/tnt/tnt_fortran_array2d_utils.h b/intern/smoke/intern/tnt/tnt_fortran_array2d_utils.h new file mode 100644 index 00000000000..bb6867368cf --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_fortran_array2d_utils.h @@ -0,0 +1,236 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + +#ifndef TNT_FORTRAN_ARRAY2D_UTILS_H +#define TNT_FORTRAN_ARRAY2D_UTILS_H + +#include <iostream> + +namespace TNT +{ + + +template <class T> +std::ostream& operator<<(std::ostream &s, const Fortran_Array2D<T> &A) +{ + int M=A.dim1(); + int N=A.dim2(); + + s << M << " " << N << "\n"; + + for (int i=1; i<=M; i++) + { + for (int j=1; j<=N; j++) + { + s << A(i,j) << " "; + } + s << "\n"; + } + + + return s; +} + +template <class T> +std::istream& operator>>(std::istream &s, Fortran_Array2D<T> &A) +{ + + int M, N; + + s >> M >> N; + + Fortran_Array2D<T> B(M,N); + + for (int i=1; i<=M; i++) + for (int j=1; j<=N; j++) + { + s >> B(i,j); + } + + A = B; + return s; +} + + + + +template <class T> +Fortran_Array2D<T> operator+(const Fortran_Array2D<T> &A, const Fortran_Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() != m || B.dim2() != n ) + return Fortran_Array2D<T>(); + + else + { + Fortran_Array2D<T> C(m,n); + + for (int i=1; i<=m; i++) + { + for (int j=1; j<=n; j++) + C(i,j) = A(i,j) + B(i,j); + } + return C; + } +} + +template <class T> +Fortran_Array2D<T> operator-(const Fortran_Array2D<T> &A, const Fortran_Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() != m || B.dim2() != n ) + return Fortran_Array2D<T>(); + + else + { + Fortran_Array2D<T> C(m,n); + + for (int i=1; i<=m; i++) + { + for (int j=1; j<=n; j++) + C(i,j) = A(i,j) - B(i,j); + } + return C; + } +} + + +template <class T> +Fortran_Array2D<T> operator*(const Fortran_Array2D<T> &A, const Fortran_Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() != m || B.dim2() != n ) + return Fortran_Array2D<T>(); + + else + { + Fortran_Array2D<T> C(m,n); + + for (int i=1; i<=m; i++) + { + for (int j=1; j<=n; j++) + C(i,j) = A(i,j) * B(i,j); + } + return C; + } +} + + +template <class T> +Fortran_Array2D<T> operator/(const Fortran_Array2D<T> &A, const Fortran_Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() != m || B.dim2() != n ) + return Fortran_Array2D<T>(); + + else + { + Fortran_Array2D<T> C(m,n); + + for (int i=1; i<=m; i++) + { + for (int j=1; j<=n; j++) + C(i,j) = A(i,j) / B(i,j); + } + return C; + } +} + + + +template <class T> +Fortran_Array2D<T>& operator+=(Fortran_Array2D<T> &A, const Fortran_Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() == m || B.dim2() == n ) + { + for (int i=1; i<=m; i++) + { + for (int j=1; j<=n; j++) + A(i,j) += B(i,j); + } + } + return A; +} + +template <class T> +Fortran_Array2D<T>& operator-=(Fortran_Array2D<T> &A, const Fortran_Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() == m || B.dim2() == n ) + { + for (int i=1; i<=m; i++) + { + for (int j=1; j<=n; j++) + A(i,j) -= B(i,j); + } + } + return A; +} + +template <class T> +Fortran_Array2D<T>& operator*=(Fortran_Array2D<T> &A, const Fortran_Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() == m || B.dim2() == n ) + { + for (int i=1; i<=m; i++) + { + for (int j=1; j<=n; j++) + A(i,j) *= B(i,j); + } + } + return A; +} + +template <class T> +Fortran_Array2D<T>& operator/=(Fortran_Array2D<T> &A, const Fortran_Array2D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + + if (B.dim1() == m || B.dim2() == n ) + { + for (int i=1; i<=m; i++) + { + for (int j=1; j<=n; j++) + A(i,j) /= B(i,j); + } + } + return A; +} + +} // namespace TNT + +#endif diff --git a/intern/smoke/intern/tnt/tnt_fortran_array3d.h b/intern/smoke/intern/tnt/tnt_fortran_array3d.h new file mode 100644 index 00000000000..e51affba4ea --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_fortran_array3d.h @@ -0,0 +1,223 @@ +/* +* +* Template Numerical Toolkit (TNT): Three-dimensional Fortran numerical array +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + + +#ifndef TNT_FORTRAN_ARRAY3D_H +#define TNT_FORTRAN_ARRAY3D_H + +#include <cstdlib> +#include <iostream> +#ifdef TNT_BOUNDS_CHECK +#include <assert.h> +#endif +#include "tnt_i_refvec.h" + +namespace TNT +{ + +template <class T> +class Fortran_Array3D +{ + + + private: + + + i_refvec<T> v_; + int m_; + int n_; + int k_; + T* data_; + + public: + + typedef T value_type; + + Fortran_Array3D(); + Fortran_Array3D(int m, int n, int k); + Fortran_Array3D(int m, int n, int k, T *a); + Fortran_Array3D(int m, int n, int k, const T &a); + inline Fortran_Array3D(const Fortran_Array3D &A); + inline Fortran_Array3D & operator=(const T &a); + inline Fortran_Array3D & operator=(const Fortran_Array3D &A); + inline Fortran_Array3D & ref(const Fortran_Array3D &A); + Fortran_Array3D copy() const; + Fortran_Array3D & inject(const Fortran_Array3D & A); + inline T& operator()(int i, int j, int k); + inline const T& operator()(int i, int j, int k) const ; + inline int dim1() const; + inline int dim2() const; + inline int dim3() const; + inline int ref_count() const; + ~Fortran_Array3D(); + + +}; + +template <class T> +Fortran_Array3D<T>::Fortran_Array3D() : v_(), m_(0), n_(0), k_(0), data_(0) {} + + +template <class T> +Fortran_Array3D<T>::Fortran_Array3D(const Fortran_Array3D<T> &A) : + v_(A.v_), m_(A.m_), n_(A.n_), k_(A.k_), data_(A.data_) {} + + + +template <class T> +Fortran_Array3D<T>::Fortran_Array3D(int m, int n, int k) : + v_(m*n*k), m_(m), n_(n), k_(k), data_(v_.begin()) {} + + + +template <class T> +Fortran_Array3D<T>::Fortran_Array3D(int m, int n, int k, const T &val) : + v_(m*n*k), m_(m), n_(n), k_(k), data_(v_.begin()) +{ + for (T* p = data_; p < data_ + m*n*k; p++) + *p = val; +} + +template <class T> +Fortran_Array3D<T>::Fortran_Array3D(int m, int n, int k, T *a) : + v_(a), m_(m), n_(n), k_(k), data_(v_.begin()) {} + + + + +template <class T> +inline T& Fortran_Array3D<T>::operator()(int i, int j, int k) +{ +#ifdef TNT_BOUNDS_CHECK + assert(i >= 1); + assert(i <= m_); + assert(j >= 1); + assert(j <= n_); + assert(k >= 1); + assert(k <= k_); +#endif + + return data_[(k-1)*m_*n_ + (j-1) * m_ + i-1]; + +} + +template <class T> +inline const T& Fortran_Array3D<T>::operator()(int i, int j, int k) const +{ +#ifdef TNT_BOUNDS_CHECK + assert(i >= 1); + assert(i <= m_); + assert(j >= 1); + assert(j <= n_); + assert(k >= 1); + assert(k <= k_); +#endif + + return data_[(k-1)*m_*n_ + (j-1) * m_ + i-1]; +} + + +template <class T> +Fortran_Array3D<T> & Fortran_Array3D<T>::operator=(const T &a) +{ + + T *end = data_ + m_*n_*k_; + + for (T *p=data_; p != end; *p++ = a); + + return *this; +} + +template <class T> +Fortran_Array3D<T> Fortran_Array3D<T>::copy() const +{ + + Fortran_Array3D B(m_, n_, k_); + B.inject(*this); + return B; + +} + + +template <class T> +Fortran_Array3D<T> & Fortran_Array3D<T>::inject(const Fortran_Array3D &A) +{ + + if (m_ == A.m_ && n_ == A.n_ && k_ == A.k_) + { + T *p = data_; + T *end = data_ + m_*n_*k_; + const T* q = A.data_; + for (; p < end; *p++ = *q++); + } + return *this; +} + + + + +template <class T> +Fortran_Array3D<T> & Fortran_Array3D<T>::ref(const Fortran_Array3D<T> &A) +{ + + if (this != &A) + { + v_ = A.v_; + m_ = A.m_; + n_ = A.n_; + k_ = A.k_; + data_ = A.data_; + } + return *this; +} + +template <class T> +Fortran_Array3D<T> & Fortran_Array3D<T>::operator=(const Fortran_Array3D<T> &A) +{ + return ref(A); +} + +template <class T> +inline int Fortran_Array3D<T>::dim1() const { return m_; } + +template <class T> +inline int Fortran_Array3D<T>::dim2() const { return n_; } + +template <class T> +inline int Fortran_Array3D<T>::dim3() const { return k_; } + + +template <class T> +inline int Fortran_Array3D<T>::ref_count() const +{ + return v_.ref_count(); +} + +template <class T> +Fortran_Array3D<T>::~Fortran_Array3D() +{ +} + + +} /* namespace TNT */ + +#endif +/* TNT_FORTRAN_ARRAY3D_H */ + diff --git a/intern/smoke/intern/tnt/tnt_fortran_array3d_utils.h b/intern/smoke/intern/tnt/tnt_fortran_array3d_utils.h new file mode 100644 index 00000000000..a13a275dc0d --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_fortran_array3d_utils.h @@ -0,0 +1,249 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + +#ifndef TNT_FORTRAN_ARRAY3D_UTILS_H +#define TNT_FORTRAN_ARRAY3D_UTILS_H + +#include <cstdlib> +#include <cassert> + +namespace TNT +{ + + +template <class T> +std::ostream& operator<<(std::ostream &s, const Fortran_Array3D<T> &A) +{ + int M=A.dim1(); + int N=A.dim2(); + int K=A.dim3(); + + s << M << " " << N << " " << K << "\n"; + + for (int i=1; i<=M; i++) + { + for (int j=1; j<=N; j++) + { + for (int k=1; k<=K; k++) + s << A(i,j,k) << " "; + s << "\n"; + } + s << "\n"; + } + + + return s; +} + +template <class T> +std::istream& operator>>(std::istream &s, Fortran_Array3D<T> &A) +{ + + int M, N, K; + + s >> M >> N >> K; + + Fortran_Array3D<T> B(M,N,K); + + for (int i=1; i<=M; i++) + for (int j=1; j<=N; j++) + for (int k=1; k<=K; k++) + s >> B(i,j,k); + + A = B; + return s; +} + + +template <class T> +Fortran_Array3D<T> operator+(const Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() != m || B.dim2() != n || B.dim3() != p ) + return Fortran_Array3D<T>(); + + else + { + Fortran_Array3D<T> C(m,n,p); + + for (int i=1; i<=m; i++) + for (int j=1; j<=n; j++) + for (int k=1; k<=p; k++) + C(i,j,k) = A(i,j,k)+ B(i,j,k); + + return C; + } +} + + +template <class T> +Fortran_Array3D<T> operator-(const Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() != m || B.dim2() != n || B.dim3() != p ) + return Fortran_Array3D<T>(); + + else + { + Fortran_Array3D<T> C(m,n,p); + + for (int i=1; i<=m; i++) + for (int j=1; j<=n; j++) + for (int k=1; k<=p; k++) + C(i,j,k) = A(i,j,k)- B(i,j,k); + + return C; + } +} + + +template <class T> +Fortran_Array3D<T> operator*(const Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() != m || B.dim2() != n || B.dim3() != p ) + return Fortran_Array3D<T>(); + + else + { + Fortran_Array3D<T> C(m,n,p); + + for (int i=1; i<=m; i++) + for (int j=1; j<=n; j++) + for (int k=1; k<=p; k++) + C(i,j,k) = A(i,j,k)* B(i,j,k); + + return C; + } +} + + +template <class T> +Fortran_Array3D<T> operator/(const Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() != m || B.dim2() != n || B.dim3() != p ) + return Fortran_Array3D<T>(); + + else + { + Fortran_Array3D<T> C(m,n,p); + + for (int i=1; i<=m; i++) + for (int j=1; j<=n; j++) + for (int k=1; k<=p; k++) + C(i,j,k) = A(i,j,k)/ B(i,j,k); + + return C; + } +} + + +template <class T> +Fortran_Array3D<T>& operator+=(Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() == m && B.dim2() == n && B.dim3() == p ) + { + for (int i=1; i<=m; i++) + for (int j=1; j<=n; j++) + for (int k=1; k<=p; k++) + A(i,j,k) += B(i,j,k); + } + + return A; +} + + +template <class T> +Fortran_Array3D<T>& operator-=(Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() == m && B.dim2() == n && B.dim3() == p ) + { + for (int i=1; i<=m; i++) + for (int j=1; j<=n; j++) + for (int k=1; k<=p; k++) + A(i,j,k) -= B(i,j,k); + } + + return A; +} + + +template <class T> +Fortran_Array3D<T>& operator*=(Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() == m && B.dim2() == n && B.dim3() == p ) + { + for (int i=1; i<=m; i++) + for (int j=1; j<=n; j++) + for (int k=1; k<=p; k++) + A(i,j,k) *= B(i,j,k); + } + + return A; +} + + +template <class T> +Fortran_Array3D<T>& operator/=(Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B) +{ + int m = A.dim1(); + int n = A.dim2(); + int p = A.dim3(); + + if (B.dim1() == m && B.dim2() == n && B.dim3() == p ) + { + for (int i=1; i<=m; i++) + for (int j=1; j<=n; j++) + for (int k=1; k<=p; k++) + A(i,j,k) /= B(i,j,k); + } + + return A; +} + + +} // namespace TNT + +#endif diff --git a/intern/smoke/intern/tnt/tnt_i_refvec.h b/intern/smoke/intern/tnt/tnt_i_refvec.h new file mode 100644 index 00000000000..5a67eb57896 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_i_refvec.h @@ -0,0 +1,243 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + + +#ifndef TNT_I_REFVEC_H +#define TNT_I_REFVEC_H + +#include <cstdlib> +#include <iostream> + +#ifdef TNT_BOUNDS_CHECK +#include <assert.h> +#endif + +#ifndef NULL +#define NULL 0 +#endif + +namespace TNT +{ +/* + Internal representation of ref-counted array. The TNT + arrays all use this building block. + + <p> + If an array block is created by TNT, then every time + an assignment is made, the left-hand-side reference + is decreased by one, and the right-hand-side refernce + count is increased by one. If the array block was + external to TNT, the refernce count is a NULL pointer + regardless of how many references are made, since the + memory is not freed by TNT. + + + +*/ +template <class T> +class i_refvec +{ + + + private: + T* data_; + int *ref_count_; + + + public: + + i_refvec(); + explicit i_refvec(int n); + inline i_refvec(T* data); + inline i_refvec(const i_refvec &v); + inline T* begin(); + inline const T* begin() const; + inline T& operator[](int i); + inline const T& operator[](int i) const; + inline i_refvec<T> & operator=(const i_refvec<T> &V); + void copy_(T* p, const T* q, const T* e); + void set_(T* p, const T* b, const T* e); + inline int ref_count() const; + inline int is_null() const; + inline void destroy(); + ~i_refvec(); + +}; + +template <class T> +void i_refvec<T>::copy_(T* p, const T* q, const T* e) +{ + for (T* t=p; q<e; t++, q++) + *t= *q; +} + +template <class T> +i_refvec<T>::i_refvec() : data_(NULL), ref_count_(NULL) {} + +/** + In case n is 0 or negative, it does NOT call new. +*/ +template <class T> +i_refvec<T>::i_refvec(int n) : data_(NULL), ref_count_(NULL) +{ + if (n >= 1) + { +#ifdef TNT_DEBUG + std::cout << "new data storage.\n"; +#endif + data_ = new T[n]; + ref_count_ = new int; + *ref_count_ = 1; + } +} + +template <class T> +inline i_refvec<T>::i_refvec(const i_refvec<T> &V): data_(V.data_), + ref_count_(V.ref_count_) +{ + if (V.ref_count_ != NULL) + (*(V.ref_count_))++; +} + + +template <class T> +i_refvec<T>::i_refvec(T* data) : data_(data), ref_count_(NULL) {} + +template <class T> +inline T* i_refvec<T>::begin() +{ + return data_; +} + +template <class T> +inline const T& i_refvec<T>::operator[](int i) const +{ + return data_[i]; +} + +template <class T> +inline T& i_refvec<T>::operator[](int i) +{ + return data_[i]; +} + + +template <class T> +inline const T* i_refvec<T>::begin() const +{ + return data_; +} + + + +template <class T> +i_refvec<T> & i_refvec<T>::operator=(const i_refvec<T> &V) +{ + if (this == &V) + return *this; + + + if (ref_count_ != NULL) + { + (*ref_count_) --; + if ((*ref_count_) == 0) + destroy(); + } + + data_ = V.data_; + ref_count_ = V.ref_count_; + + if (V.ref_count_ != NULL) + (*(V.ref_count_))++; + + return *this; +} + +template <class T> +void i_refvec<T>::destroy() +{ + if (ref_count_ != NULL) + { +#ifdef TNT_DEBUG + std::cout << "destorying data... \n"; +#endif + delete ref_count_; + +#ifdef TNT_DEBUG + std::cout << "deleted ref_count_ ...\n"; +#endif + if (data_ != NULL) + delete []data_; +#ifdef TNT_DEBUG + std::cout << "deleted data_[] ...\n"; +#endif + data_ = NULL; + } +} + +/* +* return 1 is vector is empty, 0 otherwise +* +* if is_null() is false and ref_count() is 0, then +* +*/ +template<class T> +int i_refvec<T>::is_null() const +{ + return (data_ == NULL ? 1 : 0); +} + +/* +* returns -1 if data is external, +* returns 0 if a is NULL array, +* otherwise returns the positive number of vectors sharing +* this data space. +*/ +template <class T> +int i_refvec<T>::ref_count() const +{ + if (data_ == NULL) + return 0; + else + return (ref_count_ != NULL ? *ref_count_ : -1) ; +} + +template <class T> +i_refvec<T>::~i_refvec() +{ + if (ref_count_ != NULL) + { + (*ref_count_)--; + + if (*ref_count_ == 0) + destroy(); + } +} + + +} /* namespace TNT */ + + + + + +#endif +/* TNT_I_REFVEC_H */ + diff --git a/intern/smoke/intern/tnt/tnt_math_utils.h b/intern/smoke/intern/tnt/tnt_math_utils.h new file mode 100644 index 00000000000..6e14a1d9b90 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_math_utils.h @@ -0,0 +1,34 @@ +#ifndef MATH_UTILS_H +#define MATH_UTILS_H + +/* needed for fabs, sqrt() below */ +#include <cmath> + + + +namespace TNT +{ +/** + @returns hypotenuse of real (non-complex) scalars a and b by + avoiding underflow/overflow + using (a * sqrt( 1 + (b/a) * (b/a))), rather than + sqrt(a*a + b*b). +*/ +template <class Real> +Real hypot(const Real &a, const Real &b) +{ + + if (a== 0) + return fabs(b); + else + { + Real c = b/a; + return fabs(a) * sqrt(1 + c*c); + } +} +} /* TNT namespace */ + + + +#endif +/* MATH_UTILS_H */ diff --git a/intern/smoke/intern/tnt/tnt_sparse_matrix_csr.h b/intern/smoke/intern/tnt/tnt_sparse_matrix_csr.h new file mode 100644 index 00000000000..0d4fde1c207 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_sparse_matrix_csr.h @@ -0,0 +1,103 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + +#ifndef TNT_SPARSE_MATRIX_CSR_H +#define TNT_SPARSE_MATRIX_CSR_H + +#include "tnt_array1d.h" + +namespace TNT +{ + + +/** + Read-only view of a sparse matrix in compressed-row storage + format. Neither array elements (nonzeros) nor sparsity + structure can be modified. If modifications are required, + create a new view. + + <p> + Index values begin at 0. + + <p> + <b>Storage requirements:</b> An (m x n) matrix with + nz nonzeros requires no more than ((T+I)*nz + M*I) + bytes, where T is the size of data elements and + I is the size of integers. + + +*/ +template <class T> +class Sparse_Matrix_CompRow { + +private: + Array1D<T> val_; // data values (nz_ elements) + Array1D<int> rowptr_; // row_ptr (dim_[0]+1 elements) + Array1D<int> colind_; // col_ind (nz_ elements) + + int dim1_; // number of rows + int dim2_; // number of cols + +public: + + Sparse_Matrix_CompRow(const Sparse_Matrix_CompRow &S); + Sparse_Matrix_CompRow(int M, int N, int nz, const T *val, + const int *r, const int *c); + + + + inline const T& val(int i) const { return val_[i]; } + inline const int& row_ptr(int i) const { return rowptr_[i]; } + inline const int& col_ind(int i) const { return colind_[i];} + + inline int dim1() const {return dim1_;} + inline int dim2() const {return dim2_;} + int NumNonzeros() const {return val_.dim1();} + + + Sparse_Matrix_CompRow& operator=( + const Sparse_Matrix_CompRow &R); + + + +}; + +/** + Construct a read-only view of existing sparse matrix in + compressed-row storage format. + + @param M the number of rows of sparse matrix + @param N the number of columns of sparse matrix + @param nz the number of nonzeros + @param val a contiguous list of nonzero values + @param r row-pointers: r[i] denotes the begining position of row i + (i.e. the ith row begins at val[row[i]]). + @param c column-indices: c[i] denotes the column location of val[i] +*/ +template <class T> +Sparse_Matrix_CompRow<T>::Sparse_Matrix_CompRow(int M, int N, int nz, + const T *val, const int *r, const int *c) : val_(nz,val), + rowptr_(M, r), colind_(nz, c), dim1_(M), dim2_(N) {} + + +} +// namespace TNT + +#endif diff --git a/intern/smoke/intern/tnt/tnt_stopwatch.h b/intern/smoke/intern/tnt/tnt_stopwatch.h new file mode 100644 index 00000000000..8dc5d23ac1e --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_stopwatch.h @@ -0,0 +1,95 @@ +/* +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + + +#ifndef STOPWATCH_H +#define STOPWATCH_H + +// for clock() and CLOCKS_PER_SEC +#include <time.h> + + +namespace TNT +{ + +inline static double seconds(void) +{ + const double secs_per_tick = 1.0 / CLOCKS_PER_SEC; + return ( (double) clock() ) * secs_per_tick; +} + +class Stopwatch { + private: + int running_; + double start_time_; + double total_; + + public: + inline Stopwatch(); + inline void start(); + inline double stop(); + inline double read(); + inline void resume(); + inline int running(); +}; + +inline Stopwatch::Stopwatch() : running_(0), start_time_(0.0), total_(0.0) {} + +void Stopwatch::start() +{ + running_ = 1; + total_ = 0.0; + start_time_ = seconds(); +} + +double Stopwatch::stop() +{ + if (running_) + { + total_ += (seconds() - start_time_); + running_ = 0; + } + return total_; +} + +inline void Stopwatch::resume() +{ + if (!running_) + { + start_time_ = seconds(); + running_ = 1; + } +} + + +inline double Stopwatch::read() +{ + if (running_) + { + stop(); + resume(); + } + return total_; +} + + +} /* TNT namespace */ +#endif + + + diff --git a/intern/smoke/intern/tnt/tnt_subscript.h b/intern/smoke/intern/tnt/tnt_subscript.h new file mode 100644 index 00000000000..d8fe1200eeb --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_subscript.h @@ -0,0 +1,54 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + +#ifndef TNT_SUBSCRPT_H +#define TNT_SUBSCRPT_H + + +//--------------------------------------------------------------------- +// This definition describes the default TNT data type used for +// indexing into TNT matrices and vectors. The data type should +// be wide enough to index into large arrays. It defaults to an +// "int", but can be overriden at compile time redefining TNT_SUBSCRIPT_TYPE, +// e.g. +// +// c++ -DTNT_SUBSCRIPT_TYPE='unsigned int' ... +// +//--------------------------------------------------------------------- +// + +#ifndef TNT_SUBSCRIPT_TYPE +#define TNT_SUBSCRIPT_TYPE int +#endif + +namespace TNT +{ + typedef TNT_SUBSCRIPT_TYPE Subscript; +} /* namespace TNT */ + + +// () indexing in TNT means 1-offset, i.e. x(1) and A(1,1) are the +// first elements. This offset is left as a macro for future +// purposes, but should not be changed in the current release. +// +// +#define TNT_BASE_OFFSET (1) + +#endif diff --git a/intern/smoke/intern/tnt/tnt_vec.h b/intern/smoke/intern/tnt/tnt_vec.h new file mode 100644 index 00000000000..a0f614b5cbd --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_vec.h @@ -0,0 +1,404 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + + + +#ifndef TNT_VEC_H +#define TNT_VEC_H + +#include "tnt_subscript.h" +#include <cstdlib> +#include <cassert> +#include <iostream> +#include <sstream> + +namespace TNT +{ + +/** + <b>[Deprecatred]</b> Value-based vector class from pre-1.0 + TNT version. Kept here for backward compatiblity, but should + use the newer TNT::Array1D classes instead. + +*/ + +template <class T> +class Vector +{ + + + public: + + typedef Subscript size_type; + typedef T value_type; + typedef T element_type; + typedef T* pointer; + typedef T* iterator; + typedef T& reference; + typedef const T* const_iterator; + typedef const T& const_reference; + + Subscript lbound() const { return 1;} + + protected: + T* v_; + T* vm1_; // pointer adjustment for optimzied 1-offset indexing + Subscript n_; + + // internal helper function to create the array + // of row pointers + + void initialize(Subscript N) + { + // adjust pointers so that they are 1-offset: + // v_[] is the internal contiguous array, it is still 0-offset + // + assert(v_ == NULL); + v_ = new T[N]; + assert(v_ != NULL); + vm1_ = v_-1; + n_ = N; + } + + void copy(const T* v) + { + Subscript N = n_; + Subscript i; + +#ifdef TNT_UNROLL_LOOPS + Subscript Nmod4 = N & 3; + Subscript N4 = N - Nmod4; + + for (i=0; i<N4; i+=4) + { + v_[i] = v[i]; + v_[i+1] = v[i+1]; + v_[i+2] = v[i+2]; + v_[i+3] = v[i+3]; + } + + for (i=N4; i< N; i++) + v_[i] = v[i]; +#else + + for (i=0; i< N; i++) + v_[i] = v[i]; +#endif + } + + void set(const T& val) + { + Subscript N = n_; + Subscript i; + +#ifdef TNT_UNROLL_LOOPS + Subscript Nmod4 = N & 3; + Subscript N4 = N - Nmod4; + + for (i=0; i<N4; i+=4) + { + v_[i] = val; + v_[i+1] = val; + v_[i+2] = val; + v_[i+3] = val; + } + + for (i=N4; i< N; i++) + v_[i] = val; +#else + + for (i=0; i< N; i++) + v_[i] = val; + +#endif + } + + + + void destroy() + { + /* do nothing, if no memory has been previously allocated */ + if (v_ == NULL) return ; + + /* if we are here, then matrix was previously allocated */ + delete [] (v_); + + v_ = NULL; + vm1_ = NULL; + } + + + public: + + // access + + iterator begin() { return v_;} + iterator end() { return v_ + n_; } + iterator begin() const { return v_;} + iterator end() const { return v_ + n_; } + + // destructor + + ~Vector() + { + destroy(); + } + + // constructors + + Vector() : v_(0), vm1_(0), n_(0) {}; + + Vector(const Vector<T> &A) : v_(0), vm1_(0), n_(0) + { + initialize(A.n_); + copy(A.v_); + } + + Vector(Subscript N, const T& value = T()) : v_(0), vm1_(0), n_(0) + { + initialize(N); + set(value); + } + + Vector(Subscript N, const T* v) : v_(0), vm1_(0), n_(0) + { + initialize(N); + copy(v); + } + + Vector(Subscript N, char *s) : v_(0), vm1_(0), n_(0) + { + initialize(N); + std::istringstream ins(s); + + Subscript i; + + for (i=0; i<N; i++) + ins >> v_[i]; + } + + + // methods + // + Vector<T>& newsize(Subscript N) + { + if (n_ == N) return *this; + + destroy(); + initialize(N); + + return *this; + } + + + // assignments + // + Vector<T>& operator=(const Vector<T> &A) + { + if (v_ == A.v_) + return *this; + + if (n_ == A.n_) // no need to re-alloc + copy(A.v_); + + else + { + destroy(); + initialize(A.n_); + copy(A.v_); + } + + return *this; + } + + Vector<T>& operator=(const T& scalar) + { + set(scalar); + return *this; + } + + inline Subscript dim() const + { + return n_; + } + + inline Subscript size() const + { + return n_; + } + + + inline reference operator()(Subscript i) + { +#ifdef TNT_BOUNDS_CHECK + assert(1<=i); + assert(i <= n_) ; +#endif + return vm1_[i]; + } + + inline const_reference operator() (Subscript i) const + { +#ifdef TNT_BOUNDS_CHECK + assert(1<=i); + assert(i <= n_) ; +#endif + return vm1_[i]; + } + + inline reference operator[](Subscript i) + { +#ifdef TNT_BOUNDS_CHECK + assert(0<=i); + assert(i < n_) ; +#endif + return v_[i]; + } + + inline const_reference operator[](Subscript i) const + { +#ifdef TNT_BOUNDS_CHECK + assert(0<=i); + + + + + + + assert(i < n_) ; +#endif + return v_[i]; + } + + + +}; + + +/* *************************** I/O ********************************/ + +template <class T> +std::ostream& operator<<(std::ostream &s, const Vector<T> &A) +{ + Subscript N=A.dim(); + + s << N << "\n"; + + for (Subscript i=0; i<N; i++) + s << A[i] << " " << "\n"; + s << "\n"; + + return s; +} + +template <class T> +std::istream & operator>>(std::istream &s, Vector<T> &A) +{ + + Subscript N; + + s >> N; + + if ( !(N == A.size() )) + { + A.newsize(N); + } + + + for (Subscript i=0; i<N; i++) + s >> A[i]; + + + return s; +} + +// *******************[ basic matrix algorithms ]*************************** + + +template <class T> +Vector<T> operator+(const Vector<T> &A, + const Vector<T> &B) +{ + Subscript N = A.dim(); + + assert(N==B.dim()); + + Vector<T> tmp(N); + Subscript i; + + for (i=0; i<N; i++) + tmp[i] = A[i] + B[i]; + + return tmp; +} + +template <class T> +Vector<T> operator-(const Vector<T> &A, + const Vector<T> &B) +{ + Subscript N = A.dim(); + + assert(N==B.dim()); + + Vector<T> tmp(N); + Subscript i; + + for (i=0; i<N; i++) + tmp[i] = A[i] - B[i]; + + return tmp; +} + +template <class T> +Vector<T> operator*(const Vector<T> &A, + const Vector<T> &B) +{ + Subscript N = A.dim(); + + assert(N==B.dim()); + + Vector<T> tmp(N); + Subscript i; + + for (i=0; i<N; i++) + tmp[i] = A[i] * B[i]; + + return tmp; +} + + +template <class T> +T dot_prod(const Vector<T> &A, const Vector<T> &B) +{ + Subscript N = A.dim(); + assert(N == B.dim()); + + Subscript i; + T sum = 0; + + for (i=0; i<N; i++) + sum += A[i] * B[i]; + + return sum; +} + +} /* namespace TNT */ + +#endif +// TNT_VEC_H diff --git a/intern/smoke/intern/tnt/tnt_version.h b/intern/smoke/intern/tnt/tnt_version.h new file mode 100644 index 00000000000..047e7d37042 --- /dev/null +++ b/intern/smoke/intern/tnt/tnt_version.h @@ -0,0 +1,39 @@ +/* +* +* Template Numerical Toolkit (TNT) +* +* Mathematical and Computational Sciences Division +* National Institute of Technology, +* Gaithersburg, MD USA +* +* +* This software was developed at the National Institute of Standards and +* Technology (NIST) by employees of the Federal Government in the course +* of their official duties. Pursuant to title 17 Section 105 of the +* United States Code, this software is not subject to copyright protection +* and is in the public domain. NIST assumes no responsibility whatsoever for +* its use by other parties, and makes no guarantees, expressed or implied, +* about its quality, reliability, or any other characteristic. +* +*/ + +#ifndef TNT_VERSION_H +#define TNT_VERSION_H + + +//--------------------------------------------------------------------- +// current version +//--------------------------------------------------------------------- + + +#define TNT_MAJOR_VERSION '1' +#define TNT_MINOR_VERSION '2' +#define TNT_SUBMINOR_VERSION '6' +#define TNT_VERSION_STRING "1.2.6" + + + + + +#endif +// TNT_VERSION_H diff --git a/intern/smoke/make/msvc_9_0/smoke.vcproj b/intern/smoke/make/msvc_9_0/smoke.vcproj new file mode 100644 index 00000000000..aa3779031f0 --- /dev/null +++ b/intern/smoke/make/msvc_9_0/smoke.vcproj @@ -0,0 +1,511 @@ +<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="INT_smoke"
+ ProjectGUID="{E8904FB3-F8F7-BC21-87A6-029A57B901F4}"
+ RootNamespace="smoke"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Blender Release|Win32"
+ OutputDirectory="..\..\..\..\..\build\msvc_9\intern\smoke"
+ IntermediateDirectory="..\..\..\..\..\build\msvc_9\intern\smoke"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\intern;..\..\..\..\..\lib\windows\zlib\include;..\..\..\..\..\lib\windows\png\include;..\..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\..\build\msvc_9\intern\guardedalloc\include"
+ PreprocessorDefinitions="WIN32,NDEBUG,_LIB"
+ StringPooling="true"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\intern\smoke\smoke.pch"
+ AssemblerListingLocation="..\..\..\..\..\build\msvc_9\intern\smoke\"
+ ObjectFile="..\..\..\..\..\build\msvc_9\intern\smoke\"
+ ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\intern\smoke\"
+ WarningLevel="2"
+ SuppressStartupBanner="true"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1043"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="..\..\..\..\..\build\msvc_9\libs\intern\libsmoke.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying IK files library to lib tree."
+ CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\intern\smoke\include MKDIR ..\..\..\..\..\build\msvc_9\intern\smoke\include
XCOPY /Y ..\..\extern\*.h ..\..\..\..\..\build\msvc_9\intern\smoke\include
ECHO Done
"
+ />
+ </Configuration>
+ <Configuration
+ Name="Blender Debug|Win32"
+ OutputDirectory="..\..\..\..\..\build\msvc_9\intern\smoke\debug"
+ IntermediateDirectory="..\..\..\..\..\build\msvc_9\intern\smoke\debug"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\intern;..\..\..\..\..\lib\windows\zlib\include;..\..\..\..\..\lib\windows\png\include;..\..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\..\build\msvc_9\intern\guardedalloc\include"
+ PreprocessorDefinitions="WIN32,_DEBUG,_LIB"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="true"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\intern\smoke\debug\smoke.pch"
+ AssemblerListingLocation="..\..\..\..\..\build\msvc_9\intern\smoke\debug\"
+ ObjectFile="..\..\..\..\..\build\msvc_9\intern\smoke\debug\"
+ ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\intern\smoke\debug\"
+ WarningLevel="2"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1043"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="..\..\..\..\..\build\msvc_9\libs\intern\debug\libsmoke.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying IK files library (debug target) to lib tree."
+ CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\intern\smoke\include MKDIR ..\..\..\..\..\build\msvc_9\intern\smoke\include
XCOPY /Y ..\..\extern\*.h ..\..\..\..\..\build\msvc_9\intern\smoke\include
ECHO Done
"
+ />
+ </Configuration>
+ <Configuration
+ Name="3DPlugin Release|Win32"
+ OutputDirectory="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll"
+ IntermediateDirectory="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="2"
+ AdditionalIncludeDirectories="..\..\intern;..\..\..\..\..\lib\windows\zlib\include;..\..\..\..\..\lib\windows\png\include;..\..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\..\build\msvc_9\intern\guardedalloc\include"
+ PreprocessorDefinitions="WIN32,NDEBUG,_LIB"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\smoke.pch"
+ AssemblerListingLocation="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\"
+ ObjectFile="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\"
+ ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\"
+ WarningLevel="2"
+ SuppressStartupBanner="true"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1043"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="..\..\..\..\..\build\msvc_9\libs\intern\mtdll\libsmoke.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying IK files library to lib tree."
+ CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\intern\smoke\include MKDIR ..\..\..\..\..\build\msvc_9\intern\smoke\include
XCOPY /Y ..\..\extern\*.h ..\..\..\..\..\build\msvc_9\intern\smoke\include
ECHO Done
"
+ />
+ </Configuration>
+ <Configuration
+ Name="3DPlugin Debug|Win32"
+ OutputDirectory="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\debug"
+ IntermediateDirectory="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\debug"
+ ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\intern;..\..\..\..\..\lib\windows\zlib\include;..\..\..\..\..\lib\windows\png\include;..\..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\..\build\msvc_9\intern\guardedalloc\include"
+ PreprocessorDefinitions="WIN32,_DEBUG,_LIB"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="true"
+ UsePrecompiledHeader="0"
+ PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\debug\smoke.pch"
+ AssemblerListingLocation="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\debug\"
+ ObjectFile="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\debug\"
+ ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\intern\smoke\mtdll\debug\"
+ WarningLevel="2"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1043"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="..\..\..\..\..\build\msvc_9\libs\intern\mtdll\debug\libsmoke.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ Description="Copying IK files library (debug target) to lib tree."
+ CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\intern\smoke\include MKDIR ..\..\..\..\..\build\msvc_9\intern\smoke\include
XCOPY /Y ..\..\extern\*.h ..\..\..\..\..\build\msvc_9\intern\smoke\include
ECHO Done
"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="intern"
+ >
+ <File
+ RelativePath="..\..\intern\EIGENVALUE_HELPER.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\FFT_NOISE.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\FLUID_3D.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\FLUID_3D.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\FLUID_3D_SOLVERS.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\FLUID_3D_STATIC.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\IMAGE.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\INTERPOLATE.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\LU_HELPER.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\MERSENNETWISTER.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\OBSTACLE.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\smoke_API.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\SPHERE.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\SPHERE.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\VEC3.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\WAVELET_NOISE.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\WTURBULENCE.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\WTURBULENCE.h"
+ >
+ </File>
+ <Filter
+ Name="TNT"
+ >
+ <File
+ RelativePath="..\..\intern\tnt\jama_eig.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\jama_lu.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_array1d.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_array1d_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_array2d.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_array2d_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_array3d.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_array3d_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_cmat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_fortran_array1d.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_fortran_array1d_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_fortran_array2d.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_fortran_array2d_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_fortran_array3d.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_fortran_array3d_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_i_refvec.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_math_utils.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_sparse_matrix_csr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_stopwatch.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_subscript.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_vec.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\intern\tnt\tnt_version.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="extern"
+ >
+ <File
+ RelativePath="..\..\extern\smoke_API.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj b/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj index 7881d03f89f..cf642cca4ae 100644 --- a/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj +++ b/projectfiles_vc9/blender/BPY_python/BPY_python.vcproj @@ -351,10 +351,6 @@ >
</File>
<File
- RelativePath="..\..\..\source\blender\python\intern\bpy_scriptlink.c"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\python\intern\bpy_ui.c"
>
</File>
diff --git a/projectfiles_vc9/blender/blender.sln b/projectfiles_vc9/blender/blender.sln index 1396564d578..dacced09d65 100644 --- a/projectfiles_vc9/blender/blender.sln +++ b/projectfiles_vc9/blender/blender.sln @@ -39,6 +39,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blender", "blender.vcproj", {213356A9-3A1F-41DA-9819-1297BCD17DEE} = {213356A9-3A1F-41DA-9819-1297BCD17DEE}
{727F90AC-ABE6-40BF-8937-C2F2F1D13DEA} = {727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}
{BAC615B0-F1AF-418B-8D23-A10FD8870D6A} = {BAC615B0-F1AF-418B-8D23-A10FD8870D6A}
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4} = {E8904FB3-F8F7-BC21-87A6-029A57B901F4}
{E90C7BC2-CF30-4A60-A8F2-0050D592E358} = {E90C7BC2-CF30-4A60-A8F2-0050D592E358}
{8B8D4FC3-3234-4E54-8376-5AB83D00D164} = {8B8D4FC3-3234-4E54-8376-5AB83D00D164}
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74} = {4B6AFCC5-968C-424A-8F20-76E41B3BEF74}
@@ -55,6 +56,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blender", "blender.vcproj", EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BKE_blenkernel", "blenkernel\BKE_blenkernel.vcproj", "{CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}"
ProjectSection(ProjectDependencies) = postProject
+ {02110D03-59DB-4571-8787-72B3C03B2F2D} = {02110D03-59DB-4571-8787-72B3C03B2F2D}
{9C71A793-C177-4CAB-8EC5-923D500B39F8} = {9C71A793-C177-4CAB-8EC5-923D500B39F8}
EndProjectSection
EndProject
@@ -206,6 +208,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PHY_Bullet", "..\gameengine EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BL_nodes", "nodes\nodes.vcproj", "{4C3AB78A-52CA-4276-A041-39776E52D8C8}"
+ ProjectSection(ProjectDependencies) = postProject
+ {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284} = {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}
+ {DFE7F3E3-E62A-4677-B666-DF0DDF70C359} = {DFE7F3E3-E62A-4677-B666-DF0DDF70C359}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BL_gpu", "gpu\BL_gpu.vcproj", "{138DD16C-CC78-4F6C-A898-C8DA68D89067}"
EndProject
@@ -275,6 +281,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "INT_build_install_all", ".. {76D90B92-ECC7-409C-9F98-A8814B90F3C0} = {76D90B92-ECC7-409C-9F98-A8814B90F3C0}
{542A9FA1-B7FF-441C-AE15-054DB31D3488} = {542A9FA1-B7FF-441C-AE15-054DB31D3488}
{213356A9-3A1F-41DA-9819-1297BCD17DEE} = {213356A9-3A1F-41DA-9819-1297BCD17DEE}
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4} = {E8904FB3-F8F7-BC21-87A6-029A57B901F4}
{51A348C1-8684-4D67-B980-97B1FC74159B} = {51A348C1-8684-4D67-B980-97B1FC74159B}
{8B8D4FC3-3234-4E54-8376-5AB83D00D164} = {8B8D4FC3-3234-4E54-8376-5AB83D00D164}
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74} = {4B6AFCC5-968C-424A-8F20-76E41B3BEF74}
@@ -342,10 +349,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BL_bmesh", "..\BL_bmesh\BL_ {CAE37E91-6570-43AC-A4B4-7A37A4B0FC94} = {CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}
EndProjectSection
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "INT_smoke", "..\..\intern\smoke\make\msvc_9_0\smoke.vcproj", "{E8904FB3-F8F7-BC21-87A6-029A57B901F4}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3D Plugin Debug|Win32 = 3D Plugin Debug|Win32
3D Plugin Release|Win32 = 3D Plugin Release|Win32
+ 3DPlugin Debug|Win32 = 3DPlugin Debug|Win32
+ 3DPlugin Release|Win32 = 3DPlugin Release|Win32
Blender Debug|Win32 = Blender Debug|Win32
Blender Release|Win32 = Blender Release|Win32
BlenderPlayer Debug|Win32 = BlenderPlayer Debug|Win32
@@ -358,6 +369,10 @@ Global {F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.3D Plugin Debug|Win32.Build.0 = Blender Debug|Win32
{F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.3D Plugin Release|Win32.ActiveCfg = Blender Debug|Win32
{F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.3D Plugin Release|Win32.Build.0 = Blender Debug|Win32
+ {F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.3DPlugin Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.3DPlugin Debug|Win32.Build.0 = Blender Debug|Win32
+ {F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.3DPlugin Release|Win32.ActiveCfg = Blender Debug|Win32
+ {F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.3DPlugin Release|Win32.Build.0 = Blender Debug|Win32
{F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{F78B7FC9-DE32-465E-9F26-BB0B6B7A2EAF}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -372,6 +387,10 @@ Global {CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -388,6 +407,10 @@ Global {31628053-825D-4C06-8A21-D13883489718}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{31628053-825D-4C06-8A21-D13883489718}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{31628053-825D-4C06-8A21-D13883489718}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {31628053-825D-4C06-8A21-D13883489718}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {31628053-825D-4C06-8A21-D13883489718}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {31628053-825D-4C06-8A21-D13883489718}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {31628053-825D-4C06-8A21-D13883489718}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{31628053-825D-4C06-8A21-D13883489718}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{31628053-825D-4C06-8A21-D13883489718}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{31628053-825D-4C06-8A21-D13883489718}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -404,6 +427,10 @@ Global {E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{E5F2F004-C704-4DCC-A08F-6EB1E38EAB9F}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -420,6 +447,10 @@ Global {DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{DB6BE55D-B6D9-494D-856A-8764FF7BA91D}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -436,6 +467,10 @@ Global {9A307EE5-CD77-47BC-BD87-62508C7E19D8}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{9A307EE5-CD77-47BC-BD87-62508C7E19D8}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{9A307EE5-CD77-47BC-BD87-62508C7E19D8}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {9A307EE5-CD77-47BC-BD87-62508C7E19D8}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {9A307EE5-CD77-47BC-BD87-62508C7E19D8}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {9A307EE5-CD77-47BC-BD87-62508C7E19D8}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {9A307EE5-CD77-47BC-BD87-62508C7E19D8}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{9A307EE5-CD77-47BC-BD87-62508C7E19D8}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{9A307EE5-CD77-47BC-BD87-62508C7E19D8}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{9A307EE5-CD77-47BC-BD87-62508C7E19D8}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -452,6 +487,10 @@ Global {415BFD6E-64CF-422B-AF88-C07F040A7292}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{415BFD6E-64CF-422B-AF88-C07F040A7292}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{415BFD6E-64CF-422B-AF88-C07F040A7292}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {415BFD6E-64CF-422B-AF88-C07F040A7292}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {415BFD6E-64CF-422B-AF88-C07F040A7292}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {415BFD6E-64CF-422B-AF88-C07F040A7292}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {415BFD6E-64CF-422B-AF88-C07F040A7292}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{415BFD6E-64CF-422B-AF88-C07F040A7292}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{415BFD6E-64CF-422B-AF88-C07F040A7292}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{415BFD6E-64CF-422B-AF88-C07F040A7292}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -468,6 +507,10 @@ Global {5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.3D Plugin Debug|Win32.Build.0 = BlenderPlayer Release|Win32
{5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.3D Plugin Release|Win32.ActiveCfg = BlenderPlayer Release|Win32
{5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.3D Plugin Release|Win32.Build.0 = BlenderPlayer Release|Win32
+ {5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.3DPlugin Debug|Win32.ActiveCfg = BlenderPlayer Release|Win32
+ {5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.3DPlugin Debug|Win32.Build.0 = BlenderPlayer Release|Win32
+ {5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.3DPlugin Release|Win32.ActiveCfg = BlenderPlayer Release|Win32
+ {5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.3DPlugin Release|Win32.Build.0 = BlenderPlayer Release|Win32
{5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{5A2EA6DC-1A53-4E87-9166-52870CE3B4EA}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -484,6 +527,10 @@ Global {106AE171-0083-41D6-A949-20DB0E8DC251}.3D Plugin Debug|Win32.Build.0 = Blender Debug|Win32
{106AE171-0083-41D6-A949-20DB0E8DC251}.3D Plugin Release|Win32.ActiveCfg = Blender Debug|Win32
{106AE171-0083-41D6-A949-20DB0E8DC251}.3D Plugin Release|Win32.Build.0 = Blender Debug|Win32
+ {106AE171-0083-41D6-A949-20DB0E8DC251}.3DPlugin Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {106AE171-0083-41D6-A949-20DB0E8DC251}.3DPlugin Debug|Win32.Build.0 = Blender Debug|Win32
+ {106AE171-0083-41D6-A949-20DB0E8DC251}.3DPlugin Release|Win32.ActiveCfg = Blender Debug|Win32
+ {106AE171-0083-41D6-A949-20DB0E8DC251}.3DPlugin Release|Win32.Build.0 = Blender Debug|Win32
{106AE171-0083-41D6-A949-20DB0E8DC251}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{106AE171-0083-41D6-A949-20DB0E8DC251}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{106AE171-0083-41D6-A949-20DB0E8DC251}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -498,6 +545,10 @@ Global {E013786A-9575-4F34-81B2-33290357EE87}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{E013786A-9575-4F34-81B2-33290357EE87}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{E013786A-9575-4F34-81B2-33290357EE87}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {E013786A-9575-4F34-81B2-33290357EE87}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {E013786A-9575-4F34-81B2-33290357EE87}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {E013786A-9575-4F34-81B2-33290357EE87}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {E013786A-9575-4F34-81B2-33290357EE87}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{E013786A-9575-4F34-81B2-33290357EE87}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{E013786A-9575-4F34-81B2-33290357EE87}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{E013786A-9575-4F34-81B2-33290357EE87}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -514,6 +565,10 @@ Global {EADC3C5A-6C51-4F03-8038-1553E7D7F740}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{EADC3C5A-6C51-4F03-8038-1553E7D7F740}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{EADC3C5A-6C51-4F03-8038-1553E7D7F740}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {EADC3C5A-6C51-4F03-8038-1553E7D7F740}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {EADC3C5A-6C51-4F03-8038-1553E7D7F740}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {EADC3C5A-6C51-4F03-8038-1553E7D7F740}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {EADC3C5A-6C51-4F03-8038-1553E7D7F740}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{EADC3C5A-6C51-4F03-8038-1553E7D7F740}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{EADC3C5A-6C51-4F03-8038-1553E7D7F740}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{EADC3C5A-6C51-4F03-8038-1553E7D7F740}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -530,6 +585,10 @@ Global {DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.Blender Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
{DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.Blender Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{DF25E6F2-780C-438B-8AAD-D10CF8B3820A}.BlenderPlayer Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
@@ -542,6 +601,10 @@ Global {D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.Blender Debug|Win32.ActiveCfg = BlenderPlayer Debug|Win32
{D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.Blender Release|Win32.ActiveCfg = BlenderPlayer Release|Win32
{D8ABD6A5-1B36-4D62-934E-B5C6801130B0}.BlenderPlayer Debug|Win32.ActiveCfg = BlenderPlayer Debug|Win32
@@ -556,6 +619,10 @@ Global {3D310C60-6771-48E4-BCCA-D2718CDED898}.3D Plugin Debug|Win32.Build.0 = BlenderPlayer Release|Win32
{3D310C60-6771-48E4-BCCA-D2718CDED898}.3D Plugin Release|Win32.ActiveCfg = BlenderPlayer Release|Win32
{3D310C60-6771-48E4-BCCA-D2718CDED898}.3D Plugin Release|Win32.Build.0 = BlenderPlayer Release|Win32
+ {3D310C60-6771-48E4-BCCA-D2718CDED898}.3DPlugin Debug|Win32.ActiveCfg = BlenderPlayer Release|Win32
+ {3D310C60-6771-48E4-BCCA-D2718CDED898}.3DPlugin Debug|Win32.Build.0 = BlenderPlayer Release|Win32
+ {3D310C60-6771-48E4-BCCA-D2718CDED898}.3DPlugin Release|Win32.ActiveCfg = BlenderPlayer Release|Win32
+ {3D310C60-6771-48E4-BCCA-D2718CDED898}.3DPlugin Release|Win32.Build.0 = BlenderPlayer Release|Win32
{3D310C60-6771-48E4-BCCA-D2718CDED898}.Blender Debug|Win32.ActiveCfg = BlenderPlayer Debug|Win32
{3D310C60-6771-48E4-BCCA-D2718CDED898}.Blender Release|Win32.ActiveCfg = BlenderPlayer Release|Win32
{3D310C60-6771-48E4-BCCA-D2718CDED898}.BlenderPlayer Debug|Win32.ActiveCfg = BlenderPlayer Debug|Win32
@@ -570,6 +637,10 @@ Global {8154A59A-CAED-403D-AB94-BC4E7C032666}.3D Plugin Debug|Win32.Build.0 = Blender Release|Win32
{8154A59A-CAED-403D-AB94-BC4E7C032666}.3D Plugin Release|Win32.ActiveCfg = Blender Release|Win32
{8154A59A-CAED-403D-AB94-BC4E7C032666}.3D Plugin Release|Win32.Build.0 = Blender Release|Win32
+ {8154A59A-CAED-403D-AB94-BC4E7C032666}.3DPlugin Debug|Win32.ActiveCfg = Blender Release|Win32
+ {8154A59A-CAED-403D-AB94-BC4E7C032666}.3DPlugin Debug|Win32.Build.0 = Blender Release|Win32
+ {8154A59A-CAED-403D-AB94-BC4E7C032666}.3DPlugin Release|Win32.ActiveCfg = Blender Release|Win32
+ {8154A59A-CAED-403D-AB94-BC4E7C032666}.3DPlugin Release|Win32.Build.0 = Blender Release|Win32
{8154A59A-CAED-403D-AB94-BC4E7C032666}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{8154A59A-CAED-403D-AB94-BC4E7C032666}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{8154A59A-CAED-403D-AB94-BC4E7C032666}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -584,6 +655,10 @@ Global {F90BD995-FFA4-4B18-81E8-FA4322C939E8}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{F90BD995-FFA4-4B18-81E8-FA4322C939E8}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{F90BD995-FFA4-4B18-81E8-FA4322C939E8}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {F90BD995-FFA4-4B18-81E8-FA4322C939E8}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {F90BD995-FFA4-4B18-81E8-FA4322C939E8}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {F90BD995-FFA4-4B18-81E8-FA4322C939E8}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {F90BD995-FFA4-4B18-81E8-FA4322C939E8}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{F90BD995-FFA4-4B18-81E8-FA4322C939E8}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{F90BD995-FFA4-4B18-81E8-FA4322C939E8}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{F90BD995-FFA4-4B18-81E8-FA4322C939E8}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -600,6 +675,10 @@ Global {E645CC32-4823-463E-82F0-46ADDE664018}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{E645CC32-4823-463E-82F0-46ADDE664018}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{E645CC32-4823-463E-82F0-46ADDE664018}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {E645CC32-4823-463E-82F0-46ADDE664018}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {E645CC32-4823-463E-82F0-46ADDE664018}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {E645CC32-4823-463E-82F0-46ADDE664018}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {E645CC32-4823-463E-82F0-46ADDE664018}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{E645CC32-4823-463E-82F0-46ADDE664018}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{E645CC32-4823-463E-82F0-46ADDE664018}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{E645CC32-4823-463E-82F0-46ADDE664018}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -616,6 +695,10 @@ Global {6E24BF09-9653-4166-A871-F65CC9E98A9B}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{6E24BF09-9653-4166-A871-F65CC9E98A9B}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{6E24BF09-9653-4166-A871-F65CC9E98A9B}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {6E24BF09-9653-4166-A871-F65CC9E98A9B}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {6E24BF09-9653-4166-A871-F65CC9E98A9B}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {6E24BF09-9653-4166-A871-F65CC9E98A9B}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {6E24BF09-9653-4166-A871-F65CC9E98A9B}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{6E24BF09-9653-4166-A871-F65CC9E98A9B}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{6E24BF09-9653-4166-A871-F65CC9E98A9B}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{6E24BF09-9653-4166-A871-F65CC9E98A9B}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -632,6 +715,10 @@ Global {6B801390-5F95-4F07-81A7-97FBA046AACC}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{6B801390-5F95-4F07-81A7-97FBA046AACC}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{6B801390-5F95-4F07-81A7-97FBA046AACC}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {6B801390-5F95-4F07-81A7-97FBA046AACC}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {6B801390-5F95-4F07-81A7-97FBA046AACC}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {6B801390-5F95-4F07-81A7-97FBA046AACC}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {6B801390-5F95-4F07-81A7-97FBA046AACC}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{6B801390-5F95-4F07-81A7-97FBA046AACC}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{6B801390-5F95-4F07-81A7-97FBA046AACC}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{6B801390-5F95-4F07-81A7-97FBA046AACC}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -648,6 +735,10 @@ Global {0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{0A73055E-4DED-40CD-9F72-9093ED3EEC7E}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -664,6 +755,10 @@ Global {3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{3648FB9A-C36F-43AB-AED0-1F1361E67FC7}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -680,6 +775,10 @@ Global {EC405272-28E3-4840-AAC2-53D6DE4E163D}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{EC405272-28E3-4840-AAC2-53D6DE4E163D}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{EC405272-28E3-4840-AAC2-53D6DE4E163D}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {EC405272-28E3-4840-AAC2-53D6DE4E163D}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {EC405272-28E3-4840-AAC2-53D6DE4E163D}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {EC405272-28E3-4840-AAC2-53D6DE4E163D}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {EC405272-28E3-4840-AAC2-53D6DE4E163D}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{EC405272-28E3-4840-AAC2-53D6DE4E163D}.Blender Debug|Win32.ActiveCfg = BlenderPlayer Debug|Win32
{EC405272-28E3-4840-AAC2-53D6DE4E163D}.Blender Release|Win32.ActiveCfg = BlenderPlayer Release|Win32
{EC405272-28E3-4840-AAC2-53D6DE4E163D}.BlenderPlayer Debug|Win32.ActiveCfg = BlenderPlayer Debug|Win32
@@ -692,6 +791,10 @@ Global {E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{E109F1A5-FDD3-4F56-A1C4-96867EEA4C5B}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -708,6 +811,10 @@ Global {AB590CED-F71F-4A17-A89B-18583ECD633D}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{AB590CED-F71F-4A17-A89B-18583ECD633D}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{AB590CED-F71F-4A17-A89B-18583ECD633D}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {AB590CED-F71F-4A17-A89B-18583ECD633D}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {AB590CED-F71F-4A17-A89B-18583ECD633D}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {AB590CED-F71F-4A17-A89B-18583ECD633D}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {AB590CED-F71F-4A17-A89B-18583ECD633D}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{AB590CED-F71F-4A17-A89B-18583ECD633D}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{AB590CED-F71F-4A17-A89B-18583ECD633D}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{AB590CED-F71F-4A17-A89B-18583ECD633D}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -724,6 +831,10 @@ Global {51FB3D48-2467-4BFA-A321-D848252B437E}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{51FB3D48-2467-4BFA-A321-D848252B437E}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{51FB3D48-2467-4BFA-A321-D848252B437E}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {51FB3D48-2467-4BFA-A321-D848252B437E}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {51FB3D48-2467-4BFA-A321-D848252B437E}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {51FB3D48-2467-4BFA-A321-D848252B437E}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {51FB3D48-2467-4BFA-A321-D848252B437E}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{51FB3D48-2467-4BFA-A321-D848252B437E}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{51FB3D48-2467-4BFA-A321-D848252B437E}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{51FB3D48-2467-4BFA-A321-D848252B437E}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -740,6 +851,10 @@ Global {32CC75E2-EE85-45E6-8E3D-513F58464F43}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{32CC75E2-EE85-45E6-8E3D-513F58464F43}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{32CC75E2-EE85-45E6-8E3D-513F58464F43}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {32CC75E2-EE85-45E6-8E3D-513F58464F43}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {32CC75E2-EE85-45E6-8E3D-513F58464F43}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {32CC75E2-EE85-45E6-8E3D-513F58464F43}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {32CC75E2-EE85-45E6-8E3D-513F58464F43}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{32CC75E2-EE85-45E6-8E3D-513F58464F43}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{32CC75E2-EE85-45E6-8E3D-513F58464F43}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{32CC75E2-EE85-45E6-8E3D-513F58464F43}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -756,6 +871,10 @@ Global {09222F5E-1625-4FF3-A89A-384D16875EE5}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{09222F5E-1625-4FF3-A89A-384D16875EE5}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{09222F5E-1625-4FF3-A89A-384D16875EE5}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {09222F5E-1625-4FF3-A89A-384D16875EE5}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {09222F5E-1625-4FF3-A89A-384D16875EE5}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {09222F5E-1625-4FF3-A89A-384D16875EE5}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {09222F5E-1625-4FF3-A89A-384D16875EE5}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{09222F5E-1625-4FF3-A89A-384D16875EE5}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{09222F5E-1625-4FF3-A89A-384D16875EE5}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{09222F5E-1625-4FF3-A89A-384D16875EE5}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -772,6 +891,10 @@ Global {BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{BAAE3F2B-BCF8-4E84-B8BA-CFB2D64945FE}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -788,6 +911,10 @@ Global {BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{BB6AA598-B336-4F8B-9DF9-8CAE7BE71C23}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -804,6 +931,10 @@ Global {727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{727F90AC-ABE6-40BF-8937-C2F2F1D13DEA}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -820,6 +951,10 @@ Global {E90C7BC2-CF30-4A60-A8F2-0050D592E358}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{E90C7BC2-CF30-4A60-A8F2-0050D592E358}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{E90C7BC2-CF30-4A60-A8F2-0050D592E358}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {E90C7BC2-CF30-4A60-A8F2-0050D592E358}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {E90C7BC2-CF30-4A60-A8F2-0050D592E358}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {E90C7BC2-CF30-4A60-A8F2-0050D592E358}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {E90C7BC2-CF30-4A60-A8F2-0050D592E358}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{E90C7BC2-CF30-4A60-A8F2-0050D592E358}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{E90C7BC2-CF30-4A60-A8F2-0050D592E358}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{E90C7BC2-CF30-4A60-A8F2-0050D592E358}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -836,6 +971,10 @@ Global {4C3AB78A-52CA-4276-A041-39776E52D8C8}.3D Plugin Debug|Win32.Build.0 = Blender Release|Win32
{4C3AB78A-52CA-4276-A041-39776E52D8C8}.3D Plugin Release|Win32.ActiveCfg = Blender Release|Win32
{4C3AB78A-52CA-4276-A041-39776E52D8C8}.3D Plugin Release|Win32.Build.0 = Blender Release|Win32
+ {4C3AB78A-52CA-4276-A041-39776E52D8C8}.3DPlugin Debug|Win32.ActiveCfg = Blender Release|Win32
+ {4C3AB78A-52CA-4276-A041-39776E52D8C8}.3DPlugin Debug|Win32.Build.0 = Blender Release|Win32
+ {4C3AB78A-52CA-4276-A041-39776E52D8C8}.3DPlugin Release|Win32.ActiveCfg = Blender Release|Win32
+ {4C3AB78A-52CA-4276-A041-39776E52D8C8}.3DPlugin Release|Win32.Build.0 = Blender Release|Win32
{4C3AB78A-52CA-4276-A041-39776E52D8C8}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{4C3AB78A-52CA-4276-A041-39776E52D8C8}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{4C3AB78A-52CA-4276-A041-39776E52D8C8}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -852,6 +991,10 @@ Global {138DD16C-CC78-4F6C-A898-C8DA68D89067}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{138DD16C-CC78-4F6C-A898-C8DA68D89067}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{138DD16C-CC78-4F6C-A898-C8DA68D89067}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {138DD16C-CC78-4F6C-A898-C8DA68D89067}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {138DD16C-CC78-4F6C-A898-C8DA68D89067}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {138DD16C-CC78-4F6C-A898-C8DA68D89067}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {138DD16C-CC78-4F6C-A898-C8DA68D89067}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{138DD16C-CC78-4F6C-A898-C8DA68D89067}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{138DD16C-CC78-4F6C-A898-C8DA68D89067}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{138DD16C-CC78-4F6C-A898-C8DA68D89067}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -868,6 +1011,10 @@ Global {670EC17A-0548-4BBF-A27B-636C7C188139}.3D Plugin Debug|Win32.Build.0 = Debug|Win32
{670EC17A-0548-4BBF-A27B-636C7C188139}.3D Plugin Release|Win32.ActiveCfg = Release|Win32
{670EC17A-0548-4BBF-A27B-636C7C188139}.3D Plugin Release|Win32.Build.0 = Release|Win32
+ {670EC17A-0548-4BBF-A27B-636C7C188139}.3DPlugin Debug|Win32.ActiveCfg = Debug|Win32
+ {670EC17A-0548-4BBF-A27B-636C7C188139}.3DPlugin Debug|Win32.Build.0 = Debug|Win32
+ {670EC17A-0548-4BBF-A27B-636C7C188139}.3DPlugin Release|Win32.ActiveCfg = Release|Win32
+ {670EC17A-0548-4BBF-A27B-636C7C188139}.3DPlugin Release|Win32.Build.0 = Release|Win32
{670EC17A-0548-4BBF-A27B-636C7C188139}.Blender Debug|Win32.ActiveCfg = Debug|Win32
{670EC17A-0548-4BBF-A27B-636C7C188139}.Blender Debug|Win32.Build.0 = Debug|Win32
{670EC17A-0548-4BBF-A27B-636C7C188139}.Blender Release|Win32.ActiveCfg = Release|Win32
@@ -884,6 +1031,10 @@ Global {FFD3C64A-30E2-4BC7-BC8F-51818C320400}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{FFD3C64A-30E2-4BC7-BC8F-51818C320400}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{FFD3C64A-30E2-4BC7-BC8F-51818C320400}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {FFD3C64A-30E2-4BC7-BC8F-51818C320400}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {FFD3C64A-30E2-4BC7-BC8F-51818C320400}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {FFD3C64A-30E2-4BC7-BC8F-51818C320400}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {FFD3C64A-30E2-4BC7-BC8F-51818C320400}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{FFD3C64A-30E2-4BC7-BC8F-51818C320400}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{FFD3C64A-30E2-4BC7-BC8F-51818C320400}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{FFD3C64A-30E2-4BC7-BC8F-51818C320400}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -900,6 +1051,10 @@ Global {BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.3D Plugin Debug|Win32.Build.0 = Blender Release|Win32
{BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.3D Plugin Release|Win32.ActiveCfg = Blender Release|Win32
{BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.3D Plugin Release|Win32.Build.0 = Blender Release|Win32
+ {BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.3DPlugin Debug|Win32.ActiveCfg = Blender Release|Win32
+ {BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.3DPlugin Debug|Win32.Build.0 = Blender Release|Win32
+ {BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.3DPlugin Release|Win32.ActiveCfg = Blender Release|Win32
+ {BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.3DPlugin Release|Win32.Build.0 = Blender Release|Win32
{BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{BAC615B0-F1AF-418B-8D23-A10FD8870D6A}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -916,6 +1071,10 @@ Global {9C71A793-C177-4CAB-8EC5-923D500B39F8}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{9C71A793-C177-4CAB-8EC5-923D500B39F8}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{9C71A793-C177-4CAB-8EC5-923D500B39F8}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {9C71A793-C177-4CAB-8EC5-923D500B39F8}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {9C71A793-C177-4CAB-8EC5-923D500B39F8}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
+ {9C71A793-C177-4CAB-8EC5-923D500B39F8}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Debug|Win32
+ {9C71A793-C177-4CAB-8EC5-923D500B39F8}.3DPlugin Release|Win32.Build.0 = 3D Plugin Debug|Win32
{9C71A793-C177-4CAB-8EC5-923D500B39F8}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{9C71A793-C177-4CAB-8EC5-923D500B39F8}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
{9C71A793-C177-4CAB-8EC5-923D500B39F8}.BlenderPlayer Debug|Win32.ActiveCfg = Blender Debug|Win32
@@ -928,6 +1087,10 @@ Global {EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{EB75F4D6-2970-4A3A-8D99-2BAD7201C0E9}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -942,6 +1105,10 @@ Global {B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -956,6 +1123,10 @@ Global {51A348C1-8684-4D67-B980-97B1FC74159B}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{51A348C1-8684-4D67-B980-97B1FC74159B}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{51A348C1-8684-4D67-B980-97B1FC74159B}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {51A348C1-8684-4D67-B980-97B1FC74159B}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {51A348C1-8684-4D67-B980-97B1FC74159B}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {51A348C1-8684-4D67-B980-97B1FC74159B}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {51A348C1-8684-4D67-B980-97B1FC74159B}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{51A348C1-8684-4D67-B980-97B1FC74159B}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{51A348C1-8684-4D67-B980-97B1FC74159B}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{51A348C1-8684-4D67-B980-97B1FC74159B}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -972,6 +1143,10 @@ Global {C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{C66F722C-46BE-40C9-ABAE-2EAC7A697EB8}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -988,6 +1163,10 @@ Global {FAF46346-65CC-4DB2-85C4-B99826F79D0C}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{FAF46346-65CC-4DB2-85C4-B99826F79D0C}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{FAF46346-65CC-4DB2-85C4-B99826F79D0C}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {FAF46346-65CC-4DB2-85C4-B99826F79D0C}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {FAF46346-65CC-4DB2-85C4-B99826F79D0C}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {FAF46346-65CC-4DB2-85C4-B99826F79D0C}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {FAF46346-65CC-4DB2-85C4-B99826F79D0C}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{FAF46346-65CC-4DB2-85C4-B99826F79D0C}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{FAF46346-65CC-4DB2-85C4-B99826F79D0C}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{FAF46346-65CC-4DB2-85C4-B99826F79D0C}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1004,6 +1183,10 @@ Global {A90C4918-4B21-4277-93BD-AF65F30951D9}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Release|Win32
{A90C4918-4B21-4277-93BD-AF65F30951D9}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
{A90C4918-4B21-4277-93BD-AF65F30951D9}.3D Plugin Release|Win32.Build.0 = 3DPlugin Release|Win32
+ {A90C4918-4B21-4277-93BD-AF65F30951D9}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {A90C4918-4B21-4277-93BD-AF65F30951D9}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {A90C4918-4B21-4277-93BD-AF65F30951D9}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {A90C4918-4B21-4277-93BD-AF65F30951D9}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{A90C4918-4B21-4277-93BD-AF65F30951D9}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{A90C4918-4B21-4277-93BD-AF65F30951D9}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{A90C4918-4B21-4277-93BD-AF65F30951D9}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1018,6 +1201,10 @@ Global {76D90B92-ECC7-409C-9F98-A8814B90F3C0}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{76D90B92-ECC7-409C-9F98-A8814B90F3C0}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{76D90B92-ECC7-409C-9F98-A8814B90F3C0}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {76D90B92-ECC7-409C-9F98-A8814B90F3C0}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {76D90B92-ECC7-409C-9F98-A8814B90F3C0}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {76D90B92-ECC7-409C-9F98-A8814B90F3C0}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {76D90B92-ECC7-409C-9F98-A8814B90F3C0}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{76D90B92-ECC7-409C-9F98-A8814B90F3C0}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{76D90B92-ECC7-409C-9F98-A8814B90F3C0}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{76D90B92-ECC7-409C-9F98-A8814B90F3C0}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1034,6 +1221,10 @@ Global {1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{1CC733F1-6AB5-4904-8F63-C08C46B79DD9}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1050,6 +1241,10 @@ Global {542A9FA1-B7FF-441C-AE15-054DB31D3488}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{542A9FA1-B7FF-441C-AE15-054DB31D3488}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{542A9FA1-B7FF-441C-AE15-054DB31D3488}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {542A9FA1-B7FF-441C-AE15-054DB31D3488}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {542A9FA1-B7FF-441C-AE15-054DB31D3488}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {542A9FA1-B7FF-441C-AE15-054DB31D3488}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {542A9FA1-B7FF-441C-AE15-054DB31D3488}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{542A9FA1-B7FF-441C-AE15-054DB31D3488}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{542A9FA1-B7FF-441C-AE15-054DB31D3488}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{542A9FA1-B7FF-441C-AE15-054DB31D3488}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1066,6 +1261,10 @@ Global {E86B7BDE-C33C-4E55-9433-E74C141D7538}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{E86B7BDE-C33C-4E55-9433-E74C141D7538}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{E86B7BDE-C33C-4E55-9433-E74C141D7538}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {E86B7BDE-C33C-4E55-9433-E74C141D7538}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {E86B7BDE-C33C-4E55-9433-E74C141D7538}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {E86B7BDE-C33C-4E55-9433-E74C141D7538}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {E86B7BDE-C33C-4E55-9433-E74C141D7538}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{E86B7BDE-C33C-4E55-9433-E74C141D7538}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{E86B7BDE-C33C-4E55-9433-E74C141D7538}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{E86B7BDE-C33C-4E55-9433-E74C141D7538}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1082,6 +1281,10 @@ Global {4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1098,6 +1301,10 @@ Global {213356A9-3A1F-41DA-9819-1297BCD17DEE}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{213356A9-3A1F-41DA-9819-1297BCD17DEE}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{213356A9-3A1F-41DA-9819-1297BCD17DEE}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {213356A9-3A1F-41DA-9819-1297BCD17DEE}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {213356A9-3A1F-41DA-9819-1297BCD17DEE}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {213356A9-3A1F-41DA-9819-1297BCD17DEE}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {213356A9-3A1F-41DA-9819-1297BCD17DEE}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{213356A9-3A1F-41DA-9819-1297BCD17DEE}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{213356A9-3A1F-41DA-9819-1297BCD17DEE}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{213356A9-3A1F-41DA-9819-1297BCD17DEE}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1114,6 +1321,10 @@ Global {8B8D4FC3-3234-4E54-8376-5AB83D00D164}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{8B8D4FC3-3234-4E54-8376-5AB83D00D164}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{8B8D4FC3-3234-4E54-8376-5AB83D00D164}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {8B8D4FC3-3234-4E54-8376-5AB83D00D164}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {8B8D4FC3-3234-4E54-8376-5AB83D00D164}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {8B8D4FC3-3234-4E54-8376-5AB83D00D164}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {8B8D4FC3-3234-4E54-8376-5AB83D00D164}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{8B8D4FC3-3234-4E54-8376-5AB83D00D164}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{8B8D4FC3-3234-4E54-8376-5AB83D00D164}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{8B8D4FC3-3234-4E54-8376-5AB83D00D164}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1130,6 +1341,10 @@ Global {98330220-47A6-42E0-9DE4-AD0FF5D204D6}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{98330220-47A6-42E0-9DE4-AD0FF5D204D6}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{98330220-47A6-42E0-9DE4-AD0FF5D204D6}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {98330220-47A6-42E0-9DE4-AD0FF5D204D6}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {98330220-47A6-42E0-9DE4-AD0FF5D204D6}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {98330220-47A6-42E0-9DE4-AD0FF5D204D6}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {98330220-47A6-42E0-9DE4-AD0FF5D204D6}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{98330220-47A6-42E0-9DE4-AD0FF5D204D6}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{98330220-47A6-42E0-9DE4-AD0FF5D204D6}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{98330220-47A6-42E0-9DE4-AD0FF5D204D6}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1146,6 +1361,10 @@ Global {B789C2F3-279E-4A85-8F0A-7F7AC068E598}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{B789C2F3-279E-4A85-8F0A-7F7AC068E598}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{B789C2F3-279E-4A85-8F0A-7F7AC068E598}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {B789C2F3-279E-4A85-8F0A-7F7AC068E598}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {B789C2F3-279E-4A85-8F0A-7F7AC068E598}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {B789C2F3-279E-4A85-8F0A-7F7AC068E598}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {B789C2F3-279E-4A85-8F0A-7F7AC068E598}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{B789C2F3-279E-4A85-8F0A-7F7AC068E598}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{B789C2F3-279E-4A85-8F0A-7F7AC068E598}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{B789C2F3-279E-4A85-8F0A-7F7AC068E598}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1162,6 +1381,10 @@ Global {02110D03-59DB-4571-8787-72B3C03B2F2D}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
{02110D03-59DB-4571-8787-72B3C03B2F2D}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
{02110D03-59DB-4571-8787-72B3C03B2F2D}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {02110D03-59DB-4571-8787-72B3C03B2F2D}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {02110D03-59DB-4571-8787-72B3C03B2F2D}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {02110D03-59DB-4571-8787-72B3C03B2F2D}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {02110D03-59DB-4571-8787-72B3C03B2F2D}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
{02110D03-59DB-4571-8787-72B3C03B2F2D}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{02110D03-59DB-4571-8787-72B3C03B2F2D}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
{02110D03-59DB-4571-8787-72B3C03B2F2D}.BlenderPlayer Debug|Win32.ActiveCfg = Blender Debug|Win32
@@ -1174,6 +1397,10 @@ Global {884D8731-654C-4C7F-9A75-8F37A305BE1E}.3D Plugin Debug|Win32.Build.0 = Blender Release|Win32
{884D8731-654C-4C7F-9A75-8F37A305BE1E}.3D Plugin Release|Win32.ActiveCfg = Blender Release|Win32
{884D8731-654C-4C7F-9A75-8F37A305BE1E}.3D Plugin Release|Win32.Build.0 = Blender Release|Win32
+ {884D8731-654C-4C7F-9A75-8F37A305BE1E}.3DPlugin Debug|Win32.ActiveCfg = Blender Release|Win32
+ {884D8731-654C-4C7F-9A75-8F37A305BE1E}.3DPlugin Debug|Win32.Build.0 = Blender Release|Win32
+ {884D8731-654C-4C7F-9A75-8F37A305BE1E}.3DPlugin Release|Win32.ActiveCfg = Blender Release|Win32
+ {884D8731-654C-4C7F-9A75-8F37A305BE1E}.3DPlugin Release|Win32.Build.0 = Blender Release|Win32
{884D8731-654C-4C7F-9A75-8F37A305BE1E}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{884D8731-654C-4C7F-9A75-8F37A305BE1E}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{884D8731-654C-4C7F-9A75-8F37A305BE1E}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1190,6 +1417,10 @@ Global {FB88301F-F725-401B-ACD7-D2ABBF333B71}.3D Plugin Debug|Win32.Build.0 = Blender Debug|Win32
{FB88301F-F725-401B-ACD7-D2ABBF333B71}.3D Plugin Release|Win32.ActiveCfg = Blender Debug|Win32
{FB88301F-F725-401B-ACD7-D2ABBF333B71}.3D Plugin Release|Win32.Build.0 = Blender Debug|Win32
+ {FB88301F-F725-401B-ACD7-D2ABBF333B71}.3DPlugin Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {FB88301F-F725-401B-ACD7-D2ABBF333B71}.3DPlugin Debug|Win32.Build.0 = Blender Debug|Win32
+ {FB88301F-F725-401B-ACD7-D2ABBF333B71}.3DPlugin Release|Win32.ActiveCfg = Blender Debug|Win32
+ {FB88301F-F725-401B-ACD7-D2ABBF333B71}.3DPlugin Release|Win32.Build.0 = Blender Debug|Win32
{FB88301F-F725-401B-ACD7-D2ABBF333B71}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{FB88301F-F725-401B-ACD7-D2ABBF333B71}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{FB88301F-F725-401B-ACD7-D2ABBF333B71}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1206,6 +1437,10 @@ Global {8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.3D Plugin Debug|Win32.Build.0 = 3D Plugin Debug|Win32
{8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.3D Plugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
{8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.3D Plugin Release|Win32.Build.0 = 3D Plugin Release|Win32
+ {8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.3DPlugin Debug|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.3DPlugin Debug|Win32.Build.0 = 3D Plugin Release|Win32
+ {8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.3DPlugin Release|Win32.ActiveCfg = 3D Plugin Release|Win32
+ {8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.3DPlugin Release|Win32.Build.0 = 3D Plugin Release|Win32
{8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{8C2BCCF8-4D9E-46D3-BABF-C1545A332CE6}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1222,6 +1457,10 @@ Global {DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.3D Plugin Debug|Win32.Build.0 = Blender Release|Win32
{DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.3D Plugin Release|Win32.ActiveCfg = Blender Release|Win32
{DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.3D Plugin Release|Win32.Build.0 = Blender Release|Win32
+ {DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.3DPlugin Debug|Win32.ActiveCfg = Blender Release|Win32
+ {DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.3DPlugin Debug|Win32.Build.0 = Blender Release|Win32
+ {DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.3DPlugin Release|Win32.ActiveCfg = Blender Release|Win32
+ {DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.3DPlugin Release|Win32.Build.0 = Blender Release|Win32
{DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{DFE7F3E3-E62A-4677-B666-DF0DDF70C359}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1238,6 +1477,10 @@ Global {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.3D Plugin Debug|Win32.Build.0 = Blender Release|Win32
{7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.3D Plugin Release|Win32.ActiveCfg = Blender Release|Win32
{7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.3D Plugin Release|Win32.Build.0 = Blender Release|Win32
+ {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.3DPlugin Debug|Win32.ActiveCfg = Blender Release|Win32
+ {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.3DPlugin Debug|Win32.Build.0 = Blender Release|Win32
+ {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.3DPlugin Release|Win32.ActiveCfg = Blender Release|Win32
+ {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.3DPlugin Release|Win32.Build.0 = Blender Release|Win32
{7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
{7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
{7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
@@ -1250,22 +1493,46 @@ Global {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.Debug|Win32.Build.0 = Blender Debug|Win32
{7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.Release|Win32.ActiveCfg = Blender Release|Win32
{7495FE37-933A-4AC1-BB2A-B3FDB4DE4284}.Release|Win32.Build.0 = Blender Release|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.3D Plugin Debug|Win32.ActiveCfg = Debug|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.3D Plugin Debug|Win32.Build.0 = Debug|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.3D Plugin Release|Win32.ActiveCfg = Release|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.3D Plugin Release|Win32.Build.0 = Release|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.Blender Debug|Win32.ActiveCfg = Debug|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.Blender Debug|Win32.Build.0 = Debug|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.Blender Release|Win32.ActiveCfg = Release|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.Blender Release|Win32.Build.0 = Release|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.BlenderPlayer Debug|Win32.ActiveCfg = Debug|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.BlenderPlayer Debug|Win32.Build.0 = Debug|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.BlenderPlayer Release|Win32.ActiveCfg = Release|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.BlenderPlayer Release|Win32.Build.0 = Release|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.Debug|Win32.ActiveCfg = Debug|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.Debug|Win32.Build.0 = Debug|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.Release|Win32.ActiveCfg = Release|Win32
- {6A51010A-9393-4D77-84B4-5BBCDA6E7C25}.Release|Win32.Build.0 = Release|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.3D Plugin Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.3D Plugin Debug|Win32.Build.0 = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.3D Plugin Release|Win32.ActiveCfg = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.3D Plugin Release|Win32.Build.0 = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.3DPlugin Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.3DPlugin Debug|Win32.Build.0 = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.3DPlugin Release|Win32.ActiveCfg = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.3DPlugin Release|Win32.Build.0 = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.Blender Release|Win32.Build.0 = Blender Release|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.BlenderPlayer Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.BlenderPlayer Debug|Win32.Build.0 = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.BlenderPlayer Release|Win32.ActiveCfg = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.BlenderPlayer Release|Win32.Build.0 = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.Debug|Win32.Build.0 = Blender Debug|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.Release|Win32.ActiveCfg = Blender Release|Win32
+ {D1A9312F-4557-4982-A0F4-4D08508235F4}.Release|Win32.Build.0 = Blender Release|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.3D Plugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.3D Plugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.3D Plugin Release|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.3D Plugin Release|Win32.Build.0 = 3DPlugin Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.3DPlugin Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.3DPlugin Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.3DPlugin Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.3DPlugin Release|Win32.Build.0 = 3DPlugin Release|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.Blender Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.Blender Debug|Win32.Build.0 = Blender Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.Blender Release|Win32.ActiveCfg = Blender Release|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.Blender Release|Win32.Build.0 = Blender Release|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.BlenderPlayer Debug|Win32.ActiveCfg = Blender Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.BlenderPlayer Debug|Win32.Build.0 = Blender Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.BlenderPlayer Release|Win32.ActiveCfg = Blender Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.BlenderPlayer Release|Win32.Build.0 = Blender Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.Debug|Win32.ActiveCfg = 3DPlugin Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.Debug|Win32.Build.0 = 3DPlugin Debug|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.Release|Win32.ActiveCfg = 3DPlugin Release|Win32
+ {E8904FB3-F8F7-BC21-87A6-029A57B901F4}.Release|Win32.Build.0 = 3DPlugin Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj b/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj index 8abe5f8feca..4b167d30a0e 100644 --- a/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj +++ b/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj @@ -43,7 +43,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
PreprocessorDefinitions="_DEBUG,WIN32,_LIB"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -118,7 +118,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_OPENEXR;WITH_DDS;WITH_BULLET;WITH_FFMPEG"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -193,7 +193,7 @@ <Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;UNWRAPPER;WITH_OPENEXR;WITH_DDS;WITH_BULLET=1;WITH_FFMPEG"
StringPooling="true"
RuntimeLibrary="0"
@@ -268,7 +268,7 @@ <Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
PreprocessorDefinitions="NDEBUG,WIN32,_LIB"
StringPooling="true"
RuntimeLibrary="2"
@@ -343,7 +343,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_FFMPEG"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -418,7 +418,7 @@ <Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;UNWRAPPER;WITH_FFMPEG"
StringPooling="true"
RuntimeLibrary="0"
@@ -530,6 +530,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\intern\boids.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\intern\booleanops.c"
>
</File>
@@ -762,6 +766,14 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\intern\sketch.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\blenkernel\intern\smoke.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\intern\softbody.c"
>
</File>
@@ -847,6 +859,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\BKE_boids.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\BKE_booleanops.h"
>
</File>
@@ -1059,6 +1075,14 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\BKE_sketch.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\blenkernel\BKE_smoke.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\BKE_softbody.h"
>
</File>
diff --git a/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj b/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj index 6b5359509ab..d31a7fb4500 100644 --- a/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj +++ b/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj @@ -523,6 +523,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\blenlib\intern\DLRB_tree.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenlib\intern\dynamiclist.c"
>
</File>
@@ -640,6 +644,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\blenlib\BLI_dlrbTree.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenlib\BLI_dynamiclist.h"
>
</File>
diff --git a/projectfiles_vc9/blender/editors/ED_editors.vcproj b/projectfiles_vc9/blender/editors/ED_editors.vcproj index 80fe2361443..e442bb27861 100644 --- a/projectfiles_vc9/blender/editors/ED_editors.vcproj +++ b/projectfiles_vc9/blender/editors/ED_editors.vcproj @@ -43,7 +43,7 @@ <Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\ghost\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\blenkey\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\editors\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenfont;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\windowmanager;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\ghost\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\blenkey\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\editors\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenfont;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\windowmanager;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER=1;WITH_QUICKTIME;INTERNATIONAL;WITH_FREETYPE2;WITH_INTERNATIONAL;WITH_OPENEXR;WITH_DDS;WITH_BULLET=1;WITH_FFMPEG"
StringPooling="true"
RuntimeLibrary="0"
@@ -118,7 +118,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\ghost\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\blenkey\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\editors\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenfont;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\windowmanager;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\ghost\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\blenkey\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\editors\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenfont;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\windowmanager;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER=1;WITH_QUICKTIME;INTERNATIONAL;WITH_BF_INTERNATIONAL;WITH_FREETYPE2;WITH_OPENEXR;WITH_DDS;WITH_BULLET = 1;WITH_FFMPEG"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -238,6 +238,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\editors\include\ED_mball.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\editors\include\ED_mesh.h"
>
</File>
@@ -1403,6 +1407,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\editors\physics\physics_boids.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\editors\physics\physics_intern.h"
>
</File>
@@ -1431,6 +1439,46 @@ >
</File>
</Filter>
+ <Filter
+ Name="space_console"
+ >
+ <File
+ RelativePath="..\..\..\source\blender\editors\space_console\console_draw.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\space_console\console_intern.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\space_console\console_ops.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\space_console\console_report.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\space_console\space_console.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="metaball"
+ >
+ <File
+ RelativePath="..\..\..\source\blender\editors\metaball\editmball.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\metaball\mball_intern.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\editors\metaball\mball_ops.c"
+ >
+ </File>
+ </Filter>
</Files>
<Globals>
</Globals>
diff --git a/projectfiles_vc9/blender/loader/BLO_loader.vcproj b/projectfiles_vc9/blender/loader/BLO_loader.vcproj index 74459e2e793..0906904e293 100644 --- a/projectfiles_vc9/blender/loader/BLO_loader.vcproj +++ b/projectfiles_vc9/blender/loader/BLO_loader.vcproj @@ -43,7 +43,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\zlib\include;..\..\..\source\blender\inflate;..\..\..\source\blender\deflate;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\streamglue;..\..\..\source\blender\readblenfile;..\..\..\source\blender\writeblenfile;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\writestreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\kernel\gen_messaging;..\..\..\..\build\msvc_9\extern\verse\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\zlib\include;..\..\..\source\blender\inflate;..\..\..\source\blender\deflate;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\streamglue;..\..\..\source\blender\readblenfile;..\..\..\source\blender\writeblenfile;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\writestreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\kernel\gen_messaging;..\..\..\..\build\msvc_9\extern\verse\include"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -268,7 +268,7 @@ <Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\zlib\include;..\..\..\source\blender\inflate;..\..\..\source\blender\deflate;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\streamglue;..\..\..\source\blender\readblenfile;..\..\..\source\blender\writeblenfile;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\writestreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\kernel\gen_messaging;..\..\..\..\build\msvc_9\extern\verse\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\lib\windows\zlib\include;..\..\..\source\blender\inflate;..\..\..\source\blender\deflate;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesrna;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\streamglue;..\..\..\source\blender\readblenfile;..\..\..\source\blender\writeblenfile;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\writestreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\kernel\gen_messaging;..\..\..\..\build\msvc_9\extern\verse\include"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB"
StringPooling="true"
RuntimeLibrary="0"
diff --git a/projectfiles_vc9/blender/makesdna/DNA_makesdna.vcproj b/projectfiles_vc9/blender/makesdna/DNA_makesdna.vcproj index 96de0231363..ef459744b64 100644 --- a/projectfiles_vc9/blender/makesdna/DNA_makesdna.vcproj +++ b/projectfiles_vc9/blender/makesdna/DNA_makesdna.vcproj @@ -614,6 +614,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\makesdna\DNA_boid_types.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesdna\DNA_brush_types.h"
>
</File>
@@ -766,10 +770,6 @@ >
</File>
<File
- RelativePath="..\..\..\source\blender\makesdna\DNA_scriptlink_types.h"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\makesdna\DNA_sdna_types.h"
>
</File>
@@ -782,6 +782,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\makesdna\DNA_smoke_types.h"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesdna\DNA_sound_types.h"
>
</File>
diff --git a/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj b/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj index 9e4c50e9e3f..b907997f190 100644 --- a/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj +++ b/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj @@ -45,7 +45,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\makesdna;..\..\..\source\blender\windowmanager"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\windowmanager"
PreprocessorDefinitions="_DEBUG,WIN32,_CONSOLE"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -140,7 +140,7 @@ <Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\makesdna;..\..\..\source\blender\windowmanager"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\windowmanager"
PreprocessorDefinitions="NDEBUG,WIN32,_CONSOLE"
StringPooling="true"
RuntimeLibrary="0"
@@ -234,7 +234,7 @@ <Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\makesdna;..\..\..\source\blender\windowmanager"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\windowmanager"
PreprocessorDefinitions="NDEBUG,WIN32,_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
@@ -328,7 +328,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\makesdna;..\..\..\source\blender\windowmanager"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\windowmanager"
PreprocessorDefinitions="_DEBUG;WIN32;_CONSOLE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -425,7 +425,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\makesdna;..\..\..\source\blender\windowmanager"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\windowmanager"
PreprocessorDefinitions="_DEBUG,WIN32,_CONSOLE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -522,7 +522,7 @@ <Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\makesdna;..\..\..\source\blender\windowmanager"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\editors\include;..\..\..\source\blender\blenkernel;..\..\..\..\lib\windows\pthreads\include;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\windowmanager"
PreprocessorDefinitions="NDEBUG,WIN32,_CONSOLE"
StringPooling="true"
RuntimeLibrary="0"
@@ -615,6 +615,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_boid.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_brush.c"
>
</File>
@@ -747,6 +751,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_render.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_rna.c"
>
</File>
@@ -759,7 +767,7 @@ >
</File>
<File
- RelativePath="..\..\..\source\blender\makesrna\intern\rna_scriptlink.c"
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_sculpt_paint.c"
>
</File>
<File
@@ -771,6 +779,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_smoke.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_sound.c"
>
</File>
@@ -807,10 +819,6 @@ >
</File>
<File
- RelativePath="..\..\..\source\blender\makesrna\intern\rna_vpaint.c"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_wm.c"
>
</File>
diff --git a/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj b/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj index f6eb7b282e0..1d7c3f38581 100644 --- a/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj +++ b/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj @@ -43,7 +43,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\source\blender\render\extern\include"
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -114,7 +114,7 @@ Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\windowmanager;..\..\..\source\blender\editors\include;..\..\..\source\blender\render\extern\include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
RuntimeLibrary="0"
@@ -187,6 +187,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_boid_gen.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_brush_gen.c"
>
</File>
@@ -303,6 +307,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_render_gen.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_rna_gen.c"
>
</File>
@@ -315,7 +323,7 @@ >
</File>
<File
- RelativePath="..\..\..\source\blender\makesrna\intern\rna_scriptlink_gen.c"
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_sculpt_paint_gen.c"
>
</File>
<File
@@ -327,6 +335,10 @@ >
</File>
<File
+ RelativePath="..\..\..\source\blender\makesrna\intern\rna_smoke_gen.c"
+ >
+ </File>
+ <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_sound_gen.c"
>
</File>
@@ -359,10 +371,6 @@ >
</File>
<File
- RelativePath="..\..\..\source\blender\makesrna\intern\rna_vpaint_gen.c"
- >
- </File>
- <File
RelativePath="..\..\..\source\blender\makesrna\intern\rna_wm_gen.c"
>
</File>
diff --git a/projectfiles_vc9/blender/nodes/nodes.vcproj b/projectfiles_vc9/blender/nodes/nodes.vcproj index f7dc938d8f2..d188725918b 100644 --- a/projectfiles_vc9/blender/nodes/nodes.vcproj +++ b/projectfiles_vc9/blender/nodes/nodes.vcproj @@ -42,7 +42,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB"
MinimalRebuild="false"
BasicRuntimeChecks="3"
@@ -112,7 +112,7 @@ />
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB"
BasicRuntimeChecks="0"
RuntimeLibrary="0"
@@ -182,7 +182,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_OPENEXR"
MinimalRebuild="false"
BasicRuntimeChecks="3"
@@ -252,7 +252,7 @@ />
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\editors\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\source\blender\makesrna"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_OPENEXR"
BasicRuntimeChecks="0"
RuntimeLibrary="0"
diff --git a/projectfiles_vc9/blender/render/BRE_render.vcproj b/projectfiles_vc9/blender/render/BRE_render.vcproj index 27b2163f20c..d7851674857 100644 --- a/projectfiles_vc9/blender/render/BRE_render.vcproj +++ b/projectfiles_vc9/blender/render/BRE_render.vcproj @@ -42,7 +42,7 @@ <Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\sdl\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\yafray;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenkernel;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\blender\render\intern\include;..\..\..\source\blender\render\extern\include;..\..\..\source\kernel;..\..\..\source\kernel\gen_messaging"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\sdl\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\yafray;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenkernel;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\blender\render\intern\include;..\..\..\source\blender\render\extern\include;..\..\..\source\kernel;..\..\..\source\kernel\gen_messaging"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_QUICKTIME;WITH_OPENEXR"
StringPooling="true"
RuntimeLibrary="0"
@@ -117,7 +117,7 @@ <Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\sdl\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\yafray;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenkernel;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\blender\render\intern\include;..\..\..\source\blender\render\extern\include;..\..\..\source\kernel;..\..\..\source\kernel\gen_messaging"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\sdl\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\source\blender;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\yafray;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenkernel;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\blender\render\intern\include;..\..\..\source\blender\render\extern\include;..\..\..\source\kernel;..\..\..\source\kernel\gen_messaging"
PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_QUICKTIME;WITH_OPENEXR;_USE_MATH_DEFINES"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
diff --git a/release/Makefile b/release/Makefile index 2d688211b9c..24827014b16 100644 --- a/release/Makefile +++ b/release/Makefile @@ -166,6 +166,12 @@ endif @echo "----> Copy python UI files" @[ ! -d ui ] || cp -r ui $(CONFDIR)/ui + + ifeq ($(OS),darwin) + @echo "----> Copy python modules" + @mkdir $(CONFDIR)/python/ + @unzip -q $(LCGDIR)/release/python.zip -d $(CONFDIR)/python/ + endif ifeq ($(OS),darwin) @echo "----> Move .blender to .app/Contents/MacOS/" diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons Binary files differindex 963c76fcfa9..98c321cd954 100644 --- a/release/datafiles/blenderbuttons +++ b/release/datafiles/blenderbuttons diff --git a/release/datafiles/splash.jpg b/release/datafiles/splash.jpg Binary files differindex deae8155ff4..1c34cf36f75 100644 --- a/release/datafiles/splash.jpg +++ b/release/datafiles/splash.jpg diff --git a/release/io/engine_render_pov.py b/release/io/engine_render_pov.py new file mode 100644 index 00000000000..44f34d890f6 --- /dev/null +++ b/release/io/engine_render_pov.py @@ -0,0 +1,780 @@ +import bpy + +from math import atan, pi, degrees +import subprocess +import os +import sys +import time + +import platform as pltfrm + +if pltfrm.architecture()[0] == '64bit': + bitness = 64 +else: + bitness = 32 + +def write_pov(filename, scene=None, info_callback = None): + file = open(filename, 'w') + + # Only for testing + if not scene: + scene = bpy.data.scenes[0] + + render = scene.render_data + materialTable = {} + + def saneName(name): + name = name.lower() + for ch in ' /\\+=-[]{}().,<>\'":;~!@#$%^&*|?': + name = name.replace(ch, '_') + return name + + def writeMatrix(matrix): + file.write('\tmatrix <%.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f>\n' %\ + (matrix[0][0], matrix[0][1], matrix[0][2], matrix[1][0], matrix[1][1], matrix[1][2], matrix[2][0], matrix[2][1], matrix[2][2], matrix[3][0], matrix[3][1], matrix[3][2]) ) + + def exportCamera(): + camera = scene.camera + matrix = camera.matrix + + # compute resolution + Qsize=float(render.resolution_x)/float(render.resolution_y) + + file.write('camera {\n') + file.write('\tlocation <0, 0, 0>\n') + file.write('\tlook_at <0, 0, -1>\n') + file.write('\tright <%s, 0, 0>\n' % -Qsize) + file.write('\tup <0, 1, 0>\n') + file.write('\tangle %f \n' % (360.0*atan(16.0/camera.data.lens)/pi)) + + file.write('\trotate <%.6f, %.6f, %.6f>\n' % tuple([degrees(e) for e in matrix.rotationPart().toEuler()])) + file.write('\ttranslate <%.6f, %.6f, %.6f>\n' % (matrix[3][0], matrix[3][1], matrix[3][2])) + file.write('}\n') + + + + def exportLamps(lamps): + # Get all lamps + for ob in lamps: + lamp = ob.data + + matrix = ob.matrix + + color = tuple([c * lamp.energy for c in lamp.color]) # Colour is modified by energy + + file.write('light_source {\n') + file.write('\t< 0,0,0 >\n') + file.write('\tcolor rgb<%.3g, %.3g, %.3g>\n' % color) + + if lamp.type == 'POINT': # Point Lamp + pass + elif lamp.type == 'SPOT': # Spot + file.write('\tspotlight\n') + + # Falloff is the main radius from the centre line + file.write('\tfalloff %.2f\n' % (lamp.spot_size/2.0) ) # 1 TO 179 FOR BOTH + file.write('\tradius %.6f\n' % ((lamp.spot_size/2.0) * (1-lamp.spot_blend)) ) + + # Blender does not have a tightness equivilent, 0 is most like blender default. + file.write('\ttightness 0\n') # 0:10f + + file.write('\tpoint_at <0, 0, -1>\n') + elif lamp.type == 'AREA': + + size_x = lamp.size + samples_x = lamp.shadow_ray_samples_x + if lamp.shape == 'SQUARE': + size_y = size_x + samples_y = samples_x + else: + size_y = lamp.size_y + samples_y = lamp.shadow_ray_samples_y + + + + file.write('\tarea_light <%d,0,0>,<0,0,%d> %d, %d\n' % (size_x, size_y, samples_x, samples_y)) + if lamp.shadow_ray_sampling_method == 'CONSTANT_JITTERED': + if lamp.jitter: + file.write('\tjitter\n') + else: + file.write('\tadaptive 1\n') + file.write('\tjitter\n') + + if lamp.shadow_method == 'NOSHADOW': + file.write('\tshadowless\n') + + file.write('\tfade_distance %.6f\n' % lamp.distance) + file.write('\tfade_power %d\n' % 1) # Could use blenders lamp quad? + writeMatrix(matrix) + + file.write('}\n') + + def exportMeshs(sel): + def bMat2PovString(material): + povstring = 'finish {' + if world != None: + povstring += 'ambient <%.6f, %.6f, %.6f> ' % tuple([c*material.ambient for c in world.ambient_color]) + + povstring += 'diffuse %.6f ' % material.diffuse_reflection + povstring += 'specular %.6f ' % material.specular_reflection + + + if material.raytrace_mirror.enabled: + #povstring += 'interior { ior %.6f } ' % material.IOR + raytrace_mirror= material.raytrace_mirror + if raytrace_mirror.reflect: + povstring += 'reflection {' + povstring += '<%.6f, %.6f, %.6f>' % tuple(material.mirror_color) # Should ask for ray mirror flag + povstring += 'fresnel 1 falloff %.6f exponent %.6f metallic %.6f} ' % (raytrace_mirror.fresnel, raytrace_mirror.fresnel_fac, raytrace_mirror.reflect) + + + + if material.raytrace_transparency.enabled: + #povstring += 'interior { ior %.6f } ' % material.IOR + pass + + #file.write('\t\troughness %.6f\n' % (material.hard*0.5)) + #file.write('\t\t\tcrand 0.0\n') # Sand granyness + #file.write('\t\t\tmetallic %.6f\n' % material.spec) + #file.write('\t\t\tphong %.6f\n' % material.spec) + #file.write('\t\t\tphong_size %.6f\n' % material.spec) + povstring += 'brilliance %.6f ' % (material.specular_hardness/256.0) # Like hardness + povstring += '}' + #file.write('\t}\n') + return povstring + + + world = scene.world + + # Convert all materials to strings we can access directly per vertex. + for material in bpy.data.materials: + materialTable[material.name] = bMat2PovString(material) + + + ob_num = 0 + + for ob in sel: + ob_num+= 1 + + if ob.type in ('LAMP', 'CAMERA', 'EMPTY'): + continue + + me = ob.data + me_materials= me.materials + + me = ob.create_render_mesh(scene) + + if not me: + continue + + if info_callback: + info_callback('Object %2.d of %2.d (%s)' % (ob_num, len(sel), ob.name)) + + #if ob.type!='MESH': + # continue + # me = ob.data + + matrix = ob.matrix + try: uv_layer = me.active_uv_texture.data + except:uv_layer = None + + try: vcol_layer = me.active_vertex_color.data + except:vcol_layer = None + + + def regular_face(f): + fv = f.verts + if fv[3]== 0: + return fv[0], fv[1], fv[2] + return fv[0], fv[1], fv[2], fv[3] + + faces_verts = [regular_face(f) for f in me.faces] + faces_normals = [tuple(f.normal) for f in me.faces] + verts_normals = [tuple(v.normal) for v in me.verts] + + # quads incur an extra face + quadCount = len([f for f in faces_verts if len(f)==4]) + + file.write('mesh2 {\n') + file.write('\tvertex_vectors {\n') + file.write('\t\t%s' % (len(me.verts))) # vert count + for v in me.verts: + file.write(',\n\t\t<%.6f, %.6f, %.6f>' % tuple(v.co)) # vert count + file.write('\n }\n') + + + # Build unique Normal list + uniqueNormals = {} + for fi, f in enumerate(me.faces): + fv = faces_verts[fi] + # [-1] is a dummy index, use a list so we can modify in place + if f.smooth: # Use vertex normals + for v in fv: + key = verts_normals[v] + uniqueNormals[key] = [-1] + else: # Use face normal + key = faces_normals[fi] + uniqueNormals[key] = [-1] + + file.write('\tnormal_vectors {\n') + file.write('\t\t%d' % len(uniqueNormals)) # vert count + idx = 0 + for no, index in uniqueNormals.items(): + file.write(',\n\t\t<%.6f, %.6f, %.6f>' % no) # vert count + index[0] = idx + idx +=1 + file.write('\n }\n') + + + # Vertex colours + vertCols = {} # Use for material colours also. + + if uv_layer: + # Generate unique UV's + uniqueUVs = {} + + for fi, uv in enumerate(uv_layer): + + if len(faces_verts[fi])==4: + uvs = uv.uv1, uv.uv2, uv.uv3, uv.uv4 + else: + uvs = uv.uv1, uv.uv2, uv.uv3 + + for uv in uvs: + uniqueUVs[tuple(uv)] = [-1] + + file.write('\tuv_vectors {\n') + #print unique_uvs + file.write('\t\t%s' % (len(uniqueUVs))) # vert count + idx = 0 + for uv, index in uniqueUVs.items(): + file.write(',\n\t\t<%.6f, %.6f>' % uv) + index[0] = idx + idx +=1 + ''' + else: + # Just add 1 dummy vector, no real UV's + file.write('\t\t1') # vert count + file.write(',\n\t\t<0.0, 0.0>') + ''' + file.write('\n }\n') + + + if me.vertex_colors: + + for fi, f in enumerate(me.faces): + material_index = f.material_index + material = me_materials[material_index] + + if material and material.vertex_color_paint: + + col = vcol_layer[fi] + + if len(faces_verts[fi])==4: + cols = col.color1, col.color2, col.color3, col.color4 + else: + cols = col.color1, col.color2, col.color3 + + for col in cols: + key = col[0], col[1], col[2], material_index # Material index! + vertCols[key] = [-1] + + else: + if material: + diffuse_color = tuple(material.diffuse_color) + key = diffuse_color[0], diffuse_color[1], diffuse_color[2], material_index + vertCols[key] = [-1] + + + else: + # No vertex colours, so write material colours as vertex colours + for i, material in enumerate(me_materials): + + if material: + diffuse_color = tuple(material.diffuse_color) + key = diffuse_color[0], diffuse_color[1], diffuse_color[2], i # i == f.mat + vertCols[key] = [-1] + + + # Vert Colours + file.write('\ttexture_list {\n') + file.write('\t\t%s' % (len(vertCols))) # vert count + idx=0 + for col, index in vertCols.items(): + + if me_materials: + material = me_materials[col[3]] + materialString = materialTable[material.name] + else: + materialString = '' # Dont write anything + + float_col = col[0], col[1], col[2], 1-material.alpha, materialString + #print material.apl + file.write(',\n\t\ttexture { pigment {rgbf<%.3g, %.3g, %.3g, %.3g>}%s}' % float_col) + index[0] = idx + idx+=1 + + file.write( '\n }\n' ) + + # Face indicies + file.write('\tface_indices {\n') + file.write('\t\t%d' % (len(me.faces) + quadCount)) # faces count + for fi, f in enumerate(me.faces): + fv = faces_verts[fi] + material_index= f.material_index + if len(fv) == 4: indicies = (0,1,2), (0,2,3) + else: indicies = ((0,1,2),) + + if vcol_layer: + col = vcol_layer[fi] + + if len(fv) == 4: + cols = col.color1, col.color2, col.color3, col.color4 + else: + cols = col.color1, col.color2, col.color3 + + + if not me_materials or me_materials[material_index] == None: # No materials + for i1, i2, i3 in indicies: + file.write(',\n\t\t<%d,%d,%d>' % (fv[i1], fv[i2], fv[i3])) # vert count + else: + material = me_materials[material_index] + for i1, i2, i3 in indicies: + if me.vertex_colors and material.vertex_color_paint: + # Colour per vertex - vertex colour + + col1 = cols[i1] + col2 = cols[i2] + col3 = cols[i3] + + ci1 = vertCols[col1[0], col1[1], col1[2], material_index][0] + ci2 = vertCols[col2[0], col2[1], col2[2], material_index][0] + ci3 = vertCols[col3[0], col3[1], col3[2], material_index][0] + else: + # Colour per material - flat material colour + diffuse_color= material.diffuse_color + ci1 = ci2 = ci3 = vertCols[diffuse_color[0], diffuse_color[1], diffuse_color[2], f.material_index][0] + + file.write(',\n\t\t<%d,%d,%d>, %d,%d,%d' % (fv[i1], fv[i2], fv[i3], ci1, ci2, ci3)) # vert count + + + + file.write('\n }\n') + + # normal_indices indicies + file.write('\tnormal_indices {\n') + file.write('\t\t%d' % (len(me.faces) + quadCount)) # faces count + for fi, fv in enumerate(faces_verts): + + if len(fv) == 4: indicies = (0,1,2), (0,2,3) + else: indicies = ((0,1,2),) + + for i1, i2, i3 in indicies: + if f.smooth: + file.write(',\n\t\t<%d,%d,%d>' %\ + (uniqueNormals[verts_normals[fv[i1]]][0],\ + uniqueNormals[verts_normals[fv[i2]]][0],\ + uniqueNormals[verts_normals[fv[i3]]][0])) # vert count + else: + idx = uniqueNormals[faces_normals[fi]][0] + file.write(',\n\t\t<%d,%d,%d>' % (idx, idx, idx)) # vert count + + file.write('\n }\n') + + if uv_layer: + file.write('\tuv_indices {\n') + file.write('\t\t%d' % (len(me.faces) + quadCount)) # faces count + for fi, fv in enumerate(faces_verts): + + if len(fv) == 4: indicies = (0,1,2), (0,2,3) + else: indicies = ((0,1,2),) + + uv = uv_layer[fi] + if len(faces_verts[fi])==4: + uvs = tuple(uv.uv1), tuple(uv.uv2), tuple(uv.uv3), tuple(uv.uv4) + else: + uvs = tuple(uv.uv1), tuple(uv.uv2), tuple(uv.uv3) + + for i1, i2, i3 in indicies: + file.write(',\n\t\t<%d,%d,%d>' %\ + (uniqueUVs[uvs[i1]][0],\ + uniqueUVs[uvs[i2]][0],\ + uniqueUVs[uvs[i2]][0])) # vert count + file.write('\n }\n') + + if me.materials: + material = me.materials[0] # dodgy + if material and material.raytrace_transparency.enabled: + file.write('\tinterior { ior %.6f }\n' % material.raytrace_transparency.ior) + + writeMatrix(matrix) + file.write('}\n') + + bpy.data.remove_mesh(me) + + def exportWorld(world): + if not world: + return + + mist = world.mist + + if mist.enabled: + file.write('fog {\n') + file.write('\tdistance %.6f\n' % mist.depth) + file.write('\tcolor rgbt<%.3g, %.3g, %.3g, %.3g>\n' % (tuple(world.horizon_color) + (1-mist.intensity,))) + #file.write('\tfog_offset %.6f\n' % mist.start) + #file.write('\tfog_alt 5\n') + #file.write('\tturbulence 0.2\n') + #file.write('\tturb_depth 0.3\n') + file.write('\tfog_type 1\n') + file.write('}\n') + + def exportGlobalSettings(scene): + + file.write('global_settings {\n') + + if scene.pov_radio_enable: + file.write('\tradiosity {\n') + file.write("\t\tadc_bailout %.4g\n" % scene.pov_radio_adc_bailout) + file.write("\t\talways_sample %d\n" % scene.pov_radio_always_sample) + file.write("\t\tbrightness %.4g\n" % scene.pov_radio_brightness) + file.write("\t\tcount %d\n" % scene.pov_radio_count) + file.write("\t\terror_bound %.4g\n" % scene.pov_radio_error_bound) + file.write("\t\tgray_threshold %.4g\n" % scene.pov_radio_gray_threshold) + file.write("\t\tlow_error_factor %.4g\n" % scene.pov_radio_low_error_factor) + file.write("\t\tminimum_reuse %.4g\n" % scene.pov_radio_minimum_reuse) + file.write("\t\tnearest_count %d\n" % scene.pov_radio_nearest_count) + file.write("\t\tnormal %d\n" % scene.pov_radio_normal) + file.write("\t\trecursion_limit %d\n" % scene.pov_radio_recursion_limit) + file.write('\t}\n') + + file.write('}\n') + + + + + exportCamera() + #exportMaterials() + sel = scene.objects + lamps = [l for l in sel if l.type == 'LAMP'] + exportLamps(lamps) + exportMeshs(sel) + exportWorld(scene.world) + exportGlobalSettings(scene) + + file.close() + + +def write_pov_ini(filename_ini, filename_pov, filename_image): + scene = bpy.data.scenes[0] + render = scene.render_data + + x= int(render.resolution_x*render.resolution_percentage*0.01) + y= int(render.resolution_y*render.resolution_percentage*0.01) + + file = open(filename_ini, 'w') + + file.write('Input_File_Name="%s"\n' % filename_pov) + file.write('Output_File_Name="%s"\n' % filename_image) + + file.write('Width=%d\n' % x) + file.write('Height=%d\n' % y) + + # Needed for border render. + ''' + file.write('Start_Column=%d\n' % part.x) + file.write('End_Column=%d\n' % (part.x+part.w)) + + file.write('Start_Row=%d\n' % (part.y)) + file.write('End_Row=%d\n' % (part.y+part.h)) + ''' + + file.write('Display=0\n') + file.write('Pause_When_Done=0\n') + file.write('Output_File_Type=C\n') # TGA, best progressive loading + file.write('Output_Alpha=1\n') + + if render.antialiasing: + aa_mapping = {'OVERSAMPLE_5':2, 'OVERSAMPLE_8':3, 'OVERSAMPLE_11':4, 'OVERSAMPLE_16':5} # method 1 assumed + file.write('Antialias=1\n') + file.write('Antialias_Depth=%d\n' % aa_mapping[render.antialiasing_samples]) + else: + file.write('Antialias=0\n') + + file.close() + + +class PovrayRender(bpy.types.RenderEngine): + __idname__ = 'POVRAY_RENDER' + __label__ = "Povray" + DELAY = 0.02 + def _export(self, scene): + import tempfile + + self.temp_file_in = tempfile.mktemp(suffix='.pov') + self.temp_file_out = tempfile.mktemp(suffix='.tga') + self.temp_file_ini = tempfile.mktemp(suffix='.ini') + ''' + self.temp_file_in = '/test.pov' + self.temp_file_out = '/test.tga' + self.temp_file_ini = '/test.ini' + ''' + + def info_callback(txt): + self.update_stats("", "POVRAY: " + txt) + + write_pov(self.temp_file_in, scene, info_callback) + + def _render(self): + + try: os.remove(self.temp_file_out) # so as not to load the old file + except: pass + + write_pov_ini(self.temp_file_ini, self.temp_file_in, self.temp_file_out) + + print ("***-STARTING-***") + # This works too but means we have to wait until its done + # os.system('povray %s' % self.temp_file_ini) + + pov_binary = "povray" + + if sys.platform=='win32': + if bitness == 64: + pov_binary = "pvengine64" + else: + pov_binary = "pvengine" + + self.process = subprocess.Popen([pov_binary, self.temp_file_ini]) # stdout=subprocess.PIPE, stderr=subprocess.PIPE + + print ("***-DONE-***") + + def _cleanup(self): + for f in (self.temp_file_in, self.temp_file_ini, self.temp_file_out): + try: os.remove(f) + except: pass + + self.update_stats("", "") + + def render(self, scene): + + self.update_stats("", "POVRAY: Exporting data from Blender") + self._export(scene) + self.update_stats("", "POVRAY: Parsing File") + self._render() + + r = scene.render_data + + # compute resolution + x= int(r.resolution_x*r.resolution_percentage*0.01) + y= int(r.resolution_y*r.resolution_percentage*0.01) + + + + # Wait for the file to be created + while not os.path.exists(self.temp_file_out): + if self.test_break(): + try: self.process.terminate() + except: pass + break + + if self.process.poll() != None: + self.update_stats("", "POVRAY: Failed") + break + + time.sleep(self.DELAY) + + if os.path.exists(self.temp_file_out): + + self.update_stats("", "POVRAY: Rendering") + + prev_size = -1 + + def update_image(): + result = self.begin_result(0, 0, x, y) + lay = result.layers[0] + # possible the image wont load early on. + try: lay.rect_from_file(self.temp_file_out, 0, 0) + except: pass + self.end_result(result) + + # Update while povray renders + while True: + + # test if povray exists + if self.process.poll() != None: + update_image(); + break + + # user exit + if self.test_break(): + try: self.process.terminate() + except: pass + + break + + # Would be nice to redirect the output + # stdout_value, stderr_value = self.process.communicate() # locks + + + # check if the file updated + new_size = os.path.getsize(self.temp_file_out) + + if new_size != prev_size: + update_image() + prev_size = new_size + + time.sleep(self.DELAY) + + self._cleanup() + + +bpy.types.register(PovrayRender) + + + +# Use some of the existing buttons. +import buttons_scene +buttons_scene.SCENE_PT_render.COMPAT_ENGINES.add('POVRAY_RENDER') +buttons_scene.SCENE_PT_dimensions.COMPAT_ENGINES.add('POVRAY_RENDER') +buttons_scene.SCENE_PT_antialiasing.COMPAT_ENGINES.add('POVRAY_RENDER') +buttons_scene.SCENE_PT_output.COMPAT_ENGINES.add('POVRAY_RENDER') +del buttons_scene + +# Use only a subset of the world panels +import buttons_world +buttons_world.WORLD_PT_preview.COMPAT_ENGINES.add('POVRAY_RENDER') +buttons_world.WORLD_PT_context_world.COMPAT_ENGINES.add('POVRAY_RENDER') +buttons_world.WORLD_PT_world.COMPAT_ENGINES.add('POVRAY_RENDER') +buttons_world.WORLD_PT_mist.COMPAT_ENGINES.add('POVRAY_RENDER') +del buttons_world + +# Example of wrapping every class 'as is' +import buttons_material +for member in dir(buttons_material): + subclass = getattr(buttons_material, member) + try: subclass.COMPAT_ENGINES.add('POVRAY_RENDER') + except: pass +del buttons_material + +class RenderButtonsPanel(bpy.types.Panel): + __space_type__ = "BUTTONS_WINDOW" + __region_type__ = "WINDOW" + __context__ = "scene" + # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here + + def poll(self, context): + rd = context.scene.render_data + return (rd.use_game_engine==False) and (rd.engine in self.COMPAT_ENGINES) + +# Radiosity panel, use in the scene for now. +class SCENE_PT_povray_radiosity(RenderButtonsPanel): + __label__ = "Radiosity" + COMPAT_ENGINES = set(['POVRAY_RENDER']) + + def draw_header(self, context): + layout = self.layout + scene = context.scene + layout.itemR(scene, "pov_radio_enable", text="") + + def draw(self, context): + layout = self.layout + scene = context.scene + rd = scene.render_data + + layout.active = scene.pov_radio_enable + + split = layout.split() + + col = split.column() + + col.itemR(scene, "pov_radio_count") + col.itemR(scene, "pov_radio_recursion_limit") + col.itemR(scene, "pov_radio_error_bound") + + col.itemR(scene, "pov_radio_display_advanced") + + if scene.pov_radio_display_advanced: + col.itemR(scene, "pov_radio_adc_bailout") + col.itemR(scene, "pov_radio_brightness") + col.itemR(scene, "pov_radio_gray_threshold") + col.itemR(scene, "pov_radio_low_error_factor") + col.itemR(scene, "pov_radio_minimum_reuse") + col.itemR(scene, "pov_radio_nearest_count") + col.itemR(scene, "pov_radio_normal") + col.itemR(scene, "pov_radio_always_sample") + + +bpy.types.register(SCENE_PT_povray_radiosity) + + +FloatProperty= bpy.types.Scene.FloatProperty +IntProperty= bpy.types.Scene.IntProperty +BoolProperty= bpy.types.Scene.BoolProperty + +# Not a real pov option, just to know if we should write +BoolProperty( attr="pov_radio_enable", + name="Enable Radiosity", + description="Enable povrays radiosity calculation.", + default= False) +BoolProperty( attr="pov_radio_display_advanced", + name="Advanced Options", + description="Show advanced options.", + default= False) + +# Real pov options +FloatProperty( attr="pov_radio_adc_bailout", + name="ADC Bailout", + description="The adc_bailout for radiosity rays. Use adc_bailout = 0.01 / brightest_ambient_object for good results.", + min=0.0, max=1000.0, soft_min=0.0, soft_max=1.0, default= 0.01) + +BoolProperty( attr="pov_radio_always_sample", + name="Always Sample", + description="Only use the data from the pretrace step and not gather any new samples during the final radiosity pass..", + default= True) + +FloatProperty( attr="pov_radio_brightness", + name="Brightness", + description="Ammount objects are brightened before being returned upwards to the rest of the system.", + min=0.0, max=1000.0, soft_min=0.0, soft_max=10.0, default= 1.0) + +IntProperty( attr="pov_radio_count", + name="Ray Count", + description="number of rays that are sent out whenever a new radiosity value has to be calculated.", + min=1, max=1600, default= 35) + +FloatProperty( attr="pov_radio_error_bound", + name="Error Bound", + description="one of the two main speed/quality tuning values, lower values are more accurate.", + min=0.0, max=1000.0, soft_min=0.1, soft_max=10.0, default= 1.8) + +FloatProperty( attr="pov_radio_gray_threshold", + name="Gray Threshold", + description="one of the two main speed/quality tuning values, lower values are more accurate.", + min=0.0, max=1.0, default= 0.0) + +FloatProperty( attr="pov_radio_low_error_factor", + name="Low Error Factor", + description="If you calculate just enough samples, but no more, you will get an image which has slightly blotchy lighting.", + min=0.0, max=1.0, default= 0.5) + +# max_sample - not available yet + +FloatProperty( attr="pov_radio_minimum_reuse", + name="Minimum Reuse", + description="Fraction of the screen width which sets the minimum radius of reuse for each sample point (At values higher than 2% expect errors).", + min=0.0, max=1.0, soft_min=0.1, soft_max=0.1, default= 0.015) + +IntProperty( attr="pov_radio_nearest_count", + name="Nearest Count", + description="Number of old ambient values blended together to create a new interpolated value.", + min=1, max=20, default= 5) + +BoolProperty( attr="pov_radio_normal", + name="Normals", + description="Radiosity estimation can be affected by normals.", + default= False) + +IntProperty( attr="pov_radio_recursion_limit", + name="Recursion Limit", + description="how many recursion levels are used to calculate the diffuse inter-reflection.", + min=1, max=20, default= 3) diff --git a/release/scripts/bvh_import.py b/release/scripts/bvh_import.py index 5cdd8a71231..4134503c511 100644 --- a/release/scripts/bvh_import.py +++ b/release/scripts/bvh_import.py @@ -277,12 +277,17 @@ def read_bvh(file_path, GLOBAL_SCALE=1.0): for bvh_node in bvh_nodes.itervalues(): if not bvh_node.rest_tail_world: - if len(bvh_node.children)==1: + if len(bvh_node.children)==0: + # could just fail here, but rare BVH files have childless nodes + bvh_node.rest_tail_world = Vector(bvh_node.rest_head_world) + bvh_node.rest_tail_local = Vector(bvh_node.rest_head_local) + elif len(bvh_node.children)==1: bvh_node.rest_tail_world= Vector(bvh_node.children[0].rest_head_world) bvh_node.rest_tail_local= Vector(bvh_node.children[0].rest_head_local) else: - if not bvh_node.children: - raise 'error, bvh node has no end and no children. bad file' + # allow this, see above + #if not bvh_node.children: + # raise 'error, bvh node has no end and no children. bad file' # Removed temp for now rest_tail_world= Vector(0,0,0) diff --git a/release/scripts/export_dxf.py b/release/scripts/export_dxf.py index b32962241cc..17f2132fbe8 100644 --- a/release/scripts/export_dxf.py +++ b/release/scripts/export_dxf.py @@ -1,13 +1,13 @@ #!BPY """ - Name: 'Autodesk DXF (.dxf)' + Name: 'Autodesk DXF (.dxf/dwg)' Blender: 249 Group: 'Export' Tooltip: 'Export geometry to DXF/DWG-r12 (Drawing eXchange Format).' """ -__version__ = "1.34 - 2009.06.08" +__version__ = "1.35 - 2009.06.18" __author__ = "Remigiusz Fiedler (AKA migius)" __license__ = "GPL" __url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_dxf" @@ -31,19 +31,27 @@ IDEAs: - HPGL output, usefull for correct scaled printing of 2d drawings TODO: -- export dupligroups and dupliverts as blocks (option for the user to decide) +- export dupligroups and dupliverts as blocks (as option) - optimize POLYFACE routine: remove double-vertices -- more stable support for X,Y-rotated curves(to POLYLINEs): fix blender negative-matrix.invert() +- fix support for X,Y-rotated curves(to POLYLINEs): fix blender negative-matrix.invert() - support hierarchies: groups, instances, parented structures - support n/f-gons as POLYFACEs with invisible edges - mapping materials to DXF-styles - ProgressBar +- export rotation of Camera to VIEW/VPORT +- export parented Cameras to VIEW/VPORT - wip: write drawing extends for automatic view positioning in CAD -- wip: correct text-objects in persp-projection -- wip: translate Camera to VPORT/VIEW +- wip: fix text-objects in persp-projection - wip: translate current 3D-View to *ACTIVE-VPORT +- wip: fix support Include-Duplis, cause not conform with INSERT-method History +v1.35 - 2009.06.18 by migius +- export multiple-instances of Curve-Objects as BLOCK/INSERTs +- added export Cameras (ortho and persp) to VPORTs, incl. clipping +- added export Cameras (ortho and persp) to VIEWs, incl. clipping +- export multiple-instances of Mesh-Objects as BLOCK/INSERTs +- on start prints dxfLibrary version v1.34 - 2009.06.08 by migius - export Lamps and Cameras as POINTs - export passepartout for perspective projection @@ -55,7 +63,7 @@ v1.34 - 2009.06.08 by migius - support XYmirrored 2d-curves to 2dPOLYLINEs - support thickness and elevation for curve-objects - fix extrusion 210-code (3d orientation vector) -- fix POLYFACE export, synchronized with dxfLibrary.py +- fix POLYFACE export, synchronized also dxfLibrary.py - changed to the new 2.49 method Vector.cross() - output style manager (first try) v1.33 - 2009.05.25 by migius @@ -139,10 +147,16 @@ from Blender import Registry, Object, Mesh, Curve import os import subprocess -import dxfLibrary as DXF -#reload(DXF) -#reload(dxfLibrary) -#from dxfLibrary import * +try: + import dxfLibrary as DXF + #reload(DXF) + #reload(dxfLibrary) + #from dxfLibrary import * +except: + DXF=None + print "DXF-Exporter: error! found no dxfLibrary.py module in Blender script folder" + Draw.PupMenu("Error%t|found no dxfLibrary.py module in script folder") + import math from math import atan, atan2, log10, sin, cos @@ -152,9 +166,8 @@ from math import atan, atan2, log10, sin, cos r2d = 180.0 / math.pi d2r = math.pi / 180.0 #note: d2r * angle == math.radians(angle) +#note: r2d * angle == math.degrees(angle) -print '\n\n\n' -print 'DXF-Exporter v%s *** start ***' %(__version__) #--------------------- #DEBUG = True #activates debug mode @@ -170,6 +183,7 @@ SHADOWS = 0 # sun/shadows simulation CAMERA = 1 # selected camera index PERSPECTIVE = 0 # projection (camera) type: perspective, opposite to orthographic CAMERAVIEW = 0 # use camera for projection, opposite is 3d-view +INSTANCES = 1 # Export instances of Mesh/Curve as BLOCK/INSERTs on/off APPLY_MODIFIERS = 1 INCLUDE_DUPLIS = 0 OUTPUT_DWG = 0 #optional save to DWG with extern converter @@ -187,6 +201,7 @@ LAYERLTYPE_DEF = 0 #'CONTINUOUS' - default layer lineType ENTITYLAYER_DEF = LAYERNAME_DEF #default entity color index ENTITYCOLOR_DEF = BYLAYER #default entity color index ENTITYLTYPE_DEF = BYLAYER #default entity lineType + E_M = 0 LAB = "scroll MMB/WHEEL . wip .. todo" #"*) parts under construction" M_OBJ = 0 @@ -198,6 +213,7 @@ INIFILE_EXTENSION = '.ini' INIFILE_HEADER = '#ExportDXF.py ver.1.0 config data' INFFILE_HEADER = '#ExportDXF.py ver.1.0 analyze of DXF-data' +BLOCKREGISTRY = {} # registry and map for BLOCKs SCENE = None WORLDX = Mathutils.Vector((1,0,0)) WORLDY = Mathutils.Vector((0,1,0)) @@ -496,92 +512,136 @@ def isLeftHand(matrix): def exportMesh(ob, mx, mx_n, me=None, **common): """converts Mesh-Object to desired projection and representation(DXF-Entity type) """ + global BLOCKREGISTRY entities = [] - #print 'deb:exportMesh() common=', common #--------- + block = None + #print 'deb:exportMesh() given common=', common #--------- if me==None: me = ob.getData(mesh=1) else: me.getFromObject(ob) - # me.transform(mx); get verts data; me.transform(mx_inv)= back to the origin state - # above .transform method is faster, but bad, cause invasive: + # idea: me.transform(mx); get verts data; me.transform(mx_inv)= back to the origin state + # the .transform-method is fast, but bad, cause invasive: # it manipulates original geometry and by retransformation lefts back rounding-errors # we dont want to manipulate original data! #temp_verts = me.verts[:] #doesn't work on ubuntu(Yorik), bug? if me.verts: #print 'deb:exportMesh() started' #--------- - allpoints = [v.co for v in me.verts] - allpoints = projected_co(allpoints, mx) - allpoints = toNewOrigin(allpoints) - faces=[] - edges=[] - if me.faces and PROJECTION and HIDDEN_LINES: - #if DEBUG: print 'deb:exportMesh HIDDEN_LINES mode' #--------- - faces, edges = hidden_status(me.faces, mx, mx_n) - faces = [[v.index for v in me.faces[f_nr].verts] for f_nr in faces] - else: - #if DEBUG: print 'deb:exportMesh STANDARD mode' #--------- - for e in me.edges: edges.append(e.key) - #faces = [f.index for f in me.faces] - faces = [[v.index for v in f.verts] for f in me.faces] - #faces = [[allpoints[v.index] for v in f.verts] for f in me.faces] - #print 'deb: allpoints=\n', allpoints #--------- - #print 'deb: edges=\n', edges #--------- - #print 'deb: faces=\n', faces #--------- - if isLeftHand(mx): # then change vertex-order in every face - for f in faces: - f.reverse() - #f = [f[-1]] + f[:-1] #TODO: might be needed - #print 'deb: faces=\n', faces #--------- - - c = mesh_as_list[GUI_A['mesh_as'].val] - if 'POINTs'==c: # export Mesh as multiple POINTs - for p in allpoints: - dxfPOINT = DXF.Point(points=[p],**common) - entities.append(dxfPOINT) - elif 'LINEs'==c or (not faces): - if edges and allpoints: - if DEBUG: mesh_drawBlender(allpoints, edges, None) #deb: draw to blender scene - for e in edges: - points = [allpoints[e[0]], allpoints[e[1]]] - dxfLINE = DXF.Line(points, **common) - entities.append(dxfLINE) - elif faces: - if c in ('POLYFACE','POLYLINE'): - if allpoints: - #TODO: purge allpoints: left only vertices used by faces - if DEBUG: mesh_drawBlender(allpoints, None, faces) #deb: draw to scene - if not (PROJECTION and HIDDEN_LINES): - faces = [[v+1 for v in f] for f in faces] - else: - # for back-Faces-mode remove face-free verts - map=verts_state= [0]*len(allpoints) - for f in faces: - for v in f: - verts_state[v]=1 - if 0 in verts_state: # if dirty state - i,newverts=0,[] - for used_i,used in enumerate(verts_state): - if used: - newverts.append(allpoints[used_i]) - map[used_i]=i - i+=1 - allpoints = newverts - faces = [[map[v]+1 for v in f] for f in faces] - dxfPOLYFACE = DXF.PolyLine([allpoints, faces], flag=64, **common) - #print '\n deb: dxfPOLYFACE=',dxfPOLYFACE #------------- - entities.append(dxfPOLYFACE) - elif '3DFACEs'==c: - if DEBUG: mesh_drawBlender(allpoints, None, faces) #deb: draw to scene + + #print 'deb:exportMesh() ob.name=', ob.name #--------- + #print 'deb:exportMesh() me.name=', me.name #--------- + #print 'deb:exportMesh() me.users=', me.users #--------- + # check if there are more instances of this mesh (if used by other objects), then write to BLOCK/INSERT + if GUI_A['instances_on'].val and me.users>1 and not PROJECTION: + if me.name in BLOCKREGISTRY.keys(): + insert_name = BLOCKREGISTRY[me.name] + # write INSERT to entities + entities = exportInsert(ob, mx,insert_name, **common) + else: + # generate geom_output in ObjectCS + allpoints = [v.co for v in me.verts] + identity_matrix = Mathutils.Matrix().identity() + allpoints = projected_co(allpoints, identity_matrix) + #allpoints = toGlobalOrigin(allpoints) + faces=[] + edges=[] + for e in me.edges: edges.append(e.key) + faces = [[v.index for v in f.verts] for f in me.faces] + entities = writeMeshEntities(allpoints, edges, faces, **common) + if entities: # if not empty block + # write BLOCK definition and INSERT entity + # BLOCKREGISTRY = dictionary 'blender_name':'dxf_name'.append(me.name) + BLOCKREGISTRY[me.name]=validDXFr12name(('ME_'+ me.name)) + insert_name = BLOCKREGISTRY[me.name] + block = DXF.Block(insert_name,flag=0,base=(0,0,0),entities=entities) + # write INSERT as entity + entities = exportInsert(ob, mx, insert_name, **common) + + else: # no other instances, so go the standard way + allpoints = [v.co for v in me.verts] + allpoints = projected_co(allpoints, mx) + allpoints = toGlobalOrigin(allpoints) + faces=[] + edges=[] + if me.faces and PROJECTION and HIDDEN_LINES: + #if DEBUG: print 'deb:exportMesh HIDDEN_LINES mode' #--------- + faces, edges = hidden_status(me.faces, mx, mx_n) + faces = [[v.index for v in me.faces[f_nr].verts] for f_nr in faces] + else: + #if DEBUG: print 'deb:exportMesh STANDARD mode' #--------- + for e in me.edges: edges.append(e.key) + #faces = [f.index for f in me.faces] + faces = [[v.index for v in f.verts] for f in me.faces] + #faces = [[allpoints[v.index] for v in f.verts] for f in me.faces] + #print 'deb: allpoints=\n', allpoints #--------- + #print 'deb: edges=\n', edges #--------- + #print 'deb: faces=\n', faces #--------- + if isLeftHand(mx): # then change vertex-order in every face for f in faces: - #print 'deb: face=', f #--------- - points = [allpoints[key] for key in f] - #points = [p.co[:3] for p in points] - #print 'deb: pointsXX=\n', points #--------- - dxfFACE = DXF.Face(points, **common) - entities.append(dxfFACE) - + f.reverse() + #f = [f[-1]] + f[:-1] #TODO: might be needed + #print 'deb: faces=\n', faces #--------- + entities = writeMeshEntities(allpoints, edges, faces, **common) + + return entities, block + + +#------------------------------------------------- +def writeMeshEntities(allpoints, edges, faces, **common): + """help routine for exportMesh() + """ + entities = [] + + c = mesh_as_list[GUI_A['mesh_as'].val] + if 'POINTs'==c: # export Mesh as multiple POINTs + for p in allpoints: + dxfPOINT = DXF.Point(points=[p],**common) + entities.append(dxfPOINT) + elif 'LINEs'==c or (not faces): + if edges and allpoints: + if DEBUG: mesh_drawBlender(allpoints, edges, None) #deb: draw to blender scene + for e in edges: + points = [allpoints[e[0]], allpoints[e[1]]] + dxfLINE = DXF.Line(points, **common) + entities.append(dxfLINE) + elif faces: + if c in ('POLYFACE','POLYLINE'): + if allpoints: + #TODO: purge allpoints: left only vertices used by faces + if DEBUG: mesh_drawBlender(allpoints, None, faces) #deb: draw to scene + if not (PROJECTION and HIDDEN_LINES): + faces = [[v+1 for v in f] for f in faces] + else: + # for back-Faces-mode remove face-free verts + map=verts_state= [0]*len(allpoints) + for f in faces: + for v in f: + verts_state[v]=1 + if 0 in verts_state: # if dirty state + i,newverts=0,[] + for used_i,used in enumerate(verts_state): + if used: + newverts.append(allpoints[used_i]) + map[used_i]=i + i+=1 + allpoints = newverts + faces = [[map[v]+1 for v in f] for f in faces] + dxfPOLYFACE = DXF.PolyLine([allpoints, faces], flag=64, **common) + #print '\n deb: dxfPOLYFACE=',dxfPOLYFACE #------------- + entities.append(dxfPOLYFACE) + elif '3DFACEs'==c: + if DEBUG: mesh_drawBlender(allpoints, None, faces) #deb: draw to scene + for f in faces: + #print 'deb: face=', f #--------- + points = [allpoints[key] for key in f] + #points = [p.co[:3] for p in points] + #print 'deb: pointsXX=\n', points #--------- + dxfFACE = DXF.Face(points, **common) + entities.append(dxfFACE) + return entities + #----------------------------------------------------- def mesh_drawBlender(vertList, edgeList, faceList, name="dxfMesh", flatten=False, AT_CUR=True, link=True): #print 'deb:mesh_drawBlender started XXXXXXXXXXXXXXXXXX' #--------- @@ -640,7 +700,7 @@ def curve_drawBlender(vertList, org_point=[0.0,0.0,0.0], closed=0, name="dxfCurv #----------------------------------------------------- -def toNewOrigin(points): +def toGlobalOrigin(points): """relocates points to the new location needs a list of points [x,y,z] """ @@ -658,7 +718,7 @@ def exportEmpty(ob, mx, mw, **common): """ p = Mathutils.Vector(ob.loc) [p] = projected_co([p], mx) - [p] = toNewOrigin([p]) + [p] = toGlobalOrigin([p]) entities = [] c = empty_as_list[GUI_A['empty_as'].val] @@ -671,16 +731,50 @@ def exportEmpty(ob, mx, mw, **common): def exportCamera(ob, mx, mw, **common): """converts Camera-Object to desired projection and representation(DXF-Entity type) """ - p = Mathutils.Vector(ob.loc) - [p] = projected_co([p], mx) - [p] = toNewOrigin([p]) - - entities = [] + location = Mathutils.Vector(ob.loc) + [location] = projected_co([location], mx) + [location] = toGlobalOrigin([location]) + view_name=validDXFr12name(('CAM_'+ ob.name)) + + camera = Camera.Get(ob.getData(name_only=True)) + #print 'deb: camera=', dir(camera) #------------------ + if camera.type=='persp': + mode = 1+2+4+16 + # mode flags: 1=persp, 2=frontclip, 4=backclip,16=FrontZ + elif camera.type=='ortho': + mode = 0+2+4+16 + + leftBottom=(0.0,0.0) # default + rightTop=(1.0,1.0) # default + center=(0.0,0.0) # default + + direction = Mathutils.Vector(0.0,0.0,1.0) * mx.rotationPart() # in W-C-S + direction.normalize() + target=Mathutils.Vector(ob.loc) - direction # in W-C-S + #ratio=1.0 + width=height= camera.scale # for ortho-camera + lens = camera.lens # for persp-camera + frontClipping = -(camera.clipStart - 1.0) + backClipping = -(camera.clipEnd - 1.0) + + entities, vport, view = [], None, None c = camera_as_list[GUI_A['camera_as'].val] if c=="POINT": # export as POINT - dxfPOINT = DXF.Point(points=[p],**common) + dxfPOINT = DXF.Point(points=[location],**common) entities.append(dxfPOINT) - return entities + elif c=="VIEW": # export as VIEW + view = DXF.View(name=view_name, + center=center, width=width, height=height, + frontClipping=frontClipping,backClipping=backClipping, + direction=direction,target=target,lens=lens,mode=mode + ) + elif c=="VPORT": # export as VPORT + vport = DXF.VPort(name=view_name, + center=center, ratio=1.0, height=height, + frontClipping=frontClipping,backClipping=backClipping, + direction=direction,target=target,lens=lens,mode=mode + ) + return entities, vport, view #----------------------------------------------------- def exportLamp(ob, mx, mw, **common): @@ -688,7 +782,7 @@ def exportLamp(ob, mx, mw, **common): """ p = Mathutils.Vector(ob.loc) [p] = projected_co([p], mx) - [p] = toNewOrigin([p]) + [p] = toGlobalOrigin([p]) entities = [] c = lamp_as_list[GUI_A['lamp_as'].val] @@ -698,6 +792,75 @@ def exportLamp(ob, mx, mw, **common): return entities #----------------------------------------------------- +def exportInsert(ob, mx, insert_name, **common): + """converts Object to DXF-INSERT in given orientation + """ + WCS_loc = ob.loc # WCS_loc is object location in WorldCoordSystem + sizeX = ob.SizeX + sizeY = ob.SizeY + sizeZ = ob.SizeZ + rotX = ob.RotX + rotY = ob.RotY + rotZ = ob.RotZ + #print 'deb: sizeX=%s, sizeY=%s' %(sizeX, sizeY) #--------- + + Thickness,Extrusion,ZRotation,Elevation = None,None,None,None + + AXaxis = mx[0].copy().resize3D() # = ArbitraryXvector + if not PROJECTION: + #Extrusion, ZRotation, Elevation = getExtrusion(mx) + Extrusion, AXaxis = getExtrusion(mx) + + entities = [] + + if 1: + if not PROJECTION: + ZRotation,Zrotmatrix,OCS_origin,ECS_origin = getTargetOrientation(mx,Extrusion,\ + AXaxis,WCS_loc,sizeX,sizeY,sizeZ,rotX,rotY,rotZ) + ZRotation *= r2d + point = ECS_origin + else: #TODO: fails correct location + point1 = Mathutils.Vector(ob.loc) + [point] = projected_co([point1], mx) + if PERSPECTIVE: + clipStart = 10.0 + coef = -clipStart / (point1*mx)[2] + #print 'deb: coef=', coef #-------------- + #TODO: ? sizeX *= coef + #sizeY *= coef + #sizeZ *= coef + + #print 'deb: point=', point #-------------- + [point] = toGlobalOrigin([point]) + + #if DEBUG: text_drawBlender(textstr,points,OCS_origin) #deb: draw to scene + common['extrusion']= Extrusion + #common['elevation']= Elevation + #print 'deb: common=', common #------------------ + if 0: #DEBUG + #linepoints = [[0,0,0], [AXaxis[0],AXaxis[1],AXaxis[2]]] + linepoints = [[0,0,0], point] + dxfLINE = DXF.Line(linepoints,**common) + entities.append(dxfLINE) + + xscale=sizeX + yscale=sizeY + zscale=sizeZ + cols=None + colspacing=None + rows=None + rowspacing=None + + dxfINSERT = DXF.Insert(insert_name,point=point,rotation=ZRotation,\ + xscale=xscale,yscale=yscale,zscale=zscale,\ + cols=cols,colspacing=colspacing,rows=rows,rowspacing=rowspacing,\ + **common) + entities.append(dxfINSERT) + + return entities + + +#----------------------------------------------------- def exportText(ob, mx, mw, **common): """converts Text-Object to desired projection and representation(DXF-Entity type) """ @@ -755,7 +918,7 @@ def exportText(ob, mx, mw, **common): #print 'deb: coef=', coef #-------------- #print 'deb: point=', point #-------------- - [point] = toNewOrigin([point]) + [point] = toGlobalOrigin([point]) point2 = point #if DEBUG: text_drawBlender(textstr,points,OCS_origin) #deb: draw to scene @@ -835,132 +998,197 @@ def exportCurve(ob, mx, mw, **common): """converts Curve-Object to desired projection and representation(DXF-Entity type) """ entities = [] + block = None curve = ob.getData() - WCS_loc = ob.loc # WCS_loc is object location in WorldCoordSystem - #WCS_loc = [0.0,0.0,0.0] - #print 'deb: WCS_loc=', WCS_loc #--------- - sizeX = ob.SizeX - sizeY = ob.SizeY - sizeZ = ob.SizeZ - rotX = ob.RotX - rotY = ob.RotY - rotZ = ob.RotZ - #print 'deb: sizeX=%s, sizeY=%s' %(sizeX, sizeY) #--------- + #print 'deb: curve=', dir(curve) #--------- + # TODO: should be: if curve.users>1 and not (PERSPECTIVE or (PROJECTION and HIDDEN_MODE): + if GUI_A['instances_on'].val and curve.users>1 and not PROJECTION: + if curve.name in BLOCKREGISTRY.keys(): + insert_name = BLOCKREGISTRY[curve.name] + # write INSERT to entities + entities = exportInsert(ob, mx,insert_name, **common) + else: + # generate geom_output in ObjectCS + imx = Mathutils.Matrix().identity() + WCS_loc = [0,0,0] # WCS_loc is object location in WorldCoordSystem + #print 'deb: WCS_loc=', WCS_loc #--------- + sizeX = sizeY = sizeZ = 1.0 + rotX = rotY = rotZ = 0.0 + Thickness,Extrusion,ZRotation,Elevation = None,None,None,None + ZRotation,Zrotmatrix,OCS_origin,ECS_origin = None,None,None,None + AXaxis = imx[0].copy().resize3D() # = ArbitraryXvector + OCS_origin = [0,0,0] + if not PROJECTION: + #Extrusion, ZRotation, Elevation = getExtrusion(mx) + Extrusion, AXaxis = getExtrusion(imx) + + # no thickness/width for POLYLINEs converted into Screen-C-S + #print 'deb: curve.ext1=', curve.ext1 #--------- + if curve.ext1: Thickness = curve.ext1 * sizeZ + if curve.ext2 and sizeX==sizeY: + Width = curve.ext2 * sizeX + if "POLYLINE"==curve_as_list[GUI_A['curve_as'].val]: # export as POLYLINE + ZRotation,Zrotmatrix,OCS_origin,ECS_origin = getTargetOrientation(imx,Extrusion,\ + AXaxis,WCS_loc,sizeX,sizeY,sizeZ,rotX,rotY,rotZ) + + entities = writeCurveEntities(curve, imx, + Thickness,Extrusion,ZRotation,Elevation,AXaxis,Zrotmatrix, + WCS_loc,OCS_origin,ECS_origin,sizeX,sizeY,sizeZ, + **common) + + if entities: # if not empty block + # write BLOCK definition and INSERT entity + # BLOCKREGISTRY = dictionary 'blender_name':'dxf_name'.append(me.name) + BLOCKREGISTRY[curve.name]=validDXFr12name(('CU_'+ curve.name)) + insert_name = BLOCKREGISTRY[curve.name] + block = DXF.Block(insert_name,flag=0,base=(0,0,0),entities=entities) + # write INSERT as entity + entities = exportInsert(ob, mx, insert_name, **common) + + else: # no other instances, so go the standard way + WCS_loc = ob.loc # WCS_loc is object location in WorldCoordSystem + #print 'deb: WCS_loc=', WCS_loc #--------- + sizeX = ob.SizeX + sizeY = ob.SizeY + sizeZ = ob.SizeZ + rotX = ob.RotX + rotY = ob.RotY + rotZ = ob.RotZ + #print 'deb: sizeX=%s, sizeY=%s' %(sizeX, sizeY) #--------- + + Thickness,Extrusion,ZRotation,Elevation = None,None,None,None + ZRotation,Zrotmatrix,OCS_origin,ECS_origin = None,None,None,None + AXaxis = mx[0].copy().resize3D() # = ArbitraryXvector + OCS_origin = [0,0,0] + if not PROJECTION: + #Extrusion, ZRotation, Elevation = getExtrusion(mx) + Extrusion, AXaxis = getExtrusion(mx) + + # no thickness/width for POLYLINEs converted into Screen-C-S + #print 'deb: curve.ext1=', curve.ext1 #--------- + if curve.ext1: Thickness = curve.ext1 * sizeZ + if curve.ext2 and sizeX==sizeY: + Width = curve.ext2 * sizeX + if "POLYLINE"==curve_as_list[GUI_A['curve_as'].val]: # export as POLYLINE + ZRotation,Zrotmatrix,OCS_origin,ECS_origin = getTargetOrientation(mx,Extrusion,\ + AXaxis,WCS_loc,sizeX,sizeY,sizeZ,rotX,rotY,rotZ) + entities = writeCurveEntities(curve, mx, + Thickness,Extrusion,ZRotation,Elevation,AXaxis,Zrotmatrix, + WCS_loc,OCS_origin,ECS_origin,sizeX,sizeY,sizeZ, + **common) + + return entities, block - Thickness,Extrusion,ZRotation,Elevation = None,None,None,None - AXaxis = mx[0].copy().resize3D() # = ArbitraryXvector - OCS_origin = [0,0,0] - if not PROJECTION: - #Extrusion, ZRotation, Elevation = getExtrusion(mx) - Extrusion, AXaxis = getExtrusion(mx) - # no thickness/width for POLYLINEs converted into ScreenCS - #print 'deb: curve.ext1=', curve.ext1 #--------- - if curve.ext1: Thickness = curve.ext1 * sizeZ - if curve.ext2 and sizeX==sizeY: - Width = curve.ext2 * sizeX - if "POLYLINE"==curve_as_list[GUI_A['curve_as'].val]: # export as POLYLINE - ZRotation,Zrotmatrix,OCS_origin,ECS_origin = getTargetOrientation(mx,Extrusion,\ - AXaxis,WCS_loc,sizeX,sizeY,sizeZ,rotX,rotY,rotZ) +#------------------------------------------------- +def writeCurveEntities(curve, mx, + Thickness,Extrusion,ZRotation,Elevation,AXaxis,Zrotmatrix, + WCS_loc,OCS_origin,ECS_origin,sizeX,sizeY,sizeZ, + **common): + """help routine for exportCurve() + """ + entities = [] - for cur in curve: - #print 'deb: START cur=', cur #-------------- - points = [] - if cur.isNurb(): - for point in cur: - #print 'deb:isNurb point=', point #--------- - vec = point[0:3] - #print 'deb: vec=', vec #--------- - pkt = Mathutils.Vector(vec) - #print 'deb: pkt=', pkt #--------- - points.append(pkt) - else: - for point in cur: - #print 'deb:isBezier point=', point.getTriple() #--------- - vec = point.getTriple()[1] - #print 'deb: vec=', vec #--------- - pkt = Mathutils.Vector(vec) - #print 'deb: pkt=', pkt #--------- - points.append(pkt) - - #print 'deb: points', points #-------------- - if len(points)>1: - c = curve_as_list[GUI_A['curve_as'].val] - - if c=="POLYLINE": # export Curve as POLYLINE - if not PROJECTION: - # recalculate points(2d=X,Y) into Entity-Coords-System - for p in points: # list of vectors - p[0] *= sizeX - p[1] *= sizeY - p2 = p * Zrotmatrix - p2[0] += ECS_origin[0] - p2[1] += ECS_origin[1] - p[0],p[1] = p2[0],p2[1] - else: - points = projected_co(points, mx) - #print 'deb: points', points #-------------- - - if cur.isCyclic(): closed = 1 - else: closed = 0 - points = toNewOrigin(points) - - if DEBUG: curve_drawBlender(points,OCS_origin,closed) #deb: draw to scene - common['extrusion']= Extrusion - ##common['rotation']= ZRotation - ##common['elevation']= Elevation - common['thickness']= Thickness - #print 'deb: common=', common #------------------ - - if 0: #DEBUG - p=AXaxis[:3] - entities.append(DXF.Line([[0,0,0], p],**common)) - p=ECS_origin[:3] - entities.append(DXF.Line([[0,0,0], p],**common)) - common['color']= 5 - p=OCS_origin[:3] - entities.append(DXF.Line([[0,0,0], p],**common)) - #OCS_origin=[0,0,0] #only debug---------------- - dxfPLINE = DXF.PolyLine(points,OCS_origin,closed,**common) - entities.append(dxfPLINE) + if 1: + for cur in curve: + #print 'deb: START cur=', cur #-------------- + points = [] + if cur.isNurb(): + for point in cur: + #print 'deb:isNurb point=', point #--------- + vec = point[0:3] + #print 'deb: vec=', vec #--------- + pkt = Mathutils.Vector(vec) + #print 'deb: pkt=', pkt #--------- + points.append(pkt) + else: + for point in cur: + #print 'deb:isBezier point=', point.getTriple() #--------- + vec = point.getTriple()[1] + #print 'deb: vec=', vec #--------- + pkt = Mathutils.Vector(vec) + #print 'deb: pkt=', pkt #--------- + points.append(pkt) + + #print 'deb: points', points #-------------- + if len(points)>1: + c = curve_as_list[GUI_A['curve_as'].val] + + if c=="POLYLINE": # export Curve as POLYLINE + if not PROJECTION: + # recalculate points(2d=X,Y) into Entity-Coords-System + for p in points: # list of vectors + p[0] *= sizeX + p[1] *= sizeY + p2 = p * Zrotmatrix + p2[0] += ECS_origin[0] + p2[1] += ECS_origin[1] + p[0],p[1] = p2[0],p2[1] + else: + points = projected_co(points, mx) + #print 'deb: points', points #-------------- + + if cur.isCyclic(): closed = 1 + else: closed = 0 + points = toGlobalOrigin(points) + + if DEBUG: curve_drawBlender(points,OCS_origin,closed) #deb: draw to scene - dxfPLINE = DXF.PolyLine(points,OCS_origin,closed,**common) - entities.append(dxfPLINE) - if Thickness: - common['thickness']= -Thickness + common['extrusion']= Extrusion + ##common['rotation']= ZRotation + ##common['elevation']= Elevation + common['thickness']= Thickness + #print 'deb: common=', common #------------------ + + if 0: #DEBUG + p=AXaxis[:3] + entities.append(DXF.Line([[0,0,0], p],**common)) + p=ECS_origin[:3] + entities.append(DXF.Line([[0,0,0], p],**common)) + common['color']= 5 + p=OCS_origin[:3] + entities.append(DXF.Line([[0,0,0], p],**common)) + #OCS_origin=[0,0,0] #only debug---------------- + dxfPLINE = DXF.PolyLine(points,OCS_origin,closed,**common) + entities.append(dxfPLINE) + dxfPLINE = DXF.PolyLine(points,OCS_origin,closed,**common) entities.append(dxfPLINE) - - elif c=="LINEs": # export Curve as multiple LINEs - points = projected_co(points, mx) - if cur.isCyclic(): points.append(points[0]) - #print 'deb: points', points #-------------- - points = toNewOrigin(points) - - if DEBUG: curve_drawBlender(points,WCS_loc,closed) #deb: draw to scene - common['extrusion']= Extrusion - common['elevation']= Elevation - common['thickness']= Thickness - #print 'deb: common=', common #------------------ - for i in range(len(points)-1): - linepoints = [points[i], points[i+1]] - dxfLINE = DXF.Line(linepoints,**common) - entities.append(dxfLINE) - if Thickness: - common['thickness']= -Thickness + if Thickness: + common['thickness']= -Thickness + dxfPLINE = DXF.PolyLine(points,OCS_origin,closed,**common) + entities.append(dxfPLINE) + + elif c=="LINEs": # export Curve as multiple LINEs + points = projected_co(points, mx) + if cur.isCyclic(): points.append(points[0]) + #print 'deb: points', points #-------------- + points = toGlobalOrigin(points) + + if DEBUG: curve_drawBlender(points,WCS_loc,closed) #deb: draw to scene + common['extrusion']= Extrusion + common['elevation']= Elevation + common['thickness']= Thickness + #print 'deb: common=', common #------------------ for i in range(len(points)-1): linepoints = [points[i], points[i+1]] dxfLINE = DXF.Line(linepoints,**common) entities.append(dxfLINE) - - elif c=="POINTs": # export Curve as multiple POINTs - points = projected_co(points, mx) - for p in points: - dxfPOINT = DXF.Point(points=[p],**common) - entities.append(dxfPOINT) - + if Thickness: + common['thickness']= -Thickness + for i in range(len(points)-1): + linepoints = [points[i], points[i+1]] + dxfLINE = DXF.Line(linepoints,**common) + entities.append(dxfLINE) + + elif c=="POINTs": # export Curve as multiple POINTs + points = projected_co(points, mx) + for p in points: + dxfPOINT = DXF.Point(points=[p],**common) + entities.append(dxfPOINT) return entities + #----------------------------------------------------- def getClipBox(camera): """calculates Field-of-View-Clipping-Box of given Camera @@ -1075,12 +1303,12 @@ def drawClipBox(clip_box): verts.append([max_X2, max_Y2, max_Z]) verts.append([min_X2, max_Y2, max_Z]) faces = [[0,1,2,3],[4,5,6,7]] - nme = Mesh.New() - nme.verts.extend(verts) - nme.faces.extend(faces) + newmesh = Mesh.New() + newmesh.verts.extend(verts) + newmesh.faces.extend(faces) plan = Object.New('Mesh','clip_box') - plan.link(nme) + plan.link(newmesh) sce = Scene.GetCurrent() sce.objects.link(plan) plan.setMatrix(sce.objects.camera.matrix) @@ -1170,19 +1398,35 @@ def getCommons(ob): #----------------------------------------------------- def do_export(export_list, filepath): - global PERSPECTIVE, CAMERAVIEW + global PERSPECTIVE, CAMERAVIEW, BLOCKREGISTRY Window.WaitCursor(1) t = Blender.sys.time() # init Drawing --------------------- d=DXF.Drawing() # add Tables ----------------- - #d.blocks.append(b) #table blocks - #goes automatic: d.styles.append(DXF.Style()) #table styles + # initialized automatic: d.blocks.append(b) #section BLOCKS + # initialized automatic: d.styles.append(DXF.Style()) #table STYLE + + #table LTYPE --------------- + #d.linetypes.append(DXF.LineType(name='CONTINUOUS',description='--------',elements=[0.0])) + d.linetypes.append(DXF.LineType(name='DOT',description='. . . . . . .',elements=[0.25, 0.0, -0.25])) + d.linetypes.append(DXF.LineType(name='DASHED',description='__ __ __ __ __',elements=[0.8, 0.5, -0.3])) + d.linetypes.append(DXF.LineType(name='DASHDOT',description='__ . __ . __ .',elements=[1.0, 0.5, -0.25, 0.0, -0.25])) + d.linetypes.append(DXF.LineType(name='DIVIDE',description='____ . . ____ . . ',elements=[1.25, 0.5, -0.25, 0.0, -0.25, 0.0, -0.25])) + d.linetypes.append(DXF.LineType(name='BORDER',description='__ __ . __ __ . ',elements=[1.75, 0.5, -0.25, 0.5, -0.25, 0.0, -0.25])) + d.linetypes.append(DXF.LineType(name='HIDDEN',description='__ __ __ __ __',elements=[0.4, 0.25, -0.25])) + d.linetypes.append(DXF.LineType(name='CENTER',description='____ _ ____ _ __',elements=[2.0, 1.25, -0.25, 0.25, -0.25])) + + #d.vports.append(DXF.VPort('*ACTIVE')) + d.vports.append(DXF.VPort('*ACTIVE',center=(-5.0,1.0),height=10.0)) + #d.vports.append(DXF.VPort('*ACTIVE',leftBottom=(-100.0,-60.0),rightTop=(100.0,60.0))) #d.views.append(DXF.View('Normal')) #table view d.views.append(DXF.ViewByWindow('BF_TOPVIEW',leftBottom=(-100,-60),rightTop=(100,60))) #idem # add Entities -------------------- + BLOCKREGISTRY = {} # registry and map for BLOCKs + PERSPECTIVE = 0 something_ready = 0 selected_len = len(export_list) sce = Scene.GetCurrent() @@ -1246,9 +1490,10 @@ def do_export(export_list, filepath): layernames = [] for ob,mx in export_list: entities = [] + block = None #mx = ob.matrix.copy() #print 'deb: ob =', ob #--------- - print 'deb: ob.type =', ob.type #--------- + #print 'deb: ob.type =', ob.type #--------- #print 'deb: mx =\n', mx #--------- #print 'deb: mw0 =\n', mw0 #--------- #mx_n is trans-matrix for normal_vectors for front-side faces @@ -1274,10 +1519,10 @@ def do_export(export_list, filepath): d.layers.append(DXF.Layer(color=tempcolor, name=elayer)) if (ob.type == 'Mesh') and GUI_B['bmesh'].val: - entities = exportMesh(ob, mx, mx_n, tmp_me,\ + entities, block = exportMesh(ob, mx, mx_n, tmp_me,\ paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) elif (ob.type == 'Curve') and GUI_B['bcurve'].val: - entities = exportCurve(ob, mx, mw, \ + entities, block = exportCurve(ob, mx, mw, \ paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) elif (ob.type == 'Empty') and GUI_B['empty'].val: entities = exportEmpty(ob, mx, mw, \ @@ -1286,8 +1531,10 @@ def do_export(export_list, filepath): entities = exportText(ob, mx, mw, \ paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) elif (ob.type == 'Camera') and GUI_B['camera'].val: - entities = exportCamera(ob, mx, mw, \ + entities, vport, view = exportCamera(ob, mx, mw, \ paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) + if vport: d.vports.append(vport) + if view: d.views.append(view) elif (ob.type == 'Lamp') and GUI_B['lamp'].val: entities = exportLamp(ob, mx, mw, \ paperspace=espace, color=ecolor, layer=elayer, lineType=eltype) @@ -1297,16 +1544,26 @@ def do_export(export_list, filepath): for e in entities: d.append(e) + if block: + d.blocks.append(block) #add to BLOCK-section + + if something_ready: - if PERSPECTIVE: # draw view border - mw2 = Mathutils.Matrix().identity() - points = projected_co(border, mw2) + if PERSPECTIVE: # generate view border - passepartout + identity_matrix = Mathutils.Matrix().identity() + points = projected_co(border, identity_matrix) closed = 1 - points = toNewOrigin(points) - - dxfPLINE = DXF.PolyLine(points,points[0],closed,\ - paperspace=espace, color=LAYERCOLOR_DEF) - d.append(dxfPLINE) + points = toGlobalOrigin(points) + c = curve_as_list[GUI_A['curve_as'].val] + if c=="LINEs": # export Curve as multiple LINEs + for i in range(len(points)-1): + linepoints = [points[i], points[i+1]] + dxfLINE = DXF.Line(linepoints,paperspace=espace,color=LAYERCOLOR_DEF) + entities.append(dxfLINE) + else: + dxfPLINE = DXF.PolyLine(points,points[0],closed,\ + paperspace=espace, color=LAYERCOLOR_DEF) + d.append(dxfPLINE) if not GUI_A['outputDWG_on'].val: @@ -1573,7 +1830,7 @@ parent_as_menu = prepareMenu("export to: %t", parent_as_list) proxy_as_list = ["..BLOCK","..XREF","..ungroup","..POINT"] proxy_as_menu = prepareMenu("export to: %t", proxy_as_list) -camera_as_list = ["..BLOCK","..A_CAMERA","..VPORT","..VIEW","POINT"] +camera_as_list = ["..BLOCK","..A_CAMERA","VPORT","VIEW","POINT"] camera_as_menu = prepareMenu("export to: %t", camera_as_list) lamp_as_list = ["..BLOCK","..A_LAMP","POINT"] @@ -1655,6 +1912,7 @@ keywords_org = { 'outputDWG_on' : OUTPUT_DWG, 'to_polyline_on': POLYLINES, 'to_polyface_on': POLYFACES, + 'instances_on': INSTANCES, 'apply_modifiers_on': APPLY_MODIFIERS, 'include_duplis_on': INCLUDE_DUPLIS, 'camera_selected': CAMERA, @@ -1691,7 +1949,7 @@ keywords_org = { 'group_as' : 0, 'parent_as' : 0, 'proxy_as' : 0, - 'camera_as': 4, + 'camera_as': 3, 'lamp_as' : 2, } @@ -2066,7 +2324,7 @@ def draw_UI(): #--------------------------------------------------------------- but_3c = common_column #button 3.column menu_w = (3 * butt_margin) + but_0c + but_1c + but_2c + but_3c #menu width - simple_menu_h = 240 + simple_menu_h = 260 extend_menu_h = 345 menu_h = simple_menu_h # y is menu upper.y if config_UI.val: @@ -2361,6 +2619,11 @@ def draw_UI(): #--------------------------------------------------------------- y -= 20 b0, b0_ = but0c, but_0c + butt_margin +but_1c + GUI_A['instances_on'] = Draw.Toggle('Instances as BLOCKs', EVENT_NONE, b0, y, b0_, 20, GUI_A['instances_on'].val, "Export instances (multi-users) of Mesh/Curve as BLOCK/INSERTs on/off") + #b0, b0_ = but2c, but_2c + butt_margin + but_3c + + y -= 20 + b0, b0_ = but0c, but_0c + butt_margin +but_1c GUI_A['apply_modifiers_on'] = Draw.Toggle('Apply Modifiers', EVENT_NONE, b0, y, b0_, 20, GUI_A['apply_modifiers_on'].val, "Apply modifier stack to mesh objects before export on/off") #b0, b0_ = but2c, but_2c + butt_margin + but_3c @@ -2750,23 +3013,29 @@ def multi_export(DIR): #TODO: #----------------------------------------------------- if __name__=='__main__': - if not DXF.copy: - Draw.PupMenu('Error%t|The dxfLibrary.py script requires a full python install') - #Window.FileSelector(dxf_export_ui, 'EXPORT DXF', Blender.sys.makename(ext='.dxf')) - # recall last used DXF-file and INI-file names - dxffilename = check_RegistryKey('dxfFileName') - #print 'deb:start dxffilename:', dxffilename #---------------- - if dxffilename: dxfFileName.val = dxffilename - else: - dirname = Blender.sys.dirname(Blender.Get('filename')) - #print 'deb:start dirname:', dirname #---------------- - dxfFileName.val = Blender.sys.join(dirname, '') - inifilename = check_RegistryKey('iniFileName') - if inifilename: iniFileName.val = inifilename - - updateMenuCAMERA() - updateCAMERA() - - Draw.Register(draw_UI, event, bevent) - + if DXF: + print '\n\n\n' + print 'DXF-Exporter v%s *** start ***' %(__version__) #--------------------- + print 'with Library %s' %(DXF.__version__) #--------------------- + if not DXF.copy: + print "DXF-Exporter: dxfLibrary.py script requires a full Python install" + Draw.PupMenu('Error%t|The dxfLibrary.py script requires a full Python install') + else: + #Window.FileSelector(dxf_export_ui, 'EXPORT DXF', Blender.sys.makename(ext='.dxf')) + # recall last used DXF-file and INI-file names + dxffilename = check_RegistryKey('dxfFileName') + #print 'deb:start dxffilename:', dxffilename #---------------- + if dxffilename: dxfFileName.val = dxffilename + else: + dirname = Blender.sys.dirname(Blender.Get('filename')) + #print 'deb:start dirname:', dirname #---------------- + dxfFileName.val = Blender.sys.join(dirname, '') + inifilename = check_RegistryKey('iniFileName') + if inifilename: iniFileName.val = inifilename + + updateMenuCAMERA() + updateCAMERA() + + Draw.Register(draw_UI, event, bevent) +
\ No newline at end of file diff --git a/release/scripts/export_fbx.py b/release/scripts/export_fbx.py index 4115140a852..50357cbfa75 100644 --- a/release/scripts/export_fbx.py +++ b/release/scripts/export_fbx.py @@ -1464,7 +1464,7 @@ def write(filename, batch_objects = None, \ # Write Edge Smoothing file.write(''' - LayerElementSmoothing: 0 { + LayerElementSmoothing: 1 { Version: 101 Name: "" MappingInformationType: "ByEdge" diff --git a/release/scripts/export_map.py b/release/scripts/export_map.py index 7df78fc3c9a..ab32f6d5ff5 100644 --- a/release/scripts/export_map.py +++ b/release/scripts/export_map.py @@ -2,14 +2,14 @@ """ Name: 'Quake 3 (.map)' -Blender: 243 +Blender: 249 Group: 'Export' Tooltip: 'Export to Quake map format' """ __author__ = 'Campbell Barton' -__version__ = '0.1' -__email__ = "cbarton@metavr.com" +__version__ = '0.1a' +__email__ = "ideasman42@gmail.com" __bpydoc__ = """\ This script Exports a Quake 3 map format. @@ -234,7 +234,7 @@ def write_node_map(file, ob): as a MAP node as long as it has the property name - classname returns True/False based on weather a node was written ''' - props= [(p.name, p.data) for p in ob.properties] + props= [(p.name, p.data) for p in ob.game_properties] IS_MAP_NODE= False for name, value in props: @@ -287,7 +287,7 @@ def export_map(filepath): TOTBRUSH= TOTLAMP= TOTNODE= 0 for ob in Object.GetSelected(): - type= ob.getType() + type= ob.type if type == 'Mesh': obs_mesh.append(ob) elif type == 'Surf': obs_surf.append(ob) elif type == 'Lamp': obs_lamp.append(ob) @@ -406,9 +406,10 @@ NULL else: print "NOT EXPORTING PATCH", surf_name, u,v, 'Unsupported' - - file.write('}\n') # end worldspan + + if obs_mesh or obs_surf: + file.write('}\n') # end worldspan print '\twriting lamps' diff --git a/release/scripts/export_obj.py b/release/scripts/export_obj.py index 739b02bcbb3..7dffb5d2048 100644 --- a/release/scripts/export_obj.py +++ b/release/scripts/export_obj.py @@ -2,14 +2,14 @@ """ Name: 'Wavefront (.obj)...' -Blender: 248 +Blender: 249 Group: 'Export' Tooltip: 'Save a Wavefront OBJ File' """ __author__ = "Campbell Barton, Jiri Hnidek, Paolo Ciccone" __url__ = ['http://wiki.blender.org/index.php/Scripts/Manual/Export/wavefront_obj', 'www.blender.org', 'blenderartists.org'] -__version__ = "1.21" +__version__ = "1.22" __bpydoc__ = """\ This script is an exporter to OBJ file format. @@ -23,11 +23,11 @@ will be exported as mesh data. """ -# -------------------------------------------------------------------------- -# OBJ Export v1.1 by Campbell Barton (AKA Ideasman) -# -------------------------------------------------------------------------- # ***** BEGIN GPL LICENSE BLOCK ***** # +# Script copyright (C) Campbell J Barton 2007-2009 +# - V1.22- bspline import/export added (funded by PolyDimensions GmbH) +# # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 diff --git a/release/scripts/import_dxf.py b/release/scripts/import_dxf.py index 36a1a048075..b3bee11c464 100644 --- a/release/scripts/import_dxf.py +++ b/release/scripts/import_dxf.py @@ -7,7 +7,7 @@ Group: 'Import' Tooltip: 'Import for DWG/DXF geometry data.' """ __author__ = 'Kitsu(Ed Blake) & migius(Remigiusz Fiedler)' -__version__ = '1.12 - 2009.05.27 by migius' +__version__ = '1.12 - 2009.06.16 by migius' __url__ = ["http://blenderartists.org/forum/showthread.php?t=84319", "http://wiki.blender.org/index.php/Scripts/Manual/Import/DXF-3D"] __email__ = ["migius(at)4d-vectors.de","Kitsune_e(at)yahoo.com"] @@ -100,7 +100,7 @@ History: -- better support for long dxf-layer-names -- add configuration file.ini handles multiple material setups -- added f_layerFilter - -- to-check: obj/mat/group/_mapping-idea from ideasman42: + -- to-check: obj/mat/group/_mapping-idea from ideasman42 -- curves: added "fill/non-fill" option for closed curves: CIRCLEs,ELLIPSEs,POLYLINEs -- "normalize Z" option to correct non-planar figures -- LINEs need "width" in 3d-space incl vGroups @@ -108,11 +108,13 @@ History: -- add better support for color_index BYLAYER=256, BYBLOCK=0 -- bug: "oneMesh" produces irregularly errors -- bug: Registry recall from hd_cache ?? only win32 bug?? - -- support DXF-definitions of scene, lights and cameras + -- support DXF-definitions of autoshade: scene, lights and cameras -- support ortho mode for VIEWs and VPORTs as cameras + v1.12 - 2009.06.16 by migius + d7 fix for ignored BLOCKs (e.g. *X) which are members of other BLOCKs v1.12 - 2009.05.27 by migius - d6 todo: bugfix negative scaled INSERTs - isLeftHand(Matrix) check + d6 bugfix negative scaled INSERTs - isLeftHand(Matrix) check v1.12 - 2009.05.26 by migius d5 changed to the new 2.49 method Vector.cross() d5 bugfix WORLDY(1,1,0) to (0,1,0) @@ -161,7 +163,7 @@ History: a4 added to analyzeTool: report about VIEWs, VPORTs, unused/xref BLOCKs a4 bugfix: individual support for 2D/3DPOLYLINE/POLYMESH a4 added to UI: (*wip)BLOCK-(F): name filtering for BLOCKs - a4 added to UI: BLOCK-(n): filter anoname/hatch BLOCKs *X... + a4 added to UI: BLOCK-(n): filter noname/hatch BLOCKs *X... a2 g_scale_as is no more GUI_A-variable a2 bugfix "material": negative sign color_index a2 added support for BLOCKs defined with origin !=(0,0,0) @@ -4520,7 +4522,7 @@ def getBlocksmap(drawing, layersmap, layFrozen_on=False): #-------------------- item2str = [item2.name, item2.layer] childList.append(item2str) try: usedblocks[item.name] = [used, childList] - except KeyError: print 'Cannot map "%s" - "%s" as Block!' %(item.name, item) + except KeyError: print 'Cannot find "%s" Block!' %(item.name) #print 'deb:getBlocksmap: usedblocks=' , usedblocks #------------- #print 'deb:getBlocksmap: layersmap=' , layersmap #------------- @@ -4528,7 +4530,7 @@ def getBlocksmap(drawing, layersmap, layFrozen_on=False): #-------------------- if type(item) != list and item.type == 'insert': if not layersmap or (not layersmap[item.layer].frozen or layFrozen_on): #if insert_layer is not frozen try: usedblocks[item.name][0] = True - except: pass + except KeyError: print 'Cannot find "%s" Block!' %(item.name) key_list = usedblocks.keys() key_list.reverse() @@ -4536,7 +4538,8 @@ def getBlocksmap(drawing, layersmap, layFrozen_on=False): #-------------------- if usedblocks[key][0]: #if parent used, then set used also all child blocks for child in usedblocks[key][1]: if not layersmap or (layersmap and not layersmap[child[1]].frozen): #if insert_layer is not frozen - usedblocks[child[0]][0] = True # marked as used BLOCK + try: usedblocks[child[0]][0] = True # marked as used BLOCK + except KeyError: print 'Cannot find "%s" Block!' %(child[0]) usedblocks = [i for i in usedblocks.keys() if usedblocks[i][0]] #print 'deb:getBlocksmap: usedblocks=' , usedblocks #------------- diff --git a/release/scripts/import_obj.py b/release/scripts/import_obj.py index d88f06a2a47..81230bfcf03 100644 --- a/release/scripts/import_obj.py +++ b/release/scripts/import_obj.py @@ -9,7 +9,7 @@ Tooltip: 'Load a Wavefront OBJ File, Shift: batch import all dir.' __author__= "Campbell Barton", "Jiri Hnidek", "Paolo Ciccone" __url__= ['http://wiki.blender.org/index.php/Scripts/Manual/Import/wavefront_obj', 'blender.org', 'blenderartists.org'] -__version__= "2.11" +__version__= "2.13" __bpydoc__= """\ This script imports a Wavefront OBJ files to Blender. @@ -21,7 +21,8 @@ Note, This loads mesh objects and materials only, nurbs and curves are not suppo # ***** BEGIN GPL LICENSE BLOCK ***** # -# Script copyright (C) Campbell J Barton 2007 +# Script copyright (C) Campbell J Barton 2007-2009 +# - V2.12- bspline import/export added (funded by PolyDimensions GmbH) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -124,6 +125,16 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_ image= obj_image_load(imagepath, DIR, IMAGE_SEARCH) has_data = image.has_data texture.image = image + + if not has_data: + try: + # first time using this image. We need to load it first + image.glLoad() + except: + # probably the image is crashed + pass + else: + has_data = image.has_data # Adds textures for materials (rendering) if type == 'Kd': @@ -207,6 +218,7 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_ context_material.setIOR( max(1, min(float(line_split[1]), 3))) # Between 1 and 3 elif line_lower.startswith('d') or line_lower.startswith('tr'): context_material.setAlpha(float(line_split[1])) + context_material.mode |= Material.Modes.ZTRANSP elif line_lower.startswith('map_ka'): img_filepath= line_value(line.split()) if img_filepath: diff --git a/release/scripts/object_active_to_other.py b/release/scripts/object_active_to_other.py index 131d1f63d74..68aa6a3a039 100644 --- a/release/scripts/object_active_to_other.py +++ b/release/scripts/object_active_to_other.py @@ -38,13 +38,13 @@ def my_object_util(sce): Draw.PupMenu('Error%t|No active object selected') return - mats = [ob.matrixWorld for ob in sce.objects.context if ob != ob_act] + mats = [(ob, ob.matrixWorld) for ob in sce.objects.context if ob != ob_act] - for m in mats: + for ob, m in mats: ob_copy = ob_act.copy() sce.objects.link(ob_copy) ob_copy.setMatrix(m) - ob_copy.Layers = ob.Layers + ob_copy.Layers = ob.Layers & (1<<20)-1 def main(): diff --git a/release/scripts/vertexpaint_selfshadow_ao.py b/release/scripts/vertexpaint_selfshadow_ao.py index 54c67fd27e2..3554e016f79 100644 --- a/release/scripts/vertexpaint_selfshadow_ao.py +++ b/release/scripts/vertexpaint_selfshadow_ao.py @@ -43,7 +43,7 @@ import bpy import BPyMesh -def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY): +def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_STRENGTH, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY): Window.WaitCursor(1) Ang= Mathutils.AngleBetweenVecs @@ -83,32 +83,34 @@ def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PRE if vert_tone_count[i]: vert_tone[i] = vert_tone[i] / vert_tone_count[i] + + # Below we use edges to blur along so the edges need counting, not the faces + vert_tone_count= [0] * len(me.verts) + for ed in me.edges: + vert_tone_count[ed.v1.index] += 1 + vert_tone_count[ed.v2.index] += 1 + - # BLUR TONE - edge_lengths= [ ed.length for ed in me.edges] + # Blur tone + blur = PREF_BLUR_STRENGTH + blur_inv = 1.0 - PREF_BLUR_STRENGTH for i in xrange(PREF_BLUR_ITERATIONS): + + # backup the original tones orig_vert_tone= list(vert_tone) - for ii, ed in enumerate(me.edges): + + for ed in me.edges: + i1= ed.v1.index i2= ed.v2.index - l= edge_lengths[ii] + + val1= (orig_vert_tone[i2]*blur) + (orig_vert_tone[i1]*blur_inv) + val2= (orig_vert_tone[i1]*blur) + (orig_vert_tone[i2]*blur_inv) - f=1.0 - if l > PREF_MIN_EDLEN and l < PREF_BLUR_RADIUS: - f= l/PREF_BLUR_RADIUS - - len_vert_tone_list_i1 = vert_tone_count[i1] - len_vert_tone_list_i2 = vert_tone_count[i2] - - if not len_vert_tone_list_i1: len_vert_tone_list_i1=1 - if not len_vert_tone_list_i2: len_vert_tone_list_i2=1 - - val1= (orig_vert_tone[i2]/len_vert_tone_list_i1)/ f - val2= (orig_vert_tone[i1]/len_vert_tone_list_i2)/ f - - vert_tone[i1]+= val1 - vert_tone[i2]+= val2 + # Apply the ton divided by the number of faces connected + vert_tone[i1]+= val1 / max(vert_tone_count[i1], 1) + vert_tone[i2]+= val2 / max(vert_tone_count[i2], 1) min_tone= min(vert_tone) @@ -144,21 +146,19 @@ def main(): me= ob.getData(mesh=1) - PREF_BLUR_ITERATIONS= Draw.Create(1) - PREF_BLUR_RADIUS= Draw.Create(0.05) - PREF_MIN_EDLEN= Draw.Create(0.01) + PREF_BLUR_ITERATIONS= Draw.Create(1) + PREF_BLUR_STRENGTH= Draw.Create(0.5) PREF_CLAMP_CONCAVE= Draw.Create(90) PREF_CLAMP_CONVEX= Draw.Create(20) PREF_SHADOW_ONLY= Draw.Create(0) PREF_SEL_ONLY= Draw.Create(0) pup_block= [\ 'Post AO Blur',\ - (' Iterations:', PREF_BLUR_ITERATIONS, 0, 40, 'Number times to blur the colors. (higher blurs more)'),\ - (' Blur Radius:', PREF_BLUR_RADIUS, 0.01, 40.0, 'How much distance effects blur transfur (higher blurs more).'),\ - (' Min EdgeLen:', PREF_MIN_EDLEN, 0.00001, 1.0, 'Minimim edge length to blur (very low values can cause errors).'),\ + ('Strength:', PREF_BLUR_STRENGTH, 0, 1, 'Blur strength per iteration'),\ + ('Iterations:', PREF_BLUR_ITERATIONS, 0, 40, 'Number times to blur the colors. (higher blurs more)'),\ 'Angle Clipping',\ - (' Highlight Angle:', PREF_CLAMP_CONVEX, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\ - (' Shadow Angle:', PREF_CLAMP_CONCAVE, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\ + ('Highlight Angle:', PREF_CLAMP_CONVEX, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\ + ('Shadow Angle:', PREF_CLAMP_CONCAVE, 0, 180, 'Less then 180 limits the angle used in the tonal range.'),\ ('Shadow Only', PREF_SHADOW_ONLY, 'Dont calculate highlights for convex areas.'),\ ('Sel Faces Only', PREF_SEL_ONLY, 'Only apply to UV/Face selected faces (mix vpain/uvface select).'),\ ] @@ -166,19 +166,16 @@ def main(): if not Draw.PupBlock('SelfShadow...', pup_block): return - PREF_BLUR_ITERATIONS= PREF_BLUR_ITERATIONS.val - PREF_BLUR_RADIUS= PREF_BLUR_RADIUS.val - PREF_MIN_EDLEN= PREF_MIN_EDLEN.val - PREF_CLAMP_CONCAVE= PREF_CLAMP_CONCAVE.val - PREF_CLAMP_CONVEX= PREF_CLAMP_CONVEX.val - PREF_SHADOW_ONLY= PREF_SHADOW_ONLY.val - PREF_SEL_ONLY= PREF_SEL_ONLY.val - if not me.vertexColors: me.vertexColors= 1 t= sys.time() - vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY) + vertexFakeAO(me, PREF_BLUR_ITERATIONS.val, \ + PREF_BLUR_STRENGTH.val, \ + PREF_CLAMP_CONCAVE.val, \ + PREF_CLAMP_CONVEX.val, \ + PREF_SHADOW_ONLY.val, \ + PREF_SEL_ONLY.val) if ob.modifiers: me.update() diff --git a/release/ui/bpy_ops.py b/release/ui/bpy_ops.py index aaf9edc082e..aa9bfb460f0 100644 --- a/release/ui/bpy_ops.py +++ b/release/ui/bpy_ops.py @@ -3,6 +3,7 @@ from bpy.__ops__ import add as op_add from bpy.__ops__ import remove as op_remove from bpy.__ops__ import dir as op_dir from bpy.__ops__ import call as op_call +from bpy.__ops__ import get_rna as op_get_rna class bpy_ops(object): ''' @@ -89,13 +90,22 @@ class bpy_ops_submodule_op(object): self.module = module self.func = func - def __call__(self, **kw): + def idname(self): # submod.foo -> SUBMOD_OT_foo - id_name = self.module.upper() + '_OT_' + self.func - - # Get the operator from - return op_call(id_name, kw) + return self.module.upper() + '_OT_' + self.func + + def __call__(self, **kw): + # Get the operator from blender + return op_call(self.idname(), kw) + + def get_rna(self): + ''' + currently only used for '__rna__' + ''' + return op_get_rna(self.idname()) + + def __repr__(self): return "<function bpy.ops.%s.%s at 0x%x'>" % (self.module, self.func, id(self)) diff --git a/release/ui/buttons_data_armature.py b/release/ui/buttons_data_armature.py index ad34d867350..6f467ee30da 100644 --- a/release/ui/buttons_data_armature.py +++ b/release/ui/buttons_data_armature.py @@ -7,11 +7,10 @@ class DataButtonsPanel(bpy.types.Panel): __context__ = "data" def poll(self, context): - return (context.armature != None) + return (context.armature) class DATA_PT_context_arm(DataButtonsPanel): - __idname__ = "DATA_PT_context_arm" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout @@ -30,7 +29,6 @@ class DATA_PT_context_arm(DataButtonsPanel): split.itemS() class DATA_PT_skeleton(DataButtonsPanel): - __idname__ = "DATA_PT_skeleton" __label__ = "Skeleton" def draw(self, context): @@ -40,47 +38,42 @@ class DATA_PT_skeleton(DataButtonsPanel): arm = context.armature space = context.space_data + split = layout.split() - if arm: - split = layout.split() - - col = split.column() - col.itemR(arm, "rest_position") - - sub = col.column() - sub.itemL(text="Deform:") - sub.itemR(arm, "deform_vertexgroups", text="Vertes Groups") - sub.itemR(arm, "deform_envelope", text="Envelopes") - sub.itemR(arm, "deform_quaternion", text="Quaternion") - sub.itemR(arm, "deform_bbone_rest", text="B-Bones Rest") - #sub.itemR(arm, "x_axis_mirror") - #sub.itemR(arm, "auto_ik") + col = split.column() + col.itemR(arm, "rest_position") + col.itemL(text="Deform:") + col.itemR(arm, "deform_vertexgroups", text="Vertes Groups") + col.itemR(arm, "deform_envelope", text="Envelopes") + col.itemR(arm, "deform_quaternion", text="Quaternion") + col.itemR(arm, "deform_bbone_rest", text="B-Bones Rest") + #col.itemR(arm, "x_axis_mirror") + #col.itemR(arm, "auto_ik") - sub = split.column() - sub.itemL(text="Layers:") - sub.template_layers(arm, "layer") - sub.itemL(text="Protected Layers:") - sub.template_layers(arm, "layer_protection") + col = split.column() + col.itemL(text="Layers:") + col.template_layers(arm, "layer") + col.itemL(text="Protected Layers:") + col.template_layers(arm, "layer_protection") class DATA_PT_display(DataButtonsPanel): - __idname__ = "DATA_PT_display" __label__ = "Display" def draw(self, context): layout = self.layout + arm = context.armature layout.row().itemR(arm, "drawtype", expand=True) - sub = layout.column_flow() - sub.itemR(arm, "draw_names", text="Names") - sub.itemR(arm, "draw_axes", text="Axes") - sub.itemR(arm, "draw_custom_bone_shapes", text="Shapes") - sub.itemR(arm, "draw_group_colors", text="Colors") - sub.itemR(arm, "delay_deform", text="Delay Refresh") + flow = layout.column_flow() + flow.itemR(arm, "draw_names", text="Names") + flow.itemR(arm, "draw_axes", text="Axes") + flow.itemR(arm, "draw_custom_bone_shapes", text="Shapes") + flow.itemR(arm, "draw_group_colors", text="Colors") + flow.itemR(arm, "delay_deform", text="Delay Refresh") class DATA_PT_bone_groups(DataButtonsPanel): - __idname__ = "DATA_PT_bone_groups" __label__ = "Bone Groups" def poll(self, context): @@ -88,28 +81,32 @@ class DATA_PT_bone_groups(DataButtonsPanel): def draw(self, context): layout = self.layout + ob = context.object pose= ob.pose row = layout.row() - row.template_list(pose, "bone_groups", pose, "active_bone_group_index") col = row.column(align=True) + col.active = (ob.proxy == None) col.itemO("pose.group_add", icon="ICON_ZOOMIN", text="") col.itemO("pose.group_remove", icon="ICON_ZOOMOUT", text="") group = pose.active_bone_group if group: col = layout.column() + col.active= (ob.proxy == None) col.itemR(group, "name") split = layout.split(0.5) + split.active= (ob.proxy == None) split.itemR(group, "color_set") if group.color_set: split.template_triColorSet(group, "colors") row = layout.row(align=True) + row.active = (ob.proxy == None) row.itemO("pose.group_assign", text="Assign") row.itemO("pose.group_remove", text="Remove") #row.itemO("pose.bone_group_remove_from", text="Remove") @@ -117,58 +114,59 @@ class DATA_PT_bone_groups(DataButtonsPanel): #row.itemO("object.bone_group_deselect", text="Deselect") class DATA_PT_paths(DataButtonsPanel): - __idname__ = "DATA_PT_paths" __label__ = "Paths" def draw(self, context): layout = self.layout + arm = context.armature split = layout.split() - sub = split.column() - sub.itemR(arm, "paths_show_around_current_frame", text="Around Frame") - col = sub.column(align=True) + col = split.column() + col.itemR(arm, "paths_show_around_current_frame", text="Around Frame") + + sub = col.column(align=True) if (arm.paths_show_around_current_frame): - col.itemR(arm, "path_before_current", text="Before") - col.itemR(arm, "path_after_current", text="After") + sub.itemR(arm, "path_before_current", text="Before") + sub.itemR(arm, "path_after_current", text="After") else: - col.itemR(arm, "path_start_frame", text="Start") - col.itemR(arm, "path_end_frame", text="End") + sub.itemR(arm, "path_start_frame", text="Start") + sub.itemR(arm, "path_end_frame", text="End") - col.itemR(arm, "path_size", text="Step") - sub.itemR(arm, "paths_calculate_head_positions", text="Head") + sub.itemR(arm, "path_size", text="Step") + col.itemR(arm, "paths_calculate_head_positions", text="Head") - sub = split.column() - sub.itemL(text="Show:") - sub.itemR(arm, "paths_show_frame_numbers", text="Frame Numbers") - sub.itemR(arm, "paths_highlight_keyframes", text="Keyframes") - sub.itemR(arm, "paths_show_keyframe_numbers", text="Keyframe Numbers") + col = split.column() + col.itemL(text="Show:") + col.itemR(arm, "paths_show_frame_numbers", text="Frame Numbers") + col.itemR(arm, "paths_highlight_keyframes", text="Keyframes") + col.itemR(arm, "paths_show_keyframe_numbers", text="Keyframe Numbers") class DATA_PT_ghost(DataButtonsPanel): - __idname__ = "DATA_PT_ghost" __label__ = "Ghost" def draw(self, context): layout = self.layout + arm = context.armature split = layout.split() - sub = split.column() - sub.itemR(arm, "ghost_type", text="Scope") + col = split.column() + col.itemR(arm, "ghost_type", text="Scope") - col = sub.column(align=True) + sub = col.column(align=True) if arm.ghost_type == 'RANGE': - col.itemR(arm, "ghost_start_frame", text="Start") - col.itemR(arm, "ghost_end_frame", text="End") - col.itemR(arm, "ghost_size", text="Step") + sub.itemR(arm, "ghost_start_frame", text="Start") + sub.itemR(arm, "ghost_end_frame", text="End") + sub.itemR(arm, "ghost_size", text="Step") elif arm.ghost_type == 'CURRENT_FRAME': - col.itemR(arm, "ghost_step", text="Range") - col.itemR(arm, "ghost_size", text="Step") + sub.itemR(arm, "ghost_step", text="Range") + sub.itemR(arm, "ghost_size", text="Step") - sub = split.column() - sub.itemR(arm, "ghost_only_selected", text="Selected Only") + col = split.column() + col.itemR(arm, "ghost_only_selected", text="Selected Only") bpy.types.register(DATA_PT_context_arm) bpy.types.register(DATA_PT_skeleton) diff --git a/release/ui/buttons_data_bone.py b/release/ui/buttons_data_bone.py index b31cac15425..e05b64e5e11 100644 --- a/release/ui/buttons_data_bone.py +++ b/release/ui/buttons_data_bone.py @@ -10,11 +10,11 @@ class BoneButtonsPanel(bpy.types.Panel): return (context.bone or context.edit_bone) class BONE_PT_context_bone(BoneButtonsPanel): - __idname__ = "BONE_PT_context_bone" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout + bone = context.bone if not bone: bone = context.edit_bone @@ -24,14 +24,13 @@ class BONE_PT_context_bone(BoneButtonsPanel): row.itemR(bone, "name", text="") class BONE_PT_transform(BoneButtonsPanel): - __idname__ = "BONE_PT_transform" __label__ = "Transform" def draw(self, context): layout = self.layout + ob = context.object bone = context.bone - if not bone: bone = context.edit_bone @@ -45,7 +44,7 @@ class BONE_PT_transform(BoneButtonsPanel): sub.itemR(bone, "roll", text="") sub.itemL() sub.itemR(bone, "locked") - sub.itemS() + else: pchan = ob.pose.pose_channels[context.bone.name] @@ -70,12 +69,11 @@ class BONE_PT_transform(BoneButtonsPanel): col.row().itemR(pchan, "euler_rotation", text="") class BONE_PT_bone(BoneButtonsPanel): - __idname__ = "BONE_PT_bone" __label__ = "Bone" - def draw(self, context): layout = self.layout + bone = context.bone arm = context.armature if not bone: @@ -83,31 +81,29 @@ class BONE_PT_bone(BoneButtonsPanel): split = layout.split() - sub = split.column() - sub.itemL(text="Parent:") + col = split.column() + col.itemL(text="Parent:") if context.bone: - sub.itemR(bone, "parent", text="") + col.itemR(bone, "parent", text="") else: - sub.item_pointerR(bone, "parent", arm, "edit_bones", text="") - row = sub.row() - row.itemR(bone, "connected") - row.active = bone.parent != None + col.item_pointerR(bone, "parent", arm, "edit_bones", text="") - sub.itemL(text="Layers:") - sub.template_layers(bone, "layer") + row = col.row() + row.active = bone.parent != None + row.itemR(bone, "connected") - sub = split.column() + col.itemL(text="Layers:") + col.template_layers(bone, "layer") - sub.itemL(text="Inherit:") - sub.itemR(bone, "hinge", text="Rotation") - sub.itemR(bone, "inherit_scale", text="Scale") - - sub.itemL(text="Display:") - sub.itemR(bone, "draw_wire", text="Wireframe") - sub.itemR(bone, "hidden", text="Hide") + col = split.column() + col.itemL(text="Inherit:") + col.itemR(bone, "hinge", text="Rotation") + col.itemR(bone, "inherit_scale", text="Scale") + col.itemL(text="Display:") + col.itemR(bone, "draw_wire", text="Wireframe") + col.itemR(bone, "hidden", text="Hide") class BONE_PT_inverse_kinematics(BoneButtonsPanel): - __idname__ = "BONE_PT_inverse_kinematics" __label__ = "Inverse Kinematics" __default_closed__ = True @@ -123,6 +119,7 @@ class BONE_PT_inverse_kinematics(BoneButtonsPanel): def draw(self, context): layout = self.layout + ob = context.object bone = context.bone pchan = ob.pose.pose_channels[context.bone.name] @@ -177,12 +174,12 @@ class BONE_PT_inverse_kinematics(BoneButtonsPanel): split.itemL() class BONE_PT_deform(BoneButtonsPanel): - __idname__ = "BONE_PT_deform" __label__ = "Deform" __default_closed__ = True def draw_header(self, context): layout = self.layout + bone = context.bone if not bone: bone = context.edit_bone @@ -191,6 +188,7 @@ class BONE_PT_deform(BoneButtonsPanel): def draw(self, context): layout = self.layout + bone = context.bone if not bone: bone = context.edit_bone @@ -201,6 +199,7 @@ class BONE_PT_deform(BoneButtonsPanel): col = split.column() col.itemL(text="Envelope:") + sub = col.column(align=True) sub.itemR(bone, "envelope_distance", text="Distance") sub.itemR(bone, "envelope_weight", text="Weight") @@ -213,6 +212,7 @@ class BONE_PT_deform(BoneButtonsPanel): col = split.column() col.itemL(text="Curved Bones:") + sub = col.column(align=True) sub.itemR(bone, "bbone_segments", text="Segments") sub.itemR(bone, "bbone_in", text="Ease In") @@ -226,4 +226,3 @@ bpy.types.register(BONE_PT_transform) bpy.types.register(BONE_PT_bone) bpy.types.register(BONE_PT_deform) bpy.types.register(BONE_PT_inverse_kinematics) - diff --git a/release/ui/buttons_data_camera.py b/release/ui/buttons_data_camera.py index 7ca70029e49..811858e3627 100644 --- a/release/ui/buttons_data_camera.py +++ b/release/ui/buttons_data_camera.py @@ -7,11 +7,10 @@ class DataButtonsPanel(bpy.types.Panel): __context__ = "data" def poll(self, context): - return (context.camera != None) + return (context.camera) class DATA_PT_context_camera(DataButtonsPanel): - __idname__ = "DATA_PT_context_camera" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout @@ -30,7 +29,6 @@ class DATA_PT_context_camera(DataButtonsPanel): split.itemS() class DATA_PT_camera(DataButtonsPanel): - __idname__ = "DATA_PT_camera" __label__ = "Lens" def draw(self, context): @@ -51,54 +49,49 @@ class DATA_PT_camera(DataButtonsPanel): elif cam.type == 'ORTHO': row.itemR(cam, "ortho_scale") - split = layout.split() - split.itemR(cam, "panorama"); - split.itemL() + layout.itemR(cam, "panorama"); split = layout.split() - sub = split.column(align=True) - sub.itemL(text="Shift:") - sub.itemR(cam, "shift_x", text="X") - sub.itemR(cam, "shift_y", text="Y") + col = split.column(align=True) + col.itemL(text="Shift:") + col.itemR(cam, "shift_x", text="X") + col.itemR(cam, "shift_y", text="Y") - sub = split.column(align=True) - sub.itemL(text="Clipping:") - sub.itemR(cam, "clip_start", text="Start") - sub.itemR(cam, "clip_end", text="End") + col = split.column(align=True) + col.itemL(text="Clipping:") + col.itemR(cam, "clip_start", text="Start") + col.itemR(cam, "clip_end", text="End") - split = layout.split() - col = split.column() - col.itemL(text="Depth of Field:") - col.itemR(cam, "dof_object", text="") - col = split.column() - col.itemL() - col.itemR(cam, "dof_distance", text="Distance") + layout.itemL(text="Depth of Field:") + + row = layout.row() + row.itemR(cam, "dof_object", text="") + row.itemR(cam, "dof_distance", text="Distance") class DATA_PT_camera_display(DataButtonsPanel): - __idname__ = "DATA_PT_camera_display" __label__ = "Display" def draw(self, context): - cam = context.camera layout = self.layout + + cam = context.camera split = layout.split() - sub = split.column() - sub.itemR(cam, "show_limits", text="Limits") - sub.itemR(cam, "show_mist", text="Mist") - sub.itemR(cam, "show_title_safe", text="Title Safe") - sub.itemR(cam, "show_name", text="Name") + col = split.column() + col.itemR(cam, "show_limits", text="Limits") + col.itemR(cam, "show_mist", text="Mist") + col.itemR(cam, "show_title_safe", text="Title Safe") + col.itemR(cam, "show_name", text="Name") col = split.column() col.itemR(cam, "show_passepartout", text="Passepartout") - colsub = col.column() - colsub.active = cam.show_passepartout - colsub.itemR(cam, "passepartout_alpha", text="Alpha", slider=True) + sub = col.column() + sub.active = cam.show_passepartout + sub.itemR(cam, "passepartout_alpha", text="Alpha", slider=True) col.itemR(cam, "draw_size", text="Size") bpy.types.register(DATA_PT_context_camera) bpy.types.register(DATA_PT_camera) bpy.types.register(DATA_PT_camera_display) - diff --git a/release/ui/buttons_data_curve.py b/release/ui/buttons_data_curve.py index 04c4cd6d01e..d0e1756986d 100644 --- a/release/ui/buttons_data_curve.py +++ b/release/ui/buttons_data_curve.py @@ -10,8 +10,7 @@ class DataButtonsPanel(bpy.types.Panel): return (context.object and context.object.type == 'CURVE' and context.curve) class DATA_PT_context_curve(DataButtonsPanel): - __idname__ = "DATA_PT_context_curve" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout @@ -29,9 +28,7 @@ class DATA_PT_context_curve(DataButtonsPanel): split.template_ID(space, "pin_id") split.itemS() - class DATA_PT_shape_curve(DataButtonsPanel): - __idname__ = "DATA_PT_shape_curve" __label__ = "Shape" def draw(self, context): @@ -70,11 +67,11 @@ class DATA_PT_shape_curve(DataButtonsPanel): # sub.itemR(curve, "vertex_normal_flip") class DATA_PT_geometry_curve(DataButtonsPanel): - __idname__ = "DATA_PT_geometry_curve" __label__ = "Geometry " def draw(self, context): layout = self.layout + curve = context.curve split = layout.split() @@ -92,66 +89,67 @@ class DATA_PT_geometry_curve(DataButtonsPanel): sub.itemR(curve, "bevel_object", icon="ICON_OUTLINER_OB_CURVE") class DATA_PT_pathanim(DataButtonsPanel): - __idname__ = "DATA_PT_pathanim" __label__ = "Path Animation" def draw_header(self, context): layout = self.layout + curve = context.curve layout.itemR(curve, "path", text="") def draw(self, context): - curve = context.curve layout = self.layout + + curve = context.curve + layout.active = curve.path split = layout.split() - sub = split.column() - sub.itemR(curve, "path_length", text="Frames") - sub.itemR(curve, "follow") + col = split.column() + col.itemR(curve, "path_length", text="Frames") + col.itemR(curve, "follow") - sub = split.column() - sub.itemR(curve, "stretch") - sub.itemR(curve, "offset_path_distance", text="Offset Children") + col = split.column() + col.itemR(curve, "stretch") + col.itemR(curve, "offset_path_distance", text="Offset Children") class DATA_PT_current_curve(DataButtonsPanel): - __idname__ = "DATA_PT_current_curve" __label__ = "Current Curve" def draw(self, context): layout = self.layout + currentcurve = context.curve.curves[0] # XXX split = layout.split() - sub = split.column() - sub.itemL(text="Cyclic:") - sub.itemR(currentcurve, "cyclic_u", text="U") - sub.itemR(currentcurve, "cyclic_v", text="V") - sub.itemL(text="Order:") - sub.itemR(currentcurve, "order_u", text="U") - sub.itemR(currentcurve, "order_v", text="V") - sub.itemL(text="Endpoints:") - sub.itemR(currentcurve, "endpoint_u", text="U") - sub.itemR(currentcurve, "endpoint_v", text="V") + col = split.column() + col.itemL(text="Cyclic:") + col.itemR(currentcurve, "cyclic_u", text="U") + col.itemR(currentcurve, "cyclic_v", text="V") + col.itemL(text="Order:") + col.itemR(currentcurve, "order_u", text="U") + col.itemR(currentcurve, "order_v", text="V") + col.itemL(text="Endpoints:") + col.itemR(currentcurve, "endpoint_u", text="U") + col.itemR(currentcurve, "endpoint_v", text="V") - sub = split.column() - sub.itemL(text="Bezier:") - sub.itemR(currentcurve, "bezier_u", text="U") - sub.itemR(currentcurve, "bezier_v", text="V") - sub.itemL(text="Resolution:") - sub.itemR(currentcurve, "resolution_u", text="U") - sub.itemR(currentcurve, "resolution_v", text="V") - sub.itemL(text="Interpolation:") - sub.itemR(currentcurve, "tilt_interpolation", text="Tilt") - sub.itemR(currentcurve, "radius_interpolation", text="Tilt") - sub.itemR(currentcurve, "smooth") + col = split.column() + col.itemL(text="Bezier:") + col.itemR(currentcurve, "bezier_u", text="U") + col.itemR(currentcurve, "bezier_v", text="V") + col.itemL(text="Resolution:") + col.itemR(currentcurve, "resolution_u", text="U") + col.itemR(currentcurve, "resolution_v", text="V") + col.itemL(text="Interpolation:") + col.itemR(currentcurve, "tilt_interpolation", text="Tilt") + col.itemR(currentcurve, "radius_interpolation", text="Tilt") + col.itemR(currentcurve, "smooth") bpy.types.register(DATA_PT_context_curve) bpy.types.register(DATA_PT_shape_curve) bpy.types.register(DATA_PT_geometry_curve) bpy.types.register(DATA_PT_pathanim) bpy.types.register(DATA_PT_current_curve) - diff --git a/release/ui/buttons_data_empty.py b/release/ui/buttons_data_empty.py index f97dedcf6cf..827fe02e411 100644 --- a/release/ui/buttons_data_empty.py +++ b/release/ui/buttons_data_empty.py @@ -10,11 +10,11 @@ class DataButtonsPanel(bpy.types.Panel): return (context.object and context.object.type == 'EMPTY') class DATA_PT_empty(DataButtonsPanel): - __idname__ = "DATA_PT_empty" __label__ = "Empty" def draw(self, context): layout = self.layout + ob = context.object layout.itemR(ob, "empty_draw_type") diff --git a/release/ui/buttons_data_lamp.py b/release/ui/buttons_data_lamp.py index 4a6bc11922d..6fb021802f0 100644 --- a/release/ui/buttons_data_lamp.py +++ b/release/ui/buttons_data_lamp.py @@ -7,21 +7,18 @@ class DataButtonsPanel(bpy.types.Panel): __context__ = "data" def poll(self, context): - return (context.lamp != None) + return (context.lamp) class DATA_PT_preview(DataButtonsPanel): - __idname__= "DATA_PT_preview" __label__ = "Preview" def draw(self, context): layout = self.layout - lamp = context.lamp - layout.template_preview(lamp) + layout.template_preview(context.lamp) class DATA_PT_context_lamp(DataButtonsPanel): - __idname__ = "DATA_PT_context_lamp" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout @@ -40,7 +37,6 @@ class DATA_PT_context_lamp(DataButtonsPanel): split.itemS() class DATA_PT_lamp(DataButtonsPanel): - __idname__ = "DATA_PT_lamp" __label__ = "Lamp" def draw(self, context): @@ -51,60 +47,37 @@ class DATA_PT_lamp(DataButtonsPanel): layout.itemR(lamp, "type", expand=True) split = layout.split() - col = split.column() - #col.itemL(text="Type:") - #col.itemR(lamp, "type", text="") - colsub = col.column(align=True) - colsub.itemR(lamp, "color", text="") - colsub.itemR(lamp, "energy") - - col.itemR(lamp, "negative") - #col.itemR(lamp, "distance") - - sub = split.column() - #sub.itemL(text="Influence:") - sub.itemR(lamp, "layer", text="This Layer Only") - sub.itemR(lamp, "specular") - sub.itemR(lamp, "diffuse") - #sub.itemR(lamp, "negative") + col = split.column() + sub = col.column() + sub.itemR(lamp, "color", text="") + sub.itemR(lamp, "energy") + if lamp.type in ('POINT', 'SPOT'): - split = layout.split() - col = split.column() - col.itemL(text="Falloff:") - col = col.column(align=True) - col.itemR(lamp, "falloff_type", text="") - col.itemR(lamp, "distance") - col.itemR(lamp, "sphere") - - if lamp.falloff_type != 'LINEAR_QUADRATIC_WEIGHTED': - col = split.column() - - else: - sub = split.column() - sub.itemL(text="Attenuation Distance:") - sub = sub.column(align=True) + sub.itemL(text="Falloff:") + sub.itemR(lamp, "falloff_type", text="") + sub.itemR(lamp, "distance") + + if lamp.falloff_type == 'LINEAR_QUADRATIC_WEIGHTED': + col.itemL(text="Attenuation Factors:") + sub = col.column(align=True) sub.itemR(lamp, "linear_attenuation", slider=True, text="Linear") sub.itemR(lamp, "quadratic_attenuation", slider=True, text="Quadratic") + col.itemR(lamp, "sphere") + if lamp.type == 'AREA': - split = layout.split() - col = split.column() - col.itemL(text="Shape:") - col = col.column(align=True) - col.itemR(lamp, "shape", text="") - if (lamp.shape == 'SQUARE'): - col.itemR(lamp, "size") - if (lamp.shape == 'RECTANGLE'): - col.itemR(lamp, "size", text="Size X") - col.itemR(lamp, "size_y", text="Size Y") + col.itemR(lamp, "distance") + col.itemR(lamp, "gamma") + - sub = split.column() - sub.itemL(text="Gamma:") - sub.itemR(lamp, "gamma", text="Value") - + col = split.column() + col.itemR(lamp, "negative") + col.itemR(lamp, "layer", text="This Layer Only") + col.itemR(lamp, "specular") + col.itemR(lamp, "diffuse") + class DATA_PT_sunsky(DataButtonsPanel): - __idname__ = "DATA_PT_sunsky" __label__ = "Sun/Sky" def poll(self, context): @@ -113,6 +86,7 @@ class DATA_PT_sunsky(DataButtonsPanel): def draw(self, context): layout = self.layout + lamp = context.lamp.sky row = layout.row() @@ -128,30 +102,29 @@ class DATA_PT_sunsky(DataButtonsPanel): col = split.column() col.active = lamp.sky col.itemL(text="Blend Mode:") - colsub = col.column(align=True) - colsub.itemR(lamp, "sky_blend_type", text="") - colsub.itemR(lamp, "sky_blend", text="Factor") + sub = col.column(align=True) + sub.itemR(lamp, "sky_blend_type", text="") + sub.itemR(lamp, "sky_blend", text="Factor") col.itemL(text="Color Space:") - colsub = col.column(align=True) - colsub.itemR(lamp, "sky_color_space", text="") - colsub.itemR(lamp, "sky_exposure", text="Exposure") + sub = col.column(align=True) + sub.itemR(lamp, "sky_color_space", text="") + sub.itemR(lamp, "sky_exposure", text="Exposure") col = split.column() col.active = lamp.sky col.itemL(text="Horizon:") - colsub = col.column(align=True) - colsub.itemR(lamp, "horizon_brightness", text="Brightness") - colsub.itemR(lamp, "spread", text="Spread") + sub = col.column(align=True) + sub.itemR(lamp, "horizon_brightness", text="Brightness") + sub.itemR(lamp, "spread", text="Spread") col.itemL(text="Sun:") - colsub = col.column(align=True) - colsub.itemR(lamp, "sun_brightness", text="Brightness") - colsub.itemR(lamp, "sun_size", text="Size") - colsub.itemR(lamp, "backscattered_light", slider=True,text="Back Light") + sub = col.column(align=True) + sub.itemR(lamp, "sun_brightness", text="Brightness") + sub.itemR(lamp, "sun_size", text="Size") + sub.itemR(lamp, "backscattered_light", slider=True,text="Back Light") - row = layout.row() - row.itemS() + layout.itemS() split = layout.split() @@ -170,7 +143,6 @@ class DATA_PT_sunsky(DataButtonsPanel): sub.itemR(lamp, "atmosphere_extinction", slider=True ,text="Extinction") class DATA_PT_shadow(DataButtonsPanel): - __idname__ = "DATA_PT_shadow" __label__ = "Shadow" def poll(self, context): @@ -179,92 +151,121 @@ class DATA_PT_shadow(DataButtonsPanel): def draw(self, context): layout = self.layout + lamp = context.lamp layout.itemR(lamp, "shadow_method", expand=True) if lamp.shadow_method != 'NOSHADOW': - split = layout.split() col = split.column() - col.itemR(lamp, "shadow_color") + col.itemR(lamp, "shadow_color", text="") - sub = split.column() - sub.itemR(lamp, "shadow_layer", text="This Layer Only") - sub.itemR(lamp, "only_shadow") + col = split.column() + col.itemR(lamp, "shadow_layer", text="This Layer Only") + col.itemR(lamp, "only_shadow") if lamp.shadow_method == 'RAY_SHADOW': - col = layout.column() col.itemL(text="Sampling:") col.row().itemR(lamp, "shadow_ray_sampling_method", expand=True) if lamp.type in ('POINT', 'SUN', 'SPOT'): split = layout.split() - col = split.column(align=True) + + col = split.column() col.itemR(lamp, "shadow_soft_size", text="Soft Size") - col = split.column(align=True) + col.itemR(lamp, "shadow_ray_samples", text="Samples") if lamp.shadow_ray_sampling_method == 'ADAPTIVE_QMC': col.itemR(lamp, "shadow_adaptive_threshold", text="Threshold") + col = split.column() - if lamp.type == 'AREA': + elif lamp.type == 'AREA': split = layout.split() + col = split.column() - - if lamp.shadow_ray_sampling_method == 'CONSTANT_JITTERED': - col.itemR(lamp, "umbra") - col.itemR(lamp, "dither") - col.itemR(lamp, "jitter") - else: - col.itemL() - - col = split.column(align=True) - col.itemR(lamp, "shadow_ray_samples_x", text="Samples") + sub = split.column(align=True) + if lamp.shape == 'SQUARE': + col.itemR(lamp, "shadow_ray_samples_x", text="Samples") + elif lamp.shape == 'RECTANGLE': + col.itemR(lamp, "shadow_ray_samples_x", text="Samples X") + col.itemR(lamp, "shadow_ray_samples_y", text="Samples Y") + if lamp.shadow_ray_sampling_method == 'ADAPTIVE_QMC': col.itemR(lamp, "shadow_adaptive_threshold", text="Threshold") - + + elif lamp.shadow_ray_sampling_method == 'CONSTANT_JITTERED': + sub.itemR(lamp, "umbra") + sub.itemR(lamp, "dither") + sub.itemR(lamp, "jitter") + if lamp.shadow_method == 'BUFFER_SHADOW': col = layout.column() col.itemL(text="Buffer Type:") col.row().itemR(lamp, "shadow_buffer_type", expand=True) if lamp.shadow_buffer_type in ('REGULAR', 'HALFWAY'): - split = layout.split() + col = split.column() col.itemL(text="Filter Type:") col.itemR(lamp, "shadow_filter_type", text="") - - colsub = col.column(align=True) - colsub.itemR(lamp, "shadow_buffer_soft", text="Soft") - colsub.itemR(lamp, "shadow_buffer_bias", text="Bias") + sub = col.column(align=True) + sub.itemR(lamp, "shadow_buffer_soft", text="Soft") + sub.itemR(lamp, "shadow_buffer_bias", text="Bias") col = split.column() col.itemL(text="Sample Buffers:") col.itemR(lamp, "shadow_sample_buffers", text="") + sub = col.column(align=True) + sub.itemR(lamp, "shadow_buffer_size", text="Size") + sub.itemR(lamp, "shadow_buffer_samples", text="Samples") - colsub = col.column(align=True) - colsub.itemR(lamp, "shadow_buffer_size", text="Size") - colsub.itemR(lamp, "shadow_buffer_samples", text="Samples") - - if (lamp.shadow_buffer_type == 'IRREGULAR'): - row = layout.row() - row.itemR(lamp, "shadow_buffer_bias", text="Bias") + elif lamp.shadow_buffer_type == 'IRREGULAR': + layout.itemR(lamp, "shadow_buffer_bias", text="Bias") row = layout.row() row.itemR(lamp, "auto_clip_start", text="Autoclip Start") - if not (lamp.auto_clip_start): - row.itemR(lamp, "shadow_buffer_clip_start", text="Clip Start") + sub = row.row() + sub.active = not lamp.auto_clip_start + sub.itemR(lamp, "shadow_buffer_clip_start", text="Clip Start") + row = layout.row() row.itemR(lamp, "auto_clip_end", text="Autoclip End") - if not (lamp.auto_clip_end): - row.itemR(lamp, "shadow_buffer_clip_end", text=" Clip End") + sub = row.row() + sub.active = not lamp.auto_clip_end + sub.itemR(lamp, "shadow_buffer_clip_end", text=" Clip End") + +class DATA_PT_area(DataButtonsPanel): + __label__ = "Area Shape" + + def poll(self, context): + lamp = context.lamp + return (lamp and lamp.type == 'AREA') + + def draw(self, context): + layout = self.layout + + lamp = context.lamp + + split = layout.split() + + col = split.column() + col.itemR(lamp, "shape", text="") + + sub = col.column(align=True) + if (lamp.shape == 'SQUARE'): + sub.itemR(lamp, "size") + elif (lamp.shape == 'RECTANGLE'): + sub.itemR(lamp, "size", text="Size X") + sub.itemR(lamp, "size_y", text="Size Y") + + col = split.column() class DATA_PT_spot(DataButtonsPanel): - __idname__ = "DATA_PT_spot" - __label__ = "Spot" + __label__ = "Spot Shape" def poll(self, context): lamp = context.lamp @@ -272,9 +273,11 @@ class DATA_PT_spot(DataButtonsPanel): def draw(self, context): layout = self.layout + lamp = context.lamp split = layout.split() + col = split.column() sub = col.column(align=True) sub.itemR(lamp, "spot_size", text="Size") @@ -283,14 +286,13 @@ class DATA_PT_spot(DataButtonsPanel): col = split.column() col.itemR(lamp, "halo") - colsub = col.column(align=True) - colsub.active = lamp.halo - colsub.itemR(lamp, "halo_intensity", text="Intensity") + sub = col.column(align=True) + sub.active = lamp.halo + sub.itemR(lamp, "halo_intensity", text="Intensity") if lamp.shadow_method == 'BUFFER_SHADOW': - colsub.itemR(lamp, "halo_step", text="Step") + sub.itemR(lamp, "halo_step", text="Step") class DATA_PT_falloff_curve(DataButtonsPanel): - __idname__ = "DATA_PT_falloff_curve" __label__ = "Falloff Curve" __default_closed__ = True @@ -305,6 +307,7 @@ class DATA_PT_falloff_curve(DataButtonsPanel): def draw(self, context): layout = self.layout + lamp = context.lamp layout.template_curve_mapping(lamp.falloff_curve) @@ -313,7 +316,7 @@ bpy.types.register(DATA_PT_context_lamp) bpy.types.register(DATA_PT_preview) bpy.types.register(DATA_PT_lamp) bpy.types.register(DATA_PT_falloff_curve) +bpy.types.register(DATA_PT_area) bpy.types.register(DATA_PT_spot) bpy.types.register(DATA_PT_shadow) -bpy.types.register(DATA_PT_sunsky) - +bpy.types.register(DATA_PT_sunsky)
\ No newline at end of file diff --git a/release/ui/buttons_data_lattice.py b/release/ui/buttons_data_lattice.py index 1bcaa342c67..3766b9ff1a5 100644 --- a/release/ui/buttons_data_lattice.py +++ b/release/ui/buttons_data_lattice.py @@ -10,8 +10,7 @@ class DataButtonsPanel(bpy.types.Panel): return (context.lattice != None) class DATA_PT_context_lattice(DataButtonsPanel): - __idname__ = "DATA_PT_context_lattice" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout @@ -29,9 +28,7 @@ class DATA_PT_context_lattice(DataButtonsPanel): split.template_ID(space, "pin_id") split.itemS() - class DATA_PT_lattice(DataButtonsPanel): - __idname__ = "DATA_PT_lattice" __label__ = "Lattice" def draw(self, context): @@ -57,4 +54,3 @@ class DATA_PT_lattice(DataButtonsPanel): bpy.types.register(DATA_PT_context_lattice) bpy.types.register(DATA_PT_lattice) - diff --git a/release/ui/buttons_data_mesh.py b/release/ui/buttons_data_mesh.py index 757745d039e..e8ab59a96dd 100644 --- a/release/ui/buttons_data_mesh.py +++ b/release/ui/buttons_data_mesh.py @@ -10,8 +10,7 @@ class DataButtonsPanel(bpy.types.Panel): return (context.mesh != None) class DATA_PT_context_mesh(DataButtonsPanel): - __idname__ = "DATA_PT_context_mesh" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout @@ -30,7 +29,6 @@ class DATA_PT_context_mesh(DataButtonsPanel): split.itemS() class DATA_PT_normals(DataButtonsPanel): - __idname__ = "DATA_PT_normals" __label__ = "Normals" def draw(self, context): @@ -42,23 +40,15 @@ class DATA_PT_normals(DataButtonsPanel): col = split.column() col.itemR(mesh, "autosmooth") - colsub = col.column() - colsub.active = mesh.autosmooth - colsub.itemR(mesh, "autosmooth_angle", text="Angle") + sub = col.column() + sub.active = mesh.autosmooth + sub.itemR(mesh, "autosmooth_angle", text="Angle") + sub = split.column() sub.itemR(mesh, "vertex_normal_flip") sub.itemR(mesh, "double_sided") - row = layout.row(align=True) - if context.edit_object: - row.itemO("MESH_OT_faces_shade_smooth") - row.itemO("MESH_OT_faces_shade_flat") - else: - row.itemO("OBJECT_OT_shade_smooth") - row.itemO("OBJECT_OT_shade_flat") - class DATA_PT_vertex_groups(DataButtonsPanel): - __idname__ = "DATA_PT_vertex_groups" __label__ = "Vertex Groups" def poll(self, context): @@ -66,10 +56,10 @@ class DATA_PT_vertex_groups(DataButtonsPanel): def draw(self, context): layout = self.layout + ob = context.object row = layout.row() - row.template_list(ob, "vertex_groups", ob, "active_vertex_group_index") col = row.column(align=True) @@ -96,7 +86,6 @@ class DATA_PT_vertex_groups(DataButtonsPanel): layout.itemR(context.tool_settings, "vertex_group_weight", text="Weight") class DATA_PT_shape_keys(DataButtonsPanel): - __idname__ = "DATA_PT_shape_keys" __label__ = "Shape Keys" def poll(self, context): @@ -104,6 +93,7 @@ class DATA_PT_shape_keys(DataButtonsPanel): def draw(self, context): layout = self.layout + ob = context.object key = ob.data.shape_keys kb = ob.active_shape_key @@ -133,37 +123,44 @@ class DATA_PT_shape_keys(DataButtonsPanel): row.itemR(kb, "name") if ob.active_shape_key_index != 0: - if not ob.shape_key_lock: - row = layout.row(align=True) - row.itemR(kb, "value", text="") - row.itemR(kb, "slider_min", text="Min") - row.itemR(kb, "slider_max", text="Max") - + row = layout.row() - row.item_pointerR(kb, "vertex_group", ob, "vertex_groups", text="") - row.item_pointerR(kb, "relative_key", key, "keys", text="") + row.enabled = ob.shape_key_lock == False + row.itemR(kb, "value", slider=True) + + split = layout.split() + sub = split.column() + sub.enabled = ob.shape_key_lock == False + sub.itemL(text="Range:") + sub.itemR(kb, "slider_min", text="Min") + sub.itemR(kb, "slider_max", text="Max") + + sub = split.column() + sub.itemL(text="Blend:") + sub.item_pointerR(kb, "vertex_group", ob, "vertex_groups", text="") + sub.item_pointerR(kb, "relative_key", key, "keys", text="") + else: row = layout.row() row.itemR(key, "relative") row.itemR(key, "slurph") - row = layout.row() - row.itemR(kb, "name") + layout.itemR(kb, "name") if context.edit_object: layout.enabled = False class DATA_PT_uv_texture(DataButtonsPanel): - __idname__ = "DATA_PT_uv_texture" __label__ = "UV Texture" def draw(self, context): layout = self.layout + me = context.mesh row = layout.row() - col = row.column() + col.template_list(me, "uv_textures", me, "active_uv_texture_index", rows=2) col = row.column(align=True) @@ -175,11 +172,11 @@ class DATA_PT_uv_texture(DataButtonsPanel): layout.itemR(lay, "name") class DATA_PT_vertex_colors(DataButtonsPanel): - __idname__ = "DATA_PT_vertex_colors" __label__ = "Vertex Colors" def draw(self, context): layout = self.layout + me = context.mesh row = layout.row() @@ -201,4 +198,3 @@ bpy.types.register(DATA_PT_vertex_groups) bpy.types.register(DATA_PT_shape_keys) bpy.types.register(DATA_PT_uv_texture) bpy.types.register(DATA_PT_vertex_colors) - diff --git a/release/ui/buttons_data_metaball.py b/release/ui/buttons_data_metaball.py new file mode 100644 index 00000000000..74731473683 --- /dev/null +++ b/release/ui/buttons_data_metaball.py @@ -0,0 +1,112 @@ +import bpy + +class DataButtonsPanel(bpy.types.Panel): + __space_type__ = "BUTTONS_WINDOW" + __region_type__ = "WINDOW" + __context__ = "data" + + def poll(self, context): + return (context.meta_ball) + +class DATA_PT_context_metaball(DataButtonsPanel): + __show_header__ = False + + def draw(self, context): + layout = self.layout + + ob = context.object + mball = context.meta_ball + space = context.space_data + + split = layout.split(percentage=0.65) + + if ob: + split.template_ID(ob, "data") + split.itemS() + elif mball: + split.template_ID(space, "pin_id") + split.itemS() + +class DATA_PT_metaball(DataButtonsPanel): + __label__ = "Metaball" + + def draw(self, context): + layout = self.layout + + mball = context.meta_ball + + split = layout.split() + + col = split.column() + col.itemL(text="Resolution:") + sub = col.column(align=True) + sub.itemR(mball, "wire_size", text="View") + sub.itemR(mball, "render_size", text="Render") + + col = split.column() + col.itemL(text="Settings:") + col.itemR(mball, "threshold", text="Threshold") + + layout.itemL(text="Update:") + layout.itemR(mball, "flag", expand=True) + +class DATA_PT_metaball_element(DataButtonsPanel): + __label__ = "Active Element" + + def poll(self, context): + return (context.meta_ball and context.meta_ball.last_selected_element) + + def draw(self, context): + layout = self.layout + + metaelem = context.meta_ball.last_selected_element + + split = layout.split(percentage=0.3) + split.itemL(text="Type:") + split.itemR(metaelem, "type", text="") + + split = layout.split() + + col = split.column() + col.itemL(text="Settings:") + col.itemR(metaelem, "stiffness", text="Stiffness") + col.itemR(metaelem, "negative", text="Negative") + col.itemR(metaelem, "hide", text="Hide") + + if metaelem.type == 'BALL': + + col = split.column(align=True) + + elif metaelem.type == 'CUBE': + + col = split.column(align=True) + col.itemL(text="Size:") + col.itemR(metaelem, "sizex", text="X") + col.itemR(metaelem, "sizey", text="Y") + col.itemR(metaelem, "sizez", text="Z") + + elif metaelem.type == 'TUBE': + + col = split.column(align=True) + col.itemL(text="Size:") + col.itemR(metaelem, "sizex", text="X") + + elif metaelem.type == 'PLANE': + + col = split.column(align=True) + col.itemL(text="Size:") + col.itemR(metaelem, "sizex", text="X") + col.itemR(metaelem, "sizey", text="Y") + + elif metaelem.type == 'ELLIPSOID': + + col = split.column(align=True) + col.itemL(text="Size:") + col.itemR(metaelem, "sizex", text="X") + col.itemR(metaelem, "sizey", text="Y") + col.itemR(metaelem, "sizez", text="Z") + + +bpy.types.register(DATA_PT_context_metaball) +bpy.types.register(DATA_PT_metaball) +bpy.types.register(DATA_PT_metaball_element)
\ No newline at end of file diff --git a/release/ui/buttons_data_modifier.py b/release/ui/buttons_data_modifier.py index f4d0f7f8ad0..bd39ff1e70e 100644 --- a/release/ui/buttons_data_modifier.py +++ b/release/ui/buttons_data_modifier.py @@ -7,12 +7,12 @@ class DataButtonsPanel(bpy.types.Panel): __context__ = "modifier" class DATA_PT_modifiers(DataButtonsPanel): - __idname__ = "DATA_PT_modifiers" __label__ = "Modifiers" def draw(self, context): - ob = context.object layout = self.layout + + ob = context.object row = layout.row() row.item_menu_enumO("object.modifier_add", "type") @@ -70,6 +70,8 @@ class DATA_PT_modifiers(DataButtonsPanel): self.shrinkwrap(box, ob, md) elif md.type == 'SIMPLE_DEFORM': self.simpledeform(box, ob, md) + elif md.type == 'SMOKE': + self.smoke(box, ob, md) elif md.type == 'SMOOTH': self.smooth(box, ob, md) elif md.type == 'SOFTBODY': @@ -85,9 +87,11 @@ class DATA_PT_modifiers(DataButtonsPanel): def armature(self, layout, ob, md): layout.itemR(md, "object") + row = layout.row() row.item_pointerR(md, "vertex_group", ob, "vertex_groups") row.itemR(md, "invert") + flow = layout.column_flow() flow.itemR(md, "use_vertex_groups", text="Vertex Groups") flow.itemR(md, "use_bone_envelopes", text="Bone Envelopes") @@ -108,34 +112,31 @@ class DATA_PT_modifiers(DataButtonsPanel): split = layout.split() col = split.column() - col = col.column() col.itemR(md, "constant_offset") - colsub = col.column() - colsub.active = md.constant_offset - colsub.itemR(md, "constant_offset_displacement", text="") + sub = col.column() + sub.active = md.constant_offset + sub.itemR(md, "constant_offset_displacement", text="") col.itemS() - sub = col.row().itemR(md, "merge_adjacent_vertices", text="Merge") - colsub = col.column() - colsub.active = md.merge_adjacent_vertices - colsub.itemR(md, "merge_end_vertices", text="First Last") - colsub.itemR(md, "merge_distance", text="Distance") + col.itemR(md, "merge_adjacent_vertices", text="Merge") + sub = col.column() + sub.active = md.merge_adjacent_vertices + sub.itemR(md, "merge_end_vertices", text="First Last") + sub.itemR(md, "merge_distance", text="Distance") col = split.column() - col = col.column() col.itemR(md, "relative_offset") - colsub = col.column() - colsub.active = md.relative_offset - colsub.itemR(md, "relative_offset_displacement", text="") + sub = col.column() + sub.active = md.relative_offset + sub.itemR(md, "relative_offset_displacement", text="") col.itemS() - col = col.column() col.itemR(md, "add_offset_object") - colsub = col.column() - colsub.active = md.add_offset_object - colsub.itemR(md, "offset_object", text="") + sub = col.column() + sub.active = md.add_offset_object + sub.itemR(md, "offset_object", text="") layout.itemS() @@ -149,14 +150,11 @@ class DATA_PT_modifiers(DataButtonsPanel): row.itemR(md, "only_vertices") layout.itemL(text="Limit Method:") - row = layout.row() - row.itemR(md, "limit_method", expand=True) + layout.row().itemR(md, "limit_method", expand=True) if md.limit_method == 'ANGLE': - row = layout.row() - row.itemR(md, "angle") + layout.itemR(md, "angle") elif md.limit_method == 'WEIGHT': - row = layout.row() - row.itemR(md, "edge_weight_method", expand=True) + layout.row().itemR(md, "edge_weight_method", expand=True) def boolean(self, layout, ob, md): layout.itemR(md, "operation") @@ -171,23 +169,27 @@ class DATA_PT_modifiers(DataButtonsPanel): col = split.column() col.itemR(md, "randomize") - colsub = col.column() - colsub.active = md.randomize - colsub.itemR(md, "seed") - - - + sub = col.column() + sub.active = md.randomize + sub.itemR(md, "seed") + def cast(self, layout, ob, md): layout.itemR(md, "cast_type") - col = layout.column_flow() - col.itemR(md, "x") - col.itemR(md, "y") - col.itemR(md, "z") - col.itemR(md, "factor") - col.itemR(md, "radius") - col.itemR(md, "size") + layout.itemR(md, "object") + if md.object: + layout.itemR(md, "use_transform") + + flow = layout.column_flow() + flow.itemR(md, "x") + flow.itemR(md, "y") + flow.itemR(md, "z") + flow.itemR(md, "factor") + flow.itemR(md, "radius") + flow.itemR(md, "size") + + layout.itemR(md, "from_radius") + layout.item_pointerR(md, "vertex_group", ob, "vertex_groups") - #Missing: "OB" and "From Radius" def cloth(self, layout, ob, md): layout.itemL(text="See Cloth panel.") @@ -221,9 +223,10 @@ class DATA_PT_modifiers(DataButtonsPanel): col = split.column() col.itemR(md, "use_edge_angle", text="Edge Angle") - colsub = col.column() - colsub.active = md.use_edge_angle - colsub.itemR(md, "split_angle") + sub = col.column() + sub.active = md.use_edge_angle + sub.itemR(md, "split_angle") + col = split.column() col.itemR(md, "use_sharp", text="Sharp Edges") @@ -234,7 +237,7 @@ class DATA_PT_modifiers(DataButtonsPanel): layout.itemR(md, "unborn") layout.itemR(md, "alive") layout.itemR(md, "dead") - # Missing: "Refresh" and "Clear Vertex Group" ? + # Missing: "Refresh" and "Clear Vertex Group" Operator def fluid(self, layout, ob, md): layout.itemL(text="See Fluid panel.") @@ -244,7 +247,7 @@ class DATA_PT_modifiers(DataButtonsPanel): layout.itemR(md, "force", slider=True) layout.itemR(md, "object") layout.item_pointerR(md, "vertex_group", ob, "vertex_groups") - # Missing: "Reset" and "Recenter" + # Missing: "Reset" and "Recenter" Operator def lattice(self, layout, ob, md): layout.itemR(md, "object") @@ -264,6 +267,7 @@ class DATA_PT_modifiers(DataButtonsPanel): layout.itemR(md, "invert") layout.itemS() + layout.itemO("object.modifier_mdef_bind", text="Bind") row = layout.row() row.itemR(md, "precision") @@ -273,17 +277,19 @@ class DATA_PT_modifiers(DataButtonsPanel): layout.itemR(md, "merge_limit") split = layout.split() - sub = split.column() - sub.itemR(md, "x") - sub.itemR(md, "y") - sub.itemR(md, "z") - sub = split.column() - sub.itemL(text="Textures:") - sub.itemR(md, "mirror_u") - sub.itemR(md, "mirror_v") - sub = split.column() - sub.itemR(md, "clip", text="Do Clipping") - sub.itemR(md, "mirror_vertex_groups", text="Vertex Group") + col = split.column() + col.itemR(md, "x") + col.itemR(md, "y") + col.itemR(md, "z") + + col = split.column() + col.itemL(text="Textures:") + col.itemR(md, "mirror_u") + col.itemR(md, "mirror_v") + + col = split.column() + col.itemR(md, "clip", text="Do Clipping") + col.itemR(md, "mirror_vertex_groups", text="Vertex Group") layout.itemR(md, "mirror_object") @@ -296,19 +302,19 @@ class DATA_PT_modifiers(DataButtonsPanel): layout.itemR(md, "object") layout.itemR(md, "particle_system_number") - col = layout.column_flow() - col.itemR(md, "normal") - col.itemR(md, "children") - col.itemR(md, "size") - col.itemR(md, "path") + flow = layout.column_flow() + flow.itemR(md, "normal") + flow.itemR(md, "children") + flow.itemR(md, "size") + flow.itemR(md, "path") if md.path: - col.itemR(md, "keep_shape") - col.itemR(md, "unborn") - col.itemR(md, "alive") - col.itemR(md, "dead") - col.itemL(md, "") + flow.itemR(md, "keep_shape") + flow.itemR(md, "unborn") + flow.itemR(md, "alive") + flow.itemR(md, "dead") + flow.itemL(md, "") if md.path: - col.itemR(md, "axis", text="") + flow.itemR(md, "axis", text="") if md.path: row = layout.row() @@ -333,14 +339,13 @@ class DATA_PT_modifiers(DataButtonsPanel): row.itemR(md, "y") row.itemR(md, "z") - col = layout.column_flow() - col.itemR(md, "negative") - col.itemR(md, "positive") - col.itemR(md, "cull_front_faces") - col.itemR(md, "cull_back_faces") + flow = layout.column_flow() + flow.itemR(md, "negative") + flow.itemR(md, "positive") + flow.itemR(md, "cull_front_faces") + flow.itemR(md, "cull_back_faces") elif md.mode == 'NEAREST_SURFACEPOINT': layout.itemR(md, "keep_above_surface") - # To-Do: Validate if structs def simpledeform(self, layout, ob, md): layout.itemR(md, "mode") @@ -352,16 +357,43 @@ class DATA_PT_modifiers(DataButtonsPanel): if md.mode in ('TAPER', 'STRETCH'): layout.itemR(md, "lock_x_axis") layout.itemR(md, "lock_y_axis") + + def smoke(self, layout, ob, md): + layout.itemR(md, "smoke_type") + + if md.smoke_type == 'TYPE_DOMAIN': + layout.itemS() + layout.itemR(md.domain_settings, "maxres") + layout.itemR(md.domain_settings, "color") + layout.itemR(md.domain_settings, "amplify") + layout.itemR(md.domain_settings, "highres") + layout.itemR(md.domain_settings, "noise_type") + layout.itemR(md.domain_settings, "visibility") + layout.itemR(md.domain_settings, "alpha") + layout.itemR(md.domain_settings, "beta") + layout.itemR(md.domain_settings, "fluid_group") + layout.itemR(md.domain_settings, "eff_group") + layout.itemR(md.domain_settings, "coll_group") + elif md.smoke_type == 'TYPE_FLOW': + layout.itemS() + layout.itemR(md.flow_settings, "outflow") + layout.itemR(md.flow_settings, "density") + layout.itemR(md.flow_settings, "temperature") + layout.item_pointerR(md.flow_settings, "psys", ob, "particle_systems") + elif md.smoke_type == 'TYPE_COLL': + layout.itemS() def smooth(self, layout, ob, md): split = layout.split() - sub = split.column() - sub.itemR(md, "x") - sub.itemR(md, "y") - sub.itemR(md, "z") - sub = split.column() - sub.itemR(md, "factor") - sub.itemR(md, "repeat") + + col = split.column() + col.itemR(md, "x") + col.itemR(md, "y") + col.itemR(md, "z") + + col = split.column() + col.itemR(md, "factor") + col.itemR(md, "repeat") layout.item_pointerR(md, "vertex_group", ob, "vertex_groups") @@ -370,11 +402,12 @@ class DATA_PT_modifiers(DataButtonsPanel): def subsurf(self, layout, ob, md): layout.itemR(md, "subdivision_type") - col = layout.column_flow() - col.itemR(md, "levels", text="Preview") - col.itemR(md, "render_levels", text="Render") - col.itemR(md, "optimal_draw", text="Optimal Display") - col.itemR(md, "subsurf_uv") + + flow = layout.column_flow() + flow.itemR(md, "levels", text="Preview") + flow.itemR(md, "render_levels", text="Render") + flow.itemR(md, "optimal_draw", text="Optimal Display") + flow.itemR(md, "subsurf_uv") def surface(self, layout, ob, md): layout.itemL(text="See Fields panel.") @@ -382,7 +415,7 @@ class DATA_PT_modifiers(DataButtonsPanel): def uvproject(self, layout, ob, md): if ob.type == 'MESH': layout.item_pointerR(md, "uv_layer", ob.data, "uv_layers") - layout.itemR(md, "projectors") + #layout.itemR(md, "projectors") layout.itemR(md, "image") layout.itemR(md, "horizontal_aspect_ratio") layout.itemR(md, "vertical_aspect_ratio") @@ -392,27 +425,27 @@ class DATA_PT_modifiers(DataButtonsPanel): def wave(self, layout, ob, md): split = layout.split() - sub = split.column() - sub.itemL(text="Motion:") - sub.itemR(md, "x") - sub.itemR(md, "y") - sub.itemR(md, "cyclic") - - sub = split.column() - sub.itemR(md, "normals") - row = sub.row(align=True) - row.active = md.normals - row.itemR(md, "x_normal", text="X", toggle=True) - row.itemR(md, "y_normal", text="Y", toggle=True) - row.itemR(md, "z_normal", text="Z", toggle=True) - - col = layout.column_flow() - col.itemR(md, "time_offset") - col.itemR(md, "lifetime") - col.itemR(md, "damping_time") - col.itemR(md, "falloff_radius") - col.itemR(md, "start_position_x") - col.itemR(md, "start_position_y") + col = split.column() + col.itemL(text="Motion:") + col.itemR(md, "x") + col.itemR(md, "y") + col.itemR(md, "cyclic") + + col = split.column() + col.itemR(md, "normals") + sub = col.row(align=True) + sub.active = md.normals + sub.itemR(md, "x_normal", text="X", toggle=True) + sub.itemR(md, "y_normal", text="Y", toggle=True) + sub.itemR(md, "z_normal", text="Z", toggle=True) + + flow = layout.column_flow() + flow.itemR(md, "time_offset") + flow.itemR(md, "lifetime") + flow.itemR(md, "damping_time") + flow.itemR(md, "falloff_radius") + flow.itemR(md, "start_position_x") + flow.itemR(md, "start_position_y") layout.itemR(md, "start_position_object") layout.item_pointerR(md, "vertex_group", ob, "vertex_groups") @@ -423,10 +456,10 @@ class DATA_PT_modifiers(DataButtonsPanel): elif md.texture_coordinates == 'OBJECT': layout.itemR(md, "texture_coordinates_object") - col = layout.column_flow() - col.itemR(md, "speed", slider=True) - col.itemR(md, "height", slider=True) - col.itemR(md, "width", slider=True) - col.itemR(md, "narrowness", slider=True) + flow = layout.column_flow() + flow.itemR(md, "speed", slider=True) + flow.itemR(md, "height", slider=True) + flow.itemR(md, "width", slider=True) + flow.itemR(md, "narrowness", slider=True) bpy.types.register(DATA_PT_modifiers) diff --git a/release/ui/buttons_data_text.py b/release/ui/buttons_data_text.py index 81d54af0ef7..757e61307df 100644 --- a/release/ui/buttons_data_text.py +++ b/release/ui/buttons_data_text.py @@ -10,8 +10,7 @@ class DataButtonsPanel(bpy.types.Panel): return (context.object and context.object.type == 'TEXT' and context.curve) class DATA_PT_context_text(DataButtonsPanel): - __idname__ = "DATA_PT_context_text" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout @@ -30,7 +29,6 @@ class DATA_PT_context_text(DataButtonsPanel): split.itemS() class DATA_PT_shape_text(DataButtonsPanel): - __idname__ = "DATA_PT_shape_text" __label__ = "Shape Text" def draw(self, context): @@ -45,84 +43,82 @@ class DATA_PT_shape_text(DataButtonsPanel): split = layout.split() - sub = split.column() - sub.itemL(text="Caps:") - sub.itemR(curve, "front") - sub.itemR(curve, "back") + col = split.column() + col.itemL(text="Caps:") + col.itemR(curve, "front") + col.itemR(curve, "back") + col.itemL(text="Textures:") + col.itemR(curve, "uv_orco") + col.itemR(curve, "auto_texspace") - sub.itemL(text="Textures:") - sub.itemR(curve, "uv_orco") - sub.itemR(curve, "auto_texspace") - - sub = split.column() - sub.itemL(text="Resolution:") + col = split.column() + col.itemL(text="Resolution:") + sub = col.column(align=True) sub.itemR(curve, "resolution_u", text="Preview U") - sub.itemR(curve, "resolution_v", text="Preview V") sub.itemR(curve, "render_resolution_u", text="Render U") + sub = col.column(align=True) + sub.itemR(curve, "resolution_v", text="Preview V") sub.itemR(curve, "render_resolution_v", text="Render V") - - sub.itemL(text="Display:") - sub.itemR(curve, "fast") + col.itemL(text="Display:") + col.itemR(curve, "fast") class DATA_PT_geometry_text(DataButtonsPanel): - __idname__ = "DATA_PT_geometry_text" __label__ = "Geometry" def draw(self, context): layout = self.layout + curve = context.curve split = layout.split() - sub = split.column() - sub.itemL(text="Modification:") - sub.itemR(curve, "width") - sub.itemR(curve, "extrude") - sub.itemR(curve, "taper_object") + col = split.column() + col.itemL(text="Modification:") + col.itemR(curve, "width") + col.itemR(curve, "extrude") + col.itemR(curve, "taper_object") - sub = split.column() - sub.itemL(text="Bevel:") - sub.itemR(curve, "bevel_depth", text="Depth") - sub.itemR(curve, "bevel_resolution", text="Resolution") - sub.itemR(curve, "bevel_object") + col = split.column() + col.itemL(text="Bevel:") + col.itemR(curve, "bevel_depth", text="Depth") + col.itemR(curve, "bevel_resolution", text="Resolution") + col.itemR(curve, "bevel_object") class DATA_PT_font(DataButtonsPanel): - __idname__ = "DATA_PT_font" __label__ = "Font" def draw(self, context): layout = self.layout + text = context.curve - layout.row() layout.itemR(text, "font") split = layout.split() - sub = split.column() - # sub.itemR(text, "style") - # sub.itemR(text, "bold") - # sub.itemR(text, "italic") - # sub.itemR(text, "underline") + col = split.column() + # col.itemR(text, "style") + # col.itemR(text, "bold") + # col.itemR(text, "italic") + # col.itemR(text, "underline") # ToDo: These settings are in a sub struct (Edit Format). - sub.itemR(text, "text_size") - sub.itemR(text, "shear") - - sub = split.column() - sub.itemR(text, "text_on_curve") - sub.itemR(text, "family") - sub.itemL(text="Underline:") - sub.itemR(text, "ul_position", text="Position") - sub.itemR(text, "ul_height", text="Height") + col.itemR(text, "text_size") + col.itemR(text, "shear") - # sub.itemR(text, "edit_format") + col = split.column() + col.itemR(text, "text_on_curve") + col.itemR(text, "family") + col.itemL(text="Underline:") + col.itemR(text, "ul_position", text="Position") + col.itemR(text, "ul_height", text="Height") + # col.itemR(text, "edit_format") class DATA_PT_paragraph(DataButtonsPanel): - __idname__ = "DATA_PT_paragraph" __label__ = "Paragraph" def draw(self, context): layout = self.layout + text = context.curve layout.itemL(text="Align:") @@ -130,25 +126,25 @@ class DATA_PT_paragraph(DataButtonsPanel): split = layout.split() - sub = split.column() - sub.itemL(text="Spacing:") - sub.itemR(text, "spacing", text="Character") - sub.itemR(text, "word_spacing", text="Word") - sub.itemR(text, "line_dist", text="Line") - - sub = split.column() - sub.itemL(text="Offset:") - sub.itemR(text, "x_offset", text="X") - sub.itemR(text, "y_offset", text="Y") - #sub.itemR(text, "wrap") + col = split.column(align=True) + col.itemL(text="Spacing:") + col.itemR(text, "spacing", text="Character") + col.itemR(text, "word_spacing", text="Word") + col.itemR(text, "line_dist", text="Line") + + col = split.column(align=True) + col.itemL(text="Offset:") + col.itemR(text, "x_offset", text="X") + col.itemR(text, "y_offset", text="Y") + #col.itemR(text, "wrap") """ class DATA_PT_textboxes(DataButtonsPanel): - __idname__ = "DATA_PT_textboxes" __label__ = "Text Boxes" def draw(self, context): layout = self.layout + text = context.curve """ @@ -158,4 +154,3 @@ bpy.types.register(DATA_PT_geometry_text) bpy.types.register(DATA_PT_font) bpy.types.register(DATA_PT_paragraph) #bpy.types.register(DATA_PT_textboxes) - diff --git a/release/ui/buttons_game.py b/release/ui/buttons_game.py index 356b7913217..9635ecfa67c 100644 --- a/release/ui/buttons_game.py +++ b/release/ui/buttons_game.py @@ -1,110 +1,93 @@ import bpy -class GameButtonsPanel(bpy.types.Panel): +class PhysicsButtonsPanel(bpy.types.Panel): __space_type__ = "BUTTONS_WINDOW" __region_type__ = "WINDOW" - __context__ = "game" - -class GAME_PT_context_game(GameButtonsPanel): - __idname__ = "GAME_PT_context_game" - __no_header__ = True - - def draw(self, context): - layout = self.layout - ob = context.object - game = context.game - - split = layout.split(percentage=0.06) - split.itemL(text="", icon="ICON_GAME") - split.itemR(game, "name", text="") - -class GAME_PT_data(GameButtonsPanel): - __idname__ = "GAME_PT_data" - __label__ = "Data" - - def draw(self, context): - layout = self.layout - ob = context.object - game = context.game - -class GAME_PT_physics(GameButtonsPanel): - __idname__ = "GAME_PT_physics" - __label__ = "Physics" + __context__ = "physics" def poll(self, context): ob = context.active_object - return ob and ob.game + rd = context.scene.render_data + return ob and ob.game and (rd.engine == 'BLENDER_GAME') + +class PHYSICS_PT_game_physics(PhysicsButtonsPanel): + __label__ = "Physics" def draw(self, context): layout = self.layout - ob = context.active_object + ob = context.active_object game = ob.game layout.itemR(game, "physics_type") layout.itemS() split = layout.split() - col = split.column() + col = split.column() col.itemR(game, "actor") - col.itemR(game, "ghost") col.itemR(ob, "restrict_render", text="Invisible") # out of place but useful + col = split.column() col.itemR(game, "do_fh", text="Use Material Physics") col.itemR(game, "rotation_fh", text="Rotate From Normal") + col.itemR(game, "no_sleeping") layout.itemS() + split = layout.split() + col = split.column() - - col.itemR(game, "mass") - col.itemR(game, "radius") - col.itemR(game, "no_sleeping") - col.itemR(game, "form_factor") + col.itemL(text="Attributes:") + sub = col.column(align=True) + sub.itemR(game, "mass") + sub.itemR(game, "radius") + sub.itemR(game, "form_factor") + col.itemS() + col.itemL(text="Damping:") - col.itemR(game, "damping", text="Translation", slider=True) - col.itemR(game, "rotation_damping", text="Rotation", slider=True) + sub = col.column(align=True) + sub.itemR(game, "damping", text="Translation", slider=True) + sub.itemR(game, "rotation_damping", text="Rotation", slider=True) col = split.column() - col.itemL(text="Velocity:") - col.itemR(game, "minimum_velocity", text="Minimum") - col.itemR(game, "maximum_velocity", text="Maximum") + sub = col.column(align=True) + sub.itemR(game, "minimum_velocity", text="Minimum") + sub.itemR(game, "maximum_velocity", text="Maximum") + col.itemS() - col.itemR(game, "anisotropic_friction") - colsub = col.column() - colsub.active = game.anisotropic_friction - colsub.itemR(game, "friction_coefficients", text="", slider=True) + col.itemR(game, "anisotropic_friction") + sub = col.column() + sub.active = game.anisotropic_friction + sub.itemR(game, "friction_coefficients", text="", slider=True) layout.itemS() + split = layout.split() - sub = split.column() - sub.itemL(text="Lock Translation:") - sub.itemR(game, "lock_x_axis", text="X") - sub.itemR(game, "lock_y_axis", text="Y") - sub.itemR(game, "lock_z_axis", text="Z") - sub = split.column() - sub.itemL(text="Lock Rotation:") - sub.itemR(game, "lock_x_rot_axis", text="X") - sub.itemR(game, "lock_y_rot_axis", text="Y") - sub.itemR(game, "lock_z_rot_axis", text="Z") - - -class GAME_PT_collision_bounds(GameButtonsPanel): - __idname__ = "GAME_PT_collision_bounds" + + col = split.column() + col.itemL(text="Lock Translation:") + col.itemR(game, "lock_x_axis", text="X") + col.itemR(game, "lock_y_axis", text="Y") + col.itemR(game, "lock_z_axis", text="Z") + + col = split.column() + col.itemL(text="Lock Rotation:") + col.itemR(game, "lock_x_rot_axis", text="X") + col.itemR(game, "lock_y_rot_axis", text="Y") + col.itemR(game, "lock_z_rot_axis", text="Z") + +class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel): __label__ = "Collision Bounds" - def poll(self, context): - ob = context.active_object - return ob and ob.game - def draw_header(self, context): layout = self.layout + ob = context.active_object game = ob.game @@ -116,14 +99,219 @@ class GAME_PT_collision_bounds(GameButtonsPanel): ob = context.scene.objects[0] game = ob.game + layout.active = game.use_collision_bounds + layout.itemR(game, "collision_bounds", text="Bounds") + + row = layout.row() + row.itemR(game, "collision_compound", text="Compound") + row.itemR(game, "collision_margin", text="Margin", slider=True) + +bpy.types.register(PHYSICS_PT_game_physics) +bpy.types.register(PHYSICS_PT_game_collision_bounds) + +class SceneButtonsPanel(bpy.types.Panel): + __space_type__ = "BUTTONS_WINDOW" + __region_type__ = "WINDOW" + __context__ = "scene" + + def poll(self, context): + rd = context.scene.render_data + return (rd.engine == 'BLENDER_GAME') + +class SCENE_PT_game(SceneButtonsPanel): + __label__ = "Game" + + def draw(self, context): + layout = self.layout + + rd = context.scene.render_data + + row = layout.row() + row.itemO("view3d.game_start", text="Start") + row.itemL() + +class SCENE_PT_game_player(SceneButtonsPanel): + __label__ = "Player" + + def draw(self, context): + layout = self.layout + + gs = context.scene.game_data + + layout.itemR(gs, "fullscreen") + + split = layout.split() + + col = split.column() + col.itemL(text="Resolution:") + sub = col.column(align=True) + sub.itemR(gs, "resolution_x", slider=False, text="X") + sub.itemR(gs, "resolution_y", slider=False, text="Y") + + col = split.column() + col.itemL(text="Quality:") + sub = col.column(align=True) + sub.itemR(gs, "depth", text="Bit Depth", slider=False) + sub.itemR(gs, "frequency", text="FPS", slider=False) + + # framing: + col = layout.column() + col.itemL(text="Framing:") + col.row().itemR(gs, "framing_type", expand=True) + sub = col.column() + sub.itemR(gs, "framing_color", text="") + +class SCENE_PT_game_stereo(SceneButtonsPanel): + __label__ = "Stereo" + + def draw(self, context): + layout = self.layout + + gs = context.scene.game_data + stereo_mode = gs.stereo + + # stereo options: + layout.itemR(gs, "stereo", expand=True) + + # stereo: + if stereo_mode == 'STEREO': + layout.itemR(gs, "stereo_mode") + + # dome: + if stereo_mode == 'DOME': + layout.itemR(gs, "dome_mode", text="Dome Type") + + split=layout.split() + + col=split.column() + col.itemR(gs, "dome_angle", slider=True) + col.itemR(gs, "dome_tesselation", text="Tesselation") + + col=split.column() + col.itemR(gs, "dome_tilt") + col.itemR(gs, "dome_buffer_resolution", text="Resolution", slider=True) + + layout.itemR(gs, "dome_text") + +bpy.types.register(SCENE_PT_game) +bpy.types.register(SCENE_PT_game_player) +bpy.types.register(SCENE_PT_game_stereo) + +class WorldButtonsPanel(bpy.types.Panel): + __space_type__ = "BUTTONS_WINDOW" + __region_type__ = "WINDOW" + __context__ = "world" + + def poll(self, context): + rd = context.scene.render_data + return (rd.engine == 'BLENDER_GAME') + +class WORLD_PT_game_context_world(WorldButtonsPanel): + __show_header__ = False + + def poll(self, context): + rd = context.scene.render_data + return (context.scene) and (rd.use_game_engine) + + def draw(self, context): + layout = self.layout + + scene = context.scene + world = context.world + space = context.space_data + + split = layout.split(percentage=0.65) + + if scene: + split.template_ID(scene, "world", new="world.new") + elif world: + split.template_ID(space, "pin_id") + +class WORLD_PT_game_world(WorldButtonsPanel): + __label__ = "World" + + def draw(self, context): + layout = self.layout + + world = context.world + + row = layout.row() + row.column().itemR(world, "horizon_color") + row.column().itemR(world, "ambient_color") + + layout.itemR(world.mist, "enabled", text="Mist") + + row = layout.column_flow() + row.active = world.mist.enabled + row.itemR(world.mist, "start") + row.itemR(world.mist, "depth") + + +""" +class WORLD_PT_game(WorldButtonsPanel): + __space_type__ = "LOGIC_EDITOR" + __region_type__ = "UI" + __label__ = "Game Settings" + + def draw(self, context): + layout = self.layout + world = context.world + flow = layout.column_flow() - flow.active = game.use_collision_bounds - flow.itemR(game, "collision_bounds") - flow.itemR(game, "collision_compound") - flow.itemR(game, "collision_margin") + flow.itemR(world, "physics_engine") + flow.itemR(world, "physics_gravity") + + flow.itemR(world, "game_fps") + flow.itemR(world, "game_logic_step_max") + flow.itemR(world, "game_physics_substep") + flow.itemR(world, "game_physics_step_max") + + flow.itemR(world, "game_use_occlusion_culling", text="Enable Occlusion Culling") + flow.itemR(world, "game_occlusion_culling_resolution") +""" + +class WORLD_PT_game_physics(WorldButtonsPanel): + __label__ = "Physics" + + def draw(self, context): + layout = self.layout + + gs = context.scene.game_data + + layout.itemR(gs, "physics_engine") + if gs.physics_engine != "NONE": + layout.itemR(gs, "physics_gravity", text="Gravity") + + split = layout.split() + + col = split.column() + col.itemL(text="Physics Steps:") + sub = col.column(align=True) + sub.itemR(gs, "physics_step_max", text="Max") + sub.itemR(gs, "physics_step_sub", text="Substeps") + col.itemR(gs, "fps", text="FPS") + + col = split.column() + col.itemL(text="Logic Steps:") + col.itemR(gs, "logic_step_max", text="Max") + + col = layout.column() + col.itemR(gs, "use_occlusion_culling", text="Occlusion Culling") + sub = col.column() + sub.active = gs.use_occlusion_culling + sub.itemR(gs, "occlusion_culling_resolution", text="Resolution") + else: + split = layout.split() + + col = split.column() + col.itemL(text="Physics Steps:") + col.itemR(gs, "fps", text="FPS") + + col = split.column() + col.itemL(text="Logic Steps:") + col.itemR(gs, "logic_step_max", text="Max") -bpy.types.register(GAME_PT_context_game) -bpy.types.register(GAME_PT_data) -bpy.types.register(GAME_PT_physics) -bpy.types.register(GAME_PT_collision_bounds)
\ No newline at end of file +bpy.types.register(WORLD_PT_game_context_world) +bpy.types.register(WORLD_PT_game_world) +bpy.types.register(WORLD_PT_game_physics) diff --git a/release/ui/buttons_material.py b/release/ui/buttons_material.py index ceb492b198e..b570deebfe2 100644 --- a/release/ui/buttons_material.py +++ b/release/ui/buttons_material.py @@ -1,30 +1,41 @@ import bpy +# If python version is less than 2.4, try to get set stuff from module +try: + set +except: + from sets import Set as set + class MaterialButtonsPanel(bpy.types.Panel): __space_type__ = "BUTTONS_WINDOW" __region_type__ = "WINDOW" __context__ = "material" + # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here def poll(self, context): - return (context.material != None) + return (context.material) and (context.scene.render_data.engine in self.COMPAT_ENGINES) class MATERIAL_PT_preview(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_preview" __label__ = "Preview" + COMPAT_ENGINES = set(['BLENDER_RENDER', 'BLENDER_GAME']) def draw(self, context): layout = self.layout + mat = context.material layout.template_preview(mat) class MATERIAL_PT_context_material(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_context_material" - __no_header__ = True + __show_header__ = False + COMPAT_ENGINES = set(['BLENDER_RENDER', 'BLENDER_GAME']) def poll(self, context): - return (context.object) + # An exception, dont call the parent poll func because + # this manages materials for all engine types + + return (context.object) and (context.scene.render_data.engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -45,17 +56,19 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel): if context.edit_object: row = layout.row(align=True) - row.itemO("object.material_slot_assign", text="Assign") row.itemO("object.material_slot_select", text="Select") row.itemO("object.material_slot_deselect", text="Deselect") split = layout.split(percentage=0.65) - if ob and slot: - split.template_ID(slot, "material", new="material.new") + if ob: + split.template_ID(ob, "active_material", new="material.new") row = split.row() - row.itemR(slot, "link", expand=True) + if slot: + row.itemR(slot, "link", expand=True) + else: + row.itemL() elif mat: split.template_ID(space, "pin_id") split.itemS() @@ -63,6 +76,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel): class MATERIAL_PT_material(MaterialButtonsPanel): __idname__= "MATERIAL_PT_material" __label__ = "Shading" + COMPAT_ENGINES = set(['BLENDER_RENDER', 'BLENDER_GAME']) def draw(self, context): layout = self.layout @@ -74,225 +88,230 @@ class MATERIAL_PT_material(MaterialButtonsPanel): if mat: layout.itemR(mat, "type", expand=True) - - -# row = layout.row() - - if mat.type == 'SURFACE': + if mat.type in ('SURFACE', 'WIRE', 'VOLUME'): split = layout.split() - sub = split.column() - sub.itemR(mat, "alpha", slider=True) - sub.itemR(mat, "ambient", slider=True) - sub.itemR(mat, "emit") - sub.itemR(mat, "translucency", slider=True) + col = split.column() + col.itemR(mat, "alpha", slider=True) + col.itemR(mat, "ambient", slider=True) + col.itemR(mat, "emit") + col.itemR(mat, "translucency", slider=True) - sub = split.column() - sub.itemR(mat, "shadeless") - sub.itemR(mat, "wireframe") - sub.itemR(mat, "tangent_shading") - sub.itemR(mat, "cubic", slider=True) - elif mat.type == 'VOLUME': - split = layout.split() - - sub = split.column() - sub.itemR(mat, "alpha", slider=True) - sub.itemR(mat, "ambient", slider=True) - sub.itemR(mat, "emit") - sub.itemR(mat, "translucency", slider=True) + col = split.column() + col.itemR(mat, "z_transparency") + col.itemR(mat, "shadeless") + col.itemR(mat, "tangent_shading") + col.itemR(mat, "cubic", slider=True) - sub = split.column() - sub.itemR(mat, "shadeless") - sub.itemR(mat, "wireframe") - sub.itemR(mat, "tangent_shading") - sub.itemR(mat, "cubic", slider=True) elif mat.type == 'HALO': layout.itemR(mat, "alpha", slider=True) - class MATERIAL_PT_strand(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_strand" __label__ = "Strand" __default_closed__ = True + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw(self, context): layout = self.layout - tan = context.material.strand + mat = context.material + tan = mat.strand split = layout.split() - sub = split.column() - sub.itemL(text="Size:") - sub.itemR(tan, "start_size", text="Root") - sub.itemR(tan, "end_size", text="Tip") - sub.itemR(tan, "min_size", text="Minimum") - sub.itemR(tan, "blender_units") - colsub = sub.column() - colsub.active = mat.shadeless== False - colsub.itemR(tan, "tangent_shading") - - sub = split.column() - sub.itemR(tan, "shape") - sub.itemR(tan, "width_fade") - sub.itemR(tan, "uv_layer") - colsub = sub.column() - colsub.active = mat.shadeless== False - colsub.itemR(tan, "surface_diffuse") - colsubsub = colsub.column() - colsubsub.active = tan.surface_diffuse - colsubsub.itemR(tan, "blend_distance", text="Distance") + col = split.column() + col.itemL(text="Size:") + col.itemR(tan, "start_size", text="Root") + col.itemR(tan, "end_size", text="Tip") + col.itemR(tan, "min_size", text="Minimum") + col.itemR(tan, "blender_units") + sub = col.column() + sub.active = mat.shadeless == False + sub.itemR(tan, "tangent_shading") + + col = split.column() + col.itemR(tan, "shape") + col.itemR(tan, "width_fade") + col.itemR(tan, "uv_layer") + sub = col.column() + sub.active = mat.shadeless == False + sub.itemR(tan, "surface_diffuse") + sub = col.column() + sub.active = tan.surface_diffuse + sub.itemR(tan, "blend_distance", text="Distance") class MATERIAL_PT_options(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_options" __label__ = "Options" + COMPAT_ENGINES = set(['BLENDER_RENDER', 'BLENDER_GAME']) def draw(self, context): layout = self.layout + mat = context.material split = layout.split() - sub = split.column() - sub.itemR(mat, "traceable") - sub.itemR(mat, "full_oversampling") - sub.itemR(mat, "sky") - sub.itemR(mat, "exclude_mist") - sub = split.column() - sub.itemR(mat, "face_texture") - colsub = sub.column() - colsub.active = mat.face_texture - colsub.itemR(mat, "face_texture_alpha") - sub.itemR(mat, "invert_z") - sub.itemR(mat, "light_group") - sub.itemR(mat, "light_group_exclusive") - - + col = split.column() + col.itemR(mat, "traceable") + col.itemR(mat, "full_oversampling") + col.itemR(mat, "sky") + col.itemR(mat, "exclude_mist") + col.itemR(mat, "invert_z") + sub = col.column(align=True) + sub.itemL(text="Light Group:") + sub.itemR(mat, "light_group", text="") + row = sub.row() + row.active = mat.light_group + row.itemR(mat, "light_group_exclusive", text="Exclusive") + col = split.column() + col.itemR(mat, "face_texture") + sub = col.column() + sub.active = mat.face_texture + sub.itemR(mat, "face_texture_alpha") + col.itemS() + col.itemR(mat, "vertex_color_paint") + col.itemR(mat, "vertex_color_light") + col.itemR(mat, "object_color") class MATERIAL_PT_shadows(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_shadows" __label__ = "Shadows" + COMPAT_ENGINES = set(['BLENDER_RENDER', 'BLENDER_GAME']) def draw(self, context): layout = self.layout + mat = context.material split = layout.split() - sub = split.column() - sub.itemR(mat, "shadows", text="Receive") - sub.itemR(mat, "transparent_shadows", text="Receive Transparent") - sub.itemR(mat, "only_shadow", text="Shadows Only") - sub.itemR(mat, "cast_shadows_only", text="Cast Only") - sub.itemR(mat, "shadow_casting_alpha", text="Casting Alpha", slider=True) - sub = split.column() - sub.itemR(mat, "ray_shadow_bias", text="Auto Ray Bias") - colsub = sub.column() - colsub.active = not mat.ray_shadow_bias - colsub.itemR(mat, "shadow_ray_bias", text="Ray Shadow Bias") + col = split.column() + col.itemR(mat, "shadows", text="Receive") + col.itemR(mat, "transparent_shadows", text="Receive Transparent") + col.itemR(mat, "only_shadow", text="Shadows Only") + col.itemR(mat, "cast_shadows_only", text="Cast Only") + col.itemR(mat, "shadow_casting_alpha", text="Casting Alpha", slider=True) + + col = split.column() + col.itemR(mat, "ray_shadow_bias", text="Auto Ray Bias") + sub = col.column() + subsub = sub.column() + subsub.active = not mat.ray_shadow_bias + subsub.itemR(mat, "shadow_ray_bias", text="Ray Shadow Bias") sub.itemR(mat, "cast_buffer_shadows") sub.itemR(mat, "shadow_buffer_bias", text="Buffer Bias") - class MATERIAL_PT_diffuse(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_diffuse" __label__ = "Diffuse" + COMPAT_ENGINES = set(['BLENDER_RENDER', 'BLENDER_GAME']) def poll(self, context): - mat = context.material - return (mat and mat.type != "HALO") + return (context.material.type != 'HALO') and (context.scene.render_data.engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout + mat = context.material split = layout.split() - sub = split.column() - sub.itemR(mat, "diffuse_color", text="") - sub.itemR(mat, "vertex_color_paint") - sub.itemR(mat, "vertex_color_light") - - sub = split.column() + col = split.column() + col.itemR(mat, "diffuse_color", text="") + sub = col.column() sub.active = mat.shadeless== False sub.itemR(mat, "diffuse_reflection", text="Intensity", slider=True) - sub.itemR(mat, "object_color") - - - row = layout.row() - row.active = mat.shadeless== False - row.itemR(mat, "diffuse_shader", text="Shader") + col = split.column() + col.active = mat.shadeless== False + col.itemR(mat, "diffuse_shader", text="") + col.itemR(mat, "use_diffuse_ramp", text="Ramp") - split = layout.split() - split.active = mat.shadeless== False - sub = split.column() + col = layout.column() + col.active = mat.shadeless== False if mat.diffuse_shader == 'OREN_NAYAR': - sub.itemR(mat, "roughness") - if mat.diffuse_shader == 'MINNAERT': - sub.itemR(mat, "darkness") - if mat.diffuse_shader == 'TOON': - sub.itemR(mat, "diffuse_toon_size", text="Size") - sub = split.column() - sub.itemR(mat, "diffuse_toon_smooth", text="Smooth") - if mat.diffuse_shader == 'FRESNEL': - sub.itemR(mat, "diffuse_fresnel", text="Fresnel") - sub = split.column() - sub.itemR(mat, "diffuse_fresnel_factor", text="Factor") - - layout.itemR(mat, "diffuse_ramp", text="Ramp") - + col.itemR(mat, "roughness") + elif mat.diffuse_shader == 'MINNAERT': + col.itemR(mat, "darkness") + elif mat.diffuse_shader == 'TOON': + row = col.row() + row.itemR(mat, "diffuse_toon_size", text="Size") + row.itemR(mat, "diffuse_toon_smooth", text="Smooth", slider=True) + elif mat.diffuse_shader == 'FRESNEL': + row = col.row() + row.itemR(mat, "diffuse_fresnel", text="Fresnel") + row.itemR(mat, "diffuse_fresnel_factor", text="Factor") + + if mat.use_diffuse_ramp: + layout.itemS() + layout.template_color_ramp(mat.diffuse_ramp, expand=True) + layout.itemS() + row = layout.row() + split = row.split(percentage=0.3) + split.itemL(text="Input:") + split.itemR(mat, "diffuse_ramp_input", text="") + split = row.split(percentage=0.3) + split.itemL(text="Blend:") + split.itemR(mat, "diffuse_ramp_blend", text="") + + class MATERIAL_PT_specular(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_specular" __label__ = "Specular" + COMPAT_ENGINES = set(['BLENDER_RENDER', 'BLENDER_GAME']) def poll(self, context): - mat = context.material - return (mat and mat.type != "HALO") + return (context.material.type != 'HALO') and (context.scene.render_data.engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout - mat = context.material - - layout.active = mat.shadeless== False - split = layout.split() - - sub = split.column() - sub.itemR(mat, "specular_color", text="") - sub = split.column() - sub.itemR(mat, "specular_reflection", text="Intensity", slider=True) + mat = context.material - layout.itemR(mat, "spec_shader", text="Shader") + layout.active = mat.shadeless == False split = layout.split() - sub = split.column() - if mat.spec_shader in ('COOKTORR', 'PHONG'): - sub.itemR(mat, "specular_hardness", text="Hardness") - if mat.spec_shader == 'BLINN': - sub.itemR(mat, "specular_hardness", text="Hardness") - sub = split.column() - sub.itemR(mat, "specular_ior", text="IOR") - if mat.spec_shader == 'WARDISO': - sub.itemR(mat, "specular_slope", text="Slope") - if mat.spec_shader == 'TOON': - sub.itemR(mat, "specular_toon_size", text="Size") - sub = split.column() - sub.itemR(mat, "specular_toon_smooth", text="Smooth") - - layout.itemR(mat, "specular_ramp", text="Ramp") + col = split.column() + col.itemR(mat, "specular_color", text="") + col.itemR(mat, "specular_reflection", text="Intensity", slider=True) + col = split.column() + col.itemR(mat, "specular_shader", text="") + col.itemR(mat, "use_specular_ramp", text="Ramp") + + col = layout.column() + if mat.specular_shader in ('COOKTORR', 'PHONG'): + col.itemR(mat, "specular_hardness", text="Hardness") + elif mat.specular_shader == 'BLINN': + row = col.row() + row.itemR(mat, "specular_hardness", text="Hardness") + row.itemR(mat, "specular_ior", text="IOR") + elif mat.specular_shader == 'WARDISO': + col.itemR(mat, "specular_slope", text="Slope") + elif mat.specular_shader == 'TOON': + row = col.row() + row.itemR(mat, "specular_toon_size", text="Size") + row.itemR(mat, "specular_toon_smooth", text="Smooth", slider=True) + + if mat.use_specular_ramp: + layout.itemS() + layout.template_color_ramp(mat.specular_ramp, expand=True) + layout.itemS() + row = layout.row() + split = row.split(percentage=0.3) + split.itemL(text="Input:") + split.itemR(mat, "specular_ramp_input", text="") + split = row.split(percentage=0.3) + split.itemL(text="Blend:") + split.itemR(mat, "specular_ramp_blend", text="") + class MATERIAL_PT_sss(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_sss" __label__ = "Subsurface Scattering" __default_closed__ = True + COMPAT_ENGINES = set(['BLENDER_RENDER']) def poll(self, context): - mat = context.material - return (mat and mat.type == "SURFACE") + return (context.material.type in ('SURFACE', 'WIRE')) and (context.scene.render_data.engine in self.COMPAT_ENGINES) def draw_header(self, context): layout = self.layout @@ -302,124 +321,140 @@ class MATERIAL_PT_sss(MaterialButtonsPanel): def draw(self, context): layout = self.layout - sss = context.material.subsurface_scattering + mat = context.material + sss = context.material.subsurface_scattering + layout.active = sss.enabled split = layout.split() split.active = mat.shadeless== False - sub = split.column() - sub.itemR(sss, "color", text="") - sub.itemL(text="Blend:") - sub.itemR(sss, "color_factor", slider=True) - sub.itemR(sss, "texture_factor", slider=True) - sub.itemL(text="Scattering Weight:") - sub.itemR(sss, "front") - sub.itemR(sss, "back") + col = split.column(align=True) + col.itemR(sss, "color", text="") + col.itemL(text="Blend:") + col.itemR(sss, "color_factor", text="Color", slider=True) + col.itemR(sss, "texture_factor", text="Texture", slider=True) + col.itemL(text="Scattering Weight:") + col.itemR(sss, "front") + col.itemR(sss, "back") - sub = split.column() + col = split.column() + sub = col.column(align=True) sub.itemR(sss, "ior") sub.itemR(sss, "scale") - sub.itemR(sss, "radius", text="RGB Radius") - sub.itemR(sss, "error_tolerance") + col.itemR(sss, "radius", text="RGB Radius") + col.itemR(sss, "error_tolerance") class MATERIAL_PT_raymir(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_raymir" __label__ = "Ray Mirror" __default_closed__ = True + COMPAT_ENGINES = set(['BLENDER_RENDER']) def poll(self, context): - mat = context.material - return (mat and mat.type == "SURFACE") + return (context.material.type in 'SURFACE', 'WIRE') and (context.scene.render_data.engine in self.COMPAT_ENGINES) def draw_header(self, context): layout = self.layout + raym = context.material.raytrace_mirror layout.itemR(raym, "enabled", text="") def draw(self, context): layout = self.layout - raym = context.material.raytrace_mirror + mat = context.material + raym = context.material.raytrace_mirror layout.active = raym.enabled split = layout.split() - sub = split.column() - sub.itemR(raym, "reflect", text="Reflectivity", slider=True) - sub.itemR(mat, "mirror_color", text="") - sub.itemR(raym, "fresnel") - sub.itemR(raym, "fresnel_fac", text="Fac", slider=True) - - sub = split.column() - sub.itemR(raym, "gloss", slider=True) - colsub = sub.column() - colsub.active = raym.gloss < 1 - colsub.itemR(raym, "gloss_threshold", slider=True, text="Threshold") - colsub.itemR(raym, "gloss_samples", text="Samples") - colsub.itemR(raym, "gloss_anisotropic", slider=True, text="Anisotropic") + col = split.column() + col.itemR(raym, "reflect", text="Reflectivity", slider=True) + col.itemR(mat, "mirror_color", text="") + col.itemL(text="Fresnel:") + col.itemR(raym, "fresnel", text="Amount") + sub = col.column() + sub.active = raym.fresnel > 0 + sub.itemR(raym, "fresnel_fac", text="Blend", slider=True) + col.itemS() + col.itemS() + sub = col.split(percentage=0.4) + sub.itemL(text="Fade To:") + sub.itemR(raym, "fade_to", text="") - row = layout.row() - row.itemR(raym, "distance", text="Max Dist") - row.itemR(raym, "depth") + col = split.column() + col.itemR(raym, "depth") + col.itemR(raym, "distance", text="Max Dist") + col.itemL(text="Gloss:") + col.itemR(raym, "gloss", text="Amount", slider=True) + sub = col.column() + sub.active = raym.gloss < 1 + sub.itemR(raym, "gloss_threshold", slider=True, text="Threshold") + sub.itemR(raym, "gloss_samples", text="Samples") + sub.itemR(raym, "gloss_anisotropic", slider=True, text="Anisotropic") - layout.itemR(raym, "fade_to") class MATERIAL_PT_raytransp(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_raytransp" __label__= "Ray Transparency" __default_closed__ = True + COMPAT_ENGINES = set(['BLENDER_RENDER']) def poll(self, context): - mat = context.material - return (mat and mat.type == "SURFACE") + return (context.material.type in 'SURFACE', 'WIRE') and (context.scene.render_data.engine in self.COMPAT_ENGINES) def draw_header(self, context): layout = self.layout + rayt = context.material.raytrace_transparency layout.itemR(rayt, "enabled", text="") def draw(self, context): layout = self.layout - rayt = context.material.raytrace_transparency + mat = context.material + rayt = context.material.raytrace_transparency - layout.active = rayt.enabled + layout.active = rayt.enabled and mat.shadeless == False split = layout.split() - split.active = mat.shadeless== False - sub = split.column() - sub.itemR(rayt, "ior") - sub.itemR(rayt, "fresnel") - sub.itemR(rayt, "fresnel_fac", text="Fac", slider=True) - - sub = split.column() - sub.itemR(rayt, "gloss", slider=True) - colsub = sub.column() - colsub.active = rayt.gloss < 1 - colsub.itemR(rayt, "gloss_threshold", slider=True, text="Threshold") - colsub.itemR(rayt, "gloss_samples", text="Samples") - - flow = layout.column_flow() - flow.active = mat.shadeless== False - flow.itemR(rayt, "filter", slider=True) - flow.itemR(rayt, "limit") - flow.itemR(rayt, "falloff") - flow.itemR(rayt, "specular_opacity", slider=True, text="Spec Opacity") - flow.itemR(rayt, "depth") + col = split.column() + col.itemR(rayt, "ior") + col.itemR(rayt, "falloff") + col.itemR(rayt, "limit") + + col = split.column() + col.itemR(rayt, "depth") + col.itemR(rayt, "filter", slider=True) + col.itemR(rayt, "specular_opacity", slider=True, text="Spec Opacity") + + split = layout.split() + + col = split.column() + col.itemL(text="Fresnel:") + col.itemR(rayt, "fresnel", text="Amount") + sub = col.column() + sub.active = rayt.fresnel > 0 + sub.itemR(rayt, "fresnel_fac", text="Blend", slider=True) + + col = split.column() + col.itemL(text="Gloss:") + col.itemR(rayt, "gloss", text="Amount", slider=True) + sub = col.column() + sub.active = rayt.gloss < 1 + sub.itemR(rayt, "gloss_threshold", slider=True, text="Threshold") + sub.itemR(rayt, "gloss_samples", text="Samples") class MATERIAL_PT_halo(MaterialButtonsPanel): - __idname__= "MATERIAL_PT_halo" __label__= "Halo" + COMPAT_ENGINES = set(['BLENDER_RENDER']) def poll(self, context): - mat = context.material - return (mat and mat.type == "HALO") + return (context.material.type == 'HALO') and (context.scene.render_data.engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -434,7 +469,6 @@ class MATERIAL_PT_halo(MaterialButtonsPanel): col.itemR(halo, "size") col.itemR(halo, "hardness") col.itemR(halo, "add", slider=True) - col.itemL(text="Options:") col.itemR(halo, "use_texture", text="Texture") col.itemR(halo, "use_vertex_normal", text="Vertex Normal") @@ -443,30 +477,28 @@ class MATERIAL_PT_halo(MaterialButtonsPanel): col.itemR(halo, "soft") col = split.column() - col = col.column() col.itemR(halo, "ring") - colsub = col.column() - colsub.active = halo.ring - colsub.itemR(halo, "rings") - colsub.itemR(mat, "mirror_color", text="") + sub = col.column() + sub.active = halo.ring + sub.itemR(halo, "rings") + sub.itemR(mat, "mirror_color", text="") col.itemR(halo, "lines") - colsub = col.column() - colsub.active = halo.lines - colsub.itemR(halo, "line_number", text="Lines") - colsub.itemR(mat, "specular_color", text="") + sub = col.column() + sub.active = halo.lines + sub.itemR(halo, "line_number", text="Lines") + sub.itemR(mat, "specular_color", text="") col.itemR(halo, "star") - colsub = col.column() - colsub.active = halo.star - colsub.itemR(halo, "star_tips") + sub = col.column() + sub.active = halo.star + sub.itemR(halo, "star_tips") col.itemR(halo, "flare_mode") - colsub = col.column() - colsub.active = halo.flare_mode - colsub.itemR(halo, "flare_size", text="Size") - colsub.itemR(halo, "flare_subsize", text="Subsize") - colsub.itemR(halo, "flare_boost", text="Boost") - colsub.itemR(halo, "flare_seed", text="Seed") - colsub.itemR(halo, "flares_sub", text="Sub") - + sub = col.column() + sub.active = halo.flare_mode + sub.itemR(halo, "flare_size", text="Size") + sub.itemR(halo, "flare_subsize", text="Subsize") + sub.itemR(halo, "flare_boost", text="Boost") + sub.itemR(halo, "flare_seed", text="Seed") + sub.itemR(halo, "flares_sub", text="Sub") bpy.types.register(MATERIAL_PT_context_material) bpy.types.register(MATERIAL_PT_preview) diff --git a/release/ui/buttons_objects.py b/release/ui/buttons_object.py index 27ce093af6d..d59ed604c55 100644 --- a/release/ui/buttons_objects.py +++ b/release/ui/buttons_object.py @@ -7,11 +7,11 @@ class ObjectButtonsPanel(bpy.types.Panel): __context__ = "object" class OBJECT_PT_context_object(ObjectButtonsPanel): - __idname__ = "OBJECT_PT_context_object" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout + ob = context.object row = layout.row() @@ -19,11 +19,11 @@ class OBJECT_PT_context_object(ObjectButtonsPanel): row.itemR(ob, "name", text="") class OBJECT_PT_transform(ObjectButtonsPanel): - __idname__ = "OBJECT_PT_transform" __label__ = "Transform" def draw(self, context): layout = self.layout + ob = context.object row = layout.row() @@ -32,14 +32,15 @@ class OBJECT_PT_transform(ObjectButtonsPanel): row.column().itemR(ob, "scale") class OBJECT_PT_relations(ObjectButtonsPanel): - __idname__ = "OBJECT_PT_relations" __label__ = "Relations" def draw(self, context): layout = self.layout + ob = context.object split = layout.split() + col = split.column() col.itemR(ob, "layers") col.itemS() @@ -57,11 +58,11 @@ class OBJECT_PT_relations(ObjectButtonsPanel): sub.active = parent != None class OBJECT_PT_groups(ObjectButtonsPanel): - __idname__ = "OBJECT_PT_groups" __label__ = "Groups" def draw(self, context): layout = self.layout + ob = context.object split = layout.split() @@ -83,11 +84,11 @@ class OBJECT_PT_groups(ObjectButtonsPanel): split.column().itemR(group, "dupli_offset", text="") class OBJECT_PT_display(ObjectButtonsPanel): - __idname__ = "OBJECT_PT_display" __label__ = "Display" def draw(self, context): layout = self.layout + ob = context.object row = layout.row() @@ -103,11 +104,11 @@ class OBJECT_PT_display(ObjectButtonsPanel): flow.itemR(ob, "draw_transparent", text="Transparency") class OBJECT_PT_duplication(ObjectButtonsPanel): - __idname__ = "OBJECT_PT_duplication" __label__ = "Duplication" def draw(self, context): layout = self.layout + ob = context.object layout.itemR(ob, "dupli_type", expand=True) @@ -115,13 +116,13 @@ class OBJECT_PT_duplication(ObjectButtonsPanel): if ob.dupli_type == 'FRAMES': split = layout.split() - sub = split.column(align=True) - sub.itemR(ob, "dupli_frames_start", text="Start") - sub.itemR(ob, "dupli_frames_end", text="End") + col = split.column(align=True) + col.itemR(ob, "dupli_frames_start", text="Start") + col.itemR(ob, "dupli_frames_end", text="End") - sub = split.column(align=True) - sub.itemR(ob, "dupli_frames_on", text="On") - sub.itemR(ob, "dupli_frames_off", text="Off") + col = split.column(align=True) + col.itemR(ob, "dupli_frames_on", text="On") + col.itemR(ob, "dupli_frames_off", text="Off") layout.itemR(ob, "dupli_frames_no_speed", text="No Speed") @@ -137,35 +138,35 @@ class OBJECT_PT_duplication(ObjectButtonsPanel): layout.itemR(ob, "dupli_group", text="Group") class OBJECT_PT_animation(ObjectButtonsPanel): - __idname__ = "OBJECT_PT_animation" __label__ = "Animation" def draw(self, context): layout = self.layout + ob = context.object split = layout.split() - sub = split.column() - sub.itemL(text="Time Offset:") - sub.itemR(ob, "time_offset_edit", text="Edit") - row = sub.row() + col = split.column() + col.itemL(text="Time Offset:") + col.itemR(ob, "time_offset_edit", text="Edit") + row = col.row() row.itemR(ob, "time_offset_particle", text="Particle") row.active = len(ob.particle_systems) != 0 - row = sub.row() + row = col.row() row.itemR(ob, "time_offset_parent", text="Parent") row.active = ob.parent != None - row = sub.row() + row = col.row() row.itemR(ob, "slow_parent") row.active = ob.parent != None - sub.itemR(ob, "time_offset", text="Offset") - - sub = split.column() - sub.itemL(text="Track:") - sub.itemR(ob, "track", text="") - sub.itemR(ob, "track_axis", text="Axis") - sub.itemR(ob, "up_axis", text="Up Axis") - row = sub.row() + col.itemR(ob, "time_offset", text="Offset") + + col = split.column() + col.itemL(text="Track:") + col.itemR(ob, "track", text="") + col.itemR(ob, "track_axis", text="Axis") + col.itemR(ob, "up_axis", text="Up Axis") + row = col.row() row.itemR(ob, "track_override_parent", text="Override Parent") row.active = ob.parent != None @@ -176,4 +177,3 @@ bpy.types.register(OBJECT_PT_groups) bpy.types.register(OBJECT_PT_display) bpy.types.register(OBJECT_PT_duplication) bpy.types.register(OBJECT_PT_animation) - diff --git a/release/ui/buttons_object_constraint.py b/release/ui/buttons_object_constraint.py index 8d531df9e19..3804ef5d409 100644 --- a/release/ui/buttons_object_constraint.py +++ b/release/ui/buttons_object_constraint.py @@ -8,6 +8,7 @@ class ConstraintButtonsPanel(bpy.types.Panel): def draw_constraint(self, con): layout = self.layout + box = layout.template_constraint(con) if box: @@ -91,23 +92,23 @@ class ConstraintButtonsPanel(bpy.types.Panel): split = layout.split() - sub = split.column() - sub.itemL(text="Location:") - sub.itemR(con, "locationx", text="X") - sub.itemR(con, "locationy", text="Y") - sub.itemR(con, "locationz", text="Z") + col = split.column() + col.itemL(text="Location:") + col.itemR(con, "locationx", text="X") + col.itemR(con, "locationy", text="Y") + col.itemR(con, "locationz", text="Z") - sub = split.column() - sub.itemL(text="Rotation:") - sub.itemR(con, "rotationx", text="X") - sub.itemR(con, "rotationy", text="Y") - sub.itemR(con, "rotationz", text="Z") + col = split.column() + col.itemL(text="Rotation:") + col.itemR(con, "rotationx", text="X") + col.itemR(con, "rotationy", text="Y") + col.itemR(con, "rotationz", text="Z") - sub = split.column() - sub.itemL(text="Scale:") - sub.itemR(con, "sizex", text="X") - sub.itemR(con, "sizey", text="Y") - sub.itemR(con, "sizez", text="Z") + col = split.column() + col.itemL(text="Scale:") + col.itemR(con, "sizex", text="X") + col.itemR(con, "sizey", text="Y") + col.itemR(con, "sizez", text="Z") row = layout.row() row.itemO("constraint.childof_set_inverse") @@ -134,18 +135,18 @@ class ConstraintButtonsPanel(bpy.types.Panel): if con.pole_target and con.pole_target.type == "ARMATURE": layout.item_pointerR(con, "pole_subtarget", con.pole_target.data, "bones", text="Bone") - col = layout.column_flow() - col.itemR(con, "iterations") - col.itemR(con, "pole_angle") - col.itemR(con, "weight") - col.itemR(con, "orient_weight") - col.itemR(con, "chain_length") + flow = layout.column_flow() + flow.itemR(con, "iterations") + flow.itemR(con, "pole_angle") + flow.itemR(con, "weight") + flow.itemR(con, "orient_weight") + flow.itemR(con, "chain_length") - col = layout.column_flow() - col.itemR(con, "tail") - col.itemR(con, "rotation") - col.itemR(con, "targetless") - col.itemR(con, "stretch") + flow = layout.column_flow() + flow.itemR(con, "tail") + flow.itemR(con, "rotation") + flow.itemR(con, "targetless") + flow.itemR(con, "stretch") def follow_path(self, layout, con): self.target_template(layout, con) @@ -168,24 +169,24 @@ class ConstraintButtonsPanel(bpy.types.Panel): col = split.column() col.itemR(con, "use_limit_x") - colsub = col.column() - colsub.active = con.use_limit_x - colsub.itemR(con, "minimum_x", text="Min") - colsub.itemR(con, "maximum_x", text="Max") + sub = col.column() + sub.active = con.use_limit_x + sub.itemR(con, "minimum_x", text="Min") + sub.itemR(con, "maximum_x", text="Max") col = split.column() col.itemR(con, "use_limit_y") - colsub = col.column() - colsub.active = con.use_limit_y - colsub.itemR(con, "minimum_y", text="Min") - colsub.itemR(con, "maximum_y", text="Max") + sub = col.column() + sub.active = con.use_limit_y + sub.itemR(con, "minimum_y", text="Min") + sub.itemR(con, "maximum_y", text="Max") col = split.column() col.itemR(con, "use_limit_z") - colsub = col.column() - colsub.active = con.use_limit_z - colsub.itemR(con, "minimum_z", text="Min") - colsub.itemR(con, "maximum_z", text="Max") + sub = col.column() + sub.active = con.use_limit_z + sub.itemR(con, "minimum_z", text="Min") + sub.itemR(con, "maximum_z", text="Max") row = layout.row() row.itemR(con, "limit_transform") @@ -200,33 +201,33 @@ class ConstraintButtonsPanel(bpy.types.Panel): col = split.column() col.itemR(con, "use_minimum_x") - colsub = col.column() - colsub.active = con.use_minimum_x - colsub.itemR(con, "minimum_x", text="") + sub = col.column() + sub.active = con.use_minimum_x + sub.itemR(con, "minimum_x", text="") col.itemR(con, "use_maximum_x") - colsub = col.column() - colsub.active = con.use_maximum_x - colsub.itemR(con, "maximum_x", text="") + sub = col.column() + sub.active = con.use_maximum_x + sub.itemR(con, "maximum_x", text="") col = split.column() col.itemR(con, "use_minimum_y") - colsub = col.column() - colsub.active = con.use_minimum_y - colsub.itemR(con, "minimum_y", text="") + sub = col.column() + sub.active = con.use_minimum_y + sub.itemR(con, "minimum_y", text="") col.itemR(con, "use_maximum_y") - colsub = col.column() - colsub.active = con.use_maximum_y - colsub.itemR(con, "maximum_y", text="") + sub = col.column() + sub.active = con.use_maximum_y + sub.itemR(con, "maximum_y", text="") col = split.column() col.itemR(con, "use_minimum_z") - colsub = col.column() - colsub.active = con.use_minimum_z - colsub.itemR(con, "minimum_z", text="") + sub = col.column() + sub.active = con.use_minimum_z + sub.itemR(con, "minimum_z", text="") col.itemR(con, "use_maximum_z") - colsub = col.column() - colsub.active = con.use_maximum_z - colsub.itemR(con, "maximum_z", text="") + sub = col.column() + sub.active = con.use_maximum_z + sub.itemR(con, "maximum_z", text="") row = layout.row() row.itemR(con, "limit_transform") @@ -241,33 +242,33 @@ class ConstraintButtonsPanel(bpy.types.Panel): col = split.column() col.itemR(con, "use_minimum_x") - colsub = col.column() - colsub.active = con.use_minimum_x - colsub.itemR(con, "minimum_x", text="") + sub = col.column() + sub.active = con.use_minimum_x + sub.itemR(con, "minimum_x", text="") col.itemR(con, "use_maximum_x") - colsub = col.column() - colsub.active = con.use_maximum_x - colsub.itemR(con, "maximum_x", text="") + sub = col.column() + sub.active = con.use_maximum_x + sub.itemR(con, "maximum_x", text="") col = split.column() col.itemR(con, "use_minimum_y") - colsub = col.column() - colsub.active = con.use_minimum_y - colsub.itemR(con, "minimum_y", text="") + sub = col.column() + sub.active = con.use_minimum_y + sub.itemR(con, "minimum_y", text="") col.itemR(con, "use_maximum_y") - colsub = col.column() - colsub.active = con.use_maximum_y - colsub.itemR(con, "maximum_y", text="") + sub = col.column() + sub.active = con.use_maximum_y + sub.itemR(con, "maximum_y", text="") col = split.column() col.itemR(con, "use_minimum_z") - colsub = col.column() - colsub.active = con.use_minimum_z - colsub.itemR(con, "minimum_z", text="") + sub = col.column() + sub.active = con.use_minimum_z + sub.itemR(con, "minimum_z", text="") col.itemR(con, "use_maximum_z") - colsub = col.column() - colsub.active = con.use_maximum_z - colsub.itemR(con, "maximum_z", text="") + sub = col.column() + sub.active = con.use_maximum_z + sub.itemR(con, "maximum_z", text="") row = layout.row() row.itemR(con, "limit_transform") @@ -284,21 +285,21 @@ class ConstraintButtonsPanel(bpy.types.Panel): col = split.column() col.itemR(con, "rotate_like_x", text="X") - colsub = col.column() - colsub.active = con.rotate_like_x - colsub.itemR(con, "invert_x", text="Invert") + sub = col.column() + sub.active = con.rotate_like_x + sub.itemR(con, "invert_x", text="Invert") col = split.column() col.itemR(con, "rotate_like_y", text="Y") - colsub = col.column() - colsub.active = con.rotate_like_y - colsub.itemR(con, "invert_y", text="Invert") + sub = col.column() + sub.active = con.rotate_like_y + sub.itemR(con, "invert_y", text="Invert") col = split.column() col.itemR(con, "rotate_like_z", text="Z") - colsub = col.column() - colsub.active = con.rotate_like_z - colsub.itemR(con, "invert_z", text="Invert") + sub = col.column() + sub.active = con.rotate_like_z + sub.itemR(con, "invert_z", text="Invert") layout.itemR(con, "offset") @@ -311,21 +312,21 @@ class ConstraintButtonsPanel(bpy.types.Panel): col = split.column() col.itemR(con, "locate_like_x", text="X") - colsub = col.column() - colsub.active = con.locate_like_x - colsub.itemR(con, "invert_x", text="Invert") + sub = col.column() + sub.active = con.locate_like_x + sub.itemR(con, "invert_x", text="Invert") col = split.column() col.itemR(con, "locate_like_y", text="Y") - colsub = col.column() - colsub.active = con.locate_like_y - colsub.itemR(con, "invert_y", text="Invert") + sub = col.column() + sub.active = con.locate_like_y + sub.itemR(con, "invert_y", text="Invert") col = split.column() col.itemR(con, "locate_like_z", text="Z") - colsub = col.column() - colsub.active = con.locate_like_z - colsub.itemR(con, "invert_z", text="Invert") + sub = col.column() + sub.active = con.locate_like_z + sub.itemR(con, "invert_z", text="Invert") layout.itemR(con, "offset") @@ -379,26 +380,29 @@ class ConstraintButtonsPanel(bpy.types.Panel): def limit_distance(self, layout, con): self.target_template(layout, con) - layout.itemR(con, "distance") + col = layout.column(align=True); + col.itemR(con, "distance") + col.itemO("constraint.limitdistance_reset") row = layout.row() row.itemL(text="Clamp Region:") row.itemR(con, "limit_mode", text="") - #Missing: Recalculate Button def stretch_to(self, layout, con): self.target_template(layout, con) - row = layout.row() - row.itemR(con, "original_length", text="Rest Length") - row.itemR(con, "bulge", text="Volume Variation") + col = layout.column(align=True) + col.itemR(con, "original_length", text="Rest Length") + col.itemO("constraint.stretchto_reset") + + col = layout.column() + col.itemR(con, "bulge", text="Volume Variation") row = layout.row() row.itemL(text="Volume:") row.itemR(con, "volume", expand=True) row.itemL(text="Plane:") row.itemR(con, "keep_axis", expand=True) - #Missing: Recalculate Button def floor(self, layout, con): self.target_template(layout, con) @@ -509,16 +513,15 @@ class ConstraintButtonsPanel(bpy.types.Panel): row.itemR(con, "axis_z") class OBJECT_PT_constraints(ConstraintButtonsPanel): - __idname__ = "OBJECT_PT_constraints" __label__ = "Constraints" __context__ = "constraint" def poll(self, context): - return (context.object != None) + return (context.object) def draw(self, context): - ob = context.object layout = self.layout + ob = context.object row = layout.row() row.item_menu_enumO("object.constraint_add", "type") @@ -528,7 +531,6 @@ class OBJECT_PT_constraints(ConstraintButtonsPanel): self.draw_constraint(con) class BONE_PT_constraints(ConstraintButtonsPanel): - __idname__ = "BONE_PT_constraints" __label__ = "Constraints" __context__ = "bone" @@ -537,9 +539,10 @@ class BONE_PT_constraints(ConstraintButtonsPanel): return (ob and ob.type == "ARMATURE" and context.bone) def draw(self, context): + layout = self.layout + ob = context.object pchan = ob.pose.pose_channels[context.bone.name] - layout = self.layout row = layout.row() row.item_menu_enumO("pose.constraint_add", "type") diff --git a/release/ui/buttons_particle.py b/release/ui/buttons_particle.py index 47d325a5940..f35d15bbb80 100644 --- a/release/ui/buttons_particle.py +++ b/release/ui/buttons_particle.py @@ -19,8 +19,7 @@ class ParticleButtonsPanel(bpy.types.Panel): return particle_panel_poll(context) class PARTICLE_PT_particles(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_particles" - __no_header__ = True + __show_header__ = False def poll(self, context): return (context.particle_system or context.object) @@ -83,9 +82,14 @@ class PARTICLE_PT_particles(ParticleButtonsPanel): split.itemR(psys, "reactor_target_particle_system", text="Particle System") class PARTICLE_PT_emission(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_emission" __label__ = "Emission" + def poll(self, context): + if particle_panel_poll(context): + return not context.particle_system.point_cache.external + else: + return False + def draw(self, context): layout = self.layout @@ -129,7 +133,6 @@ class PARTICLE_PT_emission(ParticleButtonsPanel): row.itemR(part, "grid_resolution") class PARTICLE_PT_cache(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_cache" __label__ = "Cache" __default_closed__ = True @@ -150,50 +153,72 @@ class PARTICLE_PT_cache(ParticleButtonsPanel): cache = psys.point_cache row = layout.row() - row.itemR(cache, "name") + row.itemL(text="File Name:") + row.itemR(cache, "external") - row = layout.row() - - if cache.baked == True: - row.itemO("ptcache.free_bake_particle_system", text="Free Bake") + if cache.external: + split = layout.split(percentage=0.80) + split.itemR(cache, "name", text="") + split.itemR(cache, "index", text="") + + layout.itemL(text="File Path:") + layout.itemR(cache, "filepath", text="") + + layout.itemL(text=cache.info) + + split = layout.split() + + col = split.column(align=True) + col.itemR(part, "start") + col.itemR(part, "end") + + col = split.column(align=True) + col.itemR(part, "lifetime") + col.itemR(part, "random_lifetime", slider=True) else: - row.item_booleanO("ptcache.cache_particle_system", "bake", True, text="Bake") - - subrow = row.row() - subrow.enabled = (cache.frames_skipped or cache.outdated) and particle_panel_enabled(psys) - subrow.itemO("ptcache.cache_particle_system", text="Calculate to Current Frame") + layout.itemR(cache, "name", text="") + + row = layout.row() - row = layout.row() - row.enabled = particle_panel_enabled(psys) - row.itemO("ptcache.bake_from_particles_cache", text="Current Cache to Bake") - row.itemR(cache, "step"); - - row = layout.row() - row.enabled = particle_panel_enabled(psys) - row.itemR(cache, "quick_cache") - row.itemR(cache, "disk_cache") + if cache.baked == True: + row.itemO("ptcache.free_bake_particle_system", text="Free Bake") + else: + row.item_booleanO("ptcache.cache_particle_system", "bake", True, text="Bake") - layout.itemL(text=cache.info) + subrow = row.row() + subrow.enabled = (cache.frames_skipped or cache.outdated) and particle_panel_enabled(psys) + subrow.itemO("ptcache.cache_particle_system", text="Calculate to Current Frame") + + row = layout.row() + row.enabled = particle_panel_enabled(psys) + row.itemO("ptcache.bake_from_particles_cache", text="Current Cache to Bake") + row.itemR(cache, "step"); - layout.itemS() + row = layout.row() + row.enabled = particle_panel_enabled(psys) + row.itemR(cache, "quick_cache") + row.itemR(cache, "disk_cache") - row = layout.row() - row.item_booleanO("ptcache.bake_all", "bake", True, text="Bake All Dynamics") - row.itemO("ptcache.free_bake_all", text="Free All Bakes") - layout.itemO("ptcache.bake_all", text="Update All Dynamics to current frame") + layout.itemL(text=cache.info) + + layout.itemS() + + row = layout.row() + row.item_booleanO("ptcache.bake_all", "bake", True, text="Bake All Dynamics") + row.itemO("ptcache.free_bake_all", text="Free All Bakes") + layout.itemO("ptcache.bake_all", text="Update All Dynamics to current frame") # for particles these are figured out automatically #row.itemR(cache, "start_frame") #row.itemR(cache, "end_frame") class PARTICLE_PT_initial(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_initial" __label__ = "Velocity" def poll(self, context): if particle_panel_poll(context): psys = context.particle_system - return psys.settings.physics_type != 'BOIDS' + return psys.settings.physics_type != 'BOIDS' and not psys.point_cache.external else: return False @@ -254,8 +279,13 @@ class PARTICLE_PT_initial(ParticleButtonsPanel): sub.itemR(part, "angular_velocity_factor", text="") class PARTICLE_PT_physics(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_physics" __label__ = "Physics" + + def poll(self, context): + if particle_panel_poll(context): + return not context.particle_system.point_cache.external + else: + return False def draw(self, context): layout = self.layout @@ -392,19 +422,21 @@ class PARTICLE_PT_physics(ParticleButtonsPanel): layout.itemR(key, "mode", expand=True) class PARTICLE_PT_boidbrain(ParticleButtonsPanel): - __idname__ = "PARTICLE_PT_boidbrain" __label__ = "Boid Brain" def poll(self, context): psys = context.particle_system if psys==None: return False if psys.settings==None: return False + if psys.point_cache.external: return False return psys.settings.physics_type=='BOIDS' def draw(self, context): boids = context.particle_system.settings.boids layout = self.layout + layout.enabled = particle_panel_enabled(psys) + # Currently boids can only use the first state so these are commented out for now. #row = layout.row() #row.template_list(boids, "states", boids, "active_boid_state_index", compact="True") @@ -484,7 +516,6 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel): class PARTICLE_PT_render(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_render" __label__ = "Render" def poll(self, context): @@ -626,7 +657,6 @@ class PARTICLE_PT_render(ParticleButtonsPanel): col.itemL(text="") class PARTICLE_PT_draw(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_draw" __label__ = "Display" __default_closed__ = True @@ -683,7 +713,6 @@ class PARTICLE_PT_draw(ParticleButtonsPanel): #subcol.itemL(text="Override material color") class PARTICLE_PT_children(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_children" __label__ = "Children" __default_closed__ = True @@ -760,16 +789,9 @@ class PARTICLE_PT_children(ParticleButtonsPanel): sub.itemR(part, "kink_shape", slider=True) class PARTICLE_PT_effectors(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_effectors" __label__ = "Effectors" __default_closed__ = True - def poll(self, context): - psys = context.particle_system - if psys==None: return False - if psys.settings==None: return False - return True; - def draw(self, context): layout = self.layout @@ -792,7 +814,6 @@ class PARTICLE_PT_effectors(ParticleButtonsPanel): layout.itemR(part, "eweight_lennardjones", slider=True) class PARTICLE_PT_vertexgroups(ParticleButtonsPanel): - __idname__= "PARTICLE_PT_vertexgroups" __label__ = "Vertexgroups" __default_closed__ = True diff --git a/release/ui/buttons_physics_cloth.py b/release/ui/buttons_physics_cloth.py index 08911b0195c..372dc32d063 100644 --- a/release/ui/buttons_physics_cloth.py +++ b/release/ui/buttons_physics_cloth.py @@ -8,10 +8,10 @@ class PhysicButtonsPanel(bpy.types.Panel): def poll(self, context): ob = context.object - return (ob and ob.type == 'MESH') + rd = context.scene.render_data + return (ob and ob.type == 'MESH') and (not rd.use_game_engine) class PHYSICS_PT_cloth(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_cloth" __label__ = "Cloth" def draw(self, context): @@ -75,7 +75,6 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel): """ class PHYSICS_PT_cloth_cache(PhysicButtonsPanel): - __idname__= "PHYSICS_PT_cloth_cache" __label__ = "Cloth Cache" __default_closed__ = True @@ -125,7 +124,6 @@ class PHYSICS_PT_cloth_cache(PhysicButtonsPanel): layout.itemO("ptcache.bake_all", text="Update All Dynamics to current frame") class PHYSICS_PT_cloth_collision(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_clothcollision" __label__ = "Cloth Collision" __default_closed__ = True @@ -158,7 +156,6 @@ class PHYSICS_PT_cloth_collision(PhysicButtonsPanel): col.itemR(cloth, "self_min_distance", slider=True, text="Distance") class PHYSICS_PT_cloth_stiffness(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_stiffness" __label__ = "Cloth Stiffness Scaling" __default_closed__ = True @@ -196,4 +193,3 @@ bpy.types.register(PHYSICS_PT_cloth) bpy.types.register(PHYSICS_PT_cloth_cache) bpy.types.register(PHYSICS_PT_cloth_collision) bpy.types.register(PHYSICS_PT_cloth_stiffness) - diff --git a/release/ui/buttons_physics_field.py b/release/ui/buttons_physics_field.py index cdb90c95228..3b054f7d557 100644 --- a/release/ui/buttons_physics_field.py +++ b/release/ui/buttons_physics_field.py @@ -7,151 +7,144 @@ class PhysicButtonsPanel(bpy.types.Panel): __context__ = "physics" def poll(self, context): - return (context.object != None) + rd = context.scene.render_data + return (context.object != None) and (not rd.use_game_engine) class PHYSICS_PT_field(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_field" __label__ = "Force Fields" __default_closed__ = True def draw(self, context): layout = self.layout + ob = context.object field = ob.field #layout.active = field.enabled - split = layout.split(percentage=0.3) + split = layout.split(percentage=0.2) split.itemL(text="Type:") - split.itemR(field, "type", text="" - ) - + split.itemR(field, "type",text="") + split = layout.split() - sub = split.column() - - if field.type == "GUIDE": - sub = col.column() - sub.itemR(field, "guide_path_add") + if field.type == 'GUIDE': + layout.itemR(field, "guide_path_add") - if field.type == "WIND": - sub.itemR(field, "strength") - sub = split.column() - sub.itemR(field, "noise") - sub.itemR(field, "seed") - - - if field.type == "VORTEX": - sub.itemR(field, "strength") - sub = split.column() - sub.itemL(text="") + elif field.type == 'WIND': + split.itemR(field, "strength") + + col = split.column() + col.itemR(field, "noise") + col.itemR(field, "seed") - if field.type in ("SPHERICAL", "CHARGE", "LENNARDJ"): - sub.itemR(field, "strength") - sub = split.column() - sub.itemR(field, "planar") - sub.itemR(field, "surface") - - if field.type == "BOID": - sub.itemR(field, "strength") - sub = split.column() - sub.itemR(field, "surface") - - if field.type == "MAGNET": - sub.itemR(field, "strength") - sub = split.column() - sub.itemR(field, "planar") - - if field.type == "HARMONIC": - sub.itemR(field, "strength") - sub.itemR(field, "harmonic_damping", text="Damping") - sub = split.column() - sub.itemR(field, "surface") - sub.itemR(field, "planar") - - if field.type == "TEXTURE": - sub.itemR(field, "strength") - sub.itemR(field, "texture", text="") - sub.itemR(field, "texture_mode") - sub.itemR(field, "texture_nabla") - sub = split.column() - sub.itemR(field, "use_coordinates") - sub.itemR(field, "root_coordinates") - sub.itemR(field, "force_2d") - - if field.type in ("HARMONIC", "SPHERICAL", "CHARGE", "WIND", "VORTEX", "TEXTURE", "MAGNET", "BOID"): - + elif field.type == 'VORTEX': + split.itemR(field, "strength") + split.itemL() - layout.itemS() - layout.itemL(text="Falloff:") - layout.itemR(field, "falloff_type", expand=True) + elif field.type in ('SPHERICAL', 'CHARGE', 'LENNARDJ'): + split.itemR(field, "strength") + + col = split.column() + col.itemR(field, "planar") + col.itemR(field, "surface") + + elif field.type == 'BOID': + split.itemR(field, "strength") + split.itemR(field, "surface") + + elif field.type == 'MAGNET': + split.itemR(field, "strength") + split.itemR(field, "planar") - row = layout.row() - row.itemR(field, "falloff_power", text="Power") - row.itemR(field, "positive_z", text="Positive Z") + elif field.type == 'HARMONIC': + col = split.column() + col.itemR(field, "strength") + col.itemR(field, "harmonic_damping", text="Damping") - layout.itemS() - split = layout.split() - sub = split.column() + col = split.column() + col.itemR(field, "planar") + col.itemR(field, "surface") - sub.itemR(field, "use_min_distance", text="Minimum") - colsub1 = sub.column() - colsub1.active = field.use_min_distance - colsub1.itemR(field, "minimum_distance", text="Distance") + elif field.type == 'TEXTURE': + col = split.column() + col.itemR(field, "strength") + col.itemR(field, "texture", text="") + col.itemR(field, "texture_mode", text="") + col.itemR(field, "texture_nabla") - sub = split.column() + col = split.column() + col.itemR(field, "use_coordinates") + col.itemR(field, "root_coordinates") + col.itemR(field, "force_2d") - sub.itemR(field, "use_max_distance", text="Maximum") - colsub2 = sub.column() - colsub2.active = field.use_max_distance - colsub2.itemR(field, "maximum_distance", text="Distance") + if field.type in ('HARMONIC', 'SPHERICAL', 'CHARGE', 'WIND', 'VORTEX', 'TEXTURE', 'MAGNET', 'BOID'): - if field.falloff_type == "CONE": - layout.itemS() - layout.itemL(text="Angular:") + layout.itemL(text="Falloff:") + layout.itemR(field, "falloff_type", expand=True) + + split = layout.split(percentage=0.35) + + col = split.column() + col.itemR(field, "positive_z", text="Positive Z") + col.itemR(field, "use_min_distance", text="Use Minimum") + col.itemR(field, "use_max_distance", text="Use Maximum") + + col = split.column() + col.itemR(field, "falloff_power", text="Power") + + sub = col.column() + sub.active = field.use_min_distance + sub.itemR(field, "minimum_distance", text="Distance") + + sub = col.column() + sub.active = field.use_max_distance + sub.itemR(field, "maximum_distance", text="Distance") + + if field.falloff_type == 'CONE': + + layout.itemS() - row = layout.row() - row.itemR(field, "radial_falloff", text="Power") - row.itemL(text="") + split = layout.split(percentage=0.35) - split = layout.split() - sub = split.column() + col = split.column() + col.itemL(text="Angular:") + col.itemR(field, "use_radial_min", text="Use Minimum") + col.itemR(field, "use_radial_max", text="Use Maximum") - sub.itemR(field, "use_radial_min", text="Minimum") - colsub1 = sub.column() - colsub1.active = field.use_radial_min - colsub1.itemR(field, "radial_minimum", text="Angle") + col = split.column() + col.itemR(field, "radial_falloff", text="Power") - sub = split.column() + sub = col.column() + sub.active = field.use_radial_min + sub.itemR(field, "radial_minimum", text="Angle") - sub.itemR(field, "use_radial_max", text="Maximum") - colsub2 = sub.column() - colsub2.active = field.use_radial_max - colsub2.itemR(field, "radial_maximum", text="Angle") + sub = col.column() + sub.active = field.use_radial_max + sub.itemR(field, "radial_maximum", text="Angle") - if field.falloff_type == "TUBE": + elif field.falloff_type == 'TUBE': - layout.itemS() - layout.itemL(text="Radial:") - row = layout.row() - row.itemR(field, "radial_falloff", text="Power") - row.itemL(text="") + layout.itemS() - split = layout.split() - sub = split.column() + split = layout.split(percentage=0.35) + + col = split.column() + col.itemL(text="Radial:") + col.itemR(field, "use_radial_min", text="Use Minimum") + col.itemR(field, "use_radial_max", text="Use Maximum") - sub.itemR(field, "use_radial_min", text="Minimum") - colsub1 = sub.column() - colsub1.active = field.use_radial_min - colsub1.itemR(field, "radial_minimum", text="Distance") + col = split.column() + col.itemR(field, "radial_falloff", text="Power") - sub = split.column() + sub = col.column() + sub.active = field.use_radial_min + sub.itemR(field, "radial_minimum", text="Distance") - sub.itemR(field, "use_radial_max", text="Maximum") - colsub2 = sub.column() - colsub2.active = field.use_radial_max - colsub2.itemR(field, "radial_maximum", text="Distance") + sub = col.column() + sub.active = field.use_radial_max + sub.itemR(field, "radial_maximum", text="Distance") #if ob.type in "CURVE": #if field.type == "GUIDE": @@ -165,13 +158,13 @@ class PHYSICS_PT_field(PhysicButtonsPanel): #layout.itemR(field, "surface") class PHYSICS_PT_collision(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_collision" __label__ = "Collision" __default_closed__ = True def poll(self, context): ob = context.object - return (ob and ob.type == 'MESH') + rd = context.scene.render_data + return (ob and ob.type == 'MESH') and (not rd.use_game_engine) def draw_header(self, context): settings = context.object.collision @@ -179,6 +172,7 @@ class PHYSICS_PT_collision(PhysicButtonsPanel): def draw(self, context): layout = self.layout + md = context.collision settings = context.object.collision @@ -190,27 +184,27 @@ class PHYSICS_PT_collision(PhysicButtonsPanel): col.itemL(text="Particle:") col.itemR(settings, "permeability", slider=True) col.itemL(text="Particle Damping:") - colsub = col.column(align=True) - colsub.itemR(settings, "damping_factor", text="Factor", slider=True) - colsub.itemR(settings, "random_damping", text="Random", slider=True) + sub = col.column(align=True) + sub.itemR(settings, "damping_factor", text="Factor", slider=True) + sub.itemR(settings, "random_damping", text="Random", slider=True) col.itemL(text="Soft Body and Cloth:") - colsub = col.column(align=True) - colsub.itemR(settings, "outer_thickness", text="Outer", slider=True) - colsub.itemR(settings, "inner_thickness", text="Inner", slider=True) + sub = col.column(align=True) + sub.itemR(settings, "outer_thickness", text="Outer", slider=True) + sub.itemR(settings, "inner_thickness", text="Inner", slider=True) - col.itemL(text="Force Fields:") + layout.itemL(text="Force Fields:") layout.itemR(md, "absorption", text="Absorption") col = split.column() col.itemL(text="") col.itemR(settings, "kill_particles") col.itemL(text="Particle Friction:") - colsub = col.column(align=True) - colsub.itemR(settings, "friction_factor", text="Factor", slider=True) - colsub.itemR(settings, "random_friction", text="Random", slider=True) + sub = col.column(align=True) + sub.itemR(settings, "friction_factor", text="Factor", slider=True) + sub.itemR(settings, "random_friction", text="Random", slider=True) col.itemL(text="Soft Body Damping:") col.itemR(settings, "damping", text="Factor", slider=True) bpy.types.register(PHYSICS_PT_field) -bpy.types.register(PHYSICS_PT_collision)
\ No newline at end of file +bpy.types.register(PHYSICS_PT_collision) diff --git a/release/ui/buttons_physics_fluid.py b/release/ui/buttons_physics_fluid.py index 0e6e9e64323..17813beecaa 100644 --- a/release/ui/buttons_physics_fluid.py +++ b/release/ui/buttons_physics_fluid.py @@ -8,14 +8,15 @@ class PhysicButtonsPanel(bpy.types.Panel): def poll(self, context): ob = context.object - return (ob and ob.type == 'MESH') + rd = context.scene.render_data + return (ob and ob.type == 'MESH') and (not rd.use_game_engine) class PHYSICS_PT_fluid(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_fluid" __label__ = "Fluid" def draw(self, context): layout = self.layout + md = context.fluid ob = context.object @@ -42,18 +43,7 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel): if fluid: - - - col = layout.column(align=True) - row = col.row() - row.item_enumR(fluid, "type", "DOMAIN") - row.item_enumR(fluid, "type", "FLUID") - row.item_enumR(fluid, "type", "OBSTACLE") - row = col.row() - row.item_enumR(fluid, "type", "INFLOW") - row.item_enumR(fluid, "type", "OUTFLOW") - row.item_enumR(fluid, "type", "PARTICLE") - row.item_enumR(fluid, "type", "CONTROL") + layout.itemR(fluid, "type") if fluid.type == 'DOMAIN': layout.itemO("fluid.bake", text="BAKE") @@ -61,56 +51,58 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel): col = split.column() col.itemL(text="Resolution:") - colsub = col.column() - colsub.itemR(fluid, "resolution", text="Final") - colsub.itemL(text="Render Display:") - colsub.itemR(fluid, "render_display_mode", text="") + sub = col.column() + sub.itemR(fluid, "resolution", text="Final") + sub.itemL(text="Render Display:") + sub.itemR(fluid, "render_display_mode", text="") col.itemL(text="Time:") - colsub = col.column(align=True) - colsub.itemR(fluid, "start_time", text="Start") - colsub.itemR(fluid, "end_time", text="End") + sub = col.column(align=True) + sub.itemR(fluid, "start_time", text="Start") + sub.itemR(fluid, "end_time", text="End") col = split.column() - colsub = col.column() - colsub.itemL(text="Required Memory: " + fluid.memory_estimate) - colsub.itemR(fluid, "preview_resolution", text="Preview") - colsub.itemL(text="Viewport Display:") - colsub.itemR(fluid, "viewport_display_mode", text="") - colsub = col.column() - colsub.itemL(text="") - colsub.itemR(fluid, "reverse_frames") - colsub.itemR(fluid, "generate_speed_vectors") + col.itemL(text="Required Memory: " + fluid.memory_estimate) + col.itemR(fluid, "preview_resolution", text="Preview") + col.itemL(text="Viewport Display:") + col.itemR(fluid, "viewport_display_mode", text="") + col.itemL() + col.itemR(fluid, "reverse_frames") + col.itemR(fluid, "generate_speed_vectors") - layout.itemL(text="Path:") layout.itemR(fluid, "path", text="") - if fluid.type == 'FLUID': + elif fluid.type == 'FLUID': split = layout.split() + col = split.column() col.itemL(text="Volume Initialization:") col.itemR(fluid, "volume_initialization", text="") col.itemR(fluid, "export_animated_mesh") + col = split.column() col.itemL(text="Initial Velocity:") col.itemR(fluid, "initial_velocity", text="") - if fluid.type == 'OBSTACLE': + elif fluid.type == 'OBSTACLE': split = layout.split() + col = split.column() col.itemL(text="Volume Initialization:") col.itemR(fluid, "volume_initialization", text="") col.itemR(fluid, "export_animated_mesh") + col = split.column() col.itemL(text="Slip Type:") - colsub=col.column(align=True) - colsub.itemR(fluid, "slip_type", text="") + sub = col.column(align=True) + sub.itemR(fluid, "slip_type", text="") if fluid.slip_type == 'PARTIALSLIP': - colsub.itemR(fluid, "partial_slip_amount", slider=True, text="Amount") + sub.itemR(fluid, "partial_slip_amount", slider=True, text="Amount") col.itemR(fluid, "impact_factor") - if fluid.type == 'INFLOW': + elif fluid.type == 'INFLOW': split = layout.split() + col = split.column() col.itemL(text="Volume Initialization:") col.itemR(fluid, "volume_initialization", text="") @@ -121,23 +113,24 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel): col.itemL(text="Inflow Velocity:") col.itemR(fluid, "inflow_velocity", text="") - if fluid.type == 'OUTFLOW': + elif fluid.type == 'OUTFLOW': split = layout.split() + col = split.column() col.itemL(text="Volume Initialization:") col.itemR(fluid, "volume_initialization", text="") col.itemR(fluid, "export_animated_mesh") - col = split.column() - if fluid.type == 'PARTICLE': + split.column() + + elif fluid.type == 'PARTICLE': split = layout.split() col = split.column() col.itemL(text="Influence:") - colsub = col.column(align=True) - colsub.itemR(fluid, "particle_influence", text="Size") - colsub.itemR(fluid, "alpha_influence", text="Alpha") - col.itemL(text="Path:") + sub = col.column(align=True) + sub.itemR(fluid, "particle_influence", text="Size") + sub.itemR(fluid, "alpha_influence", text="Alpha") layout.itemR(fluid, "path", text="") @@ -147,7 +140,7 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel): col.itemR(fluid, "floats") col.itemR(fluid, "tracer") - if fluid.type == 'CONTROL': + elif fluid.type == 'CONTROL': split = layout.split() col = split.column() @@ -157,26 +150,25 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel): col = split.column() col.itemL(text="Time:") - col=col.column(align=True) - col.itemR(fluid, "start_time", text="Start") - col.itemR(fluid, "end_time", text="End") + sub = col.column(align=True) + sub.itemR(fluid, "start_time", text="Start") + sub.itemR(fluid, "end_time", text="End") split = layout.split() col = split.column() col.itemL(text="Attraction Force:") - col=col.column(align=True) - col.itemR(fluid, "attraction_strength", text="Strength") - col.itemR(fluid, "attraction_radius", text="Radius") + sub = col.column(align=True) + sub.itemR(fluid, "attraction_strength", text="Strength") + sub.itemR(fluid, "attraction_radius", text="Radius") col = split.column() col.itemL(text="Velocity Force:") - col=col.column(align=True) - col.itemR(fluid, "velocity_strength", text="Strength") - col.itemR(fluid, "velocity_radius", text="Radius") + sub = col.column(align=True) + sub.itemR(fluid, "velocity_strength", text="Strength") + sub.itemR(fluid, "velocity_radius", text="Radius") class PHYSICS_PT_domain_gravity(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_domain_gravity" __label__ = "Domain World" __default_closed__ = True @@ -191,6 +183,7 @@ class PHYSICS_PT_domain_gravity(PhysicButtonsPanel): def draw(self, context): layout = self.layout + fluid = context.fluid.settings split = layout.split() @@ -198,29 +191,27 @@ class PHYSICS_PT_domain_gravity(PhysicButtonsPanel): col = split.column() col.itemL(text="Gravity:") col.itemR(fluid, "gravity", text="") - col.itemL(text="Real World Size:") col.itemR(fluid, "real_world_size", text="Metres") col = split.column() col.itemL(text="Viscosity Presets:") - colsub=col.column(align=True) - colsub.itemR(fluid, "viscosity_preset", text="") + sub = col.column(align=True) + sub.itemR(fluid, "viscosity_preset", text="") if fluid.viscosity_preset == 'MANUAL': - colsub.itemR(fluid, "viscosity_base", text="Base") - colsub.itemR(fluid, "viscosity_exponent", text="Exponent", slider=True) + sub.itemR(fluid, "viscosity_base", text="Base") + sub.itemR(fluid, "viscosity_exponent", text="Exponent", slider=True) else: - colsub.itemL(text="") - colsub.itemL(text="") + sub.itemL() + sub.itemL() col.itemL(text="Optimization:") - col=col.column(align=True) - col.itemR(fluid, "grid_levels", slider=True) - col.itemR(fluid, "compressibility", slider=True) + sub = col.column(align=True) + sub.itemR(fluid, "grid_levels", slider=True) + sub.itemR(fluid, "compressibility", slider=True) class PHYSICS_PT_domain_boundary(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_domain_boundary" __label__ = "Domain Boundary" __default_closed__ = True @@ -235,23 +226,25 @@ class PHYSICS_PT_domain_boundary(PhysicButtonsPanel): def draw(self, context): layout = self.layout + fluid = context.fluid.settings split = layout.split() + col = split.column() col.itemL(text="Slip Type:") - col=col.column(align=True) - col.itemR(fluid, "slip_type", text="") + sub = col.column(align=True) + sub.itemR(fluid, "slip_type", text="") if fluid.slip_type == 'PARTIALSLIP': - col.itemR(fluid, "partial_slip_amount", slider=True, text="Amount") + sub.itemR(fluid, "partial_slip_amount", slider=True, text="Amount") + col = split.column() col.itemL(text="Surface:") - col=col.column(align=True) - col.itemR(fluid, "surface_smoothing", text="Smoothing") - col.itemR(fluid, "surface_subdivisions", text="Subdivisions") + sub = col.column(align=True) + sub.itemR(fluid, "surface_smoothing", text="Smoothing") + sub.itemR(fluid, "surface_subdivisions", text="Subdivisions") class PHYSICS_PT_domain_particles(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_domain_particles" __label__ = "Domain Particles" __default_closed__ = True @@ -266,13 +259,14 @@ class PHYSICS_PT_domain_particles(PhysicButtonsPanel): def draw(self, context): layout = self.layout + fluid = context.fluid.settings - col=layout.column(align=True) + col = layout.column(align=True) col.itemR(fluid, "tracer_particles") col.itemR(fluid, "generate_particles") bpy.types.register(PHYSICS_PT_fluid) bpy.types.register(PHYSICS_PT_domain_gravity) bpy.types.register(PHYSICS_PT_domain_boundary) -bpy.types.register(PHYSICS_PT_domain_particles)
\ No newline at end of file +bpy.types.register(PHYSICS_PT_domain_particles) diff --git a/release/ui/buttons_physics_softbody.py b/release/ui/buttons_physics_softbody.py index 836c557257e..bff9b13f464 100644 --- a/release/ui/buttons_physics_softbody.py +++ b/release/ui/buttons_physics_softbody.py @@ -8,14 +8,15 @@ class PhysicButtonsPanel(bpy.types.Panel): def poll(self, context): ob = context.object - return (ob and ob.type == 'MESH') + rd = context.scene.render_data + return (ob and ob.type == 'MESH') and (not rd.use_game_engine) class PHYSICS_PT_softbody(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_softbody" __label__ = "Soft Body" def draw(self, context): layout = self.layout + md = context.soft_body ob = context.object @@ -51,22 +52,69 @@ class PHYSICS_PT_softbody(PhysicButtonsPanel): col.itemR(softbody, "gravity") col.itemR(softbody, "speed") +class PHYSICS_PT_softbody_cache(PhysicButtonsPanel): + __label__ = "Soft Body Cache" + __default_closed__ = True + + def poll(self, context): + return (context.soft_body) + + def draw(self, context): + layout = self.layout + + cache = context.soft_body.point_cache + + row = layout.row() + row.itemR(cache, "name") + + row = layout.row() + row.itemR(cache, "start_frame") + row.itemR(cache, "end_frame") + + row = layout.row() + + if cache.baked == True: + row.itemO("ptcache.free_bake_softbody", text="Free Bake") + else: + row.item_booleanO("ptcache.cache_softbody", "bake", True, text="Bake") + + sub = row.row() + sub.enabled = cache.frames_skipped or cache.outdated + sub.itemO("ptcache.cache_softbody", text="Calculate to Current Frame") + row = layout.row() + row.itemO("ptcache.bake_from_softbody_cache", text="Current Cache to Bake") + row.itemR(cache, "step"); + + row = layout.row() + row.itemR(cache, "quick_cache") + row.itemR(cache, "disk_cache") + + layout.itemL(text=cache.info) + + layout.itemS() + + row = layout.row() + row.itemO("ptcache.bake_all", "bake", True, text="Bake All Dynamics") + row.itemO("ptcache.free_bake_all", text="Free All Bakes") + layout.itemO("ptcache.bake_all", text="Update All Dynamics to current frame") + class PHYSICS_PT_softbody_goal(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_softbody_goal" __label__ = "Soft Body Goal" def poll(self, context): - return (context.soft_body != None) + return (context.soft_body) def draw_header(self, context): layout = self.layout + softbody = context.soft_body.settings layout.itemR(softbody, "use_goal", text="") def draw(self, context): layout = self.layout + md = context.soft_body ob = context.object @@ -82,35 +130,35 @@ class PHYSICS_PT_softbody_goal(PhysicButtonsPanel): col = split.column() col.itemL(text="Goal Strengths:") col.itemR(softbody, "goal_default", text="Default") - subcol = col.column(align=True) - subcol.itemR(softbody, "goal_min", text="Minimum") - subcol.itemR(softbody, "goal_max", text="Maximum") + sub = col.column(align=True) + sub.itemR(softbody, "goal_min", text="Minimum") + sub.itemR(softbody, "goal_max", text="Maximum") col = split.column() col.itemL(text="Goal Settings:") col.itemR(softbody, "goal_spring", text="Stiffness") col.itemR(softbody, "goal_friction", text="Damping") + layout.item_pointerR(softbody, "goal_vertex_group", ob, "vertex_groups", text="Vertex Group") class PHYSICS_PT_softbody_edge(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_softbody_edge" __label__ = "Soft Body Edges" def poll(self, context): - return (context.soft_body != None) + return (context.soft_body) def draw_header(self, context): layout = self.layout + softbody = context.soft_body.settings layout.itemR(softbody, "use_edges", text="") def draw(self, context): layout = self.layout + md = context.soft_body ob = context.object - - split = layout.split() if md: softbody = md.settings @@ -130,43 +178,43 @@ class PHYSICS_PT_softbody_edge(PhysicButtonsPanel): col = split.column() col.itemR(softbody, "stiff_quads") - subcol = col.column() - subcol.active = softbody.stiff_quads - subcol.itemR(softbody, "shear") + sub = col.column() + sub.active = softbody.stiff_quads + sub.itemR(softbody, "shear") col.itemR(softbody, "new_aero", text="Aero") - subcol = col.column() - subcol.enabled = softbody.new_aero - subcol.itemR(softbody, "aero", text="Factor") + sub = col.column() + sub.enabled = softbody.new_aero + sub.itemR(softbody, "aero", text="Factor") col.itemL(text="Collision:") col.itemR(softbody, "edge_collision", text="Edge") col.itemR(softbody, "face_collision", text="Face") class PHYSICS_PT_softbody_collision(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_softbody_collision" __label__ = "Soft Body Collision" def poll(self, context): - return (context.soft_body != None) + return (context.soft_body) def draw_header(self, context): layout = self.layout + softbody = context.soft_body.settings layout.itemR(softbody, "self_collision", text="") def draw(self, context): layout = self.layout + md = context.soft_body ob = context.object - - split = layout.split() if md: softbody = md.settings layout.active = softbody.self_collision + layout.itemL(text="Collision Type:") layout.itemR(softbody, "collision_type", expand=True) @@ -177,19 +225,17 @@ class PHYSICS_PT_softbody_collision(PhysicButtonsPanel): col.itemR(softbody, "ball_damp", text="Dampening") class PHYSICS_PT_softbody_solver(PhysicButtonsPanel): - __idname__ = "PHYSICS_PT_softbody_solver" __label__ = "Soft Body Solver" def poll(self, context): - return (context.soft_body != None) + return (context.soft_body) def draw(self, context): layout = self.layout + md = context.soft_body ob = context.object - - split = layout.split() - + if md: softbody = md.settings @@ -204,7 +250,6 @@ class PHYSICS_PT_softbody_solver(PhysicButtonsPanel): col = split.column() col.itemR(softbody, "error_limit") - col.itemL(text="Helpers:") col.itemR(softbody, "choke") col.itemR(softbody, "fuzzy") @@ -213,6 +258,7 @@ class PHYSICS_PT_softbody_solver(PhysicButtonsPanel): layout.itemR(softbody, "diagnose") bpy.types.register(PHYSICS_PT_softbody) +bpy.types.register(PHYSICS_PT_softbody_cache) bpy.types.register(PHYSICS_PT_softbody_goal) bpy.types.register(PHYSICS_PT_softbody_edge) bpy.types.register(PHYSICS_PT_softbody_collision) diff --git a/release/ui/buttons_scene.py b/release/ui/buttons_scene.py index 45bf8b48788..2d8dc0eab33 100644 --- a/release/ui/buttons_scene.py +++ b/release/ui/buttons_scene.py @@ -1,32 +1,45 @@ import bpy +# If python version is less than 2.4, try to get set stuff from module +try: + set +except: + from sets import Set as set + class RenderButtonsPanel(bpy.types.Panel): __space_type__ = "BUTTONS_WINDOW" __region_type__ = "WINDOW" __context__ = "scene" + # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here + + def poll(self, context): + rd = context.scene.render_data + return (rd.use_game_engine==False) and (rd.engine in self.COMPAT_ENGINES) -class RENDER_PT_render(RenderButtonsPanel): +class SCENE_PT_render(RenderButtonsPanel): __label__ = "Render" - + COMPAT_ENGINES = set(['BLENDER_RENDER']) + def draw(self, context): layout = self.layout + rd = context.scene.render_data row = layout.row() - row.itemO("screen.render", text="Image", icon='ICON_IMAGE_COL') - row.item_booleanO("screen.render", "anim", True, text="Animation", icon='ICON_SEQUENCE') + row.itemO("screen.render", text="Image", icon='ICON_RENDER_RESULT') + row.item_booleanO("screen.render", "animation", True, text="Animation", icon='ICON_RENDER_ANIMATION') layout.itemR(rd, "display_mode", text="Display") - if rd.multiple_engines: - layout.itemR(rd, "engine") -class RENDER_PT_layers(RenderButtonsPanel): +class SCENE_PT_layers(RenderButtonsPanel): __label__ = "Layers" __default_closed__ = True - + COMPAT_ENGINES = set(['BLENDER_RENDER']) + def draw(self, context): layout = self.layout + scene = context.scene rd = scene.render_data @@ -40,6 +53,7 @@ class RENDER_PT_layers(RenderButtonsPanel): rl = rd.layers[rd.active_layer_index] split = layout.split() + col = split.column() col.itemR(scene, "visible_layers", text="Scene") col = split.column() @@ -47,7 +61,10 @@ class RENDER_PT_layers(RenderButtonsPanel): layout.itemR(rl, "light_override", text="Light") layout.itemR(rl, "material_override", text="Material") - + + layout.itemS() + layout.itemL(text="Include:") + split = layout.split() col = split.column() @@ -71,8 +88,11 @@ class RENDER_PT_layers(RenderButtonsPanel): split = layout.split() split.itemL(text="Zmask Layers:") split.column().itemR(rl, "zmask_layers", text="") - + + layout.itemS() + split = layout.split() + col = split.column() col.itemL(text="Passes:") col.itemR(rl, "pass_combined") @@ -103,11 +123,13 @@ class RENDER_PT_layers(RenderButtonsPanel): row.itemR(rl, "pass_refraction") row.itemR(rl, "pass_refraction_exclude", text="", icon="ICON_X") -class RENDER_PT_shading(RenderButtonsPanel): +class SCENE_PT_shading(RenderButtonsPanel): __label__ = "Shading" + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw(self, context): layout = self.layout + rd = context.scene.render_data split = layout.split() @@ -123,12 +145,14 @@ class RENDER_PT_shading(RenderButtonsPanel): col.itemR(rd, "color_management") col.itemR(rd, "alpha_mode", text="Alpha") -class RENDER_PT_performance(RenderButtonsPanel): +class SCENE_PT_performance(RenderButtonsPanel): __label__ = "Performance" __default_closed__ = True + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw(self, context): layout = self.layout + rd = context.scene.render_data split = layout.split() @@ -136,41 +160,34 @@ class RENDER_PT_performance(RenderButtonsPanel): col = split.column(align=True) col.itemL(text="Threads:") col.row().itemR(rd, "threads_mode", expand=True) - colsub = col.column() - colsub.enabled = rd.threads_mode == 'THREADS_FIXED' - colsub.itemR(rd, "threads") - - col = split.column() - - sub = col.column(align=True) - sub.itemL(text="Tiles:") - sub.itemR(rd, "parts_x", text="X") - sub.itemR(rd, "parts_y", text="Y") - - split = layout.split() + sub = col.column() + sub.enabled = rd.threads_mode == 'THREADS_FIXED' + sub.itemR(rd, "threads") + col.itemL(text="Tiles:") + col.itemR(rd, "parts_x", text="X") + col.itemR(rd, "parts_y", text="Y") col = split.column() col.itemL(text="Memory:") - row = col.row() - row.itemR(rd, "save_buffers") - row.enabled = not rd.full_sample - - col = split.column() - col.itemL() - col.itemR(rd, "free_image_textures") - col.active = rd.use_compositing - - row = layout.row() - row.active = rd.render_raytracing - row.itemR(rd, "octree_resolution", text="Ray Tracing Octree") - - -class RENDER_PT_post_processing(RenderButtonsPanel): + sub = col.column() + sub.itemR(rd, "save_buffers") + sub.enabled = not rd.full_sample + sub = col.column() + sub.active = rd.use_compositing + sub.itemR(rd, "free_image_textures") + sub = col.column() + sub.active = rd.render_raytracing + sub.itemL(text="Ray Tracing Octree:") + sub.itemR(rd, "octree_resolution", text="") + +class SCENE_PT_post_processing(RenderButtonsPanel): __label__ = "Post Processing" __default_closed__ = True + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw(self, context): layout = self.layout + rd = context.scene.render_data split = layout.split() @@ -182,44 +199,46 @@ class RENDER_PT_post_processing(RenderButtonsPanel): col = split.column() row = col.row() row.itemR(rd, "fields", text="Fields") - rowsub = row.row() - rowsub.active = rd.fields - rowsub.itemR(rd, "fields_still", text="Still") - rowsub = col.row() - rowsub.active = rd.fields - rowsub.itemR(rd, "field_order", expand=True) + sub = row.row() + sub.active = rd.fields + sub.itemR(rd, "fields_still", text="Still") + sub = col.row() + sub.active = rd.fields + sub.itemR(rd, "field_order", expand=True) split = layout.split() split.itemL() split.itemR(rd, "dither_intensity", text="Dither", slider=True) -class RENDER_PT_output(RenderButtonsPanel): +class SCENE_PT_output(RenderButtonsPanel): __label__ = "Output" + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw(self, context): layout = self.layout + rd = context.scene.render_data layout.itemR(rd, "output_path", text="") split = layout.split() col = split.column() - col.itemR(rd, "placeholders") - col.itemR(rd, "no_overwrite") + col.itemR(rd, "file_format", text="") + col.row().itemR(rd, "color_mode", text="Color", expand=True) col = split.column() - col.itemR(rd, "file_format", text="") - col.itemR(rd, "file_extensions") + col.itemR(rd, "file_extensions") + col.itemR(rd, "placeholders") + col.itemR(rd, "no_overwrite") if rd.file_format in ('AVIJPEG', 'JPEG'): split = layout.split() - split.itemR(rd, "color_mode", text="Color") split.itemR(rd, "quality", slider=True) elif rd.file_format == 'OPENEXR': split = layout.split() + col = split.column() - col.itemR(rd, "color_mode", text="Color") col.itemR(rd, "exr_codec") subsplit = split.split() @@ -232,7 +251,6 @@ class RENDER_PT_output(RenderButtonsPanel): elif rd.file_format == 'JPEG2000': split = layout.split() col = split.column() - col.itemR(rd, "color_mode", text="Color") col.itemL(text="Depth:") col.row().itemR(rd, "jpeg_depth", expand=True) @@ -244,7 +262,6 @@ class RENDER_PT_output(RenderButtonsPanel): elif rd.file_format in ('CINEON', 'DPX'): split = layout.split() col = split.column() - col.itemR(rd, "color_mode", text="Color") col.itemR(rd, "cineon_log", text="Convert to Log") col = split.column(align=True) @@ -255,17 +272,12 @@ class RENDER_PT_output(RenderButtonsPanel): elif rd.file_format == 'TIFF': split = layout.split() - split.itemR(rd, "color_mode", text="Color") split.itemR(rd, "tiff_bit") - - else: - split = layout.split() - split.itemR(rd, "color_mode", text="Color") - split.itemL() -class RENDER_PT_encoding(RenderButtonsPanel): +class SCENE_PT_encoding(RenderButtonsPanel): __label__ = "Encoding" __default_closed__ = True + COMPAT_ENGINES = set(['BLENDER_RENDER']) def poll(self, context): rd = context.scene.render_data @@ -273,9 +285,11 @@ class RENDER_PT_encoding(RenderButtonsPanel): def draw(self, context): layout = self.layout + rd = context.scene.render_data split = layout.split() + split.itemR(rd, "ffmpeg_format") if rd.ffmpeg_format in ('AVI', 'QUICKTIME', 'MKV', 'OGG'): split.itemR(rd, "ffmpeg_codec") @@ -310,17 +324,20 @@ class RENDER_PT_encoding(RenderButtonsPanel): col = split.column() col.itemR(rd, "ffmpeg_multiplex_audio") -class RENDER_PT_antialiasing(RenderButtonsPanel): +class SCENE_PT_antialiasing(RenderButtonsPanel): __label__ = "Anti-Aliasing" + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw_header(self, context): layout = self.layout + rd = context.scene.render_data layout.itemR(rd, "antialiasing", text="") def draw(self, context): layout = self.layout + rd = context.scene.render_data layout.active = rd.antialiasing @@ -335,8 +352,9 @@ class RENDER_PT_antialiasing(RenderButtonsPanel): col.itemR(rd, "pixel_filter", text="") col.itemR(rd, "filter_size", text="Size", slider=True) -class RENDER_PT_dimensions(RenderButtonsPanel): +class SCENE_PT_dimensions(RenderButtonsPanel): __label__ = "Dimensions" + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw(self, context): layout = self.layout @@ -373,18 +391,21 @@ class RENDER_PT_dimensions(RenderButtonsPanel): col.itemR(rd, "fps") col.itemR(rd, "fps_base",text="/") -class RENDER_PT_stamp(RenderButtonsPanel): +class SCENE_PT_stamp(RenderButtonsPanel): __label__ = "Stamp" __default_closed__ = True + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw_header(self, context): + layout = self.layout + rd = context.scene.render_data - layout = self.layout layout.itemR(rd, "render_stamp", text="") def draw(self, context): layout = self.layout + rd = context.scene.render_data layout.active = rd.render_stamp @@ -401,26 +422,25 @@ class RENDER_PT_stamp(RenderButtonsPanel): col.itemR(rd, "stamp_marker", text="Marker") col.itemR(rd, "stamp_sequence_strip", text="Seq. Strip") - sub = split.column() - sub.active = rd.render_stamp - sub.itemR(rd, "stamp_foreground", slider=True) - sub.itemR(rd, "stamp_background", slider=True) - sub.itemR(rd, "stamp_font_size", text="Font Size") + col = split.column() + col.active = rd.render_stamp + col.itemR(rd, "stamp_foreground", slider=True) + col.itemR(rd, "stamp_background", slider=True) + col.itemR(rd, "stamp_font_size", text="Font Size") row = layout.split(percentage=0.2) row.itemR(rd, "stamp_note", text="Note") - rowsub = row.row() - rowsub.active = rd.stamp_note - rowsub.itemR(rd, "stamp_note_text", text="") - -bpy.types.register(RENDER_PT_render) -bpy.types.register(RENDER_PT_layers) -bpy.types.register(RENDER_PT_dimensions) -bpy.types.register(RENDER_PT_antialiasing) -bpy.types.register(RENDER_PT_shading) -bpy.types.register(RENDER_PT_output) -bpy.types.register(RENDER_PT_encoding) -bpy.types.register(RENDER_PT_performance) -bpy.types.register(RENDER_PT_post_processing) -bpy.types.register(RENDER_PT_stamp) - + sub = row.row() + sub.active = rd.stamp_note + sub.itemR(rd, "stamp_note_text", text="") + +bpy.types.register(SCENE_PT_render) +bpy.types.register(SCENE_PT_layers) +bpy.types.register(SCENE_PT_dimensions) +bpy.types.register(SCENE_PT_antialiasing) +bpy.types.register(SCENE_PT_shading) +bpy.types.register(SCENE_PT_output) +bpy.types.register(SCENE_PT_encoding) +bpy.types.register(SCENE_PT_performance) +bpy.types.register(SCENE_PT_post_processing) +bpy.types.register(SCENE_PT_stamp) diff --git a/release/ui/buttons_texture.py b/release/ui/buttons_texture.py index d86cec17d01..5b1269c982c 100644 --- a/release/ui/buttons_texture.py +++ b/release/ui/buttons_texture.py @@ -19,6 +19,7 @@ class TEXTURE_PT_preview(TextureButtonsPanel): ma = context.material la = context.lamp wo = context.world + br = context.brush if ma: layout.template_preview(tex, parent=ma) @@ -26,15 +27,17 @@ class TEXTURE_PT_preview(TextureButtonsPanel): layout.template_preview(tex, parent=la) elif wo: layout.template_preview(tex, parent=wo) + elif br: + layout.template_preview(tex, parent=br) else: layout.template_preview(tex) class TEXTURE_PT_context_texture(TextureButtonsPanel): __idname__= "TEXTURE_PT_context_texture" - __no_header__ = True + __show_header__ = False def poll(self, context): - return (context.material or context.world or context.lamp or context.texture) + return (context.material or context.world or context.lamp or context.brush or context.texture) def draw(self, context): layout = self.layout @@ -43,32 +46,38 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel): ma = context.material la = context.lamp wo = context.world + br = context.brush space = context.space_data - slot = context.texture_slot - if ma or la or wo: - row = layout.row() - if ma: - row.template_list(ma, "textures", ma, "active_texture_index", type="ICONS") - elif la: - row.template_list(la, "textures", la, "active_texture_index", type="ICONS") - elif wo: - row.template_list(wo, "textures", wo, "active_texture_index", type="ICONS") + if ma: + id = ma + elif la: + id = la + elif wo: + id = wo + elif br: + id = br + else: + id = None + if id: + row = layout.row() + row.template_list(id, "textures", id, "active_texture_index", rows=2) + split = layout.split(percentage=0.65) - if ma or la or wo: - if slot: - split.template_ID(slot, "texture", new="texture.new") - else: - split.itemS() - + if id: + split.template_ID(id, "active_texture", new="texture.new") elif tex: split.template_ID(space, "pin_id") - split.itemS() - - layout.itemS() + + if not space.pin_id and \ + (context.sculpt_object or context.vertex_paint_object or \ + context.weight_paint_object or context.texture_paint_object): + split.itemR(space, "brush_texture", text="Brush", toggle=True) + layout.itemS() + if tex: split = layout.split(percentage=0.2) @@ -89,32 +98,34 @@ class TEXTURE_PT_mapping(TextureButtonsPanel): ma = context.material la = context.lamp wo = context.world + br = context.brush tex = context.texture_slot textype = context.texture - split = layout.split(percentage=0.3) - col = split.column() - col.itemL(text="Coordinates:") - col = split.column() - col.itemR(tex, "texture_coordinates", text="") - - if tex.texture_coordinates == 'ORCO': - """ - ob = context.object - if ob and ob.type == 'MESH': - split = layout.split(percentage=0.3) - split.itemL(text="Mesh:") - split.itemR(ob.data, "texco_mesh", text="") - """ - elif tex.texture_coordinates == 'UV': + if not br: split = layout.split(percentage=0.3) - split.itemL(text="Layer:") - split.itemR(tex, "uv_layer", text="") - elif tex.texture_coordinates == 'OBJECT': - split = layout.split(percentage=0.3) - split.itemL(text="Object:") - split.itemR(tex, "object", text="") - + col = split.column() + col.itemL(text="Coordinates:") + col = split.column() + col.itemR(tex, "texture_coordinates", text="") + + if tex.texture_coordinates == 'ORCO': + """ + ob = context.object + if ob and ob.type == 'MESH': + split = layout.split(percentage=0.3) + split.itemL(text="Mesh:") + split.itemR(ob.data, "texco_mesh", text="") + """ + elif tex.texture_coordinates == 'UV': + split = layout.split(percentage=0.3) + split.itemL(text="Layer:") + split.itemR(tex, "uv_layer", text="") + elif tex.texture_coordinates == 'OBJECT': + split = layout.split(percentage=0.3) + split.itemL(text="Object:") + split.itemR(tex, "object", text="") + if ma: split = layout.split(percentage=0.3) col = split.column() @@ -147,7 +158,7 @@ class TEXTURE_PT_influence(TextureButtonsPanel): __label__ = "Influence" def poll(self, context): - return (context.texture_slot and context.texture and context.texture.type != 'NONE') + return (context.texture_slot and context.texture and context.texture.type != 'NONE' and (not context.brush)) def draw(self, context): layout = self.layout @@ -155,6 +166,7 @@ class TEXTURE_PT_influence(TextureButtonsPanel): ma = context.material la = context.lamp wo = context.world + br = context.brush textype = context.texture tex = context.texture_slot diff --git a/release/ui/buttons_world.py b/release/ui/buttons_world.py index 6e233f86765..e44d7102511 100644 --- a/release/ui/buttons_world.py +++ b/release/ui/buttons_world.py @@ -1,17 +1,26 @@ import bpy +# If python version is less than 2.4, try to get set stuff from module +try: + set +except: + from sets import Set as set + class WorldButtonsPanel(bpy.types.Panel): __space_type__ = "BUTTONS_WINDOW" __region_type__ = "WINDOW" __context__ = "world" - + # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here + def poll(self, context): - return (context.world != None) + rd = context.scene.render_data + return (context.world != None) and (not rd.use_game_engine) and (rd.engine in self.COMPAT_ENGINES) class WORLD_PT_preview(WorldButtonsPanel): __label__ = "Preview" - + COMPAT_ENGINES = set(['BLENDER_RENDER']) + def draw(self, context): layout = self.layout world = context.world @@ -19,10 +28,12 @@ class WORLD_PT_preview(WorldButtonsPanel): layout.template_preview(world) class WORLD_PT_context_world(WorldButtonsPanel): - __no_header__ = True + __show_header__ = False + COMPAT_ENGINES = set(['BLENDER_RENDER']) def poll(self, context): - return (context.scene != None) + rd = context.scene.render_data + return (not rd.use_game_engine) and (rd.engine in self.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -40,6 +51,7 @@ class WORLD_PT_context_world(WorldButtonsPanel): class WORLD_PT_world(WorldButtonsPanel): __label__ = "World" + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw(self, context): layout = self.layout @@ -60,19 +72,9 @@ class WORLD_PT_world(WorldButtonsPanel): col.active = world.blend_sky row.column().itemR(world, "ambient_color") -class WORLD_PT_color_correction(WorldButtonsPanel): - __label__ = "Color Correction" - - def draw(self, context): - layout = self.layout - world = context.world - - row = layout.row() - row.itemR(world, "exposure") - row.itemR(world, "range") - class WORLD_PT_mist(WorldButtonsPanel): __label__ = "Mist" + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw_header(self, context): layout = self.layout @@ -90,13 +92,13 @@ class WORLD_PT_mist(WorldButtonsPanel): flow.itemR(world.mist, "start") flow.itemR(world.mist, "depth") flow.itemR(world.mist, "height") - flow.itemR(world.mist, "intensity") - col = layout.column() - col.itemL(text="Fallof:") - col.row().itemR(world.mist, "falloff", expand=True) + flow.itemR(world.mist, "intensity", slider=True) + + layout.itemR(world.mist, "falloff") class WORLD_PT_stars(WorldButtonsPanel): __label__ = "Stars" + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw_header(self, context): layout = self.layout @@ -112,12 +114,13 @@ class WORLD_PT_stars(WorldButtonsPanel): flow = layout.column_flow() flow.itemR(world.stars, "size") + flow.itemR(world.stars, "color_randomization", text="Colors") flow.itemR(world.stars, "min_distance", text="Min. Dist") flow.itemR(world.stars, "average_separation", text="Separation") - flow.itemR(world.stars, "color_randomization", text="Random") class WORLD_PT_ambient_occlusion(WorldButtonsPanel): __label__ = "Ambient Occlusion" + COMPAT_ENGINES = set(['BLENDER_RENDER']) def draw_header(self, context): layout = self.layout @@ -132,49 +135,55 @@ class WORLD_PT_ambient_occlusion(WorldButtonsPanel): layout.active = ao.enabled layout.itemR(ao, "gather_method", expand=True) + + split = layout.split() + col = split.column() + col.itemL(text="Attenuation:") + col.itemR(ao, "distance") + col.itemR(ao, "falloff") + sub = col.row() + sub.active = ao.falloff + sub.itemR(ao, "falloff_strength", text="Strength") + if ao.gather_method == 'RAYTRACE': - split = layout.split() - col = split.column() - col.itemR(ao, "samples") - col.itemR(ao, "distance") - col = split.column() - col.itemR(ao, "falloff") - colsub = col.column() - colsub.active = ao.falloff - colsub.itemR(ao, "strength") - - layout.itemR(ao, "sample_method") + col.itemL(text="Sampling:") + col.itemR(ao, "sample_method", text="") + + sub = col.column(align=True) + sub.itemR(ao, "samples") + if ao.sample_method == 'ADAPTIVE_QMC': - row = layout.row() - row.itemR(ao, "threshold") - row.itemR(ao, "adapt_to_speed") - - if ao.sample_method == 'CONSTANT_JITTERED': - row = layout.row() - row.itemR(ao, "bias") + sub.itemR(ao, "threshold") + sub.itemR(ao, "adapt_to_speed") + elif ao.sample_method == 'CONSTANT_JITTERED': + sub.itemR(ao, "bias") if ao.gather_method == 'APPROXIMATE': - split = layout.split() - col = split.column() - col.itemR(ao, "passes") + + col.itemL(text="Sampling:") col.itemR(ao, "error_tolerance", text="Error") + col.itemR(ao, "pixel_cache") col.itemR(ao, "correction") - col = split.column() - col.itemR(ao, "falloff") - colsub = col.column() - colsub.active = ao.falloff - colsub.itemR(ao, "strength") - col.itemR(ao, "pixel_cache") - col = layout.column() + col.itemL(text="Influence:") + col.row().itemR(ao, "blend_mode", expand=True) - col.row().itemR(ao, "color", expand=True) + + split = layout.split() + + col = split.column() col.itemR(ao, "energy") + + col = split.column() + colsub = col.split(percentage=0.3) + colsub.itemL(text="Color:") + colsub.itemR(ao, "color", text="") + bpy.types.register(WORLD_PT_context_world) bpy.types.register(WORLD_PT_preview) @@ -182,4 +191,4 @@ bpy.types.register(WORLD_PT_world) bpy.types.register(WORLD_PT_ambient_occlusion) bpy.types.register(WORLD_PT_mist) bpy.types.register(WORLD_PT_stars) -bpy.types.register(WORLD_PT_color_correction) + diff --git a/release/ui/space_buttons.py b/release/ui/space_buttons.py index cae9a813433..b444913809d 100644 --- a/release/ui/space_buttons.py +++ b/release/ui/space_buttons.py @@ -3,7 +3,6 @@ import bpy class Buttons_HT_header(bpy.types.Header): __space_type__ = "BUTTONS_WINDOW" - __idname__ = "BUTTONS_HT_header" def draw(self, context): layout = self.layout diff --git a/release/ui/space_console.py b/release/ui/space_console.py index 0c495ccef8a..8814553e55f 100644 --- a/release/ui/space_console.py +++ b/release/ui/space_console.py @@ -6,7 +6,6 @@ del bpy_ops class CONSOLE_HT_header(bpy.types.Header): __space_type__ = "CONSOLE" - __idname__ = "CONSOLE_HT_header" def draw(self, context): sc = context.space_data @@ -18,7 +17,7 @@ class CONSOLE_HT_header(bpy.types.Header): row = layout.row() row.itemR(sc, "console_type", expand=True) - if sc.type == 'REPORT': + if sc.console_type == 'REPORT': if context.area.show_menus: row = layout.row() @@ -50,6 +49,8 @@ class CONSOLE_MT_console(bpy.types.Menu): layout.column() layout.itemO("console.clear") + layout.itemO("console.copy") + layout.itemO("console.paste") class CONSOLE_MT_report(bpy.types.Menu): __space_type__ = "CONSOLE" @@ -182,7 +183,7 @@ class CONSOLE_OT_exec(bpy.types.Operator): else: sc.prompt = self.PROMPT # insert a new blank line - bpy.ops.console.history_append(text="", current_character=0) + bpy.ops.console.history_append(text="", current_character=0, remove_duplicates= True) # Insert the output into the editor # not quite correct because the order might have changed, but ok 99% of the time. @@ -416,7 +417,7 @@ class CONSOLE_OT_autocomplete(bpy.types.Operator): if not console: return ('CANCELLED',) - if sc.type != 'PYTHON': + if sc.console_type != 'PYTHON': return ('CANCELLED',) # fake cursor, use for autocomp func. diff --git a/release/ui/space_filebrowser.py b/release/ui/space_filebrowser.py index b0aaae8f0a5..0fecbdbfbba 100644 --- a/release/ui/space_filebrowser.py +++ b/release/ui/space_filebrowser.py @@ -4,7 +4,6 @@ import bpy class FILEBROWSER_HT_header(bpy.types.Header): __space_type__ = "FILE_BROWSER" - __idname__ = "FILEBROWSER_HT_header" def draw(self, context): st = context.space_data @@ -12,18 +11,16 @@ class FILEBROWSER_HT_header(bpy.types.Header): params = st.params layout.template_header() - - if context.area.show_menus: - row = layout.row() - row.itemM("FILEBROWSER_MT_directory") - row.itemM("FILEBROWSER_MT_bookmarks") - + row = layout.row(align=True) row.itemO("file.parent", text="", icon='ICON_FILE_PARENT') row.itemO("file.refresh", text="", icon='ICON_FILE_REFRESH') row.itemO("file.previous", text="", icon='ICON_PREV_KEYFRAME') row.itemO("file.next", text="", icon='ICON_NEXT_KEYFRAME') + row = layout.row(align=True) + row.itemO("file.directory_new", text="", icon='ICON_NEWFOLDER') + layout.itemR(params, "display", expand=True, text="") layout.itemR(params, "sort", expand=True, text="") @@ -42,26 +39,5 @@ class FILEBROWSER_HT_header(bpy.types.Header): row.active = params.do_filter -class FILEBROWSER_MT_directory(bpy.types.Menu): - __space_type__ = "FILE_BROWSER" - __label__ = "Directory" - - def draw(self, context): - layout = self.layout - - layout.itemO("file.refresh", text="Refresh", icon='ICON_FILE_REFRESH') - layout.itemO("file.parent", text="Parent", icon='ICON_FILE_PARENT') - -class FILEBROWSER_MT_bookmarks(bpy.types.Menu): - __space_type__ = "FILE_BROWSER" - __label__ = "Bookmarks" - - def draw(self, context): - layout = self.layout - - layout.itemO("file.add_bookmark", text="Add current directory", icon='ICON_BOOKMARKS') - bpy.types.register(FILEBROWSER_HT_header) -bpy.types.register(FILEBROWSER_MT_directory) -bpy.types.register(FILEBROWSER_MT_bookmarks) diff --git a/release/ui/space_image.py b/release/ui/space_image.py index cdb22fb0442..eeac19c04e0 100644 --- a/release/ui/space_image.py +++ b/release/ui/space_image.py @@ -32,7 +32,7 @@ class IMAGE_MT_view(bpy.types.Menu): for a, b in ratios: text = "Zoom %d:%d" % (a, b) - layout.item_floatO("image.view_zoom_ratio", "ratio", a/b, text=text) + layout.item_floatO("image.view_zoom_ratio", "ratio", a/float(b), text=text) layout.itemS() @@ -225,34 +225,6 @@ class IMAGE_HT_header(bpy.types.Header): layout.template_ID(sima, "image", new="image.new") - """ - /* image select */ - - pinflag= (show_render)? 0: UI_ID_PIN; - xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)sima->image, ID_IM, &sima->pin, xco, yco, - sima_idpoin_handle, UI_ID_BROWSE|UI_ID_BROWSE_RENDER|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_DELETE|pinflag); - xco += 8; - """ - - """ - if(ima && !ELEM3(ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE, IMA_SRC_VIEWER) && ima->ok) { - /* XXX this should not be a static var */ - static int headerbuttons_packdummy; - - headerbuttons_packdummy = 0; - - if (ima->packedfile) { - headerbuttons_packdummy = 1; - } - if (ima->packedfile && ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) - uiDefIconButBitI(block, TOG, 1, 0 /* XXX B_SIMA_REPACK */, ICON_UGLYPACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Re-Pack this image as PNG"); - else - uiDefIconButBitI(block, TOG, 1, 0 /* XXX B_SIMAPACKIMA */, ICON_PACKAGE, xco,yco,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Pack/Unpack this image"); - - xco+= XIC+8; - } - """ - # uv editing if show_uvedit: uvedit = sima.uv_editor @@ -294,7 +266,8 @@ class IMAGE_HT_header(bpy.types.Header): if ima.type == "COMPOSITE" and ima.source in ("MOVIE", "SEQUENCE"): row.itemO("image.play_composite", icon="ICON_PLAY") - layout.itemR(sima, "update_automatically", text="") + if show_uvedit or sima.image_painting: + layout.itemR(sima, "update_automatically", text="") class IMAGE_PT_game_properties(bpy.types.Panel): __space_type__ = "IMAGE_EDITOR" @@ -302,8 +275,9 @@ class IMAGE_PT_game_properties(bpy.types.Panel): __label__ = "Game Properties" def poll(self, context): + rd = context.scene.render_data sima = context.space_data - return (sima and sima.image) + return (sima and sima.image) and (rd.engine == 'BLENDER_GAME') def draw(self, context): sima = context.space_data diff --git a/release/ui/space_info.py b/release/ui/space_info.py index 55ce80e857f..855ce0b4f8f 100644 --- a/release/ui/space_info.py +++ b/release/ui/space_info.py @@ -3,10 +3,10 @@ import bpy class INFO_HT_header(bpy.types.Header): __space_type__ = "USER_PREFERENCES" - __idname__ = "INFO_HT_header" def draw(self, context): st = context.space_data + rd = context.scene.render_data layout = self.layout layout.template_header() @@ -15,14 +15,18 @@ class INFO_HT_header(bpy.types.Header): row = layout.row() row.itemM("INFO_MT_file") row.itemM("INFO_MT_add") - row.itemM("INFO_MT_timeline") - row.itemM("INFO_MT_game") - row.itemM("INFO_MT_render") + if rd.use_game_engine: + row.itemM("INFO_MT_game") + else: + row.itemM("INFO_MT_render") row.itemM("INFO_MT_help") layout.template_ID(context.window, "screen") #, new="screen.new", open="scene.unlink") layout.template_ID(context.screen, "scene") #, new="screen.new", unlink="scene.unlink") + if rd.multiple_engines: + layout.itemR(rd, "engine", text="") + layout.itemS() layout.template_operator_search() @@ -36,21 +40,50 @@ class INFO_MT_file(bpy.types.Menu): layout = self.layout layout.operator_context = "EXEC_AREA" - layout.itemO("wm.read_homefile") + layout.itemO("wm.read_homefile", text="New") layout.operator_context = "INVOKE_AREA" - layout.itemO("wm.open_mainfile") + layout.itemO("wm.open_mainfile", text="Open...") + layout.item_menu_enumO("wm.open_recentfile", "file", text="Open Recent") + layout.itemO("wm.recover_last_session") layout.itemS() layout.operator_context = "EXEC_AREA" - layout.itemO("wm.save_mainfile") + layout.itemO("wm.save_mainfile", text="Save") layout.operator_context = "INVOKE_AREA" - layout.itemO("wm.save_as_mainfile") + layout.itemO("wm.save_as_mainfile", text="Save As...") + layout.itemO("screen.userpref_show", text="User Preferences...") + + layout.itemS() + + layout.itemM("INFO_MT_file_import") + layout.itemM("INFO_MT_file_export") layout.itemS() layout.itemM("INFO_MT_file_external_data") + layout.itemS() + + layout.operator_context = "EXEC_AREA" + layout.itemO("wm.exit_blender", text="Quit") + +class INFO_MT_file_import(bpy.types.Menu): + __space_type__ = "USER_PREFERENCES" + __label__ = "Import" + + def draw(self, context): + layout = self.layout + +class INFO_MT_file_export(bpy.types.Menu): + __space_type__ = "USER_PREFERENCES" + __label__ = "Export" + + def draw(self, context): + layout = self.layout + + layout.itemO("export.ply", text="PLY") + class INFO_MT_file_external_data(bpy.types.Menu): __space_type__ = "USER_PREFERENCES" __label__ = "External Data" @@ -74,15 +107,25 @@ class INFO_MT_add(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.itemL(text="Nothing yet") -class INFO_MT_timeline(bpy.types.Menu): - __space_type__ = "USER_PREFERENCES" - __label__ = "Timeline" + layout.operator_context = "EXEC_SCREEN" - def draw(self, context): - layout = self.layout - layout.itemL(text="Nothing yet") + layout.item_menu_enumO( "OBJECT_OT_mesh_add", "type", text="Mesh", icon="ICON_OUTLINER_OB_MESH") + layout.item_menu_enumO( "OBJECT_OT_curve_add", "type", text="Curve", icon="ICON_OUTLINER_OB_CURVE") + layout.item_menu_enumO( "OBJECT_OT_surface_add", "type", text="Surface", icon="ICON_OUTLINER_OB_SURFACE") + layout.item_menu_enumO( "OBJECT_OT_metaball_add", "type", "META", icon="ICON_OUTLINER_OB_META") + layout.itemO("OBJECT_OT_text_add", text="Text", icon="ICON_OUTLINER_OB_FONT") + + layout.itemS() + + layout.itemO("OBJECT_OT_armature_add", text="Armature", icon="ICON_OUTLINER_OB_ARMATURE") + layout.item_enumO("OBJECT_OT_object_add", "type", "LATTICE", icon="ICON_OUTLINER_OB_LATTICE") + layout.item_enumO("OBJECT_OT_object_add", "type", "EMPTY", icon="ICON_OUTLINER_OB_EMPTY") + + layout.itemS() + + layout.item_enumO("OBJECT_OT_object_add", "type", "CAMERA", icon="ICON_OUTLINER_OB_CAMERA") + layout.item_enumO("OBJECT_OT_object_add", "type", "LAMP", icon="ICON_OUTLINER_OB_LAMP") class INFO_MT_game(bpy.types.Menu): __space_type__ = "USER_PREFERENCES" @@ -90,7 +133,8 @@ class INFO_MT_game(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.itemL(text="Nothing yet") + + layout.itemO("view3d.game_start") class INFO_MT_render(bpy.types.Menu): __space_type__ = "USER_PREFERENCES" @@ -98,7 +142,14 @@ class INFO_MT_render(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.itemL(text="Nothing yet") + rd = context.scene.render_data + + layout.itemO("screen.render", text="Render Image") + layout.item_booleanO("screen.render", "animation", True, text="Render Animation") + + layout.itemS() + + layout.itemO("screen.render_view_show") class INFO_MT_help(bpy.types.Menu): __space_type__ = "USER_PREFERENCES" @@ -106,11 +157,20 @@ class INFO_MT_help(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.itemL(text="Nothing yet") + + layout.itemO("help.manual") + layout.itemO("help.release_logs") + + layout.itemS() + + layout.itemO("help.blender_website") + layout.itemO("help.blender_eshop") + layout.itemO("help.developer_community") + layout.itemO("help.user_community") class INFO_PT_tabs(bpy.types.Panel): __space_type__ = "USER_PREFERENCES" - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout @@ -121,7 +181,7 @@ class INFO_PT_tabs(bpy.types.Panel): class INFO_PT_view(bpy.types.Panel): __space_type__ = "USER_PREFERENCES" __label__ = "View" - __no_header__ = True + __show_header__ = False def poll(self, context): userpref = context.user_preferences @@ -134,7 +194,7 @@ class INFO_PT_view(bpy.types.Panel): split = layout.split() col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() colsplitcol.itemL(text="Display:") colsplitcol.itemR(view, "tooltips") @@ -159,7 +219,7 @@ class INFO_PT_view(bpy.types.Panel): col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() colsplitcol.itemL(text="View Manipulation:") colsplitcol.itemR(view, "auto_depth") @@ -180,7 +240,7 @@ class INFO_PT_view(bpy.types.Panel): colsplitcol.itemR(view, "ndof_rotate_speed", text="Orbit Speed") col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() colsplitcol.itemL(text="Mouse Buttons:") colsplitcol.itemR(view, "left_mouse_button_select") @@ -203,7 +263,7 @@ class INFO_PT_view(bpy.types.Panel): col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() #manipulator colsplitcol.itemR(view, "use_manipulator") @@ -226,7 +286,7 @@ class INFO_PT_view(bpy.types.Panel): class INFO_PT_edit(bpy.types.Panel): __space_type__ = "USER_PREFERENCES" __label__ = "Edit" - __no_header__ = True + __show_header__ = False def poll(self, context): userpref = context.user_preferences @@ -240,7 +300,7 @@ class INFO_PT_edit(bpy.types.Panel): split = layout.split() col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() colsplitcol.itemL(text="Materials:") @@ -261,7 +321,7 @@ class INFO_PT_edit(bpy.types.Panel): colsplitcol.itemR(edit, "drag_immediately") col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() colsplitcol.itemL(text="Snap:") colsplitcol.itemR(edit, "snap_translate", text="Translate") @@ -280,7 +340,7 @@ class INFO_PT_edit(bpy.types.Panel): col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() colsplitcol.itemL(text="Keyframing:") @@ -306,7 +366,7 @@ class INFO_PT_edit(bpy.types.Panel): colsplitcol.itemS() col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() colsplitcol.itemL(text="Duplicate:") colsplitcol.itemR(edit, "duplicate_mesh", text="Mesh") @@ -324,7 +384,7 @@ class INFO_PT_edit(bpy.types.Panel): class INFO_PT_system(bpy.types.Panel): __space_type__ = "USER_PREFERENCES" __label__ = "System" - __no_header__ = True + __show_header__ = False def poll(self, context): userpref = context.user_preferences @@ -338,7 +398,7 @@ class INFO_PT_system(bpy.types.Panel): split = layout.split() col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() colsplitcol.itemR(system, "emulate_numpad") colsplitcol.itemS() @@ -346,7 +406,10 @@ class INFO_PT_system(bpy.types.Panel): #Weight Colors colsplitcol.itemL(text="Weight Colors:") colsplitcol.itemR(system, "use_weight_color_range", text="Use Custom Range") - colsplitcol.itemR(system, "weight_color_range") + + colsub = colsplitcol.column() + colsub.active = system.use_weight_color_range + colsub.template_color_ramp(system.weight_color_range, expand=True) colsplitcol.itemS() colsplitcol.itemS() @@ -356,7 +419,7 @@ class INFO_PT_system(bpy.types.Panel): colsplitcol.itemR(system, "memory_cache_limit") col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() #System colsplitcol.itemL(text="System:") @@ -368,26 +431,27 @@ class INFO_PT_system(bpy.types.Panel): colsplitcol.itemR(system, "filter_file_extensions") colsplitcol.itemR(system, "hide_dot_files_datablocks") colsplitcol.itemR(system, "audio_mixing_buffer") + colsplitcol.itemR(lan, "scrollback", text="Console Scrollback") col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.85) colsplitcol = colsplit.column() #OpenGL colsplitcol.itemL(text="OpenGL:") colsplitcol.itemR(system, "clip_alpha", slider=True) colsplitcol.itemR(system, "use_mipmaps") - colsplitcol.itemL(text="Windom Draw Method:") + colsplitcol.itemL(text="Window Draw Method:") row = colsplitcol.row() row.itemR(system, "window_draw_method", expand=True) colsplitcol.itemL(text="Textures:") - colsplitcol.itemR(system, "gl_texture_limit", text="Limit") + colsplitcol.itemR(system, "gl_texture_limit", text="Limit Size") colsplitcol.itemR(system, "texture_time_out", text="Time Out") colsplitcol.itemR(system, "texture_collection_rate", text="Collection Rate") class INFO_PT_filepaths(bpy.types.Panel): __space_type__ = "USER_PREFERENCES" __label__ = "File Paths" - __no_header__ = True + __show_header__ = False def poll(self, context): userpref = context.user_preferences @@ -400,51 +464,53 @@ class INFO_PT_filepaths(bpy.types.Panel): split = layout.split() col = split.column() - col.itemR(paths, "use_relative_paths") - col.itemR(paths, "compress_file") - col.itemR(paths, "fonts_directory") - col.itemR(paths, "textures_directory") - col.itemR(paths, "texture_plugin_directory") - col.itemR(paths, "sequence_plugin_directory") - col.itemR(paths, "render_output_directory") - col.itemR(paths, "python_scripts_directory") - col.itemR(paths, "sounds_directory") - col.itemR(paths, "temporary_directory") - -class INFO_PT_autosave(bpy.types.Panel): - __space_type__ = "USER_PREFERENCES" - __label__ = "Auto Save" - __no_header__ = True - - def poll(self, context): - userpref = context.user_preferences - return (userpref.active_section == 'AUTO_SAVE') - - def draw(self, context): - layout = self.layout - userpref = context.user_preferences - save = userpref.autosave + col.itemL(text="File Paths:") + splitcol = col.split(percentage=0.3) - split = layout.split() - col = split.column() - colsplit = col.split(percentage=0.8) - colsplitcol = colsplit.column() - colsplitcol.itemR(save, "save_version") - colsplitcol.itemR(save, "recent_files") - colsplitcol.itemR(save, "save_preview_images") + splitcol.itemL(text="Fonts:") + splitcol.itemR(paths, "fonts_directory", text="") + splitcol = col.split(percentage=0.3) + splitcol.itemL(text="Textures:") + splitcol.itemR(paths, "textures_directory", text="") + splitcol = col.split(percentage=0.3) + splitcol.itemL(text="Texture Plugins:") + splitcol.itemR(paths, "texture_plugin_directory", text="") + splitcol = col.split(percentage=0.3) + splitcol.itemL(text="Sequence Plugins:") + splitcol.itemR(paths, "sequence_plugin_directory", text="") + splitcol = col.split(percentage=0.3) + splitcol.itemL(text="Render Output:") + splitcol.itemR(paths, "render_output_directory", text="") + splitcol = col.split(percentage=0.3) + splitcol.itemL(text="Scripts:") + splitcol.itemR(paths, "python_scripts_directory", text="") + splitcol = col.split(percentage=0.3) + splitcol.itemL(text="Sounds:") + splitcol.itemR(paths, "sounds_directory", text="") + splitcol = col.split(percentage=0.3) + splitcol.itemL(text="Temp:") + splitcol.itemR(paths, "temporary_directory", text="") col = split.column() - colsplit = col.split(percentage=0.8) + colsplit = col.split(percentage=0.2) + colsplitcol = colsplit.column() colsplitcol = colsplit.column() - colsplitcol.itemR(save, "auto_save_temporary_files") + colsplitcol.itemL(text="Save & Load:") + colsplitcol.itemR(paths, "use_relative_paths") + colsplitcol.itemR(paths, "compress_file") + colsplitcol.itemL(text="Auto Save:") + colsplitcol.itemR(paths, "save_version") + colsplitcol.itemR(paths, "recent_files") + colsplitcol.itemR(paths, "save_preview_images") + colsplitcol.itemR(paths, "auto_save_temporary_files") colsub = colsplitcol.column() - colsub.enabled = save.auto_save_temporary_files - colsub.itemR(save, "auto_save_time") + colsub.enabled = paths.auto_save_temporary_files + colsub.itemR(paths, "auto_save_time") class INFO_PT_language(bpy.types.Panel): __space_type__ = "USER_PREFERENCES" __label__ = "Language" - __no_header__ = True + __show_header__ = False def poll(self, context): userpref = context.user_preferences @@ -467,7 +533,7 @@ class INFO_PT_language(bpy.types.Panel): class INFO_PT_bottombar(bpy.types.Panel): __space_type__ = "USER_PREFERENCES" __label__ = " " - __no_header__ = True + __show_header__ = False def draw(self, context): layout = self.layout @@ -475,14 +541,15 @@ class INFO_PT_bottombar(bpy.types.Panel): split = layout.split(percentage=0.8) split.itemL(text="") + layout.operator_context = "EXEC_AREA" split.itemO("wm.save_homefile", text="Save As Default") - bpy.types.register(INFO_HT_header) bpy.types.register(INFO_MT_file) +bpy.types.register(INFO_MT_file_import) +bpy.types.register(INFO_MT_file_export) bpy.types.register(INFO_MT_file_external_data) bpy.types.register(INFO_MT_add) -bpy.types.register(INFO_MT_timeline) bpy.types.register(INFO_MT_game) bpy.types.register(INFO_MT_render) bpy.types.register(INFO_MT_help) @@ -491,7 +558,60 @@ bpy.types.register(INFO_PT_view) bpy.types.register(INFO_PT_edit) bpy.types.register(INFO_PT_system) bpy.types.register(INFO_PT_filepaths) -bpy.types.register(INFO_PT_autosave) bpy.types.register(INFO_PT_language) bpy.types.register(INFO_PT_bottombar) +# Help operators + +import bpy_ops # XXX - should not need to do this +del bpy_ops + +class HelpOperator(bpy.types.Operator): + def execute(self, context): + try: import webbrowser + except: webbrowser = None + + if webbrowser: + webbrowser.open(self.__URL__) + else: + raise Exception("Operator requires a full Python installation") + + return ('FINISHED',) + +class HELP_OT_manual(HelpOperator): + __idname__ = "help.manual" + __label__ = "Manual" + __URL__ = 'http://wiki.blender.org/index.php/Manual' + +class HELP_OT_release_logs(HelpOperator): + __idname__ = "help.release_logs" + __label__ = "Release Logs" + __URL__ = 'http://www.blender.org/development/release-logs/' + +class HELP_OT_blender_website(HelpOperator): + __idname__ = "help.blender_website" + __label__ = "Blender Website" + __URL__ = 'http://www.blender.org/' + +class HELP_OT_blender_eshop(HelpOperator): + __idname__ = "help.blender_eshop" + __label__ = "Blender e-Shop" + __URL__ = 'http://www.blender3d.org/e-shop' + +class HELP_OT_developer_community(HelpOperator): + __idname__ = "help.developer_community" + __label__ = "Developer Community" + __URL__ = 'http://www.blender.org/community/get-involved/' + +class HELP_OT_user_community(HelpOperator): + __idname__ = "help.user_community" + __label__ = "User Community" + __URL__ = 'http://www.blender.org/community/user-community/' + +bpy.ops.add(HELP_OT_manual) +bpy.ops.add(HELP_OT_release_logs) +bpy.ops.add(HELP_OT_blender_website) +bpy.ops.add(HELP_OT_blender_eshop) +bpy.ops.add(HELP_OT_developer_community) +bpy.ops.add(HELP_OT_user_community) + diff --git a/release/ui/space_logic.py b/release/ui/space_logic.py index b19351bf779..728e5e6307b 100644 --- a/release/ui/space_logic.py +++ b/release/ui/space_logic.py @@ -21,142 +21,5 @@ class LOGIC_PT_properties(bpy.types.Panel): flow.itemR(prop, "value", text="") # we dont care about the type. rna will display correctly flow.itemR(prop, "debug") -""" -class WORLD_PT_game(WorldButtonsPanel): - __space_type__ = "LOGIC_EDITOR" - __region_type__ = "UI" - __label__ = "Game Settings" - - def draw(self, context): - layout = self.layout - world = context.world - - flow = layout.column_flow() - flow.itemR(world, "physics_engine") - flow.itemR(world, "physics_gravity") - - flow.itemR(world, "game_fps") - flow.itemR(world, "game_logic_step_max") - flow.itemR(world, "game_physics_substep") - flow.itemR(world, "game_physics_step_max") - - flow.itemR(world, "game_use_occlusion_culling", text="Enable Occlusion Culling") - flow.itemR(world, "game_occlusion_culling_resolution") -""" -class LOGIC_PT_player(bpy.types.Panel): - __space_type__ = "LOGIC_EDITOR" - __region_type__ = "UI" - __label__ = "Player" - - def draw(self, context): - layout = self.layout - gs = context.scene.game_data - row = layout.row() - row.itemR(gs, "fullscreen") - - split = layout.split() - col = split.column() - col.itemL(text="Resolution:") - colsub = col.column(align=True) - colsub.itemR(gs, "resolution_x", slider=False, text="X") - colsub.itemR(gs, "resolution_y", slider=False, text="Y") - - col = split.column() - col.itemL(text="Quality:") - colsub = col.column(align=True) - colsub.itemR(gs, "depth", text="Bit Depth", slider=False) - colsub.itemR(gs, "frequency", text="FPS", slider=False) - - - # framing: - col = layout.column() - col.itemL(text="Framing:") - col.row().itemR(gs, "framing_type", expand=True) - - colsub = col.column() - colsub.itemR(gs, "framing_color", text="") - -class LOGIC_PT_stereo(bpy.types.Panel): - __space_type__ = "LOGIC_EDITOR" - __region_type__ = "UI" - __label__ = "Stereo" - - def draw(self, context): - layout = self.layout - gs = context.scene.game_data - - - # stereo options: - col= layout.column() - row = col.row() - row.itemR(gs, "stereo", expand=True) - - stereo_mode = gs.stereo - - - # stereo: - if stereo_mode == 'STEREO': - - row = layout.row() - row.itemR(gs, "stereo_mode") - - # dome: - if stereo_mode == 'DOME': - row = layout.row() - row.itemR(gs, "dome_mode", text="Dome Type") - - split=layout.split() - col=split.column() - col.itemR(gs, "dome_angle", slider=True) - col.itemR(gs, "dome_tesselation", text="Tesselation") - col=split.column() - col.itemR(gs, "dome_tilt") - col.itemR(gs, "dome_buffer_resolution", text="Resolution", slider=True) - col=layout.column() - col.itemR(gs, "dome_text") - - -class LOGIC_PT_physics(bpy.types.Panel): - __space_type__ = "LOGIC_EDITOR" - __region_type__ = "UI" - __label__ = "World Physics" - - def draw(self, context): - layout = self.layout - gs = context.scene.game_data - flow = layout.column_flow() - flow.itemR(gs, "physics_engine") - if gs.physics_engine != "NONE": - flow.itemR(gs, "physics_gravity", text="Gravity") - - split = layout.split() - col = split.column() - col.itemL(text="Physics Steps:") - colsub = col.column(align=True) - colsub.itemR(gs, "physics_step_max", text="Max") - colsub.itemR(gs, "physics_step_sub", text="Substeps") - col.itemR(gs, "fps", text="FPS") - - col = split.column() - col.itemL(text="Logic Steps:") - col.itemR(gs, "logic_step_max", text="Max") - col.itemS() - col.itemR(gs, "use_occlusion_culling", text="Occlusion Culling") - colsub = col.column() - colsub.active = gs.use_occlusion_culling - colsub.itemR(gs, "occlusion_culling_resolution", text="Resolution") - - - else: - split = layout.split() - col = split.column() - col.itemL(text="Physics Steps:") - col.itemR(gs, "fps", text="FPS") - col = split.column() - col.itemL(text="Logic Steps:") - col.itemR(gs, "logic_step_max", text="Max") - bpy.types.register(LOGIC_PT_properties) -bpy.types.register(LOGIC_PT_player) -bpy.types.register(LOGIC_PT_stereo) -bpy.types.register(LOGIC_PT_physics)
\ No newline at end of file + diff --git a/release/ui/space_outliner.py b/release/ui/space_outliner.py index 545a001349b..5815acc7e12 100644 --- a/release/ui/space_outliner.py +++ b/release/ui/space_outliner.py @@ -3,7 +3,6 @@ import bpy class OUTLINER_HT_header(bpy.types.Header): __space_type__ = "OUTLINER" - __idname__ = "OUTLINER_HT_header" def draw(self, context): so = context.space_data diff --git a/release/ui/space_sequencer.py b/release/ui/space_sequencer.py index 13f90a1af63..4cba4d0af3a 100644 --- a/release/ui/space_sequencer.py +++ b/release/ui/space_sequencer.py @@ -8,7 +8,6 @@ def act_strip(context): # Header class SEQUENCER_HT_header(bpy.types.Header): __space_type__ = "SEQUENCE_EDITOR" - __idname__ = "SEQUENCE_HT_header" def draw(self, context): @@ -150,10 +149,8 @@ class SEQUENCER_MT_add(bpy.types.Menu): layout.column() layout.itemO("sequencer.scene_strip_add", text="Scene") layout.itemO("sequencer.movie_strip_add", text="Movie") - layout.item_booleanO("sequencer.movie_strip_add", "sound", True, text="Movie & Sound") # FFMPEG ONLY layout.itemO("sequencer.image_strip_add", text="Image") - layout.itemO("sequencer.sound_strip_add", text="Sound (Ram)") - layout.item_booleanO("sequencer.sound_strip_add", "hd", True, text="Sound (Streaming)") # FFMPEG ONLY + layout.itemO("sequencer.sound_strip_add", text="Sound") layout.itemM("SEQUENCER_MT_add_effect") @@ -263,7 +260,6 @@ class SequencerButtonsPanel_Output(bpy.types.Panel): class SEQUENCER_PT_edit(SequencerButtonsPanel): __label__ = "Edit Strip" - __idname__ = "SEQUENCER_PT_edit" def draw(self, context): layout = self.layout @@ -302,7 +298,6 @@ class SEQUENCER_PT_edit(SequencerButtonsPanel): class SEQUENCER_PT_effect(SequencerButtonsPanel): __label__ = "Effect Strip" - __idname__ = "SEQUENCER_PT_effect" def poll(self, context): if context.space_data.display_mode != 'SEQUENCER': @@ -395,7 +390,6 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel): class SEQUENCER_PT_input(SequencerButtonsPanel): __label__ = "Strip Input" - __idname__ = "SEQUENCER_PT_input" def poll(self, context): if context.space_data.display_mode != 'SEQUENCER': @@ -451,7 +445,6 @@ class SEQUENCER_PT_input(SequencerButtonsPanel): class SEQUENCER_PT_filter(SequencerButtonsPanel): __label__ = "Filter" - __idname__ = "SEQUENCER_PT_filter" def poll(self, context): if context.space_data.display_mode != 'SEQUENCER': @@ -500,7 +493,6 @@ class SEQUENCER_PT_filter(SequencerButtonsPanel): class SEQUENCER_PT_proxy(SequencerButtonsPanel): __label__ = "Proxy" - __idname__ = "SEQUENCER_PT_proxy" def poll(self, context): if context.space_data.display_mode != 'SEQUENCER': @@ -533,7 +525,6 @@ class SEQUENCER_PT_proxy(SequencerButtonsPanel): class SEQUENCER_PT_view(SequencerButtonsPanel_Output): __label__ = "View Settings" - __idname__ = "SEQUENCER_PT_view" def draw(self, context): st = context.space_data @@ -560,4 +551,3 @@ bpy.types.register(SEQUENCER_PT_filter) bpy.types.register(SEQUENCER_PT_proxy) bpy.types.register(SEQUENCER_PT_view) # view panels - diff --git a/release/ui/space_text.py b/release/ui/space_text.py index 51f7f6447ae..1b4fcea24b6 100644 --- a/release/ui/space_text.py +++ b/release/ui/space_text.py @@ -3,7 +3,6 @@ import bpy class TEXT_HT_header(bpy.types.Header): __space_type__ = "TEXT_EDITOR" - __idname__ = "TEXT_HT_header" def draw(self, context): st = context.space_data diff --git a/release/ui/space_view3d.py b/release/ui/space_view3d.py index 39d8b86613f..fc550982afa 100644 --- a/release/ui/space_view3d.py +++ b/release/ui/space_view3d.py @@ -1,6 +1,25 @@ import bpy +# ********** Header **************** + +class VIEW3D_HT_header(bpy.types.Header): + __space_type__ = "VIEW_3D" + + def draw(self, context): + layout = self.layout + + layout.template_header() + + # menus + if context.area.show_menus: + row = layout.row() + row.itemM("VIEW3D_MT_view") + + layout.template_header_3D() + +# ********** Menu **************** + class VIEW3D_MT_view_navigation(bpy.types.Menu): __space_type__ = "VIEW_3D" __label__ = "Navigation" @@ -73,22 +92,10 @@ class VIEW3D_MT_view(bpy.types.Menu): layout.itemS() - layout.itemO("screen.screen_full_area") - -class VIEW3D_HT_header(bpy.types.Header): - __space_type__ = "VIEW_3D" - - def draw(self, context): - layout = self.layout - - layout.template_header() - - # menus - if context.area.show_menus: - row = layout.row() - row.itemM("VIEW3D_MT_view") + layout.itemO("screen.region_foursplit", text="Toggle Quad View") + layout.itemO("screen.screen_full_area", text="Toggle Full Screen") - layout.template_header_3D() +# ********** Panel **************** class VIEW3D_PT_3dview_properties(bpy.types.Panel): __space_type__ = "VIEW_3D" @@ -100,20 +107,28 @@ class VIEW3D_PT_3dview_properties(bpy.types.Panel): return (view) def draw(self, context): - view = context.space_data layout = self.layout - split = layout.split() - col = split.column() + view = context.space_data + scene = context.scene + + col = layout.column() col.itemR(view, "camera") col.itemR(view, "lens") - col.itemL(text="Clip:") + + layout.itemL(text="Clip:") + col = layout.column(align=True) col.itemR(view, "clip_start", text="Start") col.itemR(view, "clip_end", text="End") - col.itemL(text="Grid:") + + layout.itemL(text="Grid:") + col = layout.column(align=True) + col.itemR(view, "grid_lines", text="Lines") col.itemR(view, "grid_spacing", text="Spacing") col.itemR(view, "grid_subdivisions", text="Subdivisions") + layout.column().itemR(scene, "cursor_location", text="3D Cursor:") + class VIEW3D_PT_3dview_display(bpy.types.Panel): __space_type__ = "VIEW_3D" __region_type__ = "UI" @@ -124,11 +139,10 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel): return (view) def draw(self, context): - view = context.space_data layout = self.layout + view = context.space_data - split = layout.split() - col = split.column() + col = layout.column() col.itemR(view, "display_floor", text="Grid Floor") col.itemR(view, "display_x_axis", text="X Axis") col.itemR(view, "display_y_axis", text="Y Axis") @@ -137,11 +151,21 @@ class VIEW3D_PT_3dview_display(bpy.types.Panel): col.itemR(view, "all_object_centers") col.itemR(view, "relationship_lines") col.itemR(view, "textured_solid") - + + layout.itemS() + + layout.itemO("screen.region_foursplit") + + col = layout.column() + col.itemR(view, "lock_rotation") + col.itemR(view, "box_preview") + col.itemR(view, "box_clip") + class VIEW3D_PT_background_image(bpy.types.Panel): __space_type__ = "VIEW_3D" __region_type__ = "UI" __label__ = "Background Image" + __default_closed__ = True def poll(self, context): view = context.space_data @@ -155,20 +179,24 @@ class VIEW3D_PT_background_image(bpy.types.Panel): layout.itemR(view, "display_background_image", text="") def draw(self, context): - view = context.space_data - bg = context.space_data.background_image layout = self.layout - layout.active = view.display_background_image - split = layout.split() - col = split.column() - col.itemR(bg, "image") -# col.itemR(bg, "image_user") - col.itemR(bg, "size") - col.itemR(bg, "transparency", slider=True) - col.itemL(text="Offset:") - col.itemR(bg, "x_offset", text="X") - col.itemR(bg, "y_offset", text="Y") + view = context.space_data + bg = view.background_image + + if bg: + layout.active = view.display_background_image + + col = layout.column() + col.itemR(bg, "image", text="") + #col.itemR(bg, "image_user") + col.itemR(bg, "size") + col.itemR(bg, "transparency", slider=True) + col.itemL(text="Offset:") + + col = layout.column(align=True) + col.itemR(bg, "x_offset", text="X") + col.itemR(bg, "y_offset", text="Y") bpy.types.register(VIEW3D_MT_view_navigation) bpy.types.register(VIEW3D_MT_view) @@ -176,5 +204,3 @@ bpy.types.register(VIEW3D_HT_header) bpy.types.register(VIEW3D_PT_3dview_properties) bpy.types.register(VIEW3D_PT_3dview_display) bpy.types.register(VIEW3D_PT_background_image) - - diff --git a/release/ui/space_view3d_toolbar.py b/release/ui/space_view3d_toolbar.py index cab22af44e3..be57497a0b4 100644 --- a/release/ui/space_view3d_toolbar.py +++ b/release/ui/space_view3d_toolbar.py @@ -9,18 +9,37 @@ class View3DPanel(bpy.types.Panel): __context__ = "objectmode" class VIEW3D_PT_tools_objectmode(View3DPanel): - __idname__ = "VIEW3D_PT_tools_objectmode" __label__ = "Object Tools" def draw(self, context): layout = self.layout - - layout.row().itemO("object.duplicate") - layout.row().itemO("object.delete") - layout.row().itemO("object.mesh_add") - layout.row().itemO("object.curve_add") - layout.row().itemO("object.text_add") - layout.row().itemO("object.surface_add") + + layout.itemL(text="Transform:") + + col = layout.column(align=True) + col.itemO("tfm.translate") + col.itemO("tfm.rotate") + col.itemO("tfm.resize", text="Scale") + + layout.itemL(text="Object:") + + col = layout.column(align=True) + col.itemO("object.duplicate") + col.itemO("object.delete") + + active_object= context.active_object + if active_object and active_object.type == 'MESH': + layout.itemL(text="Shading:") + + col = layout.column(align=True) + col.itemO("object.shade_smooth", text="Smooth") + col.itemO("object.shade_flat", text="Flat") + + layout.itemL(text="Keyframes:") + + col = layout.column(align=True) + col.itemO("anim.insert_keyframe_menu", text="Insert") + col.itemO("anim.delete_keyframe_v3d", text="Remove") # ********** default tools for editmode_mesh **************** @@ -30,22 +49,44 @@ class View3DPanel(bpy.types.Panel): __context__ = "editmode_mesh" class VIEW3D_PT_tools_editmode_mesh(View3DPanel): - __idname__ = "VIEW3D_PT_tools_editmode_mesh" __label__ = "Mesh Tools" def draw(self, context): layout = self.layout - - layout.row().itemO("mesh.duplicate") - layout.row().itemO("mesh.delete") - layout.row().itemO("mesh.spin") - layout.row().itemO("mesh.screw") - layout.row().itemO("mesh.primitive_plane_add") - layout.row().itemO("mesh.primitive_cube_add") - layout.row().itemO("mesh.primitive_circle_add") - layout.row().itemO("mesh.primitive_cylinder_add") - layout.row().itemO("mesh.faces_shade_smooth") - layout.row().itemO("mesh.faces_shade_flat") + + layout.itemL(text="Transform:") + + col = layout.column(align=True) + col.itemO("tfm.translate") + col.itemO("tfm.rotate") + col.itemO("tfm.resize", text="Scale") + + layout.itemL(text="Mesh:") + + col = layout.column(align=True) + col.itemO("mesh.duplicate") + col.itemO("mesh.delete") + + layout.itemL(text="Modeling:") + + col = layout.column(align=True) + col.itemO("mesh.extrude") + col.itemO("mesh.subdivide") + col.itemO("mesh.spin") + col.itemO("mesh.screw") + + layout.itemL(text="Shading:") + + col = layout.column(align=True) + col.itemO("mesh.faces_shade_smooth", text="Smooth") + col.itemO("mesh.faces_shade_flat", text="Flat") + + layout.itemL(text="UV Mapping:") + + col = layout.column(align=True) + col.itemO("uv.mapping_menu", text="Unwrap") + col.itemO("mesh.uvs_rotate") + col.itemO("mesh.uvs_mirror") # ********** default tools for editmode_curve **************** @@ -55,16 +96,31 @@ class View3DPanel(bpy.types.Panel): __context__ = "editmode_curve" class VIEW3D_PT_tools_editmode_curve(View3DPanel): - __idname__ = "VIEW3D_PT_tools_editmode_curve" __label__ = "Curve Tools" def draw(self, context): layout = self.layout + + layout.itemL(text="Transform:") + + col = layout.column(align=True) + col.itemO("tfm.translate") + col.itemO("tfm.rotate") + col.itemO("tfm.resize", text="Scale") + + layout.itemL(text="Curve:") - layout.row().itemO("curve.duplicate") - layout.row().itemO("curve.delete") - layout.row().itemO("object.curve_add") - layout.row().itemO("curve.subdivide") + col = layout.column(align=True) + col.itemO("curve.duplicate") + col.itemO("curve.delete") + col.itemO("curve.cyclic_toggle") + col.itemO("curve.switch_direction") + + layout.itemL(text="Modeling:") + + col = layout.column(align=True) + col.itemO("curve.extrude") + col.itemO("curve.subdivide") # ********** default tools for editmode_surface **************** @@ -74,16 +130,31 @@ class View3DPanel(bpy.types.Panel): __context__ = "editmode_surface" class VIEW3D_PT_tools_editmode_surface(View3DPanel): - __idname__ = "VIEW3D_PT_tools_editmode_surface" __label__ = "Surface Tools" def draw(self, context): layout = self.layout + + layout.itemL(text="Transform:") + + col = layout.column(align=True) + col.itemO("tfm.translate") + col.itemO("tfm.rotate") + col.itemO("tfm.resize", text="Scale") + + layout.itemL(text="Curve:") + + col = layout.column(align=True) + col.itemO("curve.duplicate") + col.itemO("curve.delete") + col.itemO("curve.cyclic_toggle") + col.itemO("curve.switch_direction") + + layout.itemL(text="Modeling:") - layout.row().itemO("curve.duplicate") - layout.row().itemO("curve.delete") - layout.row().itemO("object.surface_add") - layout.row().itemO("curve.subdivide") + col = layout.column(align=True) + col.itemO("curve.extrude") + col.itemO("curve.subdivide") # ********** default tools for editmode_text **************** @@ -93,16 +164,18 @@ class View3DPanel(bpy.types.Panel): __context__ = "editmode_text" class VIEW3D_PT_tools_editmode_text(View3DPanel): - __idname__ = "VIEW3D_PT_tools_editmode_text" __label__ = "Text Tools" def draw(self, context): layout = self.layout - layout.row().itemO("font.text_copy") - layout.row().itemO("font.text_paste") - layout.row().itemO("font.case_set") - layout.row().itemO("font.style_toggle") + col = layout.column(align=True) + col.itemO("font.text_copy", text="Copy") + col.itemO("font.text_paste", text="Paste") + + col = layout.column() + col.itemO("font.case_set") + col.itemO("font.style_toggle") # ********** default tools for editmode_armature **************** @@ -112,16 +185,27 @@ class View3DPanel(bpy.types.Panel): __context__ = "editmode_armature" class VIEW3D_PT_tools_editmode_armature(View3DPanel): - __idname__ = "VIEW3D_PT_tools_editmode_armature" __label__ = "Armature Tools" def draw(self, context): layout = self.layout + + layout.itemL(text="Transform:") + + col = layout.column(align=True) + col.itemO("tfm.translate") + col.itemO("tfm.rotate") + col.itemO("tfm.resize", text="Scale") + + layout.itemL(text="Bones:") - layout.row().itemO("armature.duplicate_selected") - layout.row().itemO("armature.bone_primitive_add") - layout.row().itemO("armature.delete") - layout.row().itemO("armature.parent_clear") + col = layout.column(align=True) + col.itemO("armature.bone_primitive_add", text="Add") + col.itemO("armature.duplicate", text="Duplicate") + col.itemO("armature.delete", text="Delete") + + layout.itemL(text="Modeling:") + layout.itemO("armature.extrude") # ********** default tools for editmode_mball **************** @@ -131,13 +215,17 @@ class View3DPanel(bpy.types.Panel): __context__ = "editmode_mball" class VIEW3D_PT_tools_editmode_mball(View3DPanel): - __idname__ = "VIEW3D_PT_tools_editmode_mball" __label__ = "Meta Tools" def draw(self, context): layout = self.layout - - row = layout.row() + + layout.itemL(text="Transform:") + + col = layout.column(align=True) + col.itemO("tfm.translate") + col.itemO("tfm.rotate") + col.itemO("tfm.resize", text="Scale") # ********** default tools for editmode_lattice **************** @@ -147,177 +235,317 @@ class View3DPanel(bpy.types.Panel): __context__ = "editmode_lattice" class VIEW3D_PT_tools_editmode_lattice(View3DPanel): - __idname__ = "VIEW3D_PT_tools_editmode_lattice" __label__ = "Lattice Tools" def draw(self, context): layout = self.layout + + layout.itemL(text="Transform:") - row = layout.row() + col = layout.column(align=True) + col.itemO("tfm.translate") + col.itemO("tfm.rotate") + col.itemO("tfm.resize", text="Scale") # ********** default tools for posemode **************** class View3DPanel(bpy.types.Panel): __space_type__ = "VIEW_3D" __region_type__ = "TOOLS" - __context__ = "posemode" + __context__ = "pose_mode" class VIEW3D_PT_tools_posemode(View3DPanel): - __idname__ = "VIEW3D_PT_tools_posemode" __label__ = "Pose Tools" def draw(self, context): layout = self.layout + + layout.itemL(text="Transform:") + + col = layout.column(align=True) + col.itemO("tfm.translate") + col.itemO("tfm.rotate") + col.itemO("tfm.resize", text="Scale") + + layout.itemL(text="Bones:") - layout.row().itemO("pose.hide") - layout.row().itemO("pose.reveal") - layout.row().itemO("pose.rot_clear") - layout.row().itemO("pose.loc_clear") + col = layout.column(align=True) + col.itemO("pose.hide", text="Hide") + col.itemO("pose.reveal", text="Reveal") + + layout.itemL(text="Keyframes:") + + col = layout.column(align=True) + col.itemO("anim.insert_keyframe_menu", text="Insert") + col.itemO("anim.delete_keyframe_v3d", text="Remove") + + layout.itemL(text="Pose:") + + col = layout.column(align=True) + col.itemO("pose.copy", text="Copy") + col.itemO("pose.paste", text="Paste") + + layout.itemL(text="Library:") + + col = layout.column(align=True) + col.itemO("poselib.pose_add", text="Add") + col.itemO("poselib.pose_remove", text="Remove") -# ********** default tools for sculptmode **************** +# ********** default tools for paint modes **************** -class View3DPanel(bpy.types.Panel): - __space_type__ = "VIEW_3D" - __region_type__ = "TOOLS" - __context__ = "sculptmode" - -#class VIEW3D_PT_tools_sculptmode(View3DPanel): -# __idname__ = "VIEW3D_PT_tools_sculptmode" -# __label__ = "Sculpt Tools" -# -# def draw(self, context): -# layout = self.layout -# -# layout.row().itemO("sculpt.radial_control") - -class VIEW3D_PT_tools_brush(bpy.types.Panel): +class PaintPanel(bpy.types.Panel): __space_type__ = "VIEW_3D" __region_type__ = "TOOLS" - __label__ = "Brush" - def brush_src(self, context): + def paint_settings(self, context): ts = context.tool_settings + if context.sculpt_object: return ts.sculpt - elif context.vpaint_object: - return ts.vpaint - elif context.wpaint_object: - return ts.wpaint + elif context.vertex_paint_object: + return ts.vertex_paint + elif context.weight_paint_object: + return ts.weight_paint + elif context.texture_paint_object: + return ts.image_paint + elif context.particle_edit_object: + return ts.particle_edit + return False +class VIEW3D_PT_tools_brush(PaintPanel): + __label__ = "Brush" + def poll(self, context): - return self.brush_src(context) + return self.paint_settings(context) def draw(self, context): - src = self.brush_src(context) - brush = src.brush layout = self.layout + + settings = self.paint_settings(context) + brush = settings.brush + + # XXX This needs a check if psys is editable. + if context.particle_edit_object: + layout.column().itemR(settings, "tool", expand=True) + if settings.tool != 'NONE': + col = layout.column(align=True) + col.itemR(brush, "size", slider=True) + col.itemR(brush, "strength", slider=True) + + if settings.tool == 'ADD': + layout.itemR(settings, "add_interpolate") + + col = layout.column() + col.itemR(brush, "steps", slider=True) + col.itemR(settings, "add_keys", slider=True) + elif settings.tool == 'LENGTH': + layout.itemR(brush, "length_mode", expand=True) + elif settings.tool == 'PUFF': + layout.itemR(brush, "puff_mode", expand=True) + + else: + layout.split().row().template_ID(settings, "brush") + + if brush and not context.particle_edit_object: + if context.sculpt_object: + layout.column().itemR(brush, "sculpt_tool", expand=True) + + elif context.texture_paint_object: + col = layout.column(align=True) + col.item_enumR(settings, "tool", "DRAW") + col.item_enumR(settings, "tool", "SOFTEN") + if settings.use_projection: + col.item_enumR(settings, "tool", "CLONE") + else: + col.item_enumR(settings, "tool", "SMEAR") + + col = layout.column() + row = col.row(align=True) + row.itemR(brush, "size", slider=True) + row.itemR(brush, "size_pressure", toggle=True, icon='ICON_BRUSH_DATA', text="") + if context.weight_paint_object: + col.itemR(context.tool_settings, "vertex_group_weight", text="Weight", slider=True) + + col.itemR(brush, "strength", slider=True) + row = col.row(align=True) + row.itemR(brush, "falloff", slider=True) + row.itemR(brush, "falloff_pressure", toggle=True, icon='ICON_BRUSH_DATA', text="") + if context.vertex_paint_object or context.texture_paint_object: + col.itemR(brush, "color", text="") + if context.texture_paint_object: + row = col.row(align=True) + row.itemR(brush, "clone_opacity", slider=True, text="Opacity") + row.itemR(brush, "opacity_pressure", toggle=True, icon='ICON_BRUSH_DATA', text="") + + row = col.row(align=True) + row.itemR(brush, "space", text="") + rowsub = row.row(align=True) + rowsub.active = brush.space + rowsub.itemR(brush, "spacing", text="Spacing", slider=True) + rowsub.itemR(brush, "spacing_pressure", toggle=True, icon='ICON_BRUSH_DATA', text="") + + col = layout.column() + col.itemR(brush, "airbrush") + col.itemR(brush, "anchored") + col.itemR(brush, "rake") + +class VIEW3D_PT_tools_brush_curve(PaintPanel): + __label__ = "Curve" - layout.split().row().template_ID(src, "brush") - - if context.sculpt_object: - layout.column().itemR(brush, "sculpt_tool", expand=True) - - split = layout.split() - col = split.column() - col.itemR(brush, "size", slider=True) - if context.wpaint_object: - col.itemR(context.tool_settings, "vertex_group_weight", text="Weight", slider=True) - col.itemR(brush, "strength", slider=True) - + def poll(self, context): + settings = self.paint_settings(context) + return (settings and settings.brush and settings.brush.curve) + def draw(self, context): + settings = self.paint_settings(context) + brush = settings.brush + layout = self.layout - split = layout.split() - col = split.column() - col.itemR(brush, "airbrush") - col.itemR(brush, "anchored") - col.itemR(brush, "rake") - col.itemR(brush, "space", text="Spacing") - colsub = col.column() - colsub.active = brush.space - colsub.itemR(brush, "spacing", text="") - - split = layout.split() - split.template_curve_mapping(brush.curve) - -class VIEW3D_PT_sculptoptions(bpy.types.Panel): - __space_type__ = "VIEW_3D" - __region_type__ = "TOOLS" + layout.template_curve_mapping(brush.curve) + +class VIEW3D_PT_sculpt_options(PaintPanel): __label__ = "Options" def poll(self, context): return context.sculpt_object def draw(self, context): + layout = self.layout sculpt = context.tool_settings.sculpt + col = layout.column() + col.itemR(sculpt, "partial_redraw", text="Partial Refresh") + col.itemR(sculpt, "show_brush") + split = self.layout.split() col = split.column() col.itemL(text="Symmetry:") - row = col.row(align=True) - row.itemR(sculpt, "symmetry_x", text="X", toggle=True) - row.itemR(sculpt, "symmetry_y", text="Y", toggle=True) - row.itemR(sculpt, "symmetry_z", text="Z", toggle=True) - - split = self.layout.split() + col.itemR(sculpt, "symmetry_x", text="X") + col.itemR(sculpt, "symmetry_y", text="Y") + col.itemR(sculpt, "symmetry_z", text="Z") col = split.column() - col.itemL(text="Lock Axis:") - row = col.row(align=True) - row.itemR(sculpt, "lock_x", text="X", toggle=True) - row.itemR(sculpt, "lock_y", text="Y", toggle=True) - row.itemR(sculpt, "lock_z", text="Z", toggle=True) - + col.itemL(text="Lock:") + col.itemR(sculpt, "lock_x", text="X") + col.itemR(sculpt, "lock_y", text="Y") + col.itemR(sculpt, "lock_z", text="Z") # ********** default tools for weightpaint **************** class View3DPanel(bpy.types.Panel): __space_type__ = "VIEW_3D" __region_type__ = "TOOLS" - __context__ = "weightpaint" + __context__ = "weight_paint" -class VIEW3D_PT_tools_weightpaint(View3DPanel): - __idname__ = "VIEW3D_PT_tools_weightpaint" - __label__ = "Weight Paint Tools" +class VIEW3D_PT_weight_paint_options(View3DPanel): + __label__ = "Options" def draw(self, context): layout = self.layout + wpaint = context.tool_settings.weight_paint + + col = layout.column() + col.itemL(text="Blend:") + col.itemR(wpaint, "mode", text="") + col.itemR(wpaint, "all_faces") + col.itemR(wpaint, "normals") + col.itemR(wpaint, "spray") + col.itemR(wpaint, "vertex_dist", text="Distance") + +# Commented out because the Apply button isn't an operator yet, making these settings useless +# col.itemL(text="Gamma:") +# col.itemR(wpaint, "gamma", text="") +# col.itemL(text="Multiply:") +# col.itemR(wpaint, "mul", text="") - layout.row().itemO("paint.weight_paint_radial_control") +# Also missing now: +# Soft, Vgroup, X-Mirror and "Clear" Operator. # ********** default tools for vertexpaint **************** class View3DPanel(bpy.types.Panel): __space_type__ = "VIEW_3D" __region_type__ = "TOOLS" - __context__ = "vertexpaint" -class VIEW3D_PT_tools_vertexpaint(View3DPanel): - __idname__ = "VIEW3D_PT_tools_vertexpaint" - __label__ = "Vertex Paint Tools" +class VIEW3D_PT_vertex_paint_options(View3DPanel): + __context__ = "vertex_paint" + __label__ = "Options" def draw(self, context): layout = self.layout + vpaint = context.tool_settings.vertex_paint + + col = layout.column() + col.itemL(text="Blend:") + col.itemR(vpaint, "mode", text="") + col.itemR(vpaint, "all_faces") + col.itemR(vpaint, "normals") + col.itemR(vpaint, "spray") + col.itemR(vpaint, "vertex_dist", text="Distance") +# Commented out because the Apply button isn't an operator yet, making these settings useless +# col.itemL(text="Gamma:") +# col.itemR(vpaint, "gamma", text="") +# col.itemL(text="Multiply:") +# col.itemR(vpaint, "mul", text="") - layout.row().itemO("paint.vertex_paint_radial_control") # ********** default tools for texturepaint **************** class View3DPanel(bpy.types.Panel): __space_type__ = "VIEW_3D" __region_type__ = "TOOLS" - __context__ = "texturepaint" + __context__ = "texture_paint" -class VIEW3D_PT_tools_texturepaint(View3DPanel): - __idname__ = "VIEW3D_PT_tools_texturepaint" - __label__ = "Texture Paint Tools" +class VIEW3D_PT_tools_texture_paint(View3DPanel): + __label__ = "Options" def draw(self, context): layout = self.layout + ipaint = context.tool_settings.image_paint + + col = layout.column() + col.itemR(ipaint, "use_projection") + col.itemR(ipaint, "use_occlude") + col.itemR(ipaint, "use_backface_cull") + col.itemR(ipaint, "use_normal_falloff") + col.itemR(ipaint, "invert_stencil") + col.itemR(ipaint, "use_clone_layer") + col.itemR(ipaint, "use_stencil_layer") + + col.itemR(ipaint, "seam_bleed") + col.itemR(ipaint, "normal_angle") + +# ********** default tools for particle mode **************** - layout.row().itemO("paint.texture_paint_radial_control") +class View3DPanel(bpy.types.Panel): + __space_type__ = "VIEW_3D" + __region_type__ = "TOOLS" + __context__ = "particle_mode" + +class VIEW3D_PT_tools_particle_edit(View3DPanel): + __label__ = "Options" + def draw(self, context): + layout = self.layout + pe = context.tool_settings.particle_edit + + col = layout.column(align=True) + col.itemR(pe, "emitter_deflect", text="Deflect") + sub = col.row() + sub.active = pe.emitter_deflect + sub.itemR(pe, "emitter_distance", text="Distance") + + col = layout.column(align=True) + col.itemL(text="Keep:") + col.itemR(pe, "keep_lengths", text="Lenghts") + col.itemR(pe, "keep_root", text="Root") + + col = layout.column(align=True) + col.itemL(text="Draw:") + col.itemR(pe, "show_time", text="Time") + col.itemR(pe, "show_children", text="Children") bpy.types.register(VIEW3D_PT_tools_objectmode) bpy.types.register(VIEW3D_PT_tools_editmode_mesh) @@ -329,9 +557,9 @@ bpy.types.register(VIEW3D_PT_tools_editmode_mball) bpy.types.register(VIEW3D_PT_tools_editmode_lattice) bpy.types.register(VIEW3D_PT_tools_posemode) bpy.types.register(VIEW3D_PT_tools_brush) -bpy.types.register(VIEW3D_PT_sculptoptions) -bpy.types.register(VIEW3D_PT_tools_weightpaint) -bpy.types.register(VIEW3D_PT_tools_vertexpaint) -bpy.types.register(VIEW3D_PT_tools_texturepaint) - - +bpy.types.register(VIEW3D_PT_tools_brush_curve) +bpy.types.register(VIEW3D_PT_sculpt_options) +bpy.types.register(VIEW3D_PT_vertex_paint_options) +bpy.types.register(VIEW3D_PT_weight_paint_options) +bpy.types.register(VIEW3D_PT_tools_texture_paint) +bpy.types.register(VIEW3D_PT_tools_particle_edit) diff --git a/source/Makefile b/source/Makefile index 680d8c8bfaa..abb0f311174 100644 --- a/source/Makefile +++ b/source/Makefile @@ -114,8 +114,6 @@ ifneq ($(NAN_NO_KETSJI),true) COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a - COMLIB += $(OCGDIR)/gameengine/blphys/fuzzics/$(DEBUG_DIR)libfuzzics.a - COMLIB += $(NAN_QHULL)/lib/libqhull.a COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a @@ -229,6 +227,7 @@ PULIB += $(OCGDIR)/blender/ed_view3d/$(DEBUG_DIR)libed_view3d.a PULIB += $(OCGDIR)/blender/ed_interface/$(DEBUG_DIR)libed_interface.a PULIB += $(OCGDIR)/blender/ed_object/$(DEBUG_DIR)libed_object.a PULIB += $(OCGDIR)/blender/ed_curve/$(DEBUG_DIR)libed_curve.a +PULIB += $(OCGDIR)/blender/ed_metaball/$(DEBUG_DIR)libed_metaball.a PULIB += $(OCGDIR)/blender/ed_armature/$(DEBUG_DIR)libed_armature.a PULIB += $(OCGDIR)/blender/ed_mesh/$(DEBUG_DIR)libed_mesh.a PULIB += $(OCGDIR)/blender/ed_sculpt_paint/$(DEBUG_DIR)libed_sculpt_paint.a @@ -248,6 +247,7 @@ PULIB += $(OCGDIR)/blender/makesrna/$(DEBUG_DIR)librna.a PULIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a PULIB += $(NAN_OPENNL)/lib/$(DEBUG_DIR)libopennl.a PULIB += $(NAN_ELBEEM)/lib/$(DEBUG_DIR)libelbeem.a +PULIB += $(NAN_SMOKE)/lib/$(DEBUG_DIR)/libsmoke.a ifeq ($(NAN_NO_KETSJI),true) PULIB += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c index 386597c6d85..005c05dec1d 100644 --- a/source/blender/avi/intern/avi.c +++ b/source/blender/avi/intern/avi.c @@ -214,6 +214,7 @@ int AVI_is_avi (char *name) { AviMovie movie; AviMainHeader header; AviBitmapInfoHeader bheader; + int movie_tracks = 0; DEBUG("opening movie\n"); @@ -303,6 +304,7 @@ int AVI_is_avi (char *name) { fclose(movie.fp); return 0; } + movie_tracks++; } movie.streams[temp].sh.Flags = GET_FCC (movie.fp); @@ -394,7 +396,10 @@ int AVI_is_avi (char *name) { MEM_freeN(movie.streams); fclose(movie.fp); - return 1; + + /* at least one video track is needed */ + return (movie_tracks != 0); + } AviError AVI_open_movie (char *name, AviMovie *movie) { diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h index b77f4a8fcd1..c1b14a14f8c 100644 --- a/source/blender/blenfont/BLF_api.h +++ b/source/blender/blenfont/BLF_api.h @@ -140,6 +140,9 @@ char **BLF_dir_get(int *ndir); /* Free the data return by BLF_dir_get. */ void BLF_dir_free(char **dirs, int count); +/* Set the current draw mode. */ +void BLF_mode(int mode); + /* font->flags. */ #define BLF_ROTATION (1<<0) #define BLF_CLIPPING (1<<1) diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c index cd7f969d5e5..af57f822c40 100644 --- a/source/blender/blenfont/intern/blf.c +++ b/source/blender/blenfont/intern/blf.c @@ -349,7 +349,7 @@ void BLF_draw(char *str) glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); glPushAttrib(GL_ENABLE_BIT); glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); - glPixelStorei( GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glDisable(GL_BLEND); glRasterPos3f(font->pos[0], font->pos[1], font->pos[2]); diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index d2767d6ffb1..805da02ba36 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -573,10 +573,10 @@ int blf_glyph_bitmap_render(FontBLF *font, GlyphBLF *g, float x, float y) return(0); } - glBitmap(0, 0, 0.0, 0.0, x + font->pos[0], y - font->pos[1], (const GLubyte *)&null_bitmap); + glBitmap(0, 0, 0.0, 0.0, x + gt->pos_x, y, (const GLubyte *)&null_bitmap); glPixelStorei(GL_UNPACK_ROW_LENGTH, gt->pitch * 8); glBitmap(gt->width, gt->height, 0.0, gt->pos_y, 0.0, 0.0, (const GLubyte *)gt->image); - glBitmap(0, 0, 0.0, 0.0, -x - font->pos[0], -y + font->pos[1], (const GLubyte *)&null_bitmap); + glBitmap(0, 0, 0.0, 0.0, -x - gt->pos_x, -y, (const GLubyte *)&null_bitmap); return(1); } diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 795c7585b9c..19b9c315939 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -71,6 +71,7 @@ void pushpop_test(void); /* global undo */ extern void BKE_write_undo(struct bContext *C, char *name); extern void BKE_undo_step(struct bContext *C, int step); +extern void BKE_undo_name(struct bContext *C, const char *name); extern void BKE_reset_undo(void); extern char *BKE_undo_menu_string(void); extern void BKE_undo_number(struct bContext *C, int nr); diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h index 4270c677338..f3165c959bf 100644 --- a/source/blender/blenkernel/BKE_cloth.h +++ b/source/blender/blenkernel/BKE_cloth.h @@ -65,8 +65,7 @@ struct CollisionTree; #elif defined (__sun) || defined (__sun__) # define DO_INLINE #else -# define DO_INLINE inline -# define LINUX +# define DO_INLINE static inline #endif #define CLOTH_MAX_THREAD 2 diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 83cac0adf93..e47ad969b91 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -122,6 +122,17 @@ struct RegionView3D *CTX_wm_region_view3d(const bContext *C); struct SpaceText *CTX_wm_space_text(const bContext *C); struct SpaceImage *CTX_wm_space_image(const bContext *C); struct SpaceConsole *CTX_wm_space_console(const bContext *C); +struct SpaceButs *CTX_wm_space_buts(const bContext *C); +struct SpaceFile *CTX_wm_space_file(const bContext *C); +struct SpaceSeq *CTX_wm_space_seq(const bContext *C); +struct SpaceOops *CTX_wm_space_outliner(const bContext *C); +struct SpaceNla *CTX_wm_space_nla(const bContext *C); +struct SpaceTime *CTX_wm_space_time(const bContext *C); +struct SpaceNode *CTX_wm_space_node(const bContext *C); +struct SpaceLogic *CTX_wm_space_logic(const bContext *C); +struct SpaceIpo *CTX_wm_space_graph(const bContext *C); +struct SpaceAction *CTX_wm_space_action(const bContext *C); +struct SpaceInfo *CTX_wm_space_info(const bContext *C); void CTX_wm_manager_set(bContext *C, struct wmWindowManager *wm); void CTX_wm_window_set(bContext *C, struct wmWindow *win); diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index ba78aa0682d..ff9ac693ba8 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -164,6 +164,7 @@ struct MetaBall *copy_mball(struct MetaBall *mb); void make_local_mball(struct MetaBall *mb); void tex_space_mball(struct Object *ob); float *make_orco_mball(struct Object *ob); +void copy_mball_properties(struct Scene *scene, struct Object *active_object); struct Object *find_basis_mball(struct Scene *scene, struct Object *ob); int is_basis_mball(struct Object *ob); void metaball_polygonize(struct Scene *scene, struct Object *ob); diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index b4efb742b27..42a4743fd22 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -33,6 +33,7 @@ #include "DNA_modifier_types.h" /* needed for all enum typdefs */ #include "BKE_customdata.h" +struct ID; struct EditMesh; struct DerivedMesh; struct DagForest; diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index bb5a2782663..989043c1d67 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -80,6 +80,7 @@ short BKE_nlatrack_add_strip(struct NlaTrack *nlt, struct NlaStrip *strip); /* ............ */ struct NlaStrip *BKE_nlastrip_find_active(struct NlaTrack *nlt); +void BKE_nlastrip_set_active(struct AnimData *adt, struct NlaStrip *strip); short BKE_nlastrip_within_bounds(struct NlaStrip *strip, float min, float max); @@ -91,6 +92,8 @@ short BKE_nlatrack_has_animated_strips(struct NlaTrack *nlt); short BKE_nlatracks_have_animated_strips(ListBase *tracks); void BKE_nlastrip_validate_fcurves(struct NlaStrip *strip); +void BKE_nla_validate_state(struct AnimData *adt); + /* ............ */ void BKE_nla_action_pushdown(struct AnimData *adt); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 3d71193f37a..a57529ccf75 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -98,11 +98,6 @@ void object_to_mat4(struct Object *ob, float mat[][4]); void set_no_parent_ipo(int val); -void disable_where_script(short on); -int during_script(void); -void disable_where_scriptlink(short on); -int during_scriptlink(void); - void where_is_object_time(struct Scene *scene, struct Object *ob, float ctime); void where_is_object(struct Scene *scene, struct Object *ob); void where_is_object_simul(struct Scene *scene, struct Object *ob); diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h index c5d423c13ba..8062f807055 100644 --- a/source/blender/blenkernel/BKE_pointcache.h +++ b/source/blender/blenkernel/BKE_pointcache.h @@ -166,4 +166,6 @@ void BKE_ptcache_quick_cache_all(struct Scene *scene); void BKE_ptcache_make_cache(struct PTCacheBaker* baker); void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid); +void BKE_ptcache_load_external(struct PTCacheID *pid); + #endif diff --git a/source/blender/blenkernel/BKE_sequence.h b/source/blender/blenkernel/BKE_sequence.h index 65a3b0216fe..7162fa7b9dd 100644 --- a/source/blender/blenkernel/BKE_sequence.h +++ b/source/blender/blenkernel/BKE_sequence.h @@ -181,5 +181,5 @@ int check_single_seq(struct Sequence *seq); void fix_single_seq(struct Sequence *seq); int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test); int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test); -void free_imbuf_seq(struct ListBase * seqbasep); +void free_imbuf_seq(struct ListBase * seqbasep, int check_mem_usage); diff --git a/source/blender/blenkernel/BKE_sketch.h b/source/blender/blenkernel/BKE_sketch.h new file mode 100644 index 00000000000..424dd5c9f80 --- /dev/null +++ b/source/blender/blenkernel/BKE_sketch.h @@ -0,0 +1,157 @@ +/** + * + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ +#ifndef BKE_SKETCH_H +#define BKE_SKETCH_H + +typedef enum SK_PType +{ + PT_CONTINUOUS, + PT_EXACT, +} SK_PType; + +typedef enum SK_PMode +{ + PT_SNAP, + PT_PROJECT, +} SK_PMode; + +typedef struct SK_Point +{ + float p[3]; + short p2d[2]; + float no[3]; + float size; + SK_PType type; + SK_PMode mode; +} SK_Point; + +typedef struct SK_Stroke +{ + struct SK_Stroke *next, *prev; + + SK_Point *points; + int nb_points; + int buf_size; + int selected; +} SK_Stroke; + +#define SK_OVERDRAW_LIMIT 5 + +typedef struct SK_Overdraw +{ + SK_Stroke *target; + int start, end; + int count; +} SK_Overdraw; + +#define SK_Stroke_BUFFER_INIT_SIZE 20 + +typedef struct SK_DrawData +{ + short mval[2]; + short previous_mval[2]; + SK_PType type; +} SK_DrawData; + +typedef struct SK_Intersection +{ + struct SK_Intersection *next, *prev; + SK_Stroke *stroke; + int before; + int after; + int gesture_index; + float p[3]; + float lambda; /* used for sorting intersection points */ +} SK_Intersection; + +typedef struct SK_Sketch +{ + ListBase strokes; + ListBase depth_peels; + SK_Stroke *active_stroke; + SK_Stroke *gesture; + SK_Point next_point; + SK_Overdraw over; +} SK_Sketch; + + +typedef struct SK_Gesture { + SK_Stroke *stk; + SK_Stroke *segments; + + ListBase intersections; + ListBase self_intersections; + + int nb_self_intersections; + int nb_intersections; + int nb_segments; +} SK_Gesture; + + +/************************************************/ + +void freeSketch(SK_Sketch *sketch); +SK_Sketch* createSketch(); + +void sk_removeStroke(SK_Sketch *sketch, SK_Stroke *stk); + +void sk_freeStroke(SK_Stroke *stk); +SK_Stroke* sk_createStroke(); + +SK_Point *sk_lastStrokePoint(SK_Stroke *stk); + +void sk_allocStrokeBuffer(SK_Stroke *stk); +void sk_shrinkStrokeBuffer(SK_Stroke *stk); +void sk_growStrokeBuffer(SK_Stroke *stk); +void sk_growStrokeBufferN(SK_Stroke *stk, int n); + +void sk_replaceStrokePoint(SK_Stroke *stk, SK_Point *pt, int n); +void sk_insertStrokePoint(SK_Stroke *stk, SK_Point *pt, int n); +void sk_appendStrokePoint(SK_Stroke *stk, SK_Point *pt); +void sk_insertStrokePoints(SK_Stroke *stk, SK_Point *pts, int len, int start, int end); + +void sk_trimStroke(SK_Stroke *stk, int start, int end); +void sk_straightenStroke(SK_Stroke *stk, int start, int end, float p_start[3], float p_end[3]); +void sk_polygonizeStroke(SK_Stroke *stk, int start, int end); +void sk_flattenStroke(SK_Stroke *stk, int start, int end); +void sk_reverseStroke(SK_Stroke *stk); + +void sk_filterLastContinuousStroke(SK_Stroke *stk); +void sk_filterStroke(SK_Stroke *stk, int start, int end); + +void sk_initPoint(SK_Point *pt, SK_DrawData *dd, float *no); +void sk_copyPoint(SK_Point *dst, SK_Point *src); + +int sk_stroke_filtermval(SK_DrawData *dd); +void sk_endContinuousStroke(SK_Stroke *stk); + +void sk_updateNextPoint(SK_Sketch *sketch, SK_Stroke *stk); + +void sk_initDrawData(SK_DrawData *dd, short mval[2]); + +void sk_deleteSelectedStrokes(SK_Sketch *sketch); +void sk_selectAllSketch(SK_Sketch *sketch, int mode); + +#endif diff --git a/source/blender/blenkernel/BKE_smoke.h b/source/blender/blenkernel/BKE_smoke.h new file mode 100644 index 00000000000..b1b42286788 --- /dev/null +++ b/source/blender/blenkernel/BKE_smoke.h @@ -0,0 +1,55 @@ +/** + * BKE_cloth.h + * + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Daniel Genrich + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef BKE_SMOKE_H_ +#define BKE_SMOKE_H_ + +void smokeModifier_do(struct SmokeModifierData *smd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc); + +void smokeModifier_free (struct SmokeModifierData *smd); +void smokeModifier_reset(struct SmokeModifierData *smd); +void smokeModifier_createType(struct SmokeModifierData *smd); + +void smoke_set_tray(struct SmokeModifierData *smd, size_t index, float transparency); +float smoke_get_tray(struct SmokeModifierData *smd, size_t index); +float smoke_get_tvox(struct SmokeModifierData *smd, size_t index); +void smoke_set_tvox(struct SmokeModifierData *smd, size_t index, float tvox); + +void smoke_set_bigtray(struct SmokeModifierData *smd, size_t index, float transparency); +float smoke_get_bigtray(struct SmokeModifierData *smd, size_t index); +float smoke_get_bigtvox(struct SmokeModifierData *smd, size_t index); +void smoke_set_bigtvox(struct SmokeModifierData *smd, size_t index, float tvox); + +long long smoke_get_mem_req(int xres, int yres, int zres, int amplify); +void smoke_prepare_View(struct SmokeModifierData *smd, float *light); +void smoke_prepare_bigView(struct SmokeModifierData *smd, float *light); + +#endif /* BKE_SMOKE_H_ */ diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h index 05a9bfb0ca9..0d9682cf842 100644 --- a/source/blender/blenkernel/BKE_softbody.h +++ b/source/blender/blenkernel/BKE_softbody.h @@ -44,7 +44,9 @@ typedef struct BodyPoint { float choke,choke2,frozen; float colball; short flag; - char octantflag; + //char octantflag; + float mass; + float springweight; } BodyPoint; /* allocates and initializes general main data */ @@ -67,7 +69,7 @@ extern void sbObjectToSoftbody(struct Object *ob); extern void sbSetInterruptCallBack(int (*f)(void)); /* writing to cache for bake editing */ -extern void sbWriteCache(struct Object *ob, int framenr); +extern void softbody_write_cache(struct Object *ob, struct SoftBody *soft, int cfra); #endif diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 92cc206667c..a2a7457545d 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -27,12 +27,12 @@ FILE(GLOB SRC intern/*.c) SET(INC - . ../../../intern/guardedalloc ../editors/include ../blenlib ../makesdna + . ../../../intern/guardedalloc ../../../intern/memutil ../editors/include ../blenlib ../makesdna ../render/extern/include ../../../intern/decimation/extern ../imbuf ../avi ../../../intern/elbeem/extern ../../../intern/opennl/extern ../../../intern/iksolver/extern ../blenloader ../quicktime ../../../extern/bullet2/src - ../nodes ../../../extern/glew/include ../gpu ../makesrna + ../nodes ../../../extern/glew/include ../gpu ../makesrna ../../../intern/smoke/extern ../../../intern/bsp/extern ${ZLIB_INC} ) diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript index ae522b029cb..78732be210d 100644 --- a/source/blender/blenkernel/SConscript +++ b/source/blender/blenkernel/SConscript @@ -3,7 +3,7 @@ Import ('env') sources = env.Glob('intern/*.c') -incs = '. #/intern/guardedalloc ../editors/include ../blenlib ../makesdna' +incs = '. #/intern/guardedalloc #/intern/memutil ../editors/include ../blenlib ../makesdna' incs += ' ../render/extern/include #/intern/decimation/extern ../makesrna' incs += ' ../imbuf ../avi #/intern/elbeem/extern ../nodes' incs += ' #/intern/iksolver/extern ../blenloader' @@ -11,6 +11,7 @@ incs += ' #/extern/bullet2/src' incs += ' #/intern/opennl/extern #/intern/bsp/extern' incs += ' ../gpu #/extern/glew/include' incs += ' ../bmesh' +incs += ' #/intern/smoke/extern' incs += ' ' + env['BF_OPENGL_INC'] incs += ' ' + env['BF_ZLIB_INC'] diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile index a6a5066b574..f60bdffa282 100644 --- a/source/blender/blenkernel/intern/Makefile +++ b/source/blender/blenkernel/intern/Makefile @@ -41,6 +41,7 @@ CPPFLAGS += -I$(OPENGL_HEADERS) CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include +CPPFLAGS += -I../../../../intern/memutil # Reference to the types in makesdna and imbuf CPPFLAGS += -I../../makesdna CPPFLAGS += -I../../makesrna @@ -68,6 +69,7 @@ CPPFLAGS += -I$(NAN_DECIMATION)/include CPPFLAGS += -I$(NAN_ELBEEM)/include CPPFLAGS += -I$(NAN_OPENNL)/include CPPFLAGS += -I$(NAN_BSP)/include +CPPFLAGS += -I$(NAN_SMOKE)/include # path to zlib CPPFLAGS += -I$(NAN_ZLIB)/include diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index e4882d8f555..983f1ecc31c 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -71,7 +71,7 @@ static short id_has_animdata (ID *id) switch (GS(id->name)) { /* has AnimData */ case ID_OB: - case ID_CU: + case ID_MB: case ID_CU: case ID_KE: case ID_PA: case ID_MA: case ID_TE: case ID_NT: @@ -120,8 +120,15 @@ AnimData *BKE_id_add_animdata (ID *id) IdAdtTemplate *iat= (IdAdtTemplate *)id; /* check if there's already AnimData, in which case, don't add */ - if (iat->adt == NULL) - iat->adt= MEM_callocN(sizeof(AnimData), "AnimData"); + if (iat->adt == NULL) { + AnimData *adt; + + /* add animdata */ + adt= iat->adt= MEM_callocN(sizeof(AnimData), "AnimData"); + + /* set default settings */ + adt->act_influence= 1.0f; + } return iat->adt; } @@ -1190,8 +1197,12 @@ void nladata_flush_channels (ListBase *channels) */ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime) { + ListBase dummy_trackslist = {NULL, NULL}; + NlaStrip dummy_strip; + NlaTrack *nlt; short track_index=0; + short has_strips = 0; ListBase estrips= {NULL, NULL}; ListBase echannels= {NULL, NULL}; @@ -1213,11 +1224,50 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime) if (nlt->flag & NLATRACK_MUTED) continue; + /* if this track has strips (but maybe they won't be suitable), set has_strips + * - used for mainly for still allowing normal action evaluation... + */ + if (nlt->strips.first) + has_strips= 1; + /* otherwise, get strip to evaluate for this channel */ nes= nlastrips_ctime_get_strip(&estrips, &nlt->strips, track_index, ctime); if (nes) nes->track= nlt; } + /* add 'active' Action (may be tweaking track) as last strip to evaluate in NLA stack + * - only do this if we're not exclusively evaluating the 'solo' NLA-track + */ + if ((adt->action) && !(adt->flag & ADT_NLA_SOLO_TRACK)) { + /* if there are strips, evaluate action as per NLA rules */ + if (has_strips) { + /* make dummy NLA strip, and add that to the stack */ + memset(&dummy_strip, 0, sizeof(NlaStrip)); + dummy_trackslist.first= dummy_trackslist.last= &dummy_strip; + + dummy_strip.act= adt->action; + dummy_strip.remap= adt->remap; + + // FIXME: what happens when we want to included F-Modifier access? + calc_action_range(dummy_strip.act, &dummy_strip.actstart, &dummy_strip.actend, 1); + dummy_strip.start = dummy_strip.actstart; + dummy_strip.end = (IS_EQ(dummy_strip.actstart, dummy_strip.actend)) ? (dummy_strip.actstart + 1.0f): (dummy_strip.actend); + + dummy_strip.blendmode= adt->act_blendmode; + dummy_strip.extendmode= adt->act_extendmode; + dummy_strip.influence= adt->act_influence; + + /* add this to our list of evaluation strips */ + nlastrips_ctime_get_strip(&estrips, &dummy_trackslist, -1, ctime); + } + else { + /* special case - evaluate as if there isn't any NLA data */ + // TODO: this is really just a stop-gap measure... + animsys_evaluate_action(ptr, adt->action, adt->remap, ctime); + return; + } + } + /* only continue if there are strips to evaluate */ if (estrips.first == NULL) return; @@ -1316,14 +1366,10 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re /* evaluate NLA data */ if ((adt->nla_tracks.first) && !(adt->flag & ADT_NLA_EVAL_OFF)) { - /* evaluate NLA-stack */ - animsys_evaluate_nla(&id_ptr, adt, ctime); - - /* evaluate 'active' Action (may be tweaking track) on top of results of NLA-evaluation - * - only do this if we're not exclusively evaluating the 'solo' NLA-track + /* evaluate NLA-stack + * - active action is evaluated as part of the NLA stack as the last item */ - if ((adt->action) && !(adt->flag & ADT_NLA_SOLO_TRACK)) - animsys_evaluate_action(&id_ptr, adt->action, adt->remap, ctime); + animsys_evaluate_nla(&id_ptr, adt, ctime); } /* evaluate Active Action only */ else if (adt->action) @@ -1362,19 +1408,36 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re * 'local' (i.e. belonging in the nearest ID-block that setting is related to, not a * standard 'root') block are overridden by a larger 'user' */ -// TODO: we currently go over entire 'main' database... +// FIXME?: we currently go over entire 'main' database... void BKE_animsys_evaluate_all_animation (Main *main, float ctime) { ID *id; if (G.f & G_DEBUG) printf("Evaluate all animation - %f \n", ctime); - - /* macro for less typing */ -#define EVAL_ANIM_IDS(first, flag) \ + + /* macro for less typing + * - only evaluate animation data for id if it has users (and not just fake ones) + * - whether animdata exists is checked for by the evaluation function, though taking + * this outside of the function may make things slightly faster? + */ +#define EVAL_ANIM_IDS(first, aflag) \ for (id= first; id; id= id->next) { \ AnimData *adt= BKE_animdata_from_id(id); \ - BKE_animsys_evaluate_animdata(id, adt, ctime, flag); \ + if ( (id->us > 1) || (id->us && !(id->flag & LIB_FAKEUSER)) ) \ + BKE_animsys_evaluate_animdata(id, adt, ctime, aflag); \ + } + + /* optimisation: + * when there are no actions, don't go over database and loop over heaps of datablocks, + * which should ultimately be empty, since it is not possible for now to have any animation + * without some actions, and drivers wouldn't get affected by any state changes + */ + if (main->action.first == NULL) { + if (G.f & G_DEBUG) + printf("\tNo Actions, so no animation needs to be evaluated...\n"); + + return; } /* nodes */ @@ -1396,6 +1459,9 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime) // TODO: we probably need the same hack as for curves (ctime-hack) EVAL_ANIM_IDS(main->key.first, ADT_RECALC_ANIM); + /* metaballs */ + EVAL_ANIM_IDS(main->mball.first, ADT_RECALC_ANIM); + /* curves */ /* we need to perform a special hack here to ensure that the ctime * value of the curve gets set in case there's no animation for that diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 37130a0e3a0..7b894d79b45 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -66,8 +66,7 @@ #include "BKE_object.h" #include "BKE_object.h" #include "BKE_utildefines.h" - -//XXX #include "BIF_editdeform.h" +#include "BKE_sketch.h" #include "IK_solver.h" @@ -144,7 +143,7 @@ void free_armature(bArmature *arm) /* free sketch */ if (arm->sketch) { - ED_freeSketch(arm->sketch); + freeSketch(arm->sketch); arm->sketch = NULL; } } @@ -2214,7 +2213,7 @@ static void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, fl Mat4MulSerie(pchan->pose_mat, tmat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL); } else if(bone->flag & BONE_NO_SCALE) { - float orthmat[4][4], vec[3]; + float orthmat[4][4]; /* get the official transform, but we only use the vector from it (optimize...) */ Mat4MulSerie(pchan->pose_mat, parchan->pose_mat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL); diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index d3d21018c1c..2728aa30e6e 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -387,10 +387,6 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename) /* now tag update flags, to ensure deformers get calculated on redraw */ DAG_scene_update_flags(CTX_data_scene(C), CTX_data_scene(C)->lay); - if (G.f & G_DOSCRIPTLINKS) { - /* there's an onload scriptlink to execute in screenmain */ -// XXX mainqenter(ONLOAD_SCRIPT, 1); - } if (G.sce != filename) /* these are the same at times, should never copy to the same location */ strcpy(G.sce, filename); @@ -692,6 +688,22 @@ void BKE_undo_number(bContext *C, int nr) BKE_undo_step(C, 0); } +/* go back to the last occurance of name in stack */ +void BKE_undo_name(bContext *C, const char *name) +{ + UndoElem *uel; + + for(uel= undobase.last; uel; uel= uel->prev) { + if(strcmp(name, uel->name)==0) + break; + } + if(uel && uel->prev) { + curundo= uel->prev; + BKE_undo_step(C, 0); + } +} + + char *BKE_undo_menu_string(void) { UndoElem *uel; diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c index 931ad0b3043..d8926fc5753 100644 --- a/source/blender/blenkernel/intern/boids.c +++ b/source/blender/blenkernel/intern/boids.c @@ -399,7 +399,7 @@ static int rule_flock(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, Parti KDTreeNearest ptn[11]; float vec[3] = {0.0f, 0.0f, 0.0f}, loc[3] = {0.0f, 0.0f, 0.0f}; int neighbors = BLI_kdtree_find_n_nearest(bbd->psys->tree, 11, pa->state.co, pa->prev_state.ave, ptn); - int n, nearest = 1; + int n; int ret = 0; if(neighbors > 1) { @@ -898,8 +898,6 @@ static BoidState *get_boid_state(BoidSettings *boids, ParticleData *pa) { /* determines the velocity the boid wants to have */ void boid_brain(BoidBrainData *bbd, int p, ParticleData *pa) { - ParticleData *pars=bbd->psys->particles; - ParticleEffectorCache *ec=0; BoidRule *rule; BoidSettings *boids = bbd->part->boids; BoidValues val; @@ -1259,7 +1257,6 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa) } case eBoidMode_Falling: { - float zvec[3] = {0.0f,0.0f,1.0f}; float grav[3] = {0.0f, 0.0f, bbd->part->acc[2] < 0.0f ? -1.0f : 0.0f}; /* gather apparent gravity to r_ve */ @@ -1523,4 +1520,5 @@ BoidState *boid_get_current_state(BoidSettings *boids) } return state; -}
\ No newline at end of file +} + diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 08182dc873b..78c29a96bff 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -256,6 +256,83 @@ struct SpaceImage *CTX_wm_space_image(const bContext *C) return NULL; } +struct SpaceButs *CTX_wm_space_buts(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_BUTS) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceFile *CTX_wm_space_file(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_FILE) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceSeq *CTX_wm_space_seq(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_SEQ) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceOops *CTX_wm_space_outliner(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_OUTLINER) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceNla *CTX_wm_space_nla(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_NLA) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceTime *CTX_wm_space_time(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_TIME) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceNode *CTX_wm_space_node(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_NODE) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceLogic *CTX_wm_space_logic(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_LOGIC) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceIpo *CTX_wm_space_graph(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_IPO) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceAction *CTX_wm_space_action(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_ACTION) + return C->wm.area->spacedata.first; + return NULL; +} + +struct SpaceInfo *CTX_wm_space_info(const bContext *C) +{ + if(C->wm.area && C->wm.area->spacetype==SPACE_INFO) + return C->wm.area->spacedata.first; + return NULL; +} + void CTX_wm_manager_set(bContext *C, wmWindowManager *wm) { C->wm.manager= wm; diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 7e6a652da6b..6c765b02e5d 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -1997,8 +1997,6 @@ static void dag_object_time_update_flags(Object *ob) } } - if(ob->scriptlink.totscript) ob->recalc |= OB_RECALC_OB; - if(ob->parent) { /* motion path or bone child */ if(ob->parent->type==OB_CURVE || ob->parent->type==OB_ARMATURE) ob->recalc |= OB_RECALC_OB; diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c index 5566851db43..3ea7bba9f5b 100644 --- a/source/blender/blenkernel/intern/exotic.c +++ b/source/blender/blenkernel/intern/exotic.c @@ -334,7 +334,7 @@ static void read_stl_mesh_ascii(Scene *scene, char *str) */ numtenthousand = 1; vertdata = malloc(numtenthousand*3*30000*sizeof(float)); // uses realloc! - if (!vertdata); STLALLOCERROR; + if (!vertdata) { STLALLOCERROR; } linenum = 1; /* Get rid of the first line */ @@ -357,7 +357,7 @@ static void read_stl_mesh_ascii(Scene *scene, char *str) ++numtenthousand; vertdata = realloc(vertdata, numtenthousand*3*30000*sizeof(float)); - if (!vertdata); STLALLOCERROR; + if (!vertdata) { STLALLOCERROR; } } /* Don't read normal, but check line for proper syntax anyway @@ -1687,7 +1687,7 @@ static void displist_to_objects(Scene *scene, ListBase *lbase) if(totvert==0) { - if(ivsurf==0) ; //XXX error("Found no data"); + if(ivsurf==0) {}; //XXX error("Found no data"); if(lbase->first) BLI_freelistN(lbase); return; @@ -1900,16 +1900,15 @@ void write_stl(Scene *scene, char *str) if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0; if(BLI_testextensie(str,".stl")==0) strcat(str, ".stl"); - if (!during_script()) { - if (BLI_exists(str)) - ; //XXX if(saveover(str)==0) - //XXX return; + if (BLI_exists(str)) { + ; //XXX if(saveover(str)==0) + //XXX return; } fpSTL= fopen(str, "wb"); if(fpSTL==NULL) { - if (!during_script()) ; //XXX error("Can't write file"); + //XXX error("Can't write file"); return; } strcpy(temp_dir, str); @@ -2233,11 +2232,11 @@ void write_vrml(Scene *scene, char *str) if(BLI_testextensie(str,".blend")) str[ strlen(str)-6]= 0; if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0; if(BLI_testextensie(str,".wrl")==0) strcat(str, ".wrl"); - //XXX saveover() if(!during_script() && saveover(str)==0) return; + //XXX saveover() if(saveover(str)==0) return; fp= fopen(str, "w"); - if(fp==NULL && !during_script()) { + if(fp==NULL) { //XXX error("Can't write file"); return; } @@ -2544,15 +2543,15 @@ void write_dxf(struct Scene *scene, char *str) if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0; if(BLI_testextensie(str,".dxf")==0) strcat(str, ".dxf"); - if (!during_script()) { - if (BLI_exists(str)) - ; //XXX if(saveover(str)==0) - // return; + + if (BLI_exists(str)) { + ; //XXX if(saveover(str)==0) + // return; } fp= fopen(str, "w"); - if(fp==NULL && !during_script()) { + if(fp==NULL) { //XXX error("Can't write file"); return; } diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index ebd94b94f8c..90bf08059d7 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -722,6 +722,8 @@ float driver_get_target_value (ChannelDriver *driver, DriverTarget *dtar) break; } } + else if (G.f & G_DEBUG) + printf("Driver Evaluation Error: cannot resolve target for %s -> %s \n", id->name, path); return value; } diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 93924d1ea0d..62af05fbc9a 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -456,19 +456,19 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho * easy to tweak like this, speed isn't really that much of an issue in this situation... */ /* checkers */ - for(y=0; y<ibuf->y; y++) { - dark = pow(-1, floor(y / checkerwidth)); + for(y=0; y<height; y++) { + dark = powf(-1.0f, floorf(y / checkerwidth)); - for(x=0; x<ibuf->x; x++) { + for(x=0; x<width; x++) { if (x % checkerwidth == 0) dark *= -1; if (floatbuf) { if (dark > 0) { - rect_float[0] = rect_float[1] = rect_float[2] = 0.25; - rect_float[3] = 1.0; + rect_float[0] = rect_float[1] = rect_float[2] = 0.25f; + rect_float[3] = 1.0f; } else { - rect_float[0] = rect_float[1] = rect_float[2] = 0.58; - rect_float[3] = 1.0; + rect_float[0] = rect_float[1] = rect_float[2] = 0.58f; + rect_float[3] = 1.0f; } rect_float+=4; } @@ -489,11 +489,11 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho if (floatbuf) rect_float= (float*)ibuf->rect_float; else rect= (unsigned char*)ibuf->rect; - for(y=0; y<ibuf->y; y++) { - hoffs = 0.125 * floor(y / checkerwidth); + for(y=0; y<height; y++) { + hoffs = 0.125f * floorf(y / checkerwidth); - for(x=0; x<ibuf->x; x++) { - h = 0.125 * floor(x / checkerwidth); + for(x=0; x<width; x++) { + h = 0.125f * floorf(x / checkerwidth); if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 4) && (fabs((y % checkerwidth) - (checkerwidth / 2)) < 4)) { @@ -501,19 +501,19 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho if ((fabs((x % checkerwidth) - (checkerwidth / 2)) < 1) || (fabs((y % checkerwidth) - (checkerwidth / 2)) < 1)) { - hue = fmod(fabs(h-hoffs), 1.0); + hue = fmodf(fabs(h-hoffs), 1.0f); hsv_to_rgb(hue, s, v, &r, &g, &b); if (floatbuf) { rect_float[0]= r; rect_float[1]= g; rect_float[2]= b; - rect_float[3]= 1.0; + rect_float[3]= 1.0f; } else { - rect[0]= (char)(r * 255.0); - rect[1]= (char)(g * 255.0); - rect[2]= (char)(b * 255.0); + rect[0]= (char)(r * 255.0f); + rect[1]= (char)(g * 255.0f); + rect[2]= (char)(b * 255.0f); rect[3]= 255; } } @@ -526,8 +526,15 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho } } } else { /* blank image */ - for(y=0; y<ibuf->y; y++) { - for(x=0; x<ibuf->x; x++) { + char ccol[4]; + + ccol[0]= (char)(color[0]*255.0f); + ccol[1]= (char)(color[1]*255.0f); + ccol[2]= (char)(color[2]*255.0f); + ccol[3]= (char)(color[3]*255.0f); + + for(y=0; y<height; y++) { + for(x=0; x<width; x++) { if (floatbuf) { rect_float[0]= color[0]; rect_float[1]= color[1]; @@ -536,10 +543,10 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int floatbuf, sho rect_float+=4; } else { - rect[0]= (char)(color[0] * 255.0); - rect[1]= (char)(color[1] * 255.0); - rect[2]= (char)(color[2] * 255.0); - rect[3]= (char)(color[3] * 255.0); + rect[0]= ccol[0]; + rect[1]= ccol[1]; + rect[2]= ccol[2]; + rect[3]= ccol[3]; rect+=4; } } diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c index cf7e486613b..a72f26f6157 100644 --- a/source/blender/blenkernel/intern/ipo.c +++ b/source/blender/blenkernel/intern/ipo.c @@ -296,8 +296,8 @@ static char *pchan_adrcodes_to_paths (int adrcode, int *array_index) case AC_EUL_Z: *array_index= 2; return "euler_rotation"; - case -1: // XXX special case for rotation drivers... until eulers are added... - *array_index= 0; return "rotation"; + case -1: /* special case for euler-rotations used by old drivers */ + *array_index= 0; return "euler_rotation"; case AC_LOC_X: *array_index= 0; return "location"; @@ -1023,12 +1023,11 @@ static ChannelDriver *idriver_to_cdriver (IpoDriver *idriver) dtar->rna_path= get_rna_access(ID_PO, AC_SIZE_Z, idriver->name, NULL, &dtar->array_index); break; - case OB_ROT_X: /* rotation - we need to be careful with this... XXX (another reason why we need eulers) */ + case OB_ROT_X: /* rotation - we need to be careful with this... */ case OB_ROT_Y: case OB_ROT_Z: { - // XXX this is not yet a 1:1 map, since we'd need euler rotations to make this work nicely (unless we make some hacks) - // XXX -1 here is a special hack... + /* -1 here, not rotation code, since old system didn't have eulers */ dtar->rna_path= get_rna_access(ID_PO, -1, idriver->name, NULL, NULL); dtar->array_index= idriver->adrcode - OB_ROT_X; } @@ -1276,6 +1275,26 @@ static void icu_to_fcurves (ListBase *groups, ListBase *list, IpoCurve *icu, cha dst->vec[1][1] *= fac; dst->vec[2][1] *= fac; } + + /* correct times for rotation drivers + * - need to go from degrees to radians... + * - there's only really 1 target to worry about + */ + if (fcu->driver && fcu->driver->targets.first) { + DriverTarget *dtar= fcu->driver->targets.first; + + /* since drivers could only be for objects, we should just check for 'rotation' being + * in the name of the path given + * - WARNING: this will break if we encounter a bone or object explictly named in that way... + */ + if ((dtar && dtar->rna_path) && strstr(dtar->rna_path, "rotation")) { + const float fac= (float)M_PI / 180.0f; + + dst->vec[0][0] *= fac; + dst->vec[1][0] *= fac; + dst->vec[2][0] *= fac; + } + } } /* free this data now */ diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index 595ba37e09c..a2fa97cabc9 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -1382,18 +1382,11 @@ int do_ob_key(Scene *scene, Object *ob) return 1; } else { -#if 0 // XXX old animation system - // NOTE: this stuff was NEVER reliable at all... - if(ob->ipoflag & OB_ACTION_KEY) - do_all_object_actions(scene, ob); - else { - calc_ipo(key->ipo, bsystem_time(scene, ob, scene->r.cfra, 0.0)); - execute_ipo((ID *)key, key->ipo); - } -#endif // XXX old animation system /* do shapekey local drivers */ float ctime= (float)scene->r.cfra; // XXX this needs to be checked - if (G.f & G_DEBUG) printf("ob %s - do shapekey (%s) drivers \n", ob->id.name+2, key->id.name+2); + + if (G.f & G_DEBUG) + printf("ob %s - do shapekey (%s) drivers \n", ob->id.name+2, key->id.name+2); BKE_animsys_evaluate_animdata(&key->id, key->adt, ctime, ADT_RECALC_DRIVERS); if(ob->type==OB_MESH) return do_mesh_key(scene, ob, ob->data); diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index bee63f497ca..08a19cada7d 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -80,10 +80,6 @@ void free_material(Material *ma) { MTex *mtex; int a; - -#ifndef DISABLE_PYTHON - BPY_free_scriptlink(&ma->scriptlink); -#endif for(a=0; a<MAX_MTEX; a++) { mtex= ma->mtex[a]; @@ -210,10 +206,6 @@ Material *copy_material(Material *ma) id_us_plus((ID *)man->mtex[a]->tex); } } - -#ifndef DISABLE_PYTHON - BPY_copy_scriptlink(&ma->scriptlink); -#endif if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col); if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec); diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c index 74d56e81a87..3ca7dac4bc9 100644 --- a/source/blender/blenkernel/intern/mball.c +++ b/source/blender/blenkernel/intern/mball.c @@ -55,6 +55,7 @@ #include "BKE_main.h" /* #include "BKE_object.h" */ +#include "BKE_animsys.h" #include "BKE_scene.h" #include "BKE_blender.h" #include "BKE_library.h" @@ -68,10 +69,10 @@ /* Global variables */ -float thresh= 0.6f; -int totelem=0; -MetaElem **mainb; -octal_tree *metaball_tree = NULL; +static float thresh= 0.6f; +static int totelem=0; +static MetaElem **mainb; +static octal_tree *metaball_tree = NULL; /* Functions */ void unlink_mball(MetaBall *mb) @@ -90,6 +91,7 @@ void free_mball(MetaBall *mb) { unlink_mball(mb); + if(mb->adt) BKE_free_animdata((ID *)mb); if(mb->mat) MEM_freeN(mb->mat); if(mb->bb) MEM_freeN(mb->bb); BLI_freelistN(&mb->elems); @@ -278,6 +280,47 @@ int is_basis_mball(Object *ob) return 1; } +/* \brief copy some properties from object to other metaball object with same base name + * + * When some properties (wiresize, threshold, update flags) of metaball are changed, then this properties + * are copied to all metaballs in same "group" (metaballs with same base name: MBall, + * MBall.001, MBall.002, etc). The most important is to copy properties to the base metaball, + * because this metaball influence polygonisation of metaballs. */ +void copy_mball_properties(Scene *scene, Object *active_object) +{ + Base *base; + Object *ob; + MetaBall *active_mball = (MetaBall*)active_object->data; + int basisnr, obnr; + char basisname[32], obname[32]; + + splitIDname(active_object->id.name+2, basisname, &basisnr); + + /* XXX recursion check, see scene.c, just too simple code this next_object() */ + if(F_ERROR==next_object(scene, 0, 0, 0)) + return; + + while(next_object(scene, 1, &base, &ob)) { + if (ob->type==OB_MBALL) { + if(ob!=active_object){ + splitIDname(ob->id.name+2, obname, &obnr); + + /* Object ob has to be in same "group" ... it means, that it has to have + * same base of its name */ + if(strcmp(obname, basisname)==0){ + MetaBall *mb= ob->data; + + /* Copy properties from selected/edited metaball */ + mb->wiresize= active_mball->wiresize; + mb->rendersize= active_mball->rendersize; + mb->thresh= active_mball->thresh; + mb->flag= active_mball->flag; + } + } + } + } +} + /** \brief This function finds basic MetaBall. * * Basic MetaBall doesn't include any number at the end of diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 8f67fdc74d2..e74066cf52c 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -854,6 +854,8 @@ void nurbs_to_mesh(Object *ob) dl= cu->disp.first; while(dl) { + int smooth= dl->rt & CU_SMOOTH ? 1 : 0; + if(dl->type==DL_SEGM) { startvert= vertcount; a= dl->parts*dl->nr; @@ -870,6 +872,7 @@ void nurbs_to_mesh(Object *ob) for(b=1; b<dl->nr; b++) { mface->v1= startvert+ofs+b-1; mface->v2= startvert+ofs+b; + if(smooth) mface->flag |= ME_SMOOTH; mface++; } } @@ -894,6 +897,7 @@ void nurbs_to_mesh(Object *ob) mface->v1= startvert+ofs+b; if(b==dl->nr-1) mface->v2= startvert+ofs; else mface->v2= startvert+ofs+b+1; + if(smooth) mface->flag |= ME_SMOOTH; mface++; } } @@ -919,6 +923,7 @@ void nurbs_to_mesh(Object *ob) mface->v4= 0; test_index_face(mface, NULL, 0, 3); + if(smooth) mface->flag |= ME_SMOOTH; mface++; index+= 3; } @@ -966,6 +971,8 @@ void nurbs_to_mesh(Object *ob) mface->v4= p2; mface->mat_nr= (unsigned char)dl->col; test_index_face(mface, NULL, 0, 4); + + if(smooth) mface->flag |= ME_SMOOTH; mface++; p4= p3; diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index e84f70d4bc6..2149632d189 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -59,6 +59,7 @@ #include "DNA_cloth_types.h" #include "DNA_curve_types.h" #include "DNA_effect_types.h" +#include "DNA_group_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -68,6 +69,7 @@ #include "DNA_object_force.h" #include "DNA_particle_types.h" #include "DNA_scene_types.h" +#include "DNA_smoke_types.h" #include "DNA_texture_types.h" #include "BLI_editVert.h" @@ -97,6 +99,7 @@ #include "BKE_object.h" #include "BKE_particle.h" #include "BKE_pointcache.h" +#include "BKE_smoke.h" #include "BKE_softbody.h" #include "BKE_subsurf.h" #include "BKE_texture.h" @@ -5809,6 +5812,100 @@ static int softbodyModifier_dependsOnTime(ModifierData *md) return 1; } +/* Smoke */ + +static void smokeModifier_initData(ModifierData *md) +{ + SmokeModifierData *smd = (SmokeModifierData*) md; + + smd->domain = NULL; + smd->flow = NULL; + smd->coll = NULL; + smd->type = 0; + smd->time = -1; + + /* + smd->fluid = NULL; + smd->maxres = 48; + smd->amplify = 4; + smd->omega = 0.5; + smd->time = 0; + smd->flags = 0; + smd->noise = MOD_SMOKE_NOISEWAVE; + smd->visibility = 1; + + // init 3dview buffer + smd->tvox = NULL; + smd->tray = NULL; + smd->tvoxbig = NULL; + smd->traybig = NULL; + smd->viewsettings = 0; + smd->bind = NULL; + smd->max_textures = 0; + */ +} + +static void smokeModifier_freeData(ModifierData *md) +{ + SmokeModifierData *smd = (SmokeModifierData*) md; + + smokeModifier_free (smd); +} + +static void smokeModifier_deformVerts( + ModifierData *md, Object *ob, DerivedMesh *derivedData, + float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc) +{ + SmokeModifierData *smd = (SmokeModifierData*) md; + DerivedMesh *dm = NULL; + + if(derivedData) dm = derivedData; + else if(ob->type == OB_MESH) dm = CDDM_from_mesh(ob->data, ob); + else return; + + CDDM_apply_vert_coords(dm, vertexCos); + CDDM_calc_normals(dm); + + smokeModifier_do(smd, md->scene, ob, dm, useRenderParams, isFinalCalc); + + if(dm != derivedData) dm->release(dm); +} + +static int smokeModifier_dependsOnTime(ModifierData *md) +{ + return 1; +} + +static void smokeModifier_updateDepgraph( + ModifierData *md, DagForest *forest, Scene *scene, Object *ob, + DagNode *obNode) +{ + SmokeModifierData *smd = (SmokeModifierData *) md; + /* + if(smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain) + { + if(smd->domain->fluid_group) + { + GroupObject *go = NULL; + + for(go = smd->domain->fluid_group->gobject.first; go; go = go->next) + { + if(go->ob) + { + SmokeModifierData *smd2 = (SmokeModifierData *)modifiers_findByType(go->ob, eModifierType_Smoke); + + // check for initialized smoke object + if(smd2 && (smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow) + { + DagNode *curNode = dag_get_node(forest, go->ob); + dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Smoke Flow"); + } + } + } + } + } + */ +} /* Cloth */ @@ -8501,6 +8598,15 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type) | eModifierTypeFlag_Single; mti->deformVerts = softbodyModifier_deformVerts; mti->dependsOnTime = softbodyModifier_dependsOnTime; + + mti = INIT_TYPE(Smoke); + mti->type = eModifierTypeType_OnlyDeform; + mti->initData = smokeModifier_initData; + mti->freeData = smokeModifier_freeData; + mti->flags = eModifierTypeFlag_AcceptsMesh; + mti->deformVerts = smokeModifier_deformVerts; + mti->dependsOnTime = smokeModifier_dependsOnTime; + mti->updateDepgraph = smokeModifier_updateDepgraph; mti = INIT_TYPE(Cloth); mti->type = eModifierTypeType_Nonconstructive; diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index 457df9be7a9..c41c4ae78e4 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -375,7 +375,7 @@ static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short return strip->actend - (repeatsNum * actlength * scale) - (fmod(cframe - strip->start, actlength*scale) / scale); } - else { + else /* if (mode == NLATIME_CONVERT_EVAL) */{ if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, ((int)strip->repeat))) { /* this case prevents the motion snapping back to the first frame at the end of the strip * by catching the case where repeats is a whole number, which means that the end of the strip @@ -993,6 +993,28 @@ NlaStrip *BKE_nlastrip_find_active (NlaTrack *nlt) return NULL; } +/* Make the given NLA-Strip the active one within the given block */ +void BKE_nlastrip_set_active (AnimData *adt, NlaStrip *strip) +{ + NlaTrack *nlt; + NlaStrip *nls; + + /* sanity checks */ + if (adt == NULL) + return; + + /* loop over tracks, deactivating*/ + for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) { + for (nls= nlt->strips.first; nls; nls= nls->next) { + if (nls != strip) + nls->flag &= ~NLASTRIP_FLAG_ACTIVE; + else + nls->flag |= NLASTRIP_FLAG_ACTIVE; + } + } +} + + /* Does the given NLA-strip fall within the given bounds (times)? */ short BKE_nlastrip_within_bounds (NlaStrip *strip, float min, float max) { @@ -1229,13 +1251,52 @@ void BKE_nlastrip_validate_name (AnimData *adt, NlaStrip *strip) /* ---- */ +/* Get strips which overlap the given one at the start/end of its range + * - strip: strip that we're finding overlaps for + * - track: nla-track that the overlapping strips should be found from + * - start, end: frames for the offending endpoints + */ +static void nlastrip_get_endpoint_overlaps (NlaStrip *strip, NlaTrack *track, float **start, float **end) +{ + NlaStrip *nls; + + /* find strips that overlap over the start/end of the given strip, + * but which don't cover the entire length + */ + // TODO: this scheme could get quite slow for doing this on many strips... + for (nls= track->strips.first; nls; nls= nls->next) { + /* check if strip overlaps (extends over or exactly on) the entire range of the strip we're validating */ + if ((nls->start <= strip->start) && (nls->end >= strip->end)) { + *start= NULL; + *end= NULL; + return; + } + + /* check if strip doesn't even occur anywhere near... */ + if (nls->end < strip->start) + continue; /* skip checking this strip... not worthy of mention */ + if (nls->start > strip->end) + return; /* the range we're after has already passed */ + + /* if this strip is not part of an island of continuous strips, it can be used + * - this check needs to be done for each end of the strip we try and use... + */ + if ((nls->next == NULL) || IS_EQ(nls->next->start, nls->end)==0) { + if ((nls->end > strip->start) && (nls->end < strip->end)) + *start= &nls->end; + } + if ((nls->prev == NULL) || IS_EQ(nls->prev->end, nls->start)==0) { + if ((nls->start < strip->end) && (nls->start > strip->start)) + *end= &nls->start; + } + } +} + /* Determine auto-blending for the given strip */ void BKE_nlastrip_validate_autoblends (NlaTrack *nlt, NlaStrip *nls) { - NlaTrack *track; - NlaStrip *strip; - //float *ps=NULL, *pe=NULL; - //float *ns=NULL, *ne=NULL; + float *ps=NULL, *pe=NULL; + float *ns=NULL, *ne=NULL; /* sanity checks */ if ELEM(NULL, nls, nlt) @@ -1246,40 +1307,74 @@ void BKE_nlastrip_validate_autoblends (NlaTrack *nlt, NlaStrip *nls) return; /* get test ranges */ - if (nlt->prev) { - /* find strips that overlap over the start/end of the given strip, - * but which don't cover the entire length - */ - track= nlt->prev; - for (strip= track->strips.first; strip; strip= strip->next) { - - } + if (nlt->prev) + nlastrip_get_endpoint_overlaps(nls, nlt->prev, &ps, &pe); + if (nlt->next) + nlastrip_get_endpoint_overlaps(nls, nlt->next, &ns, &ne); + + /* set overlaps for this strip + * - don't use the values obtained though if the end in question + * is directly followed/preceeded by another strip, forming an + * 'island' of continuous strips + */ + if ( (ps || ns) && ((nls->prev == NULL) || IS_EQ(nls->prev->end, nls->start)==0) ) + { + /* start overlaps - pick the largest overlap */ + if ( ((ps && ns) && (*ps > *ns)) || (ps) ) + nls->blendin= *ps - nls->start; + else + nls->blendin= *ns - nls->start; } - if (nlt->next) { - /* find strips that overlap over the start/end of the given strip, - * but which don't cover the entire length - */ - track= nlt->next; - for (strip= track->strips.first; strip; strip= strip->next) { - - } + else /* no overlap allowed/needed */ + nls->blendin= 0.0f; + + if ( (pe || ne) && ((nls->next == NULL) || IS_EQ(nls->next->start, nls->end)==0) ) + { + /* end overlaps - pick the largest overlap */ + if ( ((pe && ne) && (*pe > *ne)) || (pe) ) + nls->blendout= nls->end - *pe; + else + nls->blendout= nls->end - *ne; } + else /* no overlap allowed/needed */ + nls->blendout= 0.0f; } /* Ensure that auto-blending and other settings are set correctly */ void BKE_nla_validate_state (AnimData *adt) { - NlaStrip *strip; + NlaStrip *strip, *fstrip=NULL; NlaTrack *nlt; /* sanity checks */ if ELEM(NULL, adt, adt->nla_tracks.first) return; - /* adjust blending values for auto-blending */ + /* adjust blending values for auto-blending, and also do an initial pass to find the earliest strip */ for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) { for (strip= nlt->strips.first; strip; strip= strip->next) { + /* auto-blending first */ BKE_nlastrip_validate_autoblends(nlt, strip); + + /* extend mode - find first strip */ + if ((fstrip == NULL) || (strip->start < fstrip->start)) + fstrip= strip; + } + } + + /* second pass over the strips to adjust the extend-mode to fix any problems */ + for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) { + for (strip= nlt->strips.first; strip; strip= strip->next) { + /* apart from 'nothing' option which user has to explicitly choose, we don't really know if + * we should be overwriting the extend setting (but assume that's what the user wanted) + */ + // TODO: 1 solution is to tie this in with auto-blending... + if (strip->extendmode != NLASTRIP_EXTEND_NOTHING) { + if (strip == fstrip) + strip->extendmode= NLASTRIP_EXTEND_HOLD; + else + strip->extendmode= NLASTRIP_EXTEND_HOLD_FORWARD; + } } } } @@ -1330,6 +1425,9 @@ void BKE_nla_action_pushdown (AnimData *adt) // FIXME: this needs to be more automated, since user can rearrange strips strip->extendmode= NLASTRIP_EXTEND_HOLD_FORWARD; } + + /* make strip the active one... */ + BKE_nlastrip_set_active(adt, strip); } } diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 870d71940f9..160922e3954 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -91,6 +91,7 @@ #include "BKE_constraint.h" #include "BKE_curve.h" #include "BKE_displist.h" +#include "BKE_fcurve.h" #include "BKE_group.h" #include "BKE_icons.h" #include "BKE_key.h" @@ -267,10 +268,6 @@ void free_object(Object *ob) free_actuators(&ob->actuators); free_constraints(&ob->constraints); - -#ifndef DISABLE_PYTHON - BPY_free_scriptlink(&ob->scriptlink); -#endif if(ob->pd){ if(ob->pd->tex) @@ -646,10 +643,7 @@ Camera *copy_camera(Camera *cam) camn= copy_libblock(cam); camn->adt= BKE_copy_animdata(cam->adt); - -#ifndef DISABLE_PYTHON - BPY_copy_scriptlink(&camn->scriptlink); -#endif + return camn; } @@ -798,9 +792,7 @@ Lamp *copy_lamp(Lamp *la) #endif // XXX old animation system if (la->preview) lan->preview = BKE_previewimg_copy(la->preview); -#ifndef DISABLE_PYTHON - BPY_copy_scriptlink(&la->scriptlink); -#endif + return lan; } @@ -858,9 +850,6 @@ void make_local_lamp(Lamp *la) void free_camera(Camera *ca) { -#ifndef DISABLE_PYTHON - BPY_free_scriptlink(&ca->scriptlink); -#endif BKE_free_animdata((ID *)ca); } @@ -869,11 +858,6 @@ void free_lamp(Lamp *la) MTex *mtex; int a; - /* scriptlinks */ -#ifndef DISABLE_PYTHON - BPY_free_scriptlink(&la->scriptlink); -#endif - for(a=0; a<MAX_MTEX; a++) { mtex= la->mtex[a]; if(mtex && mtex->tex) mtex->tex->id.us--; @@ -1211,9 +1195,7 @@ Object *copy_object(Object *ob) modifier_copyData(md, nmd); BLI_addtail(&obn->modifiers, nmd); } -#ifndef DISABLE_PYTHON - BPY_copy_scriptlink(&ob->scriptlink); -#endif + obn->prop.first = obn->prop.last = NULL; copy_properties(&obn->prop, &ob->prop); @@ -1422,11 +1404,32 @@ void object_make_proxy(Object *ob, Object *target, Object *gob) ob->parent= target->parent; /* libdata */ Mat4CpyMat4(ob->parentinv, target->parentinv); -#if 0 // XXX old animation system - ob->ipo= target->ipo; /* libdata */ -#endif // XXX old animation system - /* skip constraints, constraintchannels, nla? */ + /* copy animdata stuff - drivers only for now... */ + if ((target->adt) && (target->adt->drivers.first)) { + FCurve *fcu; + + /* add new animdata block */ + ob->adt= BKE_id_add_animdata(&ob->id); + + /* make a copy of all the drivers (for now), then correct any links that need fixing */ + copy_fcurves(&ob->adt->drivers, &target->adt->drivers); + + for (fcu= ob->adt->drivers.first; fcu; fcu= fcu->next) { + ChannelDriver *driver= fcu->driver; + DriverTarget *dtar; + + for (dtar= driver->targets.first; dtar; dtar= dtar->next) { + if ((Object *)dtar->id == target) + dtar->id= (ID *)ob; + else + id_lib_extern((ID *)dtar->id); + } + } + } + + /* skip constraints? */ + // FIXME: this is considered by many as a bug /* set object type and link to data */ ob->type= target->type; @@ -1462,6 +1465,9 @@ void object_make_proxy(Object *ob, Object *target, Object *gob) armature_set_id_extern(ob); } + + /* copy drawtype info */ + ob->dt= target->dt; } @@ -1844,26 +1850,6 @@ void set_no_parent_ipo(int val) no_parent_ipo= val; } -static int during_script_flag=0; -void disable_where_script(short on) -{ - during_script_flag= on; -} - -int during_script(void) { - return during_script_flag; -} - -static int during_scriptlink_flag=0; -void disable_where_scriptlink(short on) -{ - during_scriptlink_flag= on; -} - -int during_scriptlink(void) { - return during_scriptlink_flag; -} - void where_is_object_time(Scene *scene, Object *ob, float ctime) { float *fp1, *fp2, slowmat[4][4] = MAT4_UNITY; @@ -1963,11 +1949,6 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime) constraints_clear_evalob(cob); } -#ifndef DISABLE_PYTHON - if(ob->scriptlink.totscript && !during_script()) { - if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_REDRAW); - } -#endif /* set negative scale flag in object */ Crossf(vec, ob->obmat[0], ob->obmat[1]); @@ -2339,9 +2320,6 @@ void object_handle_update(Scene *scene, Object *ob) } else where_is_object(scene, ob); -#ifndef DISABLE_PYTHON - if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_OBJECTUPDATE); -#endif } if(ob->recalc & OB_RECALC_DATA) { @@ -2429,9 +2407,6 @@ void object_handle_update(Scene *scene, Object *ob) psys_get_modifier(ob, psys)->flag &= ~eParticleSystemFlag_psys_updated; } } -#ifndef DISABLE_PYTHON - if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_OBDATAUPDATE); -#endif } /* the no-group proxy case, we call update */ diff --git a/source/blender/blenkernel/intern/packedFile.c b/source/blender/blenkernel/intern/packedFile.c index 02b0f6a45a0..590189fbd5d 100644 --- a/source/blender/blenkernel/intern/packedFile.c +++ b/source/blender/blenkernel/intern/packedFile.c @@ -360,6 +360,8 @@ int checkPackedFile(char *filename, PackedFile *pf) } } } + + close(file); } } diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index ad53048cf49..e47501335ed 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -2568,8 +2568,7 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra ParticleSettings *part = psys->part; ParticleData *pa; - ParticleKey result, *kkey[2] = {NULL, NULL}; - HairKey *hkey[2] = {NULL, NULL}; + ParticleKey result; ParticleEdit *edit = 0; ParticleEditKey *ekey = 0; @@ -2709,6 +2708,10 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra dietime = birthtime + pa_length * (dietime - birthtime); } + else + /* XXX brecht: don't know if this code from 2.4 is correct + * still, but makes hair appear again in particle mode */ + dietime= pind.hkey[0][pa->totkey-1].time; /*--interpolate actual path from data points--*/ for(k=0, ca=cache[i]; k<=steps; k++, ca++){ @@ -2731,14 +2734,14 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra if(edit){ if(pset->brushtype==PE_BRUSH_WEIGHT){ if(k==steps) - VecLerpf(ca->col, nosel_col, sel_col, hkey[0]->weight); + VecLerpf(ca->col, nosel_col, sel_col, pind.hkey[0]->weight); else VecLerpf(ca->col, nosel_col, sel_col, - (1.0f - keytime) * hkey[0]->weight + keytime * hkey[1]->weight); + (1.0f - keytime) * pind.hkey[0]->weight + keytime * pind.hkey[1]->weight); } else{ - if((ekey + (hkey[0] - pa->hair))->flag & PEK_SELECT){ - if((ekey + (hkey[1] - pa->hair))->flag & PEK_SELECT){ + if((ekey + (pind.hkey[0] - pa->hair))->flag & PEK_SELECT){ + if((ekey + (pind.hkey[1] - pa->hair))->flag & PEK_SELECT){ VECCOPY(ca->col, sel_col); } else{ @@ -2746,7 +2749,7 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra } } else{ - if((ekey + (hkey[1] - pa->hair))->flag & PEK_SELECT){ + if((ekey + (pind.hkey[1] - pa->hair))->flag & PEK_SELECT){ VecLerpf(ca->col, nosel_col, sel_col, keytime); } else{ @@ -3627,8 +3630,6 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i ParticleData *pa; ChildParticle *cpa; ParticleTexture ptex; - ParticleKey *kkey[2] = {NULL, NULL}; - HairKey *hkey[2] = {NULL, NULL}; ParticleKey *par=0, keys[4], tstate; ParticleThreadContext ctx; /* fake thread context for child modifiers */ ParticleInterpolationData pind; diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 45b9739d3c2..873d4fa00be 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -2065,7 +2065,6 @@ void psys_count_keyed_targets(Object *ob, ParticleSystem *psys) { ParticleSystem *kpsys; ParticleTarget *pt = psys->targets.first; - int psys_num = BLI_findindex(&ob->particlesystem, psys); int keys_valid = 1; psys->totkeyed = 0; @@ -2087,7 +2086,6 @@ void psys_count_keyed_targets(Object *ob, ParticleSystem *psys) static void set_keyed_keys(Scene *scene, Object *ob, ParticleSystem *psys) { - Object *kob = ob; ParticleSystem *kpsys = psys; ParticleTarget *pt; ParticleData *pa; @@ -2143,7 +2141,7 @@ static void set_keyed_keys(Scene *scene, Object *ob, ParticleSystem *psys) if(psys->flag & PSYS_KEYED_TIMING && pt->duration!=0.0f) k++; - pt = (pt->next && pt->next->flag & PTARGET_VALID) ? pt = pt->next : psys->targets.first; + pt = (pt->next && pt->next->flag & PTARGET_VALID)? pt->next : psys->targets.first; } psys->flag |= PSYS_KEYED; @@ -3982,7 +3980,8 @@ static void cached_step(Scene *scene, Object *ob, ParticleSystemModifierData *ps /* update alive status and push events */ if(pa->time >= cfra) { pa->alive = pa->time==cfra ? PARS_ALIVE : PARS_UNBORN; - reset_particle(scene, pa, psys, psmd, ob, 0.0f, cfra, NULL, NULL, NULL); + if((psys->pointcache->flag & PTCACHE_EXTERNAL) == 0) + reset_particle(scene, pa, psys, psmd, ob, 0.0f, cfra, NULL, NULL, NULL); } else if(dietime <= cfra){ if(dietime > psys->cfra){ @@ -4303,7 +4302,9 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle oldtotpart = psys->totpart; oldtotchild = psys->totchild; - if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT) + if(psys->pointcache->flag & PTCACHE_EXTERNAL) + totpart = pid.cache->totpoint; + else if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT) totpart = part->grid_res*part->grid_res*part->grid_res; else totpart = psys->part->totpart; diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index cde0587772e..beb72c2c13f 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -181,7 +181,11 @@ static int ptcache_path(PTCacheID *pid, char *filename) lib= (pid)? pid->ob->id.lib: NULL; - if (G.relbase_valid || lib) { + if(pid->cache->flag & PTCACHE_EXTERNAL) { + strcpy(filename, pid->cache->path); + return BLI_add_slash(filename); /* new strlen() */ + } + else if (G.relbase_valid || lib) { char file[MAX_PTCACHE_PATH]; /* we dont want the dir, only the file */ char *blendfilename; @@ -214,14 +218,14 @@ static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, sho filename[0] = '\0'; newname = filename; - if (!G.relbase_valid) return 0; /* save blend file before using disk pointcache */ + if (!G.relbase_valid && (pid->cache->flag & PTCACHE_EXTERNAL)==0) return 0; /* save blend file before using disk pointcache */ /* start with temp dir */ if (do_path) { len = ptcache_path(pid, filename); newname += len; } - if(strcmp(pid->cache->name, "")==0) { + if(strcmp(pid->cache->name, "")==0 && (pid->cache->flag & PTCACHE_EXTERNAL)==0) { idname = (pid->ob->id.name+2); /* convert chars to hex so they are always a valid filename */ while('\0' != *idname) { @@ -238,7 +242,15 @@ static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, sho } if (do_ext) { - snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */ + if(pid->cache->flag & PTCACHE_EXTERNAL) { + if(pid->cache->index >= 0) + snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */ + else + snprintf(newname, MAX_PTCACHE_FILE, "_%06d"PTCACHE_EXT, cfra); /* always 6 chars */ + } + else { + snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */ + } len += 16; } @@ -256,7 +268,7 @@ PTCacheFile *BKE_ptcache_file_open(PTCacheID *pid, int mode, int cfra) if(pid->ob->id.lib && mode == PTCACHE_FILE_WRITE) return NULL; - if (!G.relbase_valid) return NULL; /* save blend file before using disk pointcache */ + if (!G.relbase_valid && (pid->cache->flag & PTCACHE_EXTERNAL)==0) return NULL; /* save blend file before using disk pointcache */ BKE_ptcache_id_filename(pid, filename, cfra, 1, 1); @@ -298,7 +310,7 @@ int BKE_ptcache_file_write_floats(PTCacheFile *pf, float *f, int tot) static int ptcache_pid_elemsize(PTCacheID *pid) { if(pid->type==PTCACHE_TYPE_SOFTBODY) - return 0; // TODO + return 6 * sizeof(float); else if(pid->type==PTCACHE_TYPE_PARTICLES) return sizeof(ParticleKey); else if(pid->type==PTCACHE_TYPE_CLOTH) @@ -308,8 +320,10 @@ static int ptcache_pid_elemsize(PTCacheID *pid) } static int ptcache_pid_totelem(PTCacheID *pid) { - if(pid->type==PTCACHE_TYPE_SOFTBODY) - return 0; // TODO + if(pid->type==PTCACHE_TYPE_SOFTBODY) { + SoftBody *soft = pid->data; + return soft->totpoint; + } else if(pid->type==PTCACHE_TYPE_PARTICLES) { ParticleSystem *psys = pid->data; return psys->totpart; @@ -328,6 +342,21 @@ void BKE_ptcache_update_info(PTCacheID *pid) int totframes = 0; char mem_info[64]; + if(cache->flag & PTCACHE_EXTERNAL) { + int cfra = cache->startframe; + + for(; cfra<=cache->endframe; cfra++) { + if(BKE_ptcache_id_exist(pid, cfra)) + totframes++; + } + + if(totframes) + sprintf(cache->info, "%i points read for %i frames", cache->totpoint, totframes); + else + sprintf(cache->info, "No valid data to read!"); + return; + } + if(cache->flag & PTCACHE_DISK_CACHE) { int cfra = cache->startframe; @@ -743,7 +772,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) char path_full[MAX_PTCACHE_FILE]; char ext[MAX_PTCACHE_PATH]; - if(!pid->cache) + if(!pid->cache || pid->cache->flag & PTCACHE_BAKED) return; /* don't allow clearing for linked objects */ @@ -1408,3 +1437,77 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid) { BKE_ptcache_update_info(pid); } + +void BKE_ptcache_load_external(PTCacheID *pid) +{ + PointCache *cache = pid->cache; + int len; /* store the length of the string */ + + /* mode is same as fopen's modes */ + DIR *dir; + struct dirent *de; + char path[MAX_PTCACHE_PATH]; + char filename[MAX_PTCACHE_FILE]; + char path_full[MAX_PTCACHE_FILE]; + char ext[MAX_PTCACHE_PATH]; + + if(!cache) + return; + + cache->startframe = MAXFRAME; + cache->endframe = -1; + cache->totpoint = 0; + + ptcache_path(pid, path); + + len = BKE_ptcache_id_filename(pid, filename, 1, 0, 0); /* no path */ + + dir = opendir(path); + if (dir==NULL) + return; + + if(cache->index >= 0) + snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, cache->index); + else + strcpy(ext, PTCACHE_EXT); + + while ((de = readdir(dir)) != NULL) { + if (strstr(de->d_name, ext)) { /* do we have the right extension?*/ + if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */ + /* read the number of the file */ + int frame, len2 = strlen(de->d_name); + char num[7]; + + if (len2 > 15) { /* could crash if trying to copy a string out of this range*/ + BLI_strncpy(num, de->d_name + (strlen(de->d_name) - 15), sizeof(num)); + frame = atoi(num); + + cache->startframe = MIN2(cache->startframe, frame); + cache->endframe = MAX2(cache->endframe, frame); + } + } + } + } + closedir(dir); + + if(cache->startframe != MAXFRAME) { + PTCacheFile *pf; + int elemsize = ptcache_pid_elemsize(pid); + int incr = elemsize / sizeof(float); + float *data = NULL; + pf= BKE_ptcache_file_open(pid, PTCACHE_FILE_READ, cache->startframe); + + if(pf) { + data = MEM_callocN(elemsize, "pointcache read data"); + while(BKE_ptcache_file_read_floats(pf, data, incr)) + cache->totpoint++; + + BKE_ptcache_file_close(pf); + MEM_freeN(data); + } + } + + cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED); + + BKE_ptcache_update_info(pid); +} diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 20ed7c1b7eb..d629654c426 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -54,7 +54,6 @@ #include "DNA_meta_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "DNA_scriptlink_types.h" #include "DNA_texture_types.h" #include "DNA_userdef_types.h" @@ -142,10 +141,6 @@ void free_scene(Scene *sce) BLI_freelistN(&sce->base); seq_free_editing(sce->ed); - -#ifndef DISABLE_PYTHON - BPY_free_scriptlink(&sce->scriptlink); -#endif BKE_free_animdata((ID *)sce); BKE_keyingsets_free(&sce->keyingsets); @@ -398,9 +393,6 @@ void set_scene_bg(Scene *scene) ob->ctime= -1234567.0; /* force ipo to be calculated later */ } /* no full animation update, this to enable render code to work (render code calls own animation updates) */ - - /* do we need FRAMECHANGED in set_scene? */ -// if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED, 0); } /* called from creator.c */ @@ -659,9 +651,6 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay) /* clear animation overrides */ // XXX TODO... -#ifndef DISABLE_PYTHON - if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_FRAMECHANGED, 0); -#endif /* sets first, we allow per definition current scene to have dependencies on sets */ for(sce= sce->set; sce; sce= sce->set) scene_update(sce, lay); diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index d7aa38d5d03..cc740d7fb3d 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -112,7 +112,7 @@ ARegionType *BKE_regiontype_from_id(SpaceType *st, int regionid) if(art->regionid==regionid) return art; - printf("Error, region type missing in %s\n", st->name); + printf("Error, region type missing in - name:\"%s\", id:%d\n", st->name, st->spaceid); return st->regiontypes.first; } @@ -179,6 +179,9 @@ ARegion *BKE_area_region_copy(SpaceType *st, ARegion *ar) else newar->regiondata= MEM_dupallocN(ar->regiondata); } + + if(ar->v2d.tab_offset) + newar->v2d.tab_offset= MEM_dupallocN(ar->v2d.tab_offset); newar->panels.first= newar->panels.last= NULL; BLI_duplicatelist(&newar->panels, &ar->panels); @@ -271,10 +274,14 @@ void BKE_area_region_free(SpaceType *st, ARegion *ar) } else if(ar->type && ar->type->free) ar->type->free(ar); + + if(ar->v2d.tab_offset) { + MEM_freeN(ar->v2d.tab_offset); + ar->v2d.tab_offset= NULL; + } - if(ar) { + if(ar) BLI_freelistN(&ar->panels); - } } /* not area itself */ @@ -291,10 +298,6 @@ void BKE_screen_area_free(ScrArea *sa) BKE_spacedata_freelist(&sa->spacedata); BLI_freelistN(&sa->actionzones); - -#ifndef DISABLE_PYTHON - BPY_free_scriptlink(&sa->scriptlink); -#endif } /* don't free screen itself */ diff --git a/source/blender/blenkernel/intern/sequence.c b/source/blender/blenkernel/intern/sequence.c index 3eeecd94a85..3b675a87e59 100644 --- a/source/blender/blenkernel/intern/sequence.c +++ b/source/blender/blenkernel/intern/sequence.c @@ -32,6 +32,7 @@ #include <math.h> #include "MEM_guardedalloc.h" +#include "MEM_CacheLimiterC-Api.h" #include "DNA_listBase.h" #include "DNA_sequence_types.h" @@ -58,7 +59,7 @@ /* **** XXX ******** */ static int seqrectx= 0; /* bad bad global! */ static int seqrecty= 0; -static void waitcursor() {} +static void waitcursor(int val) {} static int blender_test_break() {return 0;} /* **** XXX ******** */ @@ -122,7 +123,7 @@ void new_tstripdata(Sequence *seq) /* free */ -static void free_proxy_seq(Sequence *seq) +void free_proxy_seq(Sequence *seq) { if (seq->strip && seq->strip->proxy && seq->strip->proxy->anim) { IMB_free_anim(seq->strip->proxy->anim); @@ -3039,11 +3040,36 @@ void free_imbuf_seq_except(Scene *scene, int cfra) SEQ_END } -void free_imbuf_seq(ListBase * seqbase) +void free_imbuf_seq(ListBase * seqbase, int check_mem_usage) { Sequence *seq; TStripElem *se; int a; + + if (check_mem_usage) { + /* Let the cache limitor take care of this (schlaile) */ + /* While render let's keep all memory available for render + (ton) + At least if free memory is tight... + This can make a big difference in encoding speed + (it is around 4 times(!) faster, if we do not waste time + on freeing _all_ buffers every time on long timelines...) + (schlaile) + */ + + uintptr_t mem_in_use; + uintptr_t mmap_in_use; + uintptr_t max; + + mem_in_use= MEM_get_memory_in_use(); + mmap_in_use= MEM_get_mapped_memory_in_use(); + max = MEM_CacheLimiter_get_maximum(); + + if (max == 0 || mem_in_use + mmap_in_use <= max) { + return; + } + } + for(seq= seqbase->first; seq; seq= seq->next) { if(seq->strip) { @@ -3076,7 +3102,11 @@ void free_imbuf_seq(ListBase * seqbase) } } if(seq->type==SEQ_META) { - free_imbuf_seq(&seq->seqbase); + free_imbuf_seq(&seq->seqbase, FALSE); + } + if(seq->type==SEQ_SCENE) { + /* FIXME: recurs downwards, + but do recurs protection somehow! */ } } @@ -3174,88 +3204,6 @@ void free_imbuf_seq_with_ipo(Scene *scene, struct Ipo *ipo) SEQ_END } -#if 0 -/* bad levell call... */ -void do_render_seq(RenderResult *rr, int cfra) -{ - static int recurs_depth = 0 - ImBuf *ibuf; - - recurs_depth++; - - ibuf= give_ibuf_seq(rr->rectx, rr->recty, cfra, 0, 100.0); - - recurs_depth--; - - if(ibuf) { - if(ibuf->rect_float) { - if (!rr->rectf) - rr->rectf= MEM_mallocN(4*sizeof(float)*rr->rectx*rr->recty, "render_seq rectf"); - - memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty); - - /* TSK! Since sequence render doesn't free the *rr render result, the old rect32 - can hang around when sequence render has rendered a 32 bits one before */ - if(rr->rect32) { - MEM_freeN(rr->rect32); - rr->rect32= NULL; - } - } - else if(ibuf->rect) { - if (!rr->rect32) - rr->rect32= MEM_mallocN(sizeof(int)*rr->rectx*rr->recty, "render_seq rect"); - - memcpy(rr->rect32, ibuf->rect, 4*rr->rectx*rr->recty); - - /* if (ibuf->zbuf) { */ - /* if (R.rectz) freeN(R.rectz); */ - /* R.rectz = BLI_dupallocN(ibuf->zbuf); */ - /* } */ - } - - /* Let the cache limitor take care of this (schlaile) */ - /* While render let's keep all memory available for render - (ton) - At least if free memory is tight... - This can make a big difference in encoding speed - (it is around 4 times(!) faster, if we do not waste time - on freeing _all_ buffers every time on long timelines...) - (schlaile) - */ - if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */ - uintptr_t mem_in_use; - uintptr_t mmap_in_use; - uintptr_t max; - - mem_in_use= MEM_get_memory_in_use(); - mmap_in_use= MEM_get_mapped_memory_in_use(); - max = MEM_CacheLimiter_get_maximum(); - - if (max != 0 && mem_in_use + mmap_in_use > max) { - fprintf(stderr, "Memory in use > maximum memory\n"); - fprintf(stderr, "Cleaning up, please wait...\n" - "If this happens very often,\n" - "consider " - "raising the memcache limit in the " - "user preferences.\n"); - free_imbuf_seq(); - } - free_proxy_seq(seq); - } - } - else { - /* render result is delivered empty in most cases, nevertheless we handle all cases */ - if (rr->rectf) - memset(rr->rectf, 0, 4*sizeof(float)*rr->rectx*rr->recty); - else if (rr->rect32) - memset(rr->rect32, 0, 4*rr->rectx*rr->recty); - else - rr->rect32= MEM_callocN(sizeof(int)*rr->rectx*rr->recty, "render_seq rect"); - } -} - -#endif - /* seq funcs's for transforming internally notice the difference between start/end and left/right. diff --git a/source/blender/blenkernel/intern/sketch.c b/source/blender/blenkernel/intern/sketch.c new file mode 100644 index 00000000000..8deae7e8e10 --- /dev/null +++ b/source/blender/blenkernel/intern/sketch.c @@ -0,0 +1,600 @@ +/** + * + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <string.h> +#include <math.h> +#include <float.h> + +#include "MEM_guardedalloc.h" + +#include "BLI_blenlib.h" +#include "BLI_arithb.h" + +#include "BKE_sketch.h" +#include "BKE_utildefines.h" + +#include "DNA_userdef_types.h" + +void freeSketch(SK_Sketch *sketch) +{ + SK_Stroke *stk, *next; + + for (stk = sketch->strokes.first; stk; stk = next) + { + next = stk->next; + + sk_freeStroke(stk); + } + + BLI_freelistN(&sketch->depth_peels); + + MEM_freeN(sketch); +} + +SK_Sketch* createSketch() +{ + SK_Sketch *sketch; + + sketch = MEM_callocN(sizeof(SK_Sketch), "SK_Sketch"); + + sketch->active_stroke = NULL; + sketch->gesture = NULL; + + sketch->strokes.first = NULL; + sketch->strokes.last = NULL; + + return sketch; +} + +void sk_initPoint(SK_Point *pt, SK_DrawData *dd, float *no) +{ + if (no) + { + VECCOPY(pt->no, no); + Normalize(pt->no); + } + else + { + pt->no[0] = 0; + pt->no[1] = 0; + pt->no[2] = 1; + } + pt->p2d[0] = dd->mval[0]; + pt->p2d[1] = dd->mval[1]; + /* more init code here */ +} + +void sk_copyPoint(SK_Point *dst, SK_Point *src) +{ + memcpy(dst, src, sizeof(SK_Point)); +} + +void sk_allocStrokeBuffer(SK_Stroke *stk) +{ + stk->points = MEM_callocN(sizeof(SK_Point) * stk->buf_size, "SK_Point buffer"); +} + +void sk_freeStroke(SK_Stroke *stk) +{ + MEM_freeN(stk->points); + MEM_freeN(stk); +} + +SK_Stroke* sk_createStroke() +{ + SK_Stroke *stk; + + stk = MEM_callocN(sizeof(SK_Stroke), "SK_Stroke"); + + stk->selected = 0; + stk->nb_points = 0; + stk->buf_size = SK_Stroke_BUFFER_INIT_SIZE; + + sk_allocStrokeBuffer(stk); + + return stk; +} + +void sk_shrinkStrokeBuffer(SK_Stroke *stk) +{ + if (stk->nb_points < stk->buf_size) + { + SK_Point *old_points = stk->points; + + stk->buf_size = stk->nb_points; + + sk_allocStrokeBuffer(stk); + + memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points); + + MEM_freeN(old_points); + } +} + +void sk_growStrokeBuffer(SK_Stroke *stk) +{ + if (stk->nb_points == stk->buf_size) + { + SK_Point *old_points = stk->points; + + stk->buf_size *= 2; + + sk_allocStrokeBuffer(stk); + + memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points); + + MEM_freeN(old_points); + } +} + +void sk_growStrokeBufferN(SK_Stroke *stk, int n) +{ + if (stk->nb_points + n > stk->buf_size) + { + SK_Point *old_points = stk->points; + + while (stk->nb_points + n > stk->buf_size) + { + stk->buf_size *= 2; + } + + sk_allocStrokeBuffer(stk); + + memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points); + + MEM_freeN(old_points); + } +} + + +void sk_replaceStrokePoint(SK_Stroke *stk, SK_Point *pt, int n) +{ + memcpy(stk->points + n, pt, sizeof(SK_Point)); +} + +void sk_insertStrokePoint(SK_Stroke *stk, SK_Point *pt, int n) +{ + int size = stk->nb_points - n; + + sk_growStrokeBuffer(stk); + + memmove(stk->points + n + 1, stk->points + n, size * sizeof(SK_Point)); + + memcpy(stk->points + n, pt, sizeof(SK_Point)); + + stk->nb_points++; +} + +void sk_appendStrokePoint(SK_Stroke *stk, SK_Point *pt) +{ + sk_growStrokeBuffer(stk); + + memcpy(stk->points + stk->nb_points, pt, sizeof(SK_Point)); + + stk->nb_points++; +} + +void sk_insertStrokePoints(SK_Stroke *stk, SK_Point *pts, int len, int start, int end) +{ + int size = end - start + 1; + + sk_growStrokeBufferN(stk, len - size); + + if (len != size) + { + int tail_size = stk->nb_points - end + 1; + + memmove(stk->points + start + len, stk->points + end + 1, tail_size * sizeof(SK_Point)); + } + + memcpy(stk->points + start, pts, len * sizeof(SK_Point)); + + stk->nb_points += len - size; +} + +void sk_trimStroke(SK_Stroke *stk, int start, int end) +{ + int size = end - start + 1; + + if (start > 0) + { + memmove(stk->points, stk->points + start, size * sizeof(SK_Point)); + } + + stk->nb_points = size; +} + +void sk_straightenStroke(SK_Stroke *stk, int start, int end, float p_start[3], float p_end[3]) +{ + SK_Point pt1, pt2; + SK_Point *prev, *next; + float delta_p[3]; + int i, total; + + total = end - start; + + VecSubf(delta_p, p_end, p_start); + + prev = stk->points + start; + next = stk->points + end; + + VECCOPY(pt1.p, p_start); + VECCOPY(pt1.no, prev->no); + pt1.mode = prev->mode; + pt1.type = prev->type; + + VECCOPY(pt2.p, p_end); + VECCOPY(pt2.no, next->no); + pt2.mode = next->mode; + pt2.type = next->type; + + sk_insertStrokePoint(stk, &pt1, start + 1); /* insert after start */ + sk_insertStrokePoint(stk, &pt2, end + 1); /* insert before end (since end was pushed back already) */ + + for (i = 1; i < total; i++) + { + float delta = (float)i / (float)total; + float *p = stk->points[start + 1 + i].p; + + VECCOPY(p, delta_p); + VecMulf(p, delta); + VecAddf(p, p, p_start); + } +} + +void sk_polygonizeStroke(SK_Stroke *stk, int start, int end) +{ + int offset; + int i; + + /* find first exact points outside of range */ + for (;start > 0; start--) + { + if (stk->points[start].type == PT_EXACT) + { + break; + } + } + + for (;end < stk->nb_points - 1; end++) + { + if (stk->points[end].type == PT_EXACT) + { + break; + } + } + + offset = start + 1; + + for (i = start + 1; i < end; i++) + { + if (stk->points[i].type == PT_EXACT) + { + if (offset != i) + { + memcpy(stk->points + offset, stk->points + i, sizeof(SK_Point)); + } + + offset++; + } + } + + /* some points were removes, move end of array */ + if (offset < end) + { + int size = stk->nb_points - end; + memmove(stk->points + offset, stk->points + end, size * sizeof(SK_Point)); + stk->nb_points = offset + size; + } +} + +void sk_flattenStroke(SK_Stroke *stk, int start, int end) +{ + float normal[3], distance[3]; + float limit; + int i, total; + + total = end - start + 1; + + VECCOPY(normal, stk->points[start].no); + + VecSubf(distance, stk->points[end].p, stk->points[start].p); + Projf(normal, distance, normal); + limit = Normalize(normal); + + for (i = 1; i < total - 1; i++) + { + float d = limit * i / total; + float offset[3]; + float *p = stk->points[start + i].p; + + VecSubf(distance, p, stk->points[start].p); + Projf(distance, distance, normal); + + VECCOPY(offset, normal); + VecMulf(offset, d); + + VecSubf(p, p, distance); + VecAddf(p, p, offset); + } +} + +void sk_removeStroke(SK_Sketch *sketch, SK_Stroke *stk) +{ + if (sketch->active_stroke == stk) + { + sketch->active_stroke = NULL; + } + + BLI_remlink(&sketch->strokes, stk); + sk_freeStroke(stk); +} + +void sk_reverseStroke(SK_Stroke *stk) +{ + SK_Point *old_points = stk->points; + int i = 0; + + sk_allocStrokeBuffer(stk); + + for (i = 0; i < stk->nb_points; i++) + { + sk_copyPoint(stk->points + i, old_points + stk->nb_points - 1 - i); + } + + MEM_freeN(old_points); +} + + +/* Ramer-Douglas-Peucker algorithm for line simplification */ +void sk_filterStroke(SK_Stroke *stk, int start, int end) +{ + SK_Point *old_points = stk->points; + int nb_points = stk->nb_points; + char *marked = NULL; + char work; + int i; + + if (start == -1) + { + start = 0; + end = stk->nb_points - 1; + } + + sk_allocStrokeBuffer(stk); + stk->nb_points = 0; + + /* adding points before range */ + for (i = 0; i < start; i++) + { + sk_appendStrokePoint(stk, old_points + i); + } + + marked = MEM_callocN(nb_points, "marked array"); + marked[start] = 1; + marked[end] = 1; + + work = 1; + + /* while still reducing */ + while (work) + { + int ls, le; + work = 0; + + ls = start; + le = start+1; + + /* while not over interval */ + while (ls < end) + { + int max_i = 0; + short v1[2]; + float max_dist = 16; /* more than 4 pixels */ + + /* find the next marked point */ + while(marked[le] == 0) + { + le++; + } + + /* perpendicular vector to ls-le */ + v1[1] = old_points[le].p2d[0] - old_points[ls].p2d[0]; + v1[0] = old_points[ls].p2d[1] - old_points[le].p2d[1]; + + + for( i = ls + 1; i < le; i++ ) + { + float mul; + float dist; + short v2[2]; + + v2[0] = old_points[i].p2d[0] - old_points[ls].p2d[0]; + v2[1] = old_points[i].p2d[1] - old_points[ls].p2d[1]; + + if (v2[0] == 0 && v2[1] == 0) + { + continue; + } + + mul = (float)(v1[0]*v2[0] + v1[1]*v2[1]) / (float)(v2[0]*v2[0] + v2[1]*v2[1]); + + dist = mul * mul * (v2[0]*v2[0] + v2[1]*v2[1]); + + if (dist > max_dist) + { + max_dist = dist; + max_i = i; + } + } + + if (max_i != 0) + { + work = 1; + marked[max_i] = 1; + } + + ls = le; + le = ls + 1; + } + } + + + /* adding points after range */ + for (i = start; i <= end; i++) + { + if (marked[i]) + { + sk_appendStrokePoint(stk, old_points + i); + } + } + + MEM_freeN(marked); + + /* adding points after range */ + for (i = end + 1; i < nb_points; i++) + { + sk_appendStrokePoint(stk, old_points + i); + } + + MEM_freeN(old_points); + + sk_shrinkStrokeBuffer(stk); +} + + +void sk_filterLastContinuousStroke(SK_Stroke *stk) +{ + int start, end; + + end = stk->nb_points -1; + + for (start = end - 1; start > 0 && stk->points[start].type == PT_CONTINUOUS; start--) + { + /* nothing to do here*/ + } + + if (end - start > 1) + { + sk_filterStroke(stk, start, end); + } +} + +SK_Point *sk_lastStrokePoint(SK_Stroke *stk) +{ + SK_Point *pt = NULL; + + if (stk->nb_points > 0) + { + pt = stk->points + (stk->nb_points - 1); + } + + return pt; +} + +void sk_endContinuousStroke(SK_Stroke *stk) +{ + stk->points[stk->nb_points - 1].type = PT_EXACT; +} + +void sk_updateNextPoint(SK_Sketch *sketch, SK_Stroke *stk) +{ + if (stk) + { + memcpy(&sketch->next_point, stk->points[stk->nb_points - 1].p, sizeof(SK_Point)); + } +} + +int sk_stroke_filtermval(SK_DrawData *dd) +{ + int retval = 0; + if (ABS(dd->mval[0] - dd->previous_mval[0]) + ABS(dd->mval[1] - dd->previous_mval[1]) > U.gp_manhattendist) + { + retval = 1; + } + + return retval; +} + +void sk_initDrawData(SK_DrawData *dd, short mval[2]) +{ + dd->mval[0] = mval[0]; + dd->mval[1] = mval[1]; + dd->previous_mval[0] = -1; + dd->previous_mval[1] = -1; + dd->type = PT_EXACT; +} + + +void sk_deleteSelectedStrokes(SK_Sketch *sketch) +{ + SK_Stroke *stk, *next; + + for (stk = sketch->strokes.first; stk; stk = next) + { + next = stk->next; + + if (stk->selected == 1) + { + sk_removeStroke(sketch, stk); + } + } +} + +void sk_selectAllSketch(SK_Sketch *sketch, int mode) +{ + SK_Stroke *stk = NULL; + + if (mode == -1) + { + for (stk = sketch->strokes.first; stk; stk = stk->next) + { + stk->selected = 0; + } + } + else if (mode == 0) + { + for (stk = sketch->strokes.first; stk; stk = stk->next) + { + stk->selected = 1; + } + } + else if (mode == 1) + { + int selected = 1; + + for (stk = sketch->strokes.first; stk; stk = stk->next) + { + selected &= stk->selected; + } + + selected ^= 1; + + for (stk = sketch->strokes.first; stk; stk = stk->next) + { + stk->selected = selected; + } + } +} diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c new file mode 100644 index 00000000000..b461592f35f --- /dev/null +++ b/source/blender/blenkernel/intern/smoke.c @@ -0,0 +1,1503 @@ +/** + * BKE_cloth.h + * + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Daniel Genrich + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/* Part of the code copied from elbeem fluid library, copyright by Nils Thuerey */ + +#include <GL/glew.h> + +#include "MEM_guardedalloc.h" + +#include <float.h> +#include <math.h> +#include "stdio.h" + +#include "BLI_linklist.h" +#include "BLI_rand.h" +#include "BLI_jitter.h" +#include "BLI_blenlib.h" +#include "BLI_arithb.h" +#include "BLI_edgehash.h" +#include "BLI_kdtree.h" +#include "BLI_kdopbvh.h" + +#include "BKE_bvhutils.h" +#include "BKE_cdderivedmesh.h" +#include "BKE_customdata.h" +#include "BKE_DerivedMesh.h" +#include "BKE_modifier.h" +#include "BKE_particle.h" +#include "BKE_utildefines.h" + +#include "DNA_customdata_types.h" +#include "DNA_group_types.h" +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" +#include "DNA_particle_types.h" +#include "DNA_scene_types.h" +#include "DNA_smoke_types.h" + +#include "smoke_API.h" + +#include "BKE_smoke.h" + +#ifdef _WIN32 +#include <time.h> +#include <stdio.h> +#include <conio.h> +#include <windows.h> + +static LARGE_INTEGER liFrequency; +static LARGE_INTEGER liStartTime; +static LARGE_INTEGER liCurrentTime; + +static void tstart ( void ) +{ + QueryPerformanceFrequency ( &liFrequency ); + QueryPerformanceCounter ( &liStartTime ); +} +static void tend ( void ) +{ + QueryPerformanceCounter ( &liCurrentTime ); +} +static double tval() +{ + return ((double)( (liCurrentTime.QuadPart - liStartTime.QuadPart)* (double)1000.0/(double)liFrequency.QuadPart )); +} +#else +#include <sys/time.h> +static struct timeval _tstart, _tend; +static struct timezone tz; +static void tstart ( void ) +{ + gettimeofday ( &_tstart, &tz ); +} +static void tend ( void ) +{ + gettimeofday ( &_tend,&tz ); +} +static double tval() +{ + double t1, t2; + t1 = ( double ) _tstart.tv_sec*1000 + ( double ) _tstart.tv_usec/ ( 1000 ); + t2 = ( double ) _tend.tv_sec*1000 + ( double ) _tend.tv_usec/ ( 1000 ); + return t2-t1; +} +#endif + +struct Object; +struct Scene; +struct DerivedMesh; +struct SmokeModifierData; + +// forward declerations +static void get_cell(struct SmokeModifierData *smd, float *pos, int *cell, int correct); +static void get_bigcell(struct SmokeModifierData *smd, float *pos, int *cell, int correct); +void calcTriangleDivs(Object *ob, MVert *verts, int numverts, MFace *tris, int numfaces, int numtris, int **tridivs, float cell_len); + +#define TRI_UVOFFSET (1./4.) + + +BVHTree *bvhtree_build_from_smoke ( float mat[4][4], MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int numverts, float epsilon ) +{ + BVHTree *tree; + float co[12]; + int i; + MFace *tface = mfaces; + + // calc quads + // todo + + tree = BLI_bvhtree_new ( numfaces, epsilon, 2, 6 ); + + // fill tree + for ( i = 0; i < numfaces; i++, tface++ ) + { + VECCOPY ( &co[0*3], x[tface->v1].co ); + Mat4MulVecfl (mat, &co[0*3]); + VECCOPY ( &co[1*3], x[tface->v2].co ); + Mat4MulVecfl (mat, &co[1*3]); + VECCOPY ( &co[2*3], x[tface->v3].co ); + Mat4MulVecfl (mat, &co[2*3]); + + if ( tface->v4 ) + { + VECCOPY ( &co[3*3], x[tface->v4].co ); + Mat4MulVecfl (mat, &co[3*3]); + } + + BLI_bvhtree_insert ( tree, i, co, ( mfaces->v4 ? 4 : 3 ) ); + } + + // balance tree + BLI_bvhtree_balance ( tree ); + + return tree; +} + +void bvhtree_update_from_smoke ( float mat[4][4], BVHTree * bvhtree, MFace *faces, int numfaces, MVert *x, int numverts) +{ + int i; + MFace *mfaces = faces; + float co[12]; + int ret = 0; + + if ( !bvhtree ) + return; + + if ( x ) + { + for ( i = 0; i < numfaces; i++, mfaces++ ) + { + VECCOPY ( &co[0*3], x[mfaces->v1].co ); + Mat4MulVecfl (mat, &co[0*3]); + VECCOPY ( &co[1*3], x[mfaces->v2].co ); + Mat4MulVecfl (mat, &co[1*3]); + VECCOPY ( &co[2*3], x[mfaces->v3].co ); + Mat4MulVecfl (mat, &co[2*3]); + + if ( mfaces->v4 ) + { + VECCOPY ( &co[3*3], x[mfaces->v4].co ); + Mat4MulVecfl (mat, &co[3*3]); + } + + ret = BLI_bvhtree_update_node ( bvhtree, i, co, NULL, ( mfaces->v4 ? 4 : 3 ) ); + + // check if tree is already full + if ( !ret ) + break; + } + + BLI_bvhtree_update_tree ( bvhtree ); + } +} + +int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, DerivedMesh *dm) +{ + if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain && !smd->domain->fluid) + { + size_t i; + float min[3] = {FLT_MAX, FLT_MAX, FLT_MAX}, max[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX}; + float size[3]; + MVert *verts = dm->getVertArray(dm); + float scale = 0.0; + int res; + + res = smd->domain->maxres; + + // get BB of domain + for(i = 0; i < dm->getNumVerts(dm); i++) + { + float tmp[3]; + + VECCOPY(tmp, verts[i].co); + Mat4MulVecfl(ob->obmat, tmp); + + // min BB + min[0] = MIN2(min[0], tmp[0]); + min[1] = MIN2(min[1], tmp[1]); + min[2] = MIN2(min[2], tmp[2]); + + // max BB + max[0] = MAX2(max[0], tmp[0]); + max[1] = MAX2(max[1], tmp[1]); + max[2] = MAX2(max[2], tmp[2]); + } + + VECCOPY(smd->domain->p0, min); + VECCOPY(smd->domain->p1, max); + + // calc other res with max_res provided + VECSUB(size, max, min); + if(size[0] > size[1]) + { + if(size[0] > size[1]) + { + scale = res / size[0]; + smd->domain->dx = size[0] / res; + smd->domain->res[0] = res; + smd->domain->res[1] = (int)(size[1] * scale + 0.5); + smd->domain->res[2] = (int)(size[2] * scale + 0.5); + } + else + { + scale = res / size[1]; + smd->domain->dx = size[1] / res; + smd->domain->res[1] = res; + smd->domain->res[0] = (int)(size[0] * scale + 0.5); + smd->domain->res[2] = (int)(size[2] * scale + 0.5); + } + } + else + { + if(size[1] > size[2]) + { + scale = res / size[1]; + smd->domain->dx = size[1] / res; + smd->domain->res[1] = res; + smd->domain->res[0] = (int)(size[0] * scale + 0.5); + smd->domain->res[2] = (int)(size[2] * scale + 0.5); + } + else + { + scale = res / size[2]; + smd->domain->dx = size[2] / res; + smd->domain->res[2] = res; + smd->domain->res[0] = (int)(size[0] * scale + 0.5); + smd->domain->res[1] = (int)(size[1] * scale + 0.5); + } + } + + // TODO: put in failsafe if res<=0 - dg + + // printf("res[0]: %d, res[1]: %d, res[2]: %d\n", smd->domain->res[0], smd->domain->res[1], smd->domain->res[2]); + + // dt max is 0.1 + smd->domain->fluid = smoke_init(smd->domain->res, smd->domain->amplify, smd->domain->p0, smd->domain->p1, 2.5 / FPS); + smd->time = scene->r.cfra; + smd->domain->firstframe = smd->time; + + smoke_initBlenderRNA(smd->domain->fluid, &(smd->domain->alpha), &(smd->domain->beta)); + + return 1; + } + else if((smd->type & MOD_SMOKE_TYPE_FLOW) && smd->flow) + { + // handle flow object here + // XXX TODO + + smd->time = scene->r.cfra; + + // update particle lifetime to be one frame + // smd->flow->psys->part->lifetime = scene->r.efra + 1; + + return 1; + } + else if((smd->type & MOD_SMOKE_TYPE_COLL)) + { + smd->time = scene->r.cfra; + + // todo: delete this when loading colls work -dg + if(!smd->coll) + smokeModifier_createType(smd); + + if(!smd->coll->points) + { + // init collision points + SmokeCollSettings *scs = smd->coll; + MVert *mvert = dm->getVertArray(dm); + MFace *mface = dm->getTessFaceArray(dm); + size_t i = 0, divs = 0; + int *tridivs = NULL; + float cell_len = 1.0 / 50.0; // for res = 50 + size_t newdivs = 0; + size_t max_points = 0; + size_t quads = 0, facecounter = 0; + + // count quads + for(i = 0; i < dm->getNumFaces(dm); i++) + { + if(mface[i].v4) + quads++; + } + + calcTriangleDivs(ob, mvert, dm->getNumVerts(dm), mface, dm->getNumFaces(dm), dm->getNumFaces(dm) + quads, &tridivs, cell_len); + + // count triangle divisions + for(i = 0; i < dm->getNumFaces(dm) + quads; i++) + { + divs += (tridivs[3 * i] + 1) * (tridivs[3 * i + 1] + 1) * (tridivs[3 * i + 2] + 1); + } + + // printf("divs: %d\n", divs); + + scs->points = MEM_callocN(sizeof(float) * (dm->getNumVerts(dm) + divs) * 3, "SmokeCollPoints"); + + for(i = 0; i < dm->getNumVerts(dm); i++) + { + float tmpvec[3]; + VECCOPY(tmpvec, mvert[i].co); + Mat4MulVecfl (ob->obmat, tmpvec); + VECCOPY(&scs->points[i * 3], tmpvec); + } + + for(i = 0, facecounter = 0; i < dm->getNumFaces(dm); i++) + { + int again = 0; + do + { + size_t j, k; + int divs1 = tridivs[3 * facecounter + 0]; + int divs2 = tridivs[3 * facecounter + 1]; + int divs3 = tridivs[3 * facecounter + 2]; + float side1[3], side2[3], trinormorg[3], trinorm[3]; + + if(again == 1 && mface[i].v4) + { + VECSUB(side1, mvert[ mface[i].v3 ].co, mvert[ mface[i].v1 ].co); + VECSUB(side2, mvert[ mface[i].v4 ].co, mvert[ mface[i].v1 ].co); + } + else + { + VECSUB(side1, mvert[ mface[i].v2 ].co, mvert[ mface[i].v1 ].co); + VECSUB(side2, mvert[ mface[i].v3 ].co, mvert[ mface[i].v1 ].co); + } + + Crossf(trinormorg, side1, side2); + Normalize(trinormorg); + VECCOPY(trinorm, trinormorg); + VecMulf(trinorm, 0.25 * cell_len); + + for(j = 0; j <= divs1; j++) + { + for(k = 0; k <= divs2; k++) + { + float p1[3], p2[3], p3[3], p[3]={0,0,0}; + const float uf = (float)(j + TRI_UVOFFSET) / (float)(divs1 + 0.0); + const float vf = (float)(k + TRI_UVOFFSET) / (float)(divs2 + 0.0); + float tmpvec[3]; + + if(uf+vf > 1.0) + { + // printf("bigger - divs1: %d, divs2: %d\n", divs1, divs2); + continue; + } + + VECCOPY(p1, mvert[ mface[i].v1 ].co); + if(again == 1 && mface[i].v4) + { + VECCOPY(p2, mvert[ mface[i].v3 ].co); + VECCOPY(p3, mvert[ mface[i].v4 ].co); + } + else + { + VECCOPY(p2, mvert[ mface[i].v2 ].co); + VECCOPY(p3, mvert[ mface[i].v3 ].co); + } + + VecMulf(p1, (1.0-uf-vf)); + VecMulf(p2, uf); + VecMulf(p3, vf); + + VECADD(p, p1, p2); + VECADD(p, p, p3); + + if(newdivs > divs) + printf("mem problem\n"); + + // mMovPoints.push_back(p + trinorm); + VECCOPY(tmpvec, p); + VECADD(tmpvec, tmpvec, trinorm); + Mat4MulVecfl (ob->obmat, tmpvec); + VECCOPY(&scs->points[3 * (dm->getNumVerts(dm) + newdivs)], tmpvec); + newdivs++; + + if(newdivs > divs) + printf("mem problem\n"); + + // mMovPoints.push_back(p - trinorm); + VECCOPY(tmpvec, p); + VECSUB(tmpvec, tmpvec, trinorm); + Mat4MulVecfl (ob->obmat, tmpvec); + VECCOPY(&scs->points[3 * (dm->getNumVerts(dm) + newdivs)], tmpvec); + newdivs++; + } + } + + if(again == 0 && mface[i].v4) + again++; + else + again = 0; + + facecounter++; + + } while(again!=0); + } + + scs->numpoints = dm->getNumVerts(dm) + newdivs; + + MEM_freeN(tridivs); + } + + if(!smd->coll->bvhtree) + { + smd->coll->bvhtree = bvhtree_build_from_smoke ( ob->obmat, dm->getTessFaceArray(dm), dm->getNumFaces(dm), dm->getVertArray(dm), dm->getNumVerts(dm), 0.0 ); + } + + } + + return 0; +} + +/*! init triangle divisions */ +void calcTriangleDivs(Object *ob, MVert *verts, int numverts, MFace *faces, int numfaces, int numtris, int **tridivs, float cell_len) +{ + // mTriangleDivs1.resize( faces.size() ); + // mTriangleDivs2.resize( faces.size() ); + // mTriangleDivs3.resize( faces.size() ); + + size_t i = 0, facecounter = 0; + float maxscale[3] = {1,1,1}; // = channelFindMaxVf(mcScale); + float maxpart = ABS(maxscale[0]); + float scaleFac = 0; + float fsTri = 0; + if(ABS(maxscale[1])>maxpart) maxpart = ABS(maxscale[1]); + if(ABS(maxscale[2])>maxpart) maxpart = ABS(maxscale[2]); + scaleFac = 1.0 / maxpart; + // featureSize = mLevel[mMaxRefine].nodeSize + fsTri = cell_len * 0.5 * scaleFac; + + if(*tridivs) + MEM_freeN(*tridivs); + + *tridivs = MEM_callocN(sizeof(int) * numtris * 3, "Smoke_Tridivs"); + + for(i = 0, facecounter = 0; i < numfaces; i++) + { + float p0[3], p1[3], p2[3]; + float side1[3]; + float side2[3]; + float side3[3]; + int divs1=0, divs2=0, divs3=0; + + VECCOPY(p0, verts[faces[i].v1].co); + Mat4MulVecfl (ob->obmat, p0); + VECCOPY(p1, verts[faces[i].v2].co); + Mat4MulVecfl (ob->obmat, p1); + VECCOPY(p2, verts[faces[i].v3].co); + Mat4MulVecfl (ob->obmat, p2); + + VECSUB(side1, p1, p0); + VECSUB(side2, p2, p0); + VECSUB(side3, p1, p2); + + if(INPR(side1, side1) > fsTri*fsTri) + { + float tmp = Normalize(side1); + divs1 = (int)(tmp/fsTri); + } + if(INPR(side2, side2) > fsTri*fsTri) + { + float tmp = Normalize(side2); + divs2 = (int)(tmp/fsTri); + + /* + // debug + if(i==0) + printf("b tmp: %f, fsTri: %f, divs2: %d\n", tmp, fsTri, divs2); + */ + } + + (*tridivs)[3 * facecounter + 0] = divs1; + (*tridivs)[3 * facecounter + 1] = divs2; + (*tridivs)[3 * facecounter + 2] = divs3; + + // TODO quad case + if(faces[i].v4) + { + divs1=0, divs2=0, divs3=0; + + facecounter++; + + VECCOPY(p1, verts[faces[i].v3].co); + Mat4MulVecfl (ob->obmat, p1); + VECCOPY(p2, verts[faces[i].v4].co); + Mat4MulVecfl (ob->obmat, p2); + + VECSUB(side1, p1, p0); + VECSUB(side2, p2, p0); + VECSUB(side3, p1, p2); + + if(INPR(side1, side1) > fsTri*fsTri) + { + float tmp = Normalize(side1); + divs1 = (int)(tmp/fsTri); + } + if(INPR(side2, side2) > fsTri*fsTri) + { + float tmp = Normalize(side2); + divs2 = (int)(tmp/fsTri); + } + + (*tridivs)[3 * facecounter + 0] = divs1; + (*tridivs)[3 * facecounter + 1] = divs2; + (*tridivs)[3 * facecounter + 2] = divs3; + } + facecounter++; + } +} + +void smokeModifier_freeDomain(SmokeModifierData *smd) +{ + if(smd->domain) + { + // free visualisation buffers + if(smd->domain->bind) + { + glDeleteTextures(smd->domain->max_textures, (GLuint *)smd->domain->bind); + MEM_freeN(smd->domain->bind); + } + smd->domain->max_textures = 0; // unnecessary but let's be sure + + if(smd->domain->tray) + MEM_freeN(smd->domain->tray); + if(smd->domain->tvox) + MEM_freeN(smd->domain->tvox); + if(smd->domain->traybig) + MEM_freeN(smd->domain->traybig); + if(smd->domain->tvoxbig) + MEM_freeN(smd->domain->tvoxbig); + + if(smd->domain->fluid) + { + smoke_free(smd->domain->fluid); + } + MEM_freeN(smd->domain); + smd->domain = NULL; + } +} + +void smokeModifier_freeFlow(SmokeModifierData *smd) +{ + if(smd->flow) + { + MEM_freeN(smd->flow); + smd->flow = NULL; + } +} + +void smokeModifier_freeCollision(SmokeModifierData *smd) +{ + if(smd->coll) + { + if(smd->coll->points) + { + MEM_freeN(smd->coll->points); + smd->coll->points = NULL; + } + + if(smd->coll->bvhtree) + { + BLI_bvhtree_free(smd->coll->bvhtree); + smd->coll->bvhtree = NULL; + } + + MEM_freeN(smd->coll); + smd->coll = NULL; + } +} + +void smokeModifier_reset(struct SmokeModifierData *smd) +{ + if(smd) + { + if(smd->domain) + { + // free visualisation buffers + if(smd->domain->bind) + { + glDeleteTextures(smd->domain->max_textures, (GLuint *)smd->domain->bind); + MEM_freeN(smd->domain->bind); + smd->domain->bind = NULL; + } + smd->domain->max_textures = 0; + smd->domain->viewsettings = 0; // reset view for new frame + + if(smd->domain->tray) + MEM_freeN(smd->domain->tray); + if(smd->domain->tvox) + MEM_freeN(smd->domain->tvox); + if(smd->domain->traybig) + MEM_freeN(smd->domain->traybig); + if(smd->domain->tvoxbig) + MEM_freeN(smd->domain->tvoxbig); + + smd->domain->tvox = NULL; + smd->domain->tray = NULL; + smd->domain->tvoxbig = NULL; + smd->domain->traybig = NULL; + + if(smd->domain->fluid) + { + smoke_free(smd->domain->fluid); + smd->domain->fluid = NULL; + } + } + else if(smd->flow) + { + + } + else if(smd->coll) + { + if(smd->coll->points) + { + MEM_freeN(smd->coll->points); + smd->coll->points = NULL; + } + + if(smd->coll->bvhtree) + { + BLI_bvhtree_free(smd->coll->bvhtree); + smd->coll->bvhtree = NULL; + } + } + } +} + +void smokeModifier_free (SmokeModifierData *smd) +{ + if(smd) + { + smokeModifier_freeDomain(smd); + smokeModifier_freeFlow(smd); + smokeModifier_freeCollision(smd); + } +} + +void smokeModifier_createType(struct SmokeModifierData *smd) +{ + if(smd) + { + if(smd->type & MOD_SMOKE_TYPE_DOMAIN) + { + if(smd->domain) + smokeModifier_freeDomain(smd); + + smd->domain = MEM_callocN(sizeof(SmokeDomainSettings), "SmokeDomain"); + + smd->domain->smd = smd; + + /* set some standard values */ + smd->domain->fluid = NULL; + smd->domain->eff_group = NULL; + smd->domain->fluid_group = NULL; + smd->domain->coll_group = NULL; + smd->domain->maxres = 32; + smd->domain->amplify = 2; + smd->domain->omega = 1.0; + smd->domain->alpha = -0.001; + smd->domain->beta = 0.1; + smd->domain->flags = 0; + smd->domain->noise = MOD_SMOKE_NOISEWAVE; + smd->domain->visibility = 1; + + // init 3dview buffer + smd->domain->tvox = NULL; + smd->domain->tray = NULL; + smd->domain->tvoxbig = NULL; + smd->domain->traybig = NULL; + smd->domain->viewsettings = 0; + smd->domain->bind = NULL; + smd->domain->max_textures = 0; + } + else if(smd->type & MOD_SMOKE_TYPE_FLOW) + { + if(smd->flow) + smokeModifier_freeFlow(smd); + + smd->flow = MEM_callocN(sizeof(SmokeFlowSettings), "SmokeFlow"); + + smd->flow->smd = smd; + + /* set some standard values */ + smd->flow->density = 1.0; + smd->flow->temp = 1.0; + + smd->flow->psys = NULL; + + } + else if(smd->type & MOD_SMOKE_TYPE_COLL) + { + if(smd->coll) + smokeModifier_freeCollision(smd); + + smd->coll = MEM_callocN(sizeof(SmokeCollSettings), "SmokeColl"); + + smd->coll->smd = smd; + smd->coll->points = NULL; + smd->coll->numpoints = 0; + smd->coll->bvhtree = NULL; + } + } +} + +// forward declaration +void smoke_calc_transparency(struct SmokeModifierData *smd, float *light, int big); + +void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc) +{ + if(scene->r.cfra >= smd->time) + smokeModifier_init(smd, ob, scene, dm); + + if((smd->type & MOD_SMOKE_TYPE_FLOW)) + { + if(scene->r.cfra > smd->time) + { + // XXX TODO + smd->time = scene->r.cfra; + } + else if(scene->r.cfra < smd->time) + { + smd->time = scene->r.cfra; + smokeModifier_reset(smd); + } + } + else if(smd->type & MOD_SMOKE_TYPE_COLL) + { + if(scene->r.cfra > smd->time) + { + // XXX TODO + smd->time = scene->r.cfra; + + if(smd->coll->bvhtree) + bvhtree_update_from_smoke ( ob->obmat, smd->coll->bvhtree, dm->getTessFaceArray(dm), dm->getNumFaces(dm), dm->getVertArray(dm), dm->getNumVerts(dm)); + else + printf("smoke coll with no bvh\n"); + } + else if(scene->r.cfra < smd->time) + { + smd->time = scene->r.cfra; + smokeModifier_reset(smd); + } + } + else if(smd->type & MOD_SMOKE_TYPE_DOMAIN) + { + SmokeDomainSettings *sds = smd->domain; + + if(scene->r.cfra > smd->time) + { + GroupObject *go = NULL; + Base *base = NULL; + int cnt_domain = 0; + + tstart(); + + sds->viewsettings = 0; // reset view for new frame + + // check for 2nd domain, if not there -> no groups are necessary + for(base = scene->base.first; base; base= base->next) + { + Object *ob1= base->object; + + if(ob1 && ob1 != ob) + { + ModifierData *tmd = modifiers_findByType(ob1, eModifierType_Smoke); + + if(tmd && tmd->mode & (eModifierMode_Realtime | eModifierMode_Render)) + { + SmokeModifierData *tsmd = (SmokeModifierData *)tmd; + + if((tsmd->type & MOD_SMOKE_TYPE_DOMAIN)) + { + cnt_domain++; + } + } + } + } + + // do flows and fluids + if(sds->fluid_group || !cnt_domain) + { + Object *otherobj = NULL; + ModifierData *md = NULL; + + if(cnt_domain && !sds->fluid_group) // we use groups since we have 2 domains + go = sds->fluid_group->gobject.first; + else + base = scene->base.first; + + while(base || go) + { + otherobj = NULL; + + if(cnt_domain && !sds->fluid_group) + { + if(go->ob) + otherobj = go->ob; + } + else + otherobj = base->object; + + if(!otherobj) + { + if(cnt_domain && !sds->fluid_group) + go = go->next; + else + base= base->next; + + continue; + } + + md = modifiers_findByType(otherobj, eModifierType_Smoke); + + // check for active smoke modifier + if(md && md->mode & (eModifierMode_Realtime | eModifierMode_Render)) + { + SmokeModifierData *smd2 = (SmokeModifierData *)md; + + // check for initialized smoke object + if((smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow) + { + // we got nice flow object + SmokeFlowSettings *sfs = smd2->flow; + + if(sfs->psys && sfs->psys->part && sfs->psys->part->type==PART_EMITTER) // is particle system selected + { + ParticleSystem *psys = sfs->psys; + ParticleSettings *part=psys->part; + ParticleData *pa = NULL; + int p = 0; + float *density = smoke_get_density(sds->fluid); + float *bigdensity = smoke_get_bigdensity(sds->fluid); + float *heat = smoke_get_heat(sds->fluid); + float *velocity_x = smoke_get_velocity_x(sds->fluid); + float *velocity_y = smoke_get_velocity_y(sds->fluid); + float *velocity_z = smoke_get_velocity_z(sds->fluid); + int bigres[3]; + + smoke_get_bigres(smd->domain->fluid, bigres); + + // mostly copied from particle code + for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) + { + int cell[3]; + size_t i = 0; + size_t index = 0; + int badcell = 0; + + if(pa->alive == PARS_KILLED) continue; + else if(pa->alive == PARS_UNBORN && (part->flag & PART_UNBORN)==0) continue; + else if(pa->alive == PARS_DEAD && (part->flag & PART_DIED)==0) continue; + else if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP)) continue; + + // VECCOPY(pos, pa->state.co); + // Mat4MulVecfl (ob->imat, pos); + + // 1. get corresponding cell + get_cell(smd, pa->state.co, cell, 0); + + // check if cell is valid (in the domain boundary) + for(i = 0; i < 3; i++) + { + if((cell[i] > sds->res[i] - 1) || (cell[i] < 0)) + { + badcell = 1; + break; + } + } + + if(badcell) + continue; + + // 2. set cell values (heat, density and velocity) + index = smoke_get_index(cell[0], sds->res[0], cell[1], sds->res[1], cell[2]); + + if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW)) // this is inflow + { + heat[index] = sfs->temp; + density[index] = sfs->density; + velocity_x[index] = pa->state.vel[0]; + velocity_y[index] = pa->state.vel[1]; + velocity_z[index] = pa->state.vel[2]; + + // we need different handling for the high-res feature + if(bigdensity) + { + // init all surrounding cells according to amplification, too + int i, j, k; + for(i = 0; i < smd->domain->amplify; i++) + for(j = 0; j < smd->domain->amplify; j++) + for(k = 0; k < smd->domain->amplify; k++) + { + index = smoke_get_index(smd->domain->amplify * cell[0] + i, bigres[0], smd->domain->amplify * cell[1] + j, bigres[1], smd->domain->amplify * cell[2] + k); + bigdensity[index] = sfs->density; + } + } + } + else // outflow + { + heat[index] = 0.f; + density[index] = 0.f; + velocity_x[index] = 0.f; + velocity_y[index] = 0.f; + velocity_z[index] = 0.f; + + // we need different handling for the high-res feature + if(bigdensity) + { + // init all surrounding cells according to amplification, too + int i, j, k; + for(i = 0; i < smd->domain->amplify; i++) + for(j = 0; j < smd->domain->amplify; j++) + for(k = 0; k < smd->domain->amplify; k++) + { + index = smoke_get_index(smd->domain->amplify * cell[0] + i, bigres[0], smd->domain->amplify * cell[1] + j, bigres[1], smd->domain->amplify * cell[2] + k); + bigdensity[index] = 0.f; + } + } + } + } + } + } + } + + if(cnt_domain && !sds->fluid_group) + go = go->next; + else + base= base->next; + } + } + + // do effectors + /* + if(sds->eff_group) + { + for(go = sds->eff_group->gobject.first; go; go = go->next) + { + if(go->ob) + { + if(ob->pd) + { + + } + } + } + } + */ + + // do collisions + if(sds->coll_group || !cnt_domain) + { + Object *otherobj = NULL; + ModifierData *md = NULL; + + if(cnt_domain && !sds->coll_group) // we use groups since we have 2 domains + go = sds->coll_group->gobject.first; + else + base = scene->base.first; + + while(base || go) + { + otherobj = NULL; + + if(cnt_domain && !sds->coll_group) + { + if(go->ob) + otherobj = go->ob; + } + else + otherobj = base->object; + + if(!otherobj) + { + if(cnt_domain && !sds->coll_group) + go = go->next; + else + base= base->next; + + continue; + } + + md = modifiers_findByType(otherobj, eModifierType_Smoke); + + // check for active smoke modifier + if(md && md->mode & (eModifierMode_Realtime | eModifierMode_Render)) + { + SmokeModifierData *smd2 = (SmokeModifierData *)md; + + if((smd2->type & MOD_SMOKE_TYPE_COLL) && smd2->coll) + { + // we got nice collision object + SmokeCollSettings *scs = smd2->coll; + int cell[3]; + size_t index = 0; + size_t i, j; + unsigned char *obstacles = smoke_get_obstacle(smd->domain->fluid); + + // int BLI_bvhtree_find_nearest(BVHTree *tree, const float *co, BVHTreeNearest *nearest, BVHTree_NearestPointCallback callback, void *userdata); + + for(i = 0; i < scs->numpoints; i++) + { + int badcell = 0; + + // 1. get corresponding cell + get_cell(smd, &scs->points[3 * i], cell, 0); + + // check if cell is valid (in the domain boundary) + for(j = 0; j < 3; j++) + if((cell[j] > sds->res[j] - 1) || (cell[j] < 0)) + { + badcell = 1; + break; + } + + if(badcell) + continue; + + // 2. set cell values (heat, density and velocity) + index = smoke_get_index(cell[0], sds->res[0], cell[1], sds->res[1], cell[2]); + + // printf("cell[0]: %d, cell[1]: %d, cell[2]: %d\n", cell[0], cell[1], cell[2]); + // printf("res[0]: %d, res[1]: %d, res[2]: %d, index: %d\n\n", sds->res[0], sds->res[1], sds->res[2], index); + + obstacles[index] = 1; + + // for moving gobstacles + /* + const LbmFloat maxVelVal = 0.1666; + const LbmFloat maxusqr = maxVelVal*maxVelVal*3. *1.5; + + LbmVec objvel = vec2L((mMOIVertices[n]-mMOIVerticesOld[n]) /dvec); { + const LbmFloat usqr = (objvel[0]*objvel[0]+objvel[1]*objvel[1]+objvel[2]*objvel[2])*1.5; + USQRMAXCHECK(usqr, objvel[0],objvel[1],objvel[2], mMaxVlen, mMxvx,mMxvy,mMxvz); + if(usqr>maxusqr) { + // cutoff at maxVelVal + for(int jj=0; jj<3; jj++) { + if(objvel[jj]>0.) objvel[jj] = maxVelVal; + if(objvel[jj]<0.) objvel[jj] = -maxVelVal; + } + } } + + const LbmFloat dp=dot(objvel, vec2L((*pNormals)[n]) ); + const LbmVec oldov=objvel; // debug + objvel = vec2L((*pNormals)[n]) *dp; + */ + } + } + } + + if(cnt_domain && !sds->coll_group) + go = go->next; + else + base= base->next; + } + } + + // set new time + smd->time = scene->r.cfra; + + // simulate the actual smoke (c++ code in intern/smoke) + smoke_step(sds->fluid); + + tend(); + printf ( "Frame: %d, Time: %f\n", (int)smd->time, ( float ) tval() ); + } + else if(scene->r.cfra < smd->time) + { + // we got back in time, reset smoke in this case (TODO: use cache later) + smd->time = scene->r.cfra; + smokeModifier_reset(smd); + } + } +} + +// update necessary information for 3dview +void smoke_prepare_View(SmokeModifierData *smd, float *light) +{ + float *density = NULL; + int x, y, z; + + if(!smd->domain->tray) + { + // TRay is for self shadowing + smd->domain->tray = MEM_callocN(sizeof(float)*smd->domain->res[0]*smd->domain->res[1]*smd->domain->res[2], "Smoke_tRay"); + } + if(!smd->domain->tvox) + { + // TVox is for tranaparency + smd->domain->tvox = MEM_callocN(sizeof(float)*smd->domain->res[0]*smd->domain->res[1]*smd->domain->res[2], "Smoke_tVox"); + } + + // update 3dview + density = smoke_get_density(smd->domain->fluid); + for(x = 0; x < smd->domain->res[0]; x++) + for(y = 0; y < smd->domain->res[1]; y++) + for(z = 0; z < smd->domain->res[2]; z++) + { + size_t index; + + index = smoke_get_index(x, smd->domain->res[0], y, smd->domain->res[1], z); + // Transparency computation + // formula taken from "Visual Simulation of Smoke" / Fedkiw et al. pg. 4 + // T_vox = exp(-C_ext * h) + // C_ext/sigma_t = density * C_ext + smoke_set_tvox(smd, index, exp(-density[index] * 7.0 * smd->domain->dx)); + } + smoke_calc_transparency(smd, light, 0); +} + +// update necessary information for 3dview ("high res" option) +void smoke_prepare_bigView(SmokeModifierData *smd, float *light) +{ + float *density = NULL; + size_t i = 0; + int bigres[3]; + + smoke_get_bigres(smd->domain->fluid, bigres); + + if(!smd->domain->traybig) + { + // TRay is for self shadowing + smd->domain->traybig = MEM_callocN(sizeof(float)*bigres[0]*bigres[1]*bigres[2], "Smoke_tRayBig"); + } + if(!smd->domain->tvoxbig) + { + // TVox is for tranaparency + smd->domain->tvoxbig = MEM_callocN(sizeof(float)*bigres[0]*bigres[1]*bigres[2], "Smoke_tVoxBig"); + } + + density = smoke_get_bigdensity(smd->domain->fluid); + for (i = 0; i < bigres[0] * bigres[1] * bigres[2]; i++) + { + // Transparency computation + // formula taken from "Visual Simulation of Smoke" / Fedkiw et al. pg. 4 + // T_vox = exp(-C_ext * h) + // C_ext/sigma_t = density * C_ext + smoke_set_bigtvox(smd, i, exp(-density[i] * 7.0 * smd->domain->dx / smd->domain->amplify) ); + } + smoke_calc_transparency(smd, light, 1); +} + + +float smoke_get_tvox(SmokeModifierData *smd, size_t index) +{ + return smd->domain->tvox[index]; +} + +void smoke_set_tvox(SmokeModifierData *smd, size_t index, float tvox) +{ + smd->domain->tvox[index] = tvox; +} + +float smoke_get_tray(SmokeModifierData *smd, size_t index) +{ + return smd->domain->tray[index]; +} + +void smoke_set_tray(SmokeModifierData *smd, size_t index, float transparency) +{ + smd->domain->tray[index] = transparency; +} + +float smoke_get_bigtvox(SmokeModifierData *smd, size_t index) +{ + return smd->domain->tvoxbig[index]; +} + +void smoke_set_bigtvox(SmokeModifierData *smd, size_t index, float tvox) +{ + smd->domain->tvoxbig[index] = tvox; +} + +float smoke_get_bigtray(SmokeModifierData *smd, size_t index) +{ + return smd->domain->traybig[index]; +} + +void smoke_set_bigtray(SmokeModifierData *smd, size_t index, float transparency) +{ + smd->domain->traybig[index] = transparency; +} + +long long smoke_get_mem_req(int xres, int yres, int zres, int amplify) +{ + int totalCells = xres * yres * zres; + int amplifiedCells = totalCells * amplify * amplify * amplify; + + // print out memory requirements + long long int coarseSize = sizeof(float) * totalCells * 22 + + sizeof(unsigned char) * totalCells; + + long long int fineSize = sizeof(float) * amplifiedCells * 7 + // big grids + sizeof(float) * totalCells * 8 + // small grids + sizeof(float) * 128 * 128 * 128; // noise tile + + long long int totalMB = (coarseSize + fineSize) / (1024 * 1024); + + return totalMB; +} + + +static void calc_voxel_transp(SmokeModifierData *smd, int *pixel, float *tRay) +{ + // printf("Pixel(%d, %d, %d)\n", pixel[0], pixel[1], pixel[2]); + const size_t index = smoke_get_index(pixel[0], smd->domain->res[0], pixel[1], smd->domain->res[1], pixel[2]); + + // T_ray *= T_vox + *tRay *= smoke_get_tvox(smd, index); +} + +static void calc_voxel_transp_big(SmokeModifierData *smd, int *pixel, float *tRay) +{ + int bigres[3]; + size_t index; + + smoke_get_bigres(smd->domain->fluid, bigres); + index = smoke_get_index(pixel[0], bigres[0], pixel[1], bigres[1], pixel[2]); + + /* + if(index > bigres[0]*bigres[1]*bigres[2]) + printf("pixel[0]: %d, [1]: %d, [2]: %d\n", pixel[0], pixel[1], pixel[2]); + */ + + // T_ray *= T_vox + *tRay *= smoke_get_bigtvox(smd, index); +} + +static void bresenham_linie_3D(SmokeModifierData *smd, int x1, int y1, int z1, int x2, int y2, int z2, float *tRay, int big) +{ + int dx, dy, dz, i, l, m, n, x_inc, y_inc, z_inc, err_1, err_2, dx2, dy2, dz2; + int pixel[3]; + + pixel[0] = x1; + pixel[1] = y1; + pixel[2] = z1; + + dx = x2 - x1; + dy = y2 - y1; + dz = z2 - z1; + + x_inc = (dx < 0) ? -1 : 1; + l = abs(dx); + y_inc = (dy < 0) ? -1 : 1; + m = abs(dy); + z_inc = (dz < 0) ? -1 : 1; + n = abs(dz); + dx2 = l << 1; + dy2 = m << 1; + dz2 = n << 1; + + if ((l >= m) && (l >= n)) { + err_1 = dy2 - l; + err_2 = dz2 - l; + for (i = 0; i < l; i++) { + if(!big) + calc_voxel_transp(smd, pixel, tRay); + else + calc_voxel_transp_big(smd, pixel, tRay); + if(*tRay < 0.0f) + return; + if (err_1 > 0) { + pixel[1] += y_inc; + err_1 -= dx2; + } + if (err_2 > 0) { + pixel[2] += z_inc; + err_2 -= dx2; + } + err_1 += dy2; + err_2 += dz2; + pixel[0] += x_inc; + } + } else if ((m >= l) && (m >= n)) { + err_1 = dx2 - m; + err_2 = dz2 - m; + for (i = 0; i < m; i++) { + if(!big) + calc_voxel_transp(smd, pixel, tRay); + else + calc_voxel_transp_big(smd, pixel, tRay); + if(*tRay < 0.0f) + return; + if (err_1 > 0) { + pixel[0] += x_inc; + err_1 -= dy2; + } + if (err_2 > 0) { + pixel[2] += z_inc; + err_2 -= dy2; + } + err_1 += dx2; + err_2 += dz2; + pixel[1] += y_inc; + } + } else { + err_1 = dy2 - n; + err_2 = dx2 - n; + for (i = 0; i < n; i++) { + if(!big) + calc_voxel_transp(smd, pixel, tRay); + else + calc_voxel_transp_big(smd, pixel, tRay); + if(*tRay < 0.0f) + return; + if (err_1 > 0) { + pixel[1] += y_inc; + err_1 -= dz2; + } + if (err_2 > 0) { + pixel[0] += x_inc; + err_2 -= dz2; + } + err_1 += dy2; + err_2 += dx2; + pixel[2] += z_inc; + } + } + if(!big) + calc_voxel_transp(smd, pixel, tRay); + else + calc_voxel_transp_big(smd, pixel, tRay); +} + +static void get_cell(struct SmokeModifierData *smd, float *pos, int *cell, int correct) +{ + float tmp[3]; + + VECSUB(tmp, pos, smd->domain->p0); + VecMulf(tmp, 1.0 / smd->domain->dx); + + if(correct) + { + cell[0] = MIN2(smd->domain->res[0] - 1, MAX2(0, (int)floor(tmp[0]))); + cell[1] = MIN2(smd->domain->res[1] - 1, MAX2(0, (int)floor(tmp[1]))); + cell[2] = MIN2(smd->domain->res[2] - 1, MAX2(0, (int)floor(tmp[2]))); + } + else + { + cell[0] = (int)floor(tmp[0]); + cell[1] = (int)floor(tmp[1]); + cell[2] = (int)floor(tmp[2]); + } +} +static void get_bigcell(struct SmokeModifierData *smd, float *pos, int *cell, int correct) +{ + float tmp[3]; + int res[3]; + smoke_get_bigres(smd->domain->fluid, res); + + VECSUB(tmp, pos, smd->domain->p0); + + VecMulf(tmp, smd->domain->amplify / smd->domain->dx ); + + if(correct) + { + cell[0] = MIN2(res[0] - 1, MAX2(0, (int)floor(tmp[0]))); + cell[1] = MIN2(res[1] - 1, MAX2(0, (int)floor(tmp[1]))); + cell[2] = MIN2(res[2] - 1, MAX2(0, (int)floor(tmp[2]))); + } + else + { + cell[0] = (int)floor(tmp[0]); + cell[1] = (int)floor(tmp[1]); + cell[2] = (int)floor(tmp[2]); + } +} + + +void smoke_calc_transparency(struct SmokeModifierData *smd, float *light, int big) +{ + int x, y, z; + float bv[6]; + int res[3]; + float bigfactor = 1.0; + + // x + bv[0] = smd->domain->p0[0]; + bv[1] = smd->domain->p1[0]; + // y + bv[2] = smd->domain->p0[1]; + bv[3] = smd->domain->p1[1]; + // z + bv[4] = smd->domain->p0[2]; + bv[5] = smd->domain->p1[2]; +/* + printf("bv[0]: %f, [1]: %f, [2]: %f, [3]: %f, [4]: %f, [5]: %f\n", bv[0], bv[1], bv[2], bv[3], bv[4], bv[5]); + + printf("p0[0]: %f, p0[1]: %f, p0[2]: %f\n", smd->domain->p0[0], smd->domain->p0[1], smd->domain->p0[2]); + printf("p1[0]: %f, p1[1]: %f, p1[2]: %f\n", smd->domain->p1[0], smd->domain->p1[1], smd->domain->p1[2]); + printf("dx: %f, amp: %d\n", smd->domain->dx, smd->domain->amplify); +*/ + if(!big) + { + res[0] = smd->domain->res[0]; + res[1] = smd->domain->res[1]; + res[2] = smd->domain->res[2]; + } + else + { + smoke_get_bigres(smd->domain->fluid, res); + bigfactor = 1.0 / smd->domain->amplify; + } + +#pragma omp parallel for schedule(static) private(y, z) shared(big, smd, light, res, bigfactor) + for(x = 0; x < res[0]; x++) + for(y = 0; y < res[1]; y++) + for(z = 0; z < res[2]; z++) + { + float voxelCenter[3]; + size_t index; + float pos[3]; + int cell[3]; + float tRay = 1.0; + + index = smoke_get_index(x, res[0], y, res[1], z); + + // voxelCenter = m_voxelarray[i].GetCenter(); + voxelCenter[0] = smd->domain->p0[0] + smd->domain->dx * bigfactor * x + smd->domain->dx * bigfactor * 0.5; + voxelCenter[1] = smd->domain->p0[1] + smd->domain->dx * bigfactor * y + smd->domain->dx * bigfactor * 0.5; + voxelCenter[2] = smd->domain->p0[2] + smd->domain->dx * bigfactor * z + smd->domain->dx * bigfactor * 0.5; + + // printf("vc[0]: %f, vc[1]: %f, vc[2]: %f\n", voxelCenter[0], voxelCenter[1], voxelCenter[2]); + // printf("light[0]: %f, light[1]: %f, light[2]: %f\n", light[0], light[1], light[2]); + + // get starting position (in voxel coords) + if(BLI_bvhtree_bb_raycast(bv, light, voxelCenter, pos) > FLT_EPSILON) + { + // we're ouside + // printf("out: pos[0]: %f, pos[1]: %f, pos[2]: %f\n", pos[0], pos[1], pos[2]); + if(!big) + get_cell(smd, pos, cell, 1); + else + get_bigcell(smd, pos, cell, 1); + } + else + { + // printf("in: pos[0]: %f, pos[1]: %f, pos[2]: %f\n", light[0], light[1], light[2]); + // we're inside + if(!big) + get_cell(smd, light, cell, 1); + else + get_bigcell(smd, light, cell, 1); + } + + // printf("cell - [0]: %d, [1]: %d, [2]: %d\n", cell[0], cell[1], cell[2]); + bresenham_linie_3D(smd, cell[0], cell[1], cell[2], x, y, z, &tRay, big); + + if(!big) + smoke_set_tray(smd, index, tRay); + else + smoke_set_bigtray(smd, index, tRay); + } +} + diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index 3e6f30cde36..1eae6eba532 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -82,7 +82,7 @@ variables on the UI for now #include "BKE_DerivedMesh.h" #include "BKE_pointcache.h" #include "BKE_modifier.h" - +#include "BKE_deform.h" //XXX #include "BIF_editdeform.h" //XXX #include "BIF_graphics.h" #include "PIL_time.h" @@ -2051,7 +2051,7 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo BodyPoint *bp1,*bp2; float dir[3],dvel[3]; - float distance,forcefactor,kd,absvel,projvel; + float distance,forcefactor,kd,absvel,projvel,kw; int ia,ic; /* prepare depending on which side of the spring we are on */ if (bpi == bs->v1){ @@ -2085,7 +2085,10 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo forcefactor = iks/bs->len; else forcefactor = iks; - forcefactor *= bs->strength; + kw = (bp1->springweight+bp2->springweight)/2.0f; + kw = kw * kw; + kw = kw * kw; + forcefactor *= bs->strength * kw; Vec3PlusStVec(bp1->force,(bs->len - distance)*forcefactor,dir); /* do bp1 <--> bp2 viscous */ @@ -2185,14 +2188,14 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo VecMidf(velcenter, bp->vec, obp->vec); VecSubf(dvel,velcenter,bp->vec); - VecMulf(dvel,sb->nodemass); + VecMulf(dvel,bp->mass); Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def); Vec3PlusStVec(bp->force,sb->balldamp,dvel); /* exploit force(a,b) == -force(b,a) part2/2 */ VecSubf(dvel,velcenter,obp->vec); - VecMulf(dvel,sb->nodemass); + VecMulf(dvel,bp->mass); Vec3PlusStVec(obp->force,sb->balldamp,dvel); Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def); @@ -2237,7 +2240,7 @@ static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, flo /* gravitation */ if (sb){ float gravity = sb->grav * sb_grav_force_scale(ob); - bp->force[2]-= gravity*sb->nodemass; /* individual mass of node here */ + bp->force[2]-= gravity*bp->mass; /* individual mass of node here */ } /* particle field & vortex */ @@ -2549,7 +2552,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa VecMidf(velcenter, bp->vec, obp->vec); VecSubf(dvel,velcenter,bp->vec); - VecMulf(dvel,sb->nodemass); + VecMulf(dvel,bp->mass); Vec3PlusStVec(bp->force,f*(1.0f-sb->balldamp),def); Vec3PlusStVec(bp->force,sb->balldamp,dvel); @@ -2580,7 +2583,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa /* exploit force(a,b) == -force(b,a) part2/2 */ VecSubf(dvel,velcenter,obp->vec); - VecMulf(dvel,sb->nodemass); + VecMulf(dvel,(bp->mass+obp->mass)/2.0f); Vec3PlusStVec(obp->force,sb->balldamp,dvel); Vec3PlusStVec(obp->force,-f*(1.0f-sb->balldamp),def); @@ -2640,8 +2643,7 @@ static void softbody_calc_forces(Scene *scene, Object *ob, float forcetime, floa /* gravitation */ - bp->force[2]-= gravity*sb->nodemass; /* individual mass of node here */ - //bp->force[1]-= gravity*sb->nodemass; /* individual mass of node here */ + bp->force[2]-= gravity*bp->mass; /* individual mass of node here */ /* particle field & vortex */ @@ -2850,11 +2852,20 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float * aabbmin[0]=aabbmin[1]=aabbmin[2] = 1e20f; aabbmax[0]=aabbmax[1]=aabbmax[2] = -1e20f; + /* old one with homogenous masses */ /* claim a minimum mass for vertex */ + /* if (sb->nodemass > 0.009999f) timeovermass = forcetime/sb->nodemass; else timeovermass = forcetime/0.009999f; + */ for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) { +/* now we have individual masses */ +/* claim a minimum mass for vertex */ + if (bp->mass > 0.009999f) timeovermass = forcetime/bp->mass; + else timeovermass = forcetime/0.009999f; + + if(bp->goal < SOFTGOALSNAP){ /* this makes t~ = t */ if(mid_flags & MID_PRESERVE) VECCOPY(dx,bp->vec); @@ -3228,10 +3239,36 @@ static void mesh_to_softbody(Scene *scene, Object *ob) /* to proove the concept this would enable per vertex *mass painting* - strcpy(name,"SOFTMASS"); - error = get_scalar_from_named_vertexgroup(ob,name, a,&temp); - if (!error) bp->mass = temp * ob->rangeofmass; */ + /* first set the default */ + bp->mass = sb->nodemass; + + if (sb->namedVG_Mass[0]) + { + int grp= get_named_vertexgroup_num (ob,sb->namedVG_Mass); + /* printf("VGN %s %d \n",sb->namedVG_Mass,grp); */ + if(grp > -1){ + get_scalar_from_vertexgroup(ob, a,(short) (grp), &bp->mass); + bp->mass = bp->mass * sb->nodemass; + /* printf("bp->mass %f \n",bp->mass); */ + + } + } + /* first set the default */ + bp->springweight = 1.0f; + + if (sb->namedVG_Spring_K[0]) + { + int grp= get_named_vertexgroup_num (ob,sb->namedVG_Spring_K); + //printf("VGN %s %d \n",sb->namedVG_Spring_K,grp); + if(grp > -1){ + get_scalar_from_vertexgroup(ob, a,(short) (grp), &bp->springweight); + //printf("bp->springweight %f \n",bp->springweight); + + } + } + + } /* but we only optionally add body edge springs */ @@ -3650,64 +3687,85 @@ static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts, } } -void sbWriteCache(Object *ob, int framenr) +static void softbody_write_state(int index, void *soft_v, float *data) { - SoftBody *sb= ob->soft; - BodyPoint *bp; - PTCacheID pid; - PTCacheFile *pf; - int a; + SoftBody *soft= soft_v; + BodyPoint *bp = soft->bpoint + index; - if(sb->totpoint == 0) - return; + memcpy(data, bp->pos, 3 * sizeof(float)); + memcpy(data + 3, bp->vec, 3 * sizeof(float)); +} +static void softbody_read_state(int index, void *soft_v, float *data) +{ + SoftBody *soft= soft_v; + BodyPoint *bp = soft->bpoint + index; + + memcpy(bp->pos, data, 3 * sizeof(float)); + memcpy(bp->vec, data + 3, 3 * sizeof(float)); +} +static void softbody_cache_interpolate(int index, void *soft_v, float frs_sec, float cfra, float cfra1, float cfra2, float *data1, float *data2) +{ + SoftBody *soft= soft_v; + BodyPoint *bp = soft->bpoint + index; + ParticleKey keys[4]; + float dfra; - BKE_ptcache_id_from_softbody(&pid, ob, sb); - pf= BKE_ptcache_file_open(&pid, PTCACHE_FILE_WRITE, framenr); - if(!pf) + if(cfra1 == cfra2) { + softbody_read_state(index, soft, data1); return; - - for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++) - BKE_ptcache_file_write_floats(pf, bp->pos, 3); + } - for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++) - BKE_ptcache_file_write_floats(pf, bp->vec, 3); + memcpy(keys[1].co, data1, 3 * sizeof(float)); + memcpy(keys[1].vel, data1 + 3, 3 * sizeof(float)); - BKE_ptcache_file_close(pf); -} + memcpy(keys[2].co, data2, 3 * sizeof(float)); + memcpy(keys[2].vel, data2 + 3, 3 * sizeof(float)); + + dfra = cfra2 - cfra1; + + VecMulf(keys[1].vel, dfra); + VecMulf(keys[2].vel, dfra); + + psys_interpolate_particle(-1, keys, (cfra - cfra1) / dfra, keys, 1); + + VecMulf(keys->vel, 1.0f / dfra); -static int softbody_read_cache(Object *ob, float framenr) + memcpy(bp->pos, keys->co, 3 * sizeof(float)); + memcpy(bp->vec, keys->vel, 3 * sizeof(float)); +} +void softbody_write_cache(Object *ob, SoftBody *soft, int cfra) { - SoftBody *sb= ob->soft; - BodyPoint *bp; + PTCacheWriter writer; PTCacheID pid; - PTCacheFile *pf; - int a; - if(sb->totpoint == 0) - return 0; - - BKE_ptcache_id_from_softbody(&pid, ob, sb); - pf= BKE_ptcache_file_open(&pid, PTCACHE_FILE_READ, framenr); - if(!pf) - return 0; + BKE_ptcache_id_from_softbody(&pid, ob, soft); - for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++) { - if(!BKE_ptcache_file_read_floats(pf, bp->pos, 3)) { - BKE_ptcache_file_close(pf); - return 0; - } - } - - for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++) { - if(!BKE_ptcache_file_read_floats(pf, bp->vec, 3)) { - BKE_ptcache_file_close(pf); - return 0; - } - } + writer.calldata = soft; + writer.cfra = cfra; + writer.set_elem = softbody_write_state; + writer.pid = &pid; + writer.totelem = soft->totpoint; - BKE_ptcache_file_close(pf); + BKE_ptcache_write_cache(&writer); +} - return 1; +int softbody_read_cache(Scene *scene, Object *ob, SoftBody *soft, float cfra, int *old_framenr) +{ + PTCacheReader reader; + PTCacheID pid; + + BKE_ptcache_id_from_softbody(&pid, ob, soft); + + reader.calldata = soft; + reader.cfra = cfra; + reader.interpolate_elem = softbody_cache_interpolate; + reader.old_frame = old_framenr; + reader.pid = &pid; + reader.scene = scene; + reader.set_elem = softbody_read_state; + reader.totelem = soft->totpoint; + + return BKE_ptcache_read_cache(&reader); } /* +++ ************ maintaining scratch *************** */ @@ -4077,6 +4135,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i PTCacheID pid; float dtime, timescale; int framedelta, framenr, startframe, endframe; + int cache_result, old_framenr; cache= sb->pointcache; @@ -4091,7 +4150,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i if(sb->bpoint && numVerts != sb->totpoint) { cache->flag &= ~PTCACHE_SIMULATION_VALID; cache->simframe= 0; - + cache->last_exact= 0; return; } @@ -4099,6 +4158,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i if(framenr < startframe) { cache->flag &= ~PTCACHE_SIMULATION_VALID; cache->simframe= 0; + cache->last_exact= 0; return; } @@ -4161,26 +4221,36 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i } /* try to read from cache */ - if(softbody_read_cache(ob, framenr)) { - if(sb->particles==0) - softbody_to_object(ob, vertexCos, numVerts, sb->local); + cache_result = softbody_read_cache(scene, ob, sb, framenr, &old_framenr); + if(cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) { cache->flag |= PTCACHE_SIMULATION_VALID; cache->simframe= framenr; + if(sb->particles==0) + softbody_to_object(ob, vertexCos, numVerts, sb->local); + return; } + else if(cache_result==PTCACHE_READ_OLD) { + BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_FREE); + cache->flag |= PTCACHE_SIMULATION_VALID; + cache->simframe= old_framenr; + } else if(ob->id.lib || (cache->flag & PTCACHE_BAKED)) { /* if baked and nothing in cache, do nothing */ - if(cache->flag & PTCACHE_SIMULATION_VALID) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - } - + cache->flag &= ~PTCACHE_SIMULATION_VALID; + cache->simframe= 0; + cache->last_exact= 0; return; } if(framenr == startframe) { + if(cache->flag & PTCACHE_REDO_NEEDED) { + softbody_update_positions(ob, sb, vertexCos, numVerts); + softbody_reset(ob, sb, vertexCos, numVerts); + cache->flag &= ~PTCACHE_REDO_NEEDED; + } /* first frame, no simulation to do, just set the positions */ softbody_update_positions(ob, sb, vertexCos, numVerts); @@ -4190,10 +4260,10 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i /* don't write cache on first frame, but on second frame write * cache for frame 1 and 2 */ } - else if(framedelta == 1) { + else { /* if on second frame, write cache for first frame */ - if(framenr == startframe+1) - sbWriteCache(ob, startframe); + if(cache->simframe == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0)) + softbody_write_cache(ob, sb, startframe); softbody_update_positions(ob, sb, vertexCos, numVerts); @@ -4209,14 +4279,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i if(sb->particles==0) softbody_to_object(ob, vertexCos, numVerts, 0); - sbWriteCache(ob, framenr); - } - else { - /* time step backwards or too large forward - do nothing */ - if(cache->flag & PTCACHE_SIMULATION_VALID) { - cache->flag &= ~PTCACHE_SIMULATION_VALID; - cache->simframe= 0; - } + softbody_write_cache(ob, sb, framenr); } } diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 1c7dab15d5c..eeffbfe5ef6 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -442,7 +442,7 @@ void default_tex(Tex *tex) tex->extend= TEX_REPEAT; tex->cropxmin= tex->cropymin= 0.0; tex->cropxmax= tex->cropymax= 1.0; - tex->texfilter = TXF_DEFAULT; + tex->texfilter = TXF_EWA; tex->afmax = 8; tex->xrepeat= tex->yrepeat= 1; tex->fie_ima= 2; diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c index c84c54b17ee..f795c147f54 100644 --- a/source/blender/blenkernel/intern/world.c +++ b/source/blender/blenkernel/intern/world.c @@ -36,7 +36,6 @@ #include "DNA_world_types.h" #include "DNA_texture_types.h" -#include "DNA_scriptlink_types.h" #include "DNA_scene_types.h" #include "DNA_object_types.h" #include "DNA_camera_types.h" @@ -66,10 +65,7 @@ void free_world(World *wrld) { MTex *mtex; int a; - -#ifndef DISABLE_PYTHON - BPY_free_scriptlink(&wrld->scriptlink); -#endif + for(a=0; a<MAX_MTEX; a++) { mtex= wrld->mtex[a]; if(mtex && mtex->tex) mtex->tex->id.us--; @@ -126,9 +122,6 @@ World *copy_world(World *wrld) } if (wrld->preview) wrldn->preview = BKE_previewimg_copy(wrld->preview); -#ifndef DISABLE_PYTHON - BPY_copy_scriptlink(&wrld->scriptlink); -#endif #if 0 // XXX old animation system id_us_plus((ID *)wrldn->ipo); diff --git a/source/blender/blenlib/BLI_arithb.h b/source/blender/blenlib/BLI_arithb.h index f925ca1d457..e66cf18b3c7 100644 --- a/source/blender/blenlib/BLI_arithb.h +++ b/source/blender/blenlib/BLI_arithb.h @@ -118,6 +118,9 @@ extern "C" { #ifndef expf #define expf(a) ((float)exp(a)) #endif +#ifndef fmodf +#define fmodf(a, b) ((float)fmod(a, b)) +#endif #ifdef WIN32 #ifndef FREE_WINDOWS diff --git a/source/blender/blenlib/BLI_kdopbvh.h b/source/blender/blenlib/BLI_kdopbvh.h index e3591a84e98..50462d531ef 100644 --- a/source/blender/blenlib/BLI_kdopbvh.h +++ b/source/blender/blenlib/BLI_kdopbvh.h @@ -93,5 +93,7 @@ int BLI_bvhtree_find_nearest(BVHTree *tree, const float *co, BVHTreeNearest *nea int BLI_bvhtree_ray_cast(BVHTree *tree, const float *co, const float *dir, float radius, BVHTreeRayHit *hit, BVHTree_RayCastCallback callback, void *userdata); +float BLI_bvhtree_bb_raycast(float *bv, float *light_start, float *light_end, float *pos); + #endif // BLI_KDOPBVH_H diff --git a/source/blender/blenlib/BLI_kdtree.h b/source/blender/blenlib/BLI_kdtree.h index 585107b0c4a..3b1947cf0c9 100644 --- a/source/blender/blenlib/BLI_kdtree.h +++ b/source/blender/blenlib/BLI_kdtree.h @@ -52,7 +52,7 @@ void BLI_kdtree_balance(KDTree *tree); /* Find nearest returns index, and -1 if no node is found. * Find n nearest returns number of points found, with results in nearest. -/* Normal is optional, but if given will limit results to points in normal direction from co. */ + * Normal is optional, but if given will limit results to points in normal direction from co. */ int BLI_kdtree_find_nearest(KDTree *tree, float *co, float *nor, KDTreeNearest *nearest); int BLI_kdtree_find_n_nearest(KDTree *tree, int n, float *co, float *nor, KDTreeNearest *nearest); diff --git a/source/blender/blenlib/BLI_storage_types.h b/source/blender/blenlib/BLI_storage_types.h index 385aa39e6cb..36d96f6075c 100644 --- a/source/blender/blenlib/BLI_storage_types.h +++ b/source/blender/blenlib/BLI_storage_types.h @@ -55,7 +55,11 @@ struct direntry{ char *string; mode_t type; char *relname; +#if (defined(WIN32) || defined(WIN64)) && (_MSC_VER>=1500) + struct _stat64 s; +#else struct stat s; +#endif unsigned int flags; char size[16]; char mode1[4]; @@ -73,7 +77,6 @@ struct direntry{ #define SELECT 1 #define HIDDEN 1 #define FIRST 1 -#define ACTIVE 2 #define DESELECT 0 #define NOT_YET 0 #define VISIBLE 0 diff --git a/source/blender/blenlib/BLI_vfontdata.h b/source/blender/blenlib/BLI_vfontdata.h index bd89959801a..070d8d12c08 100644 --- a/source/blender/blenlib/BLI_vfontdata.h +++ b/source/blender/blenlib/BLI_vfontdata.h @@ -67,19 +67,6 @@ struct TmpFont struct VFont *vfont; }; - -/** - * Construct a new VFontData structure from - * PostScript font data in a PackedFile. - * - * @param pf The font data. - * @retval A new VFontData structure, or NULL - * if unable to load. - */ - VFontData* -BLI_vfontdata_from_psfont( - struct PackedFile *pf); - /** * Construct a new VFontData structure from * Freetype font data in a PackedFile. diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c index 0f8194362c9..84de9f9d862 100644 --- a/source/blender/blenlib/intern/BLI_kdopbvh.c +++ b/source/blender/blenlib/intern/BLI_kdopbvh.c @@ -72,10 +72,10 @@ struct BVHTree char start_axis, stop_axis; // KDOP_AXES array indices according to axis }; -typedef struct BVHOverlapData -{ - BVHTree *tree1, *tree2; - BVHTreeOverlap *overlap; +typedef struct BVHOverlapData +{ + BVHTree *tree1, *tree2; + BVHTreeOverlap *overlap; int i, max_overlap; /* i is number of overlaps */ int start_axis, stop_axis; } BVHOverlapData; @@ -109,7 +109,7 @@ typedef struct BVHRayCastData //////////////////////////////////////////////////////////////////////// // Bounding Volume Hierarchy Definition -// +// // Notes: From OBB until 26-DOP --> all bounding volumes possible, just choose type below // Notes: You have to choose the type at compile time ITM // Notes: You can choose the tree type --> binary, quad, octree, choose below @@ -188,10 +188,10 @@ int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, int *max_ ////////////////////////////////////////////////////////////////////////////////////////////////////// -// Introsort +// Introsort // with permission deriven from the following Java code: // http://ralphunden.net/content/tutorials/a-guide-to-introsort/ -// and he derived it from the SUN STL +// and he derived it from the SUN STL ////////////////////////////////////////////////////////////////////////////////////////////////////// static int size_threshold = 16; /* @@ -362,7 +362,7 @@ static void create_kdop_hull(BVHTree *tree, BVHNode *node, float *co, int numpoi float newminmax; float *bv = node->bv; int i, k; - + // don't init boudings for the moving case if(!moving) { @@ -372,7 +372,7 @@ static void create_kdop_hull(BVHTree *tree, BVHNode *node, float *co, int numpoi bv[2*i + 1] = -FLT_MAX; } } - + for(k = 0; k < numpoints; k++) { // for all Axes. @@ -394,7 +394,7 @@ static void refit_kdop_hull(BVHTree *tree, BVHNode *node, int start, int end) int i, j; float *bv = node->bv; - + for (i = tree->start_axis; i < tree->stop_axis; i++) { bv[2*i] = FLT_MAX; @@ -406,10 +406,10 @@ static void refit_kdop_hull(BVHTree *tree, BVHNode *node, int start, int end) // for all Axes. for (i = tree->start_axis; i < tree->stop_axis; i++) { - newmin = tree->nodes[j]->bv[(2 * i)]; + newmin = tree->nodes[j]->bv[(2 * i)]; if ((newmin < bv[(2 * i)])) bv[(2 * i)] = newmin; - + newmax = tree->nodes[j]->bv[(2 * i) + 1]; if ((newmax > bv[(2 * i) + 1])) bv[(2 * i) + 1] = newmax; @@ -427,14 +427,14 @@ static char get_largest_axis(float *bv) middle_point[0] = (bv[1]) - (bv[0]); // x axis middle_point[1] = (bv[3]) - (bv[2]); // y axis middle_point[2] = (bv[5]) - (bv[4]); // z axis - if (middle_point[0] > middle_point[1]) + if (middle_point[0] > middle_point[1]) { if (middle_point[0] > middle_point[2]) return 1; // max x axis else return 5; // max z axis } - else + else { if (middle_point[1] > middle_point[2]) return 3; // max y axis @@ -448,24 +448,24 @@ static char get_largest_axis(float *bv) static void node_join(BVHTree *tree, BVHNode *node) { int i, j; - + for (i = tree->start_axis; i < tree->stop_axis; i++) { node->bv[2*i] = FLT_MAX; node->bv[2*i + 1] = -FLT_MAX; } - + for (i = 0; i < tree->tree_type; i++) { - if (node->children[i]) + if (node->children[i]) { for (j = tree->start_axis; j < tree->stop_axis; j++) { - // update minimum - if (node->children[i]->bv[(2 * j)] < node->bv[(2 * j)]) + // update minimum + if (node->children[i]->bv[(2 * j)] < node->bv[(2 * j)]) node->bv[(2 * j)] = node->children[i]->bv[(2 * j)]; - - // update maximum + + // update maximum if (node->children[i]->bv[(2 * j) + 1] > node->bv[(2 * j) + 1]) node->bv[(2 * j) + 1] = node->children[i]->bv[(2 * j) + 1]; } @@ -518,7 +518,7 @@ static void bvhtree_info(BVHTree *tree) static void verify_tree(BVHTree *tree) { int i, j, check = 0; - + // check the pointer list for(i = 0; i < tree->totleaf; i++) { @@ -538,7 +538,7 @@ static void verify_tree(BVHTree *tree) check = 0; } } - + // check the leaf list for(i = 0; i < tree->totleaf; i++) { @@ -558,7 +558,7 @@ static void verify_tree(BVHTree *tree) check = 0; } } - + printf("branches: %d, leafs: %d, total: %d\n", tree->totbranch, tree->totleaf, tree->totbranch + tree->totleaf); } #endif @@ -703,7 +703,7 @@ static void non_recursive_bvh_div_nodes(BVHTree *tree, BVHNode *branches_array, BVHBuildHelper data; int depth; - + // set parent from root node to NULL BVHNode *tmp = branches_array+0; tmp->parent = NULL; @@ -722,7 +722,7 @@ static void non_recursive_bvh_div_nodes(BVHTree *tree, BVHNode *branches_array, } branches_array--; //Implicit trees use 1-based indexs - + build_implicit_tree_helper(tree, &data); //Loop tree levels (log N) loops @@ -806,11 +806,11 @@ BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis) { BVHTree *tree; int numnodes, i; - + // theres not support for trees below binary-trees :P if(tree_type < 2) return NULL; - + if(tree_type > MAX_TREETYPE) return NULL; @@ -820,13 +820,13 @@ BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis) //so that tangent rays can still hit a bounding volume.. //this bug would show up when casting a ray aligned with a kdop-axis and with an edge of 2 faces epsilon = MAX2(FLT_EPSILON, epsilon); - + if(tree) { tree->epsilon = epsilon; - tree->tree_type = tree_type; + tree->tree_type = tree_type; tree->axis = axis; - + if(axis == 26) { tree->start_axis = 0; @@ -863,13 +863,13 @@ BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis) numnodes = maxsize + implicit_needed_branches(tree_type, maxsize) + tree_type; tree->nodes = (BVHNode **)MEM_callocN(sizeof(BVHNode *)*numnodes, "BVHNodes"); - + if(!tree->nodes) { MEM_freeN(tree); return NULL; } - + tree->nodebv = (float*)MEM_callocN(sizeof(float)* axis * numnodes, "BVHNodeBV"); if(!tree->nodebv) { @@ -886,7 +886,7 @@ BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis) } tree->nodearray = (BVHNode *)MEM_callocN(sizeof(BVHNode)* numnodes, "BVHNodeArray"); - + if(!tree->nodearray) { MEM_freeN(tree->nodechild); @@ -902,14 +902,14 @@ BVHTree *BLI_bvhtree_new(int maxsize, float epsilon, char tree_type, char axis) tree->nodearray[i].bv = tree->nodebv + i * axis; tree->nodearray[i].children = tree->nodechild + i * tree_type; } - + } return tree; } void BLI_bvhtree_free(BVHTree *tree) -{ +{ if(tree) { MEM_freeN(tree->nodes); @@ -946,27 +946,27 @@ int BLI_bvhtree_insert(BVHTree *tree, int index, float *co, int numpoints) { int i; BVHNode *node = NULL; - + // insert should only possible as long as tree->totbranch is 0 if(tree->totbranch > 0) return 0; - + if(tree->totleaf+1 >= MEM_allocN_len(tree->nodes)/sizeof(*(tree->nodes))) return 0; - + // TODO check if have enough nodes in array - + node = tree->nodes[tree->totleaf] = &(tree->nodearray[tree->totleaf]); tree->totleaf++; - + create_kdop_hull(tree, node, co, numpoints, 0); node->index= index; - + // inflate the bv with some epsilon for (i = tree->start_axis; i < tree->stop_axis; i++) { - node->bv[(2 * i)] -= tree->epsilon; // minimum - node->bv[(2 * i) + 1] += tree->epsilon; // maximum + node->bv[(2 * i)] -= tree->epsilon; // minimum + node->bv[(2 * i) + 1] += tree->epsilon; // maximum } return 1; @@ -978,23 +978,23 @@ int BLI_bvhtree_update_node(BVHTree *tree, int index, float *co, float *co_movin { int i; BVHNode *node= NULL; - + // check if index exists if(index > tree->totleaf) return 0; - + node = tree->nodearray + index; - + create_kdop_hull(tree, node, co, numpoints, 0); - + if(co_moving) create_kdop_hull(tree, node, co_moving, numpoints, 1); - + // inflate the bv with some epsilon for (i = tree->start_axis; i < tree->stop_axis; i++) { - node->bv[(2 * i)] -= tree->epsilon; // minimum - node->bv[(2 * i) + 1] += tree->epsilon; // maximum + node->bv[(2 * i)] -= tree->epsilon; // minimum + node->bv[(2 * i) + 1] += tree->epsilon; // maximum } return 1; @@ -1030,24 +1030,24 @@ static int tree_overlap(BVHNode *node1, BVHNode *node2, int start_axis, int stop float *bv2 = node2->bv; float *bv1_end = bv1 + (stop_axis<<1); - + bv1 += start_axis<<1; bv2 += start_axis<<1; - + // test all axis if min + max overlap for (; bv1 != bv1_end; bv1+=2, bv2+=2) { - if ((*(bv1) > *(bv2 + 1)) || (*(bv2) > *(bv1 + 1))) + if ((*(bv1) > *(bv2 + 1)) || (*(bv2) > *(bv1 + 1))) return 0; } - + return 1; } static void traverse(BVHOverlapData *data, BVHNode *node1, BVHNode *node2) { int j; - + if(tree_overlap(node1, node2, data->start_axis, data->stop_axis)) { // check if node1 is a leaf @@ -1056,17 +1056,17 @@ static void traverse(BVHOverlapData *data, BVHNode *node1, BVHNode *node2) // check if node2 is a leaf if(!node2->totnode) { - + if(node1 == node2) { return; } - + if(data->i >= data->max_overlap) - { + { // try to make alloc'ed memory bigger data->overlap = realloc(data->overlap, sizeof(BVHTreeOverlap)*data->max_overlap*2); - + if(!data->overlap) { printf("Out of Memory in traverse\n"); @@ -1074,7 +1074,7 @@ static void traverse(BVHOverlapData *data, BVHNode *node1, BVHNode *node2) } data->max_overlap *= 2; } - + // both leafs, insert overlap! data->overlap[data->i].indexA = node1->index; data->overlap[data->i].indexB = node2->index; @@ -1092,7 +1092,7 @@ static void traverse(BVHOverlapData *data, BVHNode *node1, BVHNode *node2) } else { - + for(j = 0; j < data->tree2->tree_type; j++) { if(node1->children[j]) @@ -1108,21 +1108,21 @@ BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, int *result) int j, total = 0; BVHTreeOverlap *overlap = NULL, *to = NULL; BVHOverlapData **data; - + // check for compatibility of both trees (can't compare 14-DOP with 18-DOP) if((tree1->axis != tree2->axis) && (tree1->axis == 14 || tree2->axis == 14) && (tree1->axis == 18 || tree2->axis == 18)) return 0; - + // fast check root nodes for collision before doing big splitting + traversal if(!tree_overlap(tree1->nodes[tree1->totleaf], tree2->nodes[tree2->totleaf], MIN2(tree1->start_axis, tree2->start_axis), MIN2(tree1->stop_axis, tree2->stop_axis))) return 0; data = MEM_callocN(sizeof(BVHOverlapData *)* tree1->tree_type, "BVHOverlapData_star"); - + for(j = 0; j < tree1->tree_type; j++) { data[j] = (BVHOverlapData *)MEM_callocN(sizeof(BVHOverlapData), "BVHOverlapData"); - + // init BVHOverlapData data[j]->overlap = (BVHTreeOverlap *)malloc(sizeof(BVHTreeOverlap)*MAX2(tree1->totleaf, tree2->totleaf)); data[j]->tree1 = tree1; @@ -1138,25 +1138,25 @@ BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, int *result) { traverse(data[j], tree1->nodes[tree1->totleaf]->children[j], tree2->nodes[tree2->totleaf]); } - + for(j = 0; j < tree1->tree_type; j++) total += data[j]->i; - + to = overlap = (BVHTreeOverlap *)MEM_callocN(sizeof(BVHTreeOverlap)*total, "BVHTreeOverlap"); - + for(j = 0; j < tree1->tree_type; j++) { memcpy(to, data[j]->overlap, data[j]->i*sizeof(BVHTreeOverlap)); to+=data[j]->i; } - + for(j = 0; j < tree1->tree_type; j++) { free(data[j]->overlap); MEM_freeN(data[j]); } MEM_freeN(data); - + (*result) = total; return overlap; } @@ -1339,7 +1339,7 @@ static void bfs_find_nearest(BVHNearestData *data, BVHNode *node) push_heaps++; } } - + if(heap_size == 0) break; current = heap[0]; @@ -1405,10 +1405,9 @@ int BLI_bvhtree_find_nearest(BVHTree *tree, const float *co, BVHTreeNearest *nea */ //Determines the distance that the ray must travel to hit the bounding volume of the given node -static float ray_nearest_hit(BVHRayCastData *data, BVHNode *node) +static float ray_nearest_hit(BVHRayCastData *data, float *bv) { int i; - const float *bv = node->bv; float low = 0, upper = data->hit.dist; @@ -1436,7 +1435,7 @@ static float ray_nearest_hit(BVHRayCastData *data, BVHNode *node) if(lu > low) low = lu; if(ll < upper) upper = ll; } - + if(low > upper) return FLT_MAX; } } @@ -1449,7 +1448,7 @@ static void dfs_raycast(BVHRayCastData *data, BVHNode *node) //ray-bv is really fast.. and simple tests revealed its worth to test it //before calling the ray-primitive functions - float dist = ray_nearest_hit(data, node); + float dist = ray_nearest_hit(data, node->bv); if(dist >= data->hit.dist) return; if(node->totnode == 0) @@ -1527,3 +1526,35 @@ int BLI_bvhtree_ray_cast(BVHTree *tree, const float *co, const float *dir, float return data.hit.index; } +float BLI_bvhtree_bb_raycast(float *bv, float *light_start, float *light_end, float *pos) +{ + BVHRayCastData data; + float dist = 0.0; + int i; + + data.hit.dist = FLT_MAX; + + // get light direction + data.ray.direction[0] = light_end[0] - light_start[0]; + data.ray.direction[1] = light_end[1] - light_start[1]; + data.ray.direction[2] = light_end[2] - light_start[2]; + + data.ray.radius = 0.0; + + data.ray.origin[0] = light_start[0]; + data.ray.origin[1] = light_start[1]; + data.ray.origin[2] = light_start[2]; + + Normalize(data.ray.direction); + VECCOPY(data.ray_dot_axis, data.ray.direction); + + dist = ray_nearest_hit(&data, bv); + + if(dist > 0.0) + { + VECADDFAC(pos, light_start, data.ray.direction, dist); + } + return dist; + +} + diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c index 428482ae2c6..258537568f3 100644 --- a/source/blender/blenlib/intern/arithb.c +++ b/source/blender/blenlib/intern/arithb.c @@ -118,15 +118,15 @@ float Normalize(float *n) d= n[0]*n[0]+n[1]*n[1]+n[2]*n[2]; /* A larger value causes normalize errors in a scaled down models with camera xtreme close */ - if(d>1.0e-35F) { + if(d>1.0e-35f) { d= (float)sqrt(d); n[0]/=d; n[1]/=d; n[2]/=d; } else { - n[0]=n[1]=n[2]= 0.0; - d= 0.0; + n[0]=n[1]=n[2]= 0.0f; + d= 0.0f; } return d; } @@ -3383,7 +3383,7 @@ float Normalize2(float *n) d= n[0]*n[0]+n[1]*n[1]; - if(d>1.0e-35F) { + if(d>1.0e-35f) { d= (float)sqrt(d); n[0]/=d; n[1]/=d; @@ -3401,15 +3401,15 @@ void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b) h *= 360.0f; - if(s==0.0) { + if(s==0.0f) { *r = v; *g = v; *b = v; } else { - if(h==360) h = 0; + if(h== 360.0f) h = 0.0f; - h /= 60; + h /= 60.0f; i = (int)floor(h); f = h - i; p = v*(1.0f-s); diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c index 42fd75a543e..0228032df01 100644 --- a/source/blender/blenlib/intern/fileops.c +++ b/source/blender/blenlib/intern/fileops.c @@ -314,7 +314,7 @@ int BLI_rename(char *from, char *to) { /* make sure the filenames are different (case insensitive) before removing */ if (BLI_exists(to) && BLI_strcasecmp(from, to)) if(BLI_delete(to, 0, 0)) return 1; - + return rename(from, to); } @@ -392,7 +392,7 @@ int BLI_rename(char *from, char *to) { if (!BLI_exists(from)) return 0; if (BLI_exists(to)) if(BLI_delete(to, 0, 0)) return 1; - + return rename(from, to); } diff --git a/source/blender/blenlib/intern/psfont.c b/source/blender/blenlib/intern/psfont.c deleted file mode 100644 index 269e674a62f..00000000000 --- a/source/blender/blenlib/intern/psfont.c +++ /dev/null @@ -1,2126 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - * fromtype1 - Convert an Adobe type 1 font into .of or .sf format. - * Paul Haeberli - 1990 - */ - -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <stdlib.h> -#include <math.h> - -#include "MEM_guardedalloc.h" - -#include "BLI_vfontdata.h" -#include "BLI_blenlib.h" - -#include "DNA_packedFile_types.h" -#include "DNA_curve_types.h" - -#include "BLO_sys_types.h" // for intptr_t support - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - /* ObjFnt types */ - -typedef struct chardesc { - short movex, movey; /* advance */ - short llx, lly; /* bounding box */ - short urx, ury; - short *data; /* char data */ - intptr_t datalen; -} chardesc; - -typedef struct objfnt { - struct objfnt *freeaddr; /* if freeaddr != 0, objfnt is one chunck */ - short type; - short charmin, charmax; - short my_nchars; - short scale; - chardesc *my_chars; -} objfnt; - -#define OFMAGIC 0x93339333 - -#define TM_TYPE 1 -#define PO_TYPE 2 -#define SP_TYPE 3 - -/* ops for tmesh characters */ - -#define TM_BGNTMESH (1) -#define TM_SWAPTMESH (2) -#define TM_ENDBGNTMESH (3) -#define TM_RETENDTMESH (4) -#define TM_RET (5) - -/* ops for poly characters */ - -#define PO_BGNLOOP (1) -#define PO_ENDBGNLOOP (2) -#define PO_RETENDLOOP (3) -#define PO_RET (4) - -/* ops for spline characters */ - -#define SP_MOVETO (1) -#define SP_LINETO (2) -#define SP_CURVETO (3) -#define SP_CLOSEPATH (4) -#define SP_RETCLOSEPATH (5) -#define SP_RET (6) - - -#define MIN_ASCII ' ' -#define MAX_ASCII '~' -#define NASCII (256 - 32) - -#define NOBBOX (30000) - -typedef struct pschar { - char *name; - int code; - int prog; -} pschar; - - /***/ - -#define SKIP 4 -#define LINELEN 2048 -#define NOTHEX (100) -#define MC1 52845 -#define MC2 22719 -#define MAXSUBRS 4000 -#define MAXCHARS 4000 -#define MAXTRIES 30 - -/* some local thingies */ -static void rcurveto( int dx1, int dy1, int dx2, int dy2, int dx3, int dy3); -static void makeobjfont(int savesplines); -static void drawchar(int c); -static void runprog(void); -static int chartoindex(objfnt *fnt, int c); -static short STDtoISO(short c); -static char * newfgets(char * s, int n, PackedFile * pf); -static int readfontmatrix(PackedFile * pf, float mat[2][2]); -static char mdecrypt(char cipher); -static void decryptall(void); -static int decodetype1(PackedFile * pf, char *outname); -static void fakefopen(void); -static char *fakefread(int n); -static void setcharlist(void); -static void initpcstack(void); -static char *poppc(void); -static void initstack(void); -static void push(int val); -static int pop(void); -static void initretstack(void); -static void retpush(int val); -static int retpop(void); -static void subr1(void); -static void subr2(void); -static void subr0(void); -static void append_poly_offset(short ofsx, short ofsy, short * data); -static void append_spline_offset(short ofsx, short ofsy, short * data); -static void setwidth(int w, int x); -static void poly_beginchar(void); -static void poly_endchar(void); -static void poly_close(void); -static void poly_pnt(float x, float y); -static void spline_beginchar(void); -static void spline_endchar(void); -static void spline_close(void); -static void spline_line(float x0, float y0, float x1, float y1); -static void spline_curveto(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3); -static void savestart(int x, int y); -static void sbpoint( int x, int y); -static void rmoveto( int x, int y); -static void drawline(float x0, float y0, float x1, float y1, float dx0, float dy0, float dx1, float dy1); -static void rlineto( int x, int y); -static void closepath(void); -static void bezadapt( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float beztol); -static void drawbez( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3); -static int docommand(int cmd); - -/* some local vars */ -static int startx, starty; -static int curx, cury; -static int nextx, nexty; -static int delx, dely; -static int started; - - -/* postscript commands */ -#define HSTEM (1) -#define VSTEM (3) -#define VMOVETO (4) -#define RLINETO (5) -#define HLINETO (6) -#define VLINETO (7) -#define RRCURVETO (8) -#define CLOSEPATH (9) -#define CALLSUBR (10) -#define RETURN (11) -#define HSBW (13) -#define ENDCHAR (14) -#define RMOVETO (21) -#define HMOVETO (22) -#define VHCURVETO (30) -#define HVCURVETO (31) -#define DOTSECTION (256+0) -#define VSTEM3 (256+1) -#define HSTEM3 (256+2) -#define SEAC (256+6) -#define SBW (256+7) -#define DIV (256+12) -#define CALLOTHERSUBR (256+16) -#define POP (256+17) -#define SETCURRENTPOINT (256+33) -#define WHAT0 (0) - -static char oneline[LINELEN]; -static objfnt *fnt; - -static unsigned short int mr; - -static char *bindat; -static int datbytes; -static int firsted; -static short chardata[20000]; -static int nshorts; - -static int thecharwidth, thesidebearing; -static int npnts, nloops; -static int nvertpos; - -static int fakepos; -static int fakemax; - -static float beztol = 100.0; - -/* extern: from libfm */ - -static char *my_subrs[MAXSUBRS]; -static unsigned int my_sublen[MAXSUBRS]; -static char *my_chars[MAXCHARS]; -static unsigned int my_charlen[MAXCHARS]; -static char *my_charname[MAXCHARS]; -static int my_nsubrs, my_nchars; - -static short sidebearing[MAXCHARS]; -static char tok[LINELEN]; -static int sp_npnts, sp_nloops; - -/* - * interpreter globals - */ - - -static float mat[2][2]; -static char *pcstack[100]; -static char *pc; -static int pcsp; -static int coordpos; -static int coordsave[7][2]; -static int incusp; -static int retstack[1000]; -static int retsp; -static int stack[1000]; -static int sp; -static int savesplines = 1; - -static pschar ISOcharlist[NASCII] = { - {"/space", 040, 0}, - {"/exclam", 041, 0}, - {"/quotedbl", 042, 0}, - {"/numbersign", 043, 0}, - {"/dollar", 044, 0}, - {"/percent", 045, 0}, - {"/ampersand", 046, 0}, - {"/quoteright", 047, 0}, - - {"/parenleft", 050, 0}, - {"/parenright", 051, 0}, - {"/asterisk", 052, 0}, - {"/plus", 053, 0}, - {"/comma", 054, 0}, - {"/hyphen", 055, 0}, - {"/period", 056, 0}, - {"/slash", 057, 0}, - - {"/zero", 060, 0}, - {"/one", 061, 0}, - {"/two", 062, 0}, - {"/three", 063, 0}, - {"/four", 064, 0}, - {"/five", 065, 0}, - {"/six", 066, 0}, - {"/seven", 067, 0}, - - {"/eight", 070, 0}, - {"/nine", 071, 0}, - {"/colon", 072, 0}, - {"/semicolon", 073, 0}, - {"/less", 074, 0}, - {"/equal", 075, 0}, - {"/greater", 076, 0}, - {"/question", 077, 0}, - - {"/at", 0100, 0}, - {"/A", 0101, 0}, - {"/B", 0102, 0}, - {"/C", 0103, 0}, - {"/D", 0104, 0}, - {"/E", 0105, 0}, - {"/F", 0106, 0}, - {"/G", 0107, 0}, - - {"/H", 0110, 0}, - {"/I", 0111, 0}, - {"/J", 0112, 0}, - {"/K", 0113, 0}, - {"/L", 0114, 0}, - {"/M", 0115, 0}, - {"/N", 0116, 0}, - {"/O", 0117, 0}, - - {"/P", 0120, 0}, - {"/Q", 0121, 0}, - {"/R", 0122, 0}, - {"/S", 0123, 0}, - {"/T", 0124, 0}, - {"/U", 0125, 0}, - {"/V", 0126, 0}, - {"/W", 0127, 0}, - - {"/X", 0130, 0}, - {"/Y", 0131, 0}, - {"/Z", 0132, 0}, - {"/bracketleft", 0133, 0}, - {"/backslash", 0134, 0}, - {"/bracketright", 0135, 0}, - {"/asciicircum", 0136, 0}, - {"/underscore", 0137, 0}, - - {"/quoteleft", 0140, 0}, - {"/a", 0141, 0}, - {"/b", 0142, 0}, - {"/c", 0143, 0}, - {"/d", 0144, 0}, - {"/e", 0145, 0}, - {"/f", 0146, 0}, - {"/g", 0147, 0}, - - {"/h", 0150, 0}, - {"/i", 0151, 0}, - {"/j", 0152, 0}, - {"/k", 0153, 0}, - {"/l", 0154, 0}, - {"/m", 0155, 0}, - {"/n", 0156, 0}, - {"/o", 0157, 0}, - - {"/p", 0160, 0}, - {"/q", 0161, 0}, - {"/r", 0162, 0}, - {"/s", 0163, 0}, - {"/t", 0164, 0}, - {"/u", 0165, 0}, - {"/v", 0166, 0}, - {"/w", 0167, 0}, - - {"/x", 0170, 0}, - {"/y", 0171, 0}, - {"/z", 0172, 0}, - {"/braceleft", 0173, 0}, - {"/bar", 0174, 0}, - {"/braceright", 0175, 0}, - {"/asciitilde", 0176, 0}, - {"/", 0177, 0}, - - - /* nonstandard defs */ - - {"/quotedblleft", 0200, 0}, - {"/quotedblright", 0201, 0}, - {"/quotedblbase", 0202, 0}, - {"/quotesinglbase", 0203, 0}, - {"/guilsinglleft", 0204, 0}, - {"/guilsinglright", 0205, 0}, - {"/endash", 0206, 0}, - {"/dagger", 0207, 0}, - - {"/daggerdbl", 0210, 0}, - {"/trademark", 0211, 0}, - {"/bullet", 0212, 0}, - {"/perthousand", 0213, 0}, - {"/Lslash", 0214, 0}, - {"/OE", 0215, 0}, - {"/lslash", 0216, 0}, - {"/oe", 0217, 0}, - - /* endnonstandard defs */ - - {"/dotlessi", 0220, 0}, - {"/grave", 0221, 0}, - {"/acute", 0222, 0}, - {"/circumflex", 0223, 0}, - {"/tilde", 0224, 0}, - {"/", 0225, 0}, - {"/breve", 0226, 0}, - {"/dotaccent", 0227, 0}, - - {"/", 0230, 0}, - {"/", 0231, 0}, - {"/ring", 0232, 0}, - {"/", 0233, 0}, - {"/", 0234, 0}, - {"/hungarumlaut", 0235, 0}, - {"/ogonek", 0236, 0}, - {"/caron", 0237, 0}, - - {"/", 0240, 0}, - {"/exclamdown", 0241, 0}, - {"/cent", 0242, 0}, - {"/sterling", 0243, 0}, - {"/florin", 0244, 0}, - {"/yen", 0245, 0}, - {"/brokenbar", 0246, 0}, - {"/section", 0247, 0}, - - {"/dieresis", 0250, 0}, - {"/copyright", 0251, 0}, - {"/ordfeminine", 0252, 0}, - {"/guillemotleft", 0253, 0}, - {"/logicalnot", 0254, 0}, - {"/hyphen", 0255, 0}, - {"/registered", 0256, 0}, - {"/macron", 0257, 0}, - - {"/degree", 0260, 0}, - {"/plusminus", 0261, 0}, - {"/twosuperior", 0262, 0}, - {"/threesuperior", 0263, 0}, - {"/acute", 0264, 0}, - {"/mu", 0265, 0}, - {"/paragraph", 0266, 0}, - {"/periodcentered", 0267, 0}, - - {"/cedilla", 0270, 0}, - {"/onesuperior", 0271, 0}, - {"/ordmasculine", 0272, 0}, - {"/guillemotright", 0273, 0}, - {"/onequarter", 0274, 0}, - {"/onehalf", 0275, 0}, - {"/threequarters", 0276, 0}, - {"/questiondown", 0277, 0}, - - {"/Agrave", 0300, 0}, - {"/Aacute", 0301, 0}, - {"/Acircumflex", 0302, 0}, - {"/Atilde", 0303, 0}, - {"/Adieresis", 0304, 0}, - {"/Aring", 0305, 0}, - {"/AE", 0306, 0}, - {"/Ccedilla", 0307, 0}, - - {"/Egrave", 0310, 0}, - {"/Eacute", 0311, 0}, - {"/Ecircumflex", 0312, 0}, - {"/Edieresis", 0313, 0}, - {"/Igrave", 0314, 0}, - {"/Iacute", 0315, 0}, - {"/Icircumflex", 0316, 0}, - {"/Idieresis", 0317, 0}, - - {"/Eth", 0320, 0}, - {"/Ntilde", 0321, 0}, - {"/Ograve", 0322, 0}, - {"/Oacute", 0323, 0}, - {"/Ocircumflex", 0324, 0}, - {"/Otilde", 0325, 0}, - {"/Odieresis", 0326, 0}, - {"/multiply", 0327, 0}, - - {"/Oslash", 0330, 0}, - {"/Ugrave", 0331, 0}, - {"/Uacute", 0332, 0}, - {"/Ucircumflex",0333, 0}, - {"/Udieresis", 0334, 0}, - {"/Yacute", 0335, 0}, - {"/Thorn", 0336, 0}, - {"/germandbls", 0337, 0}, - - {"/agrave", 0340, 0}, - {"/aacute", 0341, 0}, - {"/acircumflex",0342, 0}, - {"/atilde", 0343, 0}, - {"/adieresis", 0344, 0}, - {"/aring", 0345, 0}, - {"/ae", 0346, 0}, - {"/ccedilla", 0347, 0}, - - {"/egrave", 0350, 0}, - {"/eacute", 0351, 0}, - {"/ecircumflex", 0352, 0}, - {"/edieresis", 0353, 0}, - {"/igrave", 0354, 0}, - {"/iacute", 0355, 0}, - {"/icircumflex", 0356, 0}, - {"/idieresis", 0357, 0}, - - {"/eth", 0360, 0}, - {"/ntilde", 0361, 0}, - {"/ograve", 0362, 0}, - {"/oacute", 0363, 0}, - {"/ocircumflex",0364, 0}, - {"/otilde", 0365, 0}, - {"/odieresis", 0366, 0}, - {"/divide", 0367, 0}, - - {"/oslash", 0370, 0}, - {"/ugrave", 0371, 0}, - {"/uacute", 0372, 0}, - {"/ucircumflex",0373, 0}, - {"/udieresis", 0374, 0}, - {"/yacute", 0375, 0}, - {"/thorn", 0376, 0}, - {"/ydieresis", 0377, 0}, -}; - - -static short STDvsISO [][2] = { - {0341, 0306}, /* AE */ - {0351, 0330}, /* Oslash */ - {0302, 0222}, /* acute */ - {0361, 0346}, /* ae */ - {0306, 0226}, /* breve */ - {0317, 0237}, /* caron */ - {0313, 0270}, /* cedilla */ - {0303, 0223}, /* circumflex */ - {0250, 0244}, /* currency */ - {0310, 0250}, /* dieresis */ - {0307, 0227}, /* dotaccent */ - {0365, 0220}, /* dotlessi */ - {0373, 0337}, /* germandbls */ - {0301, 0221}, /* grave */ - {0315, 0235}, /* hungarumlaut */ - {0055, 0255}, /* hyphen */ - {0305, 0257}, /* macron */ - {0316, 0236}, /* ogenek */ - {0343, 0252}, /* ordfeminine */ - {0353, 0272}, /* ordmasculine */ - {0371, 0370}, /* oslash */ - {0264, 0267}, /* periodcentered */ - {0312, 0232}, /* ring */ - {0304, 0224}, /* tilde */ -}; - -/* from objfont.c, rest is in lfm_s !!*/ - -/* START 5.2 */ - -static int chartoindex(objfnt *fnt, int c) -{ - if(c<fnt->charmin) - return -1; - if(c>fnt->charmax) - return -1; - return c-fnt->charmin; -} - - -static chardesc *getchardesc(objfnt *fnt, int c) -{ - int index; - - index = chartoindex(fnt,c); - if(index<0) - return 0; - return fnt->my_chars+index; -} - -static objfnt *newobjfnt(int type, int charmin, int charmax, int fscale) -{ - objfnt *fnt; - - fnt = (objfnt *)MEM_mallocN(sizeof(objfnt), "newobjfnt"); - fnt->freeaddr = 0; - fnt->type = type; - fnt->charmin = charmin; - fnt->charmax = charmax; - fnt->my_nchars = fnt->charmax-fnt->charmin+1; - fnt->scale = fscale; - fnt->my_chars = (chardesc *)MEM_mallocN(fnt->my_nchars*sizeof(chardesc), "newobjfnt2"); - memset(fnt->my_chars, 0, fnt->my_nchars*sizeof(chardesc)); - return fnt; -} - - -static void addchardata (objfnt * fnt, int c, short * data, int nshorts) -{ - int index; - chardesc *cd; - - index = chartoindex(fnt,c); - if(index<0) { - fprintf(stderr,"Addchardata bad poop\n"); - return; - } - cd = fnt->my_chars+index; - fnt->freeaddr = 0; - cd->datalen = nshorts*sizeof(short); - cd->data = (short *)MEM_mallocN(cd->datalen, "addchardata"); - memcpy(cd->data, data, cd->datalen); -} - -static void addcharmetrics(objfnt *fnt, int c, int movex, int movey) -{ - int index; - chardesc *cd; - - index = chartoindex(fnt,c); - if(index<0) { - fprintf(stderr,"Addcharmetrics bad poop\n"); - return; - } - cd = fnt->my_chars+index; - cd->movex = movex; - cd->movey = movey; -} - - -static void fakechar(objfnt *fnt, int c, int width) -{ - short chardata[1]; - - chardata[0] = PO_RET; - addchardata(fnt,c,chardata,1); - addcharmetrics(fnt,c,width,0); -} - - -static void freeobjfnt(objfnt * fnt) -{ - int i; - chardesc *cd; - - cd = fnt->my_chars; - for(i=0; i<fnt->my_nchars; i++) { - if(cd->data) - MEM_freeN(cd->data); - cd++; - } - MEM_freeN(fnt->my_chars); - MEM_freeN(fnt); -} - - -/* END 5.2 */ - -static short STDtoISO(short c) -{ - short i = (sizeof(STDvsISO) / (2 * sizeof(short))) - 1; - - for (;i >= 0; i--){ - if (STDvsISO[i][0] == c) return (STDvsISO[i][1]); - } - return(c); -} - - -/* - * read the font matrix out of the font file - * - */ - -static char * newfgets(char * s, int n, PackedFile * pf){ - int c; - char * p; - - p = s; - while (n > 0){ - c = ((char *) pf->data)[pf->seek]; - pf->seek++; - if (pf->seek > pf->size){ - return (0); - } - if (c == 10 || c == 13){ - *p = 0; - return(s); - } - *p++ = c; - n--; - } - *p = 0; - return(s); -} - -static int readfontmatrix(PackedFile * pf, float mat[2][2]) -{ - char *cptr; - float a, b, c, d, e, f; - - pf->seek = 0; - - /* look for the FontMatrix def */ - while(1) { - if(!newfgets(oneline, LINELEN, pf)) { - fprintf(stderr,"fromtype1: no FontMatrix found\n"); - return(-1); - } - cptr = strchr(oneline,'/'); - if(cptr) { - if(strncmp(cptr,"/FontMatrix",11) == 0) { - cptr = strchr(cptr,'['); - if(!cptr) { - fprintf(stderr,"fromtype1: bad FontMatrix line\n"); - return(-1); - } - sscanf(cptr+1,"%f %f %f %f %f %f\n",&a,&b,&c,&d,&e,&f); - break; - } - } - } - - mat[0][0] = 1000.0*a; - mat[1][0] = 1000.0*b; - mat[0][1] = 1000.0*c; - mat[1][1] = 1000.0*d; - - return(0); -} - -/* - * Decryption support - * - * - */ -static void resetdecrypt(int n) -{ - mr = n; -} - - - -/* - * decryption subroutines - * - */ - -static char mdecrypt(char cipher) -{ - char plain; - - plain = (cipher^(mr>>8)); - mr = (cipher+mr)*MC1 + MC2; - return plain; -} - -static void decryptdata(char * cptr, int n) -{ - while(n--) { - *cptr = mdecrypt(*cptr); - cptr++; - } -} - -static int decryptprogram(char *buf, int len) -{ - int i; - - resetdecrypt(4330); - for(i=0; i<len; i++) { - if(i<SKIP) { - mdecrypt(buf[i]); - } - else { - buf[i-SKIP] = mdecrypt(buf[i]); - } - } - return len-SKIP; -} - -static void decryptall(void) -{ - int i; - - for(i=0; i<my_nsubrs; i++) - my_sublen[i] = decryptprogram(my_subrs[i],my_sublen[i]); - for(i=0; i<my_nchars; i++) - my_charlen[i] = decryptprogram(my_chars[i],my_charlen[i]); -} - - -/* - * decode the eexec part of the file - * - */ - -static int decodetype1(PackedFile * pf, char *outname) -{ - char *hptr, *bptr; - int i, totlen, hexbytes, c; - char *hexdat; - char hextab[256]; - - /* make hex table */ - if(!firsted) { - for(i=0; i<256; i++) { - if(i>='0' && i<='9') - hextab[i] = i-'0'; - else if(i>='a' && i<='f') - hextab[i] = 10+i-'a'; - else if(i>='A' && i<='F') - hextab[i] = 10+i-'A'; - else - hextab[i] = NOTHEX; - } - } - - pf->seek = 0; - - /* allocate buffers */ - totlen = pf->size; - hexdat = (char *)MEM_mallocN(totlen, "hexdat"); - bindat = (char *)MEM_mallocN(totlen, "bindat"); - - /* look for eexec part of file */ - while(1) { - if(!newfgets(oneline, LINELEN, pf)) { - fprintf(stderr,"fromtype1: no currentfile eexec found\n"); - return(-1); - } - oneline[16] = 0; - if(strcmp(oneline,"currentfile eexe") == 0) - break; - } - - /* initialize decryption variables */ - mr = 55665; - - /* first byte == 0 for binary data (???) */ - - c = ((char *) pf->data)[pf->seek]; - - if (hextab[c] != NOTHEX){ - /* read all the hex bytes into the hex buffer */ - hexbytes = 0; - while(newfgets(oneline, LINELEN, pf)) { - hptr = (char *)oneline; - while(*hptr) { - if(hextab[(int)*hptr] != NOTHEX) - hexdat[hexbytes++] = *hptr; - hptr++; - } - } - - /* check number of hex bytes */ - if(hexbytes & 1) - hexbytes--; - datbytes = hexbytes/2; - - /* translate hex data to binary */ - hptr = hexdat; - bptr = bindat; - c = datbytes; - while(c--) { - *bptr++ = (hextab[(int)hptr[0]]<<4)+hextab[(int)hptr[1]]; - hptr += 2; - } - - /* decrypt the data */ - decryptdata(bindat,datbytes); - - } else { - datbytes = pf->size - pf->seek; - memcpy(bindat, ((char *) pf->data) + pf->seek, datbytes); - - if ((bindat[2] << (8 + bindat[3])) == 0x800){ - /* order data (remove 6 bytes headers) */ - i = datbytes; - hptr = bptr = bindat + 4; - hptr += 2; - - while (i > 0){ - if (i > 2046) c = 2046; - else c = i; - - memcpy(bptr, hptr, c); - bptr += 2046; - hptr += 2046 + 6; - i -= 2046 + 6; - datbytes -= 6; - } - - /* decrypt the data */ - decryptdata(bindat+4,datbytes); - } else{ - decryptdata(bindat+6,datbytes-6); - } - } - -#ifdef DEBUG - outf = fopen(outname,"wb"); - fwrite(bindat,datbytes,1,outf); - fclose(outf); -#endif - - MEM_freeN(hexdat); - - return 1; -} - -/* - * fake file reading funcs - * - * - */ - -static void fakefopen(void) -{ - fakepos = 0; - fakemax = datbytes; -} - - -static void fakegettoken(char *str) -{ - int c; - char *cptr; - char *start; - - start = (char *) str; - cptr = bindat+fakepos; - c = *cptr++; - fakepos++; - if(c != '\n') { - while(isspace(c)) { - c = *cptr++; - fakepos++; - } - while (fakepos<fakemax && !isspace(c)) { - *str++ = c; - c = *cptr++; - fakepos++; - } - if(c == '\n') - fakepos--; - } - *str = 0; - if(fakepos>fakemax) { - fprintf(stderr,"fromtype1: unexpected eof\n"); - strcpy(start, "end"); - } -} - -static int fakefgets(char *buf,int max) -{ - char *cptr; - - cptr = (char *)(bindat+fakepos); - while(max--) { - *buf++ = *cptr; - fakepos++; - if(*cptr == 10 || *cptr == 13) - return 1; - cptr++; - if(fakepos>fakemax) - return 0; - } - return 0; -} - -static char *fakefread(int n) -{ - fakepos += n; - return bindat+fakepos-n; -} - -static void applymat(float mat[][2], float *x, float *y) -{ - float tx, ty; - - tx = ((*x)*mat[0][0])+((*y)*mat[0][1]); - ty = ((*x)*mat[1][0])+((*y)*mat[1][1]); - *x = tx; - *y = ty; -} - -static void setcharlist(void) -{ - char *name; /*found;*/ - int i, j; - - for(i=0; i<NASCII; i++) ISOcharlist[i].prog = -1; - - for(j=0; j<my_nchars; j++) { - name = my_charname[j]; - if(name) { - /*found = 0;*/ - for(i=0; i<NASCII; i++) { - if(ISOcharlist[i].name && (strcmp(name,ISOcharlist[i].name) == 0)){ - ISOcharlist[i].prog = j; - /*found = 1;*/ - } - } - /*if (found == 0) printf("no match found for: %s\n", name);*/ - MEM_freeN(name); - my_charname[j] = 0; - } - } -} - - -static objfnt * objfnt_from_psfont(PackedFile * pf) -{ - int i, k, index; - int nread, namelen; - char *cptr; - - fnt = 0; - bindat = 0; - - /* read the font matrix from the font */ - if (readfontmatrix(pf,mat)) return(0); - - /* decode the font data */ - decodetype1(pf, "/usr/tmp/type1.dec"); - - /* open the input file */ - fakefopen(); - - /* look for the /Subrs def and get my_nsubrs */ - while(1) { - if(!fakefgets(oneline,LINELEN)) { - fprintf(stderr,"fromtype1: no /Subrs found\n"); - my_nsubrs = 0; - fakefopen(); - break; - } - cptr = strchr(oneline,'/'); - if(cptr) { - if(strncmp(cptr,"/Subrs",6) == 0) { - my_nsubrs = atoi(cptr+6); - break; - } - } - } - - /* read the Subrs in one by one */ - for(i=0; i<my_nsubrs; i++) - my_sublen[i] = 0; - for(i=0; i<my_nsubrs; i++) { - for(k=0; k<MAXTRIES; k++) { - fakegettoken(tok); - if(strcmp(tok,"dup") == 0) - break; - } - if(k == MAXTRIES) { - fprintf(stderr,"dup for subr %d not found in range\n", i); - /*exit(1);*/ - } - - /* get the Subr index here */ - fakegettoken(tok); - index = atoi(tok); - - /* check to make sure it is in range */ - if(index<0 || index>my_nsubrs) { - fprintf(stderr,"bad Subr index %d\n",index); - /*exit(1);*/ - } - - /* get the number of bytes to read */ - fakegettoken(tok); - nread = atoi(tok); - fakegettoken(tok); - - /* read in the subroutine */ - my_sublen[index] = nread; - my_subrs[index] = fakefread(nread); - fakegettoken(tok); - } - - /* look for the CharStrings */ - while(1) { - fakegettoken(tok); - cptr = strchr(tok,'/'); - if(cptr && strcmp(cptr,"/CharStrings") == 0) - break; - } - - fakegettoken(tok); /* skip my_ncharscrings */ - fakegettoken(tok); /* skip dict */ - fakegettoken(tok); /* skip dup */ - fakegettoken(tok); /* skip begin */ - fakegettoken(tok); /* skip newline */ - - /* read the CharStrings one by one */ - my_nchars = 0; - for(i=0; i<MAXCHARS; i++) { - - /* check for end */ - fakegettoken(tok); - if(strcmp(tok,"end") == 0) - break; - - /* get the char name and allocate space for it */ - namelen = strlen(tok); - my_charname[i] = (char *)MEM_mallocN(namelen+1, "my_charname"); - strcpy(my_charname[i],tok); - - /* get the number of bytes to read */ - fakegettoken(tok); - nread = atoi(tok); - fakegettoken(tok); - - /* read in the char description */ - my_charlen[i] = nread; - my_chars[i] = fakefread(nread); - - /* skip the end of line */ - fakegettoken(tok); - fakegettoken(tok); - my_nchars++; - } - - /* decrypt the character descriptions */ - decryptall(); - setcharlist(); - - /* make the obj font */ - makeobjfont(savesplines); - - if (bindat) MEM_freeN(bindat); - /* system("rm /usr/tmp/type1.dec"); */ - - return (fnt); -} - - - - -/* - * pc stack support - * - */ - -static void initpcstack(void) -{ - pcsp = 0; -} - -static void pushpc(char *pc) -{ - pcstack[pcsp] = pc; - pcsp++; -} - -static char *poppc(void) -{ - pcsp--; - if(pcsp<0) { - fprintf(stderr,"\nYUCK: pc stack under flow\n"); - pcsp = 0; - return 0; - } - return pcstack[pcsp]; -} - -/* - * Data stack support - * - */ - -static void initstack(void) -{ - sp = 0; -} - -static void push(int val) -/* int val; */ -{ - stack[sp] = val; - sp++; -} - -static int pop(void) -{ - sp--; - if(sp<0) { - fprintf(stderr,"\nYUCK: stack under flow\n"); - sp = 0; - return 0; - } - return stack[sp]; -} - -/* - * call/return data stack - * - */ - -static void initretstack(void) -{ - retsp = 0; -} - -static void retpush(int val) -/* int val; */ -{ - retstack[retsp] = val; - retsp++; -} - -static int retpop(void) -{ - retsp--; - if(retsp<0) { - fprintf(stderr,"\nYUCK: ret stack under flow\n"); - retsp = 0; - return 0; - } - return retstack[retsp]; -} - - -/* - * execute the program: - * - * - */ - -static void getmove(int *x, int *y) -{ - *x = delx; - *y = dely; - /* printf("ingetmove\n"); */ -} - -static void getpos(int *x, int *y) -{ - *x = curx; - *y = cury; -} - -static void subr1(void) -{ - coordpos = 0; - incusp = 1; -} - -static void subr2(void) -{ - int x, y; - - getmove(&x,&y); - if(coordpos>=7) { - fprintf(stderr,"subr2: bad poop\n"); - /*exit(1);*/ - } - coordsave[coordpos][0] = x; - coordsave[coordpos][1] = y; - coordpos++; -} - -static void subr0(void) -{ - int x0, y0; - int x1, y1; - int x2, y2; - int x3, y3; - int noise; - - pop(); /* xpos, unused */ - pop(); /* ypos, unused */ - noise = pop(); - if(coordpos!=7) { - fprintf(stderr,"subr0: bad poop\n"); - /*exit(1);*/ - } - x0 = coordsave[0][0]; - y0 = coordsave[0][1]; - - x1 = coordsave[1][0]+x0; - y1 = coordsave[1][1]+y0; - x2 = coordsave[2][0]; - y2 = coordsave[2][1]; - x3 = coordsave[3][0]; - y3 = coordsave[3][1]; - rcurveto(x1,y1,x1+x2,y1+y2,x1+x2+x3,y1+y2+y3); - x1 = coordsave[4][0]; - y1 = coordsave[4][1]; - x2 = coordsave[5][0]; - y2 = coordsave[5][1]; - x3 = coordsave[6][0]; - y3 = coordsave[6][1]; - rcurveto(x1,y1,x1+x2,y1+y2,x1+x2+x3,y1+y2+y3); - getpos(&x0,&y0); - retpush(y0); - retpush(x0); - incusp = 0; -} - -static void append_poly_offset(short ofsx, short ofsy, short * data) -{ - int nverts; - - if (data == 0) return; - - while(1) { - switch(chardata[nshorts++] = *data++) { - case PO_BGNLOOP: - nshorts --; /* for the first time */ - break; - case PO_RETENDLOOP: - case PO_RET: - return; - } - nverts = chardata[nshorts++] = *data++; - while(nverts--) { - chardata[nshorts++] = (*data++) + ofsx; - chardata[nshorts++] = (*data++) + ofsy; - } - } -} - - -static void append_spline_offset(short ofsx, short ofsy, short * data) -{ - int nverts = 0; - - if (data == 0) return; - - while(1) { - switch(chardata[nshorts++] = *data++) { - case SP_MOVETO: - case SP_LINETO: - nverts = 1; - break; - case SP_CURVETO: - nverts = 3; - break; - case SP_RETCLOSEPATH: - case SP_RET: - return; - } - - for (; nverts > 0; nverts--) { - chardata[nshorts++] = (*data++) + ofsx; - chardata[nshorts++] = (*data++) + ofsy; - } - } -} - - - -/* - * graphics follows - * - * - */ - - -/* poly output stuff */ - -static void setwidth(int w, int x) -{ - thecharwidth = w; - thesidebearing = x; -} - -static void poly_beginchar(void) -{ - npnts = 0; - nloops = 0; -} - -static void poly_endchar(void) -{ - if(nloops == 0) - chardata[nshorts++] = PO_RET; - else - chardata[nshorts++] = PO_RETENDLOOP; -} - -static void poly_close(void) -{ - chardata[nvertpos] = npnts; - npnts = 0; -} - -static void poly_pnt(float x, float y) -{ - int ix, iy; - - applymat(mat,&x,&y); - ix = floor(x); - iy = floor(y); - if(npnts == 0) { - if(nloops == 0) { - chardata[nshorts++] = PO_BGNLOOP; - nvertpos = nshorts++; - } else { - chardata[nshorts++] = PO_ENDBGNLOOP; - nvertpos = nshorts++; - } - nloops++; - } - chardata[nshorts++] = ix; - chardata[nshorts++] = iy; - npnts++; - -} - -/* spline output stuff */ - -static void spline_beginchar(void) -{ - sp_npnts = 0; - sp_nloops = 0; -} - -static void spline_endchar(void) -{ - if(sp_nloops == 0) - chardata[nshorts++] = SP_RET; - else - chardata[nshorts++] = SP_RETCLOSEPATH; -} - -static void spline_close(void) -{ - chardata[nshorts++] = SP_CLOSEPATH; - sp_npnts = 0; - sp_nloops = 0; -} - -static void spline_line(float x0, float y0, float x1, float y1) -{ - applymat(mat,&x0,&y0); - applymat(mat,&x1,&y1); - - if(sp_npnts == 0) { - chardata[nshorts++] = SP_MOVETO; - chardata[nshorts++] = floor(x0); - chardata[nshorts++] = floor(y0); - sp_npnts++; - sp_nloops++; - } - chardata[nshorts++] = SP_LINETO; - chardata[nshorts++] = floor(x1); - chardata[nshorts++] = floor(y1); - sp_npnts++; -} - -static void spline_curveto(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) -{ - applymat(mat,&x0,&y0); - - applymat(mat,&x1,&y1); - applymat(mat,&x2,&y2); - applymat(mat,&x3,&y3); - if(sp_npnts == 0) { - chardata[nshorts++] = SP_MOVETO; - chardata[nshorts++] = floor(x0); - chardata[nshorts++] = floor(y0); - sp_npnts++; - sp_nloops++; - } - chardata[nshorts++] = SP_CURVETO; - chardata[nshorts++] = floor(x1); - chardata[nshorts++] = floor(y1); - chardata[nshorts++] = floor(x2); - chardata[nshorts++] = floor(y2); - chardata[nshorts++] = floor(x3); - chardata[nshorts++] = floor(y3); -} - -static void savestart(int x, int y) -{ - startx = x; - starty = y; - started = 1; -} - -static void sbpoint( int x, int y) -{ - curx = x; - cury = y; -} - -static void rmoveto( int x, int y) -{ - if(incusp) { - delx = x; - dely = y; - } else { - curx += x; - cury += y; - savestart(curx,cury); - } -} - -static void drawline(float x0, float y0, float x1, float y1, float dx0, float dy0, float dx1, float dy1) -{ - if(x0!=x1 || y0!=y1) - poly_pnt(x1,y1); -} - - -static void rlineto( int x, int y) -{ - float dx, dy; - - nextx = curx + x; - nexty = cury + y; - dx = nextx-curx; - dy = nexty-cury; - if (savesplines) spline_line( curx, cury, nextx, nexty); - else drawline( curx, cury, nextx, nexty,dx,dy,dx,dy); - curx = nextx; - cury = nexty; -} - -static void closepath(void) -{ - float dx, dy; - - if(started) { - dx = startx-curx; - dy = starty-cury; - if (savesplines) { - spline_close(); - } else { - drawline( curx, cury, startx, starty,dx,dy,dx,dy); - poly_close(); - } - started = 0; - } -} - -static void bezadapt( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float beztol) -{ - float ax0,ay0,ax1,ay1,ax2,ay2,ax3,ay3; - float bx0,by0,bx1,by1,bx2,by2,bx3,by3; - float midx, midy; - float linx, liny, dx, dy, mag; - - midx = (x0+3*x1+3*x2+x3)/8.0; - midy = (y0+3*y1+3*y2+y3)/8.0; - linx = (x0+x3)/2.0; - liny = (y0+y3)/2.0; - dx = midx-linx; - dy = midy-liny; - mag = dx*dx+dy*dy; - if(mag<(beztol*beztol)) - drawline(x0,y0,x3,y3,x1-x0,y1-y0,x3-x2,y3-y2); - else { - ax0 = x0; - ay0 = y0; - ax1 = (x0+x1)/2; - ay1 = (y0+y1)/2; - ax2 = (x0+2*x1+x2)/4; - ay2 = (y0+2*y1+y2)/4; - ax3 = midx; - ay3 = midy; - bezadapt(ax0,ay0,ax1,ay1,ax2,ay2,ax3,ay3,beztol); - - bx0 = midx; - by0 = midy; - bx1 = (x1+2*x2+x3)/4; - by1 = (y1+2*y2+y3)/4; - bx2 = (x2+x3)/2; - by2 = (y2+y3)/2; - bx3 = x3; - by3 = y3; - bezadapt(bx0,by0,bx1,by1,bx2,by2,bx3,by3,beztol); - } -} - -static void drawbez( float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3) -{ - bezadapt(x0,y0,x1,y1,x2,y2,x3,y3,beztol); -} - - -static void rcurveto( int dx1, int dy1, int dx2, int dy2, int dx3, int dy3) -{ - int x0, y0; - int x1, y1; - int x2, y2; - int x3, y3; - - x0 = curx; - y0 = cury; - x1 = curx+dx1; - y1 = cury+dy1; - x2 = curx+dx2; - y2 = cury+dy2; - x3 = curx+dx3; - y3 = cury+dy3; - - if (savesplines) { - spline_curveto( x0, y0, x1, y1, x2, y2, x3, y3); - } else{ - drawbez( x0, y0, x1, y1, x2, y2, x3, y3); - } - curx = x3; - cury = y3; -} - -/* - * saveobjfont - - * save an object font. - * - */ - -/* generic routines */ - -static void makeobjfont(int savesplines) -{ - int i, c; - - if(savesplines) - fnt = newobjfnt(SP_TYPE, 32, 32+NASCII-1, 9840); - else - fnt = newobjfnt(PO_TYPE, 32, 32+NASCII-1, 9840); - - for(i=0; i<NASCII; i++) { - c = i+32; - if(ISOcharlist[i].prog>=0) { - /*printf("decoding %s\n", ISOcharlist[i].name);*/ - - nshorts = 0; - drawchar(ISOcharlist[i].prog); - addchardata(fnt,c,chardata,nshorts); - addcharmetrics(fnt,c,thecharwidth,0); - sidebearing[c] = thesidebearing; - } else if(c == ' ') { - printf("faking space %d\n",i); - fakechar(fnt,' ',400); - } - } -} - -/* - * run the character program - * - * - */ - -static void drawchar(int c) -{ - if (savesplines) { - spline_beginchar(); - } else { - poly_beginchar(); - } - initstack(); - initpcstack(); - initretstack(); - pc = my_chars[c]; - runprog(); - if (savesplines){ - spline_endchar(); - } else { - poly_endchar(); - } -} - -static int docommand(int cmd) -{ - int x, y, w, c1, c2; - int dx1, dy1; - int dx2, dy2; - int dx3, dy3; - float fdx1, fdy1; - int i, sub, n; - char *subpc; - chardesc *cd; - short *ndata; - - switch(cmd) { - case WHAT0: - fprintf(stderr,"\nYUCK: WHAT0\n"); - break; - case HSTEM: - pop(); - pop(); - /*printf("hstem: %d %d\n", pop(), pop());*/ - break; - case VSTEM: - pop(); - pop(); - /*printf("vstem: %d %d\n", pop(), pop());*/ - break; - case VMOVETO: - y = pop(); - rmoveto(0,y); - break; - case RLINETO: - y = pop(); - x = pop(); - rlineto(x,y); - break; - case HLINETO: - x = pop(); - rlineto(x,0); - break; - case VLINETO: - y = pop(); - rlineto(0,y); - break; - case RRCURVETO: - dy3 = pop(); - dx3 = pop(); - dy2 = pop(); - dx2 = pop(); - dy1 = pop(); - dx1 = pop(); - rcurveto(dx1,dy1,dx1+dx2,dy1+dy2,dx1+dx2+dx3,dy1+dy2+dy3); - break; - case CLOSEPATH: - closepath(); - break; - case CALLSUBR: - sub = pop(); - subpc = my_subrs[sub]; - if(!subpc) { - fprintf(stderr,"\nYUCK no sub addr\n"); - } - pushpc(pc); - pc = subpc; - break; - case RETURN: - pc = poppc(); - break; - case HSBW: - w = pop(); - x = pop(); - setwidth(w, x); - sbpoint(x,0); - break; - case ENDCHAR: - closepath(); - break; - case RMOVETO: - y = pop(); - x = pop(); - rmoveto(x,y); - break; - case HMOVETO: - x = pop(); - rmoveto(x,0); - break; - case VHCURVETO: - dy3 = 0; - dx3 = pop(); - dy2 = pop(); - dx2 = pop(); - dy1 = pop(); - dx1 = 0; - rcurveto(dx1,dy1,dx1+dx2,dy1+dy2,dx1+dx2+dx3,dy1+dy2+dy3); - break; - case HVCURVETO: - dy3 = pop(); - dx3 = 0; - dy2 = pop(); - dx2 = pop(); - dy1 = 0; - dx1 = pop(); - rcurveto(dx1,dy1,dx1+dx2,dy1+dy2,dx1+dx2+dx3,dy1+dy2+dy3); - break; - case DOTSECTION: - break; - case VSTEM3: - /*printf("vstem3\n");*/ - pop(); - pop(); - pop(); - pop(); - pop(); - pop(); - break; - case HSTEM3: - /*printf("hstem3\n");*/ - pop(); - pop(); - pop(); - pop(); - pop(); - pop(); - break; - case SEAC: - if (0) { - printf("seac: %3d %3d %3d %3d %3d\n", pop(), pop(), pop(), pop(), pop()); - } else{ - c2 = STDtoISO(pop()); /* accent */ - c1 = STDtoISO(pop()); /* letter */ - - cd = getchardesc(fnt, c1); - if (cd) { - memcpy(chardata, cd->data, cd->datalen); - nshorts = cd->datalen / sizeof(short); - } - - cd = getchardesc(fnt, c2); - if (cd && cd->data && cd->datalen) { - ndata = cd->data; - - if (nshorts) { - if (savesplines) { - switch (chardata[nshorts - 1]){ - case SP_RET: - nshorts--; - break; - case SP_RETCLOSEPATH: - chardata[nshorts - 1] = SP_CLOSEPATH; - break; - } - } else { - switch (chardata[nshorts - 1]){ - case PO_RET: - printf("PO_RET in character disription ?\n"); - nshorts--; - break; - case PO_RETENDLOOP: - if (ndata[0] == PO_BGNLOOP) { - chardata[nshorts - 1] = PO_ENDBGNLOOP; - } else { - printf("new character doesn't start with PO_BGNLOOP ?\n"); - } - break; - } - } - } - - /* instead of the sidebearing[c1] maybe thesidebearing should be used */ - - dy1 = pop(); - dx1 = pop() + sidebearing[c1] - sidebearing[c2]; - pop(); - - fdx1 = dx1; - fdy1 = dy1; - applymat(mat, &fdx1, &fdy1); - dx1 = floor(fdx1); - dy1 = floor(fdy1); - - if (savesplines) { - append_spline_offset(dx1, dy1, ndata); - } else{ - append_poly_offset(dx1, dy1, ndata); - } - - /*printf("first: %d %d\n", cd->data[0], cd->data[1]);*/ - } - fflush(stdout); - } - break; - case SBW: - w = pop(); - y = pop(); - fprintf(stderr,"sbw: width: %d %d\n",w,y); - y = pop(); - x = pop(); - fprintf(stderr,"sbw: side: %d %d\n",x,y); - setwidth(w, x); - sbpoint(x,y); - break; - case DIV: - x = pop(); - y = pop(); - push(x/y); - break; - case CALLOTHERSUBR: - sub = pop(); - n = pop(); - if(sub == 0) - subr0(); - else if(sub == 1) - subr1(); - else if(sub == 2) - subr2(); - else { - for(i=0; i<n; i++) { - retpush(pop()); - } - } - break; - case POP: - push(retpop()); - break; - case SETCURRENTPOINT: - y = pop(); - x = pop(); - sbpoint(x,y); - break; - default: - /*fprintf(stderr,"\nYUCK bad instruction %d\n",cmd);*/ - break; - } - if(pc == 0 || cmd == ENDCHAR || cmd == WHAT0 || cmd == SEAC) - return 0; - else - return 1; -} - - -/* - * Character interpreter - * - */ - -static void runprog(void) -{ - int v, w, num, cmd; - - while(1) { - v = *pc++; - if(v>=0 && v<=31) { - if(v == 12) { - w = *pc++; - cmd = 256+w; - } else - cmd = v; - if(!docommand(cmd)) { - return; - } - } else if(v>=32 && v<=246) { - num = v-139; - push(num); - } else if(v>=247 && v<=250) { - w = *pc++; - num = (v-247)*256+w+108; - push(num); - } else if(v>=251 && v<=254) { - w = *pc++; - num = -(v-251)*256-w-108; - push(num); - } else if(v == 255) { - num = *pc++; - num <<= 8; - num |= *pc++; - num <<= 8; - num |= *pc++; - num <<= 8; - num |= *pc++; - push(num); - } - } -} - -/***/ - -static VFontData *objfnt_to_vfontdata(objfnt *fnt) -{ - VFontData *vfd; - chardesc *cd; - short *_data, *data; - int a, i, count, stop, ready, meet; - short first[2]={0,0}, last[2]={0,0}; - struct Nurb *nu; - struct BezTriple *bezt, *bez2; - float scale, dx, dy; - struct VChar *che; - - if (!fnt || (fnt->type!=SP_TYPE)) { - return NULL; - } - - vfd= MEM_callocN(sizeof(*vfd), "VFontData"); - scale = 10.0/(float)fnt->scale; /* after IRIX 6.2, scaling went wrong */ - - for (i = 0; i < MAX_VF_CHARS; i++) { - cd = getchardesc(fnt, i); - if (cd && cd->data && cd->datalen) { - che = (VChar *) MEM_callocN(sizeof(VChar), "objfnt_char"); - BLI_addtail(&vfd->characters, che); - che->index = i; - che->width = scale * cd->movex; - - _data = data = cd->data; - - do{ - /* count first */ - _data = data; - count = 0; - ready = stop = 0; - - do{ - switch(*data++){ - case SP_MOVETO: - first[0] = data[0]; - first[1] = data[1]; - case SP_LINETO: - count++; - last[0] = data[0]; - last[1] = data[1]; - data += 2; - break; - case SP_CURVETO: - count++; - last[0] = data[4]; - last[1] = data[5]; - data += 6; - break; - case SP_RET: - case SP_RETCLOSEPATH: - stop = 1; - ready = 1; - break; - case SP_CLOSEPATH: - stop = 1; - break; - } - } while (!stop); - - if ((count>0) && last[0] == first[0] && last[1] == first[1]) meet = 1; - else meet = 0; - - /* is there more than 1 unique point ?*/ - - if (count - meet > 0) { - data = _data; - nu = (Nurb*)MEM_callocN(sizeof(struct Nurb),"objfnt_nurb"); - bezt = (BezTriple*)MEM_callocN((count)* sizeof(BezTriple),"objfnt_bezt") ; - if (nu != 0 && bezt != 0) { - BLI_addtail(&che->nurbsbase, nu); - nu->type= CU_BEZIER+CU_2D; - nu->pntsu = count; - nu->resolu= 8; - nu->flagu= CU_CYCLIC; - nu->bezt = bezt; - stop = 0; - - /* read points */ - do { - switch(*data++){ - case SP_MOVETO: - bezt->vec[1][0] = scale * *data++; - bezt->vec[1][1] = scale * *data++; - - break; - case SP_LINETO: - bez2 = bezt++; - bezt->vec[1][0] = scale * *data++; - bezt->vec[1][1] = scale * *data++; - /* vector handles */ - bezt->h1= HD_VECT; - bez2->h2= HD_VECT; - dx = (bezt->vec[1][0] - bez2->vec[1][0]) / 3.0; - dy = (bezt->vec[1][1] - bez2->vec[1][1]) / 3.0; - bezt->vec[0][0] = bezt->vec[1][0] - dx; - bezt->vec[0][1] = bezt->vec[1][1] - dy; - bez2->vec[2][0] = bez2->vec[1][0] + dx; - bez2->vec[2][1] = bez2->vec[1][1] + dy; - break; - - case SP_CURVETO: - bezt->vec[2][0] = scale * *data++; - bezt->vec[2][1] = scale * *data++; - bezt->h2= HD_ALIGN; - bezt++; - bezt->vec[0][0] = scale * *data++; - bezt->vec[0][1] = scale * *data++; - bezt->vec[1][0] = scale * *data++; - bezt->vec[1][1] = scale * *data++; - bezt->h1= HD_ALIGN; - break; - - case SP_RET: - case SP_RETCLOSEPATH: - stop = 1; - ready = 1; - break; - case SP_CLOSEPATH: - stop = 1; - break; - } - } while (stop == 0); - - if (meet) { - /* copy handles */ - nu->bezt->vec[0][0] = bezt->vec[0][0]; - nu->bezt->vec[0][1] = bezt->vec[0][1]; - /* and forget last point */ - nu->pntsu--; - } - else { - /* vector handles */ - bez2 = nu->bezt; - dx = (bezt->vec[1][0] - bez2->vec[1][0]) / 3.0; - dy = (bezt->vec[1][1] - bez2->vec[1][1]) / 3.0; - bezt->vec[2][0] = bezt->vec[1][0] - dx; - bezt->vec[2][1] = bezt->vec[1][1] - dy; - bez2->vec[0][0] = bez2->vec[1][0] + dx; - bez2->vec[0][1] = bez2->vec[1][1] + dy; - bezt->h2= bez2->h1= HD_VECT; - } - - /* forbidden handle combinations */ - a= nu->pntsu; - bezt= nu->bezt; - while(a--) { - if(bezt->h1!=HD_ALIGN && bezt->h2==HD_ALIGN) bezt->h2= 0; - else if(bezt->h2!=HD_ALIGN && bezt->h1==HD_ALIGN) bezt->h1= 0; - bezt->radius= 1.0f; - bezt++; - } - - } - else { - if (nu) MEM_freeN(nu); - if (bezt) MEM_freeN(bezt); - } - } - _data = data; - } while (ready == 0); - } - } - - return vfd; -} - -VFontData *BLI_vfontdata_from_psfont(PackedFile *pf) -{ - objfnt *fnt= objfnt_from_psfont(pf); - VFontData *vfd= NULL; - - if (fnt) { - vfd= objfnt_to_vfontdata(fnt); - freeobjfnt(fnt); - } - - return vfd; -} diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c index 7af383e2356..0a416e624cb 100644 --- a/source/blender/blenlib/intern/storage.c +++ b/source/blender/blenlib/intern/storage.c @@ -218,7 +218,7 @@ void BLI_builddir(char *dirname, char *relname) { struct dirent *fname; struct dirlink *dlink; - int rellen, newnum = 0; + int rellen, newnum = 0, len; char buf[256]; DIR *dir; @@ -237,13 +237,11 @@ void BLI_builddir(char *dirname, char *relname) if ( (dir = (DIR *)opendir(".")) ){ while ((fname = (struct dirent*) readdir(dir)) != NULL) { + len= strlen(fname->d_name); - if(hide_dot && fname->d_name[0]=='.' && fname->d_name[1]!='.' && fname->d_name[1]!=0) { - } - else if ( ( (fname->d_name[0] == '.') && (fname->d_name[1] == 0) ) || - ( (fname->d_name[0] == '.') && (fname->d_name[1] == '.') && (fname->d_name[2] == 0)) ) { - /* ignore '.' and '..' */ - } + if(hide_dot && fname->d_name[0]=='.' && fname->d_name[1]!='.' && fname->d_name[1]!=0); /* ignore .file */ + else if(hide_dot && len && fname->d_name[len-1]=='~'); /* ignore file~ */ + else if (((fname->d_name[0] == '.') && (fname->d_name[1] == 0) )); /* ignore . */ else { dlink = (struct dirlink *)malloc(sizeof(struct dirlink)); if (dlink){ @@ -265,7 +263,13 @@ void BLI_builddir(char *dirname, char *relname) while(dlink){ memset(&files[actnum], 0 , sizeof(struct direntry)); files[actnum].relname = dlink->name; +// use 64 bit file size, only needed for WIN32 and WIN64. +// Excluding other than current MSVC compiler until able to test. +#if (defined(WIN32) || defined(WIN64)) && (_MSC_VER>=1500) + _stat64(dlink->name,&files[actnum].s); +#else stat(dlink->name,&files[actnum].s); +#endif files[actnum].type=files[actnum].s.st_mode; files[actnum].flags = 0; totnum++; @@ -361,7 +365,7 @@ void BLI_adddirstrings() * will buy us some time until files get bigger than 4GB or until * everyone starts using __USE_FILE_OFFSET64 or equivalent. */ - st_size= (off_t)files[num].s.st_size; + st_size= files[num].s.st_size; if (st_size > 1024*1024*1024) { sprintf(files[num].size, "%.2f GB", ((double)st_size)/(1024*1024*1024)); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 99f421a03ba..9189d5140d7 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -94,6 +94,7 @@ #include "DNA_sdna_types.h" #include "DNA_scene_types.h" #include "DNA_sequence_types.h" +#include "DNA_smoke_types.h" #include "DNA_sound_types.h" #include "DNA_space_types.h" #include "DNA_texture_types.h" @@ -1565,33 +1566,6 @@ static PreviewImage *direct_link_preview_image(FileData *fd, PreviewImage *old_p return prv; } -/* ************ READ SCRIPTLINK *************** */ - -static void lib_link_scriptlink(FileData *fd, ID *id, ScriptLink *slink) -{ - int i; - - for(i=0; i<slink->totscript; i++) { - slink->scripts[i]= newlibadr(fd, id->lib, slink->scripts[i]); - } -} - -static void direct_link_scriptlink(FileData *fd, ScriptLink *slink) -{ - slink->scripts= newdataadr(fd, slink->scripts); - test_pointer_array(fd, (void **)&slink->scripts); - - slink->flag= newdataadr(fd, slink->flag); - - if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) { - int a; - - for(a=0; a<slink->totscript; a++) { - SWITCH_SHORT(slink->flag[a]); - } - } -} - /* ************ READ ANIMATION STUFF ***************** */ /* Legacy Data Support (for Version Patching) ----------------------------- */ @@ -2367,8 +2341,6 @@ static void lib_link_camera(FileData *fd, Main *main) ca->dof_ob= newlibadr_us(fd, ca->id.lib, ca->dof_ob); - lib_link_scriptlink(fd, &ca->id, &ca->scriptlink); - ca->id.flag -= LIB_NEEDLINK; } ca= ca->id.next; @@ -2379,8 +2351,6 @@ static void direct_link_camera(FileData *fd, Camera *ca) { ca->adt= newdataadr(fd, ca->adt); direct_link_animdata(fd, ca->adt); - - direct_link_scriptlink(fd, &ca->scriptlink); } @@ -2407,8 +2377,6 @@ static void lib_link_lamp(FileData *fd, Main *main) la->ipo= newlibadr_us(fd, la->id.lib, la->ipo); // XXX depreceated - old animation system - lib_link_scriptlink(fd, &la->id, &la->scriptlink); - la->id.flag -= LIB_NEEDLINK; } la= la->id.next; @@ -2421,8 +2389,6 @@ static void direct_link_lamp(FileData *fd, Lamp *la) la->adt= newdataadr(fd, la->adt); direct_link_animdata(fd, la->adt); - - direct_link_scriptlink(fd, &la->scriptlink); for(a=0; a<MAX_MTEX; a++) { la->mtex[a]= newdataadr(fd, la->mtex[a]); @@ -2522,7 +2488,8 @@ static void lib_link_mball(FileData *fd, Main *main) mb= main->mball.first; while(mb) { if(mb->id.flag & LIB_NEEDLINK) { - + if (mb->adt) lib_link_animdata(fd, &mb->id, mb->adt); + for(a=0; a<mb->totcol; a++) mb->mat[a]= newlibadr_us(fd, mb->id.lib, mb->mat[a]); mb->ipo= newlibadr_us(fd, mb->id.lib, mb->ipo); // XXX depreceated - old animation system @@ -2535,6 +2502,9 @@ static void lib_link_mball(FileData *fd, Main *main) static void direct_link_mball(FileData *fd, MetaBall *mb) { + mb->adt= newdataadr(fd, mb->adt); + direct_link_animdata(fd, mb->adt); + mb->mat= newdataadr(fd, mb->mat); test_pointer_array(fd, (void **)&mb->mat); @@ -2543,6 +2513,8 @@ static void direct_link_mball(FileData *fd, MetaBall *mb) mb->disp.first= mb->disp.last= NULL; mb->editelems= NULL; mb->bb= NULL; +/* mb->edit_elems.first= mb->edit_elems.last= NULL;*/ + mb->lastelem= NULL; } /* ************ READ WORLD ***************** */ @@ -2568,8 +2540,6 @@ static void lib_link_world(FileData *fd, Main *main) } } - lib_link_scriptlink(fd, &wrld->id, &wrld->scriptlink); - wrld->id.flag -= LIB_NEEDLINK; } wrld= wrld->id.next; @@ -2582,8 +2552,6 @@ static void direct_link_world(FileData *fd, World *wrld) wrld->adt= newdataadr(fd, wrld->adt); direct_link_animdata(fd, wrld->adt); - - direct_link_scriptlink(fd, &wrld->scriptlink); for(a=0; a<MAX_MTEX; a++) { wrld->mtex[a]= newdataadr(fd, wrld->mtex[a]); @@ -2921,7 +2889,6 @@ static void lib_link_material(FileData *fd, Main *main) mtex->object= newlibadr(fd, ma->id.lib, mtex->object); } } - lib_link_scriptlink(fd, &ma->id, &ma->scriptlink); if(ma->nodetree) lib_link_ntree(fd, &ma->id, ma->nodetree); @@ -2946,8 +2913,6 @@ static void direct_link_material(FileData *fd, Material *ma) ma->ramp_col= newdataadr(fd, ma->ramp_col); ma->ramp_spec= newdataadr(fd, ma->ramp_spec); - direct_link_scriptlink(fd, &ma->scriptlink); - ma->nodetree= newdataadr(fd, ma->nodetree); if(ma->nodetree) direct_link_nodetree(fd, ma->nodetree); @@ -3730,13 +3695,23 @@ static void lib_link_object(FileData *fd, Main *main) if(fluidmd && fluidmd->fss) fluidmd->fss->ipo = newlibadr_us(fd, ob->id.lib, fluidmd->fss->ipo); } + + { + SmokeModifierData *smd = (SmokeModifierData *)modifiers_findByType(ob, eModifierType_Smoke); + + if(smd && smd->type == MOD_SMOKE_TYPE_DOMAIN && smd->domain) + { + smd->domain->coll_group = newlibadr_us(fd, ob->id.lib, smd->domain->coll_group); + smd->domain->eff_group = newlibadr_us(fd, ob->id.lib, smd->domain->eff_group); + smd->domain->fluid_group = newlibadr_us(fd, ob->id.lib, smd->domain->fluid_group); + } + } /* texture field */ if(ob->pd) if(ob->pd->tex) ob->pd->tex=newlibadr_us(fd, ob->id.lib, ob->pd->tex); - lib_link_scriptlink(fd, &ob->id, &ob->scriptlink); lib_link_particlesystems(fd, ob, &ob->id, &ob->particlesystem); lib_link_modifiers(fd, ob); } @@ -3822,6 +3797,47 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb) fluidmd->fss= newdataadr(fd, fluidmd->fss); fluidmd->fss->meshSurfNormals = 0; } + else if (md->type==eModifierType_Smoke) { + SmokeModifierData *smd = (SmokeModifierData*) md; + + smd->point_cache = NULL; + + if(smd->type==MOD_SMOKE_TYPE_DOMAIN) + { + smd->flow = NULL; + smd->coll = NULL; + smd->domain = newdataadr(fd, smd->domain); + smd->domain->smd = smd; + + smd->domain->fluid = NULL; + smd->domain->tvox = NULL; + smd->domain->tray = NULL; + smd->domain->tvoxbig = NULL; + smd->domain->traybig = NULL; + smd->domain->bind = NULL; + smd->domain->max_textures = 0; + smd->domain->viewsettings = 0; // reset view for new frame + } + else if(smd->type==MOD_SMOKE_TYPE_FLOW) + { + smd->domain = NULL; + smd->coll = NULL; + smd->flow = newdataadr(fd, smd->flow); + smd->flow->smd = smd; + smd->flow->psys = newdataadr(fd, smd->flow->psys); + } + else if(smd->type==MOD_SMOKE_TYPE_COLL) + { + smd->flow = NULL; + smd->domain = NULL; + smd->coll = NULL; + /* + smd->coll = newdataadr(fd, smd->coll); + smd->coll->points = NULL; + smd->coll->numpoints = 0; + */ + } + } else if (md->type==eModifierType_Collision) { CollisionModifierData *collmd = (CollisionModifierData*) md; @@ -3936,8 +3952,6 @@ static void direct_link_object(FileData *fd, Object *ob) link_list(fd, &ob->constraintChannels); // >>> XXX depreceated - old animation system - direct_link_scriptlink(fd, &ob->scriptlink); - ob->mat= newdataadr(fd, ob->mat); test_pointer_array(fd, (void **)&ob->mat); ob->matbits= newdataadr(fd, ob->matbits); @@ -4190,8 +4204,6 @@ static void lib_link_scene(FileData *fd, Main *main) } SEQ_END - lib_link_scriptlink(fd, &sce->id, &sce->scriptlink); - if(sce->nodetree) { lib_link_ntree(fd, &sce->id, sce->nodetree); composite_patch(sce->nodetree, sce); @@ -4324,6 +4336,9 @@ static void direct_link_scene(FileData *fd, Scene *sce) } else { seq->strip->color_balance = 0; } + if (seq->strip->color_balance) { + // seq->strip->color_balance->gui = 0; // XXX - peter, is this relevant in 2.5? + } } } SEQ_END @@ -4367,8 +4382,6 @@ static void direct_link_scene(FileData *fd, Scene *sce) } } } - - direct_link_scriptlink(fd, &sce->scriptlink); sce->r.avicodecdata = newdataadr(fd, sce->r.avicodecdata); if (sce->r.avicodecdata) { @@ -4523,9 +4536,6 @@ static void lib_link_screen(FileData *fd, Main *main) sa->full= newlibadr(fd, sc->id.lib, sa->full); - /* space handler scriptlinks */ - lib_link_scriptlink(fd, &sc->id, &sa->scriptlink); - for (sl= sa->spacedata.first; sl; sl= sl->next) { if(sl->spacetype==SPACE_VIEW3D) { View3D *v3d= (View3D*) sl; @@ -4548,9 +4558,10 @@ static void lib_link_screen(FileData *fd, Main *main) } else if(sl->spacetype==SPACE_BUTS) { SpaceButs *sbuts= (SpaceButs *)sl; - sbuts->lockpoin= NULL; sbuts->ri= NULL; sbuts->pinid= newlibadr(fd, sc->id.lib, sbuts->pinid); + sbuts->mainbo= sbuts->mainb; + sbuts->mainbuser= sbuts->mainb; if(main->versionfile<132) butspace_version_132(sbuts); } @@ -4704,16 +4715,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) while(sa) { SpaceLink *sl; - if (sa->scriptlink.totscript) { - /* restore screen area script links */ - ScriptLink *slink = &sa->scriptlink; - int script_idx; - for (script_idx = 0; script_idx < slink->totscript; script_idx++) { - slink->scripts[script_idx] = restore_pointer_by_name(newmain, - (ID *)slink->scripts[script_idx], 1); - } - } - for (sl= sa->spacedata.first; sl; sl= sl->next) { if(sl->spacetype==SPACE_VIEW3D) { View3D *v3d= (View3D*) sl; @@ -4769,7 +4770,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) } else if(sl->spacetype==SPACE_BUTS) { SpaceButs *sbuts= (SpaceButs *)sl; - sbuts->lockpoin= NULL; sbuts->pinid = restore_pointer_by_name(newmain, sbuts->pinid, 0); //XXX if (sbuts->ri) sbuts->ri->curtile = 0; } @@ -4889,6 +4889,9 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype) } } + ar->v2d.tab_offset= NULL; + ar->v2d.tab_num= 0; + ar->v2d.tab_cur= 0; ar->handlers.first= ar->handlers.last= NULL; ar->uiblocks.first= ar->uiblocks.last= NULL; ar->headerstr= NULL; @@ -5051,7 +5054,7 @@ static void direct_link_screen(FileData *fd, bScreen *sc) } else if(sl->spacetype==SPACE_LOGIC) { SpaceLogic *slogic= (SpaceLogic *)sl; - + if(slogic->gpd) { slogic->gpd= newdataadr(fd, slogic->gpd); direct_link_gpencil(fd, slogic->gpd); @@ -5090,9 +5093,6 @@ static void direct_link_screen(FileData *fd, bScreen *sc) sa->v2= newdataadr(fd, sa->v2); sa->v3= newdataadr(fd, sa->v3); sa->v4= newdataadr(fd, sa->v4); - - /* space handler scriptlinks */ - direct_link_scriptlink(fd, &sa->scriptlink); } } @@ -5865,7 +5865,7 @@ static void area_add_header_region(ScrArea *sa, ListBase *lb) /* initialise view2d data for header region, to allow panning */ /* is copy from ui_view2d.c */ - ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT); + ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT); ar->v2d.keepofs = V2D_LOCKOFS_Y; ar->v2d.keeptot = V2D_KEEPTOT_STRICT; ar->v2d.align = V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y; @@ -5886,6 +5886,14 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb) ar->regiontype= RGN_TYPE_CHANNELS; ar->alignment= RGN_ALIGN_LEFT; ar->v2d.scroll= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM); + + // for some reason, this doesn't seem to go auto like for NLA... + ar= MEM_callocN(sizeof(ARegion), "area region from do_versions"); + BLI_addtail(lb, ar); + ar->regiontype= RGN_TYPE_UI; + ar->alignment= RGN_ALIGN_RIGHT; + ar->v2d.scroll= V2D_SCROLL_RIGHT; + ar->v2d.flag = RGN_FLAG_HIDDEN; break; case SPACE_ACTION: @@ -6058,7 +6066,7 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb) memcpy(&ar->v2d, &snode->v2d, sizeof(View2D)); ar->v2d.scroll= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM); - ar->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT; + ar->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT; break; } case SPACE_BUTS: @@ -6079,7 +6087,7 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb) ar->regiontype= RGN_TYPE_WINDOW; ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM_O); ar->v2d.align = (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y); - ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT); + ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT); break; } case SPACE_TEXT: @@ -6483,7 +6491,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } if(main->versionfile <= 191) { - bScreen *sc= main->screen.first; Object *ob= main->object.first; Material *ma = main->mat.first; @@ -6499,22 +6506,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /*ob->quat[1]= 1.0f;*/ /* quats arnt used yet */ ob= ob->id.next; } - - while(sc) { - ScrArea *sa= sc->areabase.first; - while(sa) { - SpaceLink *sl= sa->spacedata.first; - while(sl) { - if(sl->spacetype==SPACE_BUTS) { - SpaceButs *sbuts= (SpaceButs*) sl; - sbuts->scaflag= BUTS_SENS_LINK|BUTS_SENS_ACT|BUTS_CONT_ACT|BUTS_ACT_ACT|BUTS_ACT_LINK; - } - sl= sl->next; - } - sa= sa->next; - } - sc= sc->id.next; - } } if(main->versionfile <= 193) { @@ -8427,7 +8418,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) simasel->v2d.minzoom= 0.5f; simasel->v2d.maxzoom= 1.21f; simasel->v2d.scroll= 0; - simasel->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT; + simasel->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT; simasel->v2d.keeptot= 0; simasel->prv_h = 96; simasel->prv_w = 96; @@ -9404,6 +9395,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } part->path_end = 1.0f; + part->clength = 1.0f; } /* set old pointcaches to have disk cache flag */ for(ob = main->object.first; ob; ob= ob->id.next) { @@ -9510,6 +9502,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } for(ma = main->mat.first; ma; ma = ma->id.next) { + if(ma->mode & MA_WIRE) { + ma->material_type= MA_TYPE_WIRE; + ma->mode &= ~MA_WIRE; + } if(ma->mode & MA_HALO) { ma->material_type= MA_TYPE_HALO; ma->mode &= ~MA_HALO; @@ -9584,28 +9580,14 @@ static void do_versions(FileData *fd, Library *lib, Main *main) sce->gm.depth= sce->r.depth; //Physic (previously stored in world) - //temporarily getting the correct world address - wo = newlibadr(fd, sce->id.lib, sce->world); - if (wo){ - sce->gm.gravity = wo->gravity; - sce->gm.physicsEngine= wo->physicsEngine; - sce->gm.mode = wo->mode; - sce->gm.occlusionRes = wo->occlusionRes; - sce->gm.ticrate = wo->ticrate; - sce->gm.maxlogicstep = wo->maxlogicstep; - sce->gm.physubstep = wo->physubstep; - sce->gm.maxphystep = wo->maxphystep; - } - else{ - sce->gm.gravity =9.8f; - sce->gm.physicsEngine= WOPHY_BULLET;// Bullet by default - sce->gm.mode = WO_DBVT_CULLING; // DBVT culling by default - sce->gm.occlusionRes = 128; - sce->gm.ticrate = 60; - sce->gm.maxlogicstep = 5; - sce->gm.physubstep = 1; - sce->gm.maxphystep = 5; - } + sce->gm.gravity =9.8f; + sce->gm.physicsEngine= WOPHY_BULLET;// Bullet by default + sce->gm.mode = WO_DBVT_CULLING; // DBVT culling by default + sce->gm.occlusionRes = 128; + sce->gm.ticrate = 60; + sce->gm.maxlogicstep = 5; + sce->gm.physubstep = 1; + sce->gm.maxphystep = 5; } } @@ -9980,7 +9962,8 @@ static void expand_particlesettings(FileData *fd, Main *mainvar, ParticleSetting expand_doit(fd, mainvar, part->eff_group); expand_doit(fd, mainvar, part->bb_ob); - expand_animdata(fd, mainvar, part->adt); + if(part->adt) + expand_animdata(fd, mainvar, part->adt); } static void expand_group(FileData *fd, Main *mainvar, Group *group) @@ -10104,6 +10087,9 @@ static void expand_mball(FileData *fd, Main *mainvar, MetaBall *mb) for(a=0; a<mb->totcol; a++) { expand_doit(fd, mainvar, mb->mat[a]); } + + if(mb->adt) + expand_animdata(fd, mainvar, mb->adt); } static void expand_curve(FileData *fd, Main *mainvar, Curve *cu) @@ -10349,14 +10335,15 @@ static void expand_modifier(FileData *fd, Main *mainvar, ModifierData *md) expand_doit(fd, mainvar, dmd->map_object); expand_doit(fd, mainvar, dmd->texture); } -} - -static void expand_scriptlink(FileData *fd, Main *mainvar, ScriptLink *slink) -{ - int i; - - for(i=0; i<slink->totscript; i++) { - expand_doit(fd, mainvar, slink->scripts[i]); + else if (md->type==eModifierType_Smoke) { + SmokeModifierData *smd = (SmokeModifierData*) md; + + if(smd->type==MOD_SMOKE_TYPE_DOMAIN && smd->domain) + { + expand_doit(fd, mainvar, smd->domain->coll_group); + expand_doit(fd, mainvar, smd->domain->fluid_group); + expand_doit(fd, mainvar, smd->domain->eff_group); + } } } @@ -10487,7 +10474,6 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) if(ob->pd && ob->pd->tex) expand_doit(fd, mainvar, ob->pd->tex); - expand_scriptlink(fd, mainvar, &ob->scriptlink); } static void expand_scene(FileData *fd, Main *mainvar, Scene *sce) @@ -10708,7 +10694,7 @@ static void append_named_part(FileData *fd, Main *mainvar, Scene *scene, char *n } } - if(idcode==ID_OB) { /* loose object: give a base */ + if(idcode==ID_OB && scene) { /* loose object: give a base */ base= MEM_callocN( sizeof(Base), "app_nam_part"); BLI_addtail(&scene->base, base); @@ -10848,7 +10834,8 @@ void BLO_script_library_append(BlendHandle **bh, char *dir, char *name, if(fd) fd->reports= NULL; /* do we need to do this? */ - DAG_scene_sort(scene); + if(scene) + DAG_scene_sort(scene); *bh= (BlendHandle*)fd; } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index d0d0d1a262e..f94d81f1f6e 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -130,6 +130,7 @@ Any case: direct data is ALWAYS after the lib block #include "DNA_sdna_types.h" #include "DNA_sequence_types.h" #include "DNA_sensor_types.h" +#include "DNA_smoke_types.h" #include "DNA_space_types.h" #include "DNA_screen_types.h" #include "DNA_sound_types.h" @@ -498,12 +499,6 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree) writestruct(wd, DATA, "bNodeLink", 1, link); } -static void write_scriptlink(WriteData *wd, ScriptLink *slink) -{ - writedata(wd, DATA, sizeof(void *)*slink->totscript, slink->scripts); - writedata(wd, DATA, sizeof(short)*slink->totscript, slink->flag); -} - static void current_screen_compat(Main *mainvar, bScreen **screen) { wmWindowManager *wm; @@ -1122,6 +1117,18 @@ static void write_modifiers(WriteData *wd, ListBase *modbase, int write_undo) writestruct(wd, DATA, "ClothCollSettings", 1, clmd->coll_parms); write_pointcaches(wd, clmd->point_cache, PTCACHE_WRITE_CLOTH); } + else if(md->type==eModifierType_Smoke) { + SmokeModifierData *smd = (SmokeModifierData*) md; + + if(smd->type==MOD_SMOKE_TYPE_DOMAIN) + writestruct(wd, DATA, "SmokeDomainSettings", 1, smd->domain); + else if(smd->type==MOD_SMOKE_TYPE_FLOW) + writestruct(wd, DATA, "SmokeFlowSettings", 1, smd->flow); + /* + else if(smd->type==MOD_SMOKE_TYPE_COLL) + writestruct(wd, DATA, "SmokeCollSettings", 1, smd->coll); + */ + } else if(md->type==eModifierType_Fluidsim) { FluidsimModifierData *fluidmd = (FluidsimModifierData*) md; @@ -1183,7 +1190,6 @@ static void write_objects(WriteData *wd, ListBase *idbase, int write_undo) write_sensors(wd, &ob->sensors); write_controllers(wd, &ob->controllers); write_actuators(wd, &ob->actuators); - write_scriptlink(wd, &ob->scriptlink); write_pose(wd, ob->pose); write_defgroups(wd, &ob->defbase); write_constraints(wd, &ob->constraints); @@ -1271,9 +1277,6 @@ static void write_cameras(WriteData *wd, ListBase *idbase) if (cam->id.properties) IDP_WriteProperty(cam->id.properties, wd); if (cam->adt) write_animdata(wd, cam->adt); - - /* direct data */ - write_scriptlink(wd, &cam->scriptlink); } cam= cam->id.next; @@ -1294,6 +1297,7 @@ static void write_mballs(WriteData *wd, ListBase *idbase) /* direct data */ writedata(wd, DATA, sizeof(void *)*mb->totcol, mb->mat); + if (mb->adt) write_animdata(wd, mb->adt); ml= mb->elems.first; while(ml) { @@ -1603,8 +1607,6 @@ static void write_materials(WriteData *wd, ListBase *idbase) if(ma->ramp_col) writestruct(wd, DATA, "ColorBand", 1, ma->ramp_col); if(ma->ramp_spec) writestruct(wd, DATA, "ColorBand", 1, ma->ramp_spec); - write_scriptlink(wd, &ma->scriptlink); - /* nodetree is integral part of material, no libdata */ if(ma->nodetree) { writestruct(wd, DATA, "bNodeTree", 1, ma->nodetree); @@ -1635,8 +1637,6 @@ static void write_worlds(WriteData *wd, ListBase *idbase) if(wrld->mtex[a]) writestruct(wd, DATA, "MTex", 1, wrld->mtex[a]); } - write_scriptlink(wd, &wrld->scriptlink); - write_previews(wd, wrld->preview); } wrld= wrld->id.next; @@ -1665,8 +1665,6 @@ static void write_lamps(WriteData *wd, ListBase *idbase) if(la->curfalloff) write_curvemapping(wd, la->curfalloff); - write_scriptlink(wd, &la->scriptlink); - write_previews(wd, la->preview); } @@ -1778,8 +1776,6 @@ static void write_scenes(WriteData *wd, ListBase *scebase) } } - write_scriptlink(wd, &sce->scriptlink); - if (sce->r.avicodecdata) { writestruct(wd, DATA, "AviCodecData", 1, sce->r.avicodecdata); if (sce->r.avicodecdata->lpFormat) writedata(wd, DATA, sce->r.avicodecdata->cbFormat, sce->r.avicodecdata->lpFormat); @@ -1921,9 +1917,6 @@ static void write_screens(WriteData *wd, ListBase *scrbase) writestruct(wd, DATA, "Panel", 1, pa); } - /* space handler scriptlinks */ - write_scriptlink(wd, &sa->scriptlink); - sl= sa->spacedata.first; while(sl) { for(ar= sl->regionbase.first; ar; ar= ar->next) diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt index b7a868ad537..28cfcb3ff6e 100644 --- a/source/blender/editors/CMakeLists.txt +++ b/source/blender/editors/CMakeLists.txt @@ -35,7 +35,7 @@ SET(INC ../windowmanager ../../../intern/decimation/extern ../blenloader ../python ../../kernel/gen_system ../../../intern/SoundSystem ../readstreamglue ../quicktime ../../../intern/elbeem/extern - ../../../intern/ghost ../../../intern/opennl/extern ../../../extern/glew/include + ../../../intern/ghost ../../../intern/opennl/extern ../../../extern/glew/include ../../../intern/smoke/extern ../nodes ../gpu ../blenfont diff --git a/source/blender/editors/Makefile b/source/blender/editors/Makefile index 6463815a268..dbd0ca779aa 100644 --- a/source/blender/editors/Makefile +++ b/source/blender/editors/Makefile @@ -40,6 +40,7 @@ DIRS = armature \ transform \ screen \ curve \ + metaball \ gpencil \ physics \ preview \ diff --git a/source/blender/editors/SConscript b/source/blender/editors/SConscript index d7bb567e3eb..0a13082faaf 100644 --- a/source/blender/editors/SConscript +++ b/source/blender/editors/SConscript @@ -9,6 +9,7 @@ SConscript(['datafiles/SConscript', 'animation/SConscript', 'armature/SConscript', 'mesh/SConscript', + 'metaball/SConscript', 'object/SConscript', 'curve/SConscript', 'gpencil/SConscript', diff --git a/source/blender/editors/animation/anim_channels.c b/source/blender/editors/animation/anim_channels.c index 6cb00f9285b..235a3039b2c 100644 --- a/source/blender/editors/animation/anim_channels.c +++ b/source/blender/editors/animation/anim_channels.c @@ -48,6 +48,7 @@ #include "DNA_camera_types.h" #include "DNA_curve_types.h" #include "DNA_object_types.h" +#include "DNA_particle_types.h" #include "DNA_screen_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" @@ -55,6 +56,7 @@ #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" +#include "DNA_meta_types.h" #include "DNA_userdef_types.h" #include "DNA_gpencil_types.h" #include "DNA_windowmanager_types.h" @@ -721,7 +723,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *op) /* only groups - don't check other types yet, since they may no-longer exist */ if (ale->type == ANIMTYPE_GROUP) { bActionGroup *agrp= (bActionGroup *)ale->data; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; FCurve *fcu, *fcn; /* skip this group if no AnimData available, as we can't safely remove the F-Curves */ @@ -759,7 +761,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *op) for (ale= anim_data.first; ale; ale= ale->next) { /* only F-Curves, and only if we can identify its parent */ if (ale->type == ANIMTYPE_FCURVE) { - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; FCurve *fcu= (FCurve *)ale->data; /* if no AnimData, we've got nowhere to remove the F-Curve from */ @@ -981,6 +983,20 @@ static void setflag_anim_channels (bAnimContext *ac, short setting, short mode, } } break; + case ANIMTYPE_FILLPARTD: + { + Object *ob= (Object *)ale->data; + + // XXX - settings should really be moved out of ob->nlaflag + if ((onlysel == 0) || (ob->flag & SELECT)) { + if (setting == ACHANNEL_SETTING_EXPAND) { + if (mode == ACHANNEL_SETFLAG_TOGGLE) ob->nlaflag ^= OB_ADS_SHOWPARTS; + else if (mode == ACHANNEL_SETFLAG_ADD) ob->nlaflag |= OB_ADS_SHOWPARTS; + else ob->nlaflag &= ~OB_ADS_SHOWPARTS; + } + } + } + break; case ANIMTYPE_DSMAT: { @@ -1048,6 +1064,28 @@ static void setflag_anim_channels (bAnimContext *ac, short setting, short mode, } } break; + case ANIMTYPE_DSPART: + { + ParticleSettings *part= (ParticleSettings*)ale->data; + + if (ASUBCHANNEL_SEL_OK(ale)) { + if (setting == ACHANNEL_SETTING_EXPAND) { + ACHANNEL_SET_FLAG(part, mode, PART_DS_EXPAND); + } + } + } + break; + case ANIMTYPE_DSMBALL: + { + MetaBall *mb= (MetaBall *)ale->data; + + if (ASUBCHANNEL_SEL_OK(ale)) { + if (setting == ACHANNEL_SETTING_EXPAND) { + ACHANNEL_SET_FLAG(mb, mode, MB_DS_EXPAND); + } + } + } + break; case ANIMTYPE_GROUP: { @@ -1605,6 +1643,13 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh notifierFlags |= ND_ANIMCHAN_EDIT; } break; + case ANIMTYPE_FILLPARTD: + { + Object *ob= (Object *)ale->data; + ob->nlaflag ^= OB_ADS_SHOWPARTS; // XXX + notifierFlags |= ND_ANIMCHAN_EDIT; + } + break; case ANIMTYPE_DSMAT: { @@ -1648,6 +1693,20 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh notifierFlags |= ND_ANIMCHAN_EDIT; } break; + case ANIMTYPE_DSPART: + { + ParticleSettings *part= (ParticleSettings *)ale->data; + part->flag ^= PART_DS_EXPAND; + notifierFlags |= ND_ANIMCHAN_EDIT; + } + break; + case ANIMTYPE_DSMBALL: + { + MetaBall *mb= (MetaBall *)ale->data; + mb->flag2 ^= MB_DS_EXPAND; + notifierFlags |= ND_ANIMCHAN_EDIT; + } + break; case ANIMTYPE_GROUP: { diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c index 6c39e670f5c..6388106fdb5 100644 --- a/source/blender/editors/animation/anim_draw.c +++ b/source/blender/editors/animation/anim_draw.c @@ -242,40 +242,10 @@ AnimData *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale) return NULL; /* handling depends on the type of animation-context we've got */ - if (ale && ale->id) - return BKE_animdata_from_id(ale->id); - - /* no appropriate object found */ - return NULL; -} - -/* Set/clear temporary mapping of coordinates from 'local-action' time to 'global-nla-scaled' time - * - the old mapping is stored in a static var, but that shouldn't be too bad as UI drawing - * (where this is called) is single-threaded anyway - */ -// XXX was called: map_active_strip() -// TODO: should this be depreceated? -void ANIM_nla_mapping_draw(gla2DDrawInfo *di, AnimData *adt, short restore) -{ - static rctf stored; - - if (restore) { - /* restore un-mapped coordinates */ - gla2DSetMap(di, &stored); - } - else { - /* set mapped coordinates */ - rctf map; - - gla2DGetMap(di, &stored); - map= stored; - - map.xmin= BKE_nla_tweakedit_remap(adt, map.xmin, NLATIME_CONVERT_MAP); - map.xmax= BKE_nla_tweakedit_remap(adt, map.xmax, NLATIME_CONVERT_MAP); - - if (map.xmin == map.xmax) map.xmax += 1.0f; - gla2DSetMap(di, &map); - } + if (ale) + return ale->adt; + else + return NULL; } /* ------------------- */ diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c index ecc8012f3ec..4797c7946a4 100644 --- a/source/blender/editors/animation/anim_filter.c +++ b/source/blender/editors/animation/anim_filter.c @@ -17,11 +17,11 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * The Original Code is Copyright (C) 2008 Blender Foundation. + * The Original Code is Copyright (C) 2008 Blender Foundation, Joshua Leung * All rights reserved. * * - * Contributor(s): Joshua Leung + * Contributor(s): Joshua Leung (original author) * * ***** END GPL LICENSE BLOCK ***** */ @@ -33,15 +33,16 @@ * for cases to ignore. * * While this is primarily used for the Action/Dopesheet Editor (and its accessory modes), - * the IPO Editor also uses this for it's channel list and for determining which curves - * are being edited. + * the Graph Editor also uses this for its channel list and for determining which curves + * are being edited. Likewise, the NLA Editor also uses this for its channel list and in + * its operators. * * Note: much of the original system this was based on was built before the creation of the RNA * system. In future, it would be interesting to replace some parts of this code with RNA queries, * however, RNA does not eliminate some of the boiler-plate reduction benefits presented by this * system, so if any such work does occur, it should only be used for the internals used here... * - * -- Joshua Leung, Dec 2008 + * -- Joshua Leung, Dec 2008 (Last revision July 2009) */ #include <string.h> @@ -61,7 +62,9 @@ #include "DNA_key_types.h" #include "DNA_material_types.h" #include "DNA_mesh_types.h" +#include "DNA_meta_types.h" #include "DNA_object_types.h" +#include "DNA_particle_types.h" #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -72,6 +75,7 @@ #include "BLI_blenlib.h" +#include "BKE_animsys.h" #include "BKE_context.h" #include "BKE_global.h" #include "BKE_key.h" @@ -204,6 +208,12 @@ static short graphedit_get_context (bAnimContext *ac, SpaceIpo *sipo) if (sipo->ads == NULL) sipo->ads= MEM_callocN(sizeof(bDopeSheet), "GraphEdit DopeSheet"); + /* set settings for Graph Editor - "Selected = Editable" */ + if (sipo->flag & SIPO_SELCUVERTSONLY) + sipo->ads->filterflag |= ADS_FILTER_SELEDIT; + else + sipo->ads->filterflag &= ~ADS_FILTER_SELEDIT; + /* sync settings with current view status, then return appropriate data */ switch (sipo->mode) { case SIPO_MODE_ANIMATION: /* Animation F-Curve Editor */ @@ -402,11 +412,20 @@ short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac) -/* quick macro to test if a anim-channel (F-Curve, Group, etc.) is selected in an acceptable way */ +/* quick macro to test if an anim-channel (F-Curve, Group, etc.) is selected in an acceptable way */ #define ANIMCHANNEL_SELOK(test_func) \ ( !(filter_mode & (ANIMFILTER_SEL|ANIMFILTER_UNSEL)) || \ ((filter_mode & ANIMFILTER_SEL) && test_func) || \ ((filter_mode & ANIMFILTER_UNSEL) && test_func==0) ) + +/* quick macro to test if an anim-channel (F-Curve) is selected ok for editing purposes + * - _SELEDIT means that only selected curves will have visible+editable keyframes + */ +// FIXME: this doesn't work cleanly yet... +#define ANIMCHANNEL_SELEDITOK(test_func) \ + ( !(filter_mode & ANIMFILTER_SELEDIT) || \ + (filter_mode & ANIMFILTER_CHANNELS) || \ + (test_func) ) /* ----------- 'Private' Stuff --------------- */ @@ -429,6 +448,7 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->ownertype= ownertype; ale->id= owner_id; + ale->adt= BKE_animdata_from_id(owner_id); /* do specifics */ switch (datatype) { @@ -440,6 +460,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->key_data= sce; ale->datatype= ALE_SCE; + + ale->adt= BKE_animdata_from_id(data); } break; case ANIMTYPE_OBJECT: @@ -451,6 +473,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->key_data= ob; ale->datatype= ALE_OB; + + ale->adt= BKE_animdata_from_id(&ob->id); } break; case ANIMTYPE_FILLACTD: @@ -484,6 +508,16 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->datatype= ALE_NONE; } break; + case ANIMTYPE_FILLPARTD: + { + Object *ob= (Object *)data; + + ale->flag= FILTER_PART_OBJC(ob); + + ale->key_data= NULL; + ale->datatype= ALE_NONE; + } + break; case ANIMTYPE_DSMAT: { @@ -494,6 +528,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->key_data= (adt) ? adt->action : NULL; ale->datatype= ALE_ACT; + + ale->adt= BKE_animdata_from_id(data); } break; case ANIMTYPE_DSLAM: @@ -505,6 +541,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->key_data= (adt) ? adt->action : NULL; ale->datatype= ALE_ACT; + + ale->adt= BKE_animdata_from_id(data); } break; case ANIMTYPE_DSCAM: @@ -516,6 +554,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->key_data= (adt) ? adt->action : NULL; ale->datatype= ALE_ACT; + + ale->adt= BKE_animdata_from_id(data); } break; case ANIMTYPE_DSCUR: @@ -527,6 +567,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->key_data= (adt) ? adt->action : NULL; ale->datatype= ALE_ACT; + + ale->adt= BKE_animdata_from_id(data); } break; case ANIMTYPE_DSSKEY: @@ -538,6 +580,8 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->key_data= (adt) ? adt->action : NULL; ale->datatype= ALE_ACT; + + ale->adt= BKE_animdata_from_id(data); } break; case ANIMTYPE_DSWOR: @@ -549,6 +593,21 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s ale->key_data= (adt) ? adt->action : NULL; ale->datatype= ALE_ACT; + + ale->adt= BKE_animdata_from_id(data); + } + break; + case ANIMTYPE_DSPART: + { + ParticleSettings *part= (ParticleSettings*)ale->data; + AnimData *adt= part->adt; + + ale->flag= FILTER_PART_OBJD(part); + + ale->key_data= (adt) ? adt->action : NULL; + ale->datatype= ALE_ACT; + + ale->adt= BKE_animdata_from_id(data); } break; @@ -627,7 +686,7 @@ static int animdata_filter_fcurves (ListBase *anim_data, FCurve *first, bActionG /* only work with this channel and its subchannels if it is editable */ if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_FCU(fcu)) { /* only include this curve if selected in a way consistent with the filtering requirements */ - if ( ANIMCHANNEL_SELOK(SEL_FCU(fcu)) ) { + if ( ANIMCHANNEL_SELOK(SEL_FCU(fcu)) && ANIMCHANNEL_SELEDITOK(SEL_FCU(fcu)) ) { /* only include if this curve is active */ if (!(filter_mode & ANIMFILTER_ACTIVE) || (fcu->flag & FCURVE_ACTIVE)) { ale= make_new_animlistelem(fcu, ANIMTYPE_FCURVE, owner, ownertype, owner_id); @@ -798,71 +857,6 @@ static int animdata_filter_nla (ListBase *anim_data, AnimData *adt, int filter_m /* return the number of items added to the list */ return items; } - -static int animdata_filter_shapekey (ListBase *anim_data, Key *key, int filter_mode, void *owner, short ownertype, ID *owner_id) -{ - bAnimListElem *ale; - KeyBlock *kb; - //FCurve *fcu; - int i, items=0; - - /* are we filtering for display or editing */ - if (filter_mode & ANIMFILTER_CHANNELS) { - /* for display - loop over shapekeys, adding ipo-curve references where needed */ - kb= key->block.first; - - /* loop through possible shapekeys, manually creating entries */ - for (i= 1; i < key->totkey; i++) { - ale= MEM_callocN(sizeof(bAnimListElem), "bAnimListElem"); - kb = kb->next; /* do this even on the first try, as the first is 'Basis' (which doesn't get included) */ - - ale->data= kb; - ale->type= ANIMTYPE_SHAPEKEY; /* 'abused' usage of this type */ - ale->owner= key; - ale->ownertype= ANIMTYPE_SHAPEKEY; - ale->datatype= ALE_NONE; - ale->index = i; - -#if 0 // XXX fixme... old system - if (key->ipo) { - for (icu= key->ipo->curve.first; icu; icu=icu->next) { - if (icu->adrcode == i) { - ale->key_data= icu; - ale->datatype= ALE_ICU; - break; - } - } - } -#endif // XXX fixme... old system - - ale->id= owner_id; - - BLI_addtail(anim_data, ale); - items++; - } - } - else { -#if 0 // XXX fixme... old system - /* loop over ipo curves if present - for editing */ - if (key->ipo) { - if (filter_mode & ANIMFILTER_IPOKEYS) { - ale= make_new_animlistelem(key->ipo, ANIMTYPE_IPO, key, ANIMTYPE_SHAPEKEY); - if (ale) { - if (owned) ale->id= owner; - BLI_addtail(anim_data, ale); - items++; - } - } - else { - items += animdata_filter_ipocurves(anim_data, key->ipo, filter_mode, key, ANIMTYPE_SHAPEKEY, (owned)?(owner):(NULL)); - } - } -#endif // XXX fixme... old system - } - - /* return the number of items added to the list */ - return items; -} #if 0 // FIXME: switch this to use the bDopeSheet... @@ -1008,6 +1002,60 @@ static int animdata_filter_dopesheet_mats (ListBase *anim_data, bDopeSheet *ads, return items; } +static int animdata_filter_dopesheet_particles (ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode) +{ + bAnimListElem *ale=NULL; + Object *ob= base->object; + ParticleSystem *psys = ob->particlesystem.first; + int items= 0, first = 1; + + for(; psys; psys=psys->next) { + short ok = 0; + + if(ELEM(NULL, psys->part, psys->part->adt)) + continue; + + ANIMDATA_FILTER_CASES(psys->part, + { /* AnimData blocks - do nothing... */ }, + ok=1;, + ok=1;, + ok=1;) + if (ok == 0) continue; + + /* include particles-expand widget? */ + if (first && (filter_mode & ANIMFILTER_CHANNELS) && !(filter_mode & ANIMFILTER_CURVESONLY)) { + ale= make_new_animlistelem(ob, ANIMTYPE_FILLPARTD, base, ANIMTYPE_OBJECT, (ID *)ob); + if (ale) { + BLI_addtail(anim_data, ale); + items++; + } + first = 0; + } + + /* add particle settings? */ + if (FILTER_PART_OBJC(ob) || (filter_mode & ANIMFILTER_CURVESONLY)) { + if ((filter_mode & ANIMFILTER_CHANNELS)){ + ale = make_new_animlistelem(psys->part, ANIMTYPE_DSPART, base, ANIMTYPE_OBJECT, (ID *)psys->part); + if (ale) { + BLI_addtail(anim_data, ale); + items++; + } + } + + if (FILTER_PART_OBJD(psys->part) || (filter_mode & ANIMFILTER_CURVESONLY)) { + ANIMDATA_FILTER_CASES(psys->part, + { /* AnimData blocks - do nothing... */ }, + items += animdata_filter_nla(anim_data, psys->part->adt, filter_mode, psys->part, ANIMTYPE_DSPART, (ID *)psys->part);, + items += animdata_filter_fcurves(anim_data, psys->part->adt->drivers.first, NULL, psys->part, ANIMTYPE_DSPART, filter_mode, (ID *)psys->part);, + items += animdata_filter_action(anim_data, psys->part->adt->action, filter_mode, psys->part, ANIMTYPE_DSPART, (ID *)psys->part);) + } + } + } + + /* return the number of items added to the list */ + return items; +} + static int animdata_filter_dopesheet_obdata (ListBase *anim_data, bDopeSheet *ads, Base *base, int filter_mode) { bAnimListElem *ale=NULL; @@ -1043,6 +1091,14 @@ static int animdata_filter_dopesheet_obdata (ListBase *anim_data, bDopeSheet *ad expanded= FILTER_CUR_OBJD(cu); } break; + case OB_MBALL: /* ------- MetaBall ---------- */ + { + MetaBall *mb= (MetaBall *)ob->data; + + type= ANIMTYPE_DSMBALL; + expanded= FILTER_MBALL_OBJD(mb); + } + break; } /* special exception for drivers instead of action */ @@ -1160,7 +1216,7 @@ static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, B /* add channels */ if (FILTER_SKE_OBJD(key) || (filter_mode & ANIMFILTER_CURVESONLY)) { - items += animdata_filter_shapekey(anim_data, key, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob); + items += animdata_filter_fcurves(anim_data, adt->drivers.first, NULL, key, ANIMTYPE_DSSKEY, filter_mode, (ID *)key); } }, { /* action (keyframes) */ @@ -1175,7 +1231,7 @@ static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, B /* add channels */ if (FILTER_SKE_OBJD(key) || (filter_mode & ANIMFILTER_CURVESONLY)) { - items += animdata_filter_shapekey(anim_data, key, filter_mode, ob, ANIMTYPE_OBJECT, (ID *)ob); + items += animdata_filter_action(anim_data, adt->action, filter_mode, key, ANIMTYPE_DSSKEY, (ID *)key); } } ); @@ -1226,9 +1282,26 @@ static int animdata_filter_dopesheet_ob (ListBase *anim_data, bDopeSheet *ads, B } } break; + case OB_MBALL: /* ------- MetaBall ---------- */ + { + MetaBall *mb= (MetaBall *)ob->data; + + if ((ads->filterflag & ADS_FILTER_NOMBA) == 0) { + ANIMDATA_FILTER_CASES(mb, + { /* AnimData blocks - do nothing... */ }, + obdata_ok= 1;, + obdata_ok= 1;, + obdata_ok= 1;) + } + } + break; } if (obdata_ok) items += animdata_filter_dopesheet_obdata(anim_data, ads, base, filter_mode); + + /* particles */ + if (ob->particlesystem.first && !(ads->filterflag & ADS_FILTER_NOPART)) + items += animdata_filter_dopesheet_particles(anim_data, ads, base, filter_mode); /* return the number of items added to the list */ return items; @@ -1406,7 +1479,7 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int if (base->object) { Object *ob= base->object; Key *key= ob_get_key(ob); - short actOk=1, keyOk=1, dataOk=1, matOk=1; + short actOk=1, keyOk=1, dataOk=1, matOk=1, partOk=1; /* firstly, check if object can be included, by the following fanimors: * - if only visible, must check for layer and also viewport visibility @@ -1544,13 +1617,55 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int dataOk= !(ads->filterflag & ADS_FILTER_NOCUR);) } break; + case OB_MBALL: /* ------- MetaBall ---------- */ + { + MetaBall *mb= (MetaBall *)ob->data; + dataOk= 0; + ANIMDATA_FILTER_CASES(mb, + if ((ads->filterflag & ADS_FILTER_NOMBA)==0) { + /* for the special AnimData blocks only case, we only need to add + * the block if it is valid... then other cases just get skipped (hence ok=0) + */ + ANIMDATA_ADD_ANIMDATA(mb); + dataOk=0; + }, + dataOk= !(ads->filterflag & ADS_FILTER_NOMBA);, + dataOk= !(ads->filterflag & ADS_FILTER_NOMBA);, + dataOk= !(ads->filterflag & ADS_FILTER_NOMBA);) + } + break; default: /* --- other --- */ dataOk= 0; break; } + /* particles */ + partOk = 0; + if (!(ads->filterflag & ADS_FILTER_NOPART) && ob->particlesystem.first) { + ParticleSystem *psys = ob->particlesystem.first; + for(; psys; psys=psys->next) { + if (psys->part) { + /* if particlesettings has relevant animation data, break */ + ANIMDATA_FILTER_CASES(psys->part, + { + /* for the special AnimData blocks only case, we only need to add + * the block if it is valid... then other cases just get skipped (hence ok=0) + */ + ANIMDATA_ADD_ANIMDATA(psys->part); + partOk=0; + }, + partOk= 1;, + partOk= 1;, + partOk= 1;) + } + + if (partOk) + break; + } + } + /* check if all bad (i.e. nothing to show) */ - if (!actOk && !keyOk && !dataOk && !matOk) + if (!actOk && !keyOk && !dataOk && !matOk && !partOk) continue; } else { @@ -1595,13 +1710,31 @@ static int animdata_filter_dopesheet (ListBase *anim_data, bDopeSheet *ads, int dataOk= ANIMDATA_HAS_KEYS(cu); } break; + case OB_MBALL: /* -------- Metas ---------- */ + { + MetaBall *mb= (MetaBall *)ob->data; + dataOk= ANIMDATA_HAS_KEYS(mb); + } + break; default: /* --- other --- */ dataOk= 0; break; } + /* particles */ + partOk = 0; + if (ob->particlesystem.first) { + ParticleSystem *psys = ob->particlesystem.first; + for(; psys; psys=psys->next) { + if(psys->part && ANIMDATA_HAS_KEYS(psys->part)) { + partOk = 1; + break; + } + } + } + /* check if all bad (i.e. nothing to show) */ - if (!actOk && !keyOk && !dataOk && !matOk) + if (!actOk && !keyOk && !dataOk && !matOk && !partOk) continue; } @@ -1639,7 +1772,7 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode break; case ANIMCONT_SHAPEKEY: - items= animdata_filter_shapekey(anim_data, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact); + //items= animdata_filter_shapekey(anim_data, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact); break; case ANIMCONT_GPENCIL: diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index 7de3acdacef..d33eece52c9 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -85,6 +85,7 @@ static ListBase *context_get_markers(const bContext *C) } /* Get the marker that is closest to this point */ +/* XXX for select, the min_dist should be small */ TimeMarker *ED_markers_find_nearest_marker (ListBase *markers, float x) { TimeMarker *marker, *nearest=NULL; @@ -828,6 +829,7 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op) /* XXX marker context */ for(marker= markers->first; marker; marker= marker->next) { if ((marker->frame > xminf) && (marker->frame <= xmaxf)) { + /* XXX weak... */ switch (event_type) { case LEFTMOUSE: if ((marker->flag & SELECT) == 0) diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c index 73a1c934d97..9c039693b72 100644 --- a/source/blender/editors/animation/anim_ops.c +++ b/source/blender/editors/animation/anim_ops.c @@ -67,7 +67,7 @@ static int change_frame_init(bContext *C, wmOperator *op) return 0; if (curarea->spacetype == SPACE_TIME) { - SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C); + SpaceTime *stime= CTX_wm_space_time(C); /* timeline displays frame number only when dragging indicator */ // XXX make this more in line with other anim editors? @@ -103,7 +103,7 @@ static void change_frame_exit(bContext *C, wmOperator *op) return; if (curarea->spacetype == SPACE_TIME) { - SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C); + SpaceTime *stime= CTX_wm_space_time(C); /* timeline displays frame number only when dragging indicator */ // XXX make this more in line with other anim editors? @@ -322,31 +322,31 @@ static int toggle_time_exec(bContext *C, wmOperator *op) switch (curarea->spacetype) { case SPACE_TIME: /* TimeLine */ { - SpaceTime *stime= (SpaceTime *)CTX_wm_space_data(C); + SpaceTime *stime= CTX_wm_space_time(C); stime->flag ^= TIME_DRAWFRAMES; } break; case SPACE_ACTION: /* Action Editor */ { - SpaceAction *saction= (SpaceAction *)CTX_wm_space_data(C); + SpaceAction *saction= CTX_wm_space_action(C); saction->flag ^= SACTION_DRAWTIME; } break; case SPACE_IPO: /* Graph Editor */ { - SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C); + SpaceIpo *sipo= CTX_wm_space_graph(C); sipo->flag ^= SIPO_DRAWTIME; } break; case SPACE_NLA: /* NLA Editor */ { - SpaceNla *snla= (SpaceNla *)CTX_wm_space_data(C); + SpaceNla *snla= CTX_wm_space_nla(C); snla->flag ^= SNLA_DRAWTIME; } break; case SPACE_SEQ: /* Sequencer */ { - SpaceSeq *sseq= (SpaceSeq *)CTX_wm_space_data(C); + SpaceSeq *sseq= CTX_wm_space_seq(C); sseq->flag ^= SEQ_DRAWFRAMES; } break; @@ -386,10 +386,10 @@ void ED_operatortypes_anim(void) WM_operatortype_append(ANIM_OT_insert_keyframe); WM_operatortype_append(ANIM_OT_delete_keyframe); WM_operatortype_append(ANIM_OT_insert_keyframe_menu); - //WM_operatortype_append(ANIM_OT_delete_keyframe_menu); + WM_operatortype_append(ANIM_OT_delete_keyframe_v3d); WM_operatortype_append(ANIM_OT_insert_keyframe_button); WM_operatortype_append(ANIM_OT_delete_keyframe_button); - WM_operatortype_append(ANIM_OT_delete_keyframe_old); // xxx remove? + WM_operatortype_append(ANIM_OT_add_driver_button); WM_operatortype_append(ANIM_OT_remove_driver_button); diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 251c59c47c9..2da082a9b7c 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -965,18 +965,15 @@ static int modify_key_op_poll(bContext *C) { ScrArea *sa= CTX_wm_area(C); Scene *scene= CTX_data_scene(C); + SpaceOops *so= CTX_wm_space_outliner(C); /* if no area or active scene */ if (ELEM(NULL, sa, scene)) return 0; /* if Outliner, only allow in DataBlocks view */ - if (sa->spacetype == SPACE_OUTLINER) { - SpaceOops *so= (SpaceOops *)CTX_wm_space_data(C); - - if ((so->outlinevis != SO_DATABLOCKS)) - return 0; - } + if (so && (so->outlinevis != SO_DATABLOCKS)) + return 0; /* TODO: checks for other space types can be added here */ @@ -1081,9 +1078,15 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event) pup= uiPupMenuBegin(C, "Insert Keyframe", 0); layout= uiPupMenuLayout(pup); - /* active Keying Set */ - uiItemIntO(layout, "Active Keying Set", 0, "ANIM_OT_insert_keyframe_menu", "type", i++); - uiItemS(layout); + /* active Keying Set + * - only include entry if it exists + */ + if (scene->active_keyingset) { + uiItemIntO(layout, "Active Keying Set", 0, "ANIM_OT_insert_keyframe_menu", "type", i++); + uiItemS(layout); + } + else + i++; /* user-defined Keying Sets * - these are listed in the order in which they were defined for the active scene @@ -1112,7 +1115,7 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event) void ANIM_OT_insert_keyframe_menu (wmOperatorType *ot) { /* identifiers */ - ot->name= "Insert Keyframe"; + ot->name= "Insert Keyframe Menu"; ot->idname= "ANIM_OT_insert_keyframe_menu"; /* callbacks */ @@ -1217,7 +1220,7 @@ void ANIM_OT_delete_keyframe (wmOperatorType *ot) * -- Joshua Leung, Jan 2009 */ -static int delete_key_old_exec (bContext *C, wmOperator *op) +static int delete_key_v3d_exec (bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap @@ -1255,15 +1258,15 @@ static int delete_key_old_exec (bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void ANIM_OT_delete_keyframe_old (wmOperatorType *ot) +void ANIM_OT_delete_keyframe_v3d (wmOperatorType *ot) { /* identifiers */ ot->name= "Delete Keyframe"; - ot->idname= "ANIM_OT_delete_keyframe_old"; + ot->idname= "ANIM_OT_delete_keyframe_v3d"; /* callbacks */ ot->invoke= WM_operator_confirm; - ot->exec= delete_key_old_exec; + ot->exec= delete_key_v3d_exec; ot->poll= ED_operator_areaactive; @@ -1341,7 +1344,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op) void ANIM_OT_insert_keyframe_button (wmOperatorType *ot) { /* identifiers */ - ot->name= "Insert Keyframe"; + ot->name= "Insert Keyframe (Buttons)"; ot->idname= "ANIM_OT_insert_keyframe_button"; /* callbacks */ @@ -1349,7 +1352,7 @@ void ANIM_OT_insert_keyframe_button (wmOperatorType *ot) ot->poll= modify_key_op_poll; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag= OPTYPE_UNDO; /* properties */ RNA_def_boolean(ot->srna, "all", 1, "All", "Insert a keyframe for all element of the array."); @@ -1411,7 +1414,7 @@ static int delete_key_button_exec (bContext *C, wmOperator *op) void ANIM_OT_delete_keyframe_button (wmOperatorType *ot) { /* identifiers */ - ot->name= "Delete Keyframe"; + ot->name= "Delete Keyframe (Buttons)"; ot->idname= "ANIM_OT_delete_keyframe_button"; /* callbacks */ @@ -1419,7 +1422,7 @@ void ANIM_OT_delete_keyframe_button (wmOperatorType *ot) ot->poll= modify_key_op_poll; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag= OPTYPE_UNDO; /* properties */ RNA_def_boolean(ot->srna, "all", 1, "All", "Delete keyfames from all elements of the array."); @@ -1435,10 +1438,17 @@ int autokeyframe_cfra_can_key(Scene *scene, ID *id) /* only filter if auto-key mode requires this */ if (IS_AUTOKEY_ON(scene) == 0) return 0; - else if (IS_AUTOKEY_MODE(scene, NORMAL)) + + if (IS_AUTOKEY_MODE(scene, NORMAL)) { + /* can insert anytime we like... */ return 1; - else + } + else /* REPLACE */ { + /* for whole block - only key if there's a keyframe on that frame already + * this is a valid assumption when we're blocking + tweaking + */ return id_frame_has_keyframe(id, cfra, ANIMFILTER_KEYS_LOCAL); + } } /* ******************************************* */ diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c index 0f8de7f607d..ffc93340f8c 100644 --- a/source/blender/editors/animation/keyingsets.c +++ b/source/blender/editors/animation/keyingsets.c @@ -233,7 +233,7 @@ char *ANIM_build_keyingsets_menu (ListBase *list, short for_edit) BLI_dynstr_append(pupds, " %x0|"); } else - BLI_dynstr_append(pupds, "<No Keying Set Active>%x0|"); + BLI_dynstr_append(pupds, "No Keying Set%x0|"); /* loop through keyingsets, adding them */ for (ks=list->first, i=1; ks; ks=ks->next, i++) { @@ -735,7 +735,7 @@ static bBuiltinKeyingSet def_builtin_keyingsets_v3d[] = /* Keying Set - "Rotation" ---------- */ BI_KS_DEFINE_BEGIN("Rotation", 0) BI_KS_PATHS_BEGIN(1) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) + BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) BI_KS_PATHS_END BI_KS_DEFINE_END, @@ -751,7 +751,7 @@ static bBuiltinKeyingSet def_builtin_keyingsets_v3d[] = BI_KS_DEFINE_BEGIN("LocRot", 0) BI_KS_PATHS_BEGIN(2) BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) + BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) BI_KS_PATHS_END BI_KS_DEFINE_END, @@ -759,7 +759,7 @@ static bBuiltinKeyingSet def_builtin_keyingsets_v3d[] = BI_KS_DEFINE_BEGIN("LocRotScale", 0) BI_KS_PATHS_BEGIN(3) BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), + BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "scale", 0, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) BI_KS_PATHS_END BI_KS_DEFINE_END, @@ -775,7 +775,7 @@ static bBuiltinKeyingSet def_builtin_keyingsets_v3d[] = /* Keying Set - "Rotation" ---------- */ BI_KS_DEFINE_BEGIN("VisualRot", 0) BI_KS_PATHS_BEGIN(1) - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) + BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) BI_KS_PATHS_END BI_KS_DEFINE_END, @@ -783,7 +783,7 @@ static bBuiltinKeyingSet def_builtin_keyingsets_v3d[] = BI_KS_DEFINE_BEGIN("VisualLocRot", 0) BI_KS_PATHS_BEGIN(2) BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "location", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM), - BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN, "rotation", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) + BI_KSP_DEFINE(ID_OB, KSP_TEMPLATE_OBJECT|KSP_TEMPLATE_PCHAN|KSP_TEMPLATE_PCHAN_ROT, "rotation", INSERTKEY_MATRIX, KSP_FLAG_WHOLE_ARRAY, KSP_GROUP_TEMPLATE_ITEM) BI_KS_PATHS_END BI_KS_DEFINE_END }; @@ -1131,7 +1131,21 @@ int modify_keyframes (bContext *C, ListBase *dsources, bAction *act, KeyingSet * /* add property stored in KeyingSet Path */ if (BLI_dynstr_get_len(pathds)) BLI_dynstr_append(pathds, "."); - BLI_dynstr_append(pathds, ksp->rna_path); + + /* apply some further templates? */ + if ((ksp->templates & KSP_TEMPLATE_PCHAN_ROT) && (cks->pchan)) { + /* if this path is exactly "rotation", and the rotation mode is set to eulers, + * use "euler_rotation" instead so that rotations will be keyed correctly + */ + if (strcmp(ksp->rna_path, "rotation")==0 && (cks->pchan->rotmode)) + BLI_dynstr_append(pathds, "euler_rotation"); + else + BLI_dynstr_append(pathds, ksp->rna_path); + } + else { + /* just directly use the path */ + BLI_dynstr_append(pathds, ksp->rna_path); + } /* convert to C-string */ path= BLI_dynstr_get_cstring(pathds); diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index 7b3f9a020e3..0c8c0e8e644 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -34,7 +34,7 @@ struct wmOperatorType; /* editarmature.c operators */ void ARMATURE_OT_bone_primitive_add(struct wmOperatorType *ot); -void ARMATURE_OT_bones_align(struct wmOperatorType *ot); +void ARMATURE_OT_align(struct wmOperatorType *ot); void ARMATURE_OT_calculate_roll(struct wmOperatorType *ot); void ARMATURE_OT_switch_direction(struct wmOperatorType *ot); @@ -51,15 +51,28 @@ void ARMATURE_OT_select_hierarchy(struct wmOperatorType *ot); void ARMATURE_OT_select_linked(struct wmOperatorType *ot); void ARMATURE_OT_delete(struct wmOperatorType *ot); -void ARMATURE_OT_duplicate_selected(struct wmOperatorType *ot); +void ARMATURE_OT_duplicate(struct wmOperatorType *ot); void ARMATURE_OT_extrude(struct wmOperatorType *ot); void ARMATURE_OT_click_extrude(struct wmOperatorType *ot); +void ARMATURE_OT_fill(struct wmOperatorType *ot); +void ARMATURE_OT_merge(struct wmOperatorType *ot); +void ARMATURE_OT_separate(struct wmOperatorType *ot); + +void ARMATURE_OT_autoside_names(struct wmOperatorType *ot); +void ARMATURE_OT_flip_names(struct wmOperatorType *ot); + +void ARMATURE_OT_flags_set(struct wmOperatorType *ot); + +void ARMATURE_OT_armature_layers(struct wmOperatorType *ot); +void ARMATURE_OT_bone_layers(struct wmOperatorType *ot); /* ******************************************************* */ /* Pose-Mode Operators */ void POSE_OT_hide(struct wmOperatorType *ot); void POSE_OT_reveal(struct wmOperatorType *ot); +void POSE_OT_apply(struct wmOperatorType *ot); + void POSE_OT_rot_clear(struct wmOperatorType *ot); void POSE_OT_loc_clear(struct wmOperatorType *ot); void POSE_OT_scale_clear(struct wmOperatorType *ot); @@ -81,6 +94,17 @@ void POSE_OT_group_remove(struct wmOperatorType *ot); void POSE_OT_group_assign(struct wmOperatorType *ot); void POSE_OT_group_unassign(struct wmOperatorType *ot); +void POSE_OT_paths_calculate(struct wmOperatorType *ot); +void POSE_OT_paths_clear(struct wmOperatorType *ot); + +void POSE_OT_autoside_names(struct wmOperatorType *ot); +void POSE_OT_flip_names(struct wmOperatorType *ot); + +void POSE_OT_flags_set(struct wmOperatorType *ot); + +void POSE_OT_armature_layers(struct wmOperatorType *ot); +void POSE_OT_bone_layers(struct wmOperatorType *ot); + /* ******************************************************* */ /* Etch-A-Ton */ diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index bf4ec09f3fb..389a0a5174a 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -55,6 +55,7 @@ #include "ED_armature.h" #include "ED_screen.h" #include "ED_object.h" +#include "ED_transform.h" #include "armature_intern.h" @@ -110,7 +111,7 @@ void ED_operatortypes_armature(void) /* EDIT ARMATURE */ WM_operatortype_append(ARMATURE_OT_bone_primitive_add); - WM_operatortype_append(ARMATURE_OT_bones_align); + WM_operatortype_append(ARMATURE_OT_align); WM_operatortype_append(ARMATURE_OT_calculate_roll); WM_operatortype_append(ARMATURE_OT_switch_direction); WM_operatortype_append(ARMATURE_OT_subdivs); @@ -126,9 +127,20 @@ void ED_operatortypes_armature(void) WM_operatortype_append(ARMATURE_OT_select_linked); WM_operatortype_append(ARMATURE_OT_delete); - WM_operatortype_append(ARMATURE_OT_duplicate_selected); + WM_operatortype_append(ARMATURE_OT_duplicate); WM_operatortype_append(ARMATURE_OT_extrude); WM_operatortype_append(ARMATURE_OT_click_extrude); + WM_operatortype_append(ARMATURE_OT_fill); + WM_operatortype_append(ARMATURE_OT_merge); + WM_operatortype_append(ARMATURE_OT_separate); + + WM_operatortype_append(ARMATURE_OT_autoside_names); + WM_operatortype_append(ARMATURE_OT_flip_names); + + WM_operatortype_append(ARMATURE_OT_flags_set); + + WM_operatortype_append(ARMATURE_OT_armature_layers); + WM_operatortype_append(ARMATURE_OT_bone_layers); /* SKETCH */ WM_operatortype_append(SKETCH_OT_gesture); @@ -143,6 +155,8 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_hide); WM_operatortype_append(POSE_OT_reveal); + WM_operatortype_append(POSE_OT_apply); + WM_operatortype_append(POSE_OT_rot_clear); WM_operatortype_append(POSE_OT_loc_clear); WM_operatortype_append(POSE_OT_scale_clear); @@ -164,6 +178,17 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_group_assign); WM_operatortype_append(POSE_OT_group_unassign); + WM_operatortype_append(POSE_OT_paths_calculate); + WM_operatortype_append(POSE_OT_paths_clear); + + WM_operatortype_append(POSE_OT_autoside_names); + WM_operatortype_append(POSE_OT_flip_names); + + WM_operatortype_append(POSE_OT_flags_set); + + WM_operatortype_append(POSE_OT_armature_layers); + WM_operatortype_append(POSE_OT_bone_layers); + /* POSELIB */ WM_operatortype_append(POSELIB_OT_browse_interactive); @@ -185,7 +210,7 @@ void ED_keymap_armature(wmWindowManager *wm) /* only set in editmode armature, by space_view3d listener */ // WM_keymap_add_item(keymap, "ARMATURE_OT_hide", HKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "ARMATURE_OT_bones_align", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_align", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_calculate_roll", NKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_switch_direction", FKEY, KM_PRESS, KM_ALT, 0); @@ -215,12 +240,37 @@ void ED_keymap_armature(wmWindowManager *wm) RNA_boolean_set(kmi->ptr, "extend", 1); WM_keymap_add_item(keymap, "ARMATURE_OT_select_linked", LKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_delete", XKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "ARMATURE_OT_duplicate_selected", DKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_extrude", EKEY, KM_PRESS, 0, 0); kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_extrude", EKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "forked", 1); WM_keymap_add_item(keymap, "ARMATURE_OT_click_extrude", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_fill", FKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_merge", MKEY, KM_PRESS, KM_ALT, 0); + + WM_keymap_add_item(keymap, "ARMATURE_OT_separate", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); + + /* set flags */ + kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_flags_set", WKEY, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "mode", 2); // toggle + kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_flags_set", WKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "mode", 1); // enable + kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_flags_set", WKEY, KM_PRESS, KM_ALT, 0); + RNA_enum_set(kmi->ptr, "mode", 0); // clear + + /* armature/bone layers */ + WM_keymap_add_item(keymap, "ARMATURE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_bone_layers", MKEY, KM_PRESS, 0, 0); + + /* special transforms: */ + /* 1) envelope/b-bone size */ + kmi= WM_keymap_add_item(keymap, "TFM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0); + RNA_enum_set(kmi->ptr, "mode", TFM_BONESIZE); + /* 2) set roll */ + kmi= WM_keymap_add_item(keymap, "TFM_OT_transform", RKEY, KM_PRESS, KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "mode", TFM_BONE_ROLL); /* Armature -> Etch-A-Ton ------------------------ */ WM_keymap_add_item(keymap, "SKETCH_OT_delete", XKEY, KM_PRESS, 0, 0); @@ -236,7 +286,10 @@ void ED_keymap_armature(wmWindowManager *wm) kmi= WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "unselected", 1); WM_keymap_add_item(keymap, "POSE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); - /*clear pose*/ + + WM_keymap_add_item(keymap, "POSE_OT_apply", AKEY, KM_PRESS, KM_CTRL, 0); + + // TODO: clear pose WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_loc_clear", GKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "POSE_OT_scale_clear", SKEY, KM_PRESS, KM_ALT, 0); @@ -273,9 +326,26 @@ void ED_keymap_armature(wmWindowManager *wm) WM_keymap_add_item(keymap, "POSE_OT_groups_menu", GKEY, KM_PRESS, KM_CTRL, 0); + /* set flags */ + kmi= WM_keymap_add_item(keymap, "POSE_OT_flags_set", WKEY, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "mode", 2); // toggle + kmi= WM_keymap_add_item(keymap, "POSE_OT_flags_set", WKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "mode", 1); // enable + kmi= WM_keymap_add_item(keymap, "POSE_OT_flags_set", WKEY, KM_PRESS, KM_ALT, 0); + RNA_enum_set(kmi->ptr, "mode", 0); // clear + + /* armature/bone layers */ + WM_keymap_add_item(keymap, "POSE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "POSE_OT_bone_layers", MKEY, KM_PRESS, 0, 0); + + /* special transforms: */ + /* 1) envelope/b-bone size */ + kmi= WM_keymap_add_item(keymap, "TFM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0); + RNA_enum_set(kmi->ptr, "mode", TFM_BONESIZE); + // XXX this should probably be in screen instead... here for testing purposes in the meantime... - Aligorith WM_keymap_verify_item(keymap, "ANIM_OT_insert_keyframe_menu", IKEY, KM_PRESS, 0, 0); - WM_keymap_verify_item(keymap, "ANIM_OT_delete_keyframe_old", IKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_verify_item(keymap, "ANIM_OT_delete_keyframe_v3d", IKEY, KM_PRESS, KM_ALT, 0); /* Pose -> PoseLib ------------- */ /* only set in posemode, by space_view3d listener */ diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 68d8ffbc11d..c1b24375b3d 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -99,12 +99,7 @@ /* ************* XXX *************** */ static int okee() {return 0;} -static int pupmenu() {return 0;} -static void waitcursor() {}; -static void error() {}; -static void error_libdata() {} -static void BIF_undo_push() {} -static void adduplicate() {} +static void BIF_undo_push(const char *msg) {} /* ************* XXX *************** */ /* **************** tools on Editmode Armature **************** */ @@ -374,6 +369,7 @@ void apply_rot_armature (Scene *scene, Object *ob, float mat[3][3]) ED_armature_edit_free(ob); } +/* exported for use in editors/object/ */ /* 0 == do center, 1 == center new, 2 == center cursor */ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode) { @@ -430,25 +426,7 @@ void docenter_armature (Scene *scene, View3D *v3d, Object *ob, int centermode) ED_armature_edit_free(ob); } -/* helper for apply_armature_pose2bones - fixes parenting of objects that are bone-parented to armature */ -static void applyarmature_fix_boneparents (Scene *scene, Object *armob) -{ - Object workob, *ob; - - /* go through all objects in database */ - for (ob= G.main->object.first; ob; ob= ob->id.next) { - /* if parent is bone in this armature, apply corrections */ - if ((ob->parent == armob) && (ob->partype == PARBONE)) { - /* apply current transform from parent (not yet destroyed), - * then calculate new parent inverse matrix - */ - ED_object_apply_obmat(ob); - - what_does_parent(scene, ob, &workob); - Mat4Invert(ob->parentinv, workob.obmat); - } - } -} +/* ---------------------- */ static EditBone *editbone_name_exists (ListBase *edbo, char *name) { @@ -490,28 +468,52 @@ void unique_editbone_name (ListBase *edbo, char *name, EditBone *bone) } } +/* helper for apply_armature_pose2bones - fixes parenting of objects that are bone-parented to armature */ +static void applyarmature_fix_boneparents (Scene *scene, Object *armob) +{ + Object workob, *ob; + + /* go through all objects in database */ + for (ob= G.main->object.first; ob; ob= ob->id.next) { + /* if parent is bone in this armature, apply corrections */ + if ((ob->parent == armob) && (ob->partype == PARBONE)) { + /* apply current transform from parent (not yet destroyed), + * then calculate new parent inverse matrix + */ + ED_object_apply_obmat(ob); + + what_does_parent(scene, ob, &workob); + Mat4Invert(ob->parentinv, workob.obmat); + } + } +} + /* set the current pose as the restpose */ -void apply_armature_pose2bones(Scene *scene, Object *obedit) +static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op) { - bArmature *arm= obedit->data; + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); // must be active object, not edit-object + bArmature *arm= get_armature(ob); bPose *pose; bPoseChannel *pchan; EditBone *curbone; /* don't check if editmode (should be done by caller) */ - if (object_data_is_libdata(obedit)) { - error_libdata(); - return; + if (ob->type!=OB_ARMATURE) + return OPERATOR_CANCELLED; + if (object_data_is_libdata(ob)) { + BKE_report(op->reports, RPT_ERROR, "Cannot apply pose to lib-linked armature."); //error_libdata(); + return OPERATOR_CANCELLED; } /* helpful warnings... */ // TODO: add warnings to be careful about actions, applying deforms first, etc. /* Get editbones of active armature to alter */ - ED_armature_to_edit(obedit); + ED_armature_to_edit(ob); /* get pose of active object and move it out of posemode */ - pose= obedit->pose; + pose= ob->pose; for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) { curbone= editbone_name_exists(arm->edbo, pchan->name); @@ -530,7 +532,7 @@ void apply_armature_pose2bones(Scene *scene, Object *obedit) /* obtain new auto y-rotation */ VecSubf(delta, curbone->tail, curbone->head); - vec_roll_to_mat3(delta, 0.0, premat); + vec_roll_to_mat3(delta, 0.0f, premat); Mat3Inv(imat, premat); /* get pchan 'visual' matrix */ @@ -545,26 +547,46 @@ void apply_armature_pose2bones(Scene *scene, Object *obedit) } /* clear transform values for pchan */ - pchan->loc[0]= pchan->loc[1]= pchan->loc[2]= 0; - pchan->quat[1]= pchan->quat[2]= pchan->quat[3]= 0; - pchan->quat[0]= pchan->size[0]= pchan->size[1]= pchan->size[2]= 1; + pchan->loc[0]= pchan->loc[1]= pchan->loc[2]= 0.0f; + pchan->eul[0]= pchan->eul[1]= pchan->eul[2]= 0.0f; + pchan->quat[1]= pchan->quat[2]= pchan->quat[3]= 0.0f; + pchan->quat[0]= pchan->size[0]= pchan->size[1]= pchan->size[2]= 1.0f; /* set anim lock */ curbone->flag |= BONE_UNKEYED; } /* convert editbones back to bones */ - ED_armature_from_edit(scene, obedit); + ED_armature_from_edit(scene, ob); /* flush positions of posebones */ - where_is_pose(scene, obedit); + where_is_pose(scene, ob); /* fix parenting of objects which are bone-parented */ - applyarmature_fix_boneparents(scene, obedit); + applyarmature_fix_boneparents(scene, ob); + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob); - BIF_undo_push("Apply new restpose"); + return OPERATOR_FINISHED; +} + +void POSE_OT_apply (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Apply Pose as Rest Pose"; + ot->idname= "POSE_OT_apply"; + ot->description= "Apply the current pose as the new rest pose."; + + /* callbacks */ + ot->exec= apply_armature_pose2bones_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } +/* ---------------------- */ /* Helper function for armature joining - link fixing */ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChannel *pchan, EditBone *curbone) @@ -669,6 +691,7 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann } } +/* join armature exec is exported for use in object->join objects operator... */ int join_armature_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); @@ -776,6 +799,8 @@ int join_armature_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } +/* ---------------------- */ + /* Helper function for armature separating - link fixing */ static void separated_armature_fix_links(Object *origArm, Object *newArm) { @@ -974,19 +999,22 @@ static void separate_armature_bones (Scene *scene, Object *ob, short sel) } /* separate selected bones into their armature */ -void separate_armature (Scene *scene, View3D *v3d) +static int separate_armature_exec (bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX get from context + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); Object *oldob, *newob; - Base *base, *oldbase, *newbase; + Base *oldbase, *newbase; bArmature *arm; - if ( okee("Separate")==0 ) return; - - waitcursor(1); - + /* sanity checks */ + if (obedit == NULL) + return OPERATOR_CANCELLED; arm= obedit->data; + /* set wait cursor in case this takes a while */ + WM_cursor_wait(1); + /* we are going to do this as follows (unlike every other instance of separate): * 1. exit editmode +posemode for active armature/base. Take note of what this is. * 2. duplicate base - BASACT is the new one now @@ -996,13 +1024,12 @@ void separate_armature (Scene *scene, View3D *v3d) */ /* 1) only edit-base selected */ - base= FIRSTBASE; - for (base= FIRSTBASE; base; base= base->next) { - if (base->lay & v3d->lay) { - if (base->object==obedit) base->flag |= 1; - else base->flag &= ~1; - } + // TODO: use context iterators for this? + CTX_DATA_BEGIN(C, Base *, base, visible_bases) { + if (base->object==obedit) base->flag |= 1; + else base->flag &= ~1; } + CTX_DATA_END; /* 1) store starting settings and exit editmode */ oldob= obedit; @@ -1014,9 +1041,7 @@ void separate_armature (Scene *scene, View3D *v3d) ED_armature_edit_free(obedit); /* 2) duplicate base */ - adduplicate(1, USER_DUP_ARM); /* no transform and zero so do get a linked dupli */ - - newbase= BASACT; /* basact is set in adduplicate() */ + newbase= ED_object_add_duplicate(scene, oldbase, USER_DUP_ARM); /* only duplicate linked armature */ newob= newbase->object; newbase->flag &= ~SELECT; @@ -1035,15 +1060,32 @@ void separate_armature (Scene *scene, View3D *v3d) /* 5) restore original conditions */ obedit= oldob; - BASACT= oldbase; - BASACT->flag |= SELECT; ED_armature_to_edit(obedit); + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, obedit); + /* recalc/redraw + cleanup */ - waitcursor(0); + WM_cursor_wait(0); - BIF_undo_push("Separate Armature"); + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_separate (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Separate Armature"; + ot->idname= "ARMATURE_OT_separate"; + ot->description= "Isolate selected bones into a separate armature."; + + /* callbacks */ + ot->invoke= WM_operator_confirm; + ot->exec= separate_armature_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } /* **************** END tools on Editmode Armature **************** */ @@ -1204,72 +1246,105 @@ static EditBone *editbone_get_child(bArmature *arm, EditBone *pabone, short use_ return chbone; } - -/* used by posemode and editmode */ -void setflag_armature (Scene *scene, short mode) +/* callback for posemode setflag */ +static int pose_setflag_exec (bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX get from context - Object *ob; - bArmature *arm; - int flag; - - /* get data */ - if (obedit) - ob= obedit; - else if (OBACT) - ob= OBACT; - else - return; - arm= (bArmature *)ob->data; + int flag= RNA_enum_get(op->ptr, "type"); + int mode= RNA_enum_get(op->ptr, "mode"); - /* get flag to set (sync these with the ones used in eBone_Flag */ - if (mode == 2) - flag= pupmenu("Disable Setting%t|Draw Wire%x1|Deform%x2|Mult VG%x3|Hinge%x4|No Scale%x5|Locked%x6"); - else if (mode == 1) - flag= pupmenu("Enable Setting%t|Draw Wire%x1|Deform%x2|Mult VG%x3|Hinge%x4|No Scale%x5|Locked%x6"); - else - flag= pupmenu("Toggle Setting%t|Draw Wire%x1|Deform%x2|Mult VG%x3|Hinge%x4|No Scale%x5|Locked%x6"); - switch (flag) { - case 1: flag = BONE_DRAWWIRE; break; - case 2: flag = BONE_NO_DEFORM; break; - case 3: flag = BONE_MULT_VG_ENV; break; - case 4: flag = BONE_HINGE; break; - case 5: flag = BONE_NO_SCALE; break; - case 6: flag = BONE_EDITMODE_LOCKED; break; - default: return; - } - - /* determine which mode armature is in */ - if ((!obedit) && (ob->flag & OB_POSEMODE)) { - /* deal with pose channels */ - bPoseChannel *pchan; - - /* set setting */ - for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if ((pchan->bone) && (arm->layer & pchan->bone->layer)) { - if (pchan->bone->flag & BONE_SELECTED) { - bone_setflag(&pchan->bone->flag, flag, mode); - } - } - } + /* loop over all selected pchans */ + CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pchans) + { + bone_setflag(&pchan->bone->flag, flag, mode); } - else if (obedit) { - /* deal with editbones */ - EditBone *curbone; - - /* set setting */ - for (curbone= arm->edbo->first; curbone; curbone= curbone->next) { - if (arm->layer & curbone->layer) { - if (curbone->flag & BONE_SELECTED) { - bone_setflag(&curbone->flag, flag, mode); - } - } - } + CTX_DATA_END; + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, CTX_data_active_object(C)); + + return OPERATOR_FINISHED; +} + +/* callback for editbones setflag */ +static int armature_bones_setflag_exec (bContext *C, wmOperator *op) +{ + int flag= RNA_enum_get(op->ptr, "type"); + int mode= RNA_enum_get(op->ptr, "mode"); + + /* loop over all selected pchans */ + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_bones) + { + bone_setflag(&ebone->flag, flag, mode); } + CTX_DATA_END; - BIF_undo_push("Change Bone Setting"); + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, CTX_data_edit_object(C)); + + return OPERATOR_FINISHED; } +/* settings that can be changed */ +static EnumPropertyItem prop_bone_setting_types[] = { + {BONE_DRAWWIRE, "DRAWWIRE", 0, "Draw Wire", ""}, + {BONE_NO_DEFORM, "DEFORM", 0, "Deform", ""}, + {BONE_MULT_VG_ENV, "MULT_VG", 0, "Multiply Vertex Groups", ""}, + {BONE_HINGE, "HINGE", 0, "Hinge", ""}, + {BONE_NO_SCALE, "NO_SCALE", 0, "No Scale", ""}, + {BONE_EDITMODE_LOCKED, "LOCKED", 0, "Locked", "(For EditMode only)"}, + {0, NULL, 0, NULL, NULL} +}; + +/* ways that settings can be changed */ +static EnumPropertyItem prop_bone_setting_modes[] = { + {0, "CLEAR", 0, "Clear", ""}, + {1, "ENABLE", 0, "Enable", ""}, + {2, "TOGGLE", 0, "Toggle", ""}, + {0, NULL, 0, NULL, NULL} +}; + + +void ARMATURE_OT_flags_set (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set Bone Flags"; + ot->idname= "ARMATURE_OT_flags_set"; + ot->description= "Set flags for armature bones."; + + /* callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= armature_bones_setflag_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", prop_bone_setting_types, 0, "Type", ""); + RNA_def_enum(ot->srna, "mode", prop_bone_setting_modes, 0, "Mode", ""); +} + +void POSE_OT_flags_set (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set Bone Flags"; + ot->idname= "POSE_OT_flags_set"; + ot->description= "Set flags for armature bones."; + + /* callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= pose_setflag_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", prop_bone_setting_types, 0, "Type", ""); + RNA_def_enum(ot->srna, "mode", prop_bone_setting_modes, 0, "Mode", ""); +} + + /* **************** END PoseMode & EditMode *************************** */ /* **************** Posemode stuff ********************** */ @@ -1454,8 +1529,6 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* props */ } /* does bones and points */ @@ -1690,7 +1763,7 @@ void ARMATURE_OT_delete(wmOperatorType *ot) * toggle==2: only active tag * toggle==3: swap (no test) */ -void deselectall_armature(Object *obedit, int toggle, int doundo) +void ED_armature_deselectall(Object *obedit, int toggle, int doundo) { bArmature *arm= obedit->data; EditBone *eBone; @@ -1762,7 +1835,7 @@ void mouse_armature(bContext *C, short mval[2], int extend) if (nearBone) { if (!extend) - deselectall_armature(obedit, 0, 0); + ED_armature_deselectall(obedit, 0, 0); /* by definition the non-root connected bones have no root point drawn, so a root selection needs to be delivered to the parent tip */ @@ -1960,7 +2033,7 @@ static EnumPropertyItem prop_calc_roll_types[] = { static int armature_calc_roll_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - View3D *v3d= (View3D *)CTX_wm_space_data(C); + View3D *v3d= CTX_wm_view3d(C); Object *ob= CTX_data_edit_object(C); void (*roll_func)(Scene *, View3D *, EditBone *) = NULL; @@ -2140,7 +2213,7 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d) Mat3MulMat3(totmat, obmat, viewmat); Mat3Inv(imat, totmat); - deselectall_armature(obedit, 0, 0); + ED_armature_deselectall(obedit, 0, 0); /* Create a bone */ bone= add_editbone(obedit, "Bone"); @@ -2193,7 +2266,7 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *op) to_root= 1; } - deselectall_armature(obedit, 0, 0); + ED_armature_deselectall(obedit, 0, 0); /* we re-use code for mirror editing... */ flipbone= NULL; @@ -2640,11 +2713,11 @@ static int armature_duplicate_selected_invoke(bContext *C, wmOperator *op, wmEve return retv; } -void ARMATURE_OT_duplicate_selected(wmOperatorType *ot) +void ARMATURE_OT_duplicate(wmOperatorType *ot) { /* identifiers */ ot->name= "Duplicate Selected Bone(s)"; - ot->idname= "ARMATURE_OT_duplicate_selected"; + ot->idname= "ARMATURE_OT_duplicate"; /* api callbacks */ ot->invoke = armature_duplicate_selected_invoke; @@ -2719,6 +2792,7 @@ static void chains_find_tips (ListBase *edbo, ListBase *list) } } +/* --------------------- */ static void fill_add_joint (EditBone *ebo, short eb_tail, ListBase *points) { @@ -2772,23 +2846,29 @@ static void fill_add_joint (EditBone *ebo, short eb_tail, ListBase *points) } /* bone adding between selected joints */ -void fill_bones_armature(Scene *scene, View3D *v3d) +static int armature_fill_bones_exec (bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX get from context - bArmature *arm= obedit->data; - EditBone *ebo, *newbone=NULL; + Object *obedit= CTX_data_edit_object(C); + bArmature *arm= (obedit) ? obedit->data : NULL; + Scene *scene= CTX_data_scene(C); + View3D *v3d= CTX_wm_view3d(C); + EditBone *newbone=NULL; ListBase points = {NULL, NULL}; int count; + /* sanity checks */ + if ELEM(NULL, obedit, arm) + return OPERATOR_CANCELLED; + /* loop over all bones, and only consider if visible */ - for (ebo= arm->edbo->first; ebo; ebo= ebo->next) { - if (EBONE_VISIBLE(arm, ebo)) { - if (!(ebo->flag & BONE_CONNECTED) && (ebo->flag & BONE_ROOTSEL)) - fill_add_joint(ebo, 0, &points); - if (ebo->flag & BONE_TIPSEL) - fill_add_joint(ebo, 1, &points); - } + CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) + { + if (!(ebone->flag & BONE_CONNECTED) && (ebone->flag & BONE_ROOTSEL)) + fill_add_joint(ebone, 0, &points); + if (ebone->flag & BONE_TIPSEL) + fill_add_joint(ebone, 1, &points); } + CTX_DATA_END; /* the number of joints determines how we fill: * 1) between joint and cursor (joint=head, cursor=tail) @@ -2798,8 +2878,8 @@ void fill_bones_armature(Scene *scene, View3D *v3d) count= BLI_countlist(&points); if (count == 0) { - error("No joints selected"); - return; + BKE_report(op->reports, RPT_ERROR, "No joints selected"); + return OPERATOR_CANCELLED; } else if (count == 1) { EditBonePoint *ebp; @@ -2828,14 +2908,14 @@ void fill_bones_armature(Scene *scene, View3D *v3d) ebp2= ebp->next; if ((ebp->head_owner==ebp2->tail_owner) && (ebp->head_owner!=NULL)) { - error("Same bone selected..."); + BKE_report(op->reports, RPT_ERROR, "Same bone selected..."); BLI_freelistN(&points); - return; + return OPERATOR_CANCELLED; } if ((ebp->tail_owner==ebp2->head_owner) && (ebp->tail_owner!=NULL)) { - error("Same bone selected..."); + BKE_report(op->reports, RPT_ERROR, "Same bone selected..."); BLI_freelistN(&points); - return; + return OPERATOR_CANCELLED; } /* find which one should be the 'head' */ @@ -2902,19 +2982,35 @@ void fill_bones_armature(Scene *scene, View3D *v3d) } else { // FIXME.. figure out a method for multiple bones - error("Too many points selected"); + BKE_report(op->reports, RPT_ERROR, "Too many points selected"); printf("Points selected: %d \n", count); BLI_freelistN(&points); - return; + return OPERATOR_CANCELLED; } /* free points */ BLI_freelistN(&points); - /* undo + updates */ - BIF_undo_push("Fill Bones"); + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_fill (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Fill Between Joints"; + ot->idname= "ARMATURE_OT_fill"; + ot->description= "Add bone between selected joint(s) and/or 3D-Cursor."; + + /* callbacks */ + ot->exec= armature_fill_bones_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } +/* --------------------- */ + /* this function merges between two bones, removes them and those in-between, * and adjusts the parent relationships for those in-between */ @@ -2984,19 +3080,19 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone } } -/* bone merging - has a menu! */ -void merge_armature(Scene *scene) + +static int armature_merge_exec (bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX get from context - bArmature *arm= obedit->data; - short val= 0; + Object *obedit= CTX_data_edit_object(C); + bArmature *arm= (obedit) ? obedit->data : NULL; + short type= RNA_enum_get(op->ptr, "type"); - /* process a menu to determine how to merge */ - // TODO: there's room for more modes of merging stuff... - val= pupmenu("Merge Selected Bones%t|Within Chains%x1"); - if (val <= 0) return; + /* sanity checks */ + if ELEM(NULL, obedit, arm) + return OPERATOR_CANCELLED; - if (val == 1) { + /* for now, there's only really one type of merging that's performed... */ + if (type == 1) { /* go down chains, merging bones */ ListBase chains = {NULL, NULL}; LinkData *chain, *nchain; @@ -3004,7 +3100,7 @@ void merge_armature(Scene *scene) /* get chains (ends on chains) */ chains_find_tips(arm->edbo, &chains); - if (chains.first == NULL) return; + if (chains.first == NULL) return OPERATOR_CANCELLED; /* each 'chain' is the last bone in the chain (with no children) */ for (chain= chains.first; chain; chain= nchain) { @@ -3052,9 +3148,35 @@ void merge_armature(Scene *scene) BLI_freelistN(&chains); } - /* undo + updates */ + /* updates */ ED_armature_sync_selection(arm->edbo); - BIF_undo_push("Merge Bones"); + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, obedit); + + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_merge (wmOperatorType *ot) +{ + static EnumPropertyItem merge_types[] = { + {1, "WITHIN_CHAIN", 0, "Within Chains", ""}, + {0, NULL, 0, NULL, NULL} + }; + + /* identifiers */ + ot->name= "Merge Bones"; + ot->idname= "ARMATURE_OT_merge"; + ot->description= "Merge continuous chains of selected bones."; + + /* callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= armature_merge_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", merge_types, 0, "Type", ""); } /* ************** END Add/Remove stuff in editmode ************ */ @@ -3309,7 +3431,7 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op) Mat3MulMat3(totmat, obmat, viewmat); Mat3Inv(imat, totmat); - deselectall_armature(obedit, 0, 0); + ED_armature_deselectall(obedit, 0, 0); /* Create a bone */ bone= add_editbone(obedit, name); @@ -4109,11 +4231,12 @@ static int armature_align_bones_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void ARMATURE_OT_bones_align(wmOperatorType *ot) +void ARMATURE_OT_align(wmOperatorType *ot) { /* identifiers */ ot->name= "Align Bones"; - ot->idname= "ARMATURE_OT_bones_align"; + ot->idname= "ARMATURE_OT_align"; + ot->description= "Align selected bones to the active bone (or to their parent)."; /* api callbacks */ ot->invoke = WM_operator_confirm; @@ -4614,44 +4737,28 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m MEM_freeN(verts); } -void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par) +void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mode) { /* Lets try to create some vertex groups * based on the bones of the parent armature. */ bArmature *arm= par->data; - short mode; - /* Prompt the user on whether/how they want the vertex groups - * added to the child mesh */ - mode= pupmenu("Create Vertex Groups? %t|" - "Don't Create Groups %x1|" - "Name Groups %x2|" - "Create From Envelopes %x3|" - "Create From Bone Heat %x4|"); - - mode= 3; // XXX - - switch (mode) { - case 2: + if(mode == ARM_GROUPS_NAME) { /* Traverse the bone list, trying to create empty vertex * groups cooresponding to the bone. */ - bone_looper(ob, arm->bonebase.first, NULL, - add_defgroup_unique_bone); + bone_looper(ob, arm->bonebase.first, NULL, add_defgroup_unique_bone); + if (ob->type == OB_MESH) create_dverts(ob->data); - - break; - - case 3: - case 4: + } + else if(mode == ARM_GROUPS_ENVELOPE || mode == ARM_GROUPS_AUTO) { /* Traverse the bone list, trying to create vertex groups * that are populated with the vertices for which the * bone is closest. */ - add_verts_to_dgroups(scene, ob, par, (mode == 4), 0); - break; + add_verts_to_dgroups(scene, ob, par, (mode == ARM_GROUPS_AUTO), 0); } } /* ************* Clear Pose *****************************/ @@ -5227,48 +5334,111 @@ void ED_armature_bone_rename(bArmature *arm, char *oldnamep, char *newnamep) } } -/* context editmode object */ -void armature_flip_names(Scene *scene) + +static int armature_flip_names_exec (bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX get from context - bArmature *arm= obedit->data; - EditBone *ebone; + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_edit_object(C); + bArmature *arm; char newname[32]; - for (ebone = arm->edbo->first; ebone; ebone=ebone->next) { - if (arm->layer & ebone->layer) { - if (ebone->flag & BONE_SELECTED) { - BLI_strncpy(newname, ebone->name, sizeof(newname)); - bone_flip_name(newname, 1); // 1 = do strip off number extensions - ED_armature_bone_rename(arm, ebone->name, newname); - } - } + /* paranoia checks */ + if (ELEM(NULL, ob, ob->pose)) + return OPERATOR_CANCELLED; + arm= ob->data; + + /* loop through selected bones, auto-naming them */ + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) + { + BLI_strncpy(newname, ebone->name, sizeof(newname)); + bone_flip_name(newname, 1); // 1 = do strip off number extensions + ED_armature_bone_rename(arm, ebone->name, newname); } + CTX_DATA_END; - BIF_undo_push("Flip names"); + /* since we renamed stuff... */ + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); + + return OPERATOR_FINISHED; } -/* context: edtimode armature */ -void armature_autoside_names(Scene *scene, short axis) +void ARMATURE_OT_flip_names (wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX get from context - bArmature *arm= obedit->data; - EditBone *ebone; + /* identifiers */ + ot->name= "Flip Names"; + ot->idname= "ARMATURE_OT_flip_names"; + ot->description= "Flips (and corrects) the names of selected bones."; + + /* api callbacks */ + ot->exec= armature_flip_names_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + + +static int armature_autoside_names_exec (bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_edit_object(C); + bArmature *arm; char newname[32]; + short axis= RNA_enum_get(op->ptr, "axis"); - for (ebone = arm->edbo->first; ebone; ebone=ebone->next) { - if (arm->layer & ebone->layer) { - if (ebone->flag & BONE_SELECTED) { - BLI_strncpy(newname, ebone->name, sizeof(newname)); - bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis]); - ED_armature_bone_rename(arm, ebone->name, newname); - } - } + /* paranoia checks */ + if (ELEM(NULL, ob, ob->pose)) + return OPERATOR_CANCELLED; + arm= ob->data; + + /* loop through selected bones, auto-naming them */ + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) + { + BLI_strncpy(newname, ebone->name, sizeof(newname)); + bone_autoside_name(newname, 1, axis, ebone->head[axis], ebone->tail[axis]); + ED_armature_bone_rename(arm, ebone->name, newname); } + CTX_DATA_END; + + /* since we renamed stuff... */ + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); - BIF_undo_push("Auto-side name"); + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_autoside_names (wmOperatorType *ot) +{ + static EnumPropertyItem axis_items[]= { + {0, "XAXIS", 0, "X-Axis", "Left/Right"}, + {1, "YAXIS", 0, "Y-Axis", "Front/Back"}, + {2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"}, + {0, NULL, 0, NULL, NULL}}; + + /* identifiers */ + ot->name= "AutoName by Axis"; + ot->idname= "ARMATURE_OT_autoside_names"; + ot->description= "Automatically renames the selected bones according to which side of the target axis they fall on."; + + /* api callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= armature_autoside_names_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* settings */ + RNA_def_enum(ot->srna, "axis", axis_items, 0, "Axis", "Axis tag names with."); } + + /* if editbone (partial) selected, copy data */ /* context; editmode armature, with mirror editing enabled */ void transform_armature_mirror_update(Object *obedit) diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c index a1ce256a1af..1d87ca8a6df 100644 --- a/source/blender/editors/armature/editarmature_retarget.c +++ b/source/blender/editors/armature/editarmature_retarget.c @@ -466,12 +466,12 @@ static void renameTemplateBone(char *name, char *template_name, ListBase *editbo { if (template_name[i+1] == 'S' || template_name[i+1] == 's') { - j += sprintf(name + j, side_string); + j += sprintf(name + j, "%s", side_string); i++; } else if (template_name[i+1] == 'N' || template_name[i+1] == 'n') { - j += sprintf(name + j, num_string); + j += sprintf(name + j, "%s", num_string); i++; } else diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c index 974eeb91a68..f3f7bccde04 100644 --- a/source/blender/editors/armature/editarmature_sketch.c +++ b/source/blender/editors/armature/editarmature_sketch.c @@ -49,6 +49,7 @@ #include "BKE_object.h" #include "BKE_anim.h" #include "BKE_context.h" +#include "BKE_sketch.h" #include "ED_view3d.h" #include "ED_screen.h" @@ -74,75 +75,21 @@ //#include "mydevice.h" #include "reeb.h" -typedef enum SK_PType -{ - PT_CONTINUOUS, - PT_EXACT, -} SK_PType; - -typedef enum SK_PMode -{ - PT_SNAP, - PT_PROJECT, -} SK_PMode; -typedef struct SK_Point -{ - float p[3]; - float no[3]; - float size; - SK_PType type; - SK_PMode mode; -} SK_Point; -typedef struct SK_Stroke -{ - struct SK_Stroke *next, *prev; - - SK_Point *points; - int nb_points; - int buf_size; - int selected; -} SK_Stroke; - -#define SK_OVERDRAW_LIMIT 5 - -typedef struct SK_Overdraw -{ - SK_Stroke *target; - int start, end; - int count; -} SK_Overdraw; +typedef int (*GestureDetectFct)(bContext*, SK_Gesture*, SK_Sketch *); +typedef void (*GestureApplyFct)(bContext*, SK_Gesture*, SK_Sketch *); -#define SK_Stroke_BUFFER_INIT_SIZE 20 +typedef struct SK_GestureAction { + char name[64]; + GestureDetectFct detect; + GestureApplyFct apply; +} SK_GestureAction; -typedef struct SK_DrawData -{ - short mval[2]; - short previous_mval[2]; - SK_PType type; -} SK_DrawData; +SK_Point boneSnap; +int LAST_SNAP_POINT_VALID = 0; +float LAST_SNAP_POINT[3]; -typedef struct SK_Intersection -{ - struct SK_Intersection *next, *prev; - SK_Stroke *stroke; - int before; - int after; - int gesture_index; - float p[3]; - float lambda; /* used for sorting intersection points */ -} SK_Intersection; - -typedef struct SK_Sketch -{ - ListBase strokes; - ListBase depth_peels; - SK_Stroke *active_stroke; - SK_Stroke *gesture; - SK_Point next_point; - SK_Overdraw over; -} SK_Sketch; typedef struct SK_StrokeIterator { HeadFct head; @@ -165,40 +112,12 @@ typedef struct SK_StrokeIterator { int stride; } SK_StrokeIterator; -typedef struct SK_Gesture { - SK_Stroke *stk; - SK_Stroke *segments; - - ListBase intersections; - ListBase self_intersections; - - int nb_self_intersections; - int nb_intersections; - int nb_segments; -} SK_Gesture; - -typedef int (*GestureDetectFct)(bContext*, SK_Gesture*, SK_Sketch *); -typedef void (*GestureApplyFct)(bContext*, SK_Gesture*, SK_Sketch *); - -typedef struct SK_GestureAction { - char name[64]; - GestureDetectFct detect; - GestureApplyFct apply; -} SK_GestureAction; - -SK_Point boneSnap; -int LAST_SNAP_POINT_VALID = 0; -float LAST_SNAP_POINT[3]; - /******************** PROTOTYPES ******************************/ void initStrokeIterator(BArcIterator *iter, SK_Stroke *stk, int start, int end); void sk_deleteSelectedStrokes(SK_Sketch *sketch); -void sk_freeStroke(SK_Stroke *stk); -void sk_freeSketch(SK_Sketch *sketch); - SK_Point *sk_lastStrokePoint(SK_Stroke *stk); int sk_detectCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch); @@ -560,329 +479,6 @@ void sk_retargetStroke(bContext *C, SK_Stroke *stk) /**************************************************************/ -void sk_freeSketch(SK_Sketch *sketch) -{ - SK_Stroke *stk, *next; - - for (stk = sketch->strokes.first; stk; stk = next) - { - next = stk->next; - - sk_freeStroke(stk); - } - - BLI_freelistN(&sketch->depth_peels); - - MEM_freeN(sketch); -} - -SK_Sketch* sk_createSketch() -{ - SK_Sketch *sketch; - - sketch = MEM_callocN(sizeof(SK_Sketch), "SK_Sketch"); - - sketch->active_stroke = NULL; - sketch->gesture = NULL; - - sketch->strokes.first = NULL; - sketch->strokes.last = NULL; - - return sketch; -} - -void sk_initPoint(bContext *C, SK_Point *pt) -{ - ARegion *ar = CTX_wm_region(C); - RegionView3D *rv3d = ar->regiondata; - - VECCOPY(pt->no, rv3d->viewinv[2]); - Normalize(pt->no); - /* more init code here */ -} - -void sk_copyPoint(SK_Point *dst, SK_Point *src) -{ - memcpy(dst, src, sizeof(SK_Point)); -} - -void sk_allocStrokeBuffer(SK_Stroke *stk) -{ - stk->points = MEM_callocN(sizeof(SK_Point) * stk->buf_size, "SK_Point buffer"); -} - -void sk_freeStroke(SK_Stroke *stk) -{ - MEM_freeN(stk->points); - MEM_freeN(stk); -} - -SK_Stroke* sk_createStroke() -{ - SK_Stroke *stk; - - stk = MEM_callocN(sizeof(SK_Stroke), "SK_Stroke"); - - stk->selected = 0; - stk->nb_points = 0; - stk->buf_size = SK_Stroke_BUFFER_INIT_SIZE; - - sk_allocStrokeBuffer(stk); - - return stk; -} - -void sk_shrinkStrokeBuffer(SK_Stroke *stk) -{ - if (stk->nb_points < stk->buf_size) - { - SK_Point *old_points = stk->points; - - stk->buf_size = stk->nb_points; - - sk_allocStrokeBuffer(stk); - - memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points); - - MEM_freeN(old_points); - } -} - -void sk_growStrokeBuffer(SK_Stroke *stk) -{ - if (stk->nb_points == stk->buf_size) - { - SK_Point *old_points = stk->points; - - stk->buf_size *= 2; - - sk_allocStrokeBuffer(stk); - - memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points); - - MEM_freeN(old_points); - } -} - -void sk_growStrokeBufferN(SK_Stroke *stk, int n) -{ - if (stk->nb_points + n > stk->buf_size) - { - SK_Point *old_points = stk->points; - - while (stk->nb_points + n > stk->buf_size) - { - stk->buf_size *= 2; - } - - sk_allocStrokeBuffer(stk); - - memcpy(stk->points, old_points, sizeof(SK_Point) * stk->nb_points); - - MEM_freeN(old_points); - } -} - - -void sk_replaceStrokePoint(SK_Stroke *stk, SK_Point *pt, int n) -{ - memcpy(stk->points + n, pt, sizeof(SK_Point)); -} - -void sk_insertStrokePoint(SK_Stroke *stk, SK_Point *pt, int n) -{ - int size = stk->nb_points - n; - - sk_growStrokeBuffer(stk); - - memmove(stk->points + n + 1, stk->points + n, size * sizeof(SK_Point)); - - memcpy(stk->points + n, pt, sizeof(SK_Point)); - - stk->nb_points++; -} - -void sk_appendStrokePoint(SK_Stroke *stk, SK_Point *pt) -{ - sk_growStrokeBuffer(stk); - - memcpy(stk->points + stk->nb_points, pt, sizeof(SK_Point)); - - stk->nb_points++; -} - -void sk_insertStrokePoints(SK_Stroke *stk, SK_Point *pts, int len, int start, int end) -{ - int size = end - start + 1; - - sk_growStrokeBufferN(stk, len - size); - - if (len != size) - { - int tail_size = stk->nb_points - end + 1; - - memmove(stk->points + start + len, stk->points + end + 1, tail_size * sizeof(SK_Point)); - } - - memcpy(stk->points + start, pts, len * sizeof(SK_Point)); - - stk->nb_points += len - size; -} - -void sk_trimStroke(SK_Stroke *stk, int start, int end) -{ - int size = end - start + 1; - - if (start > 0) - { - memmove(stk->points, stk->points + start, size * sizeof(SK_Point)); - } - - stk->nb_points = size; -} - -void sk_straightenStroke(SK_Stroke *stk, int start, int end, float p_start[3], float p_end[3]) -{ - SK_Point pt1, pt2; - SK_Point *prev, *next; - float delta_p[3]; - int i, total; - - total = end - start; - - VecSubf(delta_p, p_end, p_start); - - prev = stk->points + start; - next = stk->points + end; - - VECCOPY(pt1.p, p_start); - VECCOPY(pt1.no, prev->no); - pt1.mode = prev->mode; - pt1.type = prev->type; - - VECCOPY(pt2.p, p_end); - VECCOPY(pt2.no, next->no); - pt2.mode = next->mode; - pt2.type = next->type; - - sk_insertStrokePoint(stk, &pt1, start + 1); /* insert after start */ - sk_insertStrokePoint(stk, &pt2, end + 1); /* insert before end (since end was pushed back already) */ - - for (i = 1; i < total; i++) - { - float delta = (float)i / (float)total; - float *p = stk->points[start + 1 + i].p; - - VECCOPY(p, delta_p); - VecMulf(p, delta); - VecAddf(p, p, p_start); - } -} - -void sk_polygonizeStroke(SK_Stroke *stk, int start, int end) -{ - int offset; - int i; - - /* find first exact points outside of range */ - for (;start > 0; start--) - { - if (stk->points[start].type == PT_EXACT) - { - break; - } - } - - for (;end < stk->nb_points - 1; end++) - { - if (stk->points[end].type == PT_EXACT) - { - break; - } - } - - offset = start + 1; - - for (i = start + 1; i < end; i++) - { - if (stk->points[i].type == PT_EXACT) - { - if (offset != i) - { - memcpy(stk->points + offset, stk->points + i, sizeof(SK_Point)); - } - - offset++; - } - } - - /* some points were removes, move end of array */ - if (offset < end) - { - int size = stk->nb_points - end; - memmove(stk->points + offset, stk->points + end, size * sizeof(SK_Point)); - stk->nb_points = offset + size; - } -} - -void sk_flattenStroke(SK_Stroke *stk, int start, int end) -{ - float normal[3], distance[3]; - float limit; - int i, total; - - total = end - start + 1; - - VECCOPY(normal, stk->points[start].no); - - VecSubf(distance, stk->points[end].p, stk->points[start].p); - Projf(normal, distance, normal); - limit = Normalize(normal); - - for (i = 1; i < total - 1; i++) - { - float d = limit * i / total; - float offset[3]; - float *p = stk->points[start + i].p; - - VecSubf(distance, p, stk->points[start].p); - Projf(distance, distance, normal); - - VECCOPY(offset, normal); - VecMulf(offset, d); - - VecSubf(p, p, distance); - VecAddf(p, p, offset); - } -} - -void sk_removeStroke(SK_Sketch *sketch, SK_Stroke *stk) -{ - if (sketch->active_stroke == stk) - { - sketch->active_stroke = NULL; - } - - BLI_remlink(&sketch->strokes, stk); - sk_freeStroke(stk); -} - -void sk_reverseStroke(SK_Stroke *stk) -{ - SK_Point *old_points = stk->points; - int i = 0; - - sk_allocStrokeBuffer(stk); - - for (i = 0; i < stk->nb_points; i++) - { - sk_copyPoint(stk->points + i, old_points + stk->nb_points - 1 - i); - } - - MEM_freeN(old_points); -} - - void sk_cancelStroke(SK_Sketch *sketch) { if (sketch->active_stroke != NULL) @@ -892,114 +488,6 @@ void sk_cancelStroke(SK_Sketch *sketch) } } -/* Apply reverse Chaikin filter to simplify the polyline - * */ -void sk_filterStroke(SK_Stroke *stk, int start, int end) -{ - SK_Point *old_points = stk->points; - int nb_points = stk->nb_points; - int i, j; - - return; - - if (start == -1) - { - start = 0; - end = stk->nb_points - 1; - } - - sk_allocStrokeBuffer(stk); - stk->nb_points = 0; - - /* adding points before range */ - for (i = 0; i < start; i++) - { - sk_appendStrokePoint(stk, old_points + i); - } - - for (i = start, j = start; i <= end; i++) - { - if (i - j == 3) - { - SK_Point pt; - float vec[3]; - - sk_copyPoint(&pt, &old_points[j+1]); - - pt.p[0] = 0; - pt.p[1] = 0; - pt.p[2] = 0; - - VECCOPY(vec, old_points[j].p); - VecMulf(vec, -0.25); - VecAddf(pt.p, pt.p, vec); - - VECCOPY(vec, old_points[j+1].p); - VecMulf(vec, 0.75); - VecAddf(pt.p, pt.p, vec); - - VECCOPY(vec, old_points[j+2].p); - VecMulf(vec, 0.75); - VecAddf(pt.p, pt.p, vec); - - VECCOPY(vec, old_points[j+3].p); - VecMulf(vec, -0.25); - VecAddf(pt.p, pt.p, vec); - - pt.size = -0.25 * old_points[j].size + 0.75 * old_points[j+1].size + 0.75 * old_points[j+2].size - 0.25 * old_points[j+3].size; - - sk_appendStrokePoint(stk, &pt); - - j += 2; - } - - /* this might be uneeded when filtering last continuous stroke */ - if (old_points[i].type == PT_EXACT) - { - sk_appendStrokePoint(stk, old_points + i); - j = i; - } - } - - /* adding points after range */ - for (i = end + 1; i < nb_points; i++) - { - sk_appendStrokePoint(stk, old_points + i); - } - - MEM_freeN(old_points); - - sk_shrinkStrokeBuffer(stk); -} - -void sk_filterLastContinuousStroke(SK_Stroke *stk) -{ - int start, end; - - end = stk->nb_points -1; - - for (start = end - 1; start > 0 && stk->points[start].type == PT_CONTINUOUS; start--) - { - /* nothing to do here*/ - } - - if (end - start > 1) - { - sk_filterStroke(stk, start, end); - } -} - -SK_Point *sk_lastStrokePoint(SK_Stroke *stk) -{ - SK_Point *pt = NULL; - - if (stk->nb_points > 0) - { - pt = stk->points + (stk->nb_points - 1); - } - - return pt; -} float sk_clampPointSize(SK_Point *pt, float size) { @@ -1037,7 +525,7 @@ void sk_drawNormal(GLUquadric *quad, SK_Point *pt, float size, float height) { float vec2[3] = {0, 0, 1}, axis[3]; float angle; - + glPushMatrix(); Crossf(axis, vec2, pt->no); @@ -1325,12 +813,6 @@ void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa int closest_index = -1; int dist = SNAP_MIN_DISTANCE * 2; -// /* If snapping, don't start overdraw */ Can't do that, snap is embed too now -// if (sk_lastStrokePoint(stk)->mode == PT_SNAP) -// { -// return; -// } - for (target = sketch->strokes.first; target; target = target->next) { if (target != stk) @@ -1569,9 +1051,11 @@ int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok int sk_addStrokeDrawPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) { + ARegion *ar = CTX_wm_region(C); + RegionView3D *rv3d = ar->regiondata; SK_Point pt; - sk_initPoint(C, &pt); + sk_initPoint(&pt, dd, rv3d->viewinv[2]); sk_getStrokeDrawPoint(C, &pt, sketch, stk, dd); @@ -1732,9 +1216,11 @@ int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok int sk_addStrokeSnapPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) { int point_added; + ARegion *ar = CTX_wm_region(C); + RegionView3D *rv3d = ar->regiondata; SK_Point pt; - sk_initPoint(C, &pt); + sk_initPoint(&pt, dd, rv3d->viewinv[2]); point_added = sk_getStrokeSnapPoint(C, &pt, sketch, stk, dd); @@ -1820,38 +1306,6 @@ void sk_getStrokePoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke * } } -void sk_endContinuousStroke(SK_Stroke *stk) -{ - stk->points[stk->nb_points - 1].type = PT_EXACT; -} - -void sk_updateNextPoint(SK_Sketch *sketch, SK_Stroke *stk) -{ - if (stk) - { - memcpy(&sketch->next_point, stk->points[stk->nb_points - 1].p, sizeof(SK_Point)); - } -} - -int sk_stroke_filtermval(SK_DrawData *dd) -{ - int retval = 0; - if (ABS(dd->mval[0] - dd->previous_mval[0]) + ABS(dd->mval[1] - dd->previous_mval[1]) > U.gp_manhattendist) - { - retval = 1; - } - - return retval; -} - -void sk_initDrawData(SK_DrawData *dd, short mval[2]) -{ - dd->mval[0] = mval[0]; - dd->mval[1] = mval[1]; - dd->previous_mval[0] = -1; - dd->previous_mval[1] = -1; - dd->type = PT_EXACT; -} /********************************************/ static void* headPoint(void *arg); @@ -2699,56 +2153,6 @@ void sk_applyGesture(bContext *C, SK_Sketch *sketch) /********************************************/ -void sk_deleteSelectedStrokes(SK_Sketch *sketch) -{ - SK_Stroke *stk, *next; - - for (stk = sketch->strokes.first; stk; stk = next) - { - next = stk->next; - - if (stk->selected == 1) - { - sk_removeStroke(sketch, stk); - } - } -} - -void sk_selectAllSketch(SK_Sketch *sketch, int mode) -{ - SK_Stroke *stk = NULL; - - if (mode == -1) - { - for (stk = sketch->strokes.first; stk; stk = stk->next) - { - stk->selected = 0; - } - } - else if (mode == 0) - { - for (stk = sketch->strokes.first; stk; stk = stk->next) - { - stk->selected = 1; - } - } - else if (mode == 1) - { - int selected = 1; - - for (stk = sketch->strokes.first; stk; stk = stk->next) - { - selected &= stk->selected; - } - - selected ^= 1; - - for (stk = sketch->strokes.first; stk; stk = stk->next) - { - stk->selected = selected; - } - } -} void sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend) { @@ -2897,7 +2301,7 @@ void sk_drawSketch(Scene *scene, View3D *v3d, SK_Sketch *sketch, int with_names) } } -#if 0 +#if 1 if (sketch->depth_peels.first != NULL) { float colors[8][3] = { @@ -2998,6 +2402,7 @@ int sk_draw_stroke(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData * sk_addStrokePoint(C, sketch, stk, dd, snap); sk_updateDrawData(dd); sk_updateNextPoint(sketch, stk); + return 1; } @@ -3113,16 +2518,6 @@ void BIF_selectAllSketch(bContext *C, int mode) } #endif -void ED_freeSketch(SK_Sketch *sketch) -{ - sk_freeSketch(sketch); -} - -SK_Sketch* ED_createSketch() -{ - return sk_createSketch(); -} - SK_Sketch* contextSketch(const bContext *C, int create) { Object *obedit = CTX_data_edit_object(C); @@ -3134,7 +2529,7 @@ SK_Sketch* contextSketch(const bContext *C, int create) if (arm->sketch == NULL && create) { - arm->sketch = sk_createSketch(); + arm->sketch = createSketch(); } sketch = arm->sketch; } @@ -3153,7 +2548,7 @@ SK_Sketch* viewcontextSketch(ViewContext *vc, int create) if (arm->sketch == NULL && create) { - arm->sketch = sk_createSketch(); + arm->sketch = createSketch(); } sketch = arm->sketch; } diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c index 83179dd3843..b44782fca73 100644 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@ -65,7 +65,7 @@ /* ************* XXX *************** */ -static void waitcursor() {} +static void waitcursor(int val) {} static void progress_bar() {} static void start_progress_bar() {} static void end_progress_bar() {} diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c index 9814a056b70..174bb39d7b9 100644 --- a/source/blender/editors/armature/poseobject.c +++ b/source/blender/editors/armature/poseobject.c @@ -21,6 +21,7 @@ * All rights reserved. * * Contributor(s): Ton Roosendaal, Blender Foundation '05, full recode. + * Joshua Leung * * ***** END GPL LICENSE BLOCK ***** * support for animation modes - Reevan McKay @@ -50,6 +51,7 @@ #include "DNA_view3d_types.h" #include "DNA_userdef_types.h" +#include "BKE_animsys.h" #include "BKE_action.h" #include "BKE_armature.h" #include "BKE_blender.h" @@ -87,9 +89,7 @@ #include "armature_intern.h" /* ************* XXX *************** */ -static int movetolayer_short_buts() {return 1;} static int pupmenu() {return 0;} -static void waitcursor() {}; static void error() {}; static void BIF_undo_push() {} static void countall() {} @@ -201,10 +201,12 @@ int ED_pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan) /* ********************************************** */ -/* For the object with pose/action: create path curves for selected bones - * This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range +/* For the object with pose/action: update paths for those that have got them + * This should selectively update paths that exist... + * + * To be called from various tools that do incremental updates */ -void pose_calculate_path(bContext *C, Scene *scene, Object *ob) +void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob) { bArmature *arm; bPoseChannel *pchan; @@ -213,29 +215,28 @@ void pose_calculate_path(bContext *C, Scene *scene, Object *ob) int cfra; int sfra, efra; - if (ob==NULL || ob->pose==NULL) + /* sanity checks */ + if ELEM(NULL, ob, ob->pose) return; arm= ob->data; - /* version patch for older files here (do_versions patch too complicated) */ - if ((arm->pathsf == 0) || (arm->pathef == 0)) { - arm->pathsf = SFRA; - arm->pathef = EFRA; - } - if (arm->pathsize == 0) { - arm->pathsize = 1; - } - /* set frame values */ - cfra= CFRA; - sfra = arm->pathsf; - efra = arm->pathef; - if (efra <= sfra) { - error("Can't calculate paths when pathlen <= 0"); - return; + cfra = CFRA; + sfra = efra = cfra; + for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + if ((pchan->bone) && (arm->layer & pchan->bone->layer)) { + if (pchan->path) { + /* if the pathsf and pathef aren't initialised, abort! */ + if (ELEM(0, pchan->pathsf, pchan->pathef)) + return; + + /* try to increase area to do (only as much as needed) */ + sfra= MIN2(sfra, pchan->pathsf); + efra= MAX2(efra, pchan->pathef); + } + } } - - waitcursor(1); + if (efra <= sfra) return; /* hack: for unsaved files, set OB_RECALC so that paths can get calculated */ if ((ob->recalc & OB_RECALC)==0) { @@ -245,35 +246,30 @@ void pose_calculate_path(bContext *C, Scene *scene, Object *ob) else ED_anim_object_flush_update(C, ob); - - /* malloc the path blocks */ - for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) { - if (arm->layer & pchan->bone->layer) { - pchan->pathlen= efra-sfra+1; - pchan->pathsf= sfra; - pchan->pathef= efra+1; - if (pchan->path) - MEM_freeN(pchan->path); - pchan->path= MEM_callocN(3*pchan->pathlen*sizeof(float), "pchan path"); - } - } - } - + /* calculate path over requested range */ for (CFRA=sfra; CFRA<=efra; CFRA++) { /* do all updates */ for (base= FIRSTBASE; base; base= base->next) { if (base->object->recalc) { int temp= base->object->recalc; + + if (base->object->adt) + BKE_animsys_evaluate_animdata(&base->object->id, base->object->adt, (float)CFRA, ADT_RECALC_ALL); + + /* update object */ object_handle_update(scene, base->object); base->object->recalc= temp; } } for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) { - if (arm->layer & pchan->bone->layer) { - if (pchan->path) { + if ((pchan->bone) && (arm->layer & pchan->bone->layer)) { + if (pchan->path) { + /* only update if: + * - in range of this pchan's existing path + * - ... insert evil filtering/optimising conditions here... + */ + if (IN_RANGE(CFRA, pchan->pathsf, pchan->pathef)) { fp= pchan->path+3*(CFRA-sfra); if (arm->pathflag & ARM_PATH_HEADS) { @@ -290,16 +286,35 @@ void pose_calculate_path(bContext *C, Scene *scene, Object *ob) } } - waitcursor(0); - + /* reset flags */ CFRA= cfra; + ob->pose->flag &= ~POSE_RECALCPATHS; + + /* flush one final time - to restore to the original state */ + for (base= FIRSTBASE; base; base= base->next) { + if (base->object->recalc) { + int temp= base->object->recalc; + + if (base->object->adt) + BKE_animsys_evaluate_animdata(&base->object->id, base->object->adt, (float)CFRA, ADT_RECALC_ALL); + + object_handle_update(scene, base->object); + base->object->recalc= temp; + } + } } -/* For the object with pose/action: update paths for those that have got them - * This should selectively update paths that exist... +/* --------- */ + +/* For the object with pose/action: create path curves for selected bones + * This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range */ -void pose_recalculate_paths(bContext *C, Scene *scene, Object *ob) +static int pose_calculate_paths_exec (bContext *C, wmOperator *op) { + wmWindow *win= CTX_wm_window(C); + ScrArea *sa= CTX_wm_area(C); + Scene *scene= CTX_data_scene(C); + Object *ob; bArmature *arm; bPoseChannel *pchan; Base *base; @@ -307,29 +322,35 @@ void pose_recalculate_paths(bContext *C, Scene *scene, Object *ob) int cfra; int sfra, efra; - if (ob==NULL || ob->pose==NULL) - return; + /* since this call may also be used from the buttons window, we need to check for where to get the object */ + if (sa->spacetype == SPACE_BUTS) + ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + else + ob= CTX_data_active_object(C); + + /* only continue if there's an object */ + if ELEM(NULL, ob, ob->pose) + return OPERATOR_CANCELLED; arm= ob->data; - /* set frame values */ - cfra = CFRA; - sfra = efra = cfra; - for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if ((pchan->bone) && (arm->layer & pchan->bone->layer)) { - if (pchan->path) { - /* if the pathsf and pathef aren't initialised, abort! */ - if (ELEM(0, pchan->pathsf, pchan->pathef)) - return; - - /* try to increase area to do (only as much as needed) */ - sfra= MIN2(sfra, pchan->pathsf); - efra= MAX2(efra, pchan->pathef); - } - } + /* version patch for older files here (do_versions patch too complicated) */ + if ((arm->pathsf == 0) || (arm->pathef == 0)) { + arm->pathsf = SFRA; + arm->pathef = EFRA; + } + if (arm->pathsize == 0) { + arm->pathsize = 1; } - if (efra <= sfra) return; - waitcursor(1); + /* get frame values to use */ + cfra= CFRA; + sfra = arm->pathsf; + efra = arm->pathef; + + if (efra <= sfra) { + BKE_report(op->reports, RPT_ERROR, "Can't calculate paths when pathlen <= 0"); + return OPERATOR_CANCELLED; + } /* hack: for unsaved files, set OB_RECALC so that paths can get calculated */ if ((ob->recalc & OB_RECALC)==0) { @@ -339,24 +360,42 @@ void pose_recalculate_paths(bContext *C, Scene *scene, Object *ob) else ED_anim_object_flush_update(C, ob); + /* alloc the path cache arrays */ + for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) { + if (arm->layer & pchan->bone->layer) { + pchan->pathlen= efra-sfra+1; + pchan->pathsf= sfra; + pchan->pathef= efra+1; + if (pchan->path) + MEM_freeN(pchan->path); + pchan->path= MEM_callocN(3*pchan->pathlen*sizeof(float), "pchan path"); + } + } + } + + /* step through frame range sampling the values */ for (CFRA=sfra; CFRA<=efra; CFRA++) { + /* for each frame we calculate, update time-cursor... (may be too slow) */ + WM_timecursor(win, CFRA); + /* do all updates */ for (base= FIRSTBASE; base; base= base->next) { if (base->object->recalc) { int temp= base->object->recalc; + + if (base->object->adt) + BKE_animsys_evaluate_animdata(&base->object->id, base->object->adt, (float)CFRA, ADT_RECALC_ALL); + object_handle_update(scene, base->object); base->object->recalc= temp; } } for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if ((pchan->bone) && (arm->layer & pchan->bone->layer)) { - if (pchan->path) { - /* only update if: - * - in range of this pchan's existing path - * - ... insert evil filtering/optimising conditions here... - */ - if (IN_RANGE(CFRA, pchan->pathsf, pchan->pathef)) { + if ((pchan->bone) && (pchan->bone->flag & BONE_SELECTED)) { + if (arm->layer & pchan->bone->layer) { + if (pchan->path) { fp= pchan->path+3*(CFRA-sfra); if (arm->pathflag & ARM_PATH_HEADS) { @@ -373,18 +412,55 @@ void pose_recalculate_paths(bContext *C, Scene *scene, Object *ob) } } - waitcursor(0); + /* restore original cursor */ + WM_cursor_restore(win); + /* reset current frame, and clear flags */ CFRA= cfra; ob->pose->flag &= ~POSE_RECALCPATHS; + + /* flush one final time - to restore to the original state */ + for (base= FIRSTBASE; base; base= base->next) { + if (base->object->recalc) { + int temp= base->object->recalc; + + if (base->object->adt) + BKE_animsys_evaluate_animdata(&base->object->id, base->object->adt, (float)CFRA, ADT_RECALC_ALL); + + object_handle_update(scene, base->object); + base->object->recalc= temp; + } + } + + /* notifiers for updates */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); + + return OPERATOR_FINISHED; } +void POSE_OT_paths_calculate (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Calculate Bone Paths"; + ot->idname= "POSE_OT_paths_calculate"; + ot->description= "Calculate paths for the selected bones."; + + /* api callbacks */ + ot->exec= pose_calculate_paths_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* --------- */ + /* for the object with pose/action: clear path curves for selected bones only */ -void pose_clear_paths(Object *ob) +void ED_pose_clear_paths(Object *ob) { bPoseChannel *pchan; - if (ob==NULL || ob->pose==NULL) + if ELEM(NULL, ob, ob->pose) return; /* free the path blocks */ @@ -396,9 +472,49 @@ void pose_clear_paths(Object *ob) } } } +} + +/* operator callback for this */ +static int pose_clear_paths_exec (bContext *C, wmOperator *op) +{ + ScrArea *sa= CTX_wm_area(C); + Object *ob; + /* since this call may also be used from the buttons window, we need to check for where to get the object */ + if (sa->spacetype == SPACE_BUTS) + ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + else + ob= CTX_data_active_object(C); + + /* only continue if there's an object */ + if ELEM(NULL, ob, ob->pose) + return OPERATOR_CANCELLED; + + /* for now, just call the API function for this (which is shared with backend functions) */ + ED_pose_clear_paths(ob); + + /* notifiers for updates */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); + + return OPERATOR_FINISHED; +} + +void POSE_OT_paths_clear (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Clear Bone Paths"; + ot->idname= "POSE_OT_paths_clear"; + ot->description= "Clear path caches for selected bones."; + + /* api callbacks */ + ot->exec= pose_clear_paths_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; } +/* ******************* Select Constraint Target Operator ************* */ // XXX this function is to be removed when the other stuff is recoded void pose_select_constraint_target(Scene *scene) @@ -1417,64 +1533,111 @@ void pose_select_grouped_menu (Scene *scene) /* ********************************************** */ -/* context active object */ -void pose_flip_names(Scene *scene) +static int pose_flip_names_exec (bContext *C, wmOperator *op) { - Object *obedit= scene->obedit; // XXX context - Object *ob= OBACT; - bArmature *arm= ob->data; - bPoseChannel *pchan; + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + bArmature *arm; char newname[32]; /* paranoia checks */ - if(!ob && !ob->pose) return; - if(ob==obedit || (ob->flag & OB_POSEMODE)==0) return; - - if(pose_has_protected_selected(ob, 0, 1)) - return; + if (ELEM(NULL, ob, ob->pose)) + return OPERATOR_CANCELLED; + arm= ob->data; - for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if(arm->layer & pchan->bone->layer) { - if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) { - BLI_strncpy(newname, pchan->name, sizeof(newname)); - bone_flip_name(newname, 1); // 1 = do strip off number extensions - ED_armature_bone_rename(arm, pchan->name, newname); - } - } + /* loop through selected bones, auto-naming them */ + CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans) + { + BLI_strncpy(newname, pchan->name, sizeof(newname)); + bone_flip_name(newname, 1); // 1 = do strip off number extensions + ED_armature_bone_rename(arm, pchan->name, newname); } + CTX_DATA_END; + + /* since we renamed stuff... */ + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); - BIF_undo_push("Flip names"); + return OPERATOR_FINISHED; } -/* context active object */ -void pose_autoside_names(Scene *scene, short axis) +void POSE_OT_flip_names (wmOperatorType *ot) { - Object *obedit= scene->obedit; // XXX context - Object *ob= OBACT; - bArmature *arm= ob->data; - bPoseChannel *pchan; + /* identifiers */ + ot->name= "Flip Names"; + ot->idname= "POSE_OT_flip_names"; + ot->description= "Flips (and corrects) the names of selected bones."; + + /* api callbacks */ + ot->exec= pose_flip_names_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* ------------------ */ + +static int pose_autoside_names_exec (bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + bArmature *arm; char newname[32]; + short axis= RNA_enum_get(op->ptr, "axis"); /* paranoia checks */ - if (ELEM(NULL, ob, ob->pose)) return; - if (ob==obedit || (ob->flag & OB_POSEMODE)==0) return; - - if (pose_has_protected_selected(ob, 0, 1)) - return; + if (ELEM(NULL, ob, ob->pose)) + return OPERATOR_CANCELLED; + arm= ob->data; - for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if(arm->layer & pchan->bone->layer) { - if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) { - BLI_strncpy(newname, pchan->name, sizeof(newname)); - bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis]); - ED_armature_bone_rename(arm, pchan->name, newname); - } - } + /* loop through selected bones, auto-naming them */ + CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pchans) + { + BLI_strncpy(newname, pchan->name, sizeof(newname)); + bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis]); + ED_armature_bone_rename(arm, pchan->name, newname); } + CTX_DATA_END; - BIF_undo_push("Flip names"); + /* since we renamed stuff... */ + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); + + return OPERATOR_FINISHED; } +void POSE_OT_autoside_names (wmOperatorType *ot) +{ + static EnumPropertyItem axis_items[]= { + {0, "XAXIS", 0, "X-Axis", "Left/Right"}, + {1, "YAXIS", 0, "Y-Axis", "Front/Back"}, + {2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"}, + {0, NULL, 0, NULL, NULL}}; + + /* identifiers */ + ot->name= "AutoName by Axis"; + ot->idname= "POSE_OT_autoside_names"; + ot->description= "Automatically renames the selected bones according to which side of the target axis they fall on."; + + /* api callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= pose_autoside_names_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* settings */ + RNA_def_enum(ot->srna, "axis", axis_items, 0, "Axis", "Axis tag names with."); +} + +/* ********************************************** */ + /* context active object, or weightpainted object with armature in posemode */ void pose_activate_flipped_bone(Scene *scene) { @@ -1519,90 +1682,270 @@ void pose_activate_flipped_bone(Scene *scene) } } -/* This function pops up the move-to-layer popup widgets when the user - * presses either SHIFT-MKEY or MKEY in PoseMode OR EditMode (for Armatures) - */ -void pose_movetolayer(Scene *scene) + +/* ********************************************** */ + +/* Present a popup to get the layers that should be used */ +// TODO: move to wm? +static uiBlock *wm_layers_select_create_menu(bContext *C, ARegion *ar, void *arg_op) { - Object *obedit= scene->obedit; // XXX context - Object *ob= OBACT; - bArmature *arm; - short lay= 0; - short shift= 0; // XXX + wmOperator *op= arg_op; + uiBlock *block; + uiLayout *layout; + uiStyle *style= U.uistyles.first; - if (ob==NULL) return; - arm= ob->data; + block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS); + uiBlockClearFlag(block, UI_BLOCK_LOOP); + uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN); - if (shift) { - /* armature layers */ - lay= arm->layer; - if ( movetolayer_short_buts(&lay, "Armature Layers")==0 ) return; - if (lay==0) return; - arm->layer= lay; - if(ob->pose) - ob->pose->proxy_layer= lay; + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 150, 20, style); + uiItemL(layout, op->type->name, 0); + uiTemplateLayers(layout, op->ptr, "layers"); /* must have a property named layers setup */ - } - else if (obedit) { - /* the check for editbone layer moving needs to occur before posemode one to work */ - EditBone *ebo; - EditBone *flipBone; - - for (ebo= arm->edbo->first; ebo; ebo= ebo->next) { - if (arm->layer & ebo->layer) { - if (ebo->flag & BONE_SELECTED) - lay |= ebo->layer; - } - } - if (lay==0) return; + uiPopupBoundsBlock(block, 4.0f, 0, 0); + uiEndBlock(C, block); + + return block; +} + +/* ------------------- */ + +/* Present a popup to get the layers that should be used */ +static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt) +{ + Object *ob= CTX_data_active_object(C); + bArmature *arm= (ob)? ob->data : NULL; + PointerRNA ptr; + int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */ + + /* sanity checking */ + if (arm == NULL) + return OPERATOR_CANCELLED; - if ( movetolayer_short_buts(&lay, "Bone Layers")==0 ) return; - if (lay==0) return; + /* get RNA pointer to armature data to use that to retrieve the layers as ints to init the operator */ + RNA_id_pointer_create((ID *)arm, &ptr); + RNA_boolean_get_array(&ptr, "layer", layers); + RNA_boolean_set_array(op->ptr, "layers", layers); + + /* part to sync with other similar operators... */ + /* pass on operator, so return modal */ + uiPupBlockOperator(C, wm_layers_select_create_menu, op, WM_OP_EXEC_DEFAULT); + return OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH; +} + +/* Set the visible layers for the active armature (edit and pose modes) */ +static int pose_armature_layers_exec (bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_active_object(C); + bArmature *arm= (ob)? ob->data : NULL; + PointerRNA ptr; + int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */ + + /* get the values set in the operator properties */ + RNA_boolean_get_array(op->ptr, "layers", layers); + + /* get pointer for armature, and write data there... */ + RNA_id_pointer_create((ID *)arm, &ptr); + RNA_boolean_set_array(&ptr, "layer", layers); + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); + + return OPERATOR_FINISHED; +} + + +void POSE_OT_armature_layers (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Change Armature Layers"; + ot->idname= "POSE_OT_armature_layers"; + ot->description= "Change the visible armature layers."; + + /* callbacks */ + ot->invoke= pose_armature_layers_invoke; + ot->exec= pose_armature_layers_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_boolean_array(ot->srna, "layers", 16, NULL, "Layers", "Armature layers to make visible."); +} + +void ARMATURE_OT_armature_layers (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Change Armature Layers"; + ot->idname= "ARMATURE_OT_armature_layers"; + ot->description= "Change the visible armature layers."; + + /* callbacks */ + ot->invoke= pose_armature_layers_invoke; + ot->exec= pose_armature_layers_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_boolean_array(ot->srna, "layers", 16, NULL, "Layers", "Armature layers to make visible."); +} + +/* ------------------- */ + +/* Present a popup to get the layers that should be used */ +static int pose_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt) +{ + int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */ + + /* get layers that are active already */ + memset(&layers, 0, sizeof(layers)); /* set all layers to be off by default */ + + CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pchans) + { + short bit; - for (ebo= arm->edbo->first; ebo; ebo= ebo->next) { - if (arm->layer & ebo->layer) { - if (ebo->flag & BONE_SELECTED) { - ebo->layer= lay; - if (arm->flag & ARM_MIRROR_EDIT) { - flipBone = ED_armature_bone_get_mirrored(arm->edbo, ebo); - if (flipBone) - flipBone->layer = lay; - } - } - } + /* loop over the bits for this pchan's layers, adding layers where they're needed */ + for (bit= 0; bit < 16; bit++) { + if (pchan->bone->layer & (1<<bit)) + layers[bit]= 1; } - - BIF_undo_push("Move Bone Layer"); } - else if (ob->flag & OB_POSEMODE) { - /* pose-channel layers */ - bPoseChannel *pchan; - - if (pose_has_protected_selected(ob, 0, 1)) - return; - - for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if (arm->layer & pchan->bone->layer) { - if (pchan->bone->flag & BONE_SELECTED) - lay |= pchan->bone->layer; - } - } - if (lay==0) return; - - if ( movetolayer_short_buts(&lay, "Bone Layers")==0 ) return; - if (lay==0) return; + CTX_DATA_END; + + /* copy layers to operator */ + RNA_boolean_set_array(op->ptr, "layers", layers); + + /* part to sync with other similar operators... */ + /* pass on operator, so return modal */ + uiPupBlockOperator(C, wm_layers_select_create_menu, op, WM_OP_EXEC_DEFAULT); + return OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH; +} + +/* Set the visible layers for the active armature (edit and pose modes) */ +static int pose_bone_layers_exec (bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_active_object(C); + bArmature *arm= (ob)? ob->data : NULL; + PointerRNA ptr; + int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */ + + /* get the values set in the operator properties */ + RNA_boolean_get_array(op->ptr, "layers", layers); + + /* set layers of pchans based on the values set in the operator props */ + CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pchans) + { + /* get pointer for pchan, and write flags this way */ + RNA_pointer_create((ID *)arm, &RNA_Bone, pchan->bone, &ptr); + RNA_boolean_set_array(&ptr, "layer", layers); + } + CTX_DATA_END; + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); + + return OPERATOR_FINISHED; +} + +void POSE_OT_bone_layers (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Change Bone Layers"; + ot->idname= "POSE_OT_bone_layers"; + ot->description= "Change the layers that the selected bones belong to."; + + /* callbacks */ + ot->invoke= pose_bone_layers_invoke; + ot->exec= pose_bone_layers_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_boolean_array(ot->srna, "layers", 16, NULL, "Layers", "Armature layers that bone belongs to."); +} + +/* ------------------- */ + +/* Present a popup to get the layers that should be used */ +static int armature_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt) +{ + int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */ + + /* get layers that are active already */ + memset(&layers, 0, sizeof(layers)); /* set all layers to be off by default */ + + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) + { + short bit; - for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { - if (arm->layer & pchan->bone->layer) { - if (pchan->bone->flag & BONE_SELECTED) - pchan->bone->layer= lay; - } + /* loop over the bits for this pchan's layers, adding layers where they're needed */ + for (bit= 0; bit < 16; bit++) { + if (ebone->layer & (1<<bit)) + layers[bit]= 1; } - - BIF_undo_push("Move Bone Layer"); } + CTX_DATA_END; + + /* copy layers to operator */ + RNA_boolean_set_array(op->ptr, "layers", layers); + + /* part to sync with other similar operators... */ + /* pass on operator, so return modal */ + uiPupBlockOperator(C, wm_layers_select_create_menu, op, WM_OP_EXEC_DEFAULT); + return OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH; +} + +/* Set the visible layers for the active armature (edit and pose modes) */ +static int armature_bone_layers_exec (bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_active_object(C); + bArmature *arm= (ob)? ob->data : NULL; + PointerRNA ptr; + int layers[16]; /* hardcoded for now - we can only have 16 armature layers, so this should be fine... */ + + /* get the values set in the operator properties */ + RNA_boolean_get_array(op->ptr, "layers", layers); + + /* set layers of pchans based on the values set in the operator props */ + CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) + { + /* get pointer for pchan, and write flags this way */ + RNA_pointer_create((ID *)arm, &RNA_EditBone, ebone, &ptr); + RNA_boolean_set_array(&ptr, "layers", layers); + } + CTX_DATA_END; + + /* note, notifier might evolve */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); + + return OPERATOR_FINISHED; +} + +void ARMATURE_OT_bone_layers (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Change Bone Layers"; + ot->idname= "ARMATURE_OT_bone_layers"; + ot->description= "Change the layers that the selected bones belong to."; + + /* callbacks */ + ot->invoke= armature_bone_layers_invoke; + ot->exec= armature_bone_layers_exec; + ot->poll= ED_operator_editarmature; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_boolean_array(ot->srna, "layers", 16, NULL, "Layers", "Armature layers that bone belongs to."); } + #if 0 // XXX old sys /* for use with pose_relax only */ diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 2bf5d357e5c..28a9d3ac7c9 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -4724,11 +4724,13 @@ Nurb *add_nurbs_primitive(bContext *C, int type, int newname) Mat3MulMat3(cmat, imat, mat); Mat3Inv(imat, cmat); } + else + Mat3One(imat); + setflagsNurb(editnurb, 0); } - else { + else return NULL; - } /* these types call this function to return a Nurb */ if (stype!=CU_PRIM_TUBE && stype!=CU_PRIM_DONUT) { diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c index 9f2bd6f26f9..46be95063ec 100644 --- a/source/blender/editors/curve/editfont.c +++ b/source/blender/editors/curve/editfont.c @@ -416,7 +416,7 @@ void FONT_OT_file_paste(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of text file to load."); + WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE); } /******************* paste buffer operator ********************/ diff --git a/source/blender/editors/datafiles/B.blend.c b/source/blender/editors/datafiles/B.blend.c index 1a77d99ef2f..980a9ee1697 100644 --- a/source/blender/editors/datafiles/B.blend.c +++ b/source/blender/editors/datafiles/B.blend.c @@ -1,1199 +1,854 @@ /* DataToC output of file <B_blend> */ -int datatoc_B_blend_size= 106008; +int datatoc_B_blend_size= 94308; char datatoc_B_blend[]= { - 66, 76, 69, 78, 68, 69, 82, 95,118, 50, 53, 48, 82, 69, 78, 68, 32, 0, 0, 0, 64,245, 34, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 32, 0, 0, 0,208,244, 34, 0,186, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 48, - 0, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1,144,247, 75, 1, 8,120, 76, 1, 0, 16, 0, 0,128, 32, 4, 0, 87, 77, 0, 0, -140, 0, 0, 0, 8,246, 75, 1, 76, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 77, 87,105,110, 77, 97,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, - 0, 0, 0, 0,200,246, 75, 1,200,246, 75, 1,200,246, 75, 1,200,246, 75, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,144, 73, 1, 0,116, 74, 1, 68, 65, 84, 65, -148, 0, 0, 0,200,246, 75, 1, 77, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,243, 75, 1, 1, 0, 0, 0, - 0, 0, 0, 0,144,247, 75, 1, 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,255, 23, 0,128, 7,157, 4, 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 1, 0, - 0, 0, 0, 0, 48,201, 73, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,176,159, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 56, 74,156, 3,208, 73,156, 3,208,171, 73, 1, 40,117, 73, 1,224, 89, 74, 1, 96,120, 74, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,144,247, 75, 1,178, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 66, 76, 69, 78, + 68, 69, 82, 45,118, 50, 53, 48, 82, 69, 78, 68, 32, 0, 0, 0, 80,187,118,198,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 71, 76, 79, 66, 40, 0, 0, 0, 64,187,118,198,255,127, 0, 0,185, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 48, 0, 0, 0, 0, +250, 0, 0, 0, 1, 0, 0, 1,208,233, 90, 2, 0, 0, 0, 0, 96,130, 91, 2, 0, 0, 0, 0, 0, 16, 0, 0,128, 32, 4, 0, + 87, 77, 0, 0,224, 0, 0, 0,144,231, 90, 2, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,110, 77, 97,110, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +176,232, 90, 2, 0, 0, 0, 0,176,232, 90, 2, 0, 0, 0, 0,176,232, 90, 2, 0, 0, 0, 0,176,232, 90, 2, 0, 0, 0, 0, + 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,144,131,100, 2, 0, 0, 0, 0,176,167,177, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, +176,232, 90, 2, 0, 0, 0, 0, 76, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +224,186, 91, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208,233, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +115, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 30, 0,118, 7, 97, 4, 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0,131,100, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 14,119, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,224,180, 2, 0, 0, 0, 0,224,224,180, 2, 0, 0, 0, 0, + 64,132,100, 2, 0, 0, 0, 0,176,133,100, 2, 0, 0, 0, 0,112,134,100, 2, 0, 0, 0, 0,144,191,100, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,208,233, 90, 2, 0, 0, 0, 0, +179, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,248, 75, 1,248,251, 75, 1, 64,252, 75, 1, 8, 1, 76, 1, 80, 1, 76, 1, -248,105, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8,120, 76, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 80,248, 75, 1,179, 0, 0, 0, 1, 0, 0, 0,152,248, 75, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,248, 75, 1,179, 0, 0, 0, 1, 0, 0, 0, -224,248, 75, 1, 80,248, 75, 1, 0, 0, 0, 0, 0, 0,157, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,224,248, 75, 1, -179, 0, 0, 0, 1, 0, 0, 0, 40,249, 75, 1,152,248, 75, 1, 0, 0, 0, 0,128, 7,157, 4, 0, 0, 0, 0, 68, 65, 84, 65, - 20, 0, 0, 0, 40,249, 75, 1,179, 0, 0, 0, 1, 0, 0, 0,112,249, 75, 1,224,248, 75, 1, 0, 0, 0, 0,128, 7, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112,249, 75, 1,179, 0, 0, 0, 1, 0, 0, 0,184,249, 75, 1, 40,249, 75, 1, - 0, 0, 0, 0, 0, 0,130, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,184,249, 75, 1,179, 0, 0, 0, 1, 0, 0, 0, - 0,250, 75, 1,112,249, 75, 1, 0, 0, 0, 0,128, 7,130, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 0,250, 75, 1, -179, 0, 0, 0, 1, 0, 0, 0, 72,250, 75, 1,184,249, 75, 1, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 20, 0, 0, 0, 72,250, 75, 1,179, 0, 0, 0, 1, 0, 0, 0,144,250, 75, 1, 0,250, 75, 1, 0, 0, 0, 0,128, 7, 80, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144,250, 75, 1,179, 0, 0, 0, 1, 0, 0, 0,216,250, 75, 1, 72,250, 75, 1, - 0, 0, 0, 0, 20, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,216,250, 75, 1,179, 0, 0, 0, 1, 0, 0, 0, - 32,251, 75, 1,144,250, 75, 1, 0, 0, 0, 0, 20, 6,130, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32,251, 75, 1, -179, 0, 0, 0, 1, 0, 0, 0,104,251, 75, 1,216,250, 75, 1, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 20, 0, 0, 0,104,251, 75, 1,179, 0, 0, 0, 1, 0, 0, 0,176,251, 75, 1, 32,251, 75, 1, 0, 0, 0, 0, 20, 6,100, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176,251, 75, 1,179, 0, 0, 0, 1, 0, 0, 0,248,251, 75, 1,104,251, 75, 1, - 0, 0, 0, 0, 20, 6,124, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,251, 75, 1,179, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,176,251, 75, 1, 0, 0, 0, 0,128, 7,124, 3, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,252, 75, 1, -180, 0, 0, 0, 1, 0, 0, 0,136,252, 75, 1, 0, 0, 0, 0,152,248, 75, 1,224,248, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,136,252, 75, 1,180, 0, 0, 0, 1, 0, 0, 0,208,252, 75, 1, 64,252, 75, 1,152,248, 75, 1, -112,249, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,252, 75, 1,180, 0, 0, 0, 1, 0, 0, 0, - 24,253, 75, 1,136,252, 75, 1,224,248, 75, 1,184,249, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 24,253, 75, 1,180, 0, 0, 0, 1, 0, 0, 0, 96,253, 75, 1,208,252, 75, 1,112,249, 75, 1,184,249, 75, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,253, 75, 1,180, 0, 0, 0, 1, 0, 0, 0,168,253, 75, 1, 24,253, 75, 1, - 80,248, 75, 1,144,250, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,253, 75, 1,180, 0, 0, 0, - 1, 0, 0, 0,240,253, 75, 1, 96,253, 75, 1, 40,249, 75, 1,144,250, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0,240,253, 75, 1,180, 0, 0, 0, 1, 0, 0, 0, 56,254, 75, 1,168,253, 75, 1,112,249, 75, 1,216,250, 75, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,254, 75, 1,180, 0, 0, 0, 1, 0, 0, 0,128,254, 75, 1, -240,253, 75, 1,184,249, 75, 1,216,250, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128,254, 75, 1, -180, 0, 0, 0, 1, 0, 0, 0,200,254, 75, 1, 56,254, 75, 1, 80,248, 75, 1, 32,251, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0,200,254, 75, 1,180, 0, 0, 0, 1, 0, 0, 0, 16,255, 75, 1,128,254, 75, 1,112,249, 75, 1, - 32,251, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,255, 75, 1,180, 0, 0, 0, 1, 0, 0, 0, - 88,255, 75, 1,200,254, 75, 1,216,250, 75, 1,104,251, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, - 88,255, 75, 1,180, 0, 0, 0, 1, 0, 0, 0,160,255, 75, 1, 16,255, 75, 1,144,250, 75, 1,104,251, 75, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,255, 75, 1,180, 0, 0, 0, 1, 0, 0, 0,232,255, 75, 1, 88,255, 75, 1, - 32,251, 75, 1,104,251, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232,255, 75, 1,180, 0, 0, 0, - 1, 0, 0, 0, 48, 0, 76, 1,160,255, 75, 1,144,250, 75, 1,176,251, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 24, 0, 0, 0, 48, 0, 76, 1,180, 0, 0, 0, 1, 0, 0, 0,120, 0, 76, 1,232,255, 75, 1,216,250, 75, 1,176,251, 75, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120, 0, 76, 1,180, 0, 0, 0, 1, 0, 0, 0,192, 0, 76, 1, - 48, 0, 76, 1,184,249, 75, 1,248,251, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192, 0, 76, 1, -180, 0, 0, 0, 1, 0, 0, 0, 8, 1, 76, 1,120, 0, 76, 1, 40,249, 75, 1,248,251, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 24, 0, 0, 0, 8, 1, 76, 1,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,192, 0, 76, 1,176,251, 75, 1, -248,251, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0, 80, 1, 76, 1,184, 0, 0, 0, 1, 0, 0, 0, - 48, 4, 76, 1, 0, 0, 0, 0,112,249, 75, 1,152,248, 75, 1,224,248, 75, 1,184,249, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, -128, 7, 0, 0,131, 4, 0, 0,157, 4, 0, 0, 7, 7,129, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,193, 65, 1,168,119, 76, 1,168,119, 76, 1,240, 1, 76, 1, 16, 3, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0,152,171, 77, 1,216,170, 77, 1, 68, 65, 84, 65,236, 0, 0, 0,240, 1, 76, 1,185, 0, 0, 0, - 1, 0, 0, 0, 16, 3, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,103, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 32,240, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, - 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0,129, 7, 26, 0,129, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,131, 4, 0, 0, -156, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 7, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,195, 65, 1,224, 91,165, 3,224, 91,165, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 72,189,163, 3,248, 92, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 16, 3, 76, 1,185, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,240, 1, 76, 1, 0, 0, 0, 0, 0, 32,240, 68, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,110, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, - 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,157, 4, 0, 0, -157, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144,194, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0, 48, 4, 76, 1,184, 0, 0, 0, - 1, 0, 0, 0,168, 80, 76, 1, 80, 1, 76, 1,144,250, 75, 1,176,251, 75, 1,248,251, 75, 1, 40,249, 75, 1, 0, 0, 0, 0, - 21, 6, 0, 0,128, 7, 0, 0, 0, 0, 0, 0,123, 3, 0, 0, 4, 4,108, 1,124, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,191, 65, 1, 40, 73, 76, 1,136, 79, 76, 1,208, 4, 76, 1, -240, 5, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0,168,115, 73, 1,208, 93, 74, 1, 68, 65, 84, 65,236, 0, 0, 0,208, 4, 76, 1, -185, 0, 0, 0, 1, 0, 0, 0,240, 5, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,182, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,108, 1, 26, 0,108, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 6, 0, 0,128, 7, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 1, 26, 0, 3, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,193, 65, 1, 80,195,156, 3, 80,195,156, 3, 0, 0, 0, 0, - 0, 0, 0, 0,128, 95, 74, 1,112, 96, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,240, 5, 76, 1, -185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,208, 4, 76, 1, 0, 0, 0, 0, 0,128,142, 67, 0, 64,112,196, 0, 0, 0, 0, - 0, 0, 0, 0,210,113,151, 67,236, 12, 57,196,168, 20,236,181, 91, 1, 0, 0,108, 1, 0, 0, 18, 0, 0, 0, 97, 3, 0, 0, - 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 90, 1, 0, 0, 18, 0, 0, 0, 97, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 3, 0, - 2, 0, 0, 4, 6, 0,108, 1, 98, 3, 91, 1, 80, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 6, 0, 0,128, 7, 0, 0, - 26, 0, 0, 0,123, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 1, 98, 3, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,192, 65, 1,160, 57,155, 3,240, 44,164, 3, 16, 7, 76, 1, -192, 71, 76, 1, 56, 98, 74, 1, 40, 99, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 16, 7, 76, 1, -181, 0, 0, 0, 1, 0, 0, 0,120, 8, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,255, 71, 1,176, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0,120, 8, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,224, 9, 76, 1, 16, 7, 76, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 88,254, 71, 1,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,224, 9, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, - 72, 11, 76, 1,120, 8, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,253, 71, 1, 80, 0, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, - 72, 11, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,176, 12, 76, 1,224, 9, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100, -105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100, -105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,253, - 71, 1, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,176, 12, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 24, 14, 76, 1, 72, 11, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 71, 1,174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 24, 14, 76, 1,181, 0, 0, 0, - 1, 0, 0, 0,128, 15, 76, 1,176, 12, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,251, 71, 1,212, 0, 20, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 56, 1, 0, 0,128, 15, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,232, 16, 76, 1, 24, 14, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 76,101,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 76,101,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 81,255, 74, 1,151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,232, 16, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 80, 18, 76, 1, -128, 15, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141,254, 74, 1,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 80, 18, 76, 1, -181, 0, 0, 0, 1, 0, 0, 0,184, 19, 76, 1,232, 16, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,255, 74, 1,136, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0,184, 19, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 32, 21, 76, 1, 80, 18, 76, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 87,111,114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87,111,114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,247,254, 74, 1, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 32, 21, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, -136, 22, 76, 1,184, 19, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 65,109, 98,105,101,110,116, 32, 79, 99, 99,108,117,115,105,111, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,109, 98,105,101,110,116, 32, 79, 99, 99,108,117,115,105,111, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43,254, 74, 1,180, 0, 20, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, -136, 22, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,240, 23, 76, 1, 32, 21, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 77,105,115,116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,105,115,116, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,253, - 74, 1,107, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,240, 23, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 88, 25, 76, 1,136, 22, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,253, 74, 1, 60, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 88, 25, 76, 1,181, 0, 0, 0, - 1, 0, 0, 0,192, 26, 76, 1,240, 23, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108,111,114, 32, 67,111,114,114,101, 99, -116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108,111,114, 32, 67,111,114,114,101, 99, -116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,253, 74, 1, 36, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 56, 1, 0, 0,192, 26, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 40, 28, 76, 1, 88, 25, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 83,255, 74, 1,149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 40, 28, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,144, 29, 76, 1, -192, 26, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,254, 74, 1,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,144, 29, 76, 1, -181, 0, 0, 0, 1, 0, 0, 0,248, 30, 76, 1, 40, 28, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 83,117,114,102, 97, 99,101, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,117,114,102, 97, 99,101, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,149,255, 74, 1, 83, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0,248, 30, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 96, 32, 76, 1,144, 29, 76, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 67,111,110,115,116,114, 97,105,110,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 67,111,110,115,116,114, 97,105,110,116,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,196,255, 74, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 96, 32, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, -200, 33, 76, 1,248, 30, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,255, 74, 1, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, -200, 33, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 48, 35, 76, 1, 96, 32, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,111,117, -112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,111,117, -112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,255, - 74, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 48, 35, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,152, 36, 76, 1,200, 33, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 68,117,112,108,105, 99, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68,117,112,108,105, 99, 97,116,105,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,254, 74, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,152, 36, 76, 1,181, 0, 0, 0, - 1, 0, 0, 0, 0, 38, 76, 1, 48, 35, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,105,109, 97,116,105,111,110, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,105,109, 97,116,105,111,110, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167,253, 74, 1,146, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 56, 1, 0, 0, 0, 38, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,104, 39, 76, 1,152, 36, 76, 1,168,192, 65, 1, 0, 0, 0, 0, - 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,234, 90, 2, 0, 0, 0, 0,192,239, 90, 2, 0, 0, 0, 0, + 32,240, 90, 2, 0, 0, 0, 0,144,247, 90, 2, 0, 0, 0, 0, 0,248, 90, 2, 0, 0, 0, 0,160,111, 91, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,130, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80,149,150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +224,234, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 64,235, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 64,235, 90, 2, 0, 0, 0, 0, +180, 0, 0, 0, 1, 0, 0, 0,160,235, 90, 2, 0, 0, 0, 0,224,234, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,160,235, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, + 0,236, 90, 2, 0, 0, 0, 0, 64,235, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 0,236, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 96,236, 90, 2, 0, 0, 0, 0, +160,235, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 96,236, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0,192,236, 90, 2, 0, 0, 0, 0, 0,236, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,192,236, 90, 2, 0, 0, 0, 0, +180, 0, 0, 0, 1, 0, 0, 0, 32,237, 90, 2, 0, 0, 0, 0, 96,236, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 32,237, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, +128,237, 90, 2, 0, 0, 0, 0,192,236, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0,128,237, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0,224,237, 90, 2, 0, 0, 0, 0, + 32,237, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 80, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, +224,237, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 64,238, 90, 2, 0, 0, 0, 0,128,237, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 64,238, 90, 2, 0, 0, 0, 0, +180, 0, 0, 0, 1, 0, 0, 0,160,238, 90, 2, 0, 0, 0, 0,224,237, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,160,238, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, + 0,239, 90, 2, 0, 0, 0, 0, 64,238, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 0, 0, 0, 0,239, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0, 96,239, 90, 2, 0, 0, 0, 0, +160,238, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, + 96,239, 90, 2, 0, 0, 0, 0,180, 0, 0, 0, 1, 0, 0, 0,192,239, 90, 2, 0, 0, 0, 0, 0,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 80, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,192,239, 90, 2, 0, 0, 0, 0, +180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,239, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +118, 7, 80, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32,240, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +144,240, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,235, 90, 2, 0, 0, 0, 0,160,235, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,144,240, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, + 0,241, 90, 2, 0, 0, 0, 0, 32,240, 90, 2, 0, 0, 0, 0, 64,235, 90, 2, 0, 0, 0, 0, 96,236, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 0,241, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +112,241, 90, 2, 0, 0, 0, 0,144,240, 90, 2, 0, 0, 0, 0,160,235, 90, 2, 0, 0, 0, 0,192,236, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,112,241, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +224,241, 90, 2, 0, 0, 0, 0, 0,241, 90, 2, 0, 0, 0, 0, 96,236, 90, 2, 0, 0, 0, 0,192,236, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,224,241, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, + 80,242, 90, 2, 0, 0, 0, 0,112,241, 90, 2, 0, 0, 0, 0,224,234, 90, 2, 0, 0, 0, 0,224,237, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 80,242, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +192,242, 90, 2, 0, 0, 0, 0,224,241, 90, 2, 0, 0, 0, 0, 0,236, 90, 2, 0, 0, 0, 0,224,237, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,242, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, + 48,243, 90, 2, 0, 0, 0, 0, 80,242, 90, 2, 0, 0, 0, 0, 96,236, 90, 2, 0, 0, 0, 0, 64,238, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 48,243, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +160,243, 90, 2, 0, 0, 0, 0,192,242, 90, 2, 0, 0, 0, 0,192,236, 90, 2, 0, 0, 0, 0, 64,238, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160,243, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, + 16,244, 90, 2, 0, 0, 0, 0, 48,243, 90, 2, 0, 0, 0, 0,224,234, 90, 2, 0, 0, 0, 0,160,238, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 16,244, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +128,244, 90, 2, 0, 0, 0, 0,160,243, 90, 2, 0, 0, 0, 0, 96,236, 90, 2, 0, 0, 0, 0,160,238, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128,244, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +240,244, 90, 2, 0, 0, 0, 0, 16,244, 90, 2, 0, 0, 0, 0, 64,238, 90, 2, 0, 0, 0, 0, 0,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,240,244, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, + 96,245, 90, 2, 0, 0, 0, 0,128,244, 90, 2, 0, 0, 0, 0,224,237, 90, 2, 0, 0, 0, 0, 0,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96,245, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +208,245, 90, 2, 0, 0, 0, 0,240,244, 90, 2, 0, 0, 0, 0,160,238, 90, 2, 0, 0, 0, 0, 0,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,208,245, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, + 64,246, 90, 2, 0, 0, 0, 0, 96,245, 90, 2, 0, 0, 0, 0,224,237, 90, 2, 0, 0, 0, 0, 96,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,246, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +176,246, 90, 2, 0, 0, 0, 0,208,245, 90, 2, 0, 0, 0, 0, 64,238, 90, 2, 0, 0, 0, 0, 96,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,176,246, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, + 32,247, 90, 2, 0, 0, 0, 0, 64,246, 90, 2, 0, 0, 0, 0,192,236, 90, 2, 0, 0, 0, 0,192,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32,247, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, +144,247, 90, 2, 0, 0, 0, 0,176,246, 90, 2, 0, 0, 0, 0, 0,236, 90, 2, 0, 0, 0, 0,192,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,144,247, 90, 2, 0, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32,247, 90, 2, 0, 0, 0, 0, 96,239, 90, 2, 0, 0, 0, 0,192,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 0,248, 90, 2, 0, 0, 0, 0,183, 0, 0, 0, 1, 0, 0, 0, +192,251, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,236, 90, 2, 0, 0, 0, 0, 64,235, 90, 2, 0, 0, 0, 0, +160,235, 90, 2, 0, 0, 0, 0,192,236, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, + 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0,112,153, 76, 2, 0, 0, 0, 0, +208,129, 91, 2, 0, 0, 0, 0,208,129, 91, 2, 0, 0, 0, 0,224,248, 90, 2, 0, 0, 0, 0, 80,250, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 78,100, 2, 0, 0, 0, 0, 64,153,118, 2, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,224,248, 90, 2, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 80,250, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,106, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, + 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, + 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +119, 7, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,155, 76, 2, 0, 0, 0, 0, + 96,164,100, 2, 0, 0, 0, 0, 96,164,100, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +208,138,100, 2, 0, 0, 0, 0, 64,140,100, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0, 80,250, 90, 2, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +224,248, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,240, 68, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 69, + 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, + 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 6, 0,129, 7, + 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,154, 76, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,160, 0, 0, 0,192,251, 90, 2, 0, 0, 0, 0,183, 0, 0, 0, 1, 0, 0, 0,176, 81, 91, 2, 0, 0, 0, 0, + 0,248, 90, 2, 0, 0, 0, 0,224,237, 90, 2, 0, 0, 0, 0, 96,239, 90, 2, 0, 0, 0, 0,192,239, 90, 2, 0, 0, 0, 0, + 0,236, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 79, 3, 0, 0, + 4, 4,106, 1, 80, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,149, 76, 2, 0, 0, 0, 0,240, 72, 91, 2, 0, 0, 0, 0, + 80, 80, 91, 2, 0, 0, 0, 0,160,252, 90, 2, 0, 0, 0, 0, 16,254, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,160,158,118, 2, 0, 0, 0, 0, 96,169,118, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +160,252, 90, 2, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 16,254, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,193, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,181, 67, 0, 0, 0, 0, 0, 0,248, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,105, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,106, 1, 31, 0,106, 1, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 6, 0, 0,118, 7, 0, 0, + 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,106, 1, 31, 0, 3, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,152, 76, 2, 0, 0, 0, 0,112,176,178, 2, 0, 0, 0, 0, +112,176,178, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,143,100, 2, 0, 0, 0, 0, + 32,146,100, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 16,254, 90, 2, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,252, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0,128,172, 67, 0,192, 71,196, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,172, 67, 0,192, 71,196, 0, 0, 0, 0, + 89, 1, 0, 0,106, 1, 0, 0, 18, 0, 0, 0, 48, 3, 0, 0, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 88, 1, 0, 0, 18, 0, 0, 0, 48, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,106, 1, 49, 3, 89, 1, 31, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,160, 90,119, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 6, 0, 0,118, 7, 0, 0, + 31, 0, 0, 0, 79, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,106, 1, 49, 3, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,150, 76, 2, 0, 0, 0, 0,176,210,178, 2, 0, 0, 0, 0, + 96, 53,180, 2, 0, 0, 0, 0,128,255, 90, 2, 0, 0, 0, 0, 96, 55,180, 2, 0, 0, 0, 0, 80,148,100, 2, 0, 0, 0, 0, +240,151,100, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 1, 0, 0, +240, 72, 91, 2, 0, 0, 0, 0,152, 0, 0, 0, 1, 0, 0, 0, 80, 80, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0,128,236,177, 2, 0, 0, 0, 0, +255, 20, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 48, 74, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0,160, 75, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,160, 75, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 74, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16, 77, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65,248, 2, 0, 0, 16, 77, 91, 2, 0, 0, 0, 0, +146, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128, +226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 65, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, +184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, + 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32,193, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, +184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,220,255, 46, 1, 36, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,104, 39, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,208, 40, 76, 1, - 0, 38, 76, 1, 16,176,159, 3, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 46, 1, 61, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 1, 0, 0, 80, 80, 91, 2, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +240, 72, 91, 2, 0, 0, 0, 0, 48, 74, 91, 2, 0, 0, 0, 0,160, 75, 91, 2, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 64,153, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, +159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, +176, 81, 91, 2, 0, 0, 0, 0,183, 0, 0, 0, 1, 0, 0, 0, 0, 94, 91, 2, 0, 0, 0, 0,192,251, 90, 2, 0, 0, 0, 0, +224,234, 90, 2, 0, 0, 0, 0,160,238, 90, 2, 0, 0, 0, 0, 0,239, 90, 2, 0, 0, 0, 0,224,237, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15, 12, 6,100, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0,240,118, 76, 2, 0, 0, 0, 0,112, 85, 91, 2, 0, 0, 0, 0,160, 92, 91, 2, 0, 0, 0, 0, +144, 82, 91, 2, 0, 0, 0, 0, 0, 84, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +192,174,118, 2, 0, 0, 0, 0,176,185,118, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,144, 82, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0, 0, 84, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,104, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,193, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 12, 6, 26, 0, 12, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 26, 0, 5, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,208,120, 76, 2, 0, 0, 0, 0,208,218,179, 2, 0, 0, 0, 0,208,218,179, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,155,100, 2, 0, 0, 0, 0, 96,156,100, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 0, 84, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 82, 91, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, + 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0, + 18, 0, 0, 0, 73, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, + 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 12, 6, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 74, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,224,119, 76, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,158,100, 2, 0, 0, 0, 0,160,163,100, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 0, 0, 0,112, 85, 91, 2, 0, 0, 0, 0, +162, 0, 0, 0, 1, 0, 0, 0,160, 92, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,128, 86, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0,240, 87, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,203, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 88, 6, 26, 0, 88, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,208, 40, 76, 1, -181, 0, 0, 0, 1, 0, 0, 0, 56, 42, 76, 1,104, 39, 76, 1,120,158,159, 3, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, - 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111, -110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189,254, 46, 1,178, 0, - 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,240, 87, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 86, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0, 56, 42, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,160, 43, 76, 1,208, 40, 76, 1, 32,160,159, 3, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,107,254, 46, 1, 58, 0, 24, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 26, 0, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,160, 43, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, - 8, 45, 76, 1, 56, 42, 76, 1,200,161,159, 3, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 89, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65,248, 2, 0, 0, 96, 89, 91, 2, 0, 0, 0, 0, +146, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128, +226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 65, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, +184,175, 31, 65, 0, 0, 32, 65,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 91,138, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, + 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32,193, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, +184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 52,149,147, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,254, 46, 1, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, - 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, - 8, 45, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,112, 46, 76, 1,160, 43, 76, 1, 40, 18,156, 3, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, - 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100, -105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,213,253, - 46, 1,102, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,112, 46, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,216, 47, 76, 1, 8, 45, 76, 1, -208, 19,156, 3, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 1, 0, 0,160, 92, 91, 2, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +112, 85, 91, 2, 0, 0, 0, 0,128, 86, 91, 2, 0, 0, 0, 0,240, 87, 91, 2, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 64,153, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, +159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, + 0, 94, 91, 2, 0, 0, 0, 0,183, 0, 0, 0, 1, 0, 0, 0,160,111, 91, 2, 0, 0, 0, 0,176, 81, 91, 2, 0, 0, 0, 0, +160,238, 90, 2, 0, 0, 0, 0, 96,236, 90, 2, 0, 0, 0, 0, 64,238, 90, 2, 0, 0, 0, 0, 0,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0,101, 0, 0, 0, 69, 4, 0, 0, 1, 1, 12, 6,225, 3, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0,192,121, 76, 2, 0, 0, 0, 0, 64,110, 91, 2, 0, 0, 0, 0, 64,110, 91, 2, 0, 0, 0, 0, +224, 94, 91, 2, 0, 0, 0, 0,144,105, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48,188,118, 2, 0, 0, 0, 0,224,204,118, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,224, 94, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0, 80, 96, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,193, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 12, 6, 26, 0, 12, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0,101, 0, 0, 0,126, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 26, 0, 7, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,112,130, 76, 2, 0, 0, 0, 0,128, 47,182, 2, 0, 0, 0, 0,128, 47,182, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,167,100, 2, 0, 0, 0, 0,192,170,100, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 80, 96, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0,144,105, 91, 2, 0, 0, 0, 0,224, 94, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67, + 0, 64, 55,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0, 41,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, + 0, 0, 0, 0,163, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, + 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 0, 6, 0,220, 0,164, 2,220, 0,164, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0, 11, 6, 0, 0,127, 0, 0, 0, 69, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0,160,123, 76, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +192, 97, 91, 2, 0, 0, 0, 0, 0,104, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,144,105, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 96, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 6, 0, 0,127, 0, 0, 0, 69, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6,199, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,176,122, 76, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,172,100, 2, 0, 0, 0, 0, 96,186,100, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65,248, 2, 0, 0, 0,107, 91, 2, 0, 0, 0, 0, +146, 0, 0, 0, 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 29,224, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, +225,215,163,188, 0, 0, 0, 0,238, 4, 53, 63,186,103, 59,190,247,217, 46, 63, 0, 0, 0, 0,255, 4, 53, 63,126,103, 59, 62, +244,217, 46,191, 0, 0, 0, 0,228, 3, 52, 50,248, 70,119, 63,217,131,132, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +152, 60,138,193, 0, 0,128, 63,236, 4, 53, 63,244, 4, 53, 63, 0, 0, 24, 53, 0, 0, 0, 0,137,103, 59,190,118,103, 59, 62, +227, 70,119, 63, 0, 0, 0, 0,238,217, 46, 63,221,217, 46,191,213,131,132, 62, 0, 0, 0, 0,186,213, 60, 65,168,213, 60,193, +221, 28,143, 64, 0, 0,128, 63,102,253, 69, 63,120, 16,164,190,194,219, 46,191,247,217, 46,191,120,253, 69, 63, 67, 16,164, 62, +191,219, 46, 63,244,217, 46, 63, 67,228, 68, 50,189,122,216, 63, 53,133,132,190,217,131,132,190, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 21,138, 65,152, 60,138, 65, 15,132, 37, 63,166,125, 37, 63, 0, 96,160, 55, 0,128,139, 54, 97, 17,214,189, 77, 17,214, 61, + 92, 58, 13, 63, 0, 0,184,179,168,135, 19,196,155,135, 19, 68, 34,158, 95,195,235, 0, 72,194,116, 93, 19, 68,103, 93, 19,196, + 42, 94, 95, 67,248, 2, 72, 66,238, 4, 53, 63,186,103, 59,190,247,217, 46, 63, 0, 0, 0, 0,255, 4, 53, 63,126,103, 59, 62, +244,217, 46,191, 0, 0, 0, 0,228, 3, 52, 50,248, 70,119, 63,217,131,132, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +152, 60,138,193, 0, 0,128, 63,102,253, 69, 63,120, 16,164,190,194,219, 46,191,247,217, 46,191,120,253, 69, 63, 67, 16,164, 62, +191,219, 46, 63,244,217, 46, 63, 67,228, 68, 50,189,122,216, 63, 53,133,132,190,217,131,132,190, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 21,138, 65,152, 60,138, 65, 55,243,195, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,243,195, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,243,195, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63,122,163, 59, 63,235,250, 15,191,221,141,110,190,230,113,155,190,152, 60,138, 65, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21,212,154, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 32, 1, 0, 0, 64,110, 91, 2, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 64,153, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, +159, 0, 0, 0, 0, 0, 0, 0, 3, 0,255,255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, +160,111, 91, 2, 0, 0, 0, 0,183, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 91, 2, 0, 0, 0, 0, + 96,239, 90, 2, 0, 0, 0, 0, 64,238, 90, 2, 0, 0, 0, 0,192,236, 90, 2, 0, 0, 0, 0,192,239, 90, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13, 6, 0, 0,118, 7, 0, 0, 81, 3, 0, 0, 69, 4, 0, 0, 3, 3,106, 1,245, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 32,116, 76, 2, 0, 0, 0, 0, 96,115, 91, 2, 0, 0, 0, 0,112,128, 91, 2, 0, 0, 0, 0, +128,112, 91, 2, 0, 0, 0, 0,240,113, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96,207,118, 2, 0, 0, 0, 0,144, 82,119, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,128,112, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0,240,113, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,181, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 1, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, + 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,106, 1, 26, 0,106, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 6, 0, 0,118, 7, 0, 0, 81, 3, 0, 0,106, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,106, 1, 26, 0, 9, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 76, 2, 0, 0, 0, 0,128, 5,182, 2, 0, 0, 0, 0,128, 5,182, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,190,100, 2, 0, 0, 0, 0,208,190,100, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,240,113, 91, 2, 0, 0, 0, 0, +184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,112, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67, + 0, 0,194,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,172, 67, 0, 0, 73,195, 0, 0, 0, 0, 89, 1, 0, 0,106, 1, 0, 0, + 18, 0, 0, 0,218, 0, 0, 0, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 88, 1, 0, 0, + 18, 0, 0, 0,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 18, 0, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,106, 1,219, 0, 89, 1,201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 6, 0, 0,118, 7, 0, 0,107, 3, 0, 0, 69, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,106, 1,219, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16,117, 76, 2, 0, 0, 0, 0,192, 43,182, 2, 0, 0, 0, 0,192, 43,182, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193,100, 2, 0, 0, 0, 0, 48,195,100, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 96,115, 91, 2, 0, 0, 0, 0, +156, 0, 0, 0, 1, 0, 0, 0, 16,121, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,106,253, 46, 1, 83, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,216, 47, 76, 1,181, 0, 0, 0, - 1, 0, 0, 0, 64, 49, 76, 1,112, 46, 76, 1,120, 21,156, 3, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101, -114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101, -114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,253, 46, 1,123, 0, 0, 0, 0, 0, - 4, 0, 6, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 8,182, 2, 0, 0, 0, 0, +224, 8,182, 2, 0, 0, 0, 0,208,116, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 56, 1, 0, 0, 64, 49, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,168, 50, 76, 1,216, 47, 76, 1,184,224,159, 3, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,208,116, 91, 2, 0, 0, 0, 0, +207, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 32,117, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0, + 32,117, 91, 2, 0, 0, 0, 0,206, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 96,130, 91, 2, 0, 0, 0, 0, + 19, 0, 0, 0, 1, 0, 1, 0, 96,130, 91, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0, 96,130, 91, 2, 0, 0, 0, 0, + 21, 0, 1, 0, 1, 0, 1, 0, 96,130, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 48,145, 91, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,176,157, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,128,173, 91, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0,128,167, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,224,171, 91, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 16,163, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,176,140, 91, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 64,153, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,208,139, 91, 2, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0, 48,118, 91, 2, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0,160,119, 91, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 55, 0, 0, 67, 67, + 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, + 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,195, 0, + 26, 0,195, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 4, 0, 0,247, 4, 0, 0, 69, 2, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +195, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 1, 0, 0,160,119, 91, 2, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48,118, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 67, 0,192,116,196, 0, 0, 0, 0, 0, 0, 0, 0,205, 85,150, 67, +223,204, 35,196, 26, 85,207,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 4, 6, 0,195, 0, +156, 0,195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 4, 0, 0,247, 4, 0, 0, 95, 2, 0, 0,250, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 33,253, 46, 1,108, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 0, 1, 0, 0, 16,121, 91, 2, 0, 0, 0, 0,152, 0, 0, 0, 1, 0, 0, 0,112,128, 91, 2, 0, 0, 0, 0, + 96,115, 91, 2, 0, 0, 0, 0, 48,118, 91, 2, 0, 0, 0, 0,160,119, 91, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,168, 50, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 16, 52, 76, 1, - 64, 49, 76, 1, 8,228,159, 3, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,252, 46, 1,215, 0, 24, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, - 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 16, 52, 76, 1, -181, 0, 0, 0, 1, 0, 0, 0,120, 53, 76, 1,168, 50, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, - 99,111,110,116,101,120,116, 95,108, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, - 99,111,110,116,101,120,116, 95,108, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, + 80,122, 91, 2, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0,192,123, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, + 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,255, 46, 1, 36, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, +192,123, 91, 2, 0, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,122, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0,120, 53, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,224, 54, 76, 1, 16, 52, 76, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 80,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, + 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24,255, 46, 1,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,125, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65,248, 2, 0, 0, + 48,125, 91, 2, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, + 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, + 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, + 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, + 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,224, 54, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, - 72, 56, 76, 1,120, 53, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,108, 97,109,112, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,108, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,254, 46, 1,149, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, - 72, 56, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,176, 57, 76, 1,224, 54, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100, -111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,253, - 46, 1,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 1, 0, 0,112,128, 91, 2, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 16,121, 91, 2, 0, 0, 0, 0, 80,122, 91, 2, 0, 0, 0, 0,192,123, 91, 2, 0, 0, 0, 0, + 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 64,153, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,176, 57, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 24, 59, 76, 1, 72, 56, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, + 83, 67, 0, 0,192, 5, 0, 0, 96,130, 91, 2, 0, 0, 0, 0,144, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 83, 99,101,110,101, 0, +116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 64,153, 91, 2, 0, 0, 0, 0, 48,145, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96,136, 91, 2, 0, 0, 0, 0, 64,137, 91, 2, 0, 0, 0, 0, 96,136, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,137, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,255, 46, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, +250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 6, 0, 25, 0,141, 0,128, 7, 56, 4, 8, 0, 8, 0, 0, 0, 24, 0, 17, 0, 0, 0, 0, 0, 90, 0, 0, 0, + 0, 0, 0, 0, 81, 0, 0, 0, 23, 0, 33, 0, 0, 0,128, 0, 0, 0, 8, 0, 24, 0, 10, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48,139, 91, 2, 0, 0, 0, 0, 48,139, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, + 0, 0,200, 66, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, + 5, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 24, 59, 76, 1,181, 0, 0, 0, - 1, 0, 0, 0,128, 60, 76, 1,176, 57, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,101,115,104, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 98, 97, 99,107, 98,117, +102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,255, 46, 1, 94, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 56, 1, 0, 0,128, 60, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,232, 61, 76, 1, 24, 59, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 95, 80, 84, 95,109, 97,116,101,114,105, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 95, 80, 84, 95,109, 97,116,101,114,105, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 77, 97,116,101,114,105, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,172,254, 46, 1,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,232, 61, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 80, 63, 76, 1, -128, 60, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95,103,114,111,117,112, -115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95,103,114,111,117,112, -115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 71,114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22,254, 46, 1,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 80, 63, 76, 1, -181, 0, 0, 0, 1, 0, 0, 0,184, 64, 76, 1,232, 61, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, -115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, -115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,112,101, 32, 75,101, -121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,253, 46, 1,126, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, + 6, 0, 0, 0, 16, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,173, 2, 95, 0,154,153,217, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0,184, 64, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 32, 66, 76, 1, 80, 63, 76, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,176,191, 66, 2, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +205,204, 28, 65, 0, 0, 0, 0, 32, 0, 0, 0,128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,128, 7, 56, 4, 68, 65, 84, 65, 40, 0, 0, 0, + 96,136, 91, 2, 0, 0, 0, 0,124, 0, 0, 0, 1, 0, 0, 0,208,136, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 6, 3,227, 1,176,157, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, +208,136, 91, 2, 0, 0, 0, 0,124, 0, 0, 0, 1, 0, 0, 0, 64,137, 91, 2, 0, 0, 0, 0, 96,136, 91, 2, 0, 0, 0, 0, + 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0,228, 3, 33, 3, 16,163, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, + 64,137, 91, 2, 0, 0, 0, 0,124, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,136, 91, 2, 0, 0, 0, 0, + 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 97, 3, 61, 3, 64,153, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, +176,137, 91, 2, 0, 0, 0, 0,142, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 1, 0,205,204, 76, 63, 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63, +111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0, 32, 0, 32, 0, 32, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0,100, 0, 10, 0, 0, 0, + 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, + 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10,215, 35, 60,205,204,204, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 0,205,204,204, 61,205,204,204, 61, +102,102,166, 63, 0, 0,192, 63, 0, 0,240, 65, 72,225,122, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 67, 2, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 0, 0, 0, 48,139, 91, 2, 0, 0, 0, 0, +129, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 32, 82,101,110,100,101,114, + 76, 97,121,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,255,255, 15, 0, 0, 0, 0, 0,255,127, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, + 67, 65, 0, 0,152, 0, 0, 0,208,139, 91, 2, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, + 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 63,145,137, 68, 66,205,204,204, 61, 0, 0,200, 66, 0, 0, 12, 66, +161, 14,234, 64, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,232, 1, 0, 0,176,140, 91, 2, 0, 0, 0, 0, + 39, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, +224,142, 91, 2, 0, 0, 0, 0, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, + 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, +111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 85, 86, 32, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,234,252, 46, 1,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 32, 66, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, -136, 67, 76, 1,184, 64, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95, 99, -111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95, 99, -111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 67,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,252, 46, 1,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, -136, 67, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,240, 68, 76, 1, 32, 66, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 95, 80, 84, 95, 99, 97,109,101,114, 97,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 95, 80, 84, 95, 99, 97,109,101,114, 97,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,112, -108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,255, - 46, 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,192,144, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,224,142, 91, 2, 0, 0, 0, 0, + 54, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, +243, 4, 53,191,242, 4, 53, 63,242, 4, 53,191,243, 4, 53, 63, 96,144, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,240, 68, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 88, 70, 76, 1,136, 67, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95, 99, 97,109,101,114, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95, 99, 97,109,101,114, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65, 24, 0, 0, 0, 96,144, 91, 2, 0, 0, 0, 0, 52, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,144, 91, 2, 0, 0, 0, 0, + 19, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 0, 0,216, 1, 0, 0, 48,145, 91, 2, 0, 0, 0, 0, +123, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 87,111,114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 0, 0, 0, 0,205,204,204, 61,205,204,204, 61,205,204,204, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,255, 46, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, + 0, 0,128, 63,205,204, 76, 61, 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 88, 70, 76, 1,181, 0, 0, 0, - 1, 0, 0, 0,192, 71, 76, 1,240, 68, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99, 97,109,101, -114, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99, 97,109,101, -114, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,101,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,178,254, 46, 1,198, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, - 56, 1, 0, 0,192, 71, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 70, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 95, 80, 84, 95, 99, 97,109,101,114, 97, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 95, 80, 84, 95, 99, 97,109,101,114, 97, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 84, 88, 0, 0,176, 0, 0, 0, 80,147, 91, 2, 0, 0, 0, 0, 27, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 84,101,120,116, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 64,148, 91, 2, 0, 0, 0, 0, 64,148, 91, 2, 0, 0, 0, 0, + 64,148, 91, 2, 0, 0, 0, 0, 64,148, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,149, 91, 2, 0, 0, 0, 0,255,255,255,255, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,148, 91, 2, 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,148, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 69, 82, 70, 68, 65, 84, 65, 4, 0, 0, 0,176,148, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 79, 66, 0, 0, 40, 4, 0, 0, 64,153, 91, 2, 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0,176,157, 91, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97, +109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 52,254, 46, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,139, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,232, 0, 0, 0, 40, 73, 76, 1,151, 0, 0, 0, 1, 0, 0, 0,136, 79, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222,149, 47, 63, 53, 70, 58, 63, +222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190,227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,149, 84, 28,191, + 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0,128, 63, 1, 0,128, 51, + 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0,128, 63, 1, 0,128, 51, 0, 0, 0, 0, 2, 0, 0,179, 2, 0, 0,167, + 1, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 53, 1, 0, 0, 41, 1, 0,128,168, 0, 0,128, 63, 0, 0,128, 63,157,190,215, 49, +167,170, 4, 52, 0, 0, 0,128,129,116,157,178, 1, 0,128, 63, 33, 69, 15, 51, 0, 0, 0,128, 73,254, 67, 51,243, 97,106, 49, + 0, 0,128, 63, 0, 0, 0,128, 3, 0, 64, 52,183,164,157, 39, 0, 0,128, 53, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, +100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,205,204,204, 62,237, 54, 32, 63, + 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 1, 0, 0, 0, 0, 0, 0, 40,164,155, 3,255, 20, 0, 0,160, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 64, 74, 76, 1,185, 0, 0, 0, 1, 0, 0, 0, 96, 75, 76, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 96, 75, 76, 1,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 74, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 79, 66, 0, 0, 40, 4, 0, 0,176,157, 91, 2, 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0, 16,163, 91, 2, + 0, 0, 0, 0, 64,153, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, + 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,193,181, 2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,173, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, 76, 76, 1, 68, 65, 84, 65,216, 2, 0, 0,128, 76, 76, 1,145, 0, 0, 0, 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,162, 91, 2, 0, 0, 0, 0,112,162, 91, 2, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,136, 79, 76, 1,146, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 40, 73, 76, 1, 64, 74, 76, 1, 96, 75, 76, 1, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,138, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0,168, 80, 76, 1, -184, 0, 0, 0, 1, 0, 0, 0,200, 90, 76, 1, 48, 4, 76, 1, 80,248, 75, 1, 32,251, 75, 1,104,251, 75, 1,144,250, 75, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15, 20, 6,100, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,170, 65, 1,136, 83, 76, 1,168, 89, 76, 1, - 72, 81, 76, 1,104, 82, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0,160, 99, 74, 1, 96,100, 74, 1, 68, 65, 84, 65,236, 0, 0, 0, - 72, 81, 76, 1,185, 0, 0, 0, 1, 0, 0, 0,104, 82, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,118, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0,128,194, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 6, 26, 0, 20, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 6, 26, 0, - 5, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,171, 65, 1,248, 79,158, 3,248, 79,158, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 16,102, 74, 1,136,102, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, -104, 82, 76, 1,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72, 81, 76, 1, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, - 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 19, 6, 0, 0, 18, 0, 0, 0, - 73, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, - 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 20, 6, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 6, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 6, 74, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,171, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80,104, 74, 1, 48,106, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,168, 0, 0, 0, -136, 83, 76, 1,161, 0, 0, 0, 1, 0, 0, 0,168, 89, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 96, 84, 76, 1, -185, 0, 0, 0, 1, 0, 0, 0,128, 85, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 0, 0, 0,203, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0, 88, 6, 26, 0, 88, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,128, 85, 76, 1, -185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 84, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 6, 0, 0, - 26, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 86, 76, 1, 68, 65, 84, 65,216, 2, 0, 0,160, 86, 76, 1, -145, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128, -226,215,163,188, 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32,193, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 65, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, -184,175, 31, 65, 0, 0, 32, 65,161, 14,106, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 91,138, 60, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, - 98,127,249, 67,129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 32,193, 0, 0,128, 63, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,213,108, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, -184,175, 31, 65, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 52,149,147, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,240, 0, 0, 0,168, 89, 76, 1,146, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136, 83, 76, 1, 96, 84, 76, 1, -128, 85, 76, 1, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,138, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, - 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0,200, 90, 76, 1,184, 0, 0, 0, 1, 0, 0, 0,248,105, 76, 1,168, 80, 76, 1, - 32,251, 75, 1,112,249, 75, 1,216,250, 75, 1,104,251, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 0, 0,101, 0, 0, 0, -129, 4, 0, 0, 1, 1, 20, 6, 29, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,112,172, 65, 1,216,104, 76, 1,216,104, 76, 1,104, 91, 76, 1,176,100, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, -248,171, 77, 1,104,107, 74, 1, 68, 65, 84, 65,236, 0, 0, 0,104, 91, 76, 1,185, 0, 0, 0, 1, 0, 0, 0,136, 92, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,194, 68, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, - 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 6, 26, 0, 20, 6, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 6, 26, 0, 7, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 72,178, 65, 1,120, 81,158, 3,120, 81,158, 3, 0, 0, 0, 0, 0, 0, 0, 0,120,109, 74, 1,224,110, 74, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,136, 92, 76, 1,185, 0, 0, 0, 1, 0, 0, 0,176,100, 76, 1, -104, 91, 76, 1, 0, 0, 0, 0, 0, 0, 92, 67, 0, 64, 55,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0, 41,196, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 0, 0, 0, 0,163, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 0, 0, 6, 0,220, 0,164, 2,220, 0, -164, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 0, 0, 19, 6, 0, 0,127, 0, 0, 0,129, 4, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0,152,173, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0,168, 93, 76, 1, 72, 99, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,168, 93, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 16, 95, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 32, 80,114,111,112,101,114,116,105,101,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 32, 80,114,111,112,101,114,116,105,101,115, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26,255,220, 0,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, 16, 95, 76, 1, -181, 0, 0, 0, 1, 0, 0, 0,120, 96, 76, 1,168, 93, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 86,105,101,119, 32, 80,114,111, -112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,105,101,119, 32, 80,114,111, -112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,253,220, 0, 29, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65, 56, 1, 0, 0,120, 96, 76, 1,181, 0, 0, 0, 1, 0, 0, 0,224, 97, 76, 1, 16, 95, 76, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 66, 97, 99,107,103,114,111,117,110,100, 32, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 66, 97, 99,107,103,114,111,117,110,100, 32, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,222,149, 47, 63, 52, 70, 58, 63, +179, 56, 49,188, 0, 0, 0,128, 86,126,162,190,227,251,159, 62, 56, 53,101, 63, 0, 0, 0,128, 7,165, 39, 63,149, 84, 28,191, + 50,247,227, 62, 0, 0, 0,128,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, +100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, + 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,169,253,220, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,204,180, 2, 0, 0, 0, 0,160,185,181, 2, + 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0,192,162, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,112,162, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 79, 66, 0, 0, 40, 4, 0, 0, 16,163, 91, 2, 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +176,157, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0,224, 97, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, - 72, 99, 76, 1,120, 96, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 32, 79,114,105,101,110,116, - 97,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 32, 79,114,105,101,110,116, - 97,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,253,220, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,140, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 1, 0, 0, - 72, 99, 76, 1,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,224, 97, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,115,116, - 32, 79,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,115,116, - 32, 79,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39,253, -220, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0,176,100, 76, 1,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136, 92, 76, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 6, 0, 0,127, 0, 0, 0,129, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 20, 6, 3, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8,173, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,112, 74, 1,136,116, 74, 1, 0, 0, 0, 0, -208,101, 76, 1, 68, 65, 84, 65,216, 2, 0, 0,208,101, 76, 1,145, 0, 0, 0, 1, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,235, 28,212, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,225,215,163,188, 0, 0, 0, 0,238, 4, 53, 63,186,103, 59,190, -247,217, 46, 63, 0, 0, 0, 0,255, 4, 53, 63,126,103, 59, 62,244,217, 46,191, 0, 0, 0, 0,228, 3, 52, 50,248, 70,119, 63, -217,131,132, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 60,138,193, 0, 0,128, 63,236, 4, 53, 63,244, 4, 53, 63, - 0, 0, 24, 53, 0, 0, 0, 0,137,103, 59,190,118,103, 59, 62,227, 70,119, 63, 0, 0, 0, 0,238,217, 46, 63,221,217, 46,191, -213,131,132, 62, 0, 0, 0, 0,186,213, 60, 65,168,213, 60,193,221, 28,143, 64, 0, 0,128, 63,100,253, 69, 63, 17, 71,155,190, -194,219, 46,191,247,217, 46,191,119,253, 69, 63,224, 70,155, 62,191,219, 46, 63,244,217, 46, 63, 65,228, 68, 50,180,226,204, 63, - 53,133,132,190,217,131,132,190, 0, 0, 0, 0, 0, 0, 0, 0, 13, 21,138, 65,152, 60,138, 65, 20,129, 37, 63,162,128, 37, 63, - 0, 0,252, 53, 0, 0,160, 52, 47, 45,226,189, 25, 45,226, 61, 74, 56, 21, 63, 0, 0,240, 51, 0,133, 19,196,242,132, 19, 68, - 27,154, 95,195, 81,253, 71,194,205, 90, 19, 68,191, 90, 19,196, 36, 90, 95, 67, 95,255, 71, 66,238, 4, 53, 63,186,103, 59,190, -247,217, 46, 63, 0, 0, 0, 0,255, 4, 53, 63,126,103, 59, 62,244,217, 46,191, 0, 0, 0, 0,228, 3, 52, 50,248, 70,119, 63, -217,131,132, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 60,138,193, 0, 0,128, 63,100,253, 69, 63, 17, 71,155,190, -194,219, 46,191,247,217, 46,191,119,253, 69, 63,224, 70,155, 62,191,219, 46, 63,244,217, 46, 63, 65,228, 68, 50,180,226,204, 63, - 53,133,132,190,217,131,132,190, 0, 0, 0, 0, 0, 0, 0, 0, 13, 21,138, 65,152, 60,138, 65, 79,241,194, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,241,194, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 79,241,194, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,122,163, 59, 63,235,250, 15,191, -221,141,110,190,230,113,155,190,152, 60,138, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 8,154, 58, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,216,104, 76, 1,146, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,138, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 0, 0, 0, 0, 3, 0,255,255, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 0, 0, 0,248,105, 76, 1, -184, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,200, 90, 76, 1,176,251, 75, 1,216,250, 75, 1,184,249, 75, 1,248,251, 75, 1, - 0, 0, 0, 0, 21, 6, 0, 0,128, 7, 0, 0,125, 3, 0, 0,129, 4, 0, 0, 3, 3,108, 1, 5, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,169, 65, 1, 8,214, 69, 1,136,118, 76, 1, -152,106, 76, 1,184,107, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 74, 1,192,117, 74, 1, 68, 65, 84, 65,236, 0, 0, 0, -152,106, 76, 1,185, 0, 0, 0, 1, 0, 0, 0,184,107, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 67, 0, 0, 0, 0, - 0, 0,208, 65, 0, 0, 0, 0, 0, 0,182, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 1, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,108, 1, 26, 0,108, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 6, 0, 0, -128, 7, 0, 0,125, 3, 0, 0,150, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 1, 26, 0, - 9, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,170, 65, 1, 96,225,163, 3, 96,225,163, 3, - 0, 0, 0, 0, 0, 0, 0, 0,112,119, 74, 1,232,119, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, -184,107, 76, 1,185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,106, 76, 1, 0, 0, 0, 0, 0,128,131, 67, 0, 0,194,194, - 0, 0, 0, 0, 0, 0, 0, 0, 0,128,173, 67, 0, 0, 89,195, 0, 0, 0, 0, 91, 1, 0, 0,108, 1, 0, 0, 18, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 90, 1, 0, 0, 18, 0, 0, 0, -234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 0, 0, - 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,108, 1,235, 0, 91, 1,217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 6, 0, 0, -128, 7, 0, 0,151, 3, 0, 0,129, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108, 1,235, 0, - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,169, 65, 1,200, 71,165, 3,200, 71,165, 3, - 0, 0, 0, 0, 0, 0, 0, 0,176,121, 74, 1,160,122, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, - 8,214, 69, 1,155, 0, 0, 0, 1, 0, 0, 0, 40,112, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,162,159, 3, -136,162,159, 3,216,108, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,216,108, 76, 1,208, 0, 0, 0, 1, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, - 24,109, 76, 1, 68, 65, 84, 65,156, 0, 0, 0, 24,109, 76, 1,207, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 8,120, 76, 1, 19, 0, 0, 0, 1, 0, 1, 0, 8,120, 76, 1, 20, 0, 0, 0, 1, 0, 1, 0, 8,120, 76, 1, 21, 0, 1, 0, - 1, 0, 1, 0, 8,120, 76, 1, 0, 0, 0, 0, 1, 0, 1, 0, 80,131, 76, 1, 0, 0, 0, 0, 1, 0, 1, 0,216,141, 76, 1, - 0, 0, 0, 0, 1, 0, 1, 0, 88,154, 76, 1, 0, 0, 0, 0, 1, 0, 1, 0,104,149, 76, 1, 0, 0, 0, 0, 1, 0, 1, 0, - 16,153, 76, 1, 0, 0, 0, 0, 1, 0, 1, 0,216,145, 76, 1, 0, 0, 0, 0, 1, 0, 1, 0,200,127, 76, 1, 0, 0, 0, 0, - 1, 0, 1, 0, 72,138, 76, 1, 0, 0, 0, 0, 1, 0, 1, 0, 16,127, 76, 1, 68, 65, 84, 65,236, 0, 0, 0,232,109, 76, 1, -185, 0, 0, 0, 1, 0, 0, 0, 8,111, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 67, 0, 0, 0, 0, 0, 0,208, 65, - 0, 0, 0, 55, 0, 0, 67, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, - 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, - 4, 0, 12, 4, 10, 0,195, 0, 26, 0,195, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,247, 4, 0, 0, - 69, 2, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 0, 26, 0, 0, 0, 1, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 8,111, 76, 1, -185, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,109, 76, 1, 0, 0, 0, 0, 0, 0,150, 67, 0,192,116,196, 0, 0, 0, 0, - 0, 0, 0, 0,205, 85,150, 67,223,204, 35,196, 26, 85,207,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0,155, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 3, 0, - 2, 0, 0, 4, 6, 0,195, 0,156, 0,195, 0,156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 4, 0, 0,247, 4, 0, 0, - 95, 2, 0, 0,250, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 0,156, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,232, 0, 0, 0, 40,112, 76, 1, -151, 0, 0, 0, 1, 0, 0, 0,136,118, 76, 1, 8,214, 69, 1,232,109, 76, 1, 8,111, 76, 1, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 64,113, 76, 1,185, 0, 0, 0, - 1, 0, 0, 0, 96,114, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, - 0, 0,138, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, - 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, - 10, 0, 20, 1, 26, 0, 20, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 0, 0, 0, 0, - 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,236, 0, 0, 0, 96,114, 76, 1,185, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 64,113, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, + 87, 43, 98, 61,229,229,238, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54,236,148,190, 25,134,116, 63,236, 13, 98,189, + 0, 0, 0, 0,221,102, 69,191, 57,174, 76,190, 34,194, 26, 63, 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, + 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 1, 0,128, 50, 0, 0, 0,179, + 0, 0, 0, 0, 1, 0,128, 50, 1, 0,128, 63, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0, 0, 0, 1, 0, 0, 39, 1, 0, 0, 52, 1, 0,128, 39, 0, 0,128, 63, 53,236,148,190,222,102, 69,191, 37,255, 16, 63, + 0, 0, 0,128, 24,134,116, 63, 57,174, 76,190,240,161, 95, 62, 0, 0, 0,128,235, 13, 98,189, 34,194, 26, 63,166,111, 75, 63, + 0, 0, 0,128,208, 19, 13, 63,234, 65,102,190, 10, 10,231,192, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 5, 0, 1, 0, 0, 0, 68, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, + 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0, +143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 6, 0, 0,108, 7, 0, 0, 26, 0, 0, 0, - 80, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1, 55, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,115, 76, 1, 68, 65, 84, 65,216, 2, 0, 0,128,115, 76, 1,145, 0, 0, 0, - 1, 0, 0, 0,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0,128, 0, 0, 0,128,226,215,163,188, - 0, 0, 0,128, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, - 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, - 0, 0, 32, 65,237,122,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 14,106, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,249,195,115,253, 71,194, 0, 0, 0, 0, 0, 0, 0, 0, 98,127,249, 67, -129,255, 71, 66, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,193, - 0, 0,128, 63,103,212,136, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,184,175, 31, 65, - 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,100, 32,222, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77, 65, 0, 0,224, 2, 0, 0,128,167, 91, 2, 0, 0, 0, 0, 41, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 77, 97,116,101,114,105, + 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 2, 0, 2, 0, 50, 0, 0, 6, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 3, 3, 0, 1, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -240, 0, 0, 0,136,118, 76, 1,146, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 40,112, 76, 1, 64,113, 76, 1, 96,114, 76, 1, - 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,138, 76, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 63, 0, 0,128, 64, 0, 0, 0, 63,205,204,204, 61, 0, 0, 0, 63,205,204,204, 61,205,204,204, 61, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,128, 63, 0, 0,128, 63,160,170, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,159, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 67, 0, 0,220, 4, 0, 0, 8,120, 76, 1,143, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 67, 83, 99,101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,138, 76, 1, 80,131, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0,184,245, 75, 1, -104,125, 76, 1,184,245, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,125, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 25, 0, -141, 0,128, 7, 56, 4, 8, 0, 8, 0, 0, 0, 24, 0, 17, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, - 23, 0, 33, 0, 0, 0,128, 0, 0, 0, 8, 0, 24, 0, 10, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -104,217, 69, 1,104,217, 69, 1, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 5, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,171, 91, 2, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 63, +205,204, 76, 63,205,204, 76, 63,205,204, 76, 61,205,204,204, 61,102,102,166, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0, +160,170, 91, 2, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +224,171, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, + 68, 65, 84, 65, 40, 0, 0, 0,112,171, 91, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 84, 69, 0, 0, 88, 1, 0, 0,224,171, 91, 2, 0, 0, 0, 0, 37, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 84,101,120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0,160, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, + 8, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +205,204,204, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0,144, 1, 0, 0,128,173, 91, 2, 0, 0, 0, 0, + 51, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,182, 91, 2, 0, 0, 0, 0, + 48,182, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177, 91, 2, 0, 0, 0, 0, +176,179, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,175, 91, 2, 0, 0, 0, 0, + 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,178, 91, 2, 0, 0, 0, 0, + 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,180, 91, 2, 0, 0, 0, 0, + 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128, 51, 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, + 4, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 0, + 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, +240,182, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128,167, 91, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0, + 80,175, 91, 2, 0, 0, 0, 0, 57, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 98, 97, 99,107, 98,117,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47,116,109,112, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0, + 0,177, 91, 2, 0, 0, 0, 0, 57, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, 0, 0,128,191,230, 73,230, 73, + 26,182,255, 0, 3, 0, 0, 0, 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182,255, 0, 3, 0, 0, 0, + 1, 0,128,191,253,255,127,191, 0, 0,128,191, 26,182, 26,182, 26,182,255, 0, 3, 0, 0, 0,250,255,127,191, 3, 0,128, 63, + 0, 0,128,191, 26,182,230, 73, 26,182,255, 0, 3, 0, 0, 0, 4, 0,128, 63,247,255,127, 63, 0, 0,128, 63,230, 73,230, 73, +230, 73,255, 0, 3, 0, 0, 0,245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,230, 73,255, 0, 3, 0, 0, 0, + 3, 0,128,191,250,255,127,191, 0, 0,128, 63, 26,182, 26,182,230, 73,255, 0, 3, 0, 0, 0,255,255,127,191, 0, 0,128, 63, + 0, 0,128, 63, 26,182,230, 73,230, 73,255, 0, 3, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0, 0,178, 91, 2, 0, 0, 0, 0, + 57, 1, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,176,179, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 6, 0, 0, 0, 16, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, -173, 2, 95, 0,154,153,217, 63, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 68,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,151, 72, 1, 1, 0, 0, 0, 1, 0, 10, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 28, 0, 0, 0,184,245, 75, 1,125, 0, 0, 0, - 1, 0, 0, 0, 24,125, 76, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 10, 3, 1, 2,216,141, 76, 1, - 68, 65, 84, 65, 28, 0, 0, 0, 24,125, 76, 1,125, 0, 0, 0, 1, 0, 0, 0,104,125, 76, 1,184,245, 75, 1, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 4, 0, 0,233, 3, 65, 3,216,145, 76, 1, 68, 65, 84, 65, 28, 0, 0, 0,104,125, 76, 1,125, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 24,125, 76, 1, 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,102, 3, 93, 3, 72,138, 76, 1, - 68, 65, 84, 65, 36, 1, 0, 0,184,125, 76, 1,141, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 1, 0, 1, 0,205,204, 76, 63, 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, - 0, 0, 1, 0, 32, 0, 32, 0, 32, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, - 50, 0, 50, 0, 10, 0, 0, 0, 50, 0,100, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, - 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60,205,204,204, 61, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0,250, 0,205,204,204, 61,205,204,204, 61,102,102,166, 63, 0, 0,192, 63, 0, 0,240, 65, 72,225,122, 63,205,204,204, 61, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 67, 2, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 0, 0, 0, -104,217, 69, 1,130, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 32, 82,101,110,100,101,114, 76, 97,121,101, -114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 15, 0, - 0, 0, 0, 0,255,127, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,136, 0, 0, 0, 16,127, 76, 1, - 30, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, - 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, 63,145,137, 68, 66,205,204,204, 61, 0, 0,200, 66, 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,132, 1, 0, 0,200,127, 76, 1, 40, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63,128,129, 76, 1, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, - 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, -111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,128,129, 76, 1, 55, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63,242, 4, 53,191, -243, 4, 53, 63,184,130, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0,176,179, 91, 2, 0, 0, 0, 0, + 54, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 35, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, + 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65,104, 1, 0, 0, +128,180, 91, 2, 0, 0, 0, 0, 57, 1, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,182, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,130, 76, 1, 53, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 0,131, 76, 1, 19, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 79, 0, 0,112, 1, 0, 0, 80,131, 76, 1,124, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 87,111,114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0,128, 62, - 0, 0,128, 62, 0, 0, 0, 0,205,204,204, 61,205,204,204, 61,205,204,204, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, -205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 61, - 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 0, 0,120, 0, 0, 0,240,132, 76, 1, 28, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 84,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0,152,133, 76, 1, -152,133, 76, 1,152,133, 76, 1,152,133, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,134, 76, 1, -255,255,255,255, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,133, 76, 1, - 26, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,133, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 69, 69, 82, 70, - 68, 65, 84, 65, 4, 0, 0, 0,224,133, 76, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 79, 66, 0, 0, 92, 3, 0, 0, - 72,138, 76, 1,115, 0, 0, 0, 1, 0, 0, 0,216,141, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97, -109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16,127, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,101,239, 64, -150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,254,141, 63,192, 57, 49, 60, - 34,159, 80, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222,149, 47, 63, 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, - 86,126,162,190,227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0, -110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,125,103,133, 51,176,219,194,178, 0, 0, 0, 0, -190, 32, 66, 51, 1, 0,128, 63,168,200,153, 51, 0, 0, 0, 0, 32,206, 18,179,126,126,149, 50, 1, 0,128, 63, 0, 0, 0, 0, -241,251,133, 52,172,182, 27,180,174,236,252, 51, 0, 0,128, 63, 0, 0,128, 63,157,190,215, 49,167,170, 4, 52, 0, 0, 0,128, -129,116,157,178, 1, 0,128, 63, 33, 69, 15, 51, 0, 0, 0,128, 73,254, 67, 51,243, 97,106, 49, 0, 0,128, 63, 0, 0, 0,128, - 3, 0, 64, 52,183,164,157, 39, 0, 0,128, 53, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, - 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, - 56,180,150,201, 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,205,204,204, 62,237, 54, 32, 63, 0, 0, 0, 0,143,194,117, 61, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,216,141, 76, 1,115, 0, 0, 0, 1, 0, 0, 0,216,145, 76, 1, - 72,138, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, 62,165, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,154, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,145, 76, 1, -160,145, 76, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, -222,149, 47, 63, 52, 70, 58, 63,179, 56, 49,188, 0, 0, 0,128, 86,126,162,190,227,251,159, 62, 56, 53,101, 63, 0, 0, 0,128, - 7,165, 39, 63,149, 84, 28,191, 50,247,227, 62, 0, 0, 0,128,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63, - 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63, -205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 64, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,225,155, 3, 56,161,155, 3, - 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0, -104,145, 76, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,160,145, 76, 1, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 92, 3, 0, 0,216,145, 76, 1,115, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -216,141, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,127, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, 87, 43, 98, 61,229,229,238, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54,236,148,190, 25,134,116, 63,236, 13, 98,189, 0, 0, 0, 0,221,102, 69,191, 57,174, 76,190, 34,194, 26, 63, 0, 0, 0, 0, - 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0,128, 63, - 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 0, 0,128, 63, 35,233,134, 49,251,110, 17,179, 0, 0, 0, 0, 49,158,141, 50, 1, 0,128, 63,126,214,237, 50, 0, 0, 0, 0, -155,248, 28,178,199,139, 96,177,254,255,127, 63, 0, 0, 0, 0, 80,136,159,178,192, 4,158,178,209,114,143,179, 0, 0,128, 63, - 53,236,148,190,222,102, 69,191, 37,255, 16, 63, 0, 0, 0,128, 24,134,116, 63, 57,174, 76,190,240,161, 95, 62, 0, 0, 0,128, -235, 13, 98,189, 34,194, 26, 63,166,111, 75, 63, 0, 0, 0,128,208, 19, 13, 63,234, 65,102,190, 10, 10,231,192, 0, 0,128, 63, - 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 68, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63, -205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 0, 0,112, 2, 0, 0, -104,149, 76, 1, 42, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 77, 97, -116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, - 2, 0, 2, 0, 50, 0, 0, 6, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 3, 3, 0, 1, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 63, 0, 0,128, 63, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0,128, 64, 0, 0, 0, 63,205,204,204, 61, 0, 0, 0, 63,205,204,204, 61,205,204,204, 61, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8,152, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0, + 48,182, 91, 2, 0, 0, 0, 0, 53, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 2, 4, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, + 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, + 2, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 2, 85, 83, 69, 82, 64, 11, 0, 0, 32, 94,154, 1, 0, 0, 0, 0,178, 0, 0, 0, 1, 0, 0, 0, + 33,152, 1, 0, 63, 2, 0, 0, 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,152, 76, 1, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 63,205,204, 76, 63, -205,204, 76, 63,205,204, 76, 61,205,204,204, 61,102,102,166, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, -136, 0, 0, 0, 8,152, 76, 1, 33, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,153, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, -192,152, 76, 1, 19, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0, 24, 1, 0, 0, 16,153, 76, 1, 38, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 84,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0,160, 64, - 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, - 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 24, 1, 0, 0, - 88,154, 76, 1, 52, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, - 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,155, 76, 1, 32,162, 76, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 96,157, 76, 1,216,159, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,216,155, 76, 1, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,158, 76, 1, - 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,160, 76, 1, 1, 0, 0, 0, 5, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0,128, 51, 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 4, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,160,155, 76, 1, 0, 0, 0, 0, 1, 0, 0, 0,104,149, 76, 1, 68, 65, 84, 65, - 84, 1, 0, 0,216,155, 76, 1, 58, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,157, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,111,112, + 47, 0, 45,112,111,119,101,114,112, 99, 47, 98,105,110, 47, 98,108,101,110,100,101,114, 46, 97,112,112, 47, 67,111,110,116,101, +110,116,115, 47, 82,101,115,111,117,114, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0, 96,157, 76, 1, 58, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, - 0, 0,128,191,230, 73,230, 73, 26,182,255, 0, 3, 0, 0, 0, 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, - 26,182,255, 0, 3, 0, 0, 0, 1, 0,128,191,253,255,127,191, 0, 0,128,191, 26,182, 26,182, 26,182,255, 0, 3, 0, 0, 0, -250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73, 26,182,255, 0, 3, 0, 0, 0, 4, 0,128, 63,247,255,127, 63, - 0, 0,128, 63,230, 73,230, 73,230, 73,255, 0, 3, 0, 0, 0,245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182, -230, 73,255, 0, 3, 0, 0, 0, 3, 0,128,191,250,255,127,191, 0, 0,128, 63, 26,182, 26,182,230, 73,255, 0, 3, 0, 0, 0, -255,255,127,191, 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73,230, 73,255, 0, 3, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0, - 80,158, 76, 1, 58, 1, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,159, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1202,14 +857,7 @@ char datatoc_B_blend[]= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,144, 0, 0, 0,216,159, 76, 1, 55, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, - 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0,152,160, 76, 1, 58, 1, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,162, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1217,28 +865,29 @@ char datatoc_B_blend[]= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0, 32,162, 76, 1, 54, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, - 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 2, 85, 83, 69, 82, 40, 11, 0, 0, -112,152,230, 0,177, 0, 0, 0, 1, 0, 0, 0, 33,152, 1, 0, 63, 2, 0, 0, 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 85,115,101,114,115, - 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0, 45,112,111,119,101,114,112, 99, 47, 98,105,110, 47, 98,108,101,110,100, -101,114, 46, 97,112,112, 47, 67,111,110,116,101,110,116,115, 47, 82,101,115,111,117,114, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 48, 52, 6, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 64, 0, 5, 0, 2, 0,192,194, 91, 2, 0, 0, 0, 0, +192,215, 91, 2, 0, 0, 0, 0,240,195,100, 2, 0, 0, 0, 0,240,195,100, 2, 0, 0, 0, 0, 80, 51,101, 2, 0, 0, 0, 0, + 80, 51,101, 2, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 2, 0, 25, 0, 0, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, +205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 30, 90,100,191,154,153,153, 62,102,102,102, 63, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63, +156,153, 25, 63, 0, 0, 0, 0,205,204, 76, 62,205,204, 76, 62,205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62, +184,243,125, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, + 1, 43,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, + 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 15, 0, + 8, 0, 10, 0,250, 0, 0, 0,100, 0,100, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1246,848 +895,813 @@ char datatoc_B_blend[]= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, + 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, + 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 68, 65, 84, 65,192, 20, 0, 0,192,194, 91, 2, 0, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0,192,215, 91, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, + 1, 0, 25, 0,231,255, 0, 0, 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, + 1, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, + 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, + 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, + 1, 0,236,255, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, + 1, 0,236,255, 0, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, + 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 25, 25, 25,230, 45, 45, 45,230,100,100,100,255,160,160,160,255,255,255,255,255, + 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, + 0, 0, 38, 0, 0, 0, 0, 0, 25, 25, 25,255,128,128,128,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50,180, 80, 80, 80,180,100,100,100,180,128,128,128,255, 0, 0, 0,255,255,255,255,255, + 1, 0, 5, 0,251,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, + 0, 0, 0, 0, 0, 0, 0, 0,115,190, 76,255, 90,166, 51,255,240,235,100,255,215,211, 75,255,180, 0,255,255,153, 0,230,255, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,130,130,130,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, + 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 90, 90,255, 0, 0, 0, 0, +250,250,250,255, 15, 15, 15,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,180,180,180,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,130,130,130,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255,250,250,250,255,250,250,250,255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, + 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255, 82, 96,110,255,124,137,150,255, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, + 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 3, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, + 3, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, + 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, + 96,192, 64,255, 82, 96,110,255,124,137,150,255, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0,116,116,116,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255,109, 88,129,255, 78,152, 62,255, + 46,143,143,255,169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, + 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, +255,255,255, 10,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,110,110,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,132,132,132,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255, 94, 94, 94,255,172,172,172,255, 17, 27, 60,100, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,195,195,195,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255, +255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, + 0,100, 50,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, + 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, + 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, + 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255, +255,255,255,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, +200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, +150,150,150,255,129,131,144,255,127,127,127,255,142,138,145,255,120,145,120,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, + 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, + 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255, +255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, + 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, + 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 0, 0,255,189, 17, 17,255, +247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, 30,145, 9,255, 89,183, 11,255, +131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,169, 41, 78,255,193, 65,106,255, +240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, 36,120, 90,255, 60,149,121,255, +111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0,244,201, 12,255,238,194, 54,255, +243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0,111, 47,106,255,152, 69,190,255, +211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0,141,141,141,255,176,176,176,255, +222,222,222,255, 0, 0, 0, 0,131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255, 28, 67, 11,255, + 52, 98, 43,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,192, 20, 0, 0, +192,215, 91, 2, 0, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,194, 91, 2, 0, 0, 0, 0, + 82,111,117,110,100,101,100, 0, 0,101,119, 32, 85,115,101,114, 32, 84,104,101,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 1, 0, 25, 0,231,255, 0, 0, + 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0, 25, 0, 0, 0, + 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 1, 0, 15, 0,241,255, 0, 0, + 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, + 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, + 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 1, 0, 15, 0,241,255, 0, 0, + 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, + 0, 0, 0,255, 25, 25, 25,230, 46,124,217,204,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, + 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,175,175,175, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, + 0, 0, 0, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, + 0, 0, 0,255,217,217,217,255, 0, 0, 0, 40,255,255,255,255, 16, 64, 16,255,102,255,102,255,255,130, 0,255, 0, 0, 0,255, +255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255,255, 32, 32,255, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60, +255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +160,160,160,100,127,112,112,100,255,130, 0,255, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +107,107,107,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,100,143,143,143,100, 96,192, 64,255, 94, 94, 94,255, + 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 79,101, 73,255,135,177,125,255,255,255,255,255,255,255,255,255, +255,130, 0,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 82, 96,110,255, +124,137,150,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +255,255,255,255,255,130, 0,255, 2, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +158,158,158,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, + 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255, +255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +107,107,107,255,178,178,178,100,255,130, 0,100, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, + 79,101, 73,255,135,177,125,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,143,143,143,255,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +228,156,198,204,255,255,170,204, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,143,143,143,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,178,178,178,100,255,130, 0,100, 94, 94, 94,255, + 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255, +255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,156,198,255,255,255,170,255, 96,192, 64,255, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,130, 0,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,200,255,255, + 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255, +126,126, 80,255,162, 95,111,255,109,145,131,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 53, 53,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,195,195,195,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, + 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255, +255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, +255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 80,200,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +195,195,195,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +143,143,143,255,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,153,153,153,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 88, 88, 88,255, + 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255, +255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, +107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 48, 52, 6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 64, 0, - 5, 0, 2, 0, 32,174, 76, 1,232,194, 76, 1,192,184, 73, 1,192,184, 73, 1, 72,222, 73, 1, 72,222, 73, 1, 32, 0, 0, 0, - 1, 0, 2, 0, 25, 0, 0, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191,154,153,153, 62,102,102,102, 63, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, 0, 0, 0, 0,205,204, 76, 62, -205,204, 76, 62,205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128, 63, 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0, - 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 15, 0, 8, 0, 10, 0,250, 0, 0, 0,100, 0,100, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, - 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,152, 20, 0, 0, 32,174, 76, 1, -175, 0, 0, 0, 1, 0, 0, 0,232,194, 76, 1, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, - 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, - 0, 0, 0,255,255,255,255,255, 1, 0, 25, 0,231,255, 0, 0, 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255, - 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255, -255,255,255,255, 0, 0, 0,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, - 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255, - 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255, - 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255, - 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, -255,255,255,255,204,204,204,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255, - 0, 0, 0,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 25, 25, 25,230, 45, 45, 45,230,100,100,100,255, -255,255,255,255,255,255,255,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,255,255,255,255, -255,255,255,255, 0, 0, 0,255, 0, 0, 38, 0, 0, 0, 0, 0, 25, 25, 25,255,128,128,128,255,100,100,100,255, 25, 25, 25,255, - 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50,180, 80, 80, 80,180,100,100,100,180,180,180,180,255, - 0, 0, 0,255,255,255,255,255, 1, 0, 10, 0,236,255, 0, 0,115,190, 76,255, 90,166, 51,255,240,235,100,255,215,211, 75,255, -180, 0,255,255,153, 0,230,255, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -130,130,130,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 90, 90,255, 0, 0, 0, 0,250,250,250,255, 15, 15, 15,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +158,158,158,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -180,180,180,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,130,130,130,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255, -250,250,250,255,250,250,250,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, +165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, + 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255, +255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, -114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, 82, 96,110,255, -124,137,150,255, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, - 12, 10, 10,128,255,140, 0,255, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, -116,116,116,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255, -109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,255,255,255,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255,255,255,255, 10,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -110,110,110,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -132,132,132,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 94, 94, 94,255,172,172,172,255, 17, 27, 60,100, 94, 94, 94,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,195,195,195,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -143,143,143,255,198,119,119,255,255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,100, 0, 0,255, 0, 0,200,255, -128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, +160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255,217,217,217,255, 0, 0, 0, 40,255,255,255,255, + 0, 0, 0, 0, 0, 0, 0, 0,255,130, 0,255, 0, 0, 0,255,255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255, + 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,150,150,150,255,129,131,144,255, +127,127,127,255,142,138,145,255,120,145,120,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, + 0, 0, 0,255,217,217,217,255, 0, 0, 0, 40,255,255,255,255, 16, 64, 16,255,102,255,102,255,255,130, 0,255, 0, 0, 0,255, +255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255,255, 32, 32,255, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60, +255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 57, 57, 57,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, - 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255, -255,133, 0,255, 0, 0, 0,255,255,255,255,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60, -255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 4, 0, 0,150,150,150,255,129,131,144,255,127,127,127,255,142,138,145,255,120,145,120,255, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255, -114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, -160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, - 16, 64, 16,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255, -255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, - 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -154, 0, 0,255,189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, - 30,145, 9,255, 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0, -169, 41, 78,255,193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, - 36,120, 90,255, 60,149,121,255,111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0, -244,201, 12,255,238,194, 54,255,243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0, -111, 47,106,255,152, 69,190,255,211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0, -141,141,141,255,176,176,176,255,222,222,222,255, 0, 0, 0, 0,131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, - 8, 49, 14,255, 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68, 65, 84, 65,152, 20, 0, 0,232,194, 76, 1,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,174, 76, 1, 82,111,117,110, -100,101,100, 0, 0,101,119, 32, 85,115,101,114, 32, 84,104,101,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255, -153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255, -153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 1, 0, 25, 0,231,255, 0, 0, 25, 25, 25,255, -153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0,255, - 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, - 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255, -180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 25, 25, 25,255, -180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 0, 0, 0,255, - 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, - 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, - 25, 25, 25,230, 46,124,217,204,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, - 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,175,175,175, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100, -127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 51, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255, -217,217,217,255, 0, 0, 0, 40,255,255,255,255, 16, 64, 16,255,102,255,102,255,255,130, 0,255, 0, 0, 0,255,255,130, 0,255, - 0, 0, 0,255,255,255,255,255,230,150, 50,255,255, 32, 32,255, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255, - 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100, -127,112,112,100,255,130, 0,255, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,150, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,100,143,143,143,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255, -255,136,255,255, 0, 0, 0, 0,255,187,255,255, 79,101, 73,255,135,177,125,255,255,255,255,255,255,255,255,255,255,130, 0,255, - 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 82, 96,110,255,124,137,150,255, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, -255,130, 0,255, 2, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100, -127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,158,158,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, 0, 0, 0,255, -255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, - 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,255, -178,178,178,100,255,130, 0,100, 94, 94, 94,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 79,101, 73,255, -135,177,125,255,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,143,143,143,255,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,156,198,204, -255,255,170,204, 96,192, 64,255, 82, 96,110,255,124,137,150,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,143,143,143,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,107,107,107,255,178,178,178,100,255,130, 0,100, 94, 94, 94,255, 0, 0, 0,255, -255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, - 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,156,198,255,255,255,170,255, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100, -127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,130, 0,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,200,255,255, 0, 0, 0, 0, - 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255, -162, 95,111,255,109,145,131,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,195,195,195,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255, -255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, - 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60,255,133, 0,255, - 0, 0, 0, 0, 0, 0, 0, 0, 80,200,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,195,195,195,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255, -127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,153,153,153,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 88, 88, 88,255, 0, 0, 0,255, -255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, - 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100, -127,112,112,100, 0, 0, 0, 0, 88, 88, 88,255, 0, 0, 0,255,255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,158,158,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,158,158,158,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,150, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,140,140,140,255,127,112,112,100, 0, 0, 0, 0,112,112, 96,255, 0, 0, 0,255, -255,136,255,255, 0, 0, 0, 0,255,187,255,255, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,112,255,255,255,255,112,255, - 0, 0, 0,255,144,144, 48,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,150, 30,200,100,200, 60, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 51, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100, -127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255,217,217,217,255, 0, 0, 0, 40,255,255,255,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,130, 0,255, 0, 0, 0,255,255,130, 0,255, 0, 0, 0,255,255,255,255,255,230,150, 50,255, 0, 0, 0, 0, - 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255, 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,150,150,150,255,129,131,144,255,127,127,127,255, -142,138,145,255,120,145,120,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, - 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,107,107,107,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,245, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 51, - 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,143,143,143,255, 0, 0, 0,255, -217,217,217,255, 0, 0, 0, 40,255,255,255,255, 16, 64, 16,255,102,255,102,255,255,130, 0,255, 0, 0, 0,255,255,130, 0,255, - 0, 0, 0,255,255,255,255,255,230,150, 50,255,255, 32, 32,255, 0, 0, 0, 0,255,255,255, 10,255,130, 0, 60,255,138, 48,255, - 34,221,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 0, 0,255,189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255, -246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, 30,145, 9,255, 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, - 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,169, 41, 78,255,193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, - 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, 36,120, 90,255, 60,149,121,255,111,182,171,255, 0, 0, 0, 0, 75,112,124,255, -106,134,145,255,155,194,205,255, 0, 0, 0, 0,244,201, 12,255,238,194, 54,255,243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, - 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0,111, 47,106,255,152, 69,190,255,211, 48,214,255, 0, 0, 0, 0,108,142, 34,255, -127,176, 34,255,187,239, 91,255, 0, 0, 0, 0,141,141,141,255,176,176,176,255,222,222,222,255, 0, 0, 0, 0,131, 67, 38,255, -139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255, 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 78, 65, 49,204,208, 0, 0, 0, 31,154, 3, 0, 0, 0, 0, 1, 0, 0, 0, - 83, 68, 78, 65, 78, 65, 77, 69, 59, 10, 0, 0, 42,110,101,120,116, 0, 42,112,114,101,118, 0, 42,100, 97,116, 97, 0, 42,102, -105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,122, 0,119, 0,120,109,105,110, 0,120,109, 97,120, 0,121,109,105, -110, 0,121,109, 97,120, 0, 42,112,111,105,110,116,101,114, 0,103,114,111,117,112, 0,118, 97,108, 0,118, 97,108, 50, 0,116, -121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103, 0,110, 97,109,101, 91, 51, 50, 93, 0,115, 97,118,101,100, 0, -100, 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,110, 0, 42,110,101,119,105,100, 0, 42,108,105, 98, 0,110, 97, -109,101, 91, 50, 52, 93, 0,117,115, 0,105, 99,111,110, 95,105,100, 0, 42,112,114,111,112,101,114,116,105,101,115, 0,105,100, - 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105,108,101,100, 97,116, 97, 0,110, 97,109,101, 91, 50, 52, 48, 93, 0,102,105, -108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,116,111,116, 0,112, 97,100, 0, 42,112, 97,114,101,110,116, 0,119, 91, 50, 93, - 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93, 0,112, 97,100, 48, 0,112, 97,100, 49, 0, 42,114,101, 99,116, - 91, 50, 93, 0, 42,111, 98, 0, 98,108,111, 99,107,116,121,112,101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49, - 50, 56, 93, 0, 42, 98,112, 0, 42, 98,101,122,116, 0,109, 97,120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116, -121,112,101, 0,116,111,116,118,101,114,116, 0,105,112,111, 0,101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115, -107, 0,115,108,105,100,101, 95,109,105,110, 0,115,108,105,100,101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114, -105,118,101,114, 0, 99,117,114,118,101, 0, 99,117,114, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112, -111,115, 0,114,101,108, 97,116,105,118,101, 0,116,111,116,101,108,101,109, 0,112, 97,100, 50, 0, 42,119,101,105,103,104,116, -115, 0,118,103,114,111,117,112, 91, 51, 50, 93, 0,115,108,105,100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120, - 0, 42, 97,100,116, 0, 42,114,101,102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105, -122,101, 0, 98,108,111, 99,107, 0, 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112, -104, 0, 42, 42,115, 99,114,105,112,116,115, 0, 42,102,108, 97,103, 0, 97, 99,116,115, 99,114,105,112,116, 0,116,111,116,115, - 99,114,105,112,116, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105,110,101,110,111, 0, -115,116, 97,114,116, 0,101,110,100, 0,102,108, 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97,100, 91, 52, 93, 0, - 42,110, 97,109,101, 0,110,108,105,110,101,115, 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115,101,108,108, 0, 99, -117,114, 99, 0,115,101,108, 99, 0,109, 97,114,107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0,117,110,100,111, 95, -112,111,115, 0,117,110,100,111, 95,108,101,110, 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109,101, 0,115,105,122, -101, 0,115,101,101,107, 0,112, 97,115,115,101,112, 97,114,116, 97,108,112,104, 97, 0, 97,110,103,108,101, 0, 99,108,105,112, -115,116, 97, 0, 99,108,105,112,101,110,100, 0,108,101,110,115, 0,111,114,116,104,111, 95,115, 99, 97,108,101, 0,100,114, 97, -119,115,105,122,101, 0,115,104,105,102,116,120, 0,115,104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 89, - 70, 95, 97,112,101,114,116,117,114,101, 0, 89, 70, 95, 98,107,104,116,121,112,101, 0, 89, 70, 95, 98,107,104, 98,105, 97,115, - 0, 89, 70, 95, 98,107,104,114,111,116, 0,115, 99,114,105,112,116,108,105,110,107, 0, 42,100,111,102, 95,111, 98, 0,102,114, - 97,109,101,110,114, 0,102,114, 97,109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,109, 97, - 0, 99,121, 99,108, 0,111,107, 0,109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,115, 0, -109,101,110,117,110,114, 0, 42,115, 99,101,110,101, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, - 42, 97,110,105,109, 0, 42,114,114, 0,115,111,117,114, 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,101, -102,108, 97,103, 0,116,111,116, 98,105,110,100, 0,120,114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97, 0,116,119,101, -110,100, 0, 98,105,110,100, 99,111,100,101, 0, 42,114,101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,101, - 0, 42,112,114,101,118,105,101,119, 0, 42,114,101,110,100,101,114, 95,116,101,120,116, 0,108, 97,115,116,117,112,100, 97,116, -101, 0,108, 97,115,116,117,115,101,100, 0, 97,110,105,109,115,112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, - 0,103,101,110, 95,116,121,112,101, 0, 97,115,112,120, 0, 97,115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0, -109, 97,112,116,111,110,101,103, 0, 98,108,101,110,100,116,121,112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0, -117,118,110, 97,109,101, 91, 51, 50, 93, 0,112,114,111,106,120, 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112, -112,105,110,103, 0,111,102,115, 91, 51, 93, 0,115,105,122,101, 91, 51, 93, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111, -114,109,111,100,101,108, 0,112,109, 97,112,116,111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, - 97, 99,101, 0,119,104,105, 99,104, 95,111,117,116,112,117,116, 0,112, 97,100, 91, 50, 93, 0,114, 0,103, 0, 98, 0,107, 0, -100,101,102, 95,118, 97,114, 0, 99,111,108,102, 97, 99, 0,110,111,114,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,100,105,115, -112,102, 97, 99, 0,119, 97,114,112,102, 97, 99, 0,110, 97,109,101, 91, 49, 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42, -112,110, 97,109,101, 0, 42,115,116,110, 97,109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115, -116,114, 0, 42,114,101,115,117,108,116, 0, 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, - 41, 40, 41, 0, 40, 42,105,110,115,116, 97,110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99, -107, 41, 40, 41, 0,118,101,114,115,105,111,110, 0, 97, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98, -101, 91, 54, 93, 0,105,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121, -112,101, 0,118,105,101,119,115, 99, 97,108,101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116, -104, 0,114,101, 99, 97,108, 99, 0,108, 97,115,116,115,105,122,101, 0,110,111,105,115,101,115,105,122,101, 0,116,117,114, 98, -117,108, 0, 98,114,105,103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, - 99, 0,102,105,108,116,101,114,115,105,122,101, 0,109,103, 95, 72, 0,109,103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0, -109,103, 95,111, 99,116, 97,118,101,115, 0,109,103, 95,111,102,102,115,101,116, 0,109,103, 95,103, 97,105,110, 0,100,105,115, -116, 95, 97,109,111,117,110,116, 0,110,115, 95,111,117,116,115, 99, 97,108,101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, - 0,118,110, 95,119, 51, 0,118,110, 95,119, 52, 0,118,110, 95,109,101,120,112, 0,118,110, 95,100,105,115,116,109, 0,118,110, - 95, 99,111,108,116,121,112,101, 0,110,111,105,115,101,100,101,112,116,104, 0,110,111,105,115,101,116,121,112,101, 0,110,111, -105,115,101, 98, 97,115,105,115, 0,110,111,105,115,101, 98, 97,115,105,115, 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111, -112,120,109,105,110, 0, 99,114,111,112,121,109,105,110, 0, 99,114,111,112,120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, - 0,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0,101,120,116,101,110,100, 0, 99,104,101, 99,107,101,114,100, -105,115,116, 0,110, 97, 98,108, 97, 0,105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105, -110, 0, 42, 99,111, 98, 97, 0, 42,101,110,118, 0,117,115,101, 95,110,111,100,101,115, 0,112, 97,100, 91, 55, 93, 0,108,111, - 99, 91, 51, 93, 0,114,111,116, 91, 51, 93, 0,109, 97,116, 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, - 91, 51, 93, 0,109,111,100,101, 0,116,111,116,101,120, 0,115,104,100,119,114, 0,115,104,100,119,103, 0,115,104,100,119, 98, - 0,115,104,100,119,112, 97,100, 0,101,110,101,114,103,121, 0,100,105,115,116, 0,115,112,111,116,115,105,122,101, 0,115,112, -111,116, 98,108,101,110,100, 0,104, 97,105,110,116, 0, 97,116,116, 49, 0, 97,116,116, 50, 0, 42, 99,117,114,102, 97,108,108, -111,102,102, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,115,104, 97,100,115,112,111,116,115,105,122,101, 0, 98,105, - 97,115, 0,115,111,102,116, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,105,108, -116,101,114,116,121,112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,109,112, - 0,114, 97,121, 95,115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,116,121, -112,101, 0, 97,114,101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,105,122, -101,121, 0, 97,114,101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121, 95,115, - 97,109,112, 95,109,101,116,104,111,100, 0,116,101,120, 97, 99,116, 0,115,104, 97,100,104, 97,108,111,115,116,101,112, 0,115, -117,110, 95,101,102,102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101,110,100,116,121,112,101, 0,104,111,114,105, -122,111,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, 0,115,117,110, 95, 98,114,105,103,104,116, -110,101,115,115, 0,115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97,116,116,101,114,101,100, 95,108,105,103,104, -116, 0,115,117,110, 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116,117,114, 98,105,100,105,116,121, 0, 97,116, -109, 95,105,110,115, 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,101,120,116,105,110, 99, -116,105,111,110, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97,110, 99,101, 95,102, 97, 99,116,111,114, 0, -115,107,121, 98,108,101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115,117,114,101, 0,115,107,121, 95, 99,111,108, -111,114,115,112, 97, 99,101, 0,112, 97,100, 52, 0, 89, 70, 95,110,117,109,112,104,111,116,111,110,115, 0, 89, 70, 95,110,117, -109,115,101, 97,114, 99,104, 0, 89, 70, 95,112,104,100,101,112,116,104, 0, 89, 70, 95,117,115,101,113,109, 99, 0, 89, 70, 95, - 98,117,102,115,105,122,101, 0, 89, 70, 95,112, 97,100, 0, 89, 70, 95, 99, 97,117,115,116,105, 99, 98,108,117,114, 0, 89, 70, - 95,108,116,114, 97,100,105,117,115, 0, 89, 70, 95,103,108,111,119,105,110,116, 0, 89, 70, 95,103,108,111,119,111,102,115, 0, - 89, 70, 95,103,108,111,119,116,121,112,101, 0, 89, 70, 95,112, 97,100, 50, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,109, 97, -116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,101, 99,114, 0,115,112,101, 99,103, 0,115,112,101, 99, 98, 0,109,105, -114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,109, 98,114, 0, 97,109, 98, 98, 0, 97,109, 98,103, 0, 97,109, 98, 0, -101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,114, 97, 0,114, 97,121, 95,109,105,114,114,111,114, 0, 97,108,112,104, - 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,102,115, 0, 97,100,100, 0,116,114, 97,110,115,108,117, 99,101,110, 99, -121, 0,102,114,101,115,110,101,108, 95,109,105,114, 0,102,114,101,115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115, -110,101,108, 95,116,114, 97, 0,102,114,101,115,110,101,108, 95,116,114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95, -108,105,109,105,116, 0,116,120, 95,102, 97,108,108,111,102,102, 0,114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100, -101,112,116,104, 95,116,114, 97, 0,104, 97,114, 0,115,101,101,100, 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109, -105,114, 0,103,108,111,115,115, 95,116,114, 97, 0,115, 97,109,112, 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, - 95,103,108,111,115,115, 95,116,114, 97, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112, -116, 95,116,104,114,101,115,104, 95,116,114, 97, 0, 97,110,105,115,111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115, -116, 95,109,105,114, 0,102, 97,100,101,116,111, 95,109,105,114, 0,115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, - 95,108, 0,102,108, 97,114,101, 99, 0,115,116, 97,114, 99, 0,108,105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105, -122,101, 0,102,108, 97,114,101,115,105,122,101, 0,115,117, 98,115,105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0, -115,116,114, 97,110,100, 95,115,116, 97, 0,115,116,114, 97,110,100, 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115, -101, 0,115,116,114, 97,110,100, 95,115,117,114,102,110,111,114, 0,115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97, -110,100, 95,119,105,100,116,104,102, 97,100,101, 0,115,116,114, 97,110,100, 95,117,118,110, 97,109,101, 91, 51, 50, 93, 0,115, - 98,105, 97,115, 0,108, 98,105, 97,115, 0,115,104, 97,100, 95, 97,108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98, -115,101,108, 0,112,114, 95,116,121,112,101, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102, -108, 97,103, 0,100,105,102,102, 95,115,104, 97,100,101,114, 0,115,112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103, -104,110,101,115,115, 0,114,101,102,114, 97, 99, 0,112, 97,114, 97,109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101, -115,115, 0, 42,114, 97,109,112, 95, 99,111,108, 0, 42,114, 97,109,112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99, -111,108, 0,114, 97,109,112,105,110, 95,115,112,101, 99, 0,114, 97,109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109, -112, 98,108,101,110,100, 95,115,112,101, 99, 0,114, 97,109,112, 95,115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, - 97, 99, 95, 99,111,108, 0,114, 97,109,112,102, 97, 99, 95,115,112,101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116, -105,111,110, 0,102,104, 0,114,101,102,108,101, 99,116, 0,102,104,100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121, -110, 97,109,111,100,101, 0,115,115,115, 95,114, 97,100,105,117,115, 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0, -115,115,115, 95,101,114,114,111,114, 0,115,115,115, 95,115, 99, 97,108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, - 99,111,108,102, 97, 99, 0,115,115,115, 95,116,101,120,102, 97, 99, 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, - 98, 97, 99,107, 0,115,115,115, 95,102,108, 97,103, 0,115,115,115, 95,112,114,101,115,101,116, 0, 89, 70, 95, 97,114, 0, 89, - 70, 95, 97,103, 0, 89, 70, 95, 97, 98, 0, 89, 70, 95,100,115, 99, 97,108,101, 0, 89, 70, 95,100,112,119,114, 0, 89, 70, 95, -100,115,109,112, 0, 89, 70, 95,112,114,101,115,101,116, 0, 89, 70, 95,100,106,105,116, 0,103,112,117,109, 97,116,101,114,105, - 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, 0,106, 49, 0,107, 49, 0,105, 50, 0,106, 50, 0, -107, 50, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,113,117, 97,116, 91, 52, 93, 0,101,120,112,120, 0, -101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115, 0, 42,109, 97,116, 0, 42,105,109, 97,116, 0, -101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,115, 0, 42, 42,109, 97,116, 0,116,111,116, 99, -111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,110,100,101,114,115,105,122,101, 0,116,104,114,101,115,104, 0,118,101, - 99, 91, 51, 93, 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,114, 97,100,105,117,115, 0,104, 49, 0,104, 50, - 0,102, 49, 0,102, 50, 0,102, 51, 0,104,105,100,101, 0,118,101, 99, 91, 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116, -115,117, 0,112,110,116,115,118, 0,114,101,115,111,108,117, 0,114,101,115,111,108,118, 0,111,114,100,101,114,117, 0,111,114, -100,101,114,118, 0,102,108, 97,103,117, 0,102,108, 97,103,118, 0, 42,107,110,111,116,115,117, 0, 42,107,110,111,116,115,118, - 0,116,105,108,116, 95,105,110,116,101,114,112, 0,114, 97,100,105,117,115, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105, -100,120, 0,107,101,114,110, 0,104, 0,110,117,114, 98, 0, 42,101,100,105,116,110,117,114, 98, 0, 42, 98,101,118,111, 98,106, - 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,117,114,118,101, 0, 42,112, 97,116,104, 0, 42,107, -101,121, 0, 98,101,118, 0,112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120, -116, 49, 0,101,120,116, 50, 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99, -116,110,117, 0, 42,108, 97,115,116,115,101,108, 98,112, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, - 0,108,105,110,101,100,105,115,116, 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0, -117,108,112,111,115, 0,117,108,104,101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, - 0, 42,115,116,114, 0, 42,115,101,108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, - 91, 50, 52, 93, 0, 42,118,102,111,110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111, -110,116, 98,105, 0,115,101,112, 99,104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, - 0, 42,116, 98, 0,115,101,108,115,116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117, -114,105,110,102,111, 0,101,102,102,101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, 0, 42,116,102, 97, - 99,101, 0, 42,109,118,101,114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99,111,108, 0, 42,109, -115,116,105, 99,107,121, 0, 42,116,101,120, 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, 42,101,100,105,116, - 95,109,101,115,104, 0,118,100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0, -116,111,116,102, 97, 99,101, 0,116,111,116,115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0, 99,117, 98,101,109, - 97,112,115,105,122,101, 0,100,114, 97,119,102,108, 97,103, 0,115,109,111,111,116,104,114,101,115,104, 0,115,117, 98,100,105, -118, 0,115,117, 98,100,105,118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0, 42,109,114, 0, 42,112,118, 0, 42,116, -112, 97,103,101, 0,117,118, 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114, 97,110,115,112, 0,116,105,108,101, - 0,117,110,119,114, 97,112, 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,111,100,101, 0, 99,114,101, 97,115, -101, 0, 98,119,101,105,103,104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,116,119,101,105,103,104,116, 0, 99, -111, 91, 51, 93, 0,110,111, 91, 51, 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,105,110,100,101,120, 0,102, 0,105, - 0,115, 91, 50, 53, 54, 93, 0,116,111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0,118, 91, 52, 93, 0, -109,105,100, 0,118, 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99,101,115, 0, 42,101,100,103,101,115, - 0, 42,118,101,114,116,115, 0,108,101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111,117,110,116, 0, 99,117,114,114,101, -110,116, 0,110,101,119,108,118,108, 0,101,100,103,101,108,118,108, 0,112,105,110,108,118,108, 0,114,101,110,100,101,114,108, -118,108, 0,117,115,101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101, - 97,115,101,115, 0, 42,118,101,114,116, 95,109, 97,112, 0, 42,101,100,103,101, 95,109, 97,112, 0, 42,111,108,100, 95,102, 97, - 99,101,115, 0, 42,111,108,100, 95,101,100,103,101,115, 0, 42,101,114,114,111,114, 0,109,111,100,105,102,105,101,114, 0,115, -117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,115, 0, 42,101,109, 67, 97, 99,104,101, 0, - 42,109, 67, 97, 99,104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54, 93, 0,108,101,110,103,116,104, 0,114, 97, -110,100,111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0, 42,115,116, 97,114,116, 95, 99, 97,112, 0, - 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,102,102,115,101,116, 95,111, 98, 0,111,102, -102,115,101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,101, 95,100,105,115,116, 0,102,105,116, 95, -116,121,112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,116, 0, 97,120,105,115, 0,116,111,108,101, -114, 97,110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,116, 95, 97,110,103,108,101, 0,118, 97,108, -117,101, 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,102,108, 97,103,115, 0,101, 95,102,108, 97, -103,115, 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112, 95,110, 97,109,101, 91, 51, 50, 93, 0, 42, -116,101,120,116,117,114,101, 0,115,116,114,101,110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0,109,105,100,108,101, -118,101,108, 0,116,101,120,109, 97,112,112,105,110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,118,108, 97,121, -101,114, 95,110, 97,109,101, 91, 51, 50, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114,111,106,101, 99,116, -111,114,115, 91, 49, 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,115, 0, 97,115, -112,101, 99,116,120, 0, 97,115,112,101, 99,116,121, 0,112,101,114, 99,101,110,116, 0,102, 97, 99,101, 67,111,117,110,116, 0, -102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,106,101, 99,116, 99,101,110,116,101,114, 0,115,116, 97,114,116,120, 0, -115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,110, 97,114,114,111,119, 0,115,112,101,101,100, 0,100, 97,109,112, 0, -102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,102,115, 0,108,105,102,101,116,105,109,101, 0,100,101,102,111,114,109, -102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,101,118, 67,111,115, 0,112, 97,114,101,110,116,105,110,118, 91, 52, 93, - 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100,101,120, 0,102,111, -114, 99,101, 0, 42, 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, 99,111,108, -108, 95,112, 97,114,109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0, 42,120, 0, 42,120,110,101,119, 0, 42,120, -111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,101,110,116, 95,120, 0, 42, 99,117, -114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,115, 0,110,117,109,102, 97, 99,101, -115, 0, 97, 98,115,111,114,112,116,105,111,110, 0,116,105,109,101, 0, 42, 98,118,104,116,114,101,101, 0, 42,100,109, 0,111, -112,101,114, 97,116,105,111,110, 0,118,101,114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,114,105, -100,115,105,122,101, 0,110,101,101,100, 98,105,110,100, 0, 42, 98,105,110,100,119,101,105,103,104,116,115, 0, 42, 98,105,110, -100, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,110,103,114,105,100, 0, 42,100,121,110,105,110, -102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,112, 97,100, 50, 0,100,121,110,103,114,105,100, -115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,121,110, 99,101,108,108,119,105,100,116,104, 0, - 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42,112,115,121,115, 0,116,111,116,100,109,118,101,114,116, 0,116,111, -116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,101, 0,112,115,121,115, 0,112,111,115,105,116,105,111,110, 0, -114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,112, 97, 0,118,103,114,111,117,112, 0,112, -114,111,116,101, 99,116, 0, 42,117,110,100,111, 95,118,101,114,116,115, 0,117,110,100,111, 95,118,101,114,116,115, 95,116,111, -116, 0,117,110,100,111, 95,115,105,103,110, 97,108, 0,108,118,108, 0,116,111,116,108,118,108, 0,115,105,109,112,108,101, 0, - 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84, 97,114,103,101,116, 0,118,103,114,111,117,112, 95,110, - 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,115,104,114,105,110,107, 84,121,112,101, 0,115,104,114,105, -110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117, 98,115,117,114,102, 76,101,118,101,108,115, 0, 42,111, -114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116, 91, 50, 93, 0,111,114,105,103,105,110, 79,112,116,115, - 0,112,110,116,115,119, 0,111,112,110,116,115,117, 0,111,112,110,116,115,118, 0,111,112,110,116,115,119, 0,116,121,112,101, -117, 0,116,121,112,101,118, 0,116,121,112,101,119, 0,102,117, 0,102,118, 0,102,119, 0,100,117, 0,100,118, 0,100,119, 0, - 42,100,101,102, 0, 42,108, 97,116,116,105, 99,101,100, 97,116, 97, 0,108, 97,116,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, -101,100,105,116,108, 97,116,116, 0,118,101, 99, 91, 56, 93, 91, 51, 93, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0, -112, 97,114, 50, 0,112, 97,114, 51, 0,112, 97,114,115,117, 98,115,116,114, 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42, -112,114,111,120,121, 0, 42,112,114,111,120,121, 95,103,114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, - 97, 99,116,105,111,110, 0, 42,112,111,115,101,108,105, 98, 0, 42,112,111,115,101, 0, 99,111,110,115,116,114, 97,105,110,116, - 67,104, 97,110,110,101,108,115, 0,100,101,102, 98, 97,115,101, 0,109,111,100,105,102,105,101,114,115, 0, 42,109, 97,116, 98, -105,116,115, 0, 97, 99,116, 99,111,108, 0,100,108,111, 99, 91, 51, 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, - 91, 51, 93, 0,100,114,111,116, 91, 51, 93, 0,111, 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 99,111,110,115,116,105,110,118, - 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0, 99,111,108, 98,105,116,115, 0,116,114, 97,110,115,102,108, 97,103, 0,112,114,111, -116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,117,112,102,108, 97,103, 0,110,108, 97,102,108, 97, -103, 0,105,112,111,102,108, 97,103, 0,105,112,111,119,105,110, 0,115, 99, 97,102,108, 97,103, 0,115, 99, 97,118,105,115,102, -108, 97,103, 0, 98,111,117,110,100,116,121,112,101, 0,100,117,112,111,110, 0,100,117,112,111,102,102, 0,100,117,112,115,116, - 97, 0,100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,109,112,105,110,103, 0,105,110,101,114,116,105, 97, - 0,102,111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,103, 0,115,105,122,101,102, 97, 99, 0,109, 97,114, -103,105,110, 0,109, 97,120, 95,118,101,108, 0,109,105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97, 99,116, 80,114,111, - 99,101,115,115,105,110,103, 84,104,114,101,115,104,111,108,100, 0,100,116, 0,100,116,120, 0,101,109,112,116,121, 95,100,114, - 97,119,116,121,112,101, 0,112, 97,100, 49, 91, 53, 93, 0,101,109,112,116,121, 95,100,114, 97,119,115,105,122,101, 0,100,117, -112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,114,115, 0, 99,111,110,116,114,111,108,108,101,114, -115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91, 51, 93, 0, 97, 99,116,100,101,102, 0,103, 97,109, -101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,111,102,116, 0,115,111,102,116,102,108, 97,103, 0, - 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110, 91, 51, 93, 0, 99,111,110,115,116,114, 97,105,110, -116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,112, 97,114,116,105, 99,108,101,115,121,115,116,101, -109, 0, 42,112,100, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0,102,108,117,105,100,115,105,109, 70, -108, 97,103, 0,114,101,115,116,114,105, 99,116,102,108, 97,103, 0,115,104, 97,112,101,110,114, 0,115,104, 97,112,101,102,108, - 97,103, 0,114,101, 99, 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112,101, 0, 42,102,108,117,105,100,115,105,109, 83,101, -116,116,105,110,103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, 70,105, -110, 97,108, 0,108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, 97,116,101, 0,105,110,105,116, 95,115,116, 97,116, -101, 0,103,112,117,108, 97,109,112, 0, 99,117,114,105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,100,101,102,108,101, 99, -116, 0,102,111,114, 99,101,102,105,101,108,100, 0,112,100,101,102, 95,100, 97,109,112, 0,112,100,101,102, 95,114,100, 97,109, -112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,101,102, 95,102,114,105, 99,116, 0,112,100,101,102, 95,114,102,114,105, - 99,116, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,112,111,119,101,114, 0,102, 95,100,105,115,116, 0,102, 95,100, - 97,109,112, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97, -100, 0,102, 95,112,111,119,101,114, 95,114, 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, 95,115, 98,105, -102,116, 0,112,100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109,112, 95,112,111, -119, 0,107,105,110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, 97,109,112, 0, -102,114,101,101, 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, - 0,107,105,110,107, 95, 97,120,105,115, 0,114,116, 50, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 0,102,114, 97,109, -101, 0,116,111,116,112,111,105,110,116, 0, 42,120,100, 97,116, 97, 0,115,116,101,112, 0,115,105,109,102,114, 97,109,101, 0, -115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,101, 0,101,100,105,116,102,114, 97,109,101, 0,108, 97, -115,116, 95,101,120, 97, 99,116, 0,120,100, 97,116, 97, 95,116,121,112,101, 0,110, 97,109,101, 91, 54, 52, 93, 0,112,114,101, -118, 95,110, 97,109,101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54, 52, 93, 0,109,101,109, 95, 99, 97, 99,104,101, 0,108,105, -110, 83,116,105,102,102, 0, 97,110,103, 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111, -110,115, 0,112,105,116,101,114, 97,116,105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, - 97,116,105,111,110,115, 0,107, 83, 82, 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, - 76, 0,107, 83, 82, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, - 76, 84, 95, 67, 76, 0,107, 86, 67, 70, 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, - 68, 70, 0,107, 77, 84, 0,107, 67, 72, 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105, -115,105,111,110,102,108, 97,103,115, 0,110,117,109, 99,108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119, -101,108,100,105,110,103, 0, 42,112, 97,114,116,105, 99,108,101,115, 0,116,111,116,115,112,114,105,110,103, 0, 42, 98,112,111, -105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,110,111,100,101,109, 97,115,115, 0,103,114, 97,118, 0,109,101,100,105, 97, -102,114,105, 99,116, 0,114,107,108,105,109,105,116, 0,112,104,121,115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108, -115,112,114,105,110,103, 0,103,111, 97,108,102,114,105, 99,116, 0,109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, - 0,100,101,102,103,111, 97,108, 0,118,101,114,116,103,114,111,117,112, 0,102,117,122,122,121,110,101,115,115, 0,105,110,115, -112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97, -108, 0,115,111,108,118,101,114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121, - 0,115,101, 99,111,110,100,115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98, - 97,108,108,115,116,105,102,102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111, -111,112,115, 0,109, 97,120,108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97, -115,116,105, 99, 0,115,112,114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97, -114,115,116,105,102,102, 0,105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0,115,104,111,119, 95, 97, -100,118, 97,110, 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101, -118,105,101,119,114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111, -100,101, 0,114,101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97, -108,117,101, 0,118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110, -101,110,116, 0,103,114, 97,118,120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0, 97,110,105,109, 83,116, 97,114,116, 0, - 97,110,105,109, 69,110,100, 0,103,115,116, 97,114, 0,109, 97,120, 82,101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0, -105,110,105, 86,101,108,121, 0,105,110,105, 86,101,108,122, 0, 42,111,114,103, 77,101,115,104, 0, 42,109,101,115,104, 83,117, -114,102, 97, 99,101, 0, 42,109,101,115,104, 66, 66, 0,115,117,114,102,100, 97,116, 97, 80, 97,116,104, 91, 50, 52, 48, 93, 0, - 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,122,101, 91, 51, 93, 0,116,121,112,101, 70,108, 97,103,115, 0,100, -111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,111,108,117,109,101, 73,110,105,116, 84,121,112,101, 0,112, 97,114, -116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,114, 97,116,101, 84,114, 97, 99,101,114,115, 0,103,101,110,101,114, - 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,114,102, 97, 99,101, 83,109,111,111,116,104,105,110,103, 0,115,117, -114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 83,105,122,101, 0,112, 97,114, -116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102, 97,114, 70,105,101,108,100, 83,105,122,101, 0, 42,109,101,115,104, - 83,117,114,102, 78,111,114,109, 97,108,115, 0, 99,112,115, 84,105,109,101, 83,116, 97,114,116, 0, 99,112,115, 84,105,109,101, - 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 83,116,114,101,110, -103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 82, 97,100,105,117,115, 0,118,101,108,111, 99,105,116,121,102, -111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 82, 97,100,105,117,115, - 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0,109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, - 0,104,111,114, 98, 0,104,111,114,107, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,110, 98, 0,122,101,110,107, 0, 97, -109, 98,107, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103,101, 0,108, -105,110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, 66,111,120, - 82, 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112,104,121,115, -105, 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101,112, 0,112, -104,121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115,116,115,116, - 97, 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, 0,115,116, - 97,114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115,116, 0,115, -116, 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100,111,102,101, -110,100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115,116,102, 97, - 99, 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97,109,112, 0, - 97,111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0, 97,111, - 95, 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114,114,111,114, - 0, 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,115, 97,109,112, 95,109,101, -116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, 97,112,112,114,111,120, 95, -112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115, 0,115,101,108, 99,111, -108, 0,115,120, 0,115,121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,108,112, 80, 97,114,109,115, 0, 99, 98, 70,111,114, -109, 97,116, 0, 99, 98, 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101, 0,102, 99, 99, 72, 97,110,100,108,101,114, 0,100, -119, 75,101,121, 70,114, 97,109,101, 69,118,101,114,121, 0,100,119, 81,117, 97,108,105,116,121, 0,100,119, 66,121,116,101,115, - 80,101,114, 83,101, 99,111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,119, 73,110,116,101,114,108,101, 97,118,101, 69,118, -101,114,121, 0, 97,118,105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 99,100, 80, 97,114,109,115, 0, 42, -112, 97,100, 0, 99,100, 83,105,122,101, 0,113,116, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 99,111,100,101, - 99, 0, 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105, -111, 95, 98,105,116,114, 97,116,101, 0,103,111,112, 95,115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,101, 0,114, - 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120, 95,112, 97, - 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95,114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,105,110, 0, -112, 97,100, 91, 51, 93, 0, 42,109, 97,116, 95,111,118,101,114,114,105,100,101, 0, 42,108,105,103,104,116, 95,111,118,101,114, -114,105,100,101, 0,108, 97,121, 95,122,109, 97,115,107, 0,108, 97,121,102,108, 97,103, 0,112, 97,115,115,102,108, 97,103, 0, -112, 97,115,115, 95,120,111,114, 0, 42, 97,118,105, 99,111,100,101, 99,100, 97,116, 97, 0, 42,113,116, 99,111,100,101, 99,100, - 97,116, 97, 0,102,102, 99,111,100,101, 99,100, 97,116, 97, 0, 97,117,100,105,111, 0, 99,102,114, 97, 0,112,115,102,114, 97, - 0,112,101,102,114, 97, 0,105,109, 97,103,101,115, 0,102,114, 97,109, 97,112,116,111, 0,116,104,114,101, 97,100,115, 0,102, -114, 97,109,101,108,101,110, 0, 98,108,117,114,102, 97, 99, 0,101,100,103,101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, - 66, 0,102,117,108,108,115, 99,114,101,101,110, 0,120,112,108, 97,121, 0,121,112,108, 97,121, 0,102,114,101,113,112,108, 97, -121, 0, 97,116,116,114,105, 98, 0,114,116, 49, 0,115,116,101,114,101,111,109,111,100,101, 0,100,105,109,101,110,115,105,111, -110,115,112,114,101,115,101,116, 0,109, 97,120,105,109,115,105,122,101, 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97, -114,116,115, 0,121,112, 97,114,116,115, 0,119,105,110,112,111,115, 0,112,108, 97,110,101,115, 0,105,109,116,121,112,101, 0, -115,117, 98,105,109,116,121,112,101, 0,113,117, 97,108,105,116,121, 0,100,105,115,112,108, 97,121,109,111,100,101, 0,114,112, - 97,100, 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,101, 0,114,101,110,100,101,114,101,114, 0,111, 99,114,101,115, - 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, 95,115,101, 99, 0,101,100,103,101,105,110,116, 0,115, - 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114,101, 99,116, 0,108, 97,121,101,114,115, 0, 97, 99,116, -108, 97,121, 0,120, 97,115,112, 0,121, 97,115,112, 0,102,114,115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, - 0, 99,111,108,111,114, 95,109,103,116, 95,102,108, 97,103, 0,112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117, -101, 0,112,111,115,116,115, 97,116, 0,100,105,116,104,101,114, 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95, -111,115, 97, 0, 98, 97,107,101, 95,102,105,108,116,101,114, 0, 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102, -108, 97,103, 0, 98, 97,107,101, 95,110,111,114,109, 97,108, 95,115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95, -115,112,108,105,116, 0, 98, 97,107,101, 95,109, 97,120,100,105,115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, - 0, 98, 97,107,101, 95,112, 97,100, 0, 71, 73,113,117, 97,108,105,116,121, 0, 71, 73, 99, 97, 99,104,101, 0, 71, 73,109,101, -116,104,111,100, 0, 71, 73,112,104,111,116,111,110,115, 0, 71, 73,100,105,114,101, 99,116, 0, 89, 70, 95, 65, 65, 0, 89, 70, -101,120,112,111,114,116,120,109,108, 0, 89, 70, 95,110,111, 98,117,109,112, 0, 89, 70, 95, 99,108, 97,109,112,114,103, 98, 0, -121,102,112, 97,100, 49, 0, 71, 73,100,101,112,116,104, 0, 71, 73, 99, 97,117,115,100,101,112,116,104, 0, 71, 73,112,105,120, -101,108,115,112,101,114,115, 97,109,112,108,101, 0, 71, 73,112,104,111,116,111,110, 99,111,117,110,116, 0, 71, 73,109,105,120, -112,104,111,116,111,110,115, 0, 71, 73,112,104,111,116,111,110,114, 97,100,105,117,115, 0, 89, 70, 95,114, 97,121,100,101,112, -116,104, 0, 89, 70, 95, 65, 65,112, 97,115,115,101,115, 0, 89, 70, 95, 65, 65,115, 97,109,112,108,101,115, 0,121,102,112, 97, -100, 50, 0, 71, 73,115,104, 97,100,111,119,113,117, 97,108,105,116,121, 0, 71, 73,114,101,102,105,110,101,109,101,110,116, 0, - 71, 73,112,111,119,101,114, 0, 71, 73,105,110,100,105,114,112,111,119,101,114, 0, 89, 70, 95,103, 97,109,109, 97, 0, 89, 70, - 95,101,120,112,111,115,117,114,101, 0, 89, 70, 95,114, 97,121, 98,105, 97,115, 0, 89, 70, 95, 65, 65,112,105,120,101,108,115, -105,122,101, 0, 89, 70, 95, 65, 65,116,104,114,101,115,104,111,108,100, 0, 98, 97, 99,107, 98,117,102, 91, 49, 54, 48, 93, 0, -112,105, 99, 91, 49, 54, 48, 93, 0,115,116, 97,109,112, 0,115,116, 97,109,112, 95,102,111,110,116, 95,105,100, 0,115,116, 97, -109,112, 95,117,100, 97,116, 97, 91, 49, 54, 48, 93, 0,102,103, 95,115,116, 97,109,112, 91, 52, 93, 0, 98,103, 95,115,116, 97, -109,112, 91, 52, 93, 0,115,105,109,112,108,105,102,121, 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,102,121, 95, -115,104, 97,100,111,119,115, 97,109,112,108,101,115, 0,115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,108,101,115, - 0,115,105,109,112,108,105,102,121, 95, 97,111,115,115,115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,105,110,101, -111,110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,116, 0,106, -112, 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51, 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,100,101, 0, -100,111,109,101, 97,110,103,108,101, 0,100,111,109,101,116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102, 0, 42,100, -111,109,101,116,101,120,116, 0,112, 97,114,116,105, 99,108,101, 95,112,101,114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97, -120, 0,115,104, 97,100, 98,117,102,115, 97,109,112,108,101, 95,109, 97,120, 0, 97,111, 95,101,114,114,111,114, 0, 99,111,108, - 91, 51, 93, 0, 42, 98,114,117,115,104, 0,116,111,111,108, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,111,114,109, 97, -108, 95, 97,110,103,108,101, 0, 42,112, 97,105,110,116, 99,117,114,115,111,114, 0,105,110,118,101,114,116, 0,116,111,116,114, -101,107,101,121, 0,116,111,116, 97,100,100,107,101,121, 0, 98,114,117,115,104,116,121,112,101, 0, 98,114,117,115,104, 91, 55, - 93, 0,101,109,105,116,116,101,114,100,105,115,116, 0,100,114, 97,119, 95,116,105,109,101,100, 0,115,101,108,101, 99,116,109, -111,100,101, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 42,115,101,115,115,105,111,110, 0, -112,105,118,111,116, 91, 51, 93, 0,116,101,120,115,101,112, 0,116, 97, 98,108,101,116, 95,115,105,122,101, 0,116, 97, 98,108, -101,116, 95,115,116,114,101,110,103,116,104, 0,112, 97,100, 91, 53, 93, 0,103, 97,109,109, 97, 0,109,117,108, 0, 42,118,112, - 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, 95,112,114,101,118, 0, 42,118,112, 97,105,110,116, 0, 42, -119,112, 97,105,110,116, 0, 42,115, 99,117,108,112,116, 0,118,103,114,111,117,112, 95,119,101,105,103,104,116, 0, 99,111,114, -110,101,114,116,121,112,101, 0,101,100,105,116, 98,117,116,102,108, 97,103, 0,106,111,105,110,116,114,105,108,105,109,105,116, - 0,100,101,103,114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102,115, 0,100,111,117, 98,108,105,109,105,116, 0,110, -111,114,109, 97,108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, 0,115,101,103,109,101,110,116,115, 0,114,105,110, -103,115, 0,118,101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112,101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100, -105,117,115, 0,117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105, -110, 0,117,118, 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0, -117,118, 99, 97,108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, 0,117,118, 95,115,101,108,101, 99,116,109,111,100, -101, 0,117,118, 95,112, 97,100, 91, 50, 93, 0, 97,117,116,111,105,107, 95, 99,104, 97,105,110,108,101,110, 0,105,109, 97,112, - 97,105,110,116, 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,115,105,122,101, 0, -115,101,108,101, 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, 95,116,104,114,101,115,104, 0, 97,117,116,111,107, -101,121, 95,109,111,100,101, 0,114,101,116,111,112,111, 95,109,111,100,101, 0,114,101,116,111,112,111, 95,112, 97,105,110,116, - 95,116,111,111,108, 0,108,105,110,101, 95,100,105,118, 0,101,108,108,105,112,115,101, 95,100,105,118, 0,114,101,116,111,112, -111, 95,104,111,116,115,112,111,116, 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,105,118, 95,116,121,112,101, 0,115, -107,103,101,110, 95,114,101,115,111,108,117,116,105,111,110, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95, -105,110,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,101,120,116,101,114,110, 97, -108, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,114, 97,116,105,111, 0,115,107,103,101,110, 95,108,101,110,103,116, -104, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 97,110,103,108,101, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, - 99,111,114,114,101,108, 97,116,105,111,110, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,115,121,109,109,101,116,114,121, - 95,108,105,109,105,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95, 97,110,103,108,101, 95,119,101,105,103, -104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,108,101,110,103,116,104, 95,119,101,105,103,104,116, 0, -115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,100,105,115,116, 97,110, 99,101, 95,119,101,105,103,104,116, 0,115, -107,103,101,110, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 0,115,107,103,101,110, - 95,112,111,115,116,112,114,111, 95,112, 97,115,115,101,115, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111, -110,115, 91, 51, 93, 0,115,107,103,101,110, 95,109,117,108,116,105, 95,108,101,118,101,108, 0, 42,115,107,103,101,110, 95,116, -101,109,112,108, 97,116,101, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 0, 98,111,110,101, 95,115,107,101,116, - 99,104,105,110,103, 95, 99,111,110,118,101,114,116, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110, 95, -110,117,109, 98,101,114, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,111,112,116,105,111,110,115, 0,115,107, -103,101,110, 95,114,101,116, 97,114,103,101,116, 95,114,111,108,108, 0,115,107,103,101,110, 95,115,105,100,101, 95,115,116,114, -105,110,103, 91, 56, 93, 0,115,107,103,101,110, 95,110,117,109, 95,115,116,114,105,110,103, 91, 56, 93, 0,101,100,103,101, 95, -109,111,100,101, 0,115,110, 97,112, 95,109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97, -114,103,101,116, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0,116,111,116,111, - 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98,106,115,101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111, -116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114,101, 0, 42, 99, 97,109,101,114, 97, 0, 42,119,111,114,108,100, - 0, 42,115,101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,111, 98,101,100,105,116, 0, 99,117,114,115,111, -114, 91, 51, 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109,105,110, 91, 51, 93, 0,116,119,109, 97,120, 91, 51, 93, - 0, 42,101,100, 0,102,114, 97,109,105,110,103, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116, -115, 0,116,114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,116,104,101, 68, 97,103, 0,100, 97,103,105,115, -118, 97,108,105,100, 0,100, 97,103,102,108, 97,103,115, 0,106,117,109,112,102,114, 97,109,101, 0,102,114, 97,109,101, 95,115, -116,101,112, 0, 97, 99,116,105,118,101, 95,107,101,121,105,110,103,115,101,116, 0,107,101,121,105,110,103,115,101,116,115, 0, - 98,108,101,110,100, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, - 0,118,105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114, -115,105,110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, - 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,116,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, - 52, 93, 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121, 0,112,105,120,115,105,122,101, 0, 99, 97,109,122, -111,111,109, 0,118,105,101,119, 98,117,116, 0,108, 97,115,116,109,111,100,101, 0,114,102,108, 97,103, 0,118,105,101,119,108, -111, 99,107, 0,112,101,114,115,112, 0,118,105,101,119, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, - 98, 0, 42,103,112,100, 0, 42,108,111, 99, 97,108,118,100, 0, 42,114,105, 0, 42,114,101,116,111,112,111, 95,118,105,101,119, - 95,100, 97,116, 97, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115, 0, 42,115,109,111,111,116,104, 95,116,105,109,101,114, - 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,115,112, 0,108,118,105,101,119, 0,114,101,103,105,111, -110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,101, 0, 98,108,111, 99,107, -104, 97,110,100,108,101,114, 91, 56, 93, 0,108, 97,121, 95,117,115,101,100, 0, 42,111, 98, 95, 99,101,110,116,114,101, 0, 42, - 98,103,112,105, 99, 0,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,110,101, 91, 51, 50, 93, 0,108, 97,121, 97, 99,116, 0, -100,114, 97,119,116,121,112,101, 0,108,111, 99, 97,108,118,105,101,119, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111, -117,110,100, 0,102,108, 97,103, 50, 0,112,105,118,111,116, 95,108, 97,115,116, 0,103,114,105,100, 0,103,114,105,100,118,105, -101,119, 0,112, 97,100,102, 0,110,101, 97,114, 0,102, 97,114, 0,103,114,105,100,108,105,110,101,115, 0,103,114,105,100,102, -108, 97,103, 0,103,114,105,100,115,117, 98,100,105,118, 0,109,111,100,101,115,101,108,101, 99,116, 0,107,101,121,102,108, 97, -103,115, 0,116,119,116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, 0,116,119,100,114, 97,119,102,108, - 97,103, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 97,102,116,101,114,100,114, 97,119, 0,122, 98,117, -102, 0,120,114, 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,102,102,105,108,116,101,114, 0, 42,112,114,111,112, -101,114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116, 0,104,111,114, 0,109, 97,115,107, 0,109,105,110, - 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,109, 97,120,122,111,111,109, 0,115, 99,114,111,108, -108, 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116, 0,107,101,101,112,122,111,111,109, 0,107,101,101, -112,111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,121, 0,111,108,100,119,105,110,120, 0,111,108,100, -119,105,110,121, 0, 99,117,114,115,111,114, 91, 50, 93, 0, 42,115, 99,114,101,101,110, 0,118, 50,100, 0, 42, 97,100,115, 0, -103,104,111,115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, 97,112, 0,112,105,110, 0,108,111, 99,107, 0, 99,117, -114,115,101,110,115, 0, 99,117,114, 97, 99,116, 0,112,114,101,118,105,101,119, 0,109, 97,105,110, 98, 0,109, 97,105,110, 98, -111, 0, 42,108,111, 99,107,112,111,105,110, 0,116,101,120,110,114, 0,116,101,120,102,114,111,109, 0,115,104,111,119,103,114, -111,117,112, 0,109,111,100,101,108,116,121,112,101, 0,115, 99,114,105,112,116, 98,108,111, 99,107, 0,114,101, 95, 97,108,105, -103,110, 0,111,108,100,107,101,121,112,114,101,115,115, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, - 0, 42,112,105,110,105,100, 0,114,101,110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, - 98,114, 97, 0,122,111,111,109, 0,116,105,116,108,101, 91, 50, 52, 93, 0,100,105,114, 91, 50, 52, 48, 93, 0,102,105,108,101, - 91, 56, 48, 93, 0,115,111,114,116, 0,100,105,115,112,108, 97,121, 0, 97, 99,116,105,118,101, 95, 98,111,111,107,109, 97,114, -107, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,115,101,108,115,116, 97,116,101, 0,102, 95,102,112, 0,109,101,110,117, - 0,102,112, 95,115,116,114, 91, 56, 93, 0, 42,112,117,112,109,101,110,117, 0, 42,112, 97,114, 97,109,115, 0, 42,102,105,108, -101,115, 0, 42,102,111,108,100,101,114,115, 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,110,101,120,116, 0, 42, -111,112, 0, 42,108,111, 97,100,105,109, 97,103,101, 95,116,105,109,101,114, 0, 42,108, 97,121,111,117,116, 0,116,114,101,101, - 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99,104, 95,115,116,114,105,110,103, 91, 51, 50, 93, 0,115,101, - 97,114, 99,104, 95,116,115,101, 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0,100,111, 95, 0,111,117,116,108,105,110, -101,118,105,115, 0,115,116,111,114,101,102,108, 97,103, 0, 42, 99,117,109, 97,112, 0,105,109, 97,110,114, 0, 99,117,114,116, -105,108,101, 0,105,109,116,121,112,101,110,114, 0,100,116, 95,117,118, 0,115,116,105, 99,107,121, 0,100,116, 95,117,118,115, -116,114,101,116, 99,104, 0, 99,101,110,116,120, 0, 99,101,110,116,121, 0, 42,116,101,120,116, 0,116,111,112, 0,118,105,101, -119,108,105,110,101,115, 0,108,104,101,105,103,104,116, 0, 99,119,105,100,116,104, 0,108,105,110,101,110,114,115, 95,116,111, -116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,114,115, 0,116, 97, 98,110,117,109, 98,101,114, 0,115,104,111, -119,115,121,110,116, 97,120, 0,111,118,101,114,119,114,105,116,101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95, -112,101,114, 95,108,105,110,101, 0,116,120,116,115, 99,114,111,108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, - 97,112, 0,100,111,112,108,117,103,105,110,115, 0,102,105,110,100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99, -101,115,116,114, 91, 50, 53, 54, 93, 0, 42,112,121, 95,100,114, 97,119, 0, 42,112,121, 95,101,118,101,110,116, 0, 42,112,121, - 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,114,111,119,115,101,114, 99, 97,108,108, 98, 97, 99,107, 0, 42,112,121, 95, -103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,115,116,115,112, 97, 99,101, 0,115, 99,114,105,112,116,110, 97,109,101, 91, - 50, 53, 54, 93, 0,115, 99,114,105,112,116, 97,114,103, 91, 50, 53, 54, 93, 0, 42,115, 99,114,105,112,116, 0, 42, 98,117,116, - 95,114,101,102,115, 0,114,101,100,114, 97,119,115, 0, 42,105,100, 0, 97,115,112,101, 99,116, 0, 42, 99,117,114,102,111,110, -116, 0,109,120, 0,109,121, 0, 42,101,100,105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0,110,117,109,116,105, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 0, 0,255,189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0, +247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, 30,145, 9,255, 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, + 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,169, 41, 78,255,193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, + 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, 36,120, 90,255, 60,149,121,255,111,182,171,255, 0, 0, 0, 0, + 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0,244,201, 12,255,238,194, 54,255,243,255, 0,255, 0, 0, 0, 0, + 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0,111, 47,106,255,152, 69,190,255,211, 48,214,255, 0, 0, 0, 0, +108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0,141,141,141,255,176,176,176,255,222,222,222,255, 0, 0, 0, 0, +131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255, 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 78, 65, 49,224,211, 0, 0, 96,169,184, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,102, 10, 0, 0, 42,110,101,120,116, 0, 42,112,114,101,118, 0, + 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,122, 0,119, 0,120,109,105,110, 0, +120,109, 97,120, 0,121,109,105,110, 0,121,109, 97,120, 0, 42,112,111,105,110,116,101,114, 0,103,114,111,117,112, 0,118, 97, +108, 0,118, 97,108, 50, 0,116,121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103, 0,110, 97,109,101, 91, 51, 50, + 93, 0,115, 97,118,101,100, 0,100, 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,110, 0, 42,110,101,119,105,100, + 0, 42,108,105, 98, 0,110, 97,109,101, 91, 50, 52, 93, 0,117,115, 0,105, 99,111,110, 95,105,100, 0, 42,112,114,111,112,101, +114,116,105,101,115, 0,105,100, 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105,108,101,100, 97,116, 97, 0,110, 97,109,101, + 91, 50, 52, 48, 93, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,116,111,116, 0,112, 97,100, 0, 42,112, 97,114, +101,110,116, 0,119, 91, 50, 93, 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93, 0,112, 97,100, 48, 0,112, 97, +100, 49, 0, 42,114,101, 99,116, 91, 50, 93, 0, 42,111, 98, 0, 98,108,111, 99,107,116,121,112,101, 0, 97,100,114, 99,111,100, +101, 0,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 98,112, 0, 42, 98,101,122,116, 0,109, 97,120,114, 99,116, 0,116,111,116, +114, 99,116, 0,118, 97,114,116,121,112,101, 0,116,111,116,118,101,114,116, 0,105,112,111, 0,101,120,116,114, 97,112, 0,114, +116, 0, 98,105,116,109, 97,115,107, 0,115,108,105,100,101, 95,109,105,110, 0,115,108,105,100,101, 95,109, 97,120, 0, 99,117, +114,118, 97,108, 0, 42,100,114,105,118,101,114, 0, 99,117,114,118,101, 0, 99,117,114, 0,115,104,111,119,107,101,121, 0,109, +117,116,101,105,112,111, 0,112,111,115, 0,114,101,108, 97,116,105,118,101, 0,116,111,116,101,108,101,109, 0,112, 97,100, 50, + 0, 42,119,101,105,103,104,116,115, 0,118,103,114,111,117,112, 91, 51, 50, 93, 0,115,108,105,100,101,114,109,105,110, 0,115, +108,105,100,101,114,109, 97,120, 0, 42, 97,100,116, 0, 42,114,101,102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, + 93, 0,101,108,101,109,115,105,122,101, 0, 98,108,111, 99,107, 0, 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107, +101,121, 0,115,108,117,114,112,104, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105,110, +101,110,111, 0,115,116, 97,114,116, 0,101,110,100, 0,102,108, 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97,100, + 91, 52, 93, 0, 42,110, 97,109,101, 0,110,108,105,110,101,115, 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115,101, +108,108, 0, 99,117,114, 99, 0,115,101,108, 99, 0,109, 97,114,107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0,117, +110,100,111, 95,112,111,115, 0,117,110,100,111, 95,108,101,110, 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109,101, + 0,115,105,122,101, 0,115,101,101,107, 0,112, 97,115,115,101,112, 97,114,116, 97,108,112,104, 97, 0, 97,110,103,108,101, 0, + 99,108,105,112,115,116, 97, 0, 99,108,105,112,101,110,100, 0,108,101,110,115, 0,111,114,116,104,111, 95,115, 99, 97,108,101, + 0,100,114, 97,119,115,105,122,101, 0,115,104,105,102,116,120, 0,115,104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105, +115,116, 0, 89, 70, 95, 97,112,101,114,116,117,114,101, 0, 89, 70, 95, 98,107,104,116,121,112,101, 0, 89, 70, 95, 98,107,104, + 98,105, 97,115, 0, 89, 70, 95, 98,107,104,114,111,116, 0, 42,100,111,102, 95,111, 98, 0,102,114, 97,109,101,110,114, 0,102, +114, 97,109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,109, 97, 0, 99,121, 99,108, 0,111, +107, 0,109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,115, 0,109,101,110,117,110,114, 0, + 42,115, 99,101,110,101, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109, 0, 42, +114,114, 0,115,111,117,114, 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,101,102,108, 97,103, 0,116,111, +116, 98,105,110,100, 0,120,114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97, 0,116,119,101,110,100, 0, 98,105,110,100, + 99,111,100,101, 0, 42,114,101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,101, 0, 42,112,114,101,118,105, +101,119, 0, 42,114,101,110,100,101,114, 95,116,101,120,116, 0,108, 97,115,116,117,112,100, 97,116,101, 0,108, 97,115,116,117, +115,101,100, 0, 97,110,105,109,115,112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, 0,103,101,110, 95,116,121, +112,101, 0, 97,115,112,120, 0, 97,115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101, +103, 0, 98,108,101,110,100,116,121,112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, + 51, 50, 93, 0,112,114,111,106,120, 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102, +115, 91, 51, 93, 0,115,105,122,101, 91, 51, 93, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0, +112,109, 97,112,116,111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,104,105, + 99,104, 95,111,117,116,112,117,116, 0,112, 97,100, 91, 50, 93, 0,114, 0,103, 0, 98, 0,107, 0,100,101,102, 95,118, 97,114, + 0, 99,111,108,102, 97, 99, 0,110,111,114,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, 97, +114,112,102, 97, 99, 0,110, 97,109,101, 91, 49, 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,101, 0, 42, +115,116,110, 97,109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,114,101,115, +117,108,116, 0, 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0, 40, 42,105, +110,115,116, 97,110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41, 0,118,101, +114,115,105,111,110, 0, 97, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93, 0,105,109, + 97,116, 91, 52, 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,105,101,119, +115, 99, 97,108,101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101, 99, 97,108, + 99, 0,108, 97,115,116,115,105,122,101, 0,110,111,105,115,101,115,105,122,101, 0,116,117,114, 98,117,108, 0, 98,114,105,103, +104,116, 0, 99,111,110,116,114, 97,115,116, 0,114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101, +114,115,105,122,101, 0,109,103, 95, 72, 0,109,103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97, +118,101,115, 0,109,103, 95,111,102,102,115,101,116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110, +116, 0,110,115, 95,111,117,116,115, 99, 97,108,101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0, +118,110, 95,119, 52, 0,118,110, 95,109,101,120,112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112, +101, 0,110,111,105,115,101,100,101,112,116,104, 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105, +115, 0,110,111,105,115,101, 98, 97,115,105,115, 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99, +114,111,112,121,109,105,110, 0, 99,114,111,112,120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108, +116,101,114, 0, 97,102,109, 97,120, 0,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0,101,120,116,101,110,100, + 0, 99,104,101, 99,107,101,114,100,105,115,116, 0,110, 97, 98,108, 97, 0,105,117,115,101,114, 0, 42,110,111,100,101,116,114, +101,101, 0, 42,112,108,117,103,105,110, 0, 42, 99,111, 98, 97, 0, 42,101,110,118, 0,117,115,101, 95,110,111,100,101,115, 0, +112, 97,100, 91, 55, 93, 0,108,111, 99, 91, 51, 93, 0,114,111,116, 91, 51, 93, 0,109, 97,116, 91, 52, 93, 91, 52, 93, 0,109, +105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0,109,111,100,101, 0,116,111,116,101,120, 0,115,104,100,119,114, 0,115,104, +100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100, 0,101,110,101,114,103,121, 0,100,105,115,116, 0,115,112, +111,116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,104, 97,105,110,116, 0, 97,116,116, 49, 0, 97,116,116, 50, + 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,115,104, 97,100,115,112, +111,116,115,105,122,101, 0, 98,105, 97,115, 0,115,111,102,116, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117, +102,102,101,114,115, 0,102,105,108,116,101,114,116,121,112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, + 0,114, 97,121, 95,115, 97,109,112, 0,114, 97,121, 95,115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97, +121, 95,115, 97,109,112, 95,116,121,112,101, 0, 97,114,101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, + 0, 97,114,101, 97, 95,115,105,122,101,121, 0, 97,114,101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114, +101,115,104, 0,114, 97,121, 95,115, 97,109,112, 95,109,101,116,104,111,100, 0,116,101,120, 97, 99,116, 0,115,104, 97,100,104, + 97,108,111,115,116,101,112, 0,115,117,110, 95,101,102,102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101,110,100, +116,121,112,101, 0,104,111,114,105,122,111,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, 0,115, +117,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97,116,116, +101,114,101,100, 95,108,105,103,104,116, 0,115,117,110, 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116,117,114, + 98,105,100,105,116,121, 0, 97,116,109, 95,105,110,115, 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, 0, 97, +116,109, 95,101,120,116,105,110, 99,116,105,111,110, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97,110, 99, +101, 95,102, 97, 99,116,111,114, 0,115,107,121, 98,108,101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115,117,114, +101, 0,115,107,121, 95, 99,111,108,111,114,115,112, 97, 99,101, 0,112, 97,100, 52, 0, 89, 70, 95,110,117,109,112,104,111,116, +111,110,115, 0, 89, 70, 95,110,117,109,115,101, 97,114, 99,104, 0, 89, 70, 95,112,104,100,101,112,116,104, 0, 89, 70, 95,117, +115,101,113,109, 99, 0, 89, 70, 95, 98,117,102,115,105,122,101, 0, 89, 70, 95,112, 97,100, 0, 89, 70, 95, 99, 97,117,115,116, +105, 99, 98,108,117,114, 0, 89, 70, 95,108,116,114, 97,100,105,117,115, 0, 89, 70, 95,103,108,111,119,105,110,116, 0, 89, 70, + 95,103,108,111,119,111,102,115, 0, 89, 70, 95,103,108,111,119,116,121,112,101, 0, 89, 70, 95,112, 97,100, 50, 0, 42,109,116, +101,120, 91, 49, 56, 93, 0,112,114, 95,116,101,120,116,117,114,101, 0,112, 97,100, 91, 51, 93, 0,109, 97,116,101,114,105, 97, +108, 95,116,121,112,101, 0,115,112,101, 99,114, 0,115,112,101, 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105, +114,103, 0,109,105,114, 98, 0, 97,109, 98,114, 0, 97,109, 98, 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, + 97,110,103, 0,115,112,101, 99,116,114, 97, 0,114, 97,121, 95,109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, + 0,115,112,101, 99, 0,122,111,102,102,115, 0, 97,100,100, 0,116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,102,114,101, +115,110,101,108, 95,109,105,114, 0,102,114,101,115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95,116, +114, 97, 0,102,114,101,115,110,101,108, 95,116,114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105,116, + 0,116,120, 95,102, 97,108,108,111,102,102, 0,114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, 95, +116,114, 97, 0,104, 97,114, 0,115,101,101,100, 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103,108, +111,115,115, 95,116,114, 97, 0,115, 97,109,112, 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111,115, +115, 95,116,114, 97, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104,114, +101,115,104, 95,116,114, 97, 0, 97,110,105,115,111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105,114, + 0,102, 97,100,101,116,111, 95,109,105,114, 0,115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102,108, + 97,114,101, 99, 0,115,116, 97,114, 99, 0,108,105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102,108, + 97,114,101,115,105,122,101, 0,115,117, 98,115,105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97,110, +100, 95,115,116, 97, 0,115,116,114, 97,110,100, 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116,114, + 97,110,100, 95,115,117,114,102,110,111,114, 0,115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119,105, +100,116,104,102, 97,100,101, 0,115,116,114, 97,110,100, 95,117,118,110, 97,109,101, 91, 51, 50, 93, 0,115, 98,105, 97,115, 0, +108, 98,105, 97,115, 0,115,104, 97,100, 95, 97,108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0,112, +114, 95,116,121,112,101, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0,100, +105,102,102, 95,115,104, 97,100,101,114, 0,115,112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115,115, + 0,114,101,102,114, 97, 99, 0,112, 97,114, 97,109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42,114, + 97,109,112, 95, 99,111,108, 0, 42,114, 97,109,112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, 97, +109,112,105,110, 95,115,112,101, 99, 0,114, 97,109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101,110, +100, 95,115,112,101, 99, 0,114, 97,109,112, 95,115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111, +108, 0,114, 97,109,112,102, 97, 99, 95,115,112,101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0,102, +104, 0,114,101,102,108,101, 99,116, 0,102,104,100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111,100, +101, 0,115,115,115, 95,114, 97,100,105,117,115, 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95,101, +114,114,111,114, 0,115,115,115, 95,115, 99, 97,108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, 97, + 99, 0,115,115,115, 95,116,101,120,102, 97, 99, 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, 0, +115,115,115, 95,102,108, 97,103, 0,115,115,115, 95,112,114,101,115,101,116, 0, 89, 70, 95, 97,114, 0, 89, 70, 95, 97,103, 0, + 89, 70, 95, 97, 98, 0, 89, 70, 95,100,115, 99, 97,108,101, 0, 89, 70, 95,100,112,119,114, 0, 89, 70, 95,100,115,109,112, 0, + 89, 70, 95,112,114,101,115,101,116, 0, 89, 70, 95,100,106,105,116, 0,103,112,117,109, 97,116,101,114,105, 97,108, 0,110, 97, +109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, 0,106, 49, 0,107, 49, 0,105, 50, 0,106, 50, 0,107, 50, 0,115,101, +108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,113,117, 97,116, 91, 52, 93, 0,101,120,112,120, 0,101,120,112,121, 0, +101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115, 0, 42,109, 97,116, 0, 42,105,109, 97,116, 0,101,108,101,109,115, + 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,115, 0, 42, 42,109, 97,116, 0,116,111,116, 99,111,108, 0,119,105, +114,101,115,105,122,101, 0,114,101,110,100,101,114,115,105,122,101, 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108, +101,109, 0,118,101, 99, 91, 51, 93, 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,114, 97,100,105,117,115, 0, +104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,105,100,101, 0,118,101, 99, 91, 52, 93, 0,109, 97,116, 95,110, +114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,115,111,108,117, 0,114,101,115,111,108,118, 0,111,114,100,101, +114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,102,108, 97,103,118, 0, 42,107,110,111,116,115,117, 0, 42,107, +110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,112, 0,114, 97,100,105,117,115, 95,105,110,116,101,114,112, 0, + 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,104, 0,110,117,114, 98, 0, 42,101,100,105,116,110,117,114, 98, 0, 42, 98, +101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,117,114,118,101, 0, 42,112, 97, +116,104, 0, 42,107,101,121, 0, 98,101,118, 0,112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100, +116,104, 0,101,120,116, 49, 0,101,120,116, 50, 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114, +101,110, 0, 97, 99,116,110,117, 0, 42,108, 97,115,116,115,101,108, 98,112, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, + 97, 99,105,110,103, 0,108,105,110,101,100,105,115,116, 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115, +112, 97, 99,101, 0,117,108,112,111,115, 0,117,108,104,101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101, +119,105,100,116,104, 0, 42,115,116,114, 0, 42,115,101,108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, + 97,109,105,108,121, 91, 50, 52, 93, 0, 42,118,102,111,110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, + 0, 42,118,102,111,110,116, 98,105, 0,115,101,112, 99,104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, + 99,116, 98,111,120, 0, 42,116, 98, 0,115,101,108,115,116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110, +102,111, 0, 99,117,114,105,110,102,111, 0,101,102,102,101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, + 0, 42,116,102, 97, 99,101, 0, 42,109,118,101,114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99, +111,108, 0, 42,109,115,116,105, 99,107,121, 0, 42,116,101,120, 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, + 42,101,100,105,116, 95,109,101,115,104, 0,118,100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116, +101,100,103,101, 0,116,111,116,102, 97, 99,101, 0,116,111,116,115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0, + 99,117, 98,101,109, 97,112,115,105,122,101, 0,100,114, 97,119,102,108, 97,103, 0,115,109,111,111,116,104,114,101,115,104, 0, +115,117, 98,100,105,118, 0,115,117, 98,100,105,118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0, 42,109,114, 0, 42, +112,118, 0, 42,116,112, 97,103,101, 0,117,118, 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114, 97,110,115,112, + 0,116,105,108,101, 0,117,110,119,114, 97,112, 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,111,100,101, 0, + 99,114,101, 97,115,101, 0, 98,119,101,105,103,104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,116,119,101,105, +103,104,116, 0, 99,111, 91, 51, 93, 0,110,111, 91, 51, 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,105,110,100,101, +120, 0,102, 0,105, 0,115, 91, 50, 53, 54, 93, 0,116,111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0, +118, 91, 52, 93, 0,109,105,100, 0,118, 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99,101,115, 0, 42, +101,100,103,101,115, 0, 42,118,101,114,116,115, 0,108,101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111,117,110,116, 0, + 99,117,114,114,101,110,116, 0,110,101,119,108,118,108, 0,101,100,103,101,108,118,108, 0,112,105,110,108,118,108, 0,114,101, +110,100,101,114,108,118,108, 0,117,115,101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, 42,101,100,103, +101, 95, 99,114,101, 97,115,101,115, 0, 42,118,101,114,116, 95,109, 97,112, 0, 42,101,100,103,101, 95,109, 97,112, 0, 42,111, +108,100, 95,102, 97, 99,101,115, 0, 42,111,108,100, 95,101,100,103,101,115, 0, 42,101,114,114,111,114, 0,109,111,100,105,102, +105,101,114, 0,115,117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,115, 0, 42,101,109, 67, + 97, 99,104,101, 0, 42,109, 67, 97, 99,104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54, 93, 0,108,101,110,103, +116,104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0, 42,115,116, 97,114,116, + 95, 99, 97,112, 0, 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,102,102,115,101,116, 95, +111, 98, 0,111,102,102,115,101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,101, 95,100,105,115,116, + 0,102,105,116, 95,116,121,112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,116, 0, 97,120,105,115, + 0,116,111,108,101,114, 97,110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,116, 95, 97,110,103,108, +101, 0,118, 97,108,117,101, 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,102,108, 97,103,115, 0, +101, 95,102,108, 97,103,115, 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112, 95,110, 97,109,101, 91, + 51, 50, 93, 0, 42,116,101,120,116,117,114,101, 0,115,116,114,101,110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0, +109,105,100,108,101,118,101,108, 0,116,101,120,109, 97,112,112,105,110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0, +117,118,108, 97,121,101,114, 95,110, 97,109,101, 91, 51, 50, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114, +111,106,101, 99,116,111,114,115, 91, 49, 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111, +114,115, 0, 97,115,112,101, 99,116,120, 0, 97,115,112,101, 99,116,121, 0,112,101,114, 99,101,110,116, 0,102, 97, 99,101, 67, +111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,106,101, 99,116, 99,101,110,116,101,114, 0,115,116, + 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,110, 97,114,114,111,119, 0,115,112,101,101,100, 0, +100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,102,115, 0,108,105,102,101,116,105,109,101, 0,100, +101,102,111,114,109,102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,101,118, 67,111,115, 0,112, 97,114,101,110,116,105, +110,118, 91, 52, 93, 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100, +101,120, 0,102,111,114, 99,101, 0, 42, 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, + 0, 42, 99,111,108,108, 95,112, 97,114,109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0, 42,120, 0, 42,120,110, +101,119, 0, 42,120,111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,101,110,116, 95, +120, 0, 42, 99,117,114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,115, 0,110,117, +109,102, 97, 99,101,115, 0, 97, 98,115,111,114,112,116,105,111,110, 0,116,105,109,101, 0, 42, 98,118,104,116,114,101,101, 0, + 42,118, 0, 42,100,109, 0, 99,102,114, 97, 0,111,112,101,114, 97,116,105,111,110, 0,118,101,114,116,101,120, 0,116,111,116, +105,110,102,108,117,101,110, 99,101, 0,103,114,105,100,115,105,122,101, 0,110,101,101,100, 98,105,110,100, 0, 42, 98,105,110, +100,119,101,105,103,104,116,115, 0, 42, 98,105,110,100, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100, +121,110,103,114,105,100, 0, 42,100,121,110,105,110,102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, + 42,112, 97,100, 50, 0,100,121,110,103,114,105,100,115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0, +100,121,110, 99,101,108,108,119,105,100,116,104, 0, 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42,112,115,121,115, + 0,116,111,116,100,109,118,101,114,116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,101, 0,112, +115,121,115, 0,112,111,115,105,116,105,111,110, 0,114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, + 99,101,112, 97, 0,118,103,114,111,117,112, 0,112,114,111,116,101, 99,116, 0, 42,117,110,100,111, 95,118,101,114,116,115, 0, +117,110,100,111, 95,118,101,114,116,115, 95,116,111,116, 0,117,110,100,111, 95,115,105,103,110, 97,108, 0,108,118,108, 0,116, +111,116,108,118,108, 0,115,105,109,112,108,101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84, 97, +114,103,101,116, 0,118,103,114,111,117,112, 95,110, 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,115,104, +114,105,110,107, 84,121,112,101, 0,115,104,114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117, 98, +115,117,114,102, 76,101,118,101,108,115, 0, 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116, 91, + 50, 93, 0,111,114,105,103,105,110, 79,112,116,115, 0,112,110,116,115,119, 0,111,112,110,116,115,117, 0,111,112,110,116,115, +118, 0,111,112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,101,119, 0,102,117, 0,102,118, + 0,102,119, 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105, 99,101,100, 97,116, 97, 0,108, + 97,116,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101, 99, 91, 56, 93, 91, 51, 93, 0, +112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114, 50, 0,112, 97,114, 51, 0,112, 97,114,115,117, 98,115,116,114, + 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,120,121, 0, 42,112,114,111,120,121, 95,103,114,111,117,112, 0, + 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,105,111,110, 0, 42,112,111,115,101,108,105, 98, 0, 42,112,111, +115,101, 0, 99,111,110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108,115, 0,100,101,102, 98, 97,115,101, 0,109,111, +100,105,102,105,101,114,115, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,116, 99,111,108, 0,100,108,111, 99, 91, 51, 93, 0, +111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,114,111,116, 91, 51, 93, 0,111, 98,109, 97,116, 91, 52, + 93, 91, 52, 93, 0, 99,111,110,115,116,105,110,118, 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0, 99,111,108, 98,105,116,115, 0, +116,114, 97,110,115,102,108, 97,103, 0,112,114,111,116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0, +117,112,102,108, 97,103, 0,110,108, 97,102,108, 97,103, 0,105,112,111,102,108, 97,103, 0,105,112,111,119,105,110, 0,115, 99, + 97,102,108, 97,103, 0,115, 99, 97,118,105,115,102,108, 97,103, 0, 98,111,117,110,100,116,121,112,101, 0,100,117,112,111,110, + 0,100,117,112,111,102,102, 0,100,117,112,115,116, 97, 0,100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97, +109,112,105,110,103, 0,105,110,101,114,116,105, 97, 0,102,111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110, +103, 0,115,105,122,101,102, 97, 99, 0,109, 97,114,103,105,110, 0,109, 97,120, 95,118,101,108, 0,109,105,110, 95,118,101,108, + 0,109, 95, 99,111,110,116, 97, 99,116, 80,114,111, 99,101,115,115,105,110,103, 84,104,114,101,115,104,111,108,100, 0,100,116, + 0,100,116,120, 0,101,109,112,116,121, 95,100,114, 97,119,116,121,112,101, 0,112, 97,100, 49, 91, 53, 93, 0,101,109,112,116, +121, 95,100,114, 97,119,115,105,122,101, 0,100,117,112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111, +114,115, 0, 99,111,110,116,114,111,108,108,101,114,115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91, + 51, 93, 0, 97, 99,116,100,101,102, 0,103, 97,109,101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115, +111,102,116, 0,115,111,102,116,102,108, 97,103, 0, 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110, + 91, 51, 93, 0, 99,111,110,115,116,114, 97,105,110,116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0, +112, 97,114,116,105, 99,108,101,115,121,115,116,101,109, 0, 42,112,100, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114, +111,117,112, 0,102,108,117,105,100,115,105,109, 70,108, 97,103, 0,114,101,115,116,114,105, 99,116,102,108, 97,103, 0,115,104, + 97,112,101,110,114, 0,115,104, 97,112,101,102,108, 97,103, 0,114,101, 99, 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112, +101, 0, 42,102,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111, +114,109, 0, 42,100,101,114,105,118,101,100, 70,105,110, 97,108, 0,108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, + 97,116,101, 0,105,110,105,116, 95,115,116, 97,116,101, 0,103,112,117,108, 97,109,112, 0, 99,117,114,105,110,100,101,120, 0, + 97, 99,116,105,118,101, 0,100,101,102,108,101, 99,116, 0,102,111,114, 99,101,102,105,101,108,100, 0,112,100,101,102, 95,100, + 97,109,112, 0,112,100,101,102, 95,114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,101,102, 95,102,114, +105, 99,116, 0,112,100,101,102, 95,114,102,114,105, 99,116, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,112,111,119, +101,114, 0,102, 95,100,105,115,116, 0,102, 95,100, 97,109,112, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, + 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,102, 95,112,111,119,101,114, 95,114, 0,112,100,101,102, 95,115, 98, +100, 97,109,112, 0,112,100,101,102, 95,115, 98,105,102,116, 0,112,100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,112, + 95,102, 97, 99, 0, 99,108,117,109,112, 95,112,111,119, 0,107,105,110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,104, + 97,112,101, 0,107,105,110,107, 95, 97,109,112, 0,102,114,101,101, 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97, 0, +116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,107, 95, 97,120,105,115, 0,114,116, 50, 0, 42,114,110,103, + 0,102, 95,110,111,105,115,101, 0,102,114, 97,109,101, 0,116,111,116,112,111,105,110,116, 0, 42,120,100, 97,116, 97, 0,115, +116,101,112, 0,115,105,109,102,114, 97,109,101, 0,115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,101, + 0,101,100,105,116,102,114, 97,109,101, 0,108, 97,115,116, 95,101,120, 97, 99,116, 0,110, 97,109,101, 91, 54, 52, 93, 0,112, +114,101,118, 95,110, 97,109,101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54, 52, 93, 0,112, 97,116,104, 91, 50, 52, 48, 93, 0, +109,101,109, 95, 99, 97, 99,104,101, 0,108,105,110, 83,116,105,102,102, 0, 97,110,103, 83,116,105,102,102, 0,118,111,108,117, +109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, 0,112,105,116,101,114, 97,116,105,111,110,115, 0,100,105,116,101,114, + 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116,105,111,110,115, 0,107, 83, 82, 72, 82, 95, 67, 76, 0,107, 83, 75, 72, + 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107, 83, 82, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 75, 95, 83, 80, + 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 86, 67, 70, 0,107, 68, 80, 0,107, 68, 71, 0,107, + 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,107, 77, 84, 0,107, 67, 72, 82, 0,107, 75, 72, 82, 0,107, 83, 72, + 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105,111,110,102,108, 97,103,115, 0,110,117,109, 99,108,117,115,116,101,114, +105,116,101,114, 97,116,105,111,110,115, 0,119,101,108,100,105,110,103, 0, 42,112, 97,114,116,105, 99,108,101,115, 0,116,111, +116,115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,109,115,103, 95,108,111, 99, +107, 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101,100, 86, 71, 95, 77, 97,115, +115, 91, 51, 50, 93, 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108,105,109,105,116, 0,112,104, +121,115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, 97,108,102,114,105, 99,116, + 0,109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0,118,101,114,116,103,114,111, +117,112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 51, 50, 93, 0,102,117,122,122,121,110,101,115, +115, 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, 71, 95, 83,112,114,105,110, +103, 95, 75, 91, 51, 50, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97,108, 0,115,111,108,118, +101,114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121, 0,115,101, 99,111,110, +100,115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98, 97,108,108,115,116,105, +102,102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111,111,112,115, 0,109, 97, +120,108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97,115,116,105, 99, 0,115, +112,114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97,114,115,116,105,102,102, + 0,105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0,115,104,111,119, 95, 97,100,118, 97,110, 99,101, +100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101,118,105,101,119,114,101, +115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111,100,101, 0,114,101,110, +100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97,108,117,101, 0,118,105, +115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110,101,110,116, 0,103,114, + 97,118,120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0, 97,110,105,109, 83,116, 97,114,116, 0, 97,110,105,109, 69,110, +100, 0,103,115,116, 97,114, 0,109, 97,120, 82,101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,101,108, +121, 0,105,110,105, 86,101,108,122, 0, 42,111,114,103, 77,101,115,104, 0, 42,109,101,115,104, 83,117,114,102, 97, 99,101, 0, + 42,109,101,115,104, 66, 66, 0,115,117,114,102,100, 97,116, 97, 80, 97,116,104, 91, 50, 52, 48, 93, 0, 98, 98, 83,116, 97,114, +116, 91, 51, 93, 0, 98, 98, 83,105,122,101, 91, 51, 93, 0,116,121,112,101, 70,108, 97,103,115, 0,100,111,109, 97,105,110, 78, +111,118,101, 99,103,101,110, 0,118,111,108,117,109,101, 73,110,105,116, 84,121,112,101, 0,112, 97,114,116, 83,108,105,112, 86, + 97,108,117,101, 0,103,101,110,101,114, 97,116,101, 84,114, 97, 99,101,114,115, 0,103,101,110,101,114, 97,116,101, 80, 97,114, +116,105, 99,108,101,115, 0,115,117,114,102, 97, 99,101, 83,109,111,111,116,104,105,110,103, 0,115,117,114,102, 97, 99,101, 83, +117, 98,100,105,118,115, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 83,105,122,101, 0,112, 97,114,116,105, 99,108,101, 73, +110,102, 65,108,112,104, 97, 0,102, 97,114, 70,105,101,108,100, 83,105,122,101, 0, 42,109,101,115,104, 83,117,114,102, 78,111, +114,109, 97,108,115, 0, 99,112,115, 84,105,109,101, 83,116, 97,114,116, 0, 99,112,115, 84,105,109,101, 69,110,100, 0, 99,112, +115, 81,117, 97,108,105,116,121, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0, 97,116, +116,114, 97, 99,116,102,111,114, 99,101, 82, 97,100,105,117,115, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 83,116, +114,101,110,103,116,104, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 82, 97,100,105,117,115, 0,108, 97,115,116,103, +111,111,100,102,114, 97,109,101, 0,109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114, 98, 0, +104,111,114,107, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,110, 98, 0,122,101,110,107, 0, 97,109, 98,107, 0,102, 97, +115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103,101, 0,108,105,110,102, 97, 99, 0, +108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, 66,111,120, 82, 97,100,105,117,115, + 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112,104,121,115,105, 99,115, 69,110,103, +105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101,112, 0,112,104,121,115,117, 98,115, +116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115,116,115,116, 97, 0,109,105,115,116, +100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, 0,115,116, 97,114, 98, 0,115,116, + 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115,116, 0,115,116, 97,114,100,105,115, +116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100,111,102,101,110,100, 0,100,111,102, +109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115,116,102, 97, 99, 0, 97,111,101,110, +101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97,109,112, 0, 97,111,109,105,120, 0, + 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0, 97,111, 95, 97,100, 97,112,116, + 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114,114,111,114, 0, 97,111, 95, 97,112, +112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,115, 97,109,112, 95,109,101,116,104,111,100, 0, 97, +111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, 97,112,112,114,111,120, 95,112, 97,115,115,101,115, + 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115, 0,115,101,108, 99,111,108, 0,115,120, 0,115, +121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,108,112, 80, 97,114,109,115, 0, 99, 98, 70,111,114,109, 97,116, 0, 99, 98, + 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101, 0,102, 99, 99, 72, 97,110,100,108,101,114, 0,100,119, 75,101,121, 70,114, + 97,109,101, 69,118,101,114,121, 0,100,119, 81,117, 97,108,105,116,121, 0,100,119, 66,121,116,101,115, 80,101,114, 83,101, 99, +111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,119, 73,110,116,101,114,108,101, 97,118,101, 69,118,101,114,121, 0, 97,118, +105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 99,100, 80, 97,114,109,115, 0, 42,112, 97,100, 0, 99,100, + 83,105,122,101, 0,113,116, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 99,111,100,101, 99, 0, 97,117,100,105, +111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95, 98,105,116,114, + 97,116,101, 0,103,111,112, 95,115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,101, 0,114, 99, 95,109, 97,120, 95, +114, 97,116,101, 0,114, 99, 95, 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120, 95,112, 97, 99,107,101,116, 95,115, +105,122,101, 0,109,117,120, 95,114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,105,110, 0, 42,109, 97,116, 95,111, +118,101,114,114,105,100,101, 0, 42,108,105,103,104,116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, 95,122,109, 97,115, +107, 0,108, 97,121,102,108, 97,103, 0,112, 97,115,115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0, 42, 97,118,105, + 99,111,100,101, 99,100, 97,116, 97, 0, 42,113,116, 99,111,100,101, 99,100, 97,116, 97, 0,102,102, 99,111,100,101, 99,100, 97, +116, 97, 0, 97,117,100,105,111, 0,112,115,102,114, 97, 0,112,101,102,114, 97, 0,105,109, 97,103,101,115, 0,102,114, 97,109, + 97,112,116,111, 0,116,104,114,101, 97,100,115, 0,102,114, 97,109,101,108,101,110, 0, 98,108,117,114,102, 97, 99, 0,101,100, +103,101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, 66, 0,102,117,108,108,115, 99,114,101,101,110, 0,120,112,108, 97,121, + 0,121,112,108, 97,121, 0,102,114,101,113,112,108, 97,121, 0, 97,116,116,114,105, 98, 0,114,116, 49, 0,115,116,101,114,101, +111,109,111,100,101, 0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116, 0,109, 97,120,105,109,115,105,122,101, + 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97,114,116,115, 0,121,112, 97,114,116,115, 0,119,105,110,112,111,115, 0, +112,108, 97,110,101,115, 0,105,109,116,121,112,101, 0,115,117, 98,105,109,116,121,112,101, 0,113,117, 97,108,105,116,121, 0, +100,105,115,112,108, 97,121,109,111,100,101, 0,114,112, 97,100, 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,101, 0, +114,101,110,100,101,114,101,114, 0,111, 99,114,101,115, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, + 95,115,101, 99, 0,101,100,103,101,105,110,116, 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114, +101, 99,116, 0,108, 97,121,101,114,115, 0, 97, 99,116,108, 97,121, 0,120, 97,115,112, 0,121, 97,115,112, 0,102,114,115, 95, +115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108,111,114, 95,109,103,116, 95,102,108, 97,103, 0,112,111, +115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111,115,116,115, 97,116, 0,100,105,116,104,101,114, 95,105, +110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, 98, 97,107,101, 95,102,105,108,116,101,114, 0, 98, 97, +107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, 98, 97,107,101, 95,110,111,114,109, 97,108, 95,115,112, + 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105,116, 0, 98, 97,107,101, 95,109, 97,120,100,105,115,116, + 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107,101, 95,112, 97,100, 0, 71, 73,113,117, 97,108,105,116, +121, 0, 71, 73, 99, 97, 99,104,101, 0, 71, 73,109,101,116,104,111,100, 0, 71, 73,112,104,111,116,111,110,115, 0, 71, 73,100, +105,114,101, 99,116, 0, 89, 70, 95, 65, 65, 0, 89, 70,101,120,112,111,114,116,120,109,108, 0, 89, 70, 95,110,111, 98,117,109, +112, 0, 89, 70, 95, 99,108, 97,109,112,114,103, 98, 0,121,102,112, 97,100, 49, 0, 71, 73,100,101,112,116,104, 0, 71, 73, 99, + 97,117,115,100,101,112,116,104, 0, 71, 73,112,105,120,101,108,115,112,101,114,115, 97,109,112,108,101, 0, 71, 73,112,104,111, +116,111,110, 99,111,117,110,116, 0, 71, 73,109,105,120,112,104,111,116,111,110,115, 0, 71, 73,112,104,111,116,111,110,114, 97, +100,105,117,115, 0, 89, 70, 95,114, 97,121,100,101,112,116,104, 0, 89, 70, 95, 65, 65,112, 97,115,115,101,115, 0, 89, 70, 95, + 65, 65,115, 97,109,112,108,101,115, 0,121,102,112, 97,100, 50, 0, 71, 73,115,104, 97,100,111,119,113,117, 97,108,105,116,121, + 0, 71, 73,114,101,102,105,110,101,109,101,110,116, 0, 71, 73,112,111,119,101,114, 0, 71, 73,105,110,100,105,114,112,111,119, +101,114, 0, 89, 70, 95,103, 97,109,109, 97, 0, 89, 70, 95,101,120,112,111,115,117,114,101, 0, 89, 70, 95,114, 97,121, 98,105, + 97,115, 0, 89, 70, 95, 65, 65,112,105,120,101,108,115,105,122,101, 0, 89, 70, 95, 65, 65,116,104,114,101,115,104,111,108,100, + 0, 98, 97, 99,107, 98,117,102, 91, 49, 54, 48, 93, 0,112,105, 99, 91, 49, 54, 48, 93, 0,115,116, 97,109,112, 0,115,116, 97, +109,112, 95,102,111,110,116, 95,105,100, 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91, 49, 54, 48, 93, 0,102,103, 95,115, +116, 97,109,112, 91, 52, 93, 0, 98,103, 95,115,116, 97,109,112, 91, 52, 93, 0,115,105,109,112,108,105,102,121, 95,115,117, 98, +115,117,114,102, 0,115,105,109,112,108,105,102,121, 95,115,104, 97,100,111,119,115, 97,109,112,108,101,115, 0,115,105,109,112, +108,105,102,121, 95,112, 97,114,116,105, 99,108,101,115, 0,115,105,109,112,108,105,102,121, 95, 97,111,115,115,115, 0, 99,105, +110,101,111,110,119,104,105,116,101, 0, 99,105,110,101,111,110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, + 97, 0,106,112, 50, 95,112,114,101,115,101,116, 0,106,112, 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51, 0,100,111,109, +101,114,101,115, 0,100,111,109,101,109,111,100,101, 0,100,111,109,101, 97,110,103,108,101, 0,100,111,109,101,116,105,108,116, + 0,100,111,109,101,114,101,115, 98,117,102, 0, 42,100,111,109,101,116,101,120,116, 0,101,110,103,105,110,101, 91, 51, 50, 93, + 0,112, 97,114,116,105, 99,108,101, 95,112,101,114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,104, 97,100, 98, +117,102,115, 97,109,112,108,101, 95,109, 97,120, 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,101,115, 98,117, +102, 0, 42,119, 97,114,112,116,101,120,116, 0, 99,111,108, 91, 51, 93, 0,112, 97,100, 49, 49, 0,102,114, 97,109,105,110,103, + 0,100,111,109,101, 0,115,116,101,114,101,111,102,108, 97,103, 0, 42, 98,114,117,115,104, 0,116,111,111,108, 0,115,101, 97, +109, 95, 98,108,101,101,100, 0,110,111,114,109, 97,108, 95, 97,110,103,108,101, 0, 42,112, 97,105,110,116, 99,117,114,115,111, +114, 0,105,110,118,101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116, 97,100,100,107,101,121, 0, 98,114,117,115, +104,116,121,112,101, 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101,114,100,105,115,116, 0,100,114, 97,119, 95, +116,105,109,101,100, 0,115,101,108,101, 99,116,109,111,100,101, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, + 91, 51, 93, 0, 42,115,101,115,115,105,111,110, 0,112,105,118,111,116, 91, 51, 93, 0,116,101,120,115,101,112, 0,116, 97, 98, +108,101,116, 95,115,105,122,101, 0,116, 97, 98,108,101,116, 95,115,116,114,101,110,103,116,104, 0,112, 97,100, 91, 53, 93, 0, +103, 97,109,109, 97, 0,109,117,108, 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, 95,112, +114,101,118, 0, 42,118,112, 97,105,110,116, 0, 42,119,112, 97,105,110,116, 0, 42,115, 99,117,108,112,116, 0,118,103,114,111, +117,112, 95,119,101,105,103,104,116, 0, 99,111,114,110,101,114,116,121,112,101, 0,101,100,105,116, 98,117,116,102,108, 97,103, + 0,106,111,105,110,116,114,105,108,105,109,105,116, 0,100,101,103,114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102, +115, 0,100,111,117, 98,108,105,109,105,116, 0,110,111,114,109, 97,108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, + 0,115,101,103,109,101,110,116,115, 0,114,105,110,103,115, 0,118,101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112, +101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100,105,117,115, 0,117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, + 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105,110, 0,117,118, 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, + 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0,117,118, 99, 97,108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, + 0,117,118, 95,115,101,108,101, 99,116,109,111,100,101, 0,117,118, 95,112, 97,100, 91, 50, 93, 0, 97,117,116,111,105,107, 95, + 99,104, 97,105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116, 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111, +114,116,105,111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101, 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, + 95,116,104,114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,111,100,101, 0,114,101,116,111,112,111, 95,109,111,100,101, + 0,114,101,116,111,112,111, 95,112, 97,105,110,116, 95,116,111,111,108, 0,108,105,110,101, 95,100,105,118, 0,101,108,108,105, +112,115,101, 95,100,105,118, 0,114,101,116,111,112,111, 95,104,111,116,115,112,111,116, 0,109,117,108,116,105,114,101,115, 95, +115,117, 98,100,105,118, 95,116,121,112,101, 0,115,107,103,101,110, 95,114,101,115,111,108,117,116,105,111,110, 0,115,107,103, +101,110, 95,116,104,114,101,115,104,111,108,100, 95,105,110,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,116,104,114,101, +115,104,111,108,100, 95,101,120,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,114, 97,116,105, +111, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 97,110,103,108,101, + 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 99,111,114,114,101,108, 97,116,105,111,110, 95,108,105,109,105,116, 0,115, +107,103,101,110, 95,115,121,109,109,101,116,114,121, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103, +101,116, 95, 97,110,103,108,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,108, +101,110,103,116,104, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,100,105,115,116, + 97,110, 99,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95, +112,111,115,116,112,114,111, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 95,112, 97,115,115,101,115, 0,115,107,103, +101,110, 95,115,117, 98,100,105,118,105,115,105,111,110,115, 91, 51, 93, 0,115,107,103,101,110, 95,109,117,108,116,105, 95,108, +101,118,101,108, 0, 42,115,107,103,101,110, 95,116,101,109,112,108, 97,116,101, 0, 98,111,110,101, 95,115,107,101,116, 99,104, +105,110,103, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 95, 99,111,110,118,101,114,116, 0,115,107,103,101,110, + 95,115,117, 98,100,105,118,105,115,105,111,110, 95,110,117,109, 98,101,114, 0,115,107,103,101,110, 95,114,101,116, 97,114,103, +101,116, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,114,111,108,108, 0,115, +107,103,101,110, 95,115,105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, 0,115,107,103,101,110, 95,110,117,109, 95,115,116, +114,105,110,103, 91, 56, 93, 0,101,100,103,101, 95,109,111,100,101, 0,115,110, 97,112, 95,109,111,100,101, 0,115,110, 97,112, + 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 0,112, +114,111,112, 95,109,111,100,101, 0,116,111,116,111, 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98,106,115,101, +108, 0,116,111,116, 99,117,114,118,101, 0,116,111,116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114,101, 0, 42, + 99, 97,109,101,114, 97, 0, 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, 0, + 42,111, 98,101,100,105,116, 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109,105, +110, 91, 51, 93, 0,116,119,109, 97,120, 91, 51, 93, 0, 42,101,100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, + 42,115,116, 97,116,115, 0,116,114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,116,104,101, 68, 97,103, 0, +100, 97,103,105,115,118, 97,108,105,100, 0,100, 97,103,102,108, 97,103,115, 0,106,117,109,112,102,114, 97,109,101, 0,102,114, + 97,109,101, 95,115,116,101,112, 0, 97, 99,116,105,118,101, 95,107,101,121,105,110,103,115,101,116, 0,107,101,121,105,110,103, +115,101,116,115, 0,103,109, 0, 98,108,101,110,100, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, + 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116, 91, 52, + 93, 91, 52, 93, 0,112,101,114,115,105,110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116,111, 98, 91, 52, 93, 91, + 52, 93, 0,112,101,114,115,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,116,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118, +105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121, 0,112,105,120,115, +105,122,101, 0, 99, 97,109,122,111,111,109, 0,118,105,101,119, 98,117,116, 0,108, 97,115,116,109,111,100,101, 0,114,102,108, + 97,103, 0,118,105,101,119,108,111, 99,107, 0,112,101,114,115,112, 0,118,105,101,119, 0, 99,108,105,112, 91, 54, 93, 91, 52, + 93, 0, 42, 99,108,105,112, 98, 98, 0, 42,103,112,100, 0, 42,108,111, 99, 97,108,118,100, 0, 42,114,105, 0, 42,114,101,116, +111,112,111, 95,118,105,101,119, 95,100, 97,116, 97, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115, 0, 42,115,109,111,111, +116,104, 95,116,105,109,101,114, 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,115,112, 0,108,118,105, +101,119, 0,114,101,103,105,111,110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97, +108,101, 0, 98,108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 93, 0,108, 97,121, 95,117,115,101,100, 0, 42,111, 98, 95, + 99,101,110,116,114,101, 0, 42, 98,103,112,105, 99, 0,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,110,101, 91, 51, 50, 93, + 0,108, 97,121, 97, 99,116, 0,100,114, 97,119,116,121,112,101, 0,108,111, 99, 97,108,118,105,101,119, 0,115, 99,101,110,101, +108,111, 99,107, 0, 97,114,111,117,110,100, 0,102,108, 97,103, 50, 0,112,105,118,111,116, 95,108, 97,115,116, 0,103,114,105, +100, 0,103,114,105,100,118,105,101,119, 0,112, 97,100,102, 0,110,101, 97,114, 0,102, 97,114, 0,103,114,105,100,108,105,110, +101,115, 0,103,114,105,100,102,108, 97,103, 0,103,114,105,100,115,117, 98,100,105,118, 0,109,111,100,101,115,101,108,101, 99, +116, 0,107,101,121,102,108, 97,103,115, 0,116,119,116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, 0, +116,119,100,114, 97,119,102,108, 97,103, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 97,102,116,101,114, +100,114, 97,119, 0,122, 98,117,102, 0,120,114, 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,102,102,105,108,116, +101,114, 0, 42,112,114,111,112,101,114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116, 0,104,111,114, 0, +109, 97,115,107, 0,109,105,110, 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,109, 97,120,122,111, +111,109, 0,115, 99,114,111,108,108, 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116, 0,107,101,101,112, +122,111,111,109, 0,107,101,101,112,111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,121, 0,111,108,100, +119,105,110,120, 0,111,108,100,119,105,110,121, 0, 99,117,114,115,111,114, 91, 50, 93, 0, 42,116, 97, 98, 95,111,102,102,115, +101,116, 0,116, 97, 98, 95,110,117,109, 0,116, 97, 98, 95, 99,117,114, 0, 42,115, 99,114,101,101,110, 0,118, 50,100, 0, 42, + 97,100,115, 0,103,104,111,115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, 97,112, 0,112,105,110, 0,108,111, 99, +107, 0,109, 97,105,110, 98, 0,109, 97,105,110, 98,111, 0,109, 97,105,110, 98,117,115,101,114, 0,114,101, 95, 97,108,105,103, +110, 0,112,114,101,118,105,101,119, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,112,105,110, +105,100, 0,114,101,110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, 98,114, 97, 0,122, +111,111,109, 0,116,105,116,108,101, 91, 50, 52, 93, 0,100,105,114, 91, 50, 52, 48, 93, 0,102,105,108,101, 91, 56, 48, 93, 0, +115,111,114,116, 0,100,105,115,112,108, 97,121, 0, 97, 99,116,105,118,101, 95, 98,111,111,107,109, 97,114,107, 0, 97, 99,116, +105,118,101, 95,102,105,108,101, 0,115,101,108,115,116, 97,116,101, 0,102, 95,102,112, 0,109,101,110,117, 0,102,112, 95,115, +116,114, 91, 56, 93, 0, 42,112,117,112,109,101,110,117, 0, 42,112, 97,114, 97,109,115, 0, 42,102,105,108,101,115, 0, 42,102, +111,108,100,101,114,115, 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,110,101,120,116, 0, 42,111,112, 0, 42,108, +111, 97,100,105,109, 97,103,101, 95,116,105,109,101,114, 0, 42,108, 97,121,111,117,116, 0,114,101, 99,101,110,116,110,114, 0, + 98,111,111,107,109, 97,114,107,110,114, 0,115,121,115,116,101,109,110,114, 0,116,114,101,101, 0, 42,116,114,101,101,115,116, +111,114,101, 0,115,101, 97,114, 99,104, 95,115,116,114,105,110,103, 91, 51, 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, + 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0,100,111, 95, 0,111,117,116,108,105,110,101,118,105,115, 0,115,116,111, +114,101,102,108, 97,103, 0, 42, 99,117,109, 97,112, 0,105,109, 97,110,114, 0, 99,117,114,116,105,108,101, 0,105,109,116,121, +112,101,110,114, 0,100,116, 95,117,118, 0,115,116,105, 99,107,121, 0,100,116, 95,117,118,115,116,114,101,116, 99,104, 0, 99, +101,110,116,120, 0, 99,101,110,116,121, 0, 42,116,101,120,116, 0,116,111,112, 0,118,105,101,119,108,105,110,101,115, 0,108, +104,101,105,103,104,116, 0, 99,119,105,100,116,104, 0,108,105,110,101,110,114,115, 95,116,111,116, 0,108,101,102,116, 0,115, +104,111,119,108,105,110,101,110,114,115, 0,116, 97, 98,110,117,109, 98,101,114, 0,115,104,111,119,115,121,110,116, 97,120, 0, +111,118,101,114,119,114,105,116,101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95,112,101,114, 95,108,105,110,101, + 0,116,120,116,115, 99,114,111,108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, 97,112, 0,100,111,112,108,117, +103,105,110,115, 0,102,105,110,100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99,101,115,116,114, 91, 50, 53, 54, + 93, 0, 42,112,121, 95,100,114, 97,119, 0, 42,112,121, 95,101,118,101,110,116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, + 42,112,121, 95, 98,114,111,119,115,101,114, 99, 97,108,108, 98, 97, 99,107, 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, + 99,116, 0,108, 97,115,116,115,112, 97, 99,101, 0,115, 99,114,105,112,116,110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99,114, +105,112,116, 97,114,103, 91, 50, 53, 54, 93, 0, 42,115, 99,114,105,112,116, 0, 42, 98,117,116, 95,114,101,102,115, 0,114,101, +100,114, 97,119,115, 0, 42,105,100, 0, 97,115,112,101, 99,116, 0, 42, 99,117,114,102,111,110,116, 0,109,120, 0,109,121, 0, + 42,101,100,105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0,116,101,120,102,114,111,109, 0,110,117,109,116,105, 108,101,115,120, 0,110,117,109,116,105,108,101,115,121, 0,118,105,101,119,114,101, 99,116, 0, 98,111,111,107,109, 97,114,107, 114,101, 99,116, 0,115, 99,114,111,108,108,112,111,115, 0,115, 99,114,111,108,108,104,101,105,103,104,116, 0,115, 99,114,111, 108,108, 97,114,101, 97, 0,114,101,116,118, 97,108, 0,112,114,118, 95,119, 0,112,114,118, 95,104, 0, 40, 42,114,101,116,117, @@ -2114,578 +1728,581 @@ char datatoc_B_blend[]= { 99,111,108, 95,111,112,116,105,111,110, 0,119, 99,111,108, 95,116,111,103,103,108,101, 0,119, 99,111,108, 95,110,117,109, 0, 119, 99,111,108, 95,110,117,109,115,108,105,100,101,114, 0,119, 99,111,108, 95,109,101,110,117, 0,119, 99,111,108, 95,112,117, 108,108,100,111,119,110, 0,119, 99,111,108, 95,109,101,110,117, 95, 98, 97, 99,107, 0,119, 99,111,108, 95,109,101,110,117, 95, -105,116,101,109, 0,119, 99,111,108, 95, 98,111,120, 0,119, 99,111,108, 95,115, 99,114,111,108,108, 0,119, 99,111,108, 95,115, -116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107, 91, 52, 93, 0,116,105,116,108,101, 91, - 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116, -105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101, -120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,105,116,108,101, 91, - 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 95,104,105, - 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95,116,105,116,108,101, 91, 52, 93, 0,108,105,115,116, 95,116, -101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,112, 97,110,101,108, 91, 52, 93, 0, -112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 91, 52, 93, 0,112, 97,110, -101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97,100,101, 49, 91, 52, 93, 0,115,104, 97,100,101, 50, 91, 52, - 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, 52, 93, 0,119,105,114,101, 91, 52, 93, 0,115,101,108,101, - 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,116,105,118,101, 91, 52, 93, 0,103,114,111,117,112, 91, 52, 93, - 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,116,114, 97,110,115,102,111,114,109, 91, 52, 93, 0,118,101, -114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 91, 52, 93, - 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 95,115,101, 97,109, 91, 52, 93, 0,101,100,103, -101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,102, 97, 99,101,115,101,108, 91, 52, 93, 0,102, 97, 99,101, 91, - 52, 93, 0,102, 97, 99,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,110,111, -114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115,111,108,105,100, 91, 52, 93, 0, 98,111,110,101, 95,112,111,115,101, 91, - 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116,114,105,112, 95,115,101,108,101, 99,116, 91, 52, 93, 0, 99,102,114, 97, -109,101, 91, 52, 93, 0,100,115, 95, 99,104, 97,110,110,101,108, 91, 52, 93, 0,100,115, 95,115,117, 98, 99,104, 97,110,110,101, -108, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,102, 97, 99,101,100,111,116, 95,115,105,122,101, 0, 98,112, - 97,100, 91, 50, 93, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,110, 91, 52, 93, 0,115,121,110,116, - 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,120, 99, 91, 52, 93, 0,109,111,118, -105,101, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101,110,101, 91, 52, 93, 0, 97,117,100,105,111, 91, 52, 93, - 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, 52, 93, 0,116,114, 97,110,115,105,116,105,111,110, 91, - 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115,104, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,104, 97, -110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,101,108, -101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,105,122,101, 0,104,112, 97,100, 91, 51, - 93, 0,115,111,108,105,100, 91, 52, 93, 0,116,117,105, 0,116, 98,117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0, -116,105,112,111, 0,116,105,110,102,111, 0,116,115,110,100, 0,116, 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116, -105,109, 97, 0,116,105,109, 97,115,101,108, 0,116,101,120,116, 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111, -100,101, 0,116,108,111,103,105, 99, 0,116, 97,114,109, 91, 50, 48, 93, 0,115,112,101, 99, 91, 52, 93, 0,100,117,112,102,108, - 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100,105,114, 91, 49, 54, 48, 93, 0,102,111,110,116,100,105,114, - 91, 49, 54, 48, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, 54, 48, 93, 0,116,101,120,116,117,100,105,114, 91, 49, 54, - 48, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,115,101,113,100,105,114, 91, 49, 54, - 48, 93, 0,112,121,116,104,111,110,100,105,114, 91, 49, 54, 48, 93, 0,115,111,117,110,100,100,105,114, 91, 49, 54, 48, 93, 0, -121,102,101,120,112,111,114,116,100,105,114, 91, 49, 54, 48, 93, 0,118,101,114,115,105,111,110,115, 0,103, 97,109,101,102,108, - 97,103,115, 0,119,104,101,101,108,108,105,110,101,115, 99,114,111,108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, - 97,103,101, 0,117,115,101,114,112,114,101,102, 0,118,105,101,119,122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, - 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97,110,115,111,112,116,115, 0,109,101,110,117,116,104,114,101, -115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 50, 0,116,104,101,109,101,115, 0,117,105,102, -111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,117,110,100,111,115,116,101,112,115, 0,117,110,100,111,109,101,109,111, -114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116, 0,103,112, 95,101,117, 99,108,105,100,101, 97,110, -100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,101,116,116,105,110,103,115, 0,116, 98, 95,108,101, -102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,115,101, 0,108,105,103,104,116, 91, 51, 93, 0,116, -119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,119, 95,104, 97,110,100,108,101,115,105,122,101, 0, -116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,116,101,120, 99,111,108,108,101, 99,116,114, 97,116, -101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,119,109,112, 97,100, 0,109,101,109, 99, 97, 99,104,101,108,105,109, -105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114, 97,109,101,115,101,114,118,101,114,112,111,114, -116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,110,116,101,114, 95,100,105, 97, 0,114,118,105, -115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,116, 95,102,105,108,101,115, 0,115,109,111,111, -116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116, 0,110,100,111,102, 95,112, 97,110, 0,110,100, -111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122,101, 0,105,112,111, 95,110,101,119, 0,118,101,114,115,101, -109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101,117,115,101,114, 91, 49, 54, 48, 93, 0,103,108, 97,108,112, -104, 97, 99,108,105,112, 0, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0, -118,101,114,116, 98, 97,115,101, 0,101,100,103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, - 99,101,110,101, 0,102,117,108,108, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101, -115,104, 0,100,111, 95,100,114, 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, - 99,117,114,115,111,114, 0,115,119, 97,112, 0,109, 97,105,110,119,105,110, 0,115,117, 98,119,105,110, 97, 99,116,105,118,101, - 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116,101,120,116, 0,104, 97,110,100,108,101,114, 91, 56, 93, 0, - 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, 0, 42,116,121,112,101, 0,112, 97,110,101,108,110, 97,109, -101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, 0,100,114, 97,119,110, 97,109,101, 91, 54, 52, 93, 0,111, -102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105,122,101,121, 0,108, 97, 98,101,108,111,102,115, 0,114,117, -110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111,108, 0,115,110, 97,112, 0,115,111,114,116,111,114,100,101, -114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105,118,101,100, 97,116, 97, 0,108,105,115,116, 95,115, 99,114, -111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115,116, 95,115,101, 97,114, 99,104, 91, 54, 52, 93, 0, 42,118, - 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, 97, 99,101,116,121,112,101, 0,104,101, 97,100,101,114,116, -121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110,100,108,101,114,115, 0, 97, 99,116,105,111,110,122,111,110, -101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, 0,115,119,105,110,105,100, 0,114,101,103,105,111,110,116, -121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,104, -101, 97,100,101,114,115,116,114, 0, 42,114,101,103,105,111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93, 0, -115,117, 98,118,101,114,115,105,111,110, 0,112, 97,100,115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105,110,115,117, - 98,118,101,114,115,105,111,110, 0, 42, 99,117,114,115, 99,114,101,101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,105, -108,101,102,108, 97,103,115, 0,103,108,111, 98, 97,108,102, 0,110, 97,109,101, 91, 56, 48, 93, 0, 42,105, 98,117,102, 0, 42, -105, 98,117,102, 95, 99,111,109,112, 0, 42,115,101, 49, 0, 42,115,101, 50, 0, 42,115,101, 51, 0,110,114, 0, 98,111,116,116, -111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, 51, 93, 0,103, 97,109,109, 97, - 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,115, 97,116,117,114, 97,116,105,111,110, 0,100,105,114, 91, 49, 54, 48, 93, 0, -100,111,110,101, 0,115,116, 97,114,116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, - 97,116, 97, 0,111,114,120, 0,111,114,121, 0, 42, 99,114,111,112, 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111, -108,111,114, 95, 98, 97,108, 97,110, 99,101, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 0, 42,116,115,116,114,105,112,100, - 97,116, 97, 95,115,116, 97,114,116,115,116,105,108,108, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 95,101,110,100,115,116, -105,108,108, 0, 42,105, 98,117,102, 95,115,116, 97,114,116,115,116,105,108,108, 0, 42,105, 98,117,102, 95,101,110,100,115,116, -105,108,108, 0, 42,105,110,115,116, 97,110, 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114, -114,101,110,116, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0, -101,110,100,111,102,115, 0,109, 97, 99,104,105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, - 0,104, 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0, 42,115,116,114,105,112, 0,102, 97, - 99,102, 48, 0,102, 97, 99,102, 49, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, - 97,115,101, 0, 42,115,111,117,110,100, 0, 42,104,100, 97,117,100,105,111, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99, -101,110,101,110,114, 0,115,116,114,111, 98,101, 0, 42,101,102,102,101, 99,116,100, 97,116, 97, 0, 97,110,105,109, 95,115,116, - 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,111,102,115, 0, 98,108,101,110,100, 95,109,111,100,101, 0, 98,108, -101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,100, 98, 97,115,101,112, 0, 42,112, 97,114,115,101,113, 0, 42,115, -101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97, 99,107, 0, 42, 97, 99,116, 95,115,101,113, 0, 97, 99,116, 95,105, -109, 97,103,101,100,105,114, 91, 50, 53, 54, 93, 0, 97, 99,116, 95,115,111,117,110,100,100,105,114, 91, 50, 53, 54, 93, 0,101, -100,103,101, 87,105,100,116,104, 0,102,111,114,119, 97,114,100, 0,119,105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0, -102, 67,108, 97,109,112, 0,102, 66,111,111,115,116, 0,100, 68,105,115,116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, - 67,111,109,112, 0, 83, 99, 97,108,101,120, 73,110,105, 0, 83, 99, 97,108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70, -105,110, 0, 83, 99, 97,108,101,121, 70,105,110, 0,120, 73,110,105, 0,120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, - 0,114,111,116, 73,110,105, 0,114,111,116, 70,105,110, 0,105,110,116,101,114,112,111,108, 97,116,105,111,110, 0, 42,102,114, - 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, 86, 97,108,105,100, 70,114, 97,109, -101, 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116,111,116,112, 97,114,116, 0,110,111, -114,109,102, 97, 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120,102, 97, 99, 0,114, 97,110,100,108, -105,102,101, 0,102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, 97,120,108,101,110, 0,100,101,102, -118,101, 99, 91, 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, 99,104,105,108,100, 91, 52, 93, 0, -109, 97,116, 91, 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115,116, 97,116,105, 99,115,116,101,112, - 0,111,109, 97,116, 0,116,105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0,102,108, 97,103, 50,110,101,103, 0, -118,101,114,116,103,114,111,117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, 51, 50, 93, 0,118,103,114,111,117, -112,110, 97,109,101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, 99, 0,117,115,101,100, 0,117,115, -101,100,101,108,101,109, 0,111,116,121,112,101, 0,111,108,100, 0, 42,112,111,105,110, 0, 42,111,108,100,112,111,105,110, 0, -114,101,115,101,116,100,105,115,116, 0,108, 97,115,116,118, 97,108, 0, 42,109, 97, 0,107,101,121, 0,113,117, 97,108, 0,113, -117, 97,108, 50, 0,116, 97,114,103,101,116, 78, 97,109,101, 91, 51, 50, 93, 0,116,111,103,103,108,101, 78, 97,109,101, 91, 51, - 50, 93, 0,118, 97,108,117,101, 91, 51, 50, 93, 0,109, 97,120,118, 97,108,117,101, 91, 51, 50, 93, 0,100,101,108, 97,121, 0, -100,117,114, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,108, 78, 97,109,101, 91, 51, 50, 93, 0,100, 97,109,112,116,105, -109,101,114, 0,112,114,111,112,110, 97,109,101, 91, 51, 50, 93, 0,109, 97,116,110, 97,109,101, 91, 51, 50, 93, 0, 97,120,105, -115,102,108, 97,103, 0, 42,102,114,111,109, 79, 98,106,101, 99,116, 0,115,117, 98,106,101, 99,116, 91, 51, 50, 93, 0, 98,111, -100,121, 91, 51, 50, 93, 0,112,117,108,115,101, 0,102,114,101,113, 0,116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110, -107,115, 0,116, 97,112, 0,106,111,121,105,110,100,101,120, 0, 97,120,105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115, -102, 0, 98,117,116,116,111,110, 0,104, 97,116, 0,104, 97,116,102, 0,112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, - 49, 50, 56, 93, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0, 42,109,121,110,101,119, 0,105,110,112,117,116,115, 0,116,111, -116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, 0,118, 97,108,111, 0,115,116, 97,116,101, 95,109, 97,115,107, - 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, 51, 50, 93, 0, 98,108,101,110,100,105,110, 0,112,114,105,111, -114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115,116,114,105,100,101, 97,120,105,115, 0,115,116,114,105,100,101, -108,101,110,103,116,104, 0,115,110,100,110,114, 0,112, 97,100, 49, 91, 50, 93, 0,109, 97,107,101, 99,111,112,121, 0, 99,111, -112,121,109, 97,100,101, 0,112, 97,100, 50, 91, 49, 93, 0,116,114, 97, 99,107, 0, 42,109,101, 0,108,105,110, 86,101,108,111, - 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0,108,111, 99, 97,108,102,108, 97,103, - 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,101,108,111, 99, 91, 51, 93, 0,102,111,114, 99,101, -114,111,116, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103,117,108, 97,114, -118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,110, 99,101, 0, 98,117,116,115,116, 97, 0, 98,117, -116,101,110,100, 0,109,105,110, 0,109, 97,120, 0,118,105,115,105,102, 97, 99, 0,114,111,116,100, 97,109,112, 0,109,105,110, -108,111, 99, 91, 51, 93, 0,109, 97,120,108,111, 99, 91, 51, 93, 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111, -116, 91, 51, 93, 0,109, 97,116,112,114,111,112, 91, 51, 50, 93, 0,100,105,115,116,114,105, 98,117,116,105,111,110, 0,105,110, -116, 95, 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103, 95, 49, 0,102,108, -111, 97,116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 51, 50, 93, 0, 42,116,111, 79, 98,106,101, - 99,116, 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111, 97,100, 97,110,105, -110, 97,109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0,103,111, 0, 97, 99, - 99,101,108,108,101,114, 97,116,105,111,110, 0,109, 97,120,115,112,101,101,100, 0,109, 97,120,114,111,116,115,112,101,101,100, - 0,109, 97,120,116,105,108,116,115,112,101,101,100, 0,116,105,108,116,100, 97,109,112, 0,115,112,101,101,100,100, 97,109,112, - 0, 42,115, 97,109,112,108,101, 0, 42,115,116,114,101, 97,109, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101, 0, - 42,115,110,100, 95,115,111,117,110,100, 0,112, 97,110,110,105,110,103, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,112, -105,116, 99,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,100,105,115,116, 97,110, 99,101, 0, -115,116,114,101, 97,109,108,101,110, 0, 99,104, 97,110,110,101,108,115, 0,104,105,103,104,112,114,105,111, 0,112, 97,100, 91, - 49, 48, 93, 0,103, 97,105,110, 0,100,111,112,112,108,101,114,102, 97, 99,116,111,114, 0,100,111,112,112,108,101,114,118,101, -108,111, 99,105,116,121, 0,110,117,109,115,111,117,110,100,115, 98,108,101,110,100,101,114, 0,110,117,109,115,111,117,110,100, -115,103, 97,109,101,101,110,103,105,110,101, 0, 42, 97,114,101, 97, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101, - 99,116, 0,100,117,112,108,105, 95,111,102,115, 91, 51, 93, 0, 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, 0,104, -101, 97,100, 91, 51, 93, 0,116, 97,105,108, 91, 51, 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114, -109, 95,104,101, 97,100, 91, 51, 93, 0, 97,114,109, 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, - 91, 52, 93, 0,120,119,105,100,116,104, 0,122,119,105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97, -100, 95,104,101, 97,100, 0,114, 97,100, 95,116, 97,105,108, 0, 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97, -115,101, 0, 42,101,100, 98,111, 0,108, 97,121,101,114, 95,112,114,111,116,101, 99,116,101,100, 0,103,104,111,115,116,101,112, - 0,103,104,111,115,116,115,105,122,101, 0,103,104,111,115,116,116,121,112,101, 0,112, 97,116,104,115,105,122,101, 0,103,104, -111,115,116,115,102, 0,103,104,111,115,116,101,102, 0,112, 97,116,104,115,102, 0,112, 97,116,104,101,102, 0,112, 97,116,104, - 98, 99, 0,112, 97,116,104, 97, 99, 0, 42,112,114,111,112, 0, 99,111,110,115,116,102,108, 97,103, 0,105,107,102,108, 97,103, - 0,115,101,108,101, 99,116,102,108, 97,103, 0, 97,103,114,112, 95,105,110,100,101,120, 0, 42, 98,111,110,101, 0, 42, 99,104, -105,108,100, 0,105,107,116,114,101,101, 0, 42, 98, 95, 98,111,110,101, 95,109, 97,116,115, 0, 42,100,117, 97,108, 95,113,117, - 97,116, 0, 42, 98, 95, 98,111,110,101, 95,100,117, 97,108, 95,113,117, 97,116,115, 0,101,117,108, 91, 51, 93, 0,114,111,116, -109,111,100,101, 0, 99,104, 97,110, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, - 52, 93, 0,112,111,115,101, 95,104,101, 97,100, 91, 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109, -105,116,109,105,110, 91, 51, 93, 0,108,105,109,105,116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, - 93, 0,105,107,115,116,114,101,116, 99,104, 0, 42, 99,117,115,116,111,109, 0, 99,104, 97,110, 98, 97,115,101, 0,112,114,111, -120,121, 95,108, 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,102,115,101,116, 91, 51, 93, 0, 99,121, 99,108,105, 99, - 95,111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,103,114,111,117,112, 0, - 99,117,115,116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,114,111,117,112,115, 0, 97, 99,116,105,118, -101, 95,109, 97,114,107,101,114, 0, 42,115,111,117,114, 99,101, 0,102,105,108,116,101,114,102,108, 97,103, 0, 97,100,115, 0, - 97, 99,116,110,114, 0, 97, 99,116,119,105,100,116,104, 0,116,105,109,101,115,108,105,100,101, 0, 42,103,114,112, 0,116,101, -109,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101, 0,101,110, -102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0, 42,116, 97,114, 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, - 93, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,116, 97,114,110,117,109, 0,116, 97,114,103, -101,116,115, 0,105,116,101,114, 97,116,105,111,110,115, 0,114,111,111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111,116, - 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,112,111,108,101,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0, -112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,110,116,119,101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103,101, -116, 91, 51, 93, 0,114,101,115,101,114,118,101,100, 49, 0,114,101,115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102, -108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101, 91, 51, 93, 0,108,111, 99,107,102,108, 97,103, 0,102,111,108,108, -111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,112,108, 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98, -117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,112,105,118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0, -109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120, 76,105,109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0, -105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,111,109, 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, - 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,111,109, 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, - 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,122,109,105,110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0, 99,104, - 97,110,110,101,108, 91, 51, 50, 93, 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105, -115, 0, 99,117,114,109,111,100, 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, - 0,115,116,114,105,100,101,108,101,110, 0,115, 99, 97,108,101, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, - 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112, -117,116, 0,104, 97,115,111,117,116,112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, - 0, 42,110,101,119, 95,115,111, 99,107, 0,110,115, 0,108,105,109,105,116, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0, -105,110,116,101,114,110, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 95,101,120,116, 0,108,111, 99,120, 0,108,111, 99,121, - 0,111,119,110, 95,105,110,100,101,120, 0,116,111, 95,105,110,100,101,120, 0, 42,116,111,115,111, 99,107, 0, 42,108,105,110, -107, 0, 42,110,101,119, 95,110,111,100,101, 0,117,115,101,114,110, 97,109,101, 91, 51, 50, 93, 0,108, 97,115,116,121, 0,111, -117,116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105,119,105,100,116,104, 0, 99,117,115,116,111,109, - 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,115,116,111,109, 52, 0,110,101,101,100, 95,101, -120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97, 0,116,111,116,114, 0, 98,117,116,114, 0,112, -114,118,114, 0, 42,116,121,112,101,105,110,102,111, 0, 42,102,114,111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, - 42,102,114,111,109,115,111, 99,107, 0,110,111,100,101,115, 0,108,105,110,107,115, 0, 42,115,116, 97, 99,107, 0, 42,116,104, -114,101, 97,100,115,116, 97, 99,107, 0,105,110,105,116, 0,115,116, 97, 99,107,115,105,122,101, 0, 99,117,114, 95,105,110,100, -101,120, 0, 97,108,108,116,121,112,101,115, 0, 42,111,119,110,116,121,112,101, 0, 42,115,101,108,105,110, 0, 42,115,101,108, -111,117,116, 0, 40, 42,116,105,109,101, 99,117,114,115,111,114, 41, 40, 41, 0, 40, 42,115,116, 97,116,115, 95,100,114, 97,119, - 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116, 98,104, 0, 42,116, 99,104, 0, 42,115, -100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,115, 0,109,105,110,115,112,101,101,100, - 0,112,101,114, 99,101,110,116,120, 0,112,101,114, 99,101,110,116,121, 0, 98,111,107,101,104, 0, 99,117,114,118,101,100, 0, -105,109, 97,103,101, 95,105,110, 95,119,105,100,116,104, 0,105,109, 97,103,101, 95,105,110, 95,104,101,105,103,104,116, 0, 99, -101,110,116,101,114, 95,120, 0, 99,101,110,116,101,114, 95,121, 0,115,112,105,110, 0,105,116,101,114, 0,119,114, 97,112, 0, -115,105,103,109, 97, 95, 99,111,108,111,114, 0,115,105,103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0,115, 97,116, 0, -116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,116,104, 0,102, 97,108,112,104, 97, 0,107,101,121, 91, 52, 93, - 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, 0, 99,111,108,110, 97,109,101, 91, 51, 50, 93, 0, 98,107,116,121,112,101, 0, -114,111,116, 97,116,105,111,110, 0,103, 97,109, 99,111, 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120, - 98,108,117,114, 0, 98,116,104,114,101,115,104, 0, 42,100,105, 99,116, 0, 42,110,111,100,101, 0, 97,110,103,108,101, 95,111, -102,115, 0, 99,111,108,109,111,100, 0,109,105,120, 0,116,104,114,101,115,104,111,108,100, 0,102, 97,100,101, 0,109, 0, 99, - 0,106,105,116, 0,112,114,111,106, 0,102,105,116, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108,101, 0,109, 97, -120,116, 97, 98,108,101, 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, 42, 99,117,114, -118,101, 0, 42,116, 97, 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0, 99,117,114,114, 0, 99,108,105,112, -114, 0, 99,109, 91, 52, 93, 0, 98,108, 97, 99,107, 91, 51, 93, 0,119,104,105,116,101, 91, 51, 93, 0, 98,119,109,117,108, 91, - 51, 93, 0,115, 97,109,112,108,101, 91, 51, 93, 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,105,110,110, -101,114,114, 97,100,105,117,115, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,114,111,116, 0,115, 99,117,108,112,116, 95, -116,111,111,108, 0, 97, 99,116,105,118,101, 95,114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116, -105,118,101, 95,109, 97,115,107, 0, 42,108, 97,121,101,114,115, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121, -101,114, 0,116,111,116,115,105,122,101, 0, 42,112,111,111,108, 0,101,100,105,116,102,108, 97,103, 0,118,101,108, 91, 51, 93, - 0,114,111,116, 91, 52, 93, 0, 97,118,101, 91, 51, 93, 0,110,117,109, 0,112, 97,114,101,110,116, 0,112, 97, 91, 52, 93, 0, -119, 91, 52, 93, 0,102,117,118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,114, 97,110,100, 91, 51, 93, 0, 42,115,116,105, - 99,107, 95,111, 98, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, 0,105, 95,114,111,116, 91, 52, 93, 0, -114, 95,114,111,116, 91, 52, 93, 0,114, 95, 97,118,101, 91, 51, 93, 0,114, 95,118,101, 91, 51, 93, 0,100,105,101,116,105,109, -101, 0, 98, 97,110,107, 0,115,105,122,101,109,117,108, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0, 98,112,105, 0, 97, -108,105,118,101, 0,108,111,111,112, 0,100,105,115,116,114, 0,112,104,121,115,116,121,112,101, 0, 97,118,101,109,111,100,101, - 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114, 97,119, 95, 97,115, 0,100,114, 97,119, 95,115,105, -122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115, 0,114,116, 50, 91, 51, 93, 0,100,114, 97,119, 95, -115,116,101,112, 0,114,101,110, 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,121,115, 95,115,116,101, -112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,116,102,114,111,109, 0, -105,110,116,101,103,114, 97,116,111,114, 0,110, 98,101,116,119,101,101,110, 0, 98,111,105,100,110,101,105,103,104, 98,111,117, -114,115, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,115,112,108,105,116, 0, 98, 98, 95, 97,110,105,109, 0, - 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98, 95,116,105,108,116, 0, 98, 98, 95,114, 97,110,100, 95, -116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0,115,105,109,112,108,105,102,121, 95,102,108, 97,103, 0, -115,105,109,112,108,105,102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112,108,105,102,121, 95,114, 97,116,101, 0,115, -105,109,112,108,105,102,121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105,109,112,108,105,102,121, 95,118,105,101,119, -112,111,114,116, 0,116,105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, 0,101,102,102, 95,104, 97,105,114, 0,103, -114,105,100, 95,114,101,115, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0, -114,101, 97, 99,116,102, 97, 99, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,114,111,116, -102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,105,122,101, 0,114,101, 97, 99,116,115, -104, 97,112,101, 0, 97, 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114,111,119,110,102, 97, 99, 0,100, 97,109, -112,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104, 0, 99,104,105,108,100, 95,110, 98,114, 0,114,101,110, 95, 99,104, -105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115, 0, 99,104,105,108,100,115,105,122,101, 0, 99,104,105,108,100,114, - 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,100, 0, 99,104,105,108,100,102,108, 97,116, 0, 99,108,117,109,112, -102, 97, 99, 0, 99,108,117,109,112,112,111,119, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122,101, 0, -114,111,117,103,104, 50, 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101,115, 0, -114,111,117,103,104, 95,101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110,103,116, -104, 0, 99,108,101,110,103,116,104, 95,116,104,114,101,115, 0, 98,114, 97,110, 99,104, 95,116,104,114,101,115, 0,100,114, 97, -119, 95,108,105,110,101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95,101,110,100, 0,116,114, - 97,105,108, 95, 99,111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,109, 97,120, 95,108, 97,116, 95, 97, 99, - 99, 0,109, 97,120, 95,116, 97,110, 95, 97, 99, 99, 0, 97,118,101,114, 97,103,101, 95,118,101,108, 0, 98, 97,110,107,105,110, -103, 0,109, 97,120, 95, 98, 97,110,107, 0,103,114,111,117,110,100,122, 0, 98,111,105,100,102, 97, 99, 91, 56, 93, 0, 98,111, -105,100,114,117,108,101, 91, 56, 93, 0, 42,101,102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, - 95,111, 98, 0, 42,112,100, 50, 0, 42,112, 97,114,116, 0, 42,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116, - 41, 40, 41, 0, 42, 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,104,105,108,100, 99, 97, 99,104,101, 0,112, 97,116, -104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,104,101, 98,117,102,115, 0, 42,116, 97,114,103,101, -116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,101,102,102,101, 99,116,111,114,115, 0,114,101, 97, 99,116,101,118,101, -110,116,115, 0,107,101,121,101,100, 95,116, 97,114,103,101,116,115, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, - 99,104,101,100, 0,116,111,116, 99,104,105,108,100, 99, 97, 99,104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0,116, -111,116,107,101,121,101,100, 0, 98, 97,107,101,115,112, 97, 99,101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, 51, - 50, 93, 0,118,103,114,111,117,112, 91, 49, 50, 93, 0,118,103, 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101,114, -100, 97,116, 97, 0, 42, 99, 97, 99,104,101, 0, 67,100,105,115, 0, 67,118,105, 0, 91, 51, 93, 0,115,116,114,117, 99,116,117, -114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, 97,120, 95, 98,101,110,100, 0,109, 97,120, 95,115,116,114,117, 99,116, 0, -109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, 95,115,112,114,105,110,103, 95,108,101,110, 0,116,105,109,101,115, 99, 97, -108,101, 0,101,102,102, 95,102,111,114, 99,101, 95,115, 99, 97,108,101, 0,101,102,102, 95,119,105,110,100, 95,115, 99, 97,108, -101, 0,115,105,109, 95,116,105,109,101, 95,111,108,100, 0,115,116,101,112,115, 80,101,114, 70,114, 97,109,101, 0,112,114,101, -114,111,108,108, 0,109, 97,120,115,112,114,105,110,103,108,101,110, 0,115,111,108,118,101,114, 95,116,121,112,101, 0,118,103, -114,111,117,112, 95, 98,101,110,100, 0,118,103,114,111,117,112, 95,109, 97,115,115, 0,118,103,114,111,117,112, 95,115,116,114, -117, 99,116, 0,112,114,101,115,101,116,115, 0, 42, 99,111,108,108,105,115,105,111,110, 95,108,105,115,116, 0,101,112,115,105, -108,111,110, 0,115,101,108,102, 95,102,114,105, 99,116,105,111,110, 0,115,101,108,102,101,112,115,105,108,111,110, 0,115,101, -108,102, 95,108,111,111,112, 95, 99,111,117,110,116, 0,108,111,111,112, 95, 99,111,117,110,116, 0,112,114,101,115,115,117,114, -101, 0, 42,112,111,105,110,116,115, 0,116,111,116,112,111,105,110,116,115, 0,116,104,105, 99,107,110,101,115,115, 0,115,116, -114,111,107,101,115, 0,102,114, 97,109,101,110,117,109, 0, 42, 97, 99,116,102,114, 97,109,101, 0,103,115,116,101,112, 0,105, -110,102,111, 91, 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, 95,115,105,122,101, 0,115, 98,117,102,102,101,114, 95,115,102, -108, 97,103, 0, 42,115, 98,117,102,102,101,114, 0, 42,116,121,112,101,115,116,114, 0, 42,109,101,115,115, 97,103,101, 0,108, -105,115,116, 0,112,114,105,110,116,108,101,118,101,108, 0,115,116,111,114,101,108,101,118,101,108, 0, 42,119,105,110,100,114, - 97,119, 97, 98,108,101, 0, 42,119,105,110, 97, 99,116,105,118,101, 0,119,105,110,100,111,119,115, 0,105,110,105,116,105, 97, -108,105,122,101,100, 0,102,105,108,101, 95,115, 97,118,101,100, 0,111,112,101,114, 97,116,111,114,115, 0,113,117,101,117,101, - 0,114,101,112,111,114,116,115, 0,106,111, 98,115, 0,112, 97,105,110,116, 99,117,114,115,111,114,115, 0,107,101,121,109, 97, -112,115, 0, 42,103,104,111,115,116,119,105,110, 0, 42,110,101,119,115, 99,114,101,101,110, 0,115, 99,114,101,101,110,110, 97, -109,101, 91, 51, 50, 93, 0,112,111,115,120, 0,112,111,115,121, 0,119,105,110,100,111,119,115,116, 97,116,101, 0,109,111,110, -105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0, 97,100,100,109,111,117,115,101,109,111,118,101, 0, 42,101,118, -101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110, 0, 42,116,119,101, 97,107, 0,100,114, 97,119,109,101,116, -104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,119,100, 97,116, 97, 0,116,105,109,101,114,115, 0,115,117, - 98,119,105,110,100,111,119,115, 0,103,101,115,116,117,114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0, 42,112,116,114, - 0,115,104,105,102,116, 0, 99,116,114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105,102,105,101, -114, 0,107,101,121,109, 97,112, 0,110, 97,109,101,105,100, 91, 54, 52, 93, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105, -111,110,105,100, 0, 42, 99,117,115,116,111,109,100, 97,116, 97, 0, 42,114,101,112,111,114,116,115, 0,109,118, 97,108, 91, 50, - 93, 0,112,114,101,118,120, 0,112,114,101,118,121, 0,117,110,105, 99,111,100,101, 0, 97,115, 99,105,105, 0, 42,107,101,121, -109, 97,112, 95,105,100,110, 97,109,101, 0, 99,117,115,116,111,109, 0, 99,117,115,116,111,109,100, 97,116, 97,102,114,101,101, - 0, 42,101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0, 42, 99,111,101,102,102,105, 99,105,101,110,116,115, 0, - 97,114,114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100,101, 0,112, -104, 97,115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0,118, 97,108, -117,101, 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, 97,102,116, -101,114, 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99,121, 99,108, -101,115, 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0, 42,114,110, 97, 95, -112, 97,116,104, 0, 97,114,114, 97,121, 95,105,110,100,101,120, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, 93, - 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,114, 91, 51, 93, - 0,102,114,111,109, 91, 49, 50, 56, 93, 0,116,111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,115,116,114,105, -112,115, 0, 42,114,101,109, 97,112, 0,102, 99,117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101, 0, 98,108,101, -110,100,109,111,100,101, 0,101,120,116,101,110,100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,105,100,116,121, -112,101, 0,116,101,109,112,108, 97,116,101,115, 0,103,114,111,117,112,109,111,100,101, 0,112, 97,116,104,115, 0,107,101,121, -105,110,103,102,108, 97,103, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115, -116,114,105,112, 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 0, 84, 89, 80, 69,161, 1, 0, 0, - 99,104, 97,114, 0,117, 99,104, 97,114, 0,115,104,111,114,116, 0,117,115,104,111,114,116, 0,105,110,116, 0,108,111,110,103, - 0,117,108,111,110,103, 0,102,108,111, 97,116, 0,100,111,117, 98,108,101, 0,118,111,105,100, 0, 76,105,110,107, 0, 76,105, -110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118,101, 99, 50,105, 0,118,101, 99, 50, -102, 0,118,101, 99, 50,100, 0,118,101, 99, 51,105, 0,118,101, 99, 51,102, 0,118,101, 99, 51,100, 0,118,101, 99, 52,105, 0, -118,101, 99, 52,102, 0,118,101, 99, 52,100, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68, 80,114,111,112,101,114,116,121, - 68, 97,116, 97, 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,114,121, 0, 70,105,108,101, 68, - 97,116, 97, 0, 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,101,114, 0, 79, 98,106,101, 99, -116, 0, 73,112,111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,112,108,101, 0, 73,112,111, 0, - 75,101,121, 66,108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 83, 99,114,105,112,116, 76,105,110,107, - 0, 84,101,120,116, 76,105,110,101, 0, 84,101,120,116, 77, 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, - 70,105,108,101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103, -101, 0, 71, 80, 85, 84,101,120,116,117,114,101, 0, 97,110,105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, - 84,101,120, 0, 84,101,120, 0, 80,108,117,103,105,110, 84,101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97, -110,100, 0, 69,110,118, 77, 97,112, 0, 73,109, 66,117,102, 0, 98, 78,111,100,101, 84,114,101,101, 0, 84,101,120, 77, 97,112, -112,105,110,103, 0, 76, 97,109,112, 0, 67,117,114,118,101, 77, 97,112,112,105,110,103, 0, 87, 97,118,101, 0, 77, 97,116,101, -114,105, 97,108, 0, 71,114,111,117,112, 0, 86, 70,111,110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69, -108,101,109, 0, 66,111,117,110,100, 66,111,120, 0, 77,101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73, -110,102,111, 0, 84,101,120,116, 66,111,120, 0, 67,117,114,118,101, 0, 80, 97,116,104, 0, 83,101,108, 66,111,120, 0, 69,100, -105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 70, 97, 99,101, 0, 77, 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0, 77, - 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68,101,102,111,114,109, 86,101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,105, - 99,107,121, 0, 77, 83,101,108,101, 99,116, 0, 69,100,105,116, 77,101,115,104, 0, 67,117,115,116,111,109, 68, 97,116, 97, 0, - 77,117,108,116,105,114,101,115, 0, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 0, 77, 68,101,102,111, -114,109, 87,101,105,103,104,116, 0, 77, 84,101,120, 80,111,108,121, 0, 77, 76,111,111,112, 85, 86, 0, 77, 76,111,111,112, 67, -111,108, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77, 73,110,116, 80,114,111,112,101,114,116,121, 0, 77, - 83,116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103, 83,112, 97, 99,101, 70, 97, 99,101, 0, 77, 68,105, -115,112,115, 0, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65, 87, 32, 40, 49, 60, 60, 49, 41, 32, - 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 32, 40, 49, 60, 60, 50, 41, 32, 35,100,101,102,105,110,101, 32, 77, - 69, 95, 70, 71, 79, 78, 32, 40, 49, 60, 60, 51, 41, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 82, 69, - 78, 68, 69, 82, 32, 40, 49, 60, 60, 53, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 76, 79, 79, 83, 69, 69, 68, 71, 69, - 32, 40, 49, 60, 60, 55, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 95, 76, 65, 83, 84, 32, 40, 49, 60, - 60, 56, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 72, 65, 82, 80, 32, 40, 49, 60, 60, 57, 41, 32, 32, 32, 35,100, -101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, - 80, 86, 50, 32, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 51, 32, 52, 32, 35,100,101,102,105,110, -101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 52, 32, 56, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 89, 32, - 49, 54, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 90, 32, 51, 50, 32, 35,100,101,102,105,110,101, 32, - 77, 69, 95, 80, 82, 79, 74, 89, 90, 32, 54, 52, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 49, 86, 50, 32, 49, 32, - 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 50, 86, 51, 32, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, - 49, 32, 52, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 52, 32, 52, 32, 35,100,101,102,105,110,101, 32, 77, 69, - 95, 86, 52, 86, 49, 32, 56, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 32, 49, 32, 35,100,101, -102,105,110,101, 32, 77, 69, 95, 70, 65, 67, 69, 95, 83, 69, 76, 32, 50, 32, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, - 86, 83, 69,108, 32, 48, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108, 32, 49, 32, 35,100,101,102,105,110,101, - 32, 77, 69, 95, 70, 83, 69, 76, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 32, 49, 32, - 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, - 95, 83, 69, 76, 49, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 50, 32, 56, 32, 35,100,101,102,105,110, -101, 32, 84, 70, 95, 83, 69, 76, 51, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 32, 51, 50, 32, - 35,100,101,102,105,110,101, 32, 84, 70, 95, 72, 73, 68, 69, 32, 54, 52, 32, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, - 68, 89, 78, 65, 77, 73, 67, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, 82, 84, 32, 50, - 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 69, 88, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, - 82, 69, 68, 86, 69, 82, 84, 32, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, 32, 49, 54, 32, 35,100, -101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 67, 79, 76, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, - 95, 84, 73, 76, 69, 83, 32, 49, 50, 56, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, - 32, 50, 53, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 87, 79, 83, 73, 68, 69, 32, 53, 49, 50, 32, 35,100,101,102, -105,110,101, 32, 84, 70, 95, 73, 78, 86, 73, 83, 73, 66, 76, 69, 32, 49, 48, 50, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, - 95, 79, 66, 67, 79, 76, 32, 50, 48, 52, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, - 50, 32, 52, 48, 57, 54, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 32, 56, 49, 57, 50, 32, 35, -100,101,102,105,110,101, 32, 84, 70, 95, 66, 77, 70, 79, 78, 84, 32, 49, 54, 51, 56, 52, 32, 32, 35,100,101,102,105,110,101, 32, - 84, 70, 95, 83, 79, 76, 73, 68, 32, 48, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 32, 49, 32, 35,100,101,102, -105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73, 80, 32, 52, - 32, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 85, 66, 32, 51, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, - 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, - 84, 69, 68, 50, 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 51, 32, 52, 32, - 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 52, 32, 56, 32, 35,100,101,102,105,110,101, - 32, 84, 70, 95, 80, 73, 78, 49, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 32, 51, 50, 32, 35, -100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 51, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, - 52, 32, 49, 50, 56, 32, 35,101,110,100,105,102, 32,117,108,116,105,114,101,115, 76,101,118,101,108, 59, 13, 10, 13, 10,116,121, -112,101,100,101,102, 32,115,116,114,117, 99,116, 32, 77,117,108,116,105,114,101,115, 32,123, 13, 10, 9, 76,105,115,116, 66, 97, -115,101, 32,108,101,118,101,108,115, 59, 13, 10, 9, 77, 86,101,114,116, 32, 42,118,101,114,116,115, 59, 13, 10, 13, 10, 9,117, -110,115,105,103,110,101,100, 32, 99,104, 97,114, 32,108,101,118,101,108, 95, 99,111,117,110,116, 44, 32, 99,117,114,114,101,110, -116, 44, 32,110,101,119,108,118,108, 44, 32,101,100,103,101,108,118,108, 44, 32,112,105,110,108,118,108, 44, 32,114,101,110,100, -101,114,108,118,108, 59, 13, 10, 9,117,110,115,105,103,110,101,100, 32, 99,104, 97,114, 32,117,115,101, 95, 99,111,108, 44, 32, -102,108, 97,103, 59, 13, 10, 13, 10, 9, 47, 42, 32, 83,112,101, 99,105, 97,108, 32,108,101,118,101,108, 32, 49, 32,100, 97,116, - 97, 32,116,104, 97,116, 32, 99, 97,110,110,111,116, 32, 98,101, 32,109,111,100,105,102,105,101,100, 32,102,114,111,109, 32,111, -116,104,101,114, 32,108,101,118,101,108,115, 32, 42, 47, 13, 10, 9, 67,117,115,116,111,109, 68, 97,116, 97, 32,118,100, 97,116, - 97, 59, 13, 10, 9, 67,117,115,116,111,109, 68, 97,116, 97, 32,102,100, 97,116, 97, 59, 13, 10, 9,115,104,111,114,116, 32, 42, -101,100,103,101, 95,102,108, 97,103,115, 59, 13, 10, 9, 99,104, 97,114, 32, 42,101,100,103,101, 95, 99,114,101, 97,115,101,115, - 59, 13, 10,125, 32, 77,117,108,116,105,114,101,115, 59, 13, 10, 13, 10, 47, 42, 42, 32, 69,110,100, 32, 77,117,108,116,105,114, -101,115, 32, 42, 42, 47, 13, 10, 13, 10,116,121,112,101,100,101,102, 32,115,116,114,117, 99,116, 32, 80, 97,114,116,105, 97,108, - 86,105,115,105, 98,105,108,105,116,121, 32,123, 13, 10, 9,117,110,115,105,103,110,101,100, 32,105,110,116, 32, 42,118,101,114, -116, 95,109, 97,112, 59, 32, 47, 42, 32,118,101,114,116, 95,109, 97,112, 91, 79,108,100, 32, 73,110,100,101,120, 93, 61, 32, 78, -101,119, 32, 73,110,100,101,120, 32, 42, 47, 13, 10, 9,105,110,116, 32, 42,101,100,103,101, 95,109, 97,112, 59, 32, 47, 42, 32, -101,100,103,101, 95,109, 97,112, 91, 79,108,100, 32, 73,110,100,101,120, 93, 61, 32, 78,101,119, 32, 73,110,100,101,120, 44, 32, - 45, 49, 61, 32,104,105,100,100,101,110, 32, 42, 47, 13, 10, 9, 77, 70, 97, 99,101, 32, 42,111,108,100, 95,102, 97, 99,101,115, - 59, 13, 10, 9, 77, 69,100,103,101, 32, 42,111,108,100, 95,101,100,103,101,115, 59, 13, 10, 9,117,110,115,105,103,110,101,100, - 32,105,110,116, 32,116,111,116,102, 97, 99,101, 44, 32,116,111,116,101,100,103,101, 44, 32,116,111,116,118,101,114,116, 44, 32, -112, 97,100, 59, 13, 10,125, 32, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 59, 13, 10, 13, 10, 47, 42, - 32,109,118,101,114,116, 45, 62,102,108, 97,103, 32, 40, 49, 61, 83, 69, 76, 69, 67, 84, 41, 32, 42, 47, 13, 10, 35,100,101,102, -105,110,101, 32, 77, 69, 95, 83, 80, 72, 69, 82, 69, 84, 69, 83, 84, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, - 83, 80, 72, 69, 82, 69, 84, 69, 77, 80, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 72, 73, 68, 69, 9, 9, 9, - 49, 54, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 69, 82, 84, 95, 77, 69, 82, 71, 69, 68, 9, 9, 40, 49, 60, 60, - 54, 41, 13, 10, 13, 10, 47, 42, 32,109,101,100,103,101, 45, 62,102,108, 97,103, 32, 40, 49, 61, 83, 69, 76, 69, 67, 84, 41, 42, - 47, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65, 87, 9, 9, 9, 40, 49, 60, 60, 49, 41, 13, - 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 9, 9, 9, 9, 40, 49, 60, 60, 50, 41, 13, 10, 35,100,101,102, -105,110,101, 32, 77, 69, 95, 70, 71, 79, 78, 9, 9, 9, 9, 40, 49, 60, 60, 51, 41, 13, 10, 9, 9, 9, 9, 9, 9, 47, 42, 32, -114,101,115,101,114,118,101, 32, 49, 54, 32,102,111,114, 32, 77, 69, 95, 72, 73, 68, 69, 32, 42, 47, 13, 10, 35,100,101,102,105, -110,101, 32, 77, 69, 95, 69, 68, 71, 69, 82, 69, 78, 68, 69, 82, 9, 9, 40, 49, 60, 60, 53, 41, 13, 10, 35,100,101,102,105,110, -101, 32, 77, 69, 95, 76, 79, 79, 83, 69, 69, 68, 71, 69, 9, 9, 40, 49, 60, 60, 55, 41, 13, 10, 35,100,101,102,105,110,101, 32, - 77, 69, 95, 83, 69, 65, 77, 95, 76, 65, 83, 84, 9, 9, 40, 49, 60, 60, 56, 41, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, - 95, 83, 72, 65, 82, 80, 9, 9, 9, 40, 49, 60, 60, 57, 41, 13, 10, 13, 10, 47, 42, 32,112,117,110,111, 32, 61, 32,118,101,114, -116,101,120,110,111,114,109, 97,108, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 13, 10, 47, 42, 32,114,101,110,100,101,114, 32, - 97,115,115,117,109,101,115, 32,102,108,105,112,115, 32,116,111, 32, 98,101, 32,111,114,100,101,114,101,100, 32,108,105,107,101, - 32,116,104,105,115, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 9, 9, 49, 13, 10, - 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 50, 9, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, - 95, 70, 76, 73, 80, 86, 51, 9, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 52, 9, 9, 56, - 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 89, 9, 9, 49, 54, 13, 10, 35,100,101,102,105,110,101, - 32, 77, 69, 95, 80, 82, 79, 74, 88, 90, 9, 9, 51, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 89, - 90, 9, 9, 54, 52, 13, 10, 13, 10, 47, 42, 32,101,100, 99,111,100,101, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 13, 10, 35, -100,101,102,105,110,101, 32, 77, 69, 95, 86, 49, 86, 50, 9, 9, 9, 49, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, - 50, 86, 51, 9, 9, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 49, 9, 9, 9, 52, 13, 10, 35,100, -101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 52, 9, 9, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 52, - 86, 49, 9, 9, 9, 56, 13, 10, 13, 10, 47, 42, 32,102,108, 97,103, 32, 40,109,102, 97, 99,101, 41, 32, 42, 47, 13, 10, 35,100, -101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 9, 9, 9, 49, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, - 70, 65, 67, 69, 95, 83, 69, 76, 9, 9, 9, 50, 13, 10, 9, 9, 9, 9, 9, 9, 47, 42, 32,102,108, 97,103, 32, 77, 69, 95, 72, - 73, 68, 69, 61, 61, 49, 54, 32,105,115, 32,117,115,101,100, 32,104,101,114,101, 32,116,111,111, 32, 42, 47, 32, 13, 10, 47, 42, - 32,109,115,101,108,101, 99,116, 45, 62,116,121,112,101, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 83, - 69,108, 9, 48, 13, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108, 32, 49, 13, 10, 35,100,101,102,105,110,101, - 32, 77, 69, 95, 70, 83, 69, 76, 32, 50, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,102,108, 97,103, 32, 42, 47, - 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 9, 49, 32, 47, 42, 32,117,115,101, 32, 77, 70, 97, - 99,101, 32,104,105,100,101, 32,102,108, 97,103, 32, 40, 97,102,116,101,114, 32, 50, 46, 52, 51, 41, 44, 32,115,104,111,117,108, -100, 32, 98,101, 32, 97, 98,108,101, 32,116,111, 32,114,101,117,115,101, 32, 97,102,116,101,114, 32, 50, 46, 52, 52, 32, 42, 47, - 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 9, 50, 32, 47, 42, 32,100,101,112,114,101, 99, 97, -116,101,100, 33, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 49, 9, 9, 52, 13, 10, 35,100,101, -102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 50, 9, 9, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 51, - 9, 9, 49, 54, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 9, 9, 51, 50, 13, 10, 35,100,101,102,105, -110,101, 32, 84, 70, 95, 72, 73, 68, 69, 9, 9, 54, 52, 32, 47, 42, 32,117,110,117,115,101,100, 44, 32,115, 97,109,101, 32, 97, -115, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 32, 42, 47, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,109,111,100, -101, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 89, 78, 65, 77, 73, 67, 9, 9, 49, 13, 10, 35,100,101, -102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, 82, 84, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, - 84, 69, 88, 9, 9, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 86, 69, 82, 84, 9, 56, - 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, 9, 9, 49, 54, 13, 10, 13, 10, 35,100,101,102,105,110, -101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 67, 79, 76, 9, 54, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 73, - 76, 69, 83, 9, 9, 49, 50, 56, 9, 9, 47, 42, 32,100,101,112,114,101, 99, 97,116,101,100, 32, 42, 47, 13, 10, 35,100,101,102, -105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 9, 50, 53, 54, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, - 95, 84, 87, 79, 83, 73, 68, 69, 9, 9, 53, 49, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 73, 78, 86, 73, 83, 73, - 66, 76, 69, 9, 49, 48, 50, 52, 13, 10, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 79, 66, 67, 79, 76, 9, 9, 50, 48, - 52, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 50, 9, 52, 48, 57, 54, 9, 47, - 42, 32,119,105,116,104, 32, 90, 32, 97,120,105,115, 32, 99,111,110,115,116,114, 97,105,110,116, 32, 42, 47, 13, 10, 35,100,101, -102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 9, 9, 56, 49, 57, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, - 95, 66, 77, 70, 79, 78, 84, 9, 9, 49, 54, 51, 56, 52, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,116,114, 97, -110,115,112, 44, 32,118, 97,108,117,101,115, 32, 49, 45, 52, 32, 97,114,101, 32,117,115,101,100, 32, 97,115, 32,102,108, 97,103, -115, 32,105,110, 32,116,104,101, 32, 71, 76, 44, 32, 87, 65, 82, 78, 73, 78, 71, 44, 32, 84, 70, 95, 83, 85, 66, 32, 99, 97,110, -116, 32,119,111,114,107, 32,119,105,116,104, 32,116,104,105,115, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, - 83, 79, 76, 73, 68, 9, 48, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 9, 9, 49, 13, 10, 35,100,101,102, -105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73, 80, 9, - 9, 52, 32, 47, 42, 32, 99,108,105,112,109, 97,112, 32, 97,108,112,104, 97, 47, 98,105,110, 97,114,121, 32, 97,108,112,104, 97, - 32, 97,108,108, 32,111,114, 32,110,111,116,104,105,110,103, 33, 32, 42, 47, 13, 10, 13, 10, 47, 42, 32,115,117, 98, 32,105,115, - 32,110,111,116, 32, 97,118, 97,105,108, 97, 98,108,101, 32,105,110, 32,116,104,101, 32,117,115,101,114, 32,105,110,116,101,114, -102, 97, 99,101, 32, 97,110,121,109,111,114,101, 32, 42, 47, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 85, 66, 9, - 9, 51, 13, 10, 13, 10, 13, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,117,110,119,114, 97,112, 32, 42, 47, 13, 10, 35,100, -101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 49, 9, 49, 13, 10, 35,100,101,102,105,110,101, 32, - 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 50, 9, 50, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, - 82, 69, 67, 65, 84, 69, 68, 51, 9, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, - 68, 52, 9, 56, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 49, 9, 9, 32, 32, 32, 32, 49, 54, 13, 10, 35, -100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 9, 9, 32, 32, 32, 32, 51, 50, 13, 10, 35,100,101,102,105,110,101, 32, - 84, 70, 95, 80, 73, 78, 51, 9, 32, 32, 32, 9, 9, 54, 52, 13, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 52, - 9, 32, 32, 32, 32, 9, 49, 50, 56, 13, 10, 13, 10, 35,101,110,100,105,102, 13, 10, 35, 79, 67, 75, 33,110,101, 32, 67,249, 0, - 77,117,108,116,105,114,101,115, 67,111,108, 0, 77,117,108,116,105,114,101,115, 67,111,108, 70, 97, 99,101, 0, 77,117,108,116, -105,114,101,115, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 69,100,103,101, 0, 77,117,108,116,105,114,101,115, 76,101, -118,101,108, 0, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77,111,100,105,102,105,101,114, - 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,117,114,118,101, 77,111, -100,105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 97,115, -107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,114, 97,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, - 77,105,114,114,111,114, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,100,103,101, 83,112,108,105,116, 77,111,100,105, -102,105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 77,101,115,104, - 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,105,115,112,108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, - 97, 0, 85, 86, 80,114,111,106,101, 99,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, - 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, - 67, 97,115,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, - 97, 0, 65,114,109, 97,116,117,114,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102, -105,101,114, 68, 97,116, 97, 0, 83,111,102,116, 98,111,100,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111, -116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101,116, -116,105,110,103,115, 0, 67,108,111,116,104, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99, -104,101, 0, 67,111,108,108,105,115,105,111,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, - 0, 83,117,114,102, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, - 0, 66, 86, 72, 84,114,101,101, 70,114,111,109, 77,101,115,104, 0, 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, - 68, 97,116, 97, 0, 77, 68,101,102, 73,110,102,108,117,101,110, 99,101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, - 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101, -109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114, -116,105, 99,108,101, 73,110,115,116, 97,110, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100, -101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, 97, -116, 97, 0, 70,108,117,105,100,115,105,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, - 83,101,116,116,105,110,103,115, 0, 83,104,114,105,110,107,119,114, 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, - 83,105,109,112,108,101, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, - 0, 98, 68,101,102,111,114,109, 71,114,111,117,112, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 0, 66,117,108,108, -101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68,101,102,108,101, 99,116, 0, 83,111,102,116, 66,111,100,121, 0, - 79, 98, 72,111,111,107, 0, 82, 78, 71, 0, 80, 84, 67, 97, 99,104,101, 77,101,109, 0, 83, 66, 86,101,114,116,101,120, 0, 66, -111,100,121, 80,111,105,110,116, 0, 66,111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 87,111, -114,108,100, 0, 66, 97,115,101, 0, 65,118,105, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67, -111,100,101, 99, 68, 97,116, 97, 0, 70, 70, 77,112,101,103, 67,111,100,101, 99, 68, 97,116, 97, 0, 65,117,100,105,111, 68, 97, -116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,114, 76, 97,121,101,114, 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82, -101,110,100,101,114, 80,114,111,102,105,108,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103, 0, 84,105,109,101, 77, 97,114, -107,101,114, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0, 66,114,117,115,104, 0, 80, 97,114, -116,105, 99,108,101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 69,100,105,116, 83,101,116,116,105, -110,103,115, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101,110,116, 97,116,105,111,110, 0, 83, 99,117,108,112,116, 0, - 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 86, 80, 97,105,110,116, 0, 84,111,111,108, 83,101,116,116,105,110,103, -115, 0, 98, 83,116, 97,116,115, 0, 69,100,105,116,105,110,103, 0, 83, 99,101,110,101, 83,116, 97,116,115, 0, 68, 97,103, 70, -111,114,101,115,116, 0, 66, 71,112,105, 99, 0, 82,101,103,105,111,110, 86,105,101,119, 51, 68, 0, 98, 71, 80,100, 97,116, 97, - 0, 82,101,110,100,101,114, 73,110,102,111, 0, 82,101,116,111,112,111, 86,105,101,119, 68, 97,116, 97, 0, 86,105,101,119, 68, -101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,101,119, 83,116,111,114,101, 0,119,109, 84,105,109,101,114, 0, 86,105, -101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107, 0, 86,105,101,119, 50, 68, 0, 83,112, 97, 99,101, 73,110,102,111, 0, - 98, 83, 99,114,101,101,110, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111,112,101, 83,104,101,101,116, 0, 83,112, 97, 99, -101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83,101,108,101, 99,116, 80, 97,114, 97,109,115, 0, - 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119,109, 79,112,101,114, 97,116,111,114, 0, 70,105, -108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84,114,101,101, 83,116,111,114,101, 0, 84,114,101, -101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103,101, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83, -112, 97, 99,101, 84,101,120,116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99, -101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, 76,111,103,105, 99, 0, 83,112, 97, 99,101, - 73,109, 97, 83,101,108, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97, 99,101, 67,111,110,115,111,108,101, 0, -117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,116,121,108,101, 0,117,105, 83,116,121,108,101, 0,117,105, 87,105,100, -103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,100,103,101,116, 83,116, 97,116,101, 67,111,108,111,114,115, 0, 84,104, -101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97, 99,101, 0, 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, - 98, 84,104,101,109,101, 0, 83,111,108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 83, 99,114, 86,101,114, -116, 0, 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112,101, 0,117,105, 76, 97,121,111, -117,116, 0, 72,101, 97,100,101,114, 0, 72,101, 97,100,101,114, 84,121,112,101, 0, 77,101,110,117, 0, 77,101,110,117, 84,121, -112,101, 0, 83, 99,114, 65,114,101, 97, 0, 83,112, 97, 99,101, 84,121,112,101, 0, 65, 82,101,103,105,111,110, 0, 65, 82,101, -103,105,111,110, 84,121,112,101, 0, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105,112, 69,108,101,109, 0, 84, 83, -116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,112, 0, 83,116,114,105,112, 84,114, 97,110,115,102,111,114, -109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 83,116,114,105,112, 80,114,111,120,121, 0, 83, -116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,113,117,101,110, 99,101, 0, 98, 83,111,117,110,100, 0,104, -100, 97,117,100,105,111, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97, -114,115, 0, 84,114, 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0, - 83,112,101,101,100, 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102, - 0, 80, 97,114,116, 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101, -114,116,121, 0, 98, 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111, -117, 99,104, 83,101,110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101, -114,116,121, 83,101,110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121, - 83,101,110,115,111,114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101, -110,115,111,114, 0, 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 77, -101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,110,115,111,114, 0, 98, 67,111,110,116,114,111,108,108,101,114, - 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114, 0, 98, 69,120,112,114,101,115,115,105,111,110, 67,111,110,116, - 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,116,117, 97,116,111,114, 0, 98, 65,100,100, 79, 98,106,101, 99, -116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,110, 65, 99,116,117, 97,116,111,114, 0, 98, 83,111,117,110,100, - 65, 99,116,117, 97,116,111,114, 0, 98, 67, 68, 65, 99,116,117, 97,116,111,114, 0, 98, 69,100,105,116, 79, 98,106,101, 99,116, - 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,116,111,114, 0, 98, 80,114,111,112,101,114,116, -121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 73,112,111, 65, 99, -116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,111,114, 0, 98, 67,111,110,115,116,114, 97,105, -110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,117, 97,116,111,114, 0, 98, 82, 97,110,100,111, -109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,116,117, 97,116,111,114, 0, 98, 71, 97,109,101, - 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 84,119, -111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,114,101,110,116, 65, 99,116,117, 97,116,111,114, - 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 70,114,101,101, 67, 97,109,101,114, 97, 0, 98, 83, 97,109,112, -108,101, 0, 98, 83,111,117,110,100, 76,105,115,116,101,110,101,114, 0, 83,112, 97, 99,101, 83,111,117,110,100, 0, 71,114,111, -117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98, 65,114,109, 97,116,117,114,101, 0, 98, 80,111,115,101, 67,104, 97, -110,110,101,108, 0, 98, 65, 99,116,105,111,110, 71,114,111,117,112, 0, 83,112, 97, 99,101, 65, 99,116,105,111,110, 0, 98, 65, - 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108, 0, - 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 84, 97,114,103,101,116, 0, 98, 80, -121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 75,105,110,101,109, 97,116,105, 99, 67,111,110,115,116,114, - 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 97,116,101, 76, -105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97, -105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,107,101, 67, -111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, -107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 80, 97,116,104, 67,111,110,115, -116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,105,103, -105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,108, 97,109,112, 84,111, 67,111, -110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97, -110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109,105,116, 67,111,110,115,116,114, - 97,105,110,116, 0, 98, 82,111,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105, -109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105, -110,116, 0, 98, 83,104,114,105,110,107,119,114, 97,112, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, - 77,111,100,105,102,105,101,114, 0, 98, 65, 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78,111,100,101, 83,116, 97, 99,107, - 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, 78,111,100,101, 0, 98, 78,111, -100,101, 80,114,101,118,105,101,119, 0, 98, 78,111,100,101, 84,121,112,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105, -109, 0, 78,111,100,101, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100, -101, 66,105,108, 97,116,101,114, 97,108, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111, -100,101, 73,109, 97,103,101, 70,105,108,101, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89, -115, 0, 78,111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100, -101, 86,101,114,116,101,120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112, -116, 68,105, 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, - 76,101,110,115, 68,105,115,116, 0, 84,101,120, 78,111,100,101, 79,117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80, -111,105,110,116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, - 97,116, 97, 76, 97,121,101,114, 0, 72, 97,105,114, 75,101,121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 67,104,105, -108,100, 80, 97,114,116,105, 99,108,101, 0, 75,101,121,101,100, 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116, 0, 80, - 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 80, 97,114, -116,105, 99,108,101, 69,100,105,116, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 0, 76,105,110,107, 78, +105,116,101,109, 0,119, 99,111,108, 95, 98,111,120, 0,119, 99,111,108, 95,115, 99,114,111,108,108, 0,119, 99,111,108, 95,108, +105,115,116, 95,105,116,101,109, 0,119, 99,111,108, 95,115,116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, + 0, 98, 97, 99,107, 91, 52, 93, 0,116,105,116,108,101, 91, 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97, +100,101,114, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101, +120,116, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, + 93, 0, 98,117,116,116,111,110, 95,116,105,116,108,101, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, + 0, 98,117,116,116,111,110, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95, +116,105,116,108,101, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95, +104,105, 91, 52, 93, 0,112, 97,110,101,108, 91, 52, 93, 0,112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97, +110,101,108, 95,116,101,120,116, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97, +100,101, 49, 91, 52, 93, 0,115,104, 97,100,101, 50, 91, 52, 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, + 52, 93, 0,119,105,114,101, 91, 52, 93, 0,115,101,108,101, 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,116, +105,118,101, 91, 52, 93, 0,103,114,111,117,112, 91, 52, 93, 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0, +116,114, 97,110,115,102,111,114,109, 91, 52, 93, 0,118,101,114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,101, +108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 91, 52, 93, 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101, +100,103,101, 95,115,101, 97,109, 91, 52, 93, 0,101,100,103,101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,102, + 97, 99,101,115,101,108, 91, 52, 93, 0,102, 97, 99,101, 91, 52, 93, 0,102, 97, 99,101, 95,115,101,108,101, 99,116, 91, 52, 93, + 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,110,111,114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115,111,108,105, +100, 91, 52, 93, 0, 98,111,110,101, 95,112,111,115,101, 91, 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116,114,105,112, + 95,115,101,108,101, 99,116, 91, 52, 93, 0, 99,102,114, 97,109,101, 91, 52, 93, 0,100,115, 95, 99,104, 97,110,110,101,108, 91, + 52, 93, 0,100,115, 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0, +102, 97, 99,101,100,111,116, 95,115,105,122,101, 0, 98,112, 97,100, 91, 50, 93, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0, +115,121,110,116, 97,120,110, 91, 52, 93, 0,115,121,110,116, 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, + 0,115,121,110,116, 97,120, 99, 91, 52, 93, 0,109,111,118,105,101, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99, +101,110,101, 91, 52, 93, 0, 97,117,100,105,111, 91, 52, 93, 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, + 91, 52, 93, 0,116,114, 97,110,115,105,116,105,111,110, 91, 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101, +115,104, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97, +110,100,108,101, 95,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114, +116,101,120, 95,115,105,122,101, 0,104,112, 97,100, 91, 51, 93, 0,115,111,108,105,100, 91, 52, 93, 0,116,117,105, 0,116, 98, +117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0,116,105,112,111, 0,116,105,110,102,111, 0,116,115,110,100, 0,116, + 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116,105,109, 97, 0,116,105,109, 97,115,101,108, 0,116,101,120,116, 0, +116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116,108,111,103,105, 99, 0,116, 97,114,109, 91, 50, 48, + 93, 0,115,112,101, 99, 91, 52, 93, 0,100,117,112,102,108, 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100, +105,114, 91, 49, 54, 48, 93, 0,102,111,110,116,100,105,114, 91, 49, 54, 48, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, + 54, 48, 93, 0,116,101,120,116,117,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 49, 54, 48, + 93, 0,112,108,117,103,115,101,113,100,105,114, 91, 49, 54, 48, 93, 0,112,121,116,104,111,110,100,105,114, 91, 49, 54, 48, 93, + 0,115,111,117,110,100,100,105,114, 91, 49, 54, 48, 93, 0,121,102,101,120,112,111,114,116,100,105,114, 91, 49, 54, 48, 93, 0, +118,101,114,115,105,111,110,115, 0,103, 97,109,101,102,108, 97,103,115, 0,119,104,101,101,108,108,105,110,101,115, 99,114,111, +108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97,103,101, 0,117,115,101,114,112,114,101,102, 0,118,105,101,119, +122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97, +110,115,111,112,116,115, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104, +111,108,100, 50, 0,116,104,101,109,101,115, 0,117,105,102,111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,117,110,100, +111,115,116,101,112,115, 0,117,110,100,111,109,101,109,111,114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105, +115,116, 0,103,112, 95,101,117, 99,108,105,100,101, 97,110,100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, + 95,115,101,116,116,105,110,103,115, 0,116, 98, 95,108,101,102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109, +111,117,115,101, 0,108,105,103,104,116, 91, 51, 93, 0,116,119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, + 0,116,119, 95,104, 97,110,100,108,101,115,105,122,101, 0,116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117, +116, 0,116,101,120, 99,111,108,108,101, 99,116,114, 97,116,101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,119,109, +112, 97,100, 0,109,101,109, 99, 97, 99,104,101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, + 0,102,114, 97,109,101,115,101,114,118,101,114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, + 98, 99,101,110,116,101,114, 95,100,105, 97, 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, + 99,101,110,116, 95,102,105,108,101,115, 0,115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105, +109,105,116, 0,110,100,111,102, 95,112, 97,110, 0,110,100,111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122, +101, 0,105,112,111, 95,110,101,119, 0,118,101,114,115,101,109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101, +117,115,101,114, 91, 49, 54, 48, 93, 0,103,108, 97,108,112,104, 97, 99,108,105,112, 0, 97,117,116,111,107,101,121, 95,102,108, + 97,103, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,118,101,114,116, 98, 97,115,101, 0,101,100,103,101, 98, 97,115,101, + 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, 0,102,117,108,108, 0,119,105,110,105,100, 0,100, +111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101,115,104, 0,100,111, 95,100,114, 97,119, 95,103,101,115,116,117,114, +101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, 99,117,114,115,111,114, 0,115,119, 97,112, 0,109, 97,105,110,119, +105,110, 0,115,117, 98,119,105,110, 97, 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116, +101,120,116, 0,104, 97,110,100,108,101,114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, + 0, 42,116,121,112,101, 0,112, 97,110,101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, + 0,100,114, 97,119,110, 97,109,101, 91, 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105, +122,101,121, 0,108, 97, 98,101,108,111,102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111, +108, 0,115,110, 97,112, 0,115,111,114,116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105, +118,101,100, 97,116, 97, 0,108,105,115,116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115, +116, 95,115,101, 97,114, 99,104, 91, 54, 52, 93, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, + 97, 99,101,116,121,112,101, 0,104,101, 97,100,101,114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110, +100,108,101,114,115, 0, 97, 99,116,105,111,110,122,111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, + 0,115,119,105,110,105,100, 0,114,101,103,105,111,110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,117,105, 98, +108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,104,101, 97,100,101,114,115,116,114, 0, 42,114,101,103,105,111,110,100, + 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93, 0,115,117, 98,118,101,114,115,105,111,110, 0,112, 97,100,115, 0,109, +105,110,118,101,114,115,105,111,110, 0,109,105,110,115,117, 98,118,101,114,115,105,111,110, 0, 42, 99,117,114,115, 99,114,101, +101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,105,108,101,102,108, 97,103,115, 0,103,108,111, 98, 97,108,102, 0,110, + 97,109,101, 91, 56, 48, 93, 0, 42,105, 98,117,102, 0, 42,105, 98,117,102, 95, 99,111,109,112, 0, 42,115,101, 49, 0, 42,115, +101, 50, 0, 42,115,101, 51, 0,110,114, 0, 98,111,116,116,111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102, +115, 0,108,105,102,116, 91, 51, 93, 0,103, 97,109,109, 97, 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,115, 97,116,117,114, + 97,116,105,111,110, 0,100,105,114, 91, 49, 54, 48, 93, 0,100,111,110,101, 0,115,116, 97,114,116,115,116,105,108,108, 0,101, +110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, 97,116, 97, 0,111,114,120, 0,111,114,121, 0, 42, 99,114,111,112, + 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108, 97,110, 99,101, 0, 42,116,115,116,114, +105,112,100, 97,116, 97, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 95,115,116, 97,114,116,115,116,105,108,108, 0, 42,116, +115,116,114,105,112,100, 97,116, 97, 95,101,110,100,115,116,105,108,108, 0, 42,105, 98,117,102, 95,115,116, 97,114,116,115,116, +105,108,108, 0, 42,105, 98,117,102, 95,101,110,100,115,116,105,108,108, 0, 42,105,110,115,116, 97,110, 99,101, 95,112,114,105, +118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114,114,101,110,116, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, + 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0,101,110,100,111,102,115, 0,109, 97, 99,104,105,110,101, 0,115,116, + 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, 0,104, 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114, +101,115,101,101,107, 0, 42,115,116,114,105,112, 0,102, 97, 99,102, 48, 0,102, 97, 99,102, 49, 0, 42,115,101,113, 49, 0, 42, +115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, 97,115,101, 0, 42,115,111,117,110,100, 0, 42,104,100, 97,117,100, +105,111, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,101,110,101,110,114, 0,115,116,114,111, 98,101, 0, 42,101,102,102, +101, 99,116,100, 97,116, 97, 0, 97,110,105,109, 95,115,116, 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,111,102, +115, 0, 98,108,101,110,100, 95,109,111,100,101, 0, 98,108,101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,100, 98, + 97,115,101,112, 0, 42,112, 97,114,115,101,113, 0, 42,115,101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97, 99,107, + 0, 42, 97, 99,116, 95,115,101,113, 0, 97, 99,116, 95,105,109, 97,103,101,100,105,114, 91, 50, 53, 54, 93, 0, 97, 99,116, 95, +115,111,117,110,100,100,105,114, 91, 50, 53, 54, 93, 0,101,100,103,101, 87,105,100,116,104, 0,102,111,114,119, 97,114,100, 0, +119,105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109,112, 0,102, 66,111,111,115,116, 0,100, 68,105, +115,116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, 83, 99, 97,108,101,120, 73,110,105, 0, 83, 99, + 97,108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70,105,110, 0, 83, 99, 97,108,101,121, 70,105,110, 0,120, 73,110,105, + 0,120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, 0,114,111,116, 73,110,105, 0,114,111,116, 70,105,110, 0,105,110, +116,101,114,112,111,108, 97,116,105,111,110, 0, 42,102,114, 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101, +100, 0,108, 97,115,116, 86, 97,108,105,100, 70,114, 97,109,101, 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, + 0,115,116, 97, 0,116,111,116,112, 97,114,116, 0,110,111,114,109,102, 97, 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, + 97, 99, 0,116,101,120,102, 97, 99, 0,114, 97,110,100,108,105,102,101, 0,102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116, +115,105,122,101, 0,109, 97,120,108,101,110, 0,100,101,102,118,101, 99, 91, 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105, +102,101, 91, 52, 93, 0, 99,104,105,108,100, 91, 52, 93, 0,109, 97,116, 91, 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114, +109,117,108,116, 0,115,116, 97,116,105, 99,115,116,101,112, 0,111,109, 97,116, 0,116,105,109,101,116,101,120, 0,115,112,101, +101,100,116,101,120, 0,102,108, 97,103, 50,110,101,103, 0,118,101,114,116,103,114,111,117,112, 95,118, 0,118,103,114,111,117, +112,110, 97,109,101, 91, 51, 50, 93, 0,118,103,114,111,117,112,110, 97,109,101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, + 0,109,105,110,102, 97, 99, 0,117,115,101,100, 0,117,115,101,100,101,108,101,109, 0, 42,112,111,105,110, 0,114,101,115,101, +116,100,105,115,116, 0,108, 97,115,116,118, 97,108, 0, 42,109, 97, 0,107,101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, + 0,116, 97,114,103,101,116, 78, 97,109,101, 91, 51, 50, 93, 0,116,111,103,103,108,101, 78, 97,109,101, 91, 51, 50, 93, 0,118, + 97,108,117,101, 91, 51, 50, 93, 0,109, 97,120,118, 97,108,117,101, 91, 51, 50, 93, 0,100,101,108, 97,121, 0,100,117,114, 97, +116,105,111,110, 0,109, 97,116,101,114,105, 97,108, 78, 97,109,101, 91, 51, 50, 93, 0,100, 97,109,112,116,105,109,101,114, 0, +112,114,111,112,110, 97,109,101, 91, 51, 50, 93, 0,109, 97,116,110, 97,109,101, 91, 51, 50, 93, 0, 97,120,105,115,102,108, 97, +103, 0, 42,102,114,111,109, 79, 98,106,101, 99,116, 0,115,117, 98,106,101, 99,116, 91, 51, 50, 93, 0, 98,111,100,121, 91, 51, + 50, 93, 0,111,116,121,112,101, 0,112,117,108,115,101, 0,102,114,101,113, 0,116,111,116,108,105,110,107,115, 0, 42, 42,108, +105,110,107,115, 0,116, 97,112, 0,106,111,121,105,110,100,101,120, 0, 97,120,105,115, 95,115,105,110,103,108,101, 0, 97,120, +105,115,102, 0, 98,117,116,116,111,110, 0,104, 97,116, 0,104, 97,116,102, 0,112,114,101, 99,105,115,105,111,110, 0,115,116, +114, 91, 49, 50, 56, 93, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0, 42,109,121,110,101,119, 0,105,110,112,117,116,115, 0, +116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, 0,118, 97,108,111, 0,115,116, 97,116,101, 95,109, 97, +115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, 51, 50, 93, 0, 98,108,101,110,100,105,110, 0,112,114, +105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115,116,114,105,100,101, 97,120,105,115, 0,115,116,114,105, +100,101,108,101,110,103,116,104, 0,115,110,100,110,114, 0,112, 97,100, 49, 91, 50, 93, 0,109, 97,107,101, 99,111,112,121, 0, + 99,111,112,121,109, 97,100,101, 0,112, 97,100, 50, 91, 49, 93, 0,116,114, 97, 99,107, 0, 42,109,101, 0,108,105,110, 86,101, +108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0,108,111, 99, 97,108,102,108, + 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,101,108,111, 99, 91, 51, 93, 0,102,111,114, + 99,101,114,111,116, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103,117,108, + 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,110, 99,101, 0, 98,117,116,115,116, 97, 0, + 98,117,116,101,110,100, 0,109,105,110, 0,109, 97,120, 0,118,105,115,105,102, 97, 99, 0,114,111,116,100, 97,109,112, 0,109, +105,110,108,111, 99, 91, 51, 93, 0,109, 97,120,108,111, 99, 91, 51, 93, 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120, +114,111,116, 91, 51, 93, 0,109, 97,116,112,114,111,112, 91, 51, 50, 93, 0,100,105,115,116,114,105, 98,117,116,105,111,110, 0, +105,110,116, 95, 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103, 95, 49, 0, +102,108,111, 97,116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 51, 50, 93, 0, 42,116,111, 79, 98, +106,101, 99,116, 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111, 97,100, 97, +110,105,110, 97,109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0,103,111, 0, + 97, 99, 99,101,108,108,101,114, 97,116,105,111,110, 0,109, 97,120,115,112,101,101,100, 0,109, 97,120,114,111,116,115,112,101, +101,100, 0,109, 97,120,116,105,108,116,115,112,101,101,100, 0,116,105,108,116,100, 97,109,112, 0,115,112,101,101,100,100, 97, +109,112, 0, 42,115, 97,109,112,108,101, 0, 42,115,116,114,101, 97,109, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108, +101, 0, 42,115,110,100, 95,115,111,117,110,100, 0,112, 97,110,110,105,110,103, 0, 97,116,116,101,110,117, 97,116,105,111,110, + 0,112,105,116, 99,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,100,105,115,116, 97,110, 99, +101, 0,115,116,114,101, 97,109,108,101,110, 0, 99,104, 97,110,110,101,108,115, 0,104,105,103,104,112,114,105,111, 0,112, 97, +100, 91, 49, 48, 93, 0,103, 97,105,110, 0,100,111,112,112,108,101,114,102, 97, 99,116,111,114, 0,100,111,112,112,108,101,114, +118,101,108,111, 99,105,116,121, 0,110,117,109,115,111,117,110,100,115, 98,108,101,110,100,101,114, 0,110,117,109,115,111,117, +110,100,115,103, 97,109,101,101,110,103,105,110,101, 0, 42, 97,114,101, 97, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98, +106,101, 99,116, 0,100,117,112,108,105, 95,111,102,115, 91, 51, 93, 0, 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, + 0,104,101, 97,100, 91, 51, 93, 0,116, 97,105,108, 91, 51, 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, + 97,114,109, 95,104,101, 97,100, 91, 51, 93, 0, 97,114,109, 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, + 52, 93, 91, 52, 93, 0,120,119,105,100,116,104, 0,122,119,105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0, +114, 97,100, 95,104,101, 97,100, 0,114, 97,100, 95,116, 97,105,108, 0, 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, + 98, 97,115,101, 0, 42,101,100, 98,111, 0, 42,115,107,101,116, 99,104, 0,108, 97,121,101,114, 95,112,114,111,116,101, 99,116, +101,100, 0,103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122,101, 0,103,104,111,115,116,116,121,112,101, 0,112, + 97,116,104,115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,111,115,116,101,102, 0,112, 97,116,104,115,102, 0,112, + 97,116,104,101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97, 99, 0, 42,112,114,111,112, 0, 99,111,110,115,116,102, +108, 97,103, 0,105,107,102,108, 97,103, 0,115,101,108,101, 99,116,102,108, 97,103, 0, 97,103,114,112, 95,105,110,100,101,120, + 0, 42, 98,111,110,101, 0, 42, 99,104,105,108,100, 0,105,107,116,114,101,101, 0, 42, 98, 95, 98,111,110,101, 95,109, 97,116, +115, 0, 42,100,117, 97,108, 95,113,117, 97,116, 0, 42, 98, 95, 98,111,110,101, 95,100,117, 97,108, 95,113,117, 97,116,115, 0, +101,117,108, 91, 51, 93, 0,114,111,116,109,111,100,101, 0, 99,104, 97,110, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111, +115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,104,101, 97,100, 91, 51, 93, 0,112,111,115,101, 95,116, + 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105,110, 91, 51, 93, 0,108,105,109,105,116,109, 97,120, 91, 51, 93, 0,115, +116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107,115,116,114,101,116, 99,104, 0, 42, 99,117,115,116,111,109, 0, 99,104, + 97,110, 98, 97,115,101, 0,112,114,111,120,121, 95,108, 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,102,115,101,116, + 91, 51, 93, 0, 99,121, 99,108,105, 99, 95,111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115, 0, 97, 99,116, +105,118,101, 95,103,114,111,117,112, 0, 99,117,115,116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,114, +111,117,112,115, 0, 97, 99,116,105,118,101, 95,109, 97,114,107,101,114, 0, 42,115,111,117,114, 99,101, 0,102,105,108,116,101, +114,102,108, 97,103, 0, 97,100,115, 0, 97, 99,116,110,114, 0, 97, 99,116,119,105,100,116,104, 0,116,105,109,101,115,108,105, +100,101, 0, 42,103,114,112, 0,116,101,109,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, + 97,114,115,112, 97, 99,101, 0,101,110,102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0, 42,116, 97,114, 0,115,117, + 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,116, + 97,114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115, 0,114,111,111,116, 98,111,110, +101, 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,112,111,108,101,115,117, 98,116, + 97,114,103,101,116, 91, 51, 50, 93, 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,110,116,119,101,105,103,104,116, + 0,103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,114,101,115,101,114,118,101,100, 49, 0,114,101,115,101,114,118,101, +100, 50, 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101, 91, 51, 93, 0,108,111, 99, +107,102,108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,112,108, 97,110,101, 0,111, +114,103,108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,112,105,118, 90, 0, 97,120, + 88, 0, 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120, 76,105,109,105,116, 91, 54, + 93, 0,101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,111,109, 0,116,111, 0,109, + 97,112, 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,111,109, 95,109, 97,120, 91, + 51, 93, 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,122,109,105,110, 0,122,109, 97,120, + 0,112, 97,100, 91, 57, 93, 0, 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0, +115,116,114,105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111,100, 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101, +110,100, 0, 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101,108,101,110, 0,115, 99, 97,108,101, 0, 98,108,101,110,100, +111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, + 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111,117,116,112,117,116, 0,100, 97,116, 97,116,121,112,101, 0, +115,111, 99,107,101,116,116,121,112,101, 0, 42,110,101,119, 95,115,111, 99,107, 0,110,115, 0,108,105,109,105,116, 0,115,116, + 97, 99,107, 95,105,110,100,101,120, 0,105,110,116,101,114,110, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 95,101,120,116, + 0,108,111, 99,120, 0,108,111, 99,121, 0,111,119,110, 95,105,110,100,101,120, 0,116,111, 95,105,110,100,101,120, 0, 42,116, +111,115,111, 99,107, 0, 42,108,105,110,107, 0, 42,110,101,119, 95,110,111,100,101, 0,117,115,101,114,110, 97,109,101, 91, 51, + 50, 93, 0,108, 97,115,116,121, 0,111,117,116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105,119,105, +100,116,104, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,115,116, +111,109, 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97, 0,116, +111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42,116,121,112,101,105,110,102,111, 0, 42,102,114,111,109,110,111,100, +101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0,110,111,100,101,115, 0,108,105,110,107,115, 0, + 42,115,116, 97, 99,107, 0, 42,116,104,114,101, 97,100,115,116, 97, 99,107, 0,105,110,105,116, 0,115,116, 97, 99,107,115,105, +122,101, 0, 99,117,114, 95,105,110,100,101,120, 0, 97,108,108,116,121,112,101,115, 0, 42,111,119,110,116,121,112,101, 0, 42, +115,101,108,105,110, 0, 42,115,101,108,111,117,116, 0, 40, 42,116,105,109,101, 99,117,114,115,111,114, 41, 40, 41, 0, 40, 42, +115,116, 97,116,115, 95,100,114, 97,119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116, + 98,104, 0, 42,116, 99,104, 0, 42,115,100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101, +115, 0,109,105,110,115,112,101,101,100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114, 99,101,110,116,121, 0, 98,111,107, +101,104, 0, 99,117,114,118,101,100, 0,105,109, 97,103,101, 95,105,110, 95,119,105,100,116,104, 0,105,109, 97,103,101, 95,105, +110, 95,104,101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120, 0, 99,101,110,116,101,114, 95,121, 0,115,112,105,110, 0, +105,116,101,114, 0,119,114, 97,112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,115,105,103,109, 97, 95,115,112, 97, 99, +101, 0,104,117,101, 0,115, 97,116, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,116,104, 0,102, 97,108, +112,104, 97, 0,107,101,121, 91, 52, 93, 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, 0, 99,111,108,110, 97,109,101, 91, 51, + 50, 93, 0, 98,107,116,121,112,101, 0,114,111,116, 97,116,105,111,110, 0,103, 97,109, 99,111, 0,110,111, 95,122, 98,117,102, + 0,102,115,116,111,112, 0,109, 97,120, 98,108,117,114, 0, 98,116,104,114,101,115,104, 0, 42,100,105, 99,116, 0, 42,110,111, +100,101, 0, 97,110,103,108,101, 95,111,102,115, 0, 99,111,108,109,111,100, 0,109,105,120, 0,116,104,114,101,115,104,111,108, +100, 0,102, 97,100,101, 0,109, 0, 99, 0,106,105,116, 0,112,114,111,106, 0,102,105,116, 0,115,104,111,114,116,121, 0,109, +105,110,116, 97, 98,108,101, 0,109, 97,120,116, 97, 98,108,101, 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111, +117,116, 91, 50, 93, 0, 42, 99,117,114,118,101, 0, 42,116, 97, 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, + 0, 99,117,114,114, 0, 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97, 99,107, 91, 51, 93, 0,119,104,105,116,101, + 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51, 93, 0,111,102,102,115,101,116, 91, 50, 93, + 0, 99,108,111,110,101, 0,105,110,110,101,114,114, 97,100,105,117,115, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,114, +111,116, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0, 97, 99,116,105,118,101, 95,114,110,100, 0, 97, 99,116,105,118,101, + 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95,109, 97,115,107, 0, 42,108, 97,121,101,114,115, 0,116,111,116,108, 97, +121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116,111,116,115,105,122,101, 0, 42,112,111,111,108, 0,101,100,105,116,102, +108, 97,103, 0,118,101,108, 91, 51, 93, 0,114,111,116, 91, 52, 93, 0, 97,118,101, 91, 51, 93, 0,110,117,109, 0,112, 97,114, +101,110,116, 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,114, 97, +110,100, 91, 51, 93, 0, 42,115,116,105, 99,107, 95,111, 98, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, + 0, 42, 98,111,105,100, 0,114, 95,114,111,116, 91, 52, 93, 0,114, 95, 97,118,101, 91, 51, 93, 0,114, 95,118,101, 91, 51, 93, + 0,100,105,101,116,105,109,101, 0,115,105,122,101,109,117,108, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0, 98,112,105, + 0, 97,108,105,118,101, 0,108,111,111,112, 0, 42, 98,111,105,100,115, 0,100,105,115,116,114, 0,112,104,121,115,116,121,112, +101, 0, 97,118,101,109,111,100,101, 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114, 97,119, 95, 97, +115, 0,100,114, 97,119, 95,115,105,122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115, 0,100,114, 97, +119, 95,115,116,101,112, 0,114,101,110, 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,121,115, 95,115, +116,101,112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,116,102,114,111, +109, 0,105,110,116,101,103,114, 97,116,111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,115,112,108,105, +116, 0, 98, 98, 95, 97,110,105,109, 0, 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98, 95,116,105,108, +116, 0, 98, 98, 95,114, 97,110,100, 95,116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0,115,105,109,112, +108,105,102,121, 95,102,108, 97,103, 0,115,105,109,112,108,105,102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112,108, +105,102,121, 95,114, 97,116,101, 0,115,105,109,112,108,105,102,121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105,109, +112,108,105,102,121, 95,118,105,101,119,112,111,114,116, 0,116,105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, 0, +101,102,102, 95,104, 97,105,114, 0,103,114,105,100, 95,114,101,115, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, + 0,116, 97,110,112,104, 97,115,101, 0,114,101, 97, 99,116,102, 97, 99, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102, + 97, 99, 0,114, 97,110,100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115, +105,122,101, 0,114,101, 97, 99,116,115,104, 97,112,101, 0, 97, 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114, +111,119,110,102, 97, 99, 0,100, 97,109,112,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104, 0, 99,104,105,108,100, 95, +110, 98,114, 0,114,101,110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115, 0, 99,104,105,108,100,115, +105,122,101, 0, 99,104,105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,100, 0, 99,104,105,108,100, +102,108, 97,116, 0, 99,108,117,109,112,102, 97, 99, 0, 99,108,117,109,112,112,111,119, 0,114,111,117,103,104, 49, 0,114,111, +117,103,104, 49, 95,115,105,122,101, 0,114,111,117,103,104, 50, 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117, +103,104, 50, 95,116,104,114,101,115, 0,114,111,117,103,104, 95,101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, + 97,112,101, 0, 99,108,101,110,103,116,104, 0, 99,108,101,110,103,116,104, 95,116,104,114,101,115, 0, 98,114, 97,110, 99,104, + 95,116,104,114,101,115, 0,100,114, 97,119, 95,108,105,110,101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, + 97,116,104, 95,101,110,100, 0,116,114, 97,105,108, 95, 99,111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0, +101,102,102,101, 99,116,111,114, 95,119,101,105,103,104,116, 91, 49, 48, 93, 0, 42,101,102,102, 95,103,114,111,117,112, 0, 42, +100,117,112, 95,111, 98, 0, 42, 98, 98, 95,111, 98, 0, 42,112,100, 50, 0, 42,112, 97,114,116, 0, 42,101,100,105,116, 0, 40, + 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0, 42, 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,104,105,108, +100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,104,101, 98, +117,102,115, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,101,102,102,101, 99,116,111,114, +115, 0,114,101, 97, 99,116,101,118,101,110,116,115, 0,116,114,101,101, 95,102,114, 97,109,101, 0,116,111,116, 99,104,105,108, +100, 0,116,111,116, 99, 97, 99,104,101,100, 0,116,111,116, 99,104,105,108,100, 99, 97, 99,104,101, 0,116, 97,114,103,101,116, + 95,112,115,121,115, 0,116,111,116,107,101,121,101,100, 0, 98, 97,107,101,115,112, 97, 99,101, 0, 98, 98, 95,117,118,110, 97, +109,101, 91, 51, 93, 91, 51, 50, 93, 0,118,103,114,111,117,112, 91, 49, 50, 93, 0,118,103, 95,110,101,103, 0,114,116, 51, 0, + 42,114,101,110,100,101,114,100, 97,116, 97, 0, 42,116,114,101,101, 0, 42, 99, 97, 99,104,101, 0, 67,100,105,115, 0, 67,118, +105, 0, 91, 51, 93, 0,115,116,114,117, 99,116,117,114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, 97,120, 95, 98,101,110, +100, 0,109, 97,120, 95,115,116,114,117, 99,116, 0,109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, 95,115,112,114,105,110, +103, 95,108,101,110, 0,116,105,109,101,115, 99, 97,108,101, 0,101,102,102, 95,102,111,114, 99,101, 95,115, 99, 97,108,101, 0, +101,102,102, 95,119,105,110,100, 95,115, 99, 97,108,101, 0,115,105,109, 95,116,105,109,101, 95,111,108,100, 0,115,116,101,112, +115, 80,101,114, 70,114, 97,109,101, 0,112,114,101,114,111,108,108, 0,109, 97,120,115,112,114,105,110,103,108,101,110, 0,115, +111,108,118,101,114, 95,116,121,112,101, 0,118,103,114,111,117,112, 95, 98,101,110,100, 0,118,103,114,111,117,112, 95,109, 97, +115,115, 0,118,103,114,111,117,112, 95,115,116,114,117, 99,116, 0,112,114,101,115,101,116,115, 0, 42, 99,111,108,108,105,115, +105,111,110, 95,108,105,115,116, 0,101,112,115,105,108,111,110, 0,115,101,108,102, 95,102,114,105, 99,116,105,111,110, 0,115, +101,108,102,101,112,115,105,108,111,110, 0,115,101,108,102, 95,108,111,111,112, 95, 99,111,117,110,116, 0,108,111,111,112, 95, + 99,111,117,110,116, 0,112,114,101,115,115,117,114,101, 0, 42,112,111,105,110,116,115, 0,116,111,116,112,111,105,110,116,115, + 0,116,104,105, 99,107,110,101,115,115, 0,115,116,114,111,107,101,115, 0,102,114, 97,109,101,110,117,109, 0, 42, 97, 99,116, +102,114, 97,109,101, 0,103,115,116,101,112, 0,105,110,102,111, 91, 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, 95,115,105, +122,101, 0,115, 98,117,102,102,101,114, 95,115,102,108, 97,103, 0, 42,115, 98,117,102,102,101,114, 0, 42,116,121,112,101,115, +116,114, 0, 42,109,101,115,115, 97,103,101, 0,108,105,115,116, 0,112,114,105,110,116,108,101,118,101,108, 0,115,116,111,114, +101,108,101,118,101,108, 0, 42,119,105,110,100,114, 97,119, 97, 98,108,101, 0, 42,119,105,110, 97, 99,116,105,118,101, 0,119, +105,110,100,111,119,115, 0,105,110,105,116,105, 97,108,105,122,101,100, 0,102,105,108,101, 95,115, 97,118,101,100, 0,111,112, +101,114, 97,116,111,114,115, 0,113,117,101,117,101, 0,114,101,112,111,114,116,115, 0,106,111, 98,115, 0,112, 97,105,110,116, + 99,117,114,115,111,114,115, 0,107,101,121,109, 97,112,115, 0, 42,103,104,111,115,116,119,105,110, 0, 42,110,101,119,115, 99, +114,101,101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 51, 50, 93, 0,112,111,115,120, 0,112,111,115,121, 0,119,105, +110,100,111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0, 97,100,100, +109,111,117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110, 0, 42, +116,119,101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,119,100, + 97,116, 97, 0,116,105,109,101,114,115, 0,115,117, 98,119,105,110,100,111,119,115, 0,103,101,115,116,117,114,101, 0,105,100, +110, 97,109,101, 91, 54, 52, 93, 0, 42,112,116,114, 0,115,104,105,102,116, 0, 99,116,114,108, 0, 97,108,116, 0,111,115,107, +101,121, 0,107,101,121,109,111,100,105,102,105,101,114, 0,112,114,111,112,118, 97,108,117,101, 0,105,110, 97, 99,116,105,118, +101, 0,109, 97,112,116,121,112,101, 0,107,101,121,109, 97,112, 0,110, 97,109,101,105,100, 91, 54, 52, 93, 0,115,112, 97, 99, +101,105,100, 0,114,101,103,105,111,110,105,100, 0,105,115, 95,109,111,100, 97,108, 0, 42,105,116,101,109,115, 0, 42, 99,117, +115,116,111,109,100, 97,116, 97, 0, 42,114,101,112,111,114,116,115, 0,109, 97, 99,114,111, 0, 42,111,112,109, 0,109,118, 97, +108, 91, 50, 93, 0,112,114,101,118,120, 0,112,114,101,118,121, 0,117,110,105, 99,111,100,101, 0, 97,115, 99,105,105, 0, 42, +107,101,121,109, 97,112, 95,105,100,110, 97,109,101, 0, 99,117,115,116,111,109, 0, 99,117,115,116,111,109,100, 97,116, 97,102, +114,101,101, 0, 42,101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0, 42, 99,111,101,102,102,105, 99,105,101,110, +116,115, 0, 97,114,114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100, +101, 0,112,104, 97,115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0, +118, 97,108,117,101, 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, + 97,102,116,101,114, 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99, +121, 99,108,101,115, 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0, 42,114, +110, 97, 95,112, 97,116,104, 0, 97,114,114, 97,121, 95,105,110,100,101,120, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, + 53, 54, 93, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,114, + 91, 51, 93, 0,102,114,111,109, 91, 49, 50, 56, 93, 0,116,111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,115, +116,114,105,112,115, 0, 42,114,101,109, 97,112, 0,102, 99,117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101, 0, + 98,108,101,110,100,109,111,100,101, 0,101,120,116,101,110,100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,105, +100,116,121,112,101, 0,116,101,109,112,108, 97,116,101,115, 0,103,114,111,117,112,109,111,100,101, 0,112, 97,116,104,115, 0, +107,101,121,105,110,103,102,108, 97,103, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, + 99,116,115,116,114,105,112, 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0,114,117,108,101, 0,111, +112,116,105,111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,108, 95,105,100, 0,108,111,111, +107, 95, 97,104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,122,101, 0,119, 97,110,100,101, +114, 0,102,108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,116, 97,116,101, 95,105,100, 0, +114,117,108,101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115, 0,114,117,108,101,115,101,116, + 95,116,121,112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,116, 95,115,116, 97,116,101, 95, +105,100, 0,108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,110,107,105,110,103, 0, 97,103, +103,114,101,115,115,105,111,110, 0, 97, 99, 99,117,114, 97, 99,121, 0, 97,105,114, 95,109,105,110, 95,115,112,101,101,100, 0, + 97,105,114, 95,109, 97,120, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97,105,114, 95,109, 97, +120, 95, 97,118,101, 0, 97,105,114, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,106,117, +109,112, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, + 95, 97, 99, 99, 0,108, 97,110,100, 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115,111,110, 97,108, 95, +115,112, 97, 99,101, 0,108, 97,110,100, 95,115,116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116,101,115, 0, 0, 0, + 84, 89, 80, 69,168, 1, 0, 0, 99,104, 97,114, 0,117, 99,104, 97,114, 0,115,104,111,114,116, 0,117,115,104,111,114,116, 0, +105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,108,111, 97,116, 0,100,111,117, 98,108,101, 0,118,111,105,100, + 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118,101, + 99, 50,105, 0,118,101, 99, 50,102, 0,118,101, 99, 50,100, 0,118,101, 99, 51,105, 0,118,101, 99, 51,102, 0,118,101, 99, 51, +100, 0,118,101, 99, 52,105, 0,118,101, 99, 52,102, 0,118,101, 99, 52,100, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68, + 80,114,111,112,101,114,116,121, 68, 97,116, 97, 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97, +114,121, 0, 70,105,108,101, 68, 97,116, 97, 0, 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118, +101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105, +112,108,101, 0, 73,112,111, 0, 75,101,121, 66,108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101, +120,116, 76,105,110,101, 0, 84,101,120,116, 77, 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108, +101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71, + 80, 85, 84,101,120,116,117,114,101, 0, 97,110,105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120, + 0, 84,101,120, 0, 80,108,117,103,105,110, 84,101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0, + 69,110,118, 77, 97,112, 0, 73,109, 66,117,102, 0, 98, 78,111,100,101, 84,114,101,101, 0, 84,101,120, 77, 97,112,112,105,110, +103, 0, 76, 97,109,112, 0, 67,117,114,118,101, 77, 97,112,112,105,110,103, 0, 87, 97,118,101, 0, 77, 97,116,101,114,105, 97, +108, 0, 71,114,111,117,112, 0, 86, 70,111,110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,109, + 0, 66,111,117,110,100, 66,111,120, 0, 77,101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,111, + 0, 84,101,120,116, 66,111,120, 0, 67,117,114,118,101, 0, 80, 97,116,104, 0, 83,101,108, 66,111,120, 0, 69,100,105,116, 70, +111,110,116, 0, 77,101,115,104, 0, 77, 70, 97, 99,101, 0, 77, 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0, 77, 86,101,114, +116, 0, 77, 69,100,103,101, 0, 77, 68,101,102,111,114,109, 86,101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,105, 99,107,121, + 0, 77, 83,101,108,101, 99,116, 0, 69,100,105,116, 77,101,115,104, 0, 67,117,115,116,111,109, 68, 97,116, 97, 0, 77,117,108, +116,105,114,101,115, 0, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 0, 77, 68,101,102,111,114,109, 87, +101,105,103,104,116, 0, 77, 84,101,120, 80,111,108,121, 0, 77, 76,111,111,112, 85, 86, 0, 77, 76,111,111,112, 67,111,108, 0, + 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77, 73,110,116, 80,114,111,112,101,114,116,121, 0, 77, 83,116,114, +105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103, 83,112, 97, 99,101, 70, 97, 99,101, 0, 77, 68,105,115,112,115, + 0, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65, 87, 32, 40, 49, 60, 60, 49, 41, 32, 35,100,101, +102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 32, 40, 49, 60, 60, 50, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, + 71, 79, 78, 32, 40, 49, 60, 60, 51, 41, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 82, 69, 78, 68, 69, + 82, 32, 40, 49, 60, 60, 53, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 76, 79, 79, 83, 69, 69, 68, 71, 69, 32, 40, 49, + 60, 60, 55, 41, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 95, 76, 65, 83, 84, 32, 40, 49, 60, 60, 56, 41, + 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 72, 65, 82, 80, 32, 40, 49, 60, 60, 57, 41, 32, 32, 32, 35,100,101,102,105, +110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 50, + 32, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 51, 32, 52, 32, 35,100,101,102,105,110,101, 32, 77, + 69, 95, 70, 76, 73, 80, 86, 52, 32, 56, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 89, 32, 49, 54, 32, + 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 90, 32, 51, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, + 80, 82, 79, 74, 89, 90, 32, 54, 52, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 49, 86, 50, 32, 49, 32, 35,100,101, +102,105,110,101, 32, 77, 69, 95, 86, 50, 86, 51, 32, 50, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 49, 32, 52, + 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 52, 32, 52, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 52, + 86, 49, 32, 56, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 32, 49, 32, 35,100,101,102,105,110, +101, 32, 77, 69, 95, 70, 65, 67, 69, 95, 83, 69, 76, 32, 50, 32, 32, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 83, 69, +108, 32, 48, 32, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108, 32, 49, 32, 35,100,101,102,105,110,101, 32, 77, 69, + 95, 70, 83, 69, 76, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 32, 49, 32, 32, 35,100, +101,102,105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 32, 50, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, + 76, 49, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 50, 32, 56, 32, 35,100,101,102,105,110,101, 32, 84, + 70, 95, 83, 69, 76, 51, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 32, 51, 50, 32, 35,100,101, +102,105,110,101, 32, 84, 70, 95, 72, 73, 68, 69, 32, 54, 52, 32, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 89, 78, + 65, 77, 73, 67, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, 82, 84, 32, 50, 32, 35,100, +101,102,105,110,101, 32, 84, 70, 95, 84, 69, 88, 32, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, + 86, 69, 82, 84, 32, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, 32, 49, 54, 32, 35,100,101,102,105, +110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 67, 79, 76, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 73, + 76, 69, 83, 32, 49, 50, 56, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 32, 50, 53, + 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 87, 79, 83, 73, 68, 69, 32, 53, 49, 50, 32, 35,100,101,102,105,110,101, + 32, 84, 70, 95, 73, 78, 86, 73, 83, 73, 66, 76, 69, 32, 49, 48, 50, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 79, 66, + 67, 79, 76, 32, 50, 48, 52, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 50, 32, 52, + 48, 57, 54, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 32, 56, 49, 57, 50, 32, 35,100,101,102, +105,110,101, 32, 84, 70, 95, 66, 77, 70, 79, 78, 84, 32, 49, 54, 51, 56, 52, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, + 83, 79, 76, 73, 68, 32, 48, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 32, 49, 32, 35,100,101,102,105,110,101, + 32, 84, 70, 95, 65, 76, 80, 72, 65, 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73, 80, 32, 52, 32, 32, 32, + 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 85, 66, 32, 51, 32, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, + 82, 69, 67, 65, 84, 69, 68, 49, 32, 49, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, + 50, 32, 50, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 51, 32, 52, 32, 35,100,101, +102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 52, 32, 56, 32, 35,100,101,102,105,110,101, 32, 84, 70, + 95, 80, 73, 78, 49, 32, 49, 54, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 32, 51, 50, 32, 35,100,101,102, +105,110,101, 32, 84, 70, 95, 80, 73, 78, 51, 32, 54, 52, 32, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 52, 32, 49, + 50, 56, 32, 35,101,110,100,105,102, 32, 32, 99,104, 97,114, 32,117,115,101, 95, 99,111,108, 44, 32,102,108, 97,103, 59, 10, 10, + 9, 47, 42, 32, 83,112,101, 99,105, 97,108, 32,108,101,118,101,108, 32, 49, 32,100, 97,116, 97, 32,116,104, 97,116, 32, 99, 97, +110,110,111,116, 32, 98,101, 32,109,111,100,105,102,105,101,100, 32,102,114,111,109, 32,111,116,104,101,114, 32,108,101,118,101, +108,115, 32, 42, 47, 10, 9, 67,117,115,116,111,109, 68, 97,116, 97, 32,118,100, 97,116, 97, 59, 10, 9, 67,117,115,116,111,109, + 68, 97,116, 97, 32,102,100, 97,116, 97, 59, 10, 9,115,104,111,114,116, 32, 42,101,100,103,101, 95,102,108, 97,103,115, 59, 10, + 9, 99,104, 97,114, 32, 42,101,100,103,101, 95, 99,114,101, 97,115,101,115, 59, 10,125, 32, 77,117,108,116,105,114,101,115, 59, + 10, 10, 47, 42, 42, 32, 69,110,100, 32, 77,117,108,116,105,114,101,115, 32, 42, 42, 47, 10, 10,116,121,112,101,100,101,102, 32, +115,116,114,117, 99,116, 32, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 32,123, 10, 9,117,110,115,105, +103,110,101,100, 32,105,110,116, 32, 42,118,101,114,116, 95,109, 97,112, 59, 32, 47, 42, 32,118,101,114,116, 95,109, 97,112, 91, + 79,108,100, 32, 73,110,100,101,120, 93, 61, 32, 78,101,119, 32, 73,110,100,101,120, 32, 42, 47, 10, 9,105,110,116, 32, 42,101, +100,103,101, 95,109, 97,112, 59, 32, 47, 42, 32,101,100,103,101, 95,109, 97,112, 91, 79,108,100, 32, 73,110,100,101,120, 93, 61, + 32, 78,101,119, 32, 73,110,100,101,120, 44, 32, 45, 49, 61, 32,104,105,100,100,101,110, 32, 42, 47, 10, 9, 77, 70, 97, 99,101, + 32, 42,111,108,100, 95,102, 97, 99,101,115, 59, 10, 9, 77, 69,100,103,101, 32, 42,111,108,100, 95,101,100,103,101,115, 59, 10, + 9,117,110,115,105,103,110,101,100, 32,105,110,116, 32,116,111,116,102, 97, 99,101, 44, 32,116,111,116,101,100,103,101, 44, 32, +116,111,116,118,101,114,116, 44, 32,112, 97,100, 59, 10,125, 32, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116, +121, 59, 10, 10, 47, 42, 32,109,118,101,114,116, 45, 62,102,108, 97,103, 32, 40, 49, 61, 83, 69, 76, 69, 67, 84, 41, 32, 42, 47, + 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 80, 72, 69, 82, 69, 84, 69, 83, 84, 9, 50, 10, 35,100,101,102,105,110,101, + 32, 77, 69, 95, 83, 80, 72, 69, 82, 69, 84, 69, 77, 80, 9, 52, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 72, 73, 68, 69, + 9, 9, 9, 49, 54, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 69, 82, 84, 95, 77, 69, 82, 71, 69, 68, 9, 9, 40, 49, + 60, 60, 54, 41, 10, 10, 47, 42, 32,109,101,100,103,101, 45, 62,102,108, 97,103, 32, 40, 49, 61, 83, 69, 76, 69, 67, 84, 41, 42, + 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 68, 71, 69, 68, 82, 65, 87, 9, 9, 9, 40, 49, 60, 60, 49, 41, 10, 35, +100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, 9, 9, 9, 9, 40, 49, 60, 60, 50, 41, 10, 35,100,101,102,105,110,101, + 32, 77, 69, 95, 70, 71, 79, 78, 9, 9, 9, 9, 40, 49, 60, 60, 51, 41, 10, 9, 9, 9, 9, 9, 9, 47, 42, 32,114,101,115,101, +114,118,101, 32, 49, 54, 32,102,111,114, 32, 77, 69, 95, 72, 73, 68, 69, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, + 95, 69, 68, 71, 69, 82, 69, 78, 68, 69, 82, 9, 9, 40, 49, 60, 60, 53, 41, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 76, + 79, 79, 83, 69, 69, 68, 71, 69, 9, 9, 40, 49, 60, 60, 55, 41, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 69, 65, 77, + 95, 76, 65, 83, 84, 9, 9, 40, 49, 60, 60, 56, 41, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 72, 65, 82, 80, 9, 9, + 9, 40, 49, 60, 60, 57, 41, 10, 10, 47, 42, 32,112,117,110,111, 32, 61, 32,118,101,114,116,101,120,110,111,114,109, 97,108, 32, + 40,109,102, 97, 99,101, 41, 32, 42, 47, 10, 47, 42, 32,114,101,110,100,101,114, 32, 97,115,115,117,109,101,115, 32,102,108,105, +112,115, 32,116,111, 32, 98,101, 32,111,114,100,101,114,101,100, 32,108,105,107,101, 32,116,104,105,115, 32, 42, 47, 10, 35,100, +101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 49, 9, 9, 49, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, + 73, 80, 86, 50, 9, 9, 50, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 51, 9, 9, 52, 10, 35,100,101, +102,105,110,101, 32, 77, 69, 95, 70, 76, 73, 80, 86, 52, 9, 9, 56, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, + 74, 88, 89, 9, 9, 49, 54, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 88, 90, 9, 9, 51, 50, 10, 35,100, +101,102,105,110,101, 32, 77, 69, 95, 80, 82, 79, 74, 89, 90, 9, 9, 54, 52, 10, 10, 47, 42, 32,101,100, 99,111,100,101, 32, 40, +109,102, 97, 99,101, 41, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 49, 86, 50, 9, 9, 9, 49, 10, 35,100, +101,102,105,110,101, 32, 77, 69, 95, 86, 50, 86, 51, 9, 9, 9, 50, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, + 49, 9, 9, 9, 52, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 51, 86, 52, 9, 9, 9, 52, 10, 35,100,101,102,105,110, +101, 32, 77, 69, 95, 86, 52, 86, 49, 9, 9, 9, 56, 10, 10, 47, 42, 32,102,108, 97,103, 32, 40,109,102, 97, 99,101, 41, 32, 42, + 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 83, 77, 79, 79, 84, 72, 9, 9, 9, 49, 10, 35,100,101,102,105,110,101, 32, + 77, 69, 95, 70, 65, 67, 69, 95, 83, 69, 76, 9, 9, 9, 50, 10, 9, 9, 9, 9, 9, 9, 47, 42, 32,102,108, 97,103, 32, 77, 69, + 95, 72, 73, 68, 69, 61, 61, 49, 54, 32,105,115, 32,117,115,101,100, 32,104,101,114,101, 32,116,111,111, 32, 42, 47, 32, 10, 47, + 42, 32,109,115,101,108,101, 99,116, 45, 62,116,121,112,101, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 86, 83, + 69,108, 9, 48, 10, 35,100,101,102,105,110,101, 32, 77, 69, 95, 69, 83, 69,108, 32, 49, 10, 35,100,101,102,105,110,101, 32, 77, + 69, 95, 70, 83, 69, 76, 32, 50, 10, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,102,108, 97,103, 32, 42, 47, 10, 35,100,101, +102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, 9, 49, 32, 47, 42, 32,117,115,101, 32, 77, 70, 97, 99,101, 32,104,105, +100,101, 32,102,108, 97,103, 32, 40, 97,102,116,101,114, 32, 50, 46, 52, 51, 41, 44, 32,115,104,111,117,108,100, 32, 98,101, 32, + 97, 98,108,101, 32,116,111, 32,114,101,117,115,101, 32, 97,102,116,101,114, 32, 50, 46, 52, 52, 32, 42, 47, 10, 35,100,101,102, +105,110,101, 32, 84, 70, 95, 65, 67, 84, 73, 86, 69, 9, 50, 32, 47, 42, 32,100,101,112,114,101, 99, 97,116,101,100, 33, 32, 42, + 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 49, 9, 9, 52, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, + 83, 69, 76, 50, 9, 9, 56, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 69, 76, 51, 9, 9, 49, 54, 10, 35,100,101,102, +105,110,101, 32, 84, 70, 95, 83, 69, 76, 52, 9, 9, 51, 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 72, 73, 68, 69, 9, + 9, 54, 52, 32, 47, 42, 32,117,110,117,115,101,100, 44, 32,115, 97,109,101, 32, 97,115, 32, 84, 70, 95, 83, 69, 76, 69, 67, 84, + 32, 42, 47, 10, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,109,111,100,101, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, + 84, 70, 95, 68, 89, 78, 65, 77, 73, 67, 9, 9, 49, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 83, 79, + 82, 84, 9, 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 84, 69, 88, 9, 9, 9, 52, 10, 35,100,101,102,105,110,101, 32, + 84, 70, 95, 83, 72, 65, 82, 69, 68, 86, 69, 82, 84, 9, 56, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 76, 73, 71, 72, 84, + 9, 9, 49, 54, 10, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 82, 69, 68, 67, 79, 76, 9, 54, 52, 10, 35,100, +101,102,105,110,101, 32, 84, 70, 95, 84, 73, 76, 69, 83, 9, 9, 49, 50, 56, 9, 9, 47, 42, 32,100,101,112,114,101, 99, 97,116, +101,100, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 9, 50, 53, 54, 10, 35, +100,101,102,105,110,101, 32, 84, 70, 95, 84, 87, 79, 83, 73, 68, 69, 9, 9, 53, 49, 50, 10, 35,100,101,102,105,110,101, 32, 84, + 70, 95, 73, 78, 86, 73, 83, 73, 66, 76, 69, 9, 49, 48, 50, 52, 10, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 79, 66, 67, + 79, 76, 9, 9, 50, 48, 52, 56, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 66, 73, 76, 76, 66, 79, 65, 82, 68, 50, 9, 52, + 48, 57, 54, 9, 47, 42, 32,119,105,116,104, 32, 90, 32, 97,120,105,115, 32, 99,111,110,115,116,114, 97,105,110,116, 32, 42, 47, + 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 72, 65, 68, 79, 87, 9, 9, 56, 49, 57, 50, 10, 35,100,101,102,105,110,101, + 32, 84, 70, 95, 66, 77, 70, 79, 78, 84, 9, 9, 49, 54, 51, 56, 52, 10, 10, 47, 42, 32,109,116,102, 97, 99,101, 45, 62,116,114, + 97,110,115,112, 44, 32,118, 97,108,117,101,115, 32, 49, 45, 52, 32, 97,114,101, 32,117,115,101,100, 32, 97,115, 32,102,108, 97, +103,115, 32,105,110, 32,116,104,101, 32, 71, 76, 44, 32, 87, 65, 82, 78, 73, 78, 71, 44, 32, 84, 70, 95, 83, 85, 66, 32, 99, 97, +110,116, 32,119,111,114,107, 32,119,105,116,104, 32,116,104,105,115, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, + 83, 79, 76, 73, 68, 9, 48, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 65, 68, 68, 9, 9, 49, 10, 35,100,101,102,105,110, +101, 32, 84, 70, 95, 65, 76, 80, 72, 65, 9, 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 67, 76, 73, 80, 9, 9, 52, 32, + 47, 42, 32, 99,108,105,112,109, 97,112, 32, 97,108,112,104, 97, 47, 98,105,110, 97,114,121, 32, 97,108,112,104, 97, 32, 97,108, +108, 32,111,114, 32,110,111,116,104,105,110,103, 33, 32, 42, 47, 10, 10, 47, 42, 32,115,117, 98, 32,105,115, 32,110,111,116, 32, + 97,118, 97,105,108, 97, 98,108,101, 32,105,110, 32,116,104,101, 32,117,115,101,114, 32,105,110,116,101,114,102, 97, 99,101, 32, + 97,110,121,109,111,114,101, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 83, 85, 66, 9, 9, 51, 10, 10, 10, 47, + 42, 32,109,116,102, 97, 99,101, 45, 62,117,110,119,114, 97,112, 32, 42, 47, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, + 69, 80, 82, 69, 67, 65, 84, 69, 68, 49, 9, 49, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, + 69, 68, 50, 9, 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 51, 9, 52, 10, 35, +100,101,102,105,110,101, 32, 84, 70, 95, 68, 69, 80, 82, 69, 67, 65, 84, 69, 68, 52, 9, 56, 10, 35,100,101,102,105,110,101, 32, + 84, 70, 95, 80, 73, 78, 49, 9, 9, 32, 32, 32, 32, 49, 54, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 50, 9, + 9, 32, 32, 32, 32, 51, 50, 10, 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 51, 9, 32, 32, 32, 9, 9, 54, 52, 10, + 35,100,101,102,105,110,101, 32, 84, 70, 95, 80, 73, 78, 52, 9, 32, 32, 32, 32, 9, 49, 50, 56, 10, 10, 35,101,110,100,105,102, + 10,105,110, 79, 67, 75, 33,116, 95,102, 97, 99,101, 59, 32, 32, 32, 32, 32,129, 71, 0, 77,117,108,116,105,114,101,115, 67,111, +108, 0, 77,117,108,116,105,114,101,115, 67,111,108, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77, +117,108,116,105,114,101,115, 69,100,103,101, 0, 77,117,108,116,105,114,101,115, 76,101,118,101,108, 0, 77,111,100,105,102,105, +101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, + 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,117,114,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, + 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 97,115,107, 77,111,100,105,102,105,101,114, 68, + 97,116, 97, 0, 65,114,114, 97,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,105,114,114,111,114, 77,111,100,105, +102,105,101,114, 68, 97,116, 97, 0, 69,100,103,101, 83,112,108,105,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, +101,118,101,108, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 77,101,115,104, 77,111,100,105,102,105,101,114, 68, 97, +116, 97, 0, 68,105,115,112,108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,114,111,106,101, 99, +116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,105,101,114, 68, 97, +116, 97, 0, 83,109,111,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,111,100,105,102,105, +101,114, 68, 97,116, 97, 0, 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109, 97,116,117,114,101, + 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111, +102,116, 98,111,100,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,105,102,105,101,114, + 68, 97,116, 97, 0, 67,108,111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101,116,116,105,110,103,115, 0, 67,108,111,116, +104, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,108,108,105,115,105, +111,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102, 97, 99,101, 77,111, +100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,114,101,101, 70,114, +111,109, 77,101,115,104, 0, 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 68,101,102, 73, +110,102,108,117,101,110, 99,101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,109, 77,111,100,105, +102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,102,105,101,114, 68, + 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101, 73,110,115,116, 97, +110, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,102,105,101,114, 68, + 97,116, 97, 0, 77,117,108,116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105, +109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 83, +104,114,105,110,107,119,114, 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,101, 68,101,102,111, +114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114, +111,117,112, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, + 0, 80, 97,114,116, 68,101,102,108,101, 99,116, 0, 83,111,102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 82, 78, 71, + 0, 80, 84, 67, 97, 99,104,101, 77,101,109, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100,121, 80,111,105,110,116, 0, 66, +111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 87,111,114,108,100, 0, 66, 97,115,101, 0, 65, +118,105, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 68, 97,116, 97, 0, 70, + 70, 77,112,101,103, 67,111,100,101, 99, 68, 97,116, 97, 0, 65,117,100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101, +110,100,101,114, 76, 97,121,101,114, 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114,111,102,105, +108,101, 0, 71, 97,109,101, 68,111,109,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103, 0, 71, 97,109,101, 68, 97,116, 97, + 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0, 66, +114,117,115,104, 0, 80, 97,114,116,105, 99,108,101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 69, +100,105,116, 83,101,116,116,105,110,103,115, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101,110,116, 97,116,105,111,110, + 0, 83, 99,117,108,112,116, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 86, 80, 97,105,110,116, 0, 84,111,111, +108, 83,101,116,116,105,110,103,115, 0, 98, 83,116, 97,116,115, 0, 69,100,105,116,105,110,103, 0, 83, 99,101,110,101, 83,116, + 97,116,115, 0, 68, 97,103, 70,111,114,101,115,116, 0, 66, 71,112,105, 99, 0, 82,101,103,105,111,110, 86,105,101,119, 51, 68, + 0, 98, 71, 80,100, 97,116, 97, 0, 82,101,110,100,101,114, 73,110,102,111, 0, 82,101,116,111,112,111, 86,105,101,119, 68, 97, +116, 97, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,101,119, 83,116,111,114,101, 0,119,109, + 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107, 0, 86,105,101,119, 50, 68, 0, 83,112, + 97, 99,101, 73,110,102,111, 0, 98, 83, 99,114,101,101,110, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111,112,101, 83,104, +101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83,101,108,101, 99, +116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119,109, 79,112,101, +114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84,114,101,101, 83, +116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103,101, 0, 83,112, + 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, 84,101,120,116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114, +105,112,116, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, 76,111,103, +105, 99, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97, 99,101, + 67,111,110,115,111,108,101, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,116,121,108,101, 0,117,105, 83,116,121, +108,101, 0,117,105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,100,103,101,116, 83,116, 97,116,101, 67, +111,108,111,114,115, 0, 84,104,101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97, 99,101, 0, 84,104,101,109,101, 87,105, +114,101, 67,111,108,111,114, 0, 98, 84,104,101,109,101, 0, 83,111,108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101, +102, 0, 83, 99,114, 86,101,114,116, 0, 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112, +101, 0,117,105, 76, 97,121,111,117,116, 0, 83, 99,114, 65,114,101, 97, 0, 83,112, 97, 99,101, 84,121,112,101, 0, 65, 82,101, +103,105,111,110, 0, 65, 82,101,103,105,111,110, 84,121,112,101, 0, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105, +112, 69,108,101,109, 0, 84, 83,116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,112, 0, 83,116,114,105,112, + 84,114, 97,110,115,102,111,114,109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 83,116,114,105, +112, 80,114,111,120,121, 0, 83,116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,113,117,101,110, 99,101, 0, + 98, 83,111,117,110,100, 0,104,100, 97,117,100,105,111, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114, +115, 0, 71,108,111,119, 86, 97,114,115, 0, 84,114, 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111, +108,111,114, 86, 97,114,115, 0, 83,112,101,101,100, 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, + 66,117,105,108,100, 69,102,102, 0, 80, 97,114,116, 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102, +102, 0, 98, 80,114,111,112,101,114,116,121, 0, 98, 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101, +110,115,111,114, 0, 98, 84,111,117, 99,104, 83,101,110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111, +114, 0, 98, 80,114,111,112,101,114,116,121, 83,101,110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111, +114, 0, 98, 68,101,108, 97,121, 83,101,110,115,111,114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, + 98, 82, 97,100, 97,114, 83,101,110,115,111,114, 0, 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83, +101,110,115,111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,110,115,111,114, 0, 98, 67,111, +110,116,114,111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114, 0, 98, 69,120,112,114,101,115, +115,105,111,110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,116,117, 97,116,111,114, 0, 98, + 65,100,100, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,110, 65, 99,116,117, 97,116,111, +114, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 68, 65, 99,116,117, 97,116,111,114, 0, 98, 69,100, +105,116, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,116,111,114, 0, + 98, 80,114,111,112,101,114,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111, +114, 0, 98, 73,112,111, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,111,114, 0, 98, + 67,111,110,115,116,114, 97,105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,117, 97,116,111, +114, 0, 98, 82, 97,110,100,111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,116,117, 97,116, +111,114, 0, 98, 71, 97,109,101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121, 65, 99,116,117, + 97,116,111,114, 0, 98, 84,119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,114,101,110,116, + 65, 99,116,117, 97,116,111,114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 70,114,101,101, 67, 97,109,101, +114, 97, 0, 98, 83, 97,109,112,108,101, 0, 98, 83,111,117,110,100, 76,105,115,116,101,110,101,114, 0, 83,112, 97, 99,101, 83, +111,117,110,100, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98, 65,114,109, 97,116,117,114,101, 0, + 98, 80,111,115,101, 67,104, 97,110,110,101,108, 0, 98, 65, 99,116,105,111,110, 71,114,111,117,112, 0, 83,112, 97, 99,101, 65, + 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, + 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 84, + 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 75,105,110,101,109, 97,116, +105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, + 98, 82,111,116, 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107, +101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83, +105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 67,111,110,115,116,114, 97, +105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, + 80, 97,116,104, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97, +105,110,116, 0, 98, 82,105,103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67, +108, 97,109,112, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97, +105,110,116, 0, 98, 84,114, 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109, +105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, + 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, + 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114,105,110,107,119,114, 97,112, 67,111,110,115,116,114, 97,105,110,116, + 0, 98, 65, 99,116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98, 65, 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78, +111,100,101, 83,116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, + 78,111,100,101, 0, 98, 78,111,100,101, 80,114,101,118,105,101,119, 0, 98, 78,111,100,101, 84,121,112,101, 0, 78,111,100,101, + 73,109, 97,103,101, 65,110,105,109, 0, 78,111,100,101, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 68, 66,108,117,114, + 68, 97,116, 97, 0, 78,111,100,101, 66,105,108, 97,116,101,114, 97,108, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 72, +117,101, 83, 97,116, 0, 78,111,100,101, 73,109, 97,103,101, 70,105,108,101, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78, +111,100,101, 84,119,111, 88, 89,115, 0, 78,111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109, +101,116,114,121, 0, 78,111,100,101, 86,101,114,116,101,120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78, +111,100,101, 83, 99,114,105,112,116, 68,105, 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101, +109, 97,112, 0, 78,111,100,101, 76,101,110,115, 68,105,115,116, 0, 84,101,120, 78,111,100,101, 79,117,116,112,117,116, 0, 67, +117,114,118,101, 77, 97,112, 80,111,105,110,116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, + 0, 67,117,115,116,111,109, 68, 97,116, 97, 76, 97,121,101,114, 0, 72, 97,105,114, 75,101,121, 0, 80, 97,114,116,105, 99,108, +101, 75,101,121, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101, +116, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 66,111,105,100, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, + 83,101,116,116,105,110,103,115, 0, 66,111,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 69,100, +105,116, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 0, 75, 68, 84,114,101,101, 0, 76,105,110,107, 78, 111,100,101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, 98, 71, 80, 68,115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97,109,101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82,101,112,111,114,116, 0, 82,101,112,111,114,116, 76,105,115,116, 0, 119,109, 87,105,110,100,111,119, 77, 97,110, 97,103,101,114, 0,119,109, 87,105,110,100,111,119, 0,119,109, 69,118,101,110,116, @@ -2699,33 +2316,37 @@ char datatoc_B_blend[]= { 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0, 65,110,105,109, 77, 97,112, 80, 97,105,114, 0, 65,110,105,109, 77, 97, 112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0, 78,108, 97, 84,114, 97, 99,107, 0, 75, 83, 95, 80, 97,116,104, 0, 75, 101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,118,101,114,114,105,100,101, 0, 73,100, 65,100,116, 84,101,109,112,108, - 97,116,101, 0, 84, 76, 69, 78, 1, 0, 1, 0, 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 8, 0, 12, 0, - 8, 0, 4, 0, 8, 0, 8, 0, 16, 0, 12, 0, 12, 0, 24, 0, 16, 0, 16, 0, 32, 0, 16, 0, 16, 0, 20, 0, 76, 0, 52, 0, - 40, 2, 0, 0, 32, 0,140, 0, 92, 3, 92, 0, 36, 0, 56, 0, 84, 0,112, 0,124, 0, 48, 0, 16, 0, 24, 0, 40, 0,120, 0, - 12, 0,136, 0, 36, 0,220, 4,128, 1, 0, 0, 0, 0, 0, 0,136, 0, 24, 1, 84, 1, 24, 0, 8, 3,168, 0, 0, 0,140, 0, -132, 0,132, 1, 8, 1, 56, 0,112, 2, 76, 0, 60, 1, 0, 0,108, 0,104, 0,140, 0, 56, 0, 8, 0, 16, 0, 76, 1, 0, 0, - 0, 0, 0, 0, 24, 1, 20, 0, 44, 0, 60, 0, 24, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 0, 0, 24, 0, 76, 0, 32, 0, - 8, 0, 12, 0, 8, 0, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 12, 0, 0, 0, 16, 0, 64, 0, 24, 0, 12, 0, 40, 0, 56, 0, - 72, 0, 92, 0,100, 0, 72, 0,100, 0,120, 0, 68, 0, 64, 0,112, 0, 64, 0,152, 0,156, 0, 64, 0, 96, 0,108, 0,188, 0, -104, 0,184, 0, 56, 0, 76, 0, 0, 0,132, 0, 28, 0,232, 0,104, 0, 0, 0, 64, 0, 0, 0, 0, 0, 68, 0, 8, 0, 8, 0, -220, 0, 80, 0, 76, 1, 76, 0, 68, 0, 68, 0, 64, 0,164, 1,112, 0,108, 0,188, 0, 40, 0, 92, 0, 56, 0,120, 0,128, 0, -152, 0,208, 0, 0, 0, 24, 0, 16, 0, 0, 0, 0, 0, 0, 0,112, 1, 28, 0,176, 0,144, 0, 52, 0, 16, 0, 72, 0,224, 3, - 56, 0, 16, 0, 80, 0, 16, 0,196, 0, 8, 0, 84, 0, 80, 0, 32, 0, 0, 0, 32, 0, 36, 1, 32, 0, 24, 2, 0, 0, 0, 0, - 56, 0,216, 2, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 40, 0,136, 0, 48, 0,140, 0,196, 0, 20, 0,232, 0, -204, 0,124, 1, 52, 0, 0, 0, 92, 0, 0, 0,248, 0, 12, 0, 12, 0,136, 0,188, 0,124, 2, 80, 2, 40, 0,168, 0,232, 0, - 52, 0,136, 2, 28, 0, 80, 0, 16, 1, 32, 0,224, 0, 32, 0, 32, 0, 48, 2, 16, 1, 16, 0,152, 20, 56, 0, 40, 11, 20, 0, - 24, 0, 56, 1, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0,112, 0, 0, 0,236, 0, 0, 0, 32, 0, 80, 0, 28, 0, 16, 0, - 8, 0, 52, 0,252, 0,240, 0,168, 1,196, 0, 28, 1, 0, 0, 16, 0, 12, 0, 24, 0, 48, 0, 16, 0, 20, 0, 16, 0, 24, 0, - 56, 1, 0, 0, 56, 0, 64, 0, 48, 0, 8, 0, 44, 0, 72, 0,104, 0, 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 68, 0, - 76, 0, 80, 0, 60, 0,128, 0, 76, 0, 60, 0, 12, 0, 92, 0, 28, 0, 20, 0, 80, 0, 16, 0, 76, 0,108, 0, 84, 0, 28, 0, - 96, 0, 60, 0, 56, 0,108, 0,140, 0, 4, 0, 20, 0, 12, 0, 8, 0, 40, 0, 0, 0, 68, 0,184, 0, 24, 0, 4, 1,120, 0, -172, 1,104, 0,216, 0, 64, 0, 44, 0, 64, 0,116, 0, 60, 0,104, 0, 52, 0, 44, 0, 44, 0, 68, 0, 44, 0, 64, 0, 44, 0, - 20, 0, 52, 0, 96, 0, 12, 0,108, 0, 92, 0, 28, 0, 28, 0, 28, 0, 52, 0, 20, 0, 60, 0,140, 0, 36, 0,120, 0, 32, 0, -208, 0, 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12, 0, 12, 0, 16, 1, 40, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0, - 24, 0, 32, 0, 8, 0, 32, 0, 12, 0, 44, 0, 20, 0, 68, 0, 24, 0, 56, 0, 72, 0, 28, 0,252, 0,244, 1, 0, 0, 0, 0, - 0, 0, 16, 0, 20, 0, 24, 0,172, 0, 24, 0, 24, 0,140, 0,148, 0, 56, 0, 0, 0, 0, 0, 92, 0, 0, 0, 88, 0, 0, 0, - 88, 0, 20, 0, 24, 0, 16, 0, 20, 0, 8, 0, 8, 0, 24, 0, 20, 0, 88, 0, 24, 1, 16, 0, 68, 0, 0, 1, 20, 0,152, 0, - 88, 0, 96, 0, 88, 0, 20, 0, 56, 0, 0, 0, 83, 84, 82, 67,104, 1, 0, 0, 10, 0, 2, 0, 10, 0, 0, 0, 10, 0, 1, 0, + 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,111,105,100, 82,117,108,101, 71,111, 97,108, 65,118,111,105,100, 0, 66, +111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,108,108,105,115,105,111,110, 0, 66,111,105,100, 82,117,108,101, 70,111, +108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,100, 82,117,108,101, 65,118,101,114, 97,103,101, 83,112,101,101,100, 0, + 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0, 66,111,105,100, 83,116, 97,116,101, 0, 84, 76, 69, 78, 1, 0, 1, 0, + 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 16, 0, 24, 0, 16, 0, 4, 0, 8, 0, 8, 0, 16, 0, 12, 0, + 12, 0, 24, 0, 16, 0, 16, 0, 32, 0, 16, 0, 16, 0, 32, 0, 96, 0, 72, 0, 72, 2, 0, 0, 40, 0,144, 0, 40, 4,112, 0, + 36, 0, 56, 0,112, 0,128, 0,168, 0, 88, 0, 40, 0, 48, 0,176, 0, 16, 0,152, 0, 40, 0,192, 5,184, 1, 0, 0, 0, 0, + 0, 0,144, 0, 88, 1,120, 1, 24, 0, 8, 3,200, 0, 0, 0,232, 0,136, 0,232, 1, 56, 1, 80, 0,224, 2,104, 0, 88, 1, + 0, 0,128, 0,104, 0,200, 0, 80, 0, 8, 0, 16, 0,200, 1, 0, 0, 0, 0, 0, 0,144, 1, 20, 0, 48, 0, 64, 0, 24, 0, + 12, 0, 16, 0, 4, 0, 8, 0, 8, 0, 0, 0, 32, 0,112, 0, 48, 0, 8, 0, 16, 0, 8, 0, 8, 0, 4, 0, 4, 0, 0, 1, + 32, 0, 16, 0, 0, 0, 16, 0, 64, 0, 24, 0, 12, 0, 64, 0, 72, 0, 96, 0,112, 0,120, 0, 88, 0,120, 0,152, 0, 88, 0, + 80, 0,128, 0, 80, 0,176, 0,216, 0, 80, 0,112, 0,128, 0,216, 0,128, 0,208, 0, 72, 0,112, 0, 0, 0,136, 0, 32, 0, +232, 1,152, 0, 0, 0,112, 0, 0, 0, 0, 0, 88, 0, 8, 0, 8, 0, 8, 1,104, 0,216, 1, 96, 0, 88, 0, 88, 0, 88, 0, +184, 1,136, 0,128, 0,232, 0, 48, 0,144, 0, 72, 0,120, 0,136, 0, 16, 1,224, 0, 0, 0, 40, 0, 16, 0, 0, 0, 0, 0, + 0, 0,216, 1, 40, 0,184, 0,152, 0, 56, 0, 16, 0, 88, 0, 24, 4, 64, 0, 24, 0, 16, 0, 88, 0, 88, 0, 24, 0, 40, 1, + 8, 0, 88, 0, 88, 0, 40, 0, 0, 0, 48, 0, 64, 1, 32, 0, 48, 2, 0, 0, 0, 0, 64, 0,248, 2,104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 32, 1, 56, 0,152, 0, 72, 0,208, 0,240, 0, 32, 0, 0, 1,240, 0,128, 1,104, 0, 0, 0,144, 0, + 0, 0, 40, 1, 16, 0, 16, 0,168, 0,224, 0,144, 2,120, 2, 64, 0,200, 0, 32, 1, 72, 0,208, 2, 40, 0,112, 0, 24, 1, + 32, 0,232, 0, 32, 0, 32, 0, 80, 2, 16, 1, 16, 0,192, 20, 56, 0, 64, 11, 32, 0, 40, 0, 80, 1, 0, 0, 0, 0,160, 0, + 0, 0, 40, 1, 0, 0, 40, 0, 80, 0, 48, 0, 16, 0, 8, 0, 52, 0, 0, 1, 32, 1,200, 1, 8, 1, 72, 1, 0, 0, 32, 0, + 12, 0, 24, 0, 48, 0, 16, 0, 24, 0, 24, 0, 32, 0, 72, 1, 0, 0, 64, 0, 64, 0, 48, 0, 8, 0, 48, 0, 72, 0,104, 0, + 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 72, 0, 96, 0,104, 0, 60, 0,128, 0, 80, 0, 80, 0, 16, 0, 96, 0, 32, 0, + 20, 0, 88, 0, 24, 0, 80, 0,112, 0, 84, 0, 32, 0, 96, 0, 64, 0, 56, 0,112, 0,140, 0, 4, 0, 24, 0, 16, 0, 8, 0, + 40, 0, 0, 0, 88, 0,224, 0, 40, 0, 24, 1,168, 0,232, 1,120, 0, 8, 1, 88, 0, 56, 0, 80, 0,128, 0, 80, 0,112, 0, + 56, 0, 48, 0, 48, 0, 72, 0, 48, 0, 72, 0, 48, 0, 24, 0, 56, 0,104, 0, 16, 0,112, 0, 96, 0, 28, 0, 28, 0, 28, 0, + 56, 0, 24, 0, 72, 0,168, 0, 40, 0,144, 0, 56, 0, 0, 1, 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12, 0, 12, 0, 16, 1, + 40, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 16, 0, 24, 0, 32, 0, 8, 0, 32, 0, 12, 0, 56, 0, 24, 0, 72, 0, 24, 0, + 56, 0, 72, 0, 40, 0,248, 0, 20, 0, 8, 2,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 32, 0, 40, 0,192, 0, 40, 0, + 32, 0,224, 0,224, 0, 72, 0, 0, 0, 0, 0,112, 0, 0, 0,112, 0, 0, 0,104, 0, 24, 0, 24, 0, 16, 0, 24, 0, 8, 0, + 16, 0, 24, 0, 20, 0,104, 0, 32, 1, 16, 0,104, 0, 0, 1, 40, 0,200, 0,104, 0,112, 0,104, 0, 32, 0, 80, 0, 56, 0, + 80, 0, 64, 0,104, 0, 72, 0, 64, 0,128, 0, 83, 84, 82, 67,112, 1, 0, 0, 10, 0, 2, 0, 10, 0, 0, 0, 10, 0, 1, 0, 11, 0, 3, 0, 11, 0, 0, 0, 11, 0, 1, 0, 9, 0, 2, 0, 12, 0, 2, 0, 9, 0, 3, 0, 9, 0, 4, 0, 13, 0, 2, 0, 2, 0, 5, 0, 2, 0, 6, 0, 14, 0, 2, 0, 4, 0, 5, 0, 4, 0, 6, 0, 15, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 16, 0, 2, 0, 8, 0, 5, 0, 8, 0, 6, 0, 17, 0, 3, 0, 4, 0, 5, 0, 4, 0, 6, 0, 4, 0, 7, 0, 18, 0, 3, 0, @@ -2746,574 +2367,588 @@ char datatoc_B_blend[]= { 37, 0, 0, 0, 37, 0, 1, 0, 7, 0, 67, 0, 7, 0, 61, 0, 2, 0, 17, 0, 2, 0, 47, 0, 2, 0, 68, 0, 2, 0, 19, 0, 4, 0, 69, 0, 4, 0, 70, 0, 9, 0, 2, 0, 7, 0, 71, 0, 0, 0, 20, 0, 0, 0, 72, 0, 7, 0, 73, 0, 7, 0, 74, 0, 38, 0, 13, 0, 27, 0, 31, 0, 39, 0, 75, 0, 37, 0, 76, 0, 0, 0, 77, 0, 4, 0, 78, 0, 7, 0, 61, 0, 12, 0, 79, 0, - 36, 0, 80, 0, 27, 0, 81, 0, 2, 0, 17, 0, 2, 0, 82, 0, 2, 0, 83, 0, 2, 0, 19, 0, 40, 0, 5, 0, 27, 0, 84, 0, - 2, 0, 85, 0, 2, 0, 86, 0, 2, 0, 87, 0, 4, 0, 37, 0, 41, 0, 6, 0, 41, 0, 0, 0, 41, 0, 1, 0, 0, 0, 88, 0, - 0, 0, 89, 0, 4, 0, 23, 0, 4, 0, 90, 0, 42, 0, 10, 0, 42, 0, 0, 0, 42, 0, 1, 0, 4, 0, 91, 0, 4, 0, 92, 0, - 4, 0, 93, 0, 4, 0, 43, 0, 4, 0, 14, 0, 4, 0, 94, 0, 0, 0, 95, 0, 0, 0, 96, 0, 43, 0, 15, 0, 27, 0, 31, 0, - 0, 0, 97, 0, 4, 0, 94, 0, 4, 0, 98, 0, 12, 0, 99, 0, 41, 0,100, 0, 41, 0,101, 0, 4, 0,102, 0, 4, 0,103, 0, - 12, 0,104, 0, 0, 0,105, 0, 4, 0,106, 0, 4, 0,107, 0, 9, 0,108, 0, 8, 0,109, 0, 44, 0, 3, 0, 4, 0,110, 0, - 4, 0,111, 0, 9, 0, 2, 0, 45, 0, 21, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0,112, 0, - 7, 0,113, 0, 7, 0,114, 0, 7, 0,115, 0, 7, 0,116, 0, 7, 0,117, 0, 7, 0,118, 0, 7, 0,119, 0, 7, 0,120, 0, - 7, 0,121, 0, 7, 0,122, 0, 2, 0,123, 0, 2, 0,124, 0, 7, 0,125, 0, 36, 0, 80, 0, 40, 0,126, 0, 32, 0,127, 0, - 46, 0, 13, 0, 4, 0,128, 0, 4, 0,129, 0, 4, 0,130, 0, 4, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 2, 0, 19, 0, - 2, 0,134, 0, 2, 0,135, 0, 2, 0,136, 0, 2, 0,137, 0, 2, 0,138, 0, 47, 0,139, 0, 48, 0, 32, 0, 27, 0, 31, 0, - 0, 0, 34, 0, 12, 0,140, 0, 49, 0,141, 0, 50, 0,142, 0, 51, 0,143, 0, 2, 0,134, 0, 2, 0, 19, 0, 2, 0,144, 0, - 2, 0, 17, 0, 2, 0, 37, 0, 2, 0, 43, 0, 4, 0,145, 0, 2, 0,146, 0, 2, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0, - 2, 0,150, 0, 2, 0,151, 0, 4, 0,152, 0, 4, 0,153, 0, 44, 0,154, 0, 30, 0,155, 0, 0, 0,156, 0, 7, 0,157, 0, - 4, 0,158, 0, 2, 0,159, 0, 2, 0,160, 0, 2, 0,161, 0, 2, 0,162, 0, 7, 0,163, 0, 7, 0,164, 0, 52, 0, 31, 0, - 2, 0,165, 0, 2, 0,166, 0, 2, 0,167, 0, 2, 0,168, 0, 32, 0,169, 0, 53, 0,170, 0, 0, 0,171, 0, 0, 0,172, 0, - 0, 0,173, 0, 0, 0,174, 0, 0, 0,175, 0, 7, 0,176, 0, 7, 0,177, 0, 2, 0,178, 0, 2, 0,179, 0, 2, 0,180, 0, - 2, 0,181, 0, 2, 0,182, 0, 2, 0,183, 0, 2, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,188, 0, - 7, 0,189, 0, 7, 0, 57, 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, 7, 0,194, 0, 54, 0, 15, 0, - 0, 0,195, 0, 9, 0,196, 0, 0, 0,197, 0, 0, 0,198, 0, 4, 0,199, 0, 4, 0,200, 0, 9, 0,201, 0, 7, 0,202, 0, - 7, 0,203, 0, 7, 0,204, 0, 4, 0,205, 0, 9, 0,206, 0, 9, 0,207, 0, 4, 0,208, 0, 4, 0, 37, 0, 55, 0, 6, 0, - 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,209, 0, 7, 0, 67, 0, 4, 0, 64, 0, 56, 0, 5, 0, 2, 0, 19, 0, - 2, 0, 36, 0, 2, 0, 64, 0, 2, 0,210, 0, 55, 0,204, 0, 57, 0, 17, 0, 32, 0,169, 0, 48, 0,211, 0, 58, 0,212, 0, - 7, 0,213, 0, 7, 0,214, 0, 2, 0, 17, 0, 2, 0,215, 0, 7, 0,114, 0, 7, 0,115, 0, 7, 0,216, 0, 4, 0,217, 0, - 2, 0,218, 0, 2, 0,219, 0, 4, 0,134, 0, 4, 0,145, 0, 2, 0,220, 0, 2, 0,221, 0, 53, 0, 57, 0, 27, 0, 31, 0, - 39, 0, 75, 0, 7, 0,222, 0, 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 7, 0,228, 0, - 7, 0,229, 0, 7, 0,230, 0, 7, 0,231, 0, 7, 0,232, 0, 7, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, 7, 0,236, 0, - 7, 0,237, 0, 7, 0,238, 0, 7, 0,239, 0, 7, 0,240, 0, 7, 0,241, 0, 2, 0,242, 0, 2, 0,243, 0, 2, 0,244, 0, - 2, 0,245, 0, 2, 0,246, 0, 2, 0,247, 0, 2, 0,248, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,215, 0, 7, 0,249, 0, - 7, 0,250, 0, 7, 0,251, 0, 7, 0,252, 0, 2, 0,253, 0, 2, 0,254, 0, 2, 0,255, 0, 2, 0,132, 0, 4, 0, 23, 0, - 4, 0,129, 0, 4, 0,130, 0, 4, 0,131, 0, 7, 0, 0, 1, 7, 0, 1, 1, 7, 0,191, 0, 46, 0, 2, 1, 59, 0, 3, 1, - 36, 0, 80, 0, 48, 0,211, 0, 54, 0, 4, 1, 56, 0, 5, 1, 57, 0, 6, 1, 30, 0,155, 0, 0, 0, 7, 1, 0, 0, 8, 1, - 60, 0, 8, 0, 7, 0, 9, 1, 7, 0, 10, 1, 7, 0,177, 0, 4, 0, 19, 0, 7, 0, 11, 1, 7, 0, 12, 1, 7, 0, 13, 1, - 32, 0, 45, 0, 61, 0, 81, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 14, 1, 2, 0,179, 0, - 2, 0, 15, 1, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,188, 0, 7, 0, 16, 1, 7, 0, 17, 1, 7, 0, 18, 1, - 7, 0, 19, 1, 7, 0, 20, 1, 7, 0, 21, 1, 7, 0, 22, 1, 7, 0, 23, 1, 7, 0, 24, 1, 7, 0, 25, 1, 7, 0, 26, 1, - 62, 0, 27, 1, 2, 0, 28, 1, 2, 0, 70, 0, 7, 0,114, 0, 7, 0,115, 0, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1, - 2, 0, 32, 1, 2, 0, 33, 1, 2, 0, 34, 1, 2, 0, 35, 1, 0, 0, 36, 1, 0, 0, 37, 1, 2, 0, 38, 1, 2, 0, 39, 1, - 2, 0, 40, 1, 2, 0, 41, 1, 2, 0, 42, 1, 7, 0, 43, 1, 7, 0, 44, 1, 7, 0, 45, 1, 7, 0, 46, 1, 2, 0, 47, 1, - 2, 0, 43, 0, 2, 0, 48, 1, 2, 0, 49, 1, 2, 0, 50, 1, 2, 0, 51, 1, 7, 0, 52, 1, 7, 0, 53, 1, 7, 0, 54, 1, - 7, 0, 55, 1, 7, 0, 56, 1, 7, 0, 57, 1, 7, 0, 58, 1, 7, 0, 59, 1, 7, 0, 60, 1, 7, 0, 61, 1, 7, 0, 62, 1, - 7, 0, 63, 1, 2, 0, 64, 1, 2, 0, 65, 1, 4, 0, 66, 1, 4, 0, 67, 1, 2, 0, 68, 1, 2, 0, 69, 1, 2, 0, 70, 1, - 2, 0, 71, 1, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, 7, 0, 75, 1, 2, 0, 76, 1, 2, 0, 77, 1, 52, 0, 78, 1, - 36, 0, 80, 0, 30, 0,155, 0, 40, 0,126, 0, 63, 0, 2, 0, 27, 0, 31, 0, 36, 0, 80, 0, 64, 0,130, 0, 27, 0, 31, 0, - 39, 0, 75, 0, 2, 0, 79, 1, 2, 0, 19, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0, 80, 1, 7, 0, 81, 1, - 7, 0, 82, 1, 7, 0, 83, 1, 7, 0, 84, 1, 7, 0, 85, 1, 7, 0, 86, 1, 7, 0, 87, 1, 7, 0, 88, 1, 7, 0, 89, 1, - 7, 0, 90, 1, 7, 0, 91, 1, 7, 0, 92, 1, 7, 0, 93, 1, 7, 0, 94, 1, 7, 0, 95, 1, 7, 0, 96, 1, 7, 0, 97, 1, - 7, 0, 98, 1, 7, 0, 99, 1, 7, 0,100, 1, 7, 0,101, 1, 7, 0,102, 1, 7, 0,103, 1, 7, 0,104, 1, 7, 0,105, 1, - 7, 0,106, 1, 2, 0,107, 1, 2, 0,108, 1, 2, 0,109, 1, 0, 0,110, 1, 0, 0,111, 1, 7, 0,112, 1, 7, 0,113, 1, - 2, 0,114, 1, 2, 0,115, 1, 7, 0,116, 1, 7, 0,117, 1, 7, 0,118, 1, 7, 0,119, 1, 2, 0,120, 1, 2, 0,121, 1, - 4, 0, 14, 1, 4, 0,122, 1, 2, 0,123, 1, 2, 0,124, 1, 2, 0,125, 1, 2, 0,126, 1, 7, 0,127, 1, 7, 0,128, 1, - 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1, 7, 0,132, 1, 7, 0,133, 1, 7, 0,134, 1, 7, 0,135, 1, 7, 0,136, 1, - 0, 0,137, 1, 7, 0,138, 1, 7, 0,139, 1, 7, 0,140, 1, 4, 0,141, 1, 0, 0,142, 1, 0, 0, 48, 1, 0, 0,143, 1, - 0, 0, 7, 1, 2, 0,144, 1, 2, 0,145, 1, 2, 0, 65, 1, 2, 0,146, 1, 2, 0,147, 1, 2, 0,148, 1, 7, 0,149, 1, - 7, 0,150, 1, 7, 0,151, 1, 7, 0,152, 1, 7, 0,153, 1, 2, 0,165, 0, 2, 0,166, 0, 56, 0,154, 1, 56, 0,155, 1, - 0, 0,156, 1, 0, 0,157, 1, 0, 0,158, 1, 0, 0,159, 1, 2, 0,160, 1, 2, 0,161, 1, 7, 0,162, 1, 7, 0,163, 1, - 52, 0, 78, 1, 59, 0, 3, 1, 36, 0, 80, 0, 65, 0,164, 1, 30, 0,155, 0, 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1, - 7, 0,168, 1, 7, 0,169, 1, 2, 0,170, 1, 2, 0, 70, 0, 7, 0,171, 1, 7, 0,172, 1, 7, 0,173, 1, 7, 0,174, 1, - 7, 0,175, 1, 7, 0,176, 1, 7, 0,177, 1, 7, 0,178, 1, 7, 0,179, 1, 2, 0,180, 1, 2, 0,181, 1, 7, 0,182, 1, - 7, 0,183, 1, 7, 0,184, 1, 7, 0,185, 1, 7, 0,186, 1, 4, 0,187, 1, 4, 0,188, 1, 4, 0,189, 1, 40, 0,126, 0, - 12, 0,190, 1, 66, 0, 4, 0, 27, 0, 31, 0, 0, 0,191, 1, 67, 0, 2, 0, 44, 0,154, 0, 68, 0, 26, 0, 68, 0, 0, 0, - 68, 0, 1, 0, 69, 0,192, 1, 4, 0,193, 1, 4, 0,194, 1, 4, 0,195, 1, 4, 0,196, 1, 4, 0,197, 1, 4, 0,198, 1, - 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,199, 1, 2, 0,200, 1, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0,201, 1, - 7, 0,202, 1, 7, 0,203, 1, 7, 0,204, 1, 7, 0,205, 1, 7, 0,206, 1, 7, 0,207, 1, 7, 0, 23, 0, 7, 0,208, 1, - 7, 0,209, 1, 70, 0, 16, 0, 27, 0, 31, 0, 69, 0,192, 1, 12, 0,210, 1, 12, 0,211, 1, 12, 0,212, 1, 36, 0, 80, 0, - 64, 0,213, 1, 2, 0, 19, 0, 2, 0,214, 1, 4, 0,178, 0, 7, 0, 9, 1, 7, 0,177, 0, 7, 0, 10, 1, 7, 0,215, 1, - 7, 0,216, 1, 7, 0,217, 1, 35, 0, 11, 0, 7, 0,218, 1, 7, 0,219, 1, 7, 0,220, 1, 7, 0,221, 1, 2, 0, 55, 0, - 0, 0,222, 1, 0, 0,223, 1, 0, 0,224, 1, 0, 0,225, 1, 0, 0,226, 1, 0, 0,227, 1, 34, 0, 7, 0, 7, 0,228, 1, - 7, 0,219, 1, 7, 0,220, 1, 2, 0,224, 1, 2, 0,227, 1, 7, 0,221, 1, 7, 0, 37, 0, 71, 0, 21, 0, 71, 0, 0, 0, - 71, 0, 1, 0, 2, 0, 17, 0, 2, 0,229, 1, 2, 0,227, 1, 2, 0, 19, 0, 2, 0,230, 1, 2, 0,231, 1, 2, 0,232, 1, - 2, 0,233, 1, 2, 0,234, 1, 2, 0,235, 1, 2, 0,236, 1, 2, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 34, 0, 49, 0, - 35, 0, 50, 0, 2, 0,240, 1, 2, 0,241, 1, 4, 0,242, 1, 72, 0, 5, 0, 2, 0,243, 1, 2, 0,229, 1, 0, 0, 19, 0, - 0, 0, 37, 0, 2, 0, 70, 0, 73, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 8, 0, 7, 0,244, 1, 74, 0, 62, 0, - 27, 0, 31, 0, 39, 0, 75, 0, 69, 0,192, 1, 12, 0,245, 1, 12, 0,211, 1, 12, 0,246, 1, 32, 0,247, 1, 32, 0,248, 1, - 32, 0,249, 1, 36, 0, 80, 0, 75, 0,250, 1, 38, 0,251, 1, 64, 0,213, 1, 12, 0,252, 1, 7, 0, 9, 1, 7, 0,177, 0, - 7, 0, 10, 1, 4, 0,178, 0, 2, 0,253, 1, 2, 0,214, 1, 2, 0, 19, 0, 2, 0,254, 1, 7, 0,255, 1, 7, 0, 0, 2, - 7, 0, 1, 2, 2, 0,232, 1, 2, 0,233, 1, 2, 0, 2, 2, 2, 0, 3, 2, 4, 0, 4, 2, 34, 0, 5, 2, 2, 0, 23, 0, - 2, 0, 99, 0, 2, 0, 67, 0, 2, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 9, 2, 7, 0, 10, 2, 7, 0, 11, 2, - 7, 0, 12, 2, 7, 0, 13, 2, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0, 16, 2, 0, 0, 17, 2, 76, 0, 18, 2, 77, 0, 19, 2, - 0, 0, 20, 2, 66, 0, 21, 2, 66, 0, 22, 2, 66, 0, 23, 2, 66, 0, 24, 2, 4, 0, 25, 2, 7, 0, 26, 2, 4, 0, 27, 2, - 4, 0, 28, 2, 73, 0, 29, 2, 4, 0, 30, 2, 4, 0, 31, 2, 72, 0, 32, 2, 72, 0, 33, 2, 78, 0, 39, 0, 27, 0, 31, 0, - 69, 0,192, 1, 12, 0, 34, 2, 36, 0, 80, 0, 38, 0,251, 1, 64, 0,213, 1, 79, 0, 35, 2, 80, 0, 36, 2, 81, 0, 37, 2, - 82, 0, 38, 2, 83, 0, 39, 2, 84, 0, 40, 2, 85, 0, 41, 2, 86, 0, 42, 2, 78, 0, 43, 2, 87, 0, 44, 2, 88, 0, 45, 2, - 89, 0, 46, 2, 89, 0, 47, 2, 89, 0, 48, 2, 4, 0, 54, 0, 4, 0, 49, 2, 4, 0, 50, 2, 4, 0, 51, 2, 4, 0, 52, 2, - 4, 0,178, 0, 7, 0, 9, 1, 7, 0,177, 0, 7, 0, 10, 1, 7, 0, 53, 2, 4, 0, 54, 2, 2, 0, 55, 2, 2, 0, 19, 0, - 2, 0, 56, 2, 2, 0, 57, 2, 2, 0,214, 1, 2, 0, 58, 2, 90, 0, 59, 2, 91, 0, 60, 2, 81, 0, 8, 0, 9, 0, 61, 2, - 7, 0, 62, 2, 4, 0, 63, 2, 0, 0, 19, 0, 0, 0, 64, 2, 2, 0, 14, 1, 2, 0, 65, 2, 2, 0, 66, 2, 79, 0, 7, 0, - 4, 0, 67, 2, 4, 0, 68, 2, 4, 0, 69, 2, 4, 0, 70, 2, 2, 0,229, 1, 0, 0, 71, 2, 0, 0, 19, 0, 83, 0, 5, 0, - 4, 0, 67, 2, 4, 0, 68, 2, 0, 0, 72, 2, 0, 0, 73, 2, 2, 0, 19, 0, 92, 0, 2, 0, 4, 0, 74, 2, 7, 0,220, 1, - 84, 0, 3, 0, 92, 0, 75, 2, 4, 0, 76, 2, 4, 0, 19, 0, 82, 0, 6, 0, 7, 0, 77, 2, 2, 0, 78, 2, 2, 0,229, 1, - 0, 0, 19, 0, 0, 0, 73, 2, 0, 0,184, 0, 85, 0, 4, 0, 0, 0,209, 0, 0, 0,185, 0, 0, 0,186, 0, 0, 0,187, 0, - 93, 0, 6, 0, 48, 0, 61, 2, 0, 0, 19, 0, 0, 0, 64, 2, 2, 0, 14, 1, 2, 0, 65, 2, 2, 0, 66, 2, 94, 0, 1, 0, - 7, 0, 79, 2, 95, 0, 5, 0, 0, 0,209, 0, 0, 0,185, 0, 0, 0,186, 0, 0, 0,187, 0, 4, 0, 37, 0, 86, 0, 1, 0, - 7, 0, 80, 2, 87, 0, 2, 0, 4, 0, 81, 2, 4, 0, 17, 0, 80, 0, 7, 0, 7, 0, 62, 2, 48, 0, 61, 2, 0, 0, 19, 0, - 0, 0, 64, 2, 2, 0, 14, 1, 2, 0, 65, 2, 2, 0, 66, 2, 96, 0, 1, 0, 7, 0, 82, 2, 97, 0, 1, 0, 4, 0, 83, 2, - 98, 0, 1, 0, 0, 0, 84, 2, 99, 0, 1, 0, 7, 0, 62, 2,100, 0, 3, 0, 4, 0, 85, 2, 0, 0, 96, 0, 7, 0, 86, 2, -102, 0, 4, 0, 7, 0,209, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0,103, 0, 1, 0,102, 0, 63, 2,104, 0, 5, 0, - 4, 0, 87, 2, 4, 0, 88, 2, 0, 0, 19, 0, 0, 0,229, 1, 0, 0,184, 0,105, 0, 2, 0, 4, 0, 89, 2, 4, 0, 88, 2, -106, 0, 10, 0,106, 0, 0, 0,106, 0, 1, 0,104, 0, 90, 2,103, 0, 91, 2,105, 0, 92, 2, 4, 0, 54, 0, 4, 0, 50, 2, - 4, 0, 49, 2, 4, 0, 37, 0, 82, 0, 93, 2, 90, 0, 14, 0, 12, 0, 94, 2, 82, 0, 93, 2, 0, 0, 95, 2, 0, 0, 96, 2, - 0, 0, 97, 2, 0, 0, 98, 2, 0, 0, 99, 2, 0, 0,100, 2, 0, 0,101, 2, 0, 0, 19, 0, 89, 0, 46, 2, 89, 0, 48, 2, - 2, 0,102, 2, 0, 0,103, 2, 91, 0, 8, 0, 4, 0,104, 2, 4, 0,105, 2, 79, 0,106, 2, 83, 0,107, 2, 4, 0, 50, 2, - 4, 0, 49, 2, 4, 0, 54, 0, 4, 0, 37, 0,107, 0, 7, 0,107, 0, 0, 0,107, 0, 1, 0, 4, 0, 17, 0, 4, 0, 14, 1, - 0, 0, 20, 0, 47, 0,139, 0, 0, 0,108, 2,108, 0, 7, 0,107, 0,109, 2, 2, 0,110, 2, 2, 0, 94, 2, 2, 0,111, 2, - 2, 0, 94, 0, 9, 0,112, 2, 9, 0,113, 2,109, 0, 3, 0,107, 0,109, 2, 32, 0,169, 0, 0, 0, 20, 0,110, 0, 5, 0, -107, 0,109, 2, 32, 0,169, 0, 0, 0, 20, 0, 2, 0,114, 2, 0, 0,115, 2,111, 0, 5, 0,107, 0,109, 2, 7, 0, 92, 0, - 7, 0,116, 2, 4, 0,117, 2, 4, 0,118, 2,112, 0, 5, 0,107, 0,109, 2, 32, 0,119, 2, 0, 0, 72, 0, 4, 0, 14, 1, - 4, 0, 19, 0,113, 0, 13, 0,107, 0,109, 2, 32, 0,120, 2, 32, 0,121, 2, 32, 0,122, 2, 32, 0,123, 2, 7, 0,124, 2, - 7, 0,125, 2, 7, 0,116, 2, 7, 0,126, 2, 4, 0,127, 2, 4, 0,128, 2, 4, 0, 94, 0, 4, 0,129, 2,114, 0, 5, 0, -107, 0,109, 2, 2, 0,130, 2, 2, 0, 19, 0, 7, 0,131, 2, 32, 0,132, 2,115, 0, 3, 0,107, 0,109, 2, 7, 0,133, 2, - 4, 0, 94, 0,116, 0, 10, 0,107, 0,109, 2, 7, 0,134, 2, 4, 0,135, 2, 4, 0, 37, 0, 2, 0, 94, 0, 2, 0,136, 2, - 2, 0,137, 2, 2, 0,138, 2, 7, 0,139, 2, 0, 0,140, 2,117, 0, 3, 0,107, 0,109, 2, 7, 0, 37, 0, 4, 0, 17, 0, -118, 0, 11, 0,107, 0,109, 2, 53, 0,141, 2, 7, 0,142, 2, 4, 0,143, 2, 0, 0,140, 2, 7, 0,144, 2, 4, 0,145, 2, - 32, 0,146, 2, 0, 0,147, 2, 4, 0,148, 2, 4, 0, 37, 0,119, 0, 10, 0,107, 0,109, 2, 32, 0,149, 2, 48, 0,150, 2, - 4, 0, 94, 0, 4, 0,151, 2, 7, 0,152, 2, 7, 0,153, 2, 0, 0,147, 2, 4, 0,148, 2, 4, 0, 37, 0,120, 0, 3, 0, -107, 0,109, 2, 7, 0,154, 2, 4, 0,155, 2,121, 0, 5, 0,107, 0,109, 2, 7, 0,156, 2, 0, 0,140, 2, 2, 0, 19, 0, - 2, 0,157, 2,122, 0, 8, 0,107, 0,109, 2, 32, 0,169, 0, 7, 0,156, 2, 7, 0,221, 1, 7, 0,110, 0, 0, 0,140, 2, - 2, 0, 19, 0, 2, 0, 17, 0,123, 0, 21, 0,107, 0,109, 2, 32, 0,158, 2, 0, 0,140, 2, 53, 0,141, 2, 32, 0,146, 2, - 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,159, 2, 7, 0,160, 2, 7, 0,161, 2, 7, 0,255, 1, 7, 0,162, 2, 7, 0,163, 2, - 7, 0,164, 2, 7, 0,165, 2, 4, 0,145, 2, 4, 0,148, 2, 0, 0,147, 2, 7, 0,166, 2, 7, 0,167, 2, 7, 0, 43, 0, -124, 0, 7, 0,107, 0,109, 2, 2, 0,168, 2, 2, 0,169, 2, 4, 0, 70, 0, 32, 0,169, 0, 7, 0,170, 2, 0, 0,140, 2, -125, 0, 9, 0,107, 0,109, 2, 32, 0,169, 0, 7, 0,171, 2, 7, 0,172, 2, 7, 0,165, 2, 4, 0,173, 2, 4, 0,174, 2, - 7, 0,175, 2, 0, 0, 20, 0,126, 0, 1, 0,107, 0,109, 2,127, 0, 6, 0,107, 0,109, 2, 47, 0,139, 0,128, 0,176, 2, -129, 0,177, 2,130, 0,178, 2,131, 0,179, 2,132, 0, 14, 0,107, 0,109, 2, 82, 0,180, 2, 82, 0,181, 2, 82, 0,182, 2, - 82, 0,183, 2, 82, 0,184, 2, 82, 0,185, 2, 79, 0,186, 2, 4, 0,187, 2, 4, 0,188, 2, 2, 0,189, 2, 2, 0, 37, 0, - 7, 0,190, 2,133, 0,191, 2,134, 0, 3, 0,107, 0,109, 2,135, 0,192, 2,136, 0,191, 2,137, 0, 4, 0,107, 0,109, 2, - 32, 0,169, 0, 4, 0,193, 2, 4, 0, 37, 0,138, 0, 2, 0, 4, 0,194, 2, 7, 0,220, 1,139, 0, 2, 0, 4, 0,130, 0, - 4, 0,195, 2,140, 0, 20, 0,107, 0,109, 2, 32, 0,169, 0, 0, 0,140, 2, 2, 0,196, 2, 2, 0,197, 2, 2, 0, 19, 0, - 2, 0, 37, 0, 7, 0,198, 2, 7, 0,199, 2, 4, 0, 54, 0, 4, 0,200, 2,139, 0,201, 2,138, 0,202, 2, 4, 0,203, 2, - 4, 0,204, 2, 4, 0,205, 2, 4, 0,195, 2, 7, 0,206, 2, 7, 0,207, 2, 7, 0,208, 2,141, 0, 8, 0,107, 0,109, 2, -142, 0,209, 2,135, 0,192, 2, 4, 0,210, 2, 4, 0,211, 2, 4, 0,212, 2, 2, 0, 19, 0, 2, 0, 57, 0,143, 0, 8, 0, -107, 0,109, 2, 32, 0, 45, 0, 2, 0,213, 2, 2, 0, 19, 0, 2, 0,130, 2, 2, 0, 57, 0, 7, 0,214, 2, 7, 0,215, 2, -144, 0, 5, 0,107, 0,109, 2, 4, 0,216, 2, 2, 0, 19, 0, 2, 0,217, 2, 7, 0,218, 2,145, 0, 7, 0,107, 0,109, 2, - 82, 0,219, 2, 4, 0,220, 2, 0, 0,221, 2, 0, 0,222, 2, 0, 0,223, 2, 0, 0,224, 2,146, 0, 3, 0,107, 0,109, 2, -147, 0,225, 2,131, 0,179, 2,148, 0, 10, 0,107, 0,109, 2, 32, 0,226, 2, 32, 0,227, 2, 0, 0,228, 2, 7, 0,229, 2, - 2, 0,230, 2, 2, 0,231, 2, 0, 0,232, 2, 0, 0,233, 2, 0, 0,115, 2,149, 0, 9, 0,107, 0,109, 2, 32, 0,234, 2, - 0, 0,228, 2, 7, 0,235, 2, 7, 0,236, 2, 0, 0, 14, 1, 0, 0,130, 2, 0, 0,237, 2, 0, 0, 37, 0,150, 0, 27, 0, - 27, 0, 31, 0, 2, 0,230, 1, 2, 0,231, 1, 2, 0,238, 2, 2, 0, 19, 0, 2, 0,239, 2, 2, 0,240, 2, 2, 0,241, 2, - 2, 0, 70, 0, 0, 0,242, 2, 0, 0,243, 2, 0, 0,244, 2, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0,245, 2, 7, 0,246, 2, - 7, 0,247, 2, 7, 0,248, 2, 7, 0,249, 2, 7, 0,250, 2, 34, 0,251, 2, 36, 0, 80, 0, 38, 0,251, 1, 84, 0, 40, 2, - 7, 0,252, 2, 7, 0,253, 2,150, 0,254, 2,151, 0, 3, 0,151, 0, 0, 0,151, 0, 1, 0, 0, 0, 20, 0, 69, 0, 3, 0, - 7, 0,255, 2, 4, 0, 19, 0, 4, 0, 37, 0, 32, 0,112, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 0, 3, - 4, 0, 1, 3, 4, 0, 2, 3, 4, 0, 3, 3, 0, 0, 4, 3, 32, 0, 38, 0, 32, 0, 5, 3, 32, 0, 6, 3, 32, 0, 7, 3, - 32, 0, 8, 3, 36, 0, 80, 0, 75, 0,250, 1, 69, 0,192, 1,152, 0, 9, 3,152, 0, 10, 3,153, 0, 11, 3, 9, 0, 2, 0, - 12, 0, 12, 3, 12, 0, 34, 2, 12, 0,211, 1, 12, 0, 13, 3, 12, 0, 14, 3, 64, 0,213, 1, 0, 0, 15, 3, 4, 0,214, 1, - 4, 0, 16, 3, 7, 0, 9, 1, 7, 0, 17, 3, 7, 0, 18, 3, 7, 0,177, 0, 7, 0, 19, 3, 7, 0, 10, 1, 7, 0, 20, 3, - 7, 0, 21, 3, 7, 0,171, 2, 7, 0, 22, 3, 7, 0,213, 0, 4, 0, 23, 3, 2, 0, 19, 0, 2, 0, 24, 3, 2, 0, 25, 3, - 2, 0, 26, 3, 2, 0, 27, 3, 2, 0, 28, 3, 2, 0, 29, 3, 2, 0, 30, 3, 2, 0, 31, 3, 2, 0, 32, 3, 2, 0, 33, 3, - 2, 0, 34, 3, 4, 0, 35, 3, 4, 0, 36, 3, 4, 0, 37, 3, 4, 0, 38, 3, 7, 0, 39, 3, 7, 0, 26, 2, 7, 0, 40, 3, - 7, 0, 41, 3, 7, 0, 42, 3, 7, 0, 43, 3, 7, 0, 44, 3, 7, 0, 45, 3, 7, 0, 46, 3, 7, 0, 47, 3, 7, 0, 48, 3, - 7, 0, 49, 3, 0, 0, 50, 3, 0, 0, 51, 3, 0, 0, 52, 3, 0, 0, 53, 3, 7, 0, 54, 3, 7, 0, 55, 3, 40, 0,126, 0, - 12, 0, 56, 3, 12, 0, 57, 3, 12, 0, 58, 3, 12, 0, 59, 3, 7, 0, 60, 3, 2, 0, 81, 2, 2, 0, 61, 3, 7, 0, 63, 2, - 4, 0, 62, 3, 4, 0, 63, 3,154, 0, 64, 3, 2, 0, 65, 3, 2, 0,220, 0, 7, 0, 66, 3, 12, 0, 67, 3, 12, 0, 68, 3, - 12, 0, 69, 3, 12, 0, 70, 3,155, 0, 71, 3,156, 0, 72, 3, 65, 0, 73, 3, 2, 0, 74, 3, 2, 0, 75, 3, 2, 0, 76, 3, - 2, 0, 77, 3, 7, 0, 55, 2, 2, 0, 78, 3, 2, 0, 79, 3,147, 0, 80, 3,135, 0, 81, 3,135, 0, 82, 3, 4, 0, 83, 3, - 4, 0, 84, 3, 4, 0, 85, 3, 4, 0, 70, 0, 12, 0, 86, 3,157, 0, 14, 0,157, 0, 0, 0,157, 0, 1, 0, 32, 0, 38, 0, - 7, 0,171, 2, 7, 0, 11, 1, 7, 0,172, 2, 7, 0,165, 2, 0, 0, 20, 0, 4, 0,173, 2, 4, 0,174, 2, 4, 0, 87, 3, - 2, 0, 17, 0, 2, 0, 88, 3, 7, 0,175, 2,155, 0, 36, 0, 2, 0, 89, 3, 2, 0, 90, 3, 2, 0, 19, 0, 2, 0,165, 2, - 7, 0, 91, 3, 7, 0, 92, 3, 7, 0, 93, 3, 7, 0, 94, 3, 7, 0, 95, 3, 7, 0, 96, 3, 7, 0, 97, 3, 7, 0, 98, 3, - 7, 0, 99, 3, 7, 0,100, 3, 7, 0,101, 3, 7, 0,102, 3, 7, 0,103, 3, 7, 0,104, 3, 7, 0,105, 3, 7, 0,106, 3, - 7, 0,107, 3, 7, 0,108, 3, 7, 0,109, 3, 7, 0,110, 3, 7, 0,111, 3, 7, 0,112, 3, 7, 0,113, 3, 7, 0,114, 3, - 2, 0,115, 3, 2, 0,116, 3, 2, 0,117, 3, 2, 0,118, 3, 53, 0,170, 0,158, 0,119, 3, 7, 0,120, 3, 4, 0,118, 2, -159, 0, 6, 0,159, 0, 0, 0,159, 0, 1, 0, 4, 0,121, 3, 4, 0,122, 3, 7, 0, 2, 0, 9, 0,123, 3,131, 0, 12, 0, - 4, 0, 19, 0, 4, 0,124, 3, 4, 0,125, 3, 4, 0,126, 3, 4, 0,127, 3, 4, 0,128, 3, 4, 0,129, 3, 4, 0,130, 3, - 0, 0,131, 3, 0, 0,132, 3, 0, 0,133, 3, 12, 0,134, 3,160, 0, 1, 0, 7, 0,228, 1,154, 0, 30, 0, 4, 0, 19, 0, - 7, 0,135, 3, 7, 0,136, 3, 7, 0,137, 3, 4, 0,138, 3, 4, 0,139, 3, 4, 0,140, 3, 4, 0,141, 3, 7, 0,142, 3, - 7, 0,143, 3, 7, 0,144, 3, 7, 0,145, 3, 7, 0,146, 3, 7, 0,147, 3, 7, 0,148, 3, 7, 0,149, 3, 7, 0,150, 3, + 36, 0, 80, 0, 27, 0, 81, 0, 2, 0, 17, 0, 2, 0, 82, 0, 2, 0, 83, 0, 2, 0, 19, 0, 40, 0, 6, 0, 40, 0, 0, 0, + 40, 0, 1, 0, 0, 0, 84, 0, 0, 0, 85, 0, 4, 0, 23, 0, 4, 0, 86, 0, 41, 0, 10, 0, 41, 0, 0, 0, 41, 0, 1, 0, + 4, 0, 87, 0, 4, 0, 88, 0, 4, 0, 89, 0, 4, 0, 43, 0, 4, 0, 14, 0, 4, 0, 90, 0, 0, 0, 91, 0, 0, 0, 92, 0, + 42, 0, 15, 0, 27, 0, 31, 0, 0, 0, 93, 0, 4, 0, 90, 0, 4, 0, 94, 0, 12, 0, 95, 0, 40, 0, 96, 0, 40, 0, 97, 0, + 4, 0, 98, 0, 4, 0, 99, 0, 12, 0,100, 0, 0, 0,101, 0, 4, 0,102, 0, 4, 0,103, 0, 9, 0,104, 0, 8, 0,105, 0, + 43, 0, 3, 0, 4, 0,106, 0, 4, 0,107, 0, 9, 0, 2, 0, 44, 0, 20, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, + 2, 0, 19, 0, 7, 0,108, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,113, 0, 7, 0,114, 0, + 7, 0,115, 0, 7, 0,116, 0, 7, 0,117, 0, 7, 0,118, 0, 2, 0,119, 0, 2, 0,120, 0, 7, 0,121, 0, 36, 0, 80, 0, + 32, 0,122, 0, 45, 0, 13, 0, 4, 0,123, 0, 4, 0,124, 0, 4, 0,125, 0, 4, 0,126, 0, 2, 0,127, 0, 2, 0,128, 0, + 2, 0, 19, 0, 2, 0,129, 0, 2, 0,130, 0, 2, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 46, 0,134, 0, 47, 0, 32, 0, + 27, 0, 31, 0, 0, 0, 34, 0, 12, 0,135, 0, 48, 0,136, 0, 49, 0,137, 0, 50, 0,138, 0, 2, 0,129, 0, 2, 0, 19, 0, + 2, 0,139, 0, 2, 0, 17, 0, 2, 0, 37, 0, 2, 0, 43, 0, 4, 0,140, 0, 2, 0,141, 0, 2, 0,142, 0, 2, 0,143, 0, + 2, 0,144, 0, 2, 0,145, 0, 2, 0,146, 0, 4, 0,147, 0, 4, 0,148, 0, 43, 0,149, 0, 30, 0,150, 0, 0, 0,151, 0, + 7, 0,152, 0, 4, 0,153, 0, 2, 0,154, 0, 2, 0,155, 0, 2, 0,156, 0, 2, 0,157, 0, 7, 0,158, 0, 7, 0,159, 0, + 51, 0, 31, 0, 2, 0,160, 0, 2, 0,161, 0, 2, 0,162, 0, 2, 0,163, 0, 32, 0,164, 0, 52, 0,165, 0, 0, 0,166, 0, + 0, 0,167, 0, 0, 0,168, 0, 0, 0,169, 0, 0, 0,170, 0, 7, 0,171, 0, 7, 0,172, 0, 2, 0,173, 0, 2, 0,174, 0, + 2, 0,175, 0, 2, 0,176, 0, 2, 0,177, 0, 2, 0,178, 0, 2, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,182, 0, + 7, 0,183, 0, 7, 0,184, 0, 7, 0, 57, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,188, 0, 7, 0,189, 0, + 53, 0, 15, 0, 0, 0,190, 0, 9, 0,191, 0, 0, 0,192, 0, 0, 0,193, 0, 4, 0,194, 0, 4, 0,195, 0, 9, 0,196, 0, + 7, 0,197, 0, 7, 0,198, 0, 7, 0,199, 0, 4, 0,200, 0, 9, 0,201, 0, 9, 0,202, 0, 4, 0,203, 0, 4, 0, 37, 0, + 54, 0, 6, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0,204, 0, 7, 0, 67, 0, 4, 0, 64, 0, 55, 0, 5, 0, + 2, 0, 19, 0, 2, 0, 36, 0, 2, 0, 64, 0, 2, 0,205, 0, 54, 0,199, 0, 56, 0, 17, 0, 32, 0,164, 0, 47, 0,206, 0, + 57, 0,207, 0, 7, 0,208, 0, 7, 0,209, 0, 2, 0, 17, 0, 2, 0,210, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,211, 0, + 4, 0,212, 0, 2, 0,213, 0, 2, 0,214, 0, 4, 0,129, 0, 4, 0,140, 0, 2, 0,215, 0, 2, 0,216, 0, 52, 0, 59, 0, + 27, 0, 31, 0, 39, 0, 75, 0, 7, 0,217, 0, 7, 0,218, 0, 7, 0,219, 0, 7, 0,220, 0, 7, 0,221, 0, 7, 0,222, 0, + 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 7, 0,228, 0, 7, 0,229, 0, 7, 0,230, 0, + 7, 0,231, 0, 7, 0,232, 0, 7, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, 7, 0,236, 0, 2, 0,237, 0, 2, 0,238, 0, + 2, 0,239, 0, 2, 0,240, 0, 2, 0,241, 0, 2, 0,242, 0, 2, 0,243, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,210, 0, + 7, 0,244, 0, 7, 0,245, 0, 7, 0,246, 0, 7, 0,247, 0, 4, 0,248, 0, 4, 0,249, 0, 2, 0,250, 0, 2, 0,251, 0, + 2, 0,252, 0, 2, 0,127, 0, 4, 0, 23, 0, 4, 0,124, 0, 4, 0,125, 0, 4, 0,126, 0, 7, 0,253, 0, 7, 0,254, 0, + 7, 0,186, 0, 45, 0,255, 0, 58, 0, 0, 1, 36, 0, 80, 0, 47, 0,206, 0, 53, 0, 1, 1, 55, 0, 2, 1, 56, 0, 3, 1, + 30, 0,150, 0, 0, 0, 4, 1, 0, 0, 5, 1, 59, 0, 8, 0, 7, 0, 6, 1, 7, 0, 7, 1, 7, 0,172, 0, 4, 0, 19, 0, + 7, 0, 8, 1, 7, 0, 9, 1, 7, 0, 10, 1, 32, 0, 45, 0, 60, 0, 82, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, + 2, 0, 19, 0, 4, 0, 11, 1, 2, 0,174, 0, 2, 0, 12, 1, 7, 0,180, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0,183, 0, + 7, 0, 13, 1, 7, 0, 14, 1, 7, 0, 15, 1, 7, 0, 16, 1, 7, 0, 17, 1, 7, 0, 18, 1, 7, 0, 19, 1, 7, 0, 20, 1, + 7, 0, 21, 1, 7, 0, 22, 1, 7, 0, 23, 1, 61, 0, 24, 1, 2, 0, 25, 1, 2, 0, 70, 0, 7, 0,110, 0, 7, 0,111, 0, + 7, 0, 26, 1, 7, 0, 27, 1, 7, 0, 28, 1, 2, 0, 29, 1, 2, 0, 30, 1, 2, 0, 31, 1, 2, 0, 32, 1, 0, 0, 33, 1, + 0, 0, 34, 1, 2, 0, 35, 1, 2, 0, 36, 1, 2, 0, 37, 1, 2, 0, 38, 1, 2, 0, 39, 1, 7, 0, 40, 1, 7, 0, 41, 1, + 7, 0, 42, 1, 7, 0, 43, 1, 2, 0, 44, 1, 2, 0, 43, 0, 2, 0, 45, 1, 2, 0, 46, 1, 2, 0, 47, 1, 2, 0, 48, 1, + 7, 0, 49, 1, 7, 0, 50, 1, 7, 0, 51, 1, 7, 0, 52, 1, 7, 0, 53, 1, 7, 0, 54, 1, 7, 0, 55, 1, 7, 0, 56, 1, + 7, 0, 57, 1, 7, 0, 58, 1, 7, 0, 59, 1, 7, 0, 60, 1, 2, 0, 61, 1, 2, 0, 62, 1, 4, 0, 63, 1, 4, 0, 64, 1, + 2, 0, 65, 1, 2, 0, 66, 1, 2, 0, 67, 1, 2, 0, 68, 1, 7, 0, 69, 1, 7, 0, 70, 1, 7, 0, 71, 1, 7, 0, 72, 1, + 2, 0, 73, 1, 2, 0, 74, 1, 36, 0, 80, 0, 51, 0, 75, 1, 2, 0, 76, 1, 2, 0, 77, 1, 30, 0,150, 0, 62, 0, 2, 0, + 27, 0, 31, 0, 36, 0, 80, 0, 63, 0,129, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 78, 1, 2, 0, 19, 0, 7, 0,180, 0, + 7, 0,181, 0, 7, 0,182, 0, 7, 0, 79, 1, 7, 0, 80, 1, 7, 0, 81, 1, 7, 0, 82, 1, 7, 0, 83, 1, 7, 0, 84, 1, + 7, 0, 85, 1, 7, 0, 86, 1, 7, 0, 87, 1, 7, 0, 88, 1, 7, 0, 89, 1, 7, 0, 90, 1, 7, 0, 91, 1, 7, 0, 92, 1, + 7, 0, 93, 1, 7, 0, 94, 1, 7, 0, 95, 1, 7, 0, 96, 1, 7, 0, 97, 1, 7, 0, 98, 1, 7, 0, 99, 1, 7, 0,100, 1, + 7, 0,101, 1, 7, 0,102, 1, 7, 0,103, 1, 7, 0,104, 1, 7, 0,105, 1, 2, 0,106, 1, 2, 0,107, 1, 2, 0,108, 1, + 0, 0,109, 1, 0, 0,110, 1, 7, 0,111, 1, 7, 0,112, 1, 2, 0,113, 1, 2, 0,114, 1, 7, 0,115, 1, 7, 0,116, 1, + 7, 0,117, 1, 7, 0,118, 1, 2, 0,119, 1, 2, 0,120, 1, 4, 0, 11, 1, 4, 0,121, 1, 2, 0,122, 1, 2, 0,123, 1, + 2, 0,124, 1, 2, 0,125, 1, 7, 0,126, 1, 7, 0,127, 1, 7, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1, + 7, 0,132, 1, 7, 0,133, 1, 7, 0,134, 1, 7, 0,135, 1, 0, 0,136, 1, 7, 0,137, 1, 7, 0,138, 1, 7, 0,139, 1, + 4, 0,140, 1, 0, 0,141, 1, 0, 0, 45, 1, 0, 0,142, 1, 0, 0, 4, 1, 2, 0,143, 1, 2, 0,144, 1, 2, 0, 76, 1, + 2, 0,145, 1, 2, 0,146, 1, 2, 0,147, 1, 7, 0,148, 1, 7, 0,149, 1, 7, 0,150, 1, 7, 0,151, 1, 7, 0,152, 1, + 2, 0,160, 0, 2, 0,161, 0, 55, 0,153, 1, 55, 0,154, 1, 0, 0,155, 1, 0, 0,156, 1, 0, 0,157, 1, 0, 0,158, 1, + 2, 0,159, 1, 2, 0,160, 1, 7, 0,161, 1, 7, 0,162, 1, 51, 0, 75, 1, 58, 0, 0, 1, 36, 0, 80, 0, 64, 0,163, 1, + 30, 0,150, 0, 7, 0,164, 1, 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1, 7, 0,168, 1, 2, 0,169, 1, 2, 0, 70, 0, + 7, 0,170, 1, 7, 0,171, 1, 7, 0,172, 1, 7, 0,173, 1, 7, 0,174, 1, 7, 0,175, 1, 7, 0,176, 1, 7, 0,177, 1, + 7, 0,178, 1, 2, 0,179, 1, 2, 0,180, 1, 7, 0,181, 1, 7, 0,182, 1, 7, 0,183, 1, 7, 0,184, 1, 7, 0,185, 1, + 4, 0,186, 1, 4, 0,187, 1, 4, 0,188, 1, 12, 0,189, 1, 65, 0, 4, 0, 27, 0, 31, 0, 0, 0,190, 1, 66, 0, 2, 0, + 43, 0,149, 0, 67, 0, 26, 0, 67, 0, 0, 0, 67, 0, 1, 0, 68, 0,191, 1, 4, 0,192, 1, 4, 0,193, 1, 4, 0,194, 1, + 4, 0,195, 1, 4, 0,196, 1, 4, 0,197, 1, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,198, 1, 2, 0,199, 1, 7, 0, 5, 0, + 7, 0, 6, 0, 7, 0, 7, 0, 7, 0,200, 1, 7, 0,201, 1, 7, 0,202, 1, 7, 0,203, 1, 7, 0,204, 1, 7, 0,205, 1, + 7, 0,206, 1, 7, 0, 23, 0, 7, 0,207, 1, 7, 0,208, 1, 69, 0, 17, 0, 27, 0, 31, 0, 68, 0,191, 1, 12, 0,209, 1, + 12, 0,210, 1, 12, 0,211, 1, 36, 0, 80, 0, 63, 0,212, 1, 2, 0, 19, 0, 2, 0,213, 1, 4, 0,173, 0, 7, 0, 6, 1, + 7, 0,172, 0, 7, 0, 7, 1, 7, 0,214, 1, 7, 0,215, 1, 7, 0,216, 1, 67, 0,217, 1, 35, 0, 11, 0, 7, 0,218, 1, + 7, 0,219, 1, 7, 0,220, 1, 7, 0,221, 1, 2, 0, 55, 0, 0, 0,222, 1, 0, 0,223, 1, 0, 0,224, 1, 0, 0,225, 1, + 0, 0,226, 1, 0, 0,227, 1, 34, 0, 7, 0, 7, 0,228, 1, 7, 0,219, 1, 7, 0,220, 1, 2, 0,224, 1, 2, 0,227, 1, + 7, 0,221, 1, 7, 0, 37, 0, 70, 0, 21, 0, 70, 0, 0, 0, 70, 0, 1, 0, 2, 0, 17, 0, 2, 0,229, 1, 2, 0,227, 1, + 2, 0, 19, 0, 2, 0,230, 1, 2, 0,231, 1, 2, 0,232, 1, 2, 0,233, 1, 2, 0,234, 1, 2, 0,235, 1, 2, 0,236, 1, + 2, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 34, 0, 49, 0, 35, 0, 50, 0, 2, 0,240, 1, 2, 0,241, 1, 4, 0,242, 1, + 71, 0, 5, 0, 2, 0,243, 1, 2, 0,229, 1, 0, 0, 19, 0, 0, 0, 37, 0, 2, 0, 70, 0, 72, 0, 4, 0, 7, 0, 5, 0, + 7, 0, 6, 0, 7, 0, 8, 0, 7, 0,244, 1, 73, 0, 62, 0, 27, 0, 31, 0, 39, 0, 75, 0, 68, 0,191, 1, 12, 0,245, 1, + 12, 0,210, 1, 12, 0,246, 1, 32, 0,247, 1, 32, 0,248, 1, 32, 0,249, 1, 36, 0, 80, 0, 74, 0,250, 1, 38, 0,251, 1, + 63, 0,212, 1, 12, 0,252, 1, 7, 0, 6, 1, 7, 0,172, 0, 7, 0, 7, 1, 4, 0,173, 0, 2, 0,253, 1, 2, 0,213, 1, + 2, 0, 19, 0, 2, 0,254, 1, 7, 0,255, 1, 7, 0, 0, 2, 7, 0, 1, 2, 2, 0,232, 1, 2, 0,233, 1, 2, 0, 2, 2, + 2, 0, 3, 2, 4, 0, 4, 2, 34, 0, 5, 2, 2, 0, 23, 0, 2, 0, 95, 0, 2, 0, 67, 0, 2, 0, 6, 2, 7, 0, 7, 2, + 7, 0, 8, 2, 7, 0, 9, 2, 7, 0, 10, 2, 7, 0, 11, 2, 7, 0, 12, 2, 7, 0, 13, 2, 7, 0, 14, 2, 7, 0, 15, 2, + 7, 0, 16, 2, 0, 0, 17, 2, 75, 0, 18, 2, 76, 0, 19, 2, 0, 0, 20, 2, 65, 0, 21, 2, 65, 0, 22, 2, 65, 0, 23, 2, + 65, 0, 24, 2, 4, 0, 25, 2, 7, 0, 26, 2, 4, 0, 27, 2, 4, 0, 28, 2, 72, 0, 29, 2, 4, 0, 30, 2, 4, 0, 31, 2, + 71, 0, 32, 2, 71, 0, 33, 2, 77, 0, 39, 0, 27, 0, 31, 0, 68, 0,191, 1, 12, 0, 34, 2, 36, 0, 80, 0, 38, 0,251, 1, + 63, 0,212, 1, 78, 0, 35, 2, 79, 0, 36, 2, 80, 0, 37, 2, 81, 0, 38, 2, 82, 0, 39, 2, 83, 0, 40, 2, 84, 0, 41, 2, + 85, 0, 42, 2, 77, 0, 43, 2, 86, 0, 44, 2, 87, 0, 45, 2, 88, 0, 46, 2, 88, 0, 47, 2, 88, 0, 48, 2, 4, 0, 54, 0, + 4, 0, 49, 2, 4, 0, 50, 2, 4, 0, 51, 2, 4, 0, 52, 2, 4, 0,173, 0, 7, 0, 6, 1, 7, 0,172, 0, 7, 0, 7, 1, + 7, 0, 53, 2, 4, 0, 54, 2, 2, 0, 55, 2, 2, 0, 19, 0, 2, 0, 56, 2, 2, 0, 57, 2, 2, 0,213, 1, 2, 0, 58, 2, + 89, 0, 59, 2, 90, 0, 60, 2, 80, 0, 8, 0, 9, 0, 61, 2, 7, 0, 62, 2, 4, 0, 63, 2, 0, 0, 19, 0, 0, 0, 64, 2, + 2, 0, 11, 1, 2, 0, 65, 2, 2, 0, 66, 2, 78, 0, 7, 0, 4, 0, 67, 2, 4, 0, 68, 2, 4, 0, 69, 2, 4, 0, 70, 2, + 2, 0,229, 1, 0, 0, 71, 2, 0, 0, 19, 0, 82, 0, 5, 0, 4, 0, 67, 2, 4, 0, 68, 2, 0, 0, 72, 2, 0, 0, 73, 2, + 2, 0, 19, 0, 91, 0, 2, 0, 4, 0, 74, 2, 7, 0,220, 1, 83, 0, 3, 0, 91, 0, 75, 2, 4, 0, 76, 2, 4, 0, 19, 0, + 81, 0, 6, 0, 7, 0, 77, 2, 2, 0, 78, 2, 2, 0,229, 1, 0, 0, 19, 0, 0, 0, 73, 2, 0, 0,179, 0, 84, 0, 4, 0, + 0, 0,204, 0, 0, 0,180, 0, 0, 0,181, 0, 0, 0,182, 0, 92, 0, 6, 0, 47, 0, 61, 2, 0, 0, 19, 0, 0, 0, 64, 2, + 2, 0, 11, 1, 2, 0, 65, 2, 2, 0, 66, 2, 93, 0, 1, 0, 7, 0, 79, 2, 94, 0, 5, 0, 0, 0,204, 0, 0, 0,180, 0, + 0, 0,181, 0, 0, 0,182, 0, 4, 0, 37, 0, 85, 0, 1, 0, 7, 0, 80, 2, 86, 0, 2, 0, 4, 0, 81, 2, 4, 0, 17, 0, + 79, 0, 7, 0, 7, 0, 62, 2, 47, 0, 61, 2, 0, 0, 19, 0, 0, 0, 64, 2, 2, 0, 11, 1, 2, 0, 65, 2, 2, 0, 66, 2, + 95, 0, 1, 0, 7, 0, 82, 2, 96, 0, 1, 0, 4, 0, 83, 2, 97, 0, 1, 0, 0, 0, 84, 2, 98, 0, 1, 0, 7, 0, 62, 2, + 99, 0, 3, 0, 4, 0, 85, 2, 0, 0, 92, 0, 7, 0, 86, 2,101, 0, 4, 0, 7, 0,204, 0, 7, 0,180, 0, 7, 0,181, 0, + 7, 0,182, 0,102, 0, 1, 0,101, 0, 63, 2,103, 0, 5, 0, 4, 0, 87, 2, 4, 0, 88, 2, 0, 0, 19, 0, 0, 0,229, 1, + 0, 0,179, 0,104, 0, 2, 0, 4, 0, 89, 2, 4, 0, 88, 2,105, 0, 10, 0,105, 0, 0, 0,105, 0, 1, 0,103, 0, 90, 2, +102, 0, 91, 2,104, 0, 92, 2, 4, 0, 54, 0, 4, 0, 50, 2, 4, 0, 49, 2, 4, 0, 37, 0, 81, 0, 93, 2, 89, 0, 14, 0, + 12, 0, 94, 2, 81, 0, 93, 2, 0, 0, 95, 2, 0, 0, 96, 2, 0, 0, 97, 2, 0, 0, 98, 2, 0, 0, 99, 2, 0, 0,100, 2, + 0, 0,101, 2, 0, 0, 19, 0, 88, 0, 46, 2, 88, 0, 48, 2, 2, 0,102, 2, 0, 0,103, 2, 90, 0, 8, 0, 4, 0,104, 2, + 4, 0,105, 2, 78, 0,106, 2, 82, 0,107, 2, 4, 0, 50, 2, 4, 0, 49, 2, 4, 0, 54, 0, 4, 0, 37, 0,106, 0, 7, 0, +106, 0, 0, 0,106, 0, 1, 0, 4, 0, 17, 0, 4, 0, 11, 1, 0, 0, 20, 0, 46, 0,134, 0, 0, 0,108, 2,107, 0, 7, 0, +106, 0,109, 2, 2, 0,110, 2, 2, 0, 94, 2, 2, 0,111, 2, 2, 0, 90, 0, 9, 0,112, 2, 9, 0,113, 2,108, 0, 3, 0, +106, 0,109, 2, 32, 0,164, 0, 0, 0, 20, 0,109, 0, 5, 0,106, 0,109, 2, 32, 0,164, 0, 0, 0, 20, 0, 2, 0,114, 2, + 0, 0,115, 2,110, 0, 5, 0,106, 0,109, 2, 7, 0, 88, 0, 7, 0,116, 2, 4, 0,117, 2, 4, 0,118, 2,111, 0, 5, 0, +106, 0,109, 2, 32, 0,119, 2, 0, 0, 72, 0, 4, 0, 11, 1, 4, 0, 19, 0,112, 0, 13, 0,106, 0,109, 2, 32, 0,120, 2, + 32, 0,121, 2, 32, 0,122, 2, 32, 0,123, 2, 7, 0,124, 2, 7, 0,125, 2, 7, 0,116, 2, 7, 0,126, 2, 4, 0,127, 2, + 4, 0,128, 2, 4, 0, 90, 0, 4, 0,129, 2,113, 0, 5, 0,106, 0,109, 2, 2, 0,130, 2, 2, 0, 19, 0, 7, 0,131, 2, + 32, 0,132, 2,114, 0, 3, 0,106, 0,109, 2, 7, 0,133, 2, 4, 0, 90, 0,115, 0, 10, 0,106, 0,109, 2, 7, 0,134, 2, + 4, 0,135, 2, 4, 0, 37, 0, 2, 0, 90, 0, 2, 0,136, 2, 2, 0,137, 2, 2, 0,138, 2, 7, 0,139, 2, 0, 0,140, 2, +116, 0, 3, 0,106, 0,109, 2, 7, 0, 37, 0, 4, 0, 17, 0,117, 0, 11, 0,106, 0,109, 2, 52, 0,141, 2, 7, 0,142, 2, + 4, 0,143, 2, 0, 0,140, 2, 7, 0,144, 2, 4, 0,145, 2, 32, 0,146, 2, 0, 0,147, 2, 4, 0,148, 2, 4, 0, 37, 0, +118, 0, 10, 0,106, 0,109, 2, 32, 0,149, 2, 47, 0,150, 2, 4, 0, 90, 0, 4, 0,151, 2, 7, 0,152, 2, 7, 0,153, 2, + 0, 0,147, 2, 4, 0,148, 2, 4, 0, 37, 0,119, 0, 3, 0,106, 0,109, 2, 7, 0,154, 2, 4, 0,155, 2,120, 0, 5, 0, +106, 0,109, 2, 7, 0,156, 2, 0, 0,140, 2, 2, 0, 19, 0, 2, 0,157, 2,121, 0, 8, 0,106, 0,109, 2, 32, 0,164, 0, + 7, 0,156, 2, 7, 0,221, 1, 7, 0,106, 0, 0, 0,140, 2, 2, 0, 19, 0, 2, 0, 17, 0,122, 0, 21, 0,106, 0,109, 2, + 32, 0,158, 2, 0, 0,140, 2, 52, 0,141, 2, 32, 0,146, 2, 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,159, 2, 7, 0,160, 2, + 7, 0,161, 2, 7, 0,255, 1, 7, 0,162, 2, 7, 0,163, 2, 7, 0,164, 2, 7, 0,165, 2, 4, 0,145, 2, 4, 0,148, 2, + 0, 0,147, 2, 7, 0,166, 2, 7, 0,167, 2, 7, 0, 43, 0,123, 0, 7, 0,106, 0,109, 2, 2, 0,168, 2, 2, 0,169, 2, + 4, 0, 70, 0, 32, 0,164, 0, 7, 0,170, 2, 0, 0,140, 2,124, 0, 9, 0,106, 0,109, 2, 32, 0,164, 0, 7, 0,171, 2, + 7, 0,172, 2, 7, 0,165, 2, 4, 0,173, 2, 4, 0,174, 2, 7, 0,175, 2, 0, 0, 20, 0,125, 0, 1, 0,106, 0,109, 2, +126, 0, 6, 0,106, 0,109, 2, 46, 0,134, 0,127, 0,176, 2,128, 0,177, 2,129, 0,178, 2,130, 0,179, 2,131, 0, 14, 0, +106, 0,109, 2, 81, 0,180, 2, 81, 0,181, 2, 81, 0,182, 2, 81, 0,183, 2, 81, 0,184, 2, 81, 0,185, 2, 78, 0,186, 2, + 4, 0,187, 2, 4, 0,188, 2, 2, 0,189, 2, 2, 0, 37, 0, 7, 0,190, 2,132, 0,191, 2,133, 0, 7, 0,106, 0,109, 2, + 81, 0,180, 2, 81, 0,192, 2,134, 0,193, 2,135, 0,191, 2, 4, 0,194, 2, 4, 0,187, 2,136, 0, 4, 0,106, 0,109, 2, + 32, 0,164, 0, 4, 0,195, 2, 4, 0, 37, 0,137, 0, 2, 0, 4, 0,196, 2, 7, 0,220, 1,138, 0, 2, 0, 4, 0,125, 0, + 4, 0,197, 2,139, 0, 20, 0,106, 0,109, 2, 32, 0,164, 0, 0, 0,140, 2, 2, 0,198, 2, 2, 0,199, 2, 2, 0, 19, 0, + 2, 0, 37, 0, 7, 0,200, 2, 7, 0,201, 2, 4, 0, 54, 0, 4, 0,202, 2,138, 0,203, 2,137, 0,204, 2, 4, 0,205, 2, + 4, 0,206, 2, 4, 0,207, 2, 4, 0,197, 2, 7, 0,208, 2, 7, 0,209, 2, 7, 0,210, 2,140, 0, 8, 0,106, 0,109, 2, +141, 0,211, 2,134, 0,193, 2, 4, 0,212, 2, 4, 0,213, 2, 4, 0,214, 2, 2, 0, 19, 0, 2, 0, 57, 0,142, 0, 8, 0, +106, 0,109, 2, 32, 0, 45, 0, 2, 0,215, 2, 2, 0, 19, 0, 2, 0,130, 2, 2, 0, 57, 0, 7, 0,216, 2, 7, 0,217, 2, +143, 0, 5, 0,106, 0,109, 2, 4, 0,218, 2, 2, 0, 19, 0, 2, 0,219, 2, 7, 0,220, 2,144, 0, 7, 0,106, 0,109, 2, + 81, 0,221, 2, 4, 0,222, 2, 0, 0,223, 2, 0, 0,224, 2, 0, 0,225, 2, 0, 0,226, 2,145, 0, 3, 0,106, 0,109, 2, +146, 0,227, 2,130, 0,179, 2,147, 0, 10, 0,106, 0,109, 2, 32, 0,228, 2, 32, 0,229, 2, 0, 0,230, 2, 7, 0,231, 2, + 2, 0,232, 2, 2, 0,233, 2, 0, 0,234, 2, 0, 0,235, 2, 0, 0,115, 2,148, 0, 9, 0,106, 0,109, 2, 32, 0,236, 2, + 0, 0,230, 2, 7, 0,237, 2, 7, 0,238, 2, 0, 0, 11, 1, 0, 0,130, 2, 0, 0,239, 2, 0, 0, 37, 0,149, 0, 27, 0, + 27, 0, 31, 0, 2, 0,230, 1, 2, 0,231, 1, 2, 0,240, 2, 2, 0, 19, 0, 2, 0,241, 2, 2, 0,242, 2, 2, 0,243, 2, + 2, 0, 70, 0, 0, 0,244, 2, 0, 0,245, 2, 0, 0,246, 2, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0,247, 2, 7, 0,248, 2, + 7, 0,249, 2, 7, 0,250, 2, 7, 0,251, 2, 7, 0,252, 2, 34, 0,253, 2, 36, 0, 80, 0, 38, 0,251, 1, 83, 0, 40, 2, + 7, 0,254, 2, 7, 0,255, 2,149, 0, 0, 3,150, 0, 3, 0,150, 0, 0, 0,150, 0, 1, 0, 0, 0, 20, 0, 68, 0, 3, 0, + 7, 0, 1, 3, 4, 0, 19, 0, 4, 0, 37, 0, 32, 0,111, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0, 17, 0, 2, 0, 2, 3, + 4, 0, 3, 3, 4, 0, 4, 3, 4, 0, 5, 3, 0, 0, 6, 3, 32, 0, 38, 0, 32, 0, 7, 3, 32, 0, 8, 3, 32, 0, 9, 3, + 32, 0, 10, 3, 36, 0, 80, 0, 74, 0,250, 1, 68, 0,191, 1,151, 0, 11, 3,151, 0, 12, 3,152, 0, 13, 3, 9, 0, 2, 0, + 12, 0, 14, 3, 12, 0, 34, 2, 12, 0,210, 1, 12, 0, 15, 3, 12, 0, 16, 3, 63, 0,212, 1, 0, 0, 17, 3, 4, 0,213, 1, + 4, 0, 18, 3, 7, 0, 6, 1, 7, 0, 19, 3, 7, 0, 20, 3, 7, 0,172, 0, 7, 0, 21, 3, 7, 0, 7, 1, 7, 0, 22, 3, + 7, 0, 23, 3, 7, 0,171, 2, 7, 0, 24, 3, 7, 0,208, 0, 4, 0, 25, 3, 2, 0, 19, 0, 2, 0, 26, 3, 2, 0, 27, 3, + 2, 0, 28, 3, 2, 0, 29, 3, 2, 0, 30, 3, 2, 0, 31, 3, 2, 0, 32, 3, 2, 0, 33, 3, 2, 0, 34, 3, 2, 0, 35, 3, + 2, 0, 36, 3, 4, 0, 37, 3, 4, 0, 38, 3, 4, 0, 39, 3, 4, 0, 40, 3, 7, 0, 41, 3, 7, 0, 26, 2, 7, 0, 42, 3, + 7, 0, 43, 3, 7, 0, 44, 3, 7, 0, 45, 3, 7, 0, 46, 3, 7, 0, 47, 3, 7, 0, 48, 3, 7, 0, 49, 3, 7, 0, 50, 3, + 7, 0, 51, 3, 0, 0, 52, 3, 0, 0, 53, 3, 0, 0, 54, 3, 0, 0, 55, 3, 7, 0, 56, 3, 7, 0, 57, 3, 12, 0, 58, 3, + 12, 0, 59, 3, 12, 0, 60, 3, 12, 0, 61, 3, 7, 0, 62, 3, 2, 0, 81, 2, 2, 0, 63, 3, 7, 0, 63, 2, 4, 0, 64, 3, + 4, 0, 65, 3,153, 0, 66, 3, 2, 0, 67, 3, 2, 0,215, 0, 7, 0, 68, 3, 12, 0, 69, 3, 12, 0, 70, 3, 12, 0, 71, 3, + 12, 0, 72, 3,154, 0, 73, 3,155, 0, 74, 3, 64, 0, 75, 3, 2, 0, 76, 3, 2, 0, 77, 3, 2, 0, 78, 3, 2, 0, 79, 3, + 7, 0, 55, 2, 2, 0, 80, 3, 2, 0, 81, 3,146, 0, 82, 3,134, 0, 83, 3,134, 0, 84, 3, 4, 0, 85, 3, 4, 0, 86, 3, + 4, 0, 87, 3, 4, 0, 70, 0, 12, 0, 88, 3,156, 0, 14, 0,156, 0, 0, 0,156, 0, 1, 0, 32, 0, 38, 0, 7, 0,171, 2, + 7, 0, 8, 1, 7, 0,172, 2, 7, 0,165, 2, 0, 0, 20, 0, 4, 0,173, 2, 4, 0,174, 2, 4, 0, 89, 3, 2, 0, 17, 0, + 2, 0, 90, 3, 7, 0,175, 2,154, 0, 36, 0, 2, 0, 91, 3, 2, 0, 92, 3, 2, 0, 19, 0, 2, 0,165, 2, 7, 0, 93, 3, + 7, 0, 94, 3, 7, 0, 95, 3, 7, 0, 96, 3, 7, 0, 97, 3, 7, 0, 98, 3, 7, 0, 99, 3, 7, 0,100, 3, 7, 0,101, 3, + 7, 0,102, 3, 7, 0,103, 3, 7, 0,104, 3, 7, 0,105, 3, 7, 0,106, 3, 7, 0,107, 3, 7, 0,108, 3, 7, 0,109, 3, + 7, 0,110, 3, 7, 0,111, 3, 7, 0,112, 3, 7, 0,113, 3, 7, 0,114, 3, 7, 0,115, 3, 7, 0,116, 3, 2, 0,117, 3, + 2, 0,118, 3, 2, 0,119, 3, 2, 0,120, 3, 52, 0,165, 0,157, 0,121, 3, 7, 0,122, 3, 4, 0,118, 2,158, 0, 6, 0, +158, 0, 0, 0,158, 0, 1, 0, 4, 0,123, 3, 4, 0,124, 3, 7, 0, 2, 0, 9, 0,125, 3,130, 0, 15, 0, 4, 0, 19, 0, + 4, 0,126, 3, 4, 0,127, 3, 4, 0,128, 3, 4, 0,129, 3, 4, 0,130, 3, 4, 0,131, 3, 4, 0,124, 3, 4, 0, 81, 2, + 4, 0, 57, 0, 0, 0,132, 3, 0, 0,133, 3, 0, 0,134, 3, 0, 0,135, 3, 12, 0,136, 3,159, 0, 1, 0, 7, 0,228, 1, +153, 0, 30, 0, 4, 0, 19, 0, 7, 0,137, 3, 7, 0,138, 3, 7, 0,139, 3, 4, 0,140, 3, 4, 0,141, 3, 4, 0,142, 3, + 4, 0,143, 3, 7, 0,144, 3, 7, 0,145, 3, 7, 0,146, 3, 7, 0,147, 3, 7, 0,148, 3, 7, 0,149, 3, 7, 0,150, 3, 7, 0,151, 3, 7, 0,152, 3, 7, 0,153, 3, 7, 0,154, 3, 7, 0,155, 3, 7, 0,156, 3, 7, 0,157, 3, 7, 0,158, 3, - 7, 0,159, 3, 4, 0,160, 3, 4, 0,161, 3, 7, 0,162, 3, 7, 0, 46, 3,156, 0, 44, 0,142, 0,163, 3, 4, 0,122, 3, - 4, 0,164, 3,161, 0,165, 3,162, 0,166, 3, 7, 0, 37, 0, 7, 0,167, 3, 7, 0,168, 3, 7, 0,169, 3, 7, 0,170, 3, - 7, 0,171, 3, 7, 0,172, 3, 7, 0,173, 3, 7, 0,174, 3, 7, 0,175, 3, 7, 0,176, 3, 2, 0,177, 3, 2, 0,178, 3, - 7, 0,179, 3, 7, 0,180, 3, 4, 0,131, 0, 4, 0,181, 3, 4, 0,182, 3, 2, 0,183, 3, 2, 0,184, 3,160, 0,185, 3, - 4, 0,186, 3, 4, 0, 82, 0, 7, 0,187, 3, 7, 0,188, 3, 7, 0,189, 3, 7, 0,190, 3, 2, 0,191, 3, 2, 0,192, 3, - 2, 0,193, 3, 2, 0,194, 3, 2, 0,195, 3, 2, 0,196, 3, 2, 0,197, 3, 2, 0,198, 3,163, 0,199, 3, 7, 0,200, 3, - 7, 0,201, 3,131, 0,202, 3,147, 0, 48, 0, 2, 0, 17, 0, 2, 0,203, 3, 2, 0,204, 3, 2, 0,205, 3, 7, 0,206, 3, - 2, 0,207, 3, 2, 0,208, 3, 7, 0,209, 3, 2, 0,210, 3, 2, 0,211, 3, 7, 0,212, 3, 7, 0,213, 3, 7, 0,214, 3, - 7, 0,215, 3, 7, 0,216, 3, 7, 0,217, 3, 4, 0,218, 3, 7, 0,219, 3, 7, 0,220, 3, 7, 0,221, 3, 78, 0,222, 3, - 78, 0,223, 3, 78, 0,224, 3, 0, 0,225, 3, 7, 0,226, 3, 7, 0,227, 3, 36, 0, 80, 0, 2, 0,228, 3, 0, 0,229, 3, - 0, 0,230, 3, 7, 0,231, 3, 4, 0,232, 3, 7, 0,233, 3, 7, 0,234, 3, 4, 0,235, 3, 4, 0, 19, 0, 7, 0,236, 3, - 7, 0,237, 3, 7, 0,238, 3, 82, 0,239, 3, 7, 0,240, 3, 7, 0,241, 3, 7, 0,242, 3, 7, 0,243, 3, 7, 0,244, 3, - 7, 0,245, 3, 7, 0,246, 3, 4, 0,247, 3,164, 0, 72, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,179, 0, 2, 0, 15, 1, - 2, 0, 48, 1, 2, 0,248, 3, 7, 0,249, 3, 7, 0,250, 3, 7, 0,251, 3, 7, 0,252, 3, 7, 0,253, 3, 7, 0,254, 3, - 7, 0,255, 3, 7, 0, 0, 4, 7, 0, 86, 1, 7, 0, 88, 1, 7, 0, 87, 1, 7, 0, 1, 4, 4, 0, 2, 4, 7, 0, 3, 4, - 7, 0, 4, 4, 7, 0, 5, 4, 7, 0, 6, 4, 7, 0, 7, 4, 7, 0, 8, 4, 7, 0, 9, 4, 2, 0, 10, 4, 2, 0, 14, 1, - 2, 0, 11, 4, 2, 0, 12, 4, 2, 0, 13, 4, 2, 0, 14, 4, 2, 0, 15, 4, 2, 0, 16, 4, 7, 0, 17, 4, 7, 0, 18, 4, - 7, 0, 19, 4, 7, 0, 20, 4, 7, 0, 21, 4, 7, 0, 22, 4, 7, 0, 23, 4, 7, 0, 24, 4, 7, 0, 25, 4, 7, 0, 26, 4, - 7, 0, 27, 4, 7, 0, 28, 4, 2, 0, 29, 4, 2, 0, 30, 4, 2, 0, 31, 4, 2, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4, - 7, 0, 35, 4, 7, 0, 36, 4, 2, 0, 37, 4, 2, 0, 38, 4, 2, 0, 39, 4, 2, 0, 40, 4, 7, 0, 41, 4, 7, 0, 42, 4, - 7, 0, 43, 4, 7, 0, 44, 4, 2, 0, 45, 4, 2, 0, 46, 4, 2, 0, 47, 4, 2, 0, 19, 0, 7, 0, 48, 4, 7, 0, 49, 4, - 36, 0, 80, 0, 52, 0, 78, 1, 30, 0,155, 0, 40, 0,126, 0,165, 0, 8, 0,165, 0, 0, 0,165, 0, 1, 0, 4, 0, 23, 3, - 4, 0, 50, 4, 4, 0, 19, 0, 2, 0, 51, 4, 2, 0, 52, 4, 32, 0,169, 0,166, 0, 13, 0, 9, 0, 53, 4, 9, 0, 54, 4, - 4, 0, 55, 4, 4, 0, 56, 4, 4, 0, 57, 4, 4, 0, 58, 4, 4, 0, 59, 4, 4, 0, 60, 4, 4, 0, 61, 4, 4, 0, 62, 4, - 4, 0, 63, 4, 4, 0, 37, 0, 0, 0, 64, 4,167, 0, 5, 0, 9, 0, 65, 4, 9, 0, 66, 4, 4, 0, 67, 4, 4, 0, 70, 0, - 0, 0, 68, 4,168, 0, 13, 0, 4, 0, 17, 0, 4, 0, 69, 4, 4, 0, 70, 4, 4, 0, 71, 4, 4, 0, 72, 4, 4, 0, 73, 4, - 4, 0, 94, 0, 4, 0, 74, 4, 4, 0, 75, 4, 4, 0, 76, 4, 4, 0, 77, 4, 4, 0, 78, 4, 26, 0, 30, 0,169, 0, 4, 0, - 4, 0, 79, 4, 7, 0, 80, 4, 2, 0, 19, 0, 2, 0, 81, 4,170, 0, 11, 0,170, 0, 0, 0,170, 0, 1, 0, 0, 0, 20, 0, - 64, 0, 82, 4, 65, 0, 83, 4, 4, 0, 23, 3, 4, 0, 84, 4, 4, 0, 85, 4, 4, 0, 37, 0, 4, 0, 86, 4, 4, 0, 87, 4, -171, 0,131, 0,166, 0, 88, 4,167, 0, 89, 4,168, 0, 90, 4,169, 0, 91, 4, 4, 0, 92, 4, 4, 0,131, 0, 4, 0,181, 3, - 4, 0, 93, 4, 4, 0, 94, 4, 4, 0, 95, 4, 4, 0, 96, 4, 2, 0, 19, 0, 2, 0, 97, 4, 7, 0, 26, 2, 7, 0, 98, 4, - 7, 0, 99, 4, 7, 0,100, 4, 7, 0,101, 4, 7, 0,102, 4, 2, 0,103, 4, 2, 0,104, 4, 2, 0,105, 4, 2, 0,106, 4, - 2, 0,219, 0, 2, 0,107, 4, 2, 0,108, 4, 2, 0,118, 3, 2, 0,109, 4, 2, 0,110, 4, 2, 0, 35, 1, 2, 0,110, 0, - 2, 0,111, 4, 2, 0,112, 4, 2, 0,113, 4, 2, 0,114, 4, 2, 0,115, 4, 2, 0,116, 4, 2, 0,117, 4, 2, 0,118, 4, - 2, 0,119, 4, 2, 0, 36, 1, 2, 0,120, 4, 2, 0,121, 4, 2, 0,122, 4, 2, 0,123, 4, 4, 0,124, 4, 4, 0, 14, 1, - 2, 0,125, 4, 2, 0,126, 4, 2, 0,127, 4, 2, 0,128, 4, 2, 0,129, 4, 2, 0,130, 4, 24, 0,131, 4, 24, 0,132, 4, - 23, 0,133, 4, 12, 0,134, 4, 2, 0,135, 4, 2, 0, 37, 0, 7, 0,136, 4, 7, 0,137, 4, 7, 0,138, 4, 7, 0,139, 4, - 4, 0,140, 4, 7, 0,141, 4, 7, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, 2, 0,145, 4, 2, 0,146, 4, 2, 0,147, 4, - 2, 0,148, 4, 2, 0,149, 4, 2, 0,150, 4, 7, 0,151, 4, 7, 0,152, 4, 7, 0,153, 4, 2, 0,154, 4, 2, 0,155, 4, - 2, 0,156, 4, 2, 0,157, 4, 2, 0,158, 4, 2, 0,159, 4, 2, 0,160, 4, 2, 0,161, 4, 2, 0,162, 4, 2, 0,163, 4, - 4, 0,164, 4, 4, 0,165, 4, 4, 0,166, 4, 4, 0,167, 4, 4, 0,168, 4, 7, 0,169, 4, 4, 0,170, 4, 4, 0,171, 4, - 4, 0,172, 4, 4, 0,173, 4, 7, 0,174, 4, 7, 0,175, 4, 7, 0,176, 4, 7, 0,177, 4, 7, 0,178, 4, 7, 0,179, 4, - 7, 0,180, 4, 7, 0,181, 4, 7, 0,182, 4, 0, 0,183, 4, 0, 0,184, 4, 4, 0,185, 4, 2, 0,186, 4, 2, 0,161, 1, - 0, 0,187, 4, 7, 0,188, 4, 7, 0,189, 4, 4, 0,190, 4, 4, 0,191, 4, 7, 0,192, 4, 7, 0,193, 4, 2, 0,194, 4, - 2, 0,195, 4, 7, 0,196, 4, 2, 0,197, 4, 2, 0,198, 4, 4, 0,199, 4, 2, 0,200, 4, 2, 0,201, 4, 2, 0,202, 4, - 2, 0,203, 4, 7, 0,204, 4, 7, 0, 70, 0, 43, 0,205, 4,172, 0, 9, 0,172, 0, 0, 0,172, 0, 1, 0, 0, 0, 20, 0, - 2, 0,206, 4, 2, 0,207, 4, 2, 0,208, 4, 2, 0, 43, 0, 7, 0,209, 4, 7, 0, 70, 0,173, 0, 5, 0, 7, 0,210, 4, - 0, 0, 17, 0, 0, 0, 43, 0, 0, 0, 70, 0, 0, 0,161, 1,174, 0, 5, 0,174, 0, 0, 0,174, 0, 1, 0, 4, 0,121, 3, - 0, 0,131, 3, 4, 0, 19, 0,175, 0, 6, 0,176, 0,211, 4, 2, 0, 19, 0, 2, 0,212, 4, 2, 0,213, 4, 2, 0,214, 4, - 9, 0,215, 4,177, 0, 4, 0, 2, 0,110, 0, 2, 0,142, 2, 2, 0,124, 3, 2, 0,216, 4,178, 0, 10, 0, 2, 0, 19, 0, - 2, 0,217, 4, 2, 0,218, 4, 2, 0,219, 4,177, 0,220, 4, 9, 0,215, 4, 7, 0,221, 4, 4, 0,222, 4, 4, 0,223, 4, - 4, 0, 37, 0,179, 0, 4, 0,179, 0, 0, 0,179, 0, 1, 0, 0, 0,224, 4, 7, 0,225, 4,180, 0, 8, 0,181, 0,226, 4, -176, 0,211, 4, 7, 0,227, 4, 4, 0, 94, 0, 0, 0,228, 4, 0, 0,229, 4, 0, 0,230, 4, 0, 0,231, 4,182, 0, 9, 0, -176, 0,211, 4, 7, 0,232, 4, 7, 0,233, 4, 2, 0, 14, 1, 2, 0, 19, 0, 4, 0, 36, 0, 4, 0,234, 4, 84, 0,235, 4, - 9, 0,215, 4,183, 0, 72, 0,182, 0,236, 4,182, 0,237, 4,180, 0,238, 4, 7, 0,239, 4, 2, 0,240, 4, 2, 0,241, 4, - 7, 0,242, 4, 7, 0,243, 4, 2, 0,124, 3, 2, 0,244, 4, 7, 0,245, 4, 7, 0,246, 4, 7, 0,247, 4, 2, 0,248, 4, - 2, 0,223, 4, 2, 0,249, 4, 2, 0,250, 4, 2, 0,251, 4, 2, 0,252, 4, 7, 0,253, 4, 7, 0,254, 4, 7, 0,255, 4, - 2, 0, 0, 5, 2, 0, 1, 5, 2, 0, 2, 5, 2, 0, 3, 5, 2, 0, 4, 5, 2, 0, 5, 5, 2, 0, 6, 5,175, 0, 7, 5, -178, 0, 8, 5, 7, 0, 9, 5, 7, 0, 10, 5, 7, 0, 11, 5, 2, 0, 12, 5, 2, 0, 70, 0, 0, 0, 13, 5, 0, 0, 14, 5, - 0, 0, 15, 5, 0, 0, 16, 5, 0, 0, 17, 5, 0, 0, 18, 5, 2, 0, 19, 5, 7, 0, 20, 5, 7, 0, 21, 5, 7, 0, 22, 5, - 7, 0, 23, 5, 7, 0, 24, 5, 7, 0, 25, 5, 7, 0, 26, 5, 7, 0, 27, 5, 7, 0, 28, 5, 7, 0, 29, 5, 2, 0, 30, 5, - 0, 0, 31, 5, 0, 0, 32, 5, 0, 0, 33, 5, 0, 0, 34, 5, 32, 0, 35, 5, 0, 0, 36, 5, 0, 0, 37, 5, 0, 0, 38, 5, - 0, 0, 39, 5, 0, 0, 40, 5, 0, 0, 41, 5, 0, 0, 42, 5, 0, 0, 43, 5, 2, 0, 44, 5, 2, 0, 45, 5, 2, 0, 46, 5, - 2, 0, 47, 5, 2, 0, 48, 5,184, 0, 8, 0, 4, 0, 49, 5, 4, 0, 50, 5, 4, 0, 51, 5, 4, 0, 52, 5, 4, 0, 53, 5, - 4, 0, 54, 5, 4, 0, 54, 0, 4, 0, 50, 2, 47, 0, 34, 0, 27, 0, 31, 0, 39, 0, 75, 0, 32, 0, 55, 5,164, 0, 56, 5, - 47, 0, 57, 5, 48, 0,211, 0, 12, 0, 58, 5,165, 0, 59, 5, 32, 0, 60, 5, 7, 0, 61, 5, 7, 0, 62, 5, 7, 0, 63, 5, - 7, 0, 64, 5, 4, 0, 23, 3, 2, 0, 19, 0, 2, 0, 7, 1, 59, 0, 3, 1,185, 0, 65, 5,173, 0, 66, 5,183, 0, 67, 5, -186, 0, 68, 5,171, 0,185, 0,169, 0, 91, 4, 40, 0,126, 0, 12, 0,104, 0, 12, 0, 69, 5,187, 0, 70, 5, 2, 0, 71, 5, - 2, 0, 72, 5, 2, 0,220, 0, 2, 0, 73, 5, 4, 0, 74, 5, 4, 0, 75, 5, 12, 0, 76, 5,188, 0, 6, 0, 48, 0,211, 0, - 46, 0, 2, 1, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0,110, 0, 7, 0, 77, 5,189, 0, 35, 0, 7, 0, 78, 5, 7, 0, 79, 5, - 7, 0, 80, 5, 7, 0, 81, 5, 7, 0, 82, 5, 7, 0, 83, 5, 7, 0, 84, 5, 7, 0, 85, 5, 7, 0, 86, 5, 7, 0, 21, 1, - 7, 0, 87, 5, 7, 0, 88, 5, 7, 0, 89, 5, 7, 0, 90, 5, 7, 0,176, 0, 2, 0, 91, 5, 2, 0, 92, 5, 4, 0, 93, 5, - 2, 0, 94, 5, 2, 0, 95, 5, 2, 0, 96, 5, 2, 0, 97, 5, 7, 0, 98, 5, 69, 0, 99, 5,190, 0,100, 5,189, 0,101, 5, -191, 0,102, 5,192, 0,103, 5,193, 0,104, 5,194, 0,105, 5,195, 0,106, 5, 7, 0,107, 5, 2, 0,108, 5, 2, 0,109, 5, - 4, 0,161, 1,196, 0, 54, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5, - 7, 0, 86, 5, 7, 0, 21, 1, 7, 0, 43, 0, 4, 0,114, 5, 2, 0, 96, 5, 2, 0, 97, 5, 32, 0, 55, 5, 32, 0,115, 5, -188, 0,116, 5,196, 0,101, 5, 0, 0,117, 5, 4, 0, 23, 3, 4, 0,118, 5, 2, 0,119, 5, 2, 0,120, 5, 2, 0,121, 5, - 2, 0,122, 5, 2, 0,161, 1, 2, 0, 19, 0, 2, 0,123, 5, 2, 0,124, 5, 7, 0,116, 0, 7, 0,125, 5, 7, 0,126, 5, - 7, 0,127, 5, 7, 0,128, 5, 7, 0,129, 5, 7, 0,176, 0, 7, 0, 61, 5, 2, 0,130, 5, 2, 0, 65, 1, 2, 0,131, 5, - 2, 0,132, 5, 2, 0,133, 5, 2, 0,134, 5, 2, 0,135, 5, 2, 0,136, 5, 2, 0,137, 5, 2, 0,138, 5, 4, 0,139, 5, - 12, 0,140, 5, 2, 0,141, 5, 2, 0, 64, 2, 2, 0,142, 5, 0, 0,143, 5, 0, 0,144, 5, 9, 0,145, 5,190, 0,100, 5, -198, 0, 22, 0, 24, 0, 36, 0, 24, 0, 64, 0, 23, 0,146, 5, 23, 0,147, 5, 23, 0,148, 5, 7, 0,149, 5, 7, 0,150, 5, - 7, 0,151, 5, 7, 0,152, 5, 2, 0,153, 5, 2, 0,154, 5, 2, 0,155, 5, 2, 0,156, 5, 2, 0,157, 5, 2, 0, 19, 0, - 2, 0,158, 5, 2, 0,159, 5, 2, 0,160, 5, 2, 0,161, 5, 2, 0,162, 5, 2, 0,122, 5, 7, 0,163, 5,197, 0, 6, 0, -197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,199, 0, 8, 0,197, 0, 0, 0, -197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,200, 0,164, 5, 47, 0,139, 0,201, 0, 14, 0, -197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5,202, 0,166, 5, - 12, 0,167, 5, 2, 0, 14, 1, 2, 0, 19, 0, 2, 0,168, 5, 0, 0,169, 5, 0, 0,170, 5,203, 0, 31, 0,197, 0, 0, 0, -197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,191, 0,102, 5, 2, 0,171, 5, 2, 0,172, 5, - 2, 0,158, 5, 2, 0,173, 5,198, 0,165, 5, 2, 0,174, 5, 2, 0,138, 0, 2, 0,169, 5, 2, 0,175, 5, 9, 0,176, 5, - 2, 0,177, 5, 0, 0,178, 5, 0, 0,179, 5, 2, 0,180, 5, 2, 0,181, 5, 2, 0, 32, 3, 2, 0,182, 5, 2, 0,183, 5, - 0, 0, 19, 0, 0, 0, 48, 1, 9, 0,250, 1, 4, 0,184, 5, 4, 0,185, 5, 27, 0,186, 5,204, 0, 16, 0,197, 0, 0, 0, -197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5, 7, 0, 14, 2, 7, 0, 15, 2, - 2, 0,174, 5, 2, 0,187, 5, 2, 0,188, 5, 2, 0,189, 5, 4, 0, 19, 0, 7, 0,190, 5,190, 0,100, 5,205, 0, 15, 0, - 0, 0,191, 5, 0, 0,192, 5, 0, 0,193, 5, 2, 0, 19, 0, 2, 0,194, 5, 2, 0,195, 5, 2, 0,104, 1, 2, 0,196, 5, - 2, 0, 37, 0, 4, 0,197, 5, 4, 0,198, 5, 2, 0,199, 5, 2, 0,200, 5, 0, 0,201, 5, 0, 0,202, 5,206, 0, 12, 0, -197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 4, 0, 37, 0,205, 0,203, 5,207, 0,204, 5, 12, 0,205, 5, - 12, 0,206, 5,208, 0,207, 5,195, 0,208, 5,209, 0,209, 5,210, 0, 17, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, - 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5, 12, 0,210, 5,211, 0,211, 5, 0, 0,212, 5,212, 0,213, 5, - 4, 0,214, 5, 4, 0,215, 5, 2, 0, 19, 0, 2, 0,216, 5, 2, 0,217, 5, 2, 0, 37, 0,213, 0, 29, 0,197, 0, 0, 0, -197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5, 48, 0,150, 2, 46, 0, 2, 1, 62, 0,218, 5, - 2, 0,138, 0, 2, 0,219, 5, 2, 0, 70, 0, 2, 0,220, 5, 4, 0, 19, 0, 2, 0,221, 5, 2, 0,170, 5, 2, 0,169, 5, - 2, 0,161, 1, 0, 0,222, 5, 0, 0,223, 5, 0, 0,224, 5, 0, 0,122, 5, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0,190, 5, - 7, 0, 65, 1, 7, 0,225, 5, 7, 0,226, 5,190, 0,100, 5,214, 0, 11, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, - 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5, 2, 0,168, 5, 2, 0, 19, 0, 4, 0, 37, 0,202, 0,166, 5,198, 0,165, 5, -215, 0, 27, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5, 43, 0,227, 5, - 4, 0,228, 5, 4, 0,229, 5, 2, 0, 94, 0, 2, 0,138, 0, 2, 0,230, 5, 0, 0,231, 5, 0, 0,232, 5, 4, 0,233, 5, - 4, 0,234, 5, 4, 0,235, 5, 4, 0,236, 5, 2, 0,237, 5, 2, 0,238, 5, 7, 0,239, 5, 23, 0,240, 5, 23, 0,241, 5, - 4, 0,242, 5, 4, 0,243, 5, 0, 0,244, 5, 0, 0,245, 5,216, 0, 10, 0, 27, 0, 31, 0, 9, 0,246, 5, 9, 0,247, 5, - 9, 0,248, 5, 9, 0,249, 5, 9, 0,250, 5, 4, 0, 94, 0, 4, 0,251, 5, 0, 0,252, 5, 0, 0,253, 5,217, 0, 10, 0, -197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5,216, 0,254, 5, 2, 0, 94, 0, 2, 0,138, 0, - 4, 0, 43, 0, 9, 0,255, 5,218, 0, 8, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, -198, 0,165, 5, 4, 0, 19, 0, 4, 0, 0, 6,219, 0, 23, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, - 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5, 27, 0, 1, 6, 27, 0, 81, 0, 2, 0, 19, 0, 2, 0,138, 0, 7, 0, 2, 6, - 9, 0, 3, 6, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0, 4, 6, 7, 0, 5, 6, 59, 0, 3, 1, 59, 0, 6, 6, 4, 0, 7, 6, - 2, 0,178, 5, 2, 0, 37, 0,190, 0,100, 5,220, 0, 10, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, - 7, 0,112, 5, 2, 0,113, 5, 2, 0, 19, 0, 2, 0, 32, 3, 4, 0, 37, 0,190, 0,100, 5,221, 0, 42, 0,197, 0, 0, 0, -197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5,207, 0,204, 5, 0, 0,191, 5, - 0, 0,192, 5, 0, 0,193, 5, 2, 0, 17, 0, 2, 0,200, 5, 2, 0, 19, 0, 2, 0,194, 5, 9, 0, 3, 6, 4, 0,197, 5, - 4, 0, 8, 6, 4, 0, 9, 6, 4, 0,198, 5, 23, 0, 10, 6, 23, 0, 11, 6, 7, 0, 12, 6, 7, 0, 13, 6, 7, 0, 14, 6, - 7, 0, 2, 6, 2, 0, 15, 6, 2, 0,210, 0, 2, 0,104, 1, 2, 0,196, 5, 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 16, 6, - 2, 0, 17, 6, 9, 0, 18, 6, 9, 0, 19, 6, 9, 0, 20, 6, 9, 0, 21, 6, 9, 0, 22, 6, 2, 0, 23, 6, 0, 0,202, 5, - 58, 0, 24, 6,222, 0, 7, 0,222, 0, 0, 0,222, 0, 1, 0, 4, 0, 25, 6, 4, 0, 23, 0, 0, 0, 88, 0, 4, 0, 26, 6, - 4, 0, 17, 0,223, 0, 13, 0,197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5, - 4, 0, 17, 0, 4, 0, 27, 6, 4, 0, 19, 0, 4, 0,230, 5, 12, 0, 28, 6, 12, 0, 29, 6, 0, 0, 30, 6,224, 0, 7, 0, -224, 0, 0, 0,224, 0, 1, 0, 0, 0, 31, 6, 2, 0, 32, 6, 2, 0, 33, 6, 2, 0, 34, 6, 2, 0, 37, 0,225, 0, 12, 0, - 2, 0, 33, 6, 2, 0, 35, 6, 2, 0, 36, 6, 0, 0,115, 2, 2, 0, 37, 6, 2, 0, 38, 6, 2, 0, 39, 6, 2, 0, 40, 6, - 2, 0, 41, 6, 2, 0,158, 5, 7, 0, 42, 6, 7, 0, 43, 6,226, 0, 18, 0,226, 0, 0, 0,226, 0, 1, 0, 0, 0,131, 3, -225, 0, 44, 6,225, 0, 45, 6,225, 0, 46, 6,225, 0, 47, 6, 7, 0, 48, 6, 2, 0, 49, 6, 2, 0, 50, 6, 2, 0, 51, 6, - 2, 0, 52, 6, 2, 0, 53, 6, 2, 0, 54, 6, 2, 0, 55, 6, 2, 0, 56, 6, 2, 0, 57, 6, 2, 0, 58, 6,227, 0, 10, 0, - 0, 0, 59, 6, 0, 0, 60, 6, 0, 0, 61, 6, 0, 0, 62, 6, 0, 0, 63, 6, 0, 0, 64, 6, 2, 0, 65, 6, 2, 0, 66, 6, - 2, 0, 67, 6, 2, 0, 37, 0,228, 0, 8, 0, 0, 0, 68, 6, 0, 0, 69, 6, 0, 0, 70, 6, 0, 0, 71, 6, 0, 0, 72, 6, - 0, 0, 73, 6, 7, 0, 77, 5, 7, 0, 37, 0,229, 0, 16, 0,227, 0, 74, 6,227, 0, 75, 6,227, 0, 76, 6,227, 0, 77, 6, -227, 0, 78, 6,227, 0, 79, 6,227, 0, 80, 6,227, 0, 81, 6,227, 0, 82, 6,227, 0, 83, 6,227, 0, 84, 6,227, 0, 85, 6, -227, 0, 86, 6,227, 0, 87, 6,228, 0, 88, 6, 0, 0, 89, 6,230, 0, 71, 0, 0, 0, 90, 6, 0, 0, 91, 6, 0, 0, 63, 6, - 0, 0, 92, 6, 0, 0, 93, 6, 0, 0, 94, 6, 0, 0, 95, 6, 0, 0, 96, 6, 0, 0, 97, 6, 0, 0, 98, 6, 0, 0, 99, 6, - 0, 0,100, 6, 0, 0,101, 6, 0, 0,102, 6, 0, 0,103, 6, 0, 0,104, 6, 0, 0,105, 6, 0, 0,106, 6, 0, 0,107, 6, - 0, 0,108, 6, 0, 0,109, 6, 0, 0,110, 6, 0, 0,111, 6, 0, 0,112, 6, 0, 0,113, 6, 0, 0,114, 6, 0, 0,115, 6, - 0, 0,116, 6, 0, 0,117, 6, 0, 0,118, 6, 0, 0,119, 6, 0, 0,120, 6, 0, 0,121, 6, 0, 0,122, 6, 0, 0,123, 6, - 0, 0,124, 6, 0, 0,125, 6, 0, 0,126, 6, 0, 0,127, 6, 0, 0,128, 6, 0, 0,129, 6, 0, 0,130, 6, 0, 0,131, 6, - 0, 0,132, 6, 0, 0,133, 6, 0, 0,134, 6, 0, 0,135, 6, 0, 0,136, 6, 0, 0,137, 6, 0, 0,138, 6, 0, 0,139, 6, - 0, 0,140, 6, 0, 0,141, 6, 0, 0,142, 6, 0, 0,143, 6, 0, 0,144, 6, 0, 0,145, 6, 0, 0,146, 6, 0, 0,147, 6, - 0, 0,148, 6, 0, 0,149, 6, 0, 0,150, 6, 0, 0,151, 6, 0, 0,152, 6, 0, 0,153, 6, 0, 0,154, 6, 0, 0,155, 6, - 0, 0,156, 6, 0, 0,157, 6, 0, 0,158, 6, 0, 0, 96, 0,231, 0, 5, 0, 0, 0,159, 6, 0, 0,114, 6, 0, 0,116, 6, - 2, 0, 19, 0, 2, 0, 37, 0,232, 0, 21, 0,232, 0, 0, 0,232, 0, 1, 0, 0, 0, 20, 0,229, 0,160, 6,230, 0,161, 6, -230, 0,162, 6,230, 0,163, 6,230, 0,164, 6,230, 0,165, 6,230, 0,166, 6,230, 0,167, 6,230, 0,168, 6,230, 0,169, 6, -230, 0,170, 6,230, 0,171, 6,230, 0,172, 6,230, 0,173, 6,230, 0,174, 6,230, 0,175, 6,230, 0,176, 6,231, 0,177, 6, -233, 0, 5, 0, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0, 63, 2, 7, 0,178, 6, 7, 0,228, 1,234, 0, 67, 0, 4, 0, 19, 0, - 4, 0,179, 6, 4, 0,180, 6, 0, 0,181, 6, 0, 0,182, 6, 0, 0,183, 6, 0, 0,184, 6, 0, 0,185, 6, 0, 0,186, 6, - 0, 0,187, 6, 0, 0,188, 6, 0, 0,189, 6, 2, 0,190, 6, 2, 0, 37, 0, 4, 0,191, 6, 4, 0,192, 6, 4, 0,193, 6, - 4, 0,194, 6, 2, 0,195, 6, 2, 0,196, 6, 4, 0,197, 6, 4, 0, 43, 0, 4, 0,198, 6, 2, 0,199, 6, 2, 0,200, 6, - 2, 0,201, 6, 2, 0,202, 6, 12, 0,203, 6, 12, 0,204, 6, 12, 0,205, 6, 2, 0,206, 6, 2, 0,207, 6, 2, 0,208, 6, - 2, 0,209, 6, 2, 0,210, 6, 2, 0,211, 6, 2, 0,212, 6, 2, 0,213, 6,233, 0,214, 6, 2, 0,215, 6, 2, 0,216, 6, - 2, 0,217, 6, 2, 0,218, 6, 2, 0,219, 6, 2, 0,220, 6, 2, 0,221, 6, 2, 0,222, 6, 4, 0,223, 6, 4, 0,224, 6, - 2, 0,225, 6, 2, 0,226, 6, 2, 0,227, 6, 2, 0,228, 6, 2, 0,229, 6, 2, 0,230, 6, 2, 0,231, 6, 2, 0,232, 6, - 2, 0,233, 6, 2, 0,234, 6, 2, 0,235, 6, 2, 0,236, 6, 0, 0,237, 6, 0, 0,238, 6, 7, 0,239, 6, 2, 0, 12, 5, - 2, 0,240, 6, 56, 0,241, 6,200, 0, 21, 0, 27, 0, 31, 0, 12, 0,242, 6, 12, 0,243, 6, 12, 0,244, 6, 12, 0,110, 5, - 47, 0,139, 0, 47, 0,245, 6, 2, 0,246, 6, 2, 0,247, 6, 2, 0,248, 6, 2, 0,249, 6, 2, 0,250, 6, 2, 0,251, 6, - 2, 0,252, 6, 2, 0, 37, 0, 2, 0,253, 6, 2, 0,254, 6, 4, 0, 70, 0,195, 0,255, 6, 9, 0, 0, 7, 2, 0, 1, 7, -235, 0, 5, 0,235, 0, 0, 0,235, 0, 1, 0,235, 0, 2, 7, 13, 0, 3, 7, 4, 0, 19, 0,236, 0, 7, 0,236, 0, 0, 0, -236, 0, 1, 0,235, 0, 4, 7,235, 0, 5, 7, 2, 0,132, 4, 2, 0, 19, 0, 4, 0, 37, 0,237, 0, 23, 0,237, 0, 0, 0, -237, 0, 1, 0,238, 0, 6, 7,239, 0,209, 5, 0, 0, 7, 7, 0, 0, 8, 7, 0, 0, 9, 7, 2, 0, 10, 7, 2, 0, 11, 7, - 2, 0, 12, 7, 2, 0, 13, 7, 2, 0, 14, 7, 2, 0, 37, 0, 2, 0, 19, 0, 2, 0, 15, 7, 2, 0, 16, 7, 2, 0, 17, 7, - 4, 0, 18, 7,237, 0, 19, 7, 9, 0, 20, 7, 4, 0, 21, 7, 4, 0, 22, 7, 0, 0, 23, 7,240, 0, 2, 0,241, 0, 6, 7, -239, 0,209, 5,242, 0, 2, 0,243, 0, 6, 7,239, 0,209, 5,244, 0, 23, 0,244, 0, 0, 0,244, 0, 1, 0,235, 0, 4, 7, -235, 0, 5, 7,235, 0, 24, 7,235, 0, 25, 7,200, 0, 26, 7, 23, 0, 52, 0, 0, 0,111, 5, 0, 0, 27, 7, 2, 0,159, 5, - 2, 0,160, 5, 2, 0, 28, 7, 2, 0, 37, 0, 2, 0,249, 6, 2, 0, 26, 6, 2, 0, 19, 0, 40, 0,126, 0,245, 0, 6, 7, - 12, 0, 29, 7, 12, 0,110, 5, 12, 0, 30, 7, 12, 0, 31, 7,246, 0, 21, 0,246, 0, 0, 0,246, 0, 1, 0,198, 0,165, 5, - 23, 0, 32, 7, 23, 0, 33, 7, 2, 0,159, 5, 2, 0,160, 5, 2, 0, 34, 7, 2, 0, 35, 7, 2, 0, 36, 7, 2, 0, 19, 0, - 7, 0, 10, 2, 2, 0,248, 6, 2, 0,252, 6, 4, 0, 43, 0,247, 0, 6, 7, 12, 0, 37, 7, 12, 0, 38, 7, 12, 0, 30, 7, - 0, 0, 39, 7, 9, 0, 40, 7,248, 0, 11, 0, 0, 0, 41, 7, 2, 0, 42, 7, 2, 0, 43, 7, 2, 0, 44, 7, 2, 0, 45, 7, - 2, 0,121, 4, 2, 0,116, 4,200, 0, 46, 7, 47, 0, 47, 7, 4, 0, 48, 7, 4, 0, 49, 7,249, 0, 1, 0, 0, 0, 50, 7, -250, 0, 8, 0, 58, 0, 51, 7, 58, 0, 52, 7,250, 0, 53, 7,250, 0, 54, 7,250, 0, 55, 7, 2, 0,134, 0, 2, 0, 19, 0, - 4, 0, 56, 7,251, 0, 4, 0, 4, 0,228, 5, 4, 0, 57, 7, 4, 0,233, 5, 4, 0, 58, 7,252, 0, 2, 0, 4, 0, 59, 7, - 4, 0, 60, 7,253, 0, 7, 0, 7, 0, 61, 7, 7, 0, 62, 7, 7, 0, 63, 7, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0, 3, 4, - 7, 0, 64, 7,254, 0, 6, 0, 0, 0, 65, 7, 0, 0,193, 5, 50, 0,142, 0, 2, 0,110, 0, 2, 0,120, 4, 4, 0, 37, 0, -255, 0, 21, 0,255, 0, 0, 0,255, 0, 1, 0, 4, 0, 57, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 0, 66, 7, 4, 0, 67, 7, - 4, 0, 68, 7,249, 0, 69, 7, 0, 0, 65, 7, 4, 0, 70, 7, 4, 0, 71, 7,254, 0, 6, 3,251, 0, 72, 7,252, 0, 73, 7, -253, 0, 74, 7,250, 0, 75, 7,250, 0, 76, 7,250, 0, 77, 7, 58, 0, 78, 7, 58, 0, 79, 7, 0, 1, 12, 0, 0, 0,191, 1, - 9, 0,196, 0, 0, 0,197, 0, 4, 0,200, 0, 4, 0,208, 0, 9, 0,201, 0, 7, 0,203, 0, 7, 0,204, 0, 9, 0, 80, 7, - 9, 0, 81, 7, 9, 0,205, 0, 9, 0,207, 0, 1, 1, 43, 0, 1, 1, 0, 0, 1, 1, 1, 0, 9, 0, 82, 7, 9, 0, 26, 0, - 0, 0, 27, 0, 4, 0, 19, 0, 4, 0, 17, 0, 4, 0, 23, 0, 4, 0, 92, 0, 4, 0, 83, 7, 4, 0, 84, 7, 4, 0, 67, 7, - 4, 0, 68, 7, 4, 0, 85, 7, 4, 0,219, 0, 4, 0, 86, 7, 4, 0, 87, 7, 7, 0,233, 4, 7, 0, 88, 7, 4, 0,131, 0, - 4, 0, 89, 7,255, 0, 90, 7, 36, 0, 80, 0, 47, 0,139, 0, 50, 0,142, 0, 7, 0, 91, 7, 7, 0, 92, 7, 0, 1, 4, 1, - 1, 1, 93, 7, 1, 1, 94, 7, 1, 1, 95, 7, 12, 0, 96, 7, 2, 1, 97, 7, 3, 1, 98, 7, 7, 0, 99, 7, 7, 0,100, 7, - 4, 0,101, 7, 7, 0,102, 7, 9, 0,103, 7, 4, 0,104, 7, 4, 0,105, 7, 4, 0,106, 7, 7, 0,107, 7, 4, 1, 4, 0, - 4, 1, 0, 0, 4, 1, 1, 0, 12, 0,108, 7, 1, 1,109, 7,185, 0, 6, 0, 12, 0,110, 7, 12, 0, 96, 7, 12, 0,111, 7, - 1, 1,112, 7, 0, 0,113, 7, 0, 0,114, 7, 5, 1, 4, 0, 7, 0,115, 7, 7, 0,113, 0, 2, 0,116, 7, 2, 0,117, 7, - 6, 1, 6, 0, 7, 0,118, 7, 7, 0,119, 7, 7, 0,120, 7, 7, 0,121, 7, 4, 0,122, 7, 4, 0,123, 7, 7, 1, 12, 0, - 7, 0,124, 7, 7, 0,125, 7, 7, 0,126, 7, 7, 0,127, 7, 7, 0,128, 7, 7, 0,129, 7, 7, 0,130, 7, 7, 0,131, 7, - 7, 0,132, 7, 7, 0,133, 7, 4, 0,154, 2, 4, 0,134, 7, 8, 1, 2, 0, 7, 0,210, 4, 7, 0, 37, 0, 9, 1, 5, 0, - 7, 0,135, 7, 7, 0,136, 7, 4, 0, 94, 0, 4, 0,116, 2, 4, 0,137, 7, 10, 1, 6, 0, 10, 1, 0, 0, 10, 1, 1, 0, - 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,138, 7, 2, 0, 57, 0, 11, 1, 8, 0, 11, 1, 0, 0, 11, 1, 1, 0, 2, 0, 17, 0, - 2, 0, 19, 0, 2, 0,138, 7, 2, 0, 57, 0, 7, 0, 23, 0, 7, 0,131, 0, 12, 1, 45, 0, 12, 1, 0, 0, 12, 1, 1, 0, - 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,138, 7, 2, 0,215, 0, 2, 0,177, 3, 2, 0,139, 7, 7, 0,140, 7, 7, 0, 93, 0, - 7, 0,167, 2, 4, 0,141, 7, 4, 0, 82, 0, 4, 0,118, 2, 7, 0,142, 7, 7, 0,143, 7, 7, 0,144, 7, 7, 0,145, 7, - 7, 0,146, 7, 7, 0,147, 7, 7, 0,164, 2, 7, 0, 1, 1, 7, 0,148, 7, 7, 0,149, 7, 7, 0, 37, 0, 7, 0,150, 7, - 7, 0,151, 7, 7, 0,152, 7, 2, 0,153, 7, 2, 0,154, 7, 2, 0,155, 7, 2, 0,156, 7, 2, 0,157, 7, 2, 0,158, 7, - 2, 0,159, 7, 2, 0,160, 7, 2, 0,123, 5, 2, 0,161, 7, 2, 0,211, 1, 2, 0,162, 7, 0, 0,163, 7, 0, 0,164, 7, - 7, 0,213, 0, 13, 1,165, 7, 65, 0,164, 1, 14, 1, 16, 0, 14, 1, 0, 0, 14, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, - 2, 0,138, 7, 2, 0,215, 0, 7, 0,159, 2, 7, 0,160, 2, 7, 0,161, 2, 7, 0,255, 1, 7, 0,162, 2, 7, 0,163, 2, - 7, 0,166, 7, 7, 0,164, 2, 7, 0,166, 2, 7, 0,167, 2,212, 0, 5, 0, 2, 0, 17, 0, 2, 0, 56, 7, 2, 0, 19, 0, - 2, 0,167, 7, 27, 0, 1, 6,211, 0, 3, 0, 4, 0, 69, 0, 4, 0,168, 7,212, 0, 2, 0, 15, 1, 11, 0, 15, 1, 0, 0, - 15, 1, 1, 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0,169, 7, 4, 0, 22, 0, 4, 0,170, 7, 2, 0, 19, 0, 2, 0, 37, 0, - 9, 0,171, 7, 9, 0,172, 7, 16, 1, 5, 0, 0, 0, 20, 0, 7, 0, 21, 1, 7, 0,173, 7, 4, 0,174, 7, 4, 0, 37, 0, - 17, 1, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 43, 0, 2, 0, 70, 0, 18, 1, 4, 0, 0, 0, 20, 0, 64, 0,175, 7, - 7, 0, 21, 1, 7, 0, 37, 0, 19, 1, 6, 0, 2, 0,176, 7, 2, 0,177, 7, 2, 0, 17, 0, 2, 0,178, 7, 0, 0,179, 7, - 0, 0,180, 7, 20, 1, 5, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0, 0, 0,181, 7, 0, 0,182, 7, 21, 1, 3, 0, - 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0, 22, 1, 4, 0, 2, 0,183, 7, 2, 0,184, 7, 2, 0, 19, 0, 2, 0, 37, 0, - 23, 1, 6, 0, 0, 0, 20, 0, 0, 0,185, 7, 2, 0,186, 7, 2, 0,164, 2, 2, 0, 14, 1, 2, 0, 70, 0, 24, 1, 5, 0, - 0, 0, 20, 0, 7, 0,113, 0, 7, 0, 5, 4, 2, 0, 19, 0, 2, 0,130, 2, 25, 1, 3, 0, 0, 0, 20, 0, 4, 0,118, 2, - 4, 0,183, 7, 26, 1, 7, 0, 0, 0, 20, 0, 7, 0, 5, 4, 0, 0,187, 7, 0, 0,188, 7, 2, 0, 14, 1, 2, 0, 43, 0, - 4, 0,189, 7, 27, 1, 3, 0, 32, 0,190, 7, 0, 0,191, 7, 0, 0,192, 7, 28, 1, 18, 0, 28, 1, 0, 0, 28, 1, 1, 0, - 2, 0, 17, 0, 2, 0,169, 7, 2, 0, 19, 0, 2, 0,193, 7, 2, 0,194, 7, 2, 0,195, 7, 2, 0, 43, 0, 2, 0, 70, 0, - 0, 0, 20, 0, 9, 0, 2, 0, 29, 1,196, 7, 32, 0, 45, 0, 2, 0,216, 4, 2, 0, 99, 7, 2, 0,197, 7, 2, 0, 37, 0, - 30, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0, 0, 0,198, 7, 2, 0, 19, 0, 2, 0,130, 2, 2, 0,199, 7, 4, 0,200, 7, - 4, 0,201, 7, 4, 0,202, 7, 4, 0,203, 7, 4, 0,204, 7, 31, 1, 1, 0, 0, 0,205, 7, 32, 1, 4, 0, 43, 0,227, 5, - 0, 0,206, 7, 4, 0, 14, 1, 4, 0, 19, 0, 29, 1, 18, 0, 29, 1, 0, 0, 29, 1, 1, 0, 29, 1,207, 7, 2, 0, 17, 0, - 2, 0, 19, 0, 2, 0,208, 7, 2, 0,195, 7, 2, 0,169, 7, 2, 0,209, 7, 2, 0, 70, 0, 2, 0,161, 1, 0, 0, 20, 0, - 9, 0, 2, 0, 33, 1,196, 7, 28, 1,210, 7, 2, 0, 15, 0, 2, 0,211, 7, 4, 0,212, 7, 34, 1, 3, 0, 4, 0,190, 2, - 4, 0, 37, 0, 32, 0, 45, 0, 35, 1, 12, 0,152, 0,213, 7, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,140, 7, 4, 0, 93, 0, - 0, 0, 20, 0, 0, 0,214, 7, 2, 0,215, 7, 2, 0,216, 7, 2, 0,217, 7, 2, 0,218, 7, 7, 0,219, 7, 36, 1, 10, 0, - 2, 0, 19, 0, 2, 0,220, 7, 4, 0,140, 7, 4, 0, 93, 0, 2, 0,221, 7, 2, 1, 97, 7, 2, 0, 17, 0, 2, 0,222, 7, - 2, 0,223, 7, 2, 0,224, 7, 37, 1, 7, 0, 2, 0, 19, 0, 2, 0,220, 7, 4, 0,140, 7, 4, 0, 93, 0, 2, 0, 17, 0, - 2, 0,225, 7, 7, 0,137, 3, 38, 1, 11, 0, 4, 0,190, 2, 2, 0, 17, 0, 2, 0, 19, 0, 32, 0, 45, 0, 78, 0,226, 7, - 0, 0, 20, 0, 7, 0,227, 7, 7, 0,228, 7, 7, 0, 40, 3, 2, 0,229, 7, 2, 0,230, 7, 39, 1, 5, 0, 2, 0, 17, 0, - 2, 0, 19, 0, 4, 0, 37, 0, 47, 0,139, 0, 32, 0, 55, 5, 40, 1, 5, 0, 4, 0, 19, 0, 4, 0, 17, 0, 0, 0, 20, 0, - 0, 0,181, 7, 32, 0, 45, 0, 41, 1, 13, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,169, 7, 2, 0, 41, 3, 7, 0,231, 7, - 7, 0,232, 7, 7, 0, 9, 1, 7, 0, 10, 1, 7, 0, 17, 3, 7, 0, 20, 3, 7, 0,233, 7, 7, 0,234, 7, 32, 0,235, 7, - 42, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,140, 7, 4, 0, 93, 0, 0, 0, 20, 0, 0, 0,214, 7, 2, 0, 43, 0, - 2, 0, 64, 0, 2, 0,236, 7, 2, 0,237, 7, 43, 1, 8, 0, 32, 0, 45, 0, 7, 0,161, 2, 7, 0,238, 7, 7, 0,239, 7, - 7, 0,156, 2, 2, 0, 19, 0, 2, 0,130, 2, 7, 0,240, 7, 44, 1, 12, 0, 2, 0, 17, 0, 2, 0, 14, 1, 2, 0, 19, 0, - 2, 0,164, 2, 2, 0,190, 2, 2, 0,241, 7, 4, 0, 37, 0, 7, 0,242, 7, 7, 0,243, 7, 7, 0,244, 7, 7, 0,245, 7, - 0, 0,246, 7, 45, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,140, 7, 4, 0, 93, 0, 0, 0, 20, 0, 2, 0, 81, 4, - 2, 0, 64, 0, 2, 0,236, 7, 2, 0,237, 7, 65, 0,164, 1, 46, 1, 7, 0, 4, 0,118, 2, 4, 0,247, 7, 4, 0,248, 7, - 4, 0,249, 7, 7, 0,250, 7, 7, 0,251, 7, 0, 0,187, 7, 47, 1, 7, 0, 0, 0,252, 7, 32, 0,253, 7, 0, 0,191, 7, - 2, 0,254, 7, 2, 0, 43, 0, 4, 0, 70, 0, 0, 0,192, 7, 48, 1, 6, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,140, 7, - 4, 0, 93, 0, 0, 0,255, 7, 0, 0, 0, 8, 49, 1, 1, 0, 4, 0, 19, 0, 50, 1, 6, 0, 0, 0, 96, 0, 2, 0, 17, 0, - 2, 0, 19, 0, 4, 0, 1, 8, 7, 0, 2, 8, 43, 0,227, 5, 51, 1, 4, 0, 0, 0,184, 0, 2, 0, 19, 0, 4, 0, 17, 0, - 32, 0, 45, 0, 52, 1, 2, 0, 4, 0, 17, 0, 4, 0,148, 5, 33, 1, 10, 0, 33, 1, 0, 0, 33, 1, 1, 0, 33, 1,207, 7, - 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,169, 7, 2, 0, 3, 8, 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 45, 0, 53, 1, 10, 0, - 7, 0, 40, 3, 7, 0, 4, 8, 7, 0, 5, 8, 7, 0, 6, 8, 7, 0, 7, 8, 4, 0, 19, 0, 7, 0,241, 7, 7, 0, 8, 8, - 7, 0, 9, 8, 7, 0, 37, 0, 2, 1, 20, 0, 27, 0, 31, 0, 0, 0,195, 0, 54, 1, 10, 8, 9, 0, 11, 8, 44, 0,154, 0, - 44, 0, 12, 8, 9, 0, 13, 8, 36, 0, 80, 0, 7, 0,137, 3, 7, 0, 14, 8, 7, 0, 15, 8, 7, 0, 16, 8, 7, 0, 17, 8, - 7, 0, 18, 8, 7, 0, 19, 8, 4, 0, 94, 0, 4, 0, 20, 8, 0, 0, 21, 8, 0, 0, 22, 8, 0, 0, 23, 8, 55, 1, 6, 0, - 27, 0, 31, 0, 7, 0, 24, 8, 7, 0, 25, 8, 7, 0, 26, 8, 2, 0, 27, 8, 2, 0, 28, 8, 56, 1, 15, 0,197, 0, 0, 0, -197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5,244, 0, 29, 8,198, 0,165, 5, 2, 1, 97, 7, 2, 0, 14, 1, - 2, 0,220, 7, 2, 0, 14, 2, 2, 0, 15, 2, 2, 0, 19, 0, 2, 0,170, 5, 4, 0, 70, 0, 57, 1, 6, 0, 57, 1, 0, 0, - 57, 1, 1, 0, 32, 0, 45, 0, 9, 0, 30, 8, 4, 0,220, 0, 4, 0, 37, 0, 65, 0, 4, 0, 27, 0, 31, 0, 12, 0, 31, 8, - 4, 0,136, 0, 7, 0, 32, 8, 58, 1, 25, 0, 58, 1, 0, 0, 58, 1, 1, 0, 58, 1, 38, 0, 12, 0, 33, 8, 0, 0, 20, 0, - 7, 0, 34, 8, 7, 0, 35, 8, 7, 0, 36, 8, 7, 0, 37, 8, 4, 0, 19, 0, 7, 0, 38, 8, 7, 0, 39, 8, 7, 0, 40, 8, - 7, 0, 21, 1, 7, 0,220, 1, 7, 0, 41, 8, 7, 0,116, 2, 7, 0, 42, 8, 7, 0, 43, 8, 7, 0, 44, 8, 7, 0, 45, 8, - 7, 0, 46, 8, 7, 0,177, 0, 2, 0,136, 0, 2, 0,249, 4, 59, 1, 20, 0, 27, 0, 31, 0, 12, 0, 47, 8, 12, 0, 48, 8, - 12, 0, 49, 8, 4, 0, 19, 0, 4, 0,119, 5, 2, 0,168, 2, 2, 0,184, 5, 2, 0,136, 0, 2, 0, 50, 8, 2, 0, 51, 8, - 2, 0, 52, 8, 2, 0, 53, 8, 2, 0, 54, 8, 4, 0, 55, 8, 4, 0, 56, 8, 4, 0, 57, 8, 4, 0, 58, 8, 4, 0, 59, 8, - 4, 0, 60, 8, 60, 1, 38, 0, 60, 1, 0, 0, 60, 1, 1, 0, 26, 0, 61, 8, 12, 0, 67, 3, 0, 0, 20, 0, 2, 0, 19, 0, - 2, 0, 62, 8, 2, 0, 63, 8, 2, 0, 64, 8, 2, 0, 26, 3, 2, 0, 65, 8, 4, 0,253, 1, 4, 0, 57, 8, 4, 0, 58, 8, - 58, 1, 66, 8, 60, 1, 38, 0, 60, 1, 67, 8, 12, 0, 68, 8, 9, 0, 69, 8, 9, 0, 70, 8, 9, 0, 71, 8, 7, 0, 9, 1, - 7, 0,177, 0, 7, 0, 72, 8, 7, 0,201, 1, 2, 0, 73, 8, 2, 0, 37, 0, 7, 0, 74, 8, 7, 0, 75, 8, 7, 0, 22, 3, - 7, 0, 76, 8, 7, 0, 77, 8, 7, 0, 78, 8, 7, 0, 79, 8, 7, 0, 80, 8, 7, 0, 81, 8, 7, 0,250, 1, 32, 0, 82, 8, -153, 0, 9, 0, 12, 0, 83, 8, 2, 0, 19, 0, 2, 0, 84, 8, 7, 0, 26, 2, 7, 0, 85, 8, 7, 0, 86, 8, 12, 0, 87, 8, - 4, 0, 88, 8, 4, 0, 37, 0, 61, 1, 7, 0, 61, 1, 0, 0, 61, 1, 1, 0, 12, 0, 21, 8, 4, 0, 19, 0, 4, 0, 89, 8, - 0, 0,131, 3,231, 0, 90, 8,152, 0, 7, 0, 27, 0, 31, 0, 12, 0, 91, 8, 12, 0, 83, 8, 12, 0, 92, 8, 12, 0,104, 0, - 4, 0, 19, 0, 4, 0, 93, 8,202, 0, 4, 0, 27, 0, 94, 8, 12, 0, 83, 8, 4, 0, 95, 8, 4, 0, 19, 0, 62, 1, 17, 0, -197, 0, 0, 0,197, 0, 1, 0, 12, 0,110, 5, 4, 0,111, 5, 7, 0,112, 5, 2, 0,113, 5,198, 0,165, 5,152, 0, 9, 3, -202, 0, 96, 8, 0, 0, 14, 1, 0, 0,168, 5, 2, 0, 19, 0, 2, 0, 97, 8, 2, 0,169, 5, 2, 0,170, 5, 2, 0, 98, 8, - 7, 0, 99, 8, 63, 1, 8, 0, 63, 1, 0, 0, 63, 1, 1, 0, 61, 1,100, 8, 36, 0, 80, 0, 12, 0, 12, 3, 4, 0, 19, 0, - 0, 0, 20, 0, 4, 0,101, 8, 64, 1, 5, 0, 64, 1, 0, 0, 64, 1, 1, 0, 36, 0, 80, 0, 2, 0, 19, 0, 0, 0,102, 8, - 65, 1, 12, 0, 65, 1, 0, 0, 65, 1, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,103, 8, 0, 0,104, 8, - 0, 0,102, 8, 7, 0,105, 8, 7, 0,106, 8, 4, 0, 37, 0, 36, 0, 80, 0, 66, 1, 9, 0, 66, 1, 0, 0, 66, 1, 1, 0, - 32, 0,107, 8, 0, 0,108, 8, 7, 0,109, 8, 2, 0,110, 8, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0, 37, 0, 67, 1, 7, 0, - 43, 0,227, 5, 26, 0, 61, 8, 4, 0, 19, 0, 4, 0,111, 8, 12, 0,112, 8, 32, 0,107, 8, 0, 0,108, 8, 68, 1, 12, 0, - 32, 0,107, 8, 2, 0,113, 8, 2, 0, 19, 0, 2, 0,114, 8, 2, 0,115, 8, 0, 0,108, 8, 32, 0,116, 8, 0, 0,117, 8, - 7, 0,118, 8, 7, 0,220, 1, 7, 0,119, 8, 7, 0,120, 8, 69, 1, 6, 0, 32, 0,107, 8, 4, 0,121, 8, 4, 0,122, 8, - 4, 0, 94, 0, 4, 0, 37, 0, 0, 0,108, 8, 70, 1, 4, 0, 32, 0,107, 8, 4, 0, 19, 0, 4, 0,121, 8, 0, 0,108, 8, - 71, 1, 4, 0, 32, 0,107, 8, 4, 0, 19, 0, 4, 0,121, 8, 0, 0,108, 8, 72, 1, 10, 0, 32, 0,107, 8, 4, 0,123, 8, - 7, 0,130, 0, 4, 0, 19, 0, 2, 0,223, 5, 2, 0,124, 8, 2, 0, 43, 0, 2, 0, 70, 0, 7, 0,125, 8, 0, 0,108, 8, - 73, 1, 4, 0, 32, 0,107, 8, 4, 0, 19, 0, 4, 0,121, 8, 0, 0,108, 8, 74, 1, 10, 0, 32, 0,107, 8, 2, 0, 17, 0, - 2, 0,183, 3, 4, 0, 92, 0, 4, 0, 93, 0, 7, 0,238, 7, 7, 0,239, 7, 4, 0, 37, 0,152, 0,213, 7, 0, 0,108, 8, - 75, 1, 4, 0, 32, 0,107, 8, 4, 0, 27, 3, 4, 0,126, 8, 0, 0,108, 8, 76, 1, 5, 0, 32, 0,107, 8, 7, 0,130, 0, - 4, 0,127, 8, 4, 0, 27, 3, 4, 0, 28, 3, 77, 1, 6, 0, 32, 0,107, 8, 4, 0,128, 8, 4, 0,129, 8, 7, 0,130, 8, - 7, 0,131, 8, 0, 0,108, 8, 78, 1, 16, 0, 32, 0,107, 8, 32, 0, 67, 8, 4, 0, 17, 0, 7, 0,132, 8, 7, 0,133, 8, - 7, 0,134, 8, 7, 0,135, 8, 7, 0,136, 8, 7, 0,137, 8, 7, 0,138, 8, 7, 0,139, 8, 7, 0,140, 8, 2, 0, 19, 0, - 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 70, 0, 79, 1, 3, 0, 32, 0,107, 8, 4, 0, 19, 0, 4, 0,123, 5, 80, 1, 5, 0, - 32, 0,107, 8, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0,141, 8, 0, 0,108, 8, 81, 1, 10, 0, 32, 0,107, 8, 0, 0,108, 8, - 2, 0,142, 8, 2, 0,143, 8, 0, 0,144, 8, 0, 0,145, 8, 7, 0,146, 8, 7, 0,147, 8, 7, 0,148, 8, 7, 0,149, 8, - 82, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,150, 8, 7, 0,151, 8, 2, 0, 19, 0, - 2, 0,123, 5, 83, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,150, 8, 7, 0,151, 8, - 2, 0, 19, 0, 2, 0,123, 5, 84, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,150, 8, - 7, 0,151, 8, 2, 0, 19, 0, 2, 0,123, 5, 85, 1, 7, 0, 32, 0,107, 8, 0, 0,108, 8, 7, 0, 21, 1, 7, 0, 31, 1, - 2, 0, 19, 0, 2, 0, 14, 1, 4, 0, 37, 0, 86, 1, 5, 0, 32, 0,226, 2, 7, 0, 21, 1, 2, 0,230, 2, 0, 0,232, 2, - 0, 0,152, 8, 87, 1, 10, 0, 87, 1, 0, 0, 87, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,153, 8, 7, 0,222, 0, - 7, 0,223, 0, 2, 0, 21, 8, 2, 0,154, 8, 32, 0, 45, 0, 88, 1, 22, 0, 88, 1, 0, 0, 88, 1, 1, 0, 2, 0, 19, 0, - 2, 0, 14, 1, 2, 0,155, 8, 2, 0,156, 8, 36, 0, 80, 0,152, 0,213, 7, 32, 0,169, 0, 7, 0, 92, 0, 7, 0, 93, 0, - 7, 0,157, 8, 7, 0,158, 8, 7, 0,159, 8, 7, 0,160, 8, 7, 0,157, 2, 7, 0,161, 8, 7, 0,215, 7, 7, 0,162, 8, - 0, 0,163, 8, 0, 0,164, 8, 12, 0, 14, 3, 89, 1, 8, 0, 7, 0,228, 1, 7, 0,238, 7, 7, 0,239, 7, 9, 0, 2, 0, - 2, 0,165, 8, 2, 0,166, 8, 2, 0,167, 8, 2, 0,168, 8, 90, 1, 18, 0, 90, 1, 0, 0, 90, 1, 1, 0, 90, 1,169, 8, - 0, 0, 20, 0, 89, 1,170, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,171, 8, 2, 0,172, 8, 2, 0,173, 8, 2, 0,174, 8, - 4, 0, 43, 0, 7, 0,175, 8, 7, 0,176, 8, 4, 0,177, 8, 4, 0,178, 8, 90, 1,179, 8, 91, 1,180, 8, 92, 1, 33, 0, - 92, 1, 0, 0, 92, 1, 1, 0, 92, 1,181, 8, 0, 0, 20, 0, 0, 0,182, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 66, 7, - 2, 0, 99, 7, 2, 0,183, 8, 2, 0,138, 0, 2, 0,172, 8, 2, 0, 56, 7, 12, 0,208, 7, 12, 0,184, 8, 27, 0, 1, 6, - 9, 0,185, 8, 7, 0,175, 8, 7, 0,176, 8, 7, 0,255, 1, 7, 0,186, 8, 2, 0,187, 8, 2, 0,188, 8, 7, 0,189, 8, - 7, 0,190, 8, 2, 0,191, 8, 2, 0,192, 8, 9, 0,193, 8, 24, 0,194, 8, 24, 0,195, 8, 24, 0,196, 8, 93, 1,155, 0, - 94, 1,197, 8, 91, 1, 8, 0, 91, 1, 0, 0, 91, 1, 1, 0, 92, 1,198, 8, 92, 1,199, 8, 90, 1,200, 8, 90, 1,179, 8, - 4, 0, 19, 0, 4, 0, 37, 0, 59, 0, 20, 0, 27, 0, 31, 0, 39, 0, 75, 0, 12, 0,201, 8, 12, 0,202, 8, 89, 1,203, 8, - 12, 0,204, 8, 4, 0, 17, 0, 4, 0,205, 8, 4, 0,206, 8, 4, 0,207, 8, 12, 0,208, 8, 94, 1,209, 8, 90, 1,210, 8, - 90, 1,211, 8, 9, 0,212, 8, 9, 0,213, 8, 4, 0,214, 8, 9, 0,215, 8, 9, 0,216, 8, 9, 0,217, 8, 95, 1, 6, 0, - 4, 0,129, 0, 4, 0,131, 0, 4, 0, 56, 7, 0, 0,218, 8, 0, 0,219, 8, 2, 0, 37, 0, 96, 1, 16, 0, 2, 0, 12, 7, - 2, 0, 13, 7, 2, 0,220, 8, 2, 0, 5, 8, 2, 0,221, 8, 2, 0, 68, 0, 7, 0,156, 2, 7, 0,222, 8, 7, 0,223, 8, - 2, 0, 35, 1, 0, 0,224, 8, 0, 0,232, 4, 2, 0,225, 8, 2, 0, 37, 0, 4, 0,226, 8, 4, 0,227, 8, 97, 1, 9, 0, - 7, 0,228, 8, 7, 0,229, 8, 7, 0, 19, 8, 7, 0,113, 0, 7, 0,230, 8, 7, 0,190, 5, 2, 0,231, 8, 0, 0,232, 8, - 0, 0, 37, 0, 98, 1, 4, 0, 7, 0,233, 8, 7, 0,234, 8, 2, 0,231, 8, 2, 0, 37, 0, 99, 1, 3, 0, 7, 0,235, 8, - 7, 0,236, 8, 7, 0, 15, 0,100, 1, 7, 0, 0, 0,191, 1, 2, 0,118, 4, 2, 0,119, 4, 2, 0,120, 4, 2, 0, 69, 4, - 4, 0,131, 0, 4, 0,181, 3,101, 1, 7, 0, 7, 0,237, 8, 7, 0,238, 8, 7, 0,239, 8, 7, 0, 10, 2, 7, 0,240, 8, - 7, 0,241, 8, 7, 0,242, 8,102, 1, 4, 0, 2, 0,243, 8, 2, 0,244, 8, 2, 0,245, 8, 2, 0,246, 8,103, 1, 2, 0, - 7, 0, 5, 0, 7, 0, 6, 0,104, 1, 2, 0, 0, 0,171, 0, 0, 0,247, 8,105, 1, 1, 0, 0, 0, 20, 0,106, 1, 10, 0, - 0, 0,248, 8, 0, 0,249, 8, 0, 0,173, 5, 0, 0,250, 8, 2, 0,220, 8, 2, 0,251, 8, 7, 0,252, 8, 7, 0,253, 8, - 7, 0,254, 8, 7, 0,161, 8,107, 1, 2, 0, 9, 0,255, 8, 9, 0, 0, 9,108, 1, 11, 0, 0, 0,120, 4, 0, 0, 17, 0, - 0, 0,231, 8, 0, 0,113, 0, 0, 0, 1, 9, 0, 0,110, 0, 0, 0,184, 0, 7, 0, 2, 9, 7, 0, 3, 9, 7, 0, 4, 9, - 7, 0, 5, 9,109, 1, 8, 0, 7, 0,176, 7, 7, 0,130, 0, 7, 0,232, 4, 7, 0, 82, 2, 7, 0, 6, 9, 7, 0,209, 0, - 7, 0, 7, 9, 4, 0, 17, 0,110, 1, 4, 0, 2, 0, 8, 9, 2, 0, 9, 9, 2, 0, 10, 9, 2, 0, 37, 0,111, 1, 1, 0, - 0, 0, 20, 0,112, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 19, 0, 2, 0, 11, 9,113, 1, 10, 0, 2, 0,122, 3, - 2, 0, 19, 0, 7, 0, 5, 4, 7, 0, 12, 9, 7, 0, 13, 9, 7, 0, 14, 9, 7, 0, 15, 9,112, 1, 16, 9,112, 1, 17, 9, -112, 1, 18, 9, 62, 0, 9, 0, 4, 0, 19, 0, 4, 0, 64, 0, 24, 0, 19, 9, 24, 0, 20, 9,113, 1, 21, 9, 7, 0, 22, 9, - 7, 0, 23, 9, 7, 0, 24, 9, 7, 0, 25, 9,114, 1, 4, 0, 48, 0,150, 2, 7, 0, 26, 9, 7, 0, 94, 1, 7, 0, 37, 0, -176, 0, 17, 0, 27, 0, 31, 0,114, 1, 27, 9, 62, 0, 16, 9, 52, 0, 78, 1, 2, 0, 19, 0, 2, 0, 77, 5, 4, 0,110, 0, - 7, 0, 28, 9, 7, 0, 7, 2, 7, 0, 29, 9, 7, 0, 30, 9, 7, 0, 94, 1, 7, 0, 31, 9, 2, 0, 48, 1, 0, 0, 32, 9, - 0, 0,115, 3, 0, 0, 96, 0,115, 1, 10, 0, 4, 0, 17, 0, 4, 0,130, 0, 4, 0, 19, 0, 4, 0, 88, 3, 4, 0, 33, 9, - 4, 0, 34, 9, 4, 0, 35, 9, 0, 0, 96, 0, 0, 0, 20, 0, 9, 0, 2, 0, 89, 0, 6, 0,115, 1, 36, 9, 4, 0, 37, 9, - 4, 0, 38, 9, 4, 0, 39, 9, 4, 0, 37, 0, 9, 0, 40, 9,116, 1, 5, 0, 7, 0, 77, 2, 7, 0,190, 2, 7, 0,220, 1, - 2, 0, 41, 9, 2, 0, 37, 0,117, 1, 5, 0, 7, 0, 77, 2, 7, 0, 42, 9, 7, 0, 43, 9, 7, 0, 44, 9, 7, 0,190, 2, -118, 1, 7, 0, 4, 0, 45, 9, 4, 0, 46, 9, 4, 0, 47, 9, 7, 0, 48, 9, 7, 0, 49, 9, 7, 0, 50, 9, 7, 0, 51, 9, -119, 1, 8, 0,119, 1, 0, 0,119, 1, 1, 0, 32, 0, 45, 0, 4, 0,213, 2, 2, 0, 19, 0, 2, 0, 57, 0, 7, 0,190, 2, - 7, 0,184, 7,120, 1, 26, 0, 32, 0, 52, 9,117, 1, 84, 3,117, 1, 53, 9,116, 1, 54, 9,117, 1,165, 7, 7, 0, 55, 9, - 7, 0, 56, 9, 7, 0, 57, 9, 7, 0, 58, 9, 7, 0, 49, 9, 7, 0, 50, 9, 7, 0,190, 2, 7, 0,167, 2, 7, 0, 59, 9, - 7, 0, 60, 9, 7, 0,110, 0, 7, 0, 61, 9, 4, 0, 45, 9, 4, 0, 62, 9, 4, 0, 37, 0, 4, 0, 82, 0, 4, 0, 63, 9, - 2, 0, 19, 0, 2, 0, 64, 9, 2, 0, 65, 9, 2, 0,118, 3,121, 1,117, 0, 27, 0, 31, 0, 39, 0, 75, 0, 4, 0, 19, 0, - 2, 0, 17, 0, 2, 0,142, 8, 2, 0, 66, 9, 2, 0, 67, 9, 2, 0, 73, 8, 2, 0, 68, 9, 2, 0, 69, 9, 2, 0, 70, 9, - 2, 0, 71, 9, 2, 0, 72, 9, 2, 0, 73, 9, 2, 0, 74, 9, 2, 0, 75, 9, 2, 0, 76, 9, 2, 0, 77, 9, 2, 0, 78, 9, - 2, 0, 79, 9, 2, 0, 80, 9, 2, 0, 81, 9, 2, 0,211, 1, 2, 0,158, 7, 2, 0,134, 7, 2, 0, 82, 9, 2, 0, 83, 9, - 2, 0,116, 3, 2, 0,117, 3, 2, 0, 84, 9, 2, 0, 85, 9, 2, 0, 86, 9, 2, 0, 87, 9, 2, 0, 88, 9, 2, 0, 89, 9, - 7, 0, 90, 9, 7, 0, 91, 9, 7, 0, 92, 9, 2, 0, 93, 9, 2, 0, 94, 9, 7, 0, 95, 9, 7, 0, 96, 9, 7, 0, 97, 9, - 7, 0,140, 7, 7, 0, 93, 0, 7, 0,167, 2, 7, 0,146, 7, 7, 0, 98, 9, 7, 0, 99, 9, 7, 0,100, 9, 4, 0,141, 7, - 4, 0,139, 7, 4, 0,101, 9, 7, 0,142, 7, 7, 0,143, 7, 7, 0,144, 7, 7, 0,102, 9, 7, 0,103, 9, 7, 0,104, 9, - 7, 0,105, 9, 7, 0,106, 9, 7, 0,107, 9, 7, 0,108, 9, 7, 0,109, 9, 7, 0, 40, 3, 7, 0,110, 0, 7, 0,110, 9, - 7, 0,111, 9, 7, 0,112, 9, 7, 0,113, 9, 7, 0,114, 9, 7, 0,115, 9, 7, 0,116, 9, 4, 0,117, 9, 4, 0,118, 9, - 7, 0,119, 9, 7, 0,120, 9, 7, 0,121, 9, 7, 0,122, 9, 7, 0,123, 9, 7, 0, 57, 0, 7, 0,124, 9, 7, 0,125, 9, - 7, 0,112, 3, 7, 0,110, 3, 7, 0,111, 3, 7, 0,126, 9, 7, 0,127, 9, 7, 0,128, 9, 7, 0,129, 9, 7, 0,130, 9, - 7, 0,131, 9, 7, 0,132, 9, 7, 0,133, 9, 7, 0,134, 9, 7, 0,135, 9, 7, 0,136, 9, 7, 0,137, 9, 7, 0,138, 9, - 4, 0,139, 9, 4, 0,140, 9, 7, 0, 47, 3, 7, 0,141, 9, 7, 0,142, 9, 7, 0,143, 9, 7, 0,144, 9, 7, 0,145, 9, - 7, 0,146, 9, 7, 0,147, 9, 0, 0,148, 9, 65, 0, 73, 3, 65, 0,149, 9, 32, 0,150, 9, 32, 0,151, 9, 36, 0, 80, 0, -155, 0, 71, 3,155, 0,152, 9,142, 0, 39, 0,142, 0, 0, 0,142, 0, 1, 0,121, 1,153, 9,120, 1,163, 3,118, 1, 67, 8, -122, 1,154, 9, 9, 0,155, 9,123, 1,156, 9,123, 1,157, 9, 12, 0,158, 9, 12, 0,159, 9,156, 0, 72, 3, 32, 0,160, 9, - 32, 0,161, 9, 32, 0, 38, 0, 12, 0,162, 9, 12, 0,163, 9, 12, 0,164, 9, 7, 0,213, 0, 7, 0, 92, 4, 4, 0,118, 2, - 4, 0, 19, 0, 4, 0,141, 7, 4, 0,165, 9, 4, 0,166, 9, 4, 0,167, 9, 4, 0, 57, 0, 2, 0,220, 0, 2, 0,168, 9, - 2, 0,169, 9, 2, 0, 65, 3, 2, 0,170, 9, 2, 0,118, 3, 0, 0,171, 9, 2, 0,172, 9, 2, 0,173, 9, 2, 0,174, 9, - 9, 0,175, 9,131, 0,202, 3,129, 0, 34, 0,124, 1,176, 9, 7, 0,174, 3, 7, 0,177, 9, 7, 0,178, 9, 7, 0, 8, 4, - 7, 0,179, 9, 7, 0, 50, 3, 7, 0, 40, 3, 7, 0,180, 9, 7, 0, 9, 2, 7, 0,181, 9, 7, 0,182, 9, 7, 0,183, 9, - 7, 0,184, 9, 7, 0,185, 9, 7, 0,186, 9, 7, 0,175, 3, 7, 0,187, 9, 7, 0,188, 9, 7, 0,189, 9, 7, 0,176, 3, - 7, 0,172, 3, 7, 0,173, 3, 4, 0,190, 9, 4, 0, 94, 0, 4, 0,191, 9, 4, 0,192, 9, 2, 0,193, 9, 2, 0,194, 9, - 2, 0,195, 9, 2, 0,196, 9, 2, 0,197, 9, 2, 0, 37, 0, 4, 0, 70, 0,130, 0, 8, 0,124, 1,198, 9, 7, 0,199, 9, - 7, 0,200, 9, 7, 0,165, 1, 7, 0,201, 9, 4, 0, 94, 0, 2, 0,202, 9, 2, 0,203, 9,125, 1, 4, 0, 7, 0, 5, 0, - 7, 0, 6, 0, 7, 0, 7, 0, 7, 0,204, 9,126, 1, 6, 0,126, 1, 0, 0,126, 1, 1, 0,125, 1,205, 9, 4, 0,206, 9, - 2, 0,207, 9, 2, 0, 19, 0,127, 1, 5, 0,127, 1, 0, 0,127, 1, 1, 0, 12, 0,208, 9, 4, 0,209, 9, 4, 0, 19, 0, -128, 1, 9, 0,128, 1, 0, 0,128, 1, 1, 0, 12, 0,129, 0,127, 1,210, 9, 4, 0, 19, 0, 2, 0,207, 9, 2, 0,211, 9, - 7, 0, 95, 0, 0, 0,212, 9,190, 0, 6, 0, 27, 0, 31, 0, 12, 0,134, 4, 4, 0, 19, 0, 2, 0,213, 9, 2, 0,214, 9, - 9, 0,215, 9,129, 1, 6, 0,129, 1, 0, 0,129, 1, 1, 0, 4, 0, 17, 0, 4, 0, 23, 0, 0, 0,216, 9, 0, 0,217, 9, -130, 1, 5, 0, 12, 0,218, 9, 4, 0,219, 9, 4, 0,220, 9, 4, 0, 19, 0, 4, 0, 37, 0,131, 1, 13, 0, 27, 0, 31, 0, -132, 1,221, 9,132, 1,222, 9, 12, 0,223, 9, 4, 0,224, 9, 2, 0,225, 9, 2, 0, 37, 0, 12, 0,226, 9, 12, 0,227, 9, -130, 1,228, 9, 12, 0,229, 9, 12, 0,230, 9, 12, 0,231, 9,132, 1, 30, 0,132, 1, 0, 0,132, 1, 1, 0, 9, 0,232, 9, - 4, 0,247, 6, 4, 0, 37, 0,200, 0,164, 5,200, 0,233, 9, 0, 0,234, 9, 2, 0,235, 9, 2, 0,236, 9, 2, 0, 12, 7, - 2, 0, 13, 7, 2, 0,237, 9, 2, 0,238, 9, 2, 0, 88, 3, 2, 0, 26, 6, 2, 0,239, 9, 2, 0,240, 9, 4, 0,161, 1, -133, 1,241, 9,134, 1,242, 9,135, 1,243, 9, 4, 0,244, 9, 4, 0,245, 9, 9, 0,246, 9, 12, 0,247, 9, 12, 0,227, 9, - 12, 0, 30, 7, 12, 0,248, 9, 12, 0,249, 9,136, 1, 12, 0,136, 1, 0, 0,136, 1, 1, 0, 0, 0,250, 9,137, 1,251, 9, - 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,252, 9, 2, 0,253, 9, 2, 0,254, 9, 2, 0,255, 9, 2, 0, 0, 10, 2, 0, 37, 0, -138, 1, 6, 0,138, 1, 0, 0,138, 1, 1, 0, 12, 0, 1, 10, 0, 0, 2, 10, 4, 0, 3, 10, 4, 0, 4, 10,208, 0, 8, 0, -208, 0, 0, 0,208, 0, 1, 0, 0, 0,250, 9, 26, 0, 30, 0,139, 1, 6, 7, 9, 0, 5, 10,137, 1,251, 9,130, 1, 6, 10, -133, 1, 23, 0,133, 1, 0, 0,133, 1, 1, 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 5, 0, 2, 0, 6, 0, 2, 0, 7, 10, - 2, 0, 8, 10, 2, 0, 9, 10, 2, 0, 10, 10, 0, 0, 11, 10, 0, 0, 37, 0, 2, 0,252, 9, 2, 0,253, 9, 2, 0,254, 9, - 2, 0,255, 9, 2, 0, 0, 10, 2, 0, 43, 0, 0, 0, 12, 10, 2, 0, 13, 10, 2, 0, 14, 10, 4, 0, 70, 0, 9, 0, 5, 10, -140, 1, 8, 0,140, 1, 0, 0,140, 1, 1, 0, 9, 0, 2, 0, 9, 0, 15, 10, 0, 0,131, 3, 2, 0, 17, 0, 2, 0, 19, 0, - 7, 0, 16, 10,141, 1, 5, 0, 7, 0, 17, 10, 4, 0, 18, 10, 4, 0, 19, 10, 4, 0, 14, 1, 4, 0, 19, 0,142, 1, 6, 0, - 7, 0, 20, 10, 7, 0, 21, 10, 7, 0, 22, 10, 7, 0, 23, 10, 4, 0, 17, 0, 4, 0, 19, 0,143, 1, 5, 0, 7, 0,238, 7, - 7, 0,239, 7, 7, 0,190, 2, 2, 0,224, 1, 2, 0,225, 1,144, 1, 5, 0,143, 1, 2, 0, 4, 0, 54, 0, 7, 0, 24, 10, - 7, 0,238, 7, 7, 0,239, 7,145, 1, 4, 0, 2, 0, 25, 10, 2, 0, 26, 10, 2, 0, 27, 10, 2, 0, 28, 10,146, 1, 2, 0, - 43, 0,254, 5, 26, 0, 61, 8,147, 1, 3, 0, 24, 0, 29, 10, 4, 0, 19, 0, 4, 0, 37, 0,148, 1, 6, 0, 7, 0,110, 0, - 7, 0,142, 2, 7, 0, 30, 10, 7, 0, 37, 0, 2, 0,219, 0, 2, 0, 31, 10,149, 1, 7, 0,149, 1, 0, 0,149, 1, 1, 0, - 27, 0, 1, 6, 0, 0, 32, 10, 4, 0, 33, 10, 4, 0, 94, 0, 0, 0,131, 3,150, 1, 6, 0, 12, 0,112, 8, 0, 0, 34, 10, - 7, 0, 61, 0, 7, 0, 16, 10, 4, 0, 17, 0, 4, 0, 19, 0,151, 1, 3, 0, 7, 0, 35, 10, 4, 0, 19, 0, 4, 0, 37, 0, -152, 1, 15, 0,152, 1, 0, 0,152, 1, 1, 0, 61, 1,100, 8,150, 1, 62, 0, 12, 0, 14, 3, 35, 0, 50, 0,151, 1, 36, 10, - 4, 0, 54, 0, 7, 0, 61, 0, 2, 0, 19, 0, 2, 0,255, 0, 4, 0, 33, 10, 0, 0, 32, 10, 4, 0, 37, 10, 7, 0, 38, 10, -153, 1, 2, 0, 0, 0, 39, 10, 0, 0, 40, 10,154, 1, 4, 0,154, 1, 0, 0,154, 1, 1, 0,152, 0,226, 2, 12, 0, 41, 10, -155, 1, 22, 0,155, 1, 0, 0,155, 1, 1, 0, 12, 0, 42, 10,152, 0,213, 7,154, 1, 43, 10, 12, 0, 44, 10, 12, 0, 14, 3, - 0, 0,131, 3, 7, 0, 16, 10, 7, 0, 45, 10, 7, 0, 92, 0, 7, 0, 93, 0, 7, 0,157, 8, 7, 0,158, 8, 7, 0,157, 2, - 7, 0,161, 8, 7, 0,215, 7, 7, 0,162, 8, 2, 0, 46, 10, 2, 0, 47, 10, 2, 0, 19, 0, 2, 0, 17, 0,156, 1, 6, 0, -156, 1, 0, 0,156, 1, 1, 0, 12, 0, 42, 10, 4, 0, 19, 0, 4, 0, 81, 2, 0, 0,131, 3,157, 1, 10, 0,157, 1, 0, 0, -157, 1, 1, 0, 27, 0, 1, 6, 0, 0, 48, 10, 4, 0, 49, 10, 4, 0, 50, 10, 0, 0, 32, 10, 4, 0, 33, 10, 2, 0, 19, 0, - 2, 0, 51, 10,158, 1, 6, 0,158, 1, 0, 0,158, 1, 1, 0, 12, 0, 52, 10, 0, 0,131, 3, 4, 0, 19, 0, 4, 0, 53, 10, -159, 1, 5, 0,159, 1, 0, 0,159, 1, 1, 0, 0, 0, 32, 10, 4, 0, 33, 10, 7, 0,134, 2, 39, 0, 9, 0,152, 0, 9, 3, -152, 0, 54, 10,154, 1, 43, 10, 12, 0, 55, 10,155, 1, 56, 10, 12, 0, 57, 10, 12, 0, 58, 10, 4, 0, 19, 0, 4, 0,220, 0, -160, 1, 2, 0, 27, 0, 31, 0, 39, 0, 75, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0,159, 3, 7, 0,160, 3, 7, 0,161, 3, 4, 0,162, 3, 4, 0,163, 3, 7, 0,164, 3, 7, 0, 48, 3,155, 0, 49, 0, +141, 0,165, 3, 4, 0,124, 3, 4, 0,166, 3,160, 0,167, 3,161, 0,168, 3, 0, 0, 37, 0, 0, 0,169, 3, 2, 0,170, 3, + 7, 0,171, 3, 0, 0,172, 3, 7, 0,173, 3, 7, 0,174, 3, 7, 0,175, 3, 7, 0,176, 3, 7, 0,177, 3, 7, 0,178, 3, + 7, 0,179, 3, 7, 0,180, 3, 7, 0,181, 3, 2, 0,182, 3, 0, 0,183, 3, 2, 0,184, 3, 7, 0,185, 3, 7, 0,186, 3, + 0, 0,187, 3, 4, 0,126, 0, 4, 0,188, 3, 4, 0,189, 3, 2, 0,190, 3, 2, 0,191, 3,159, 0,192, 3, 4, 0,193, 3, + 4, 0, 82, 0, 7, 0,194, 3, 7, 0,195, 3, 7, 0,196, 3, 7, 0,197, 3, 2, 0,198, 3, 2, 0,199, 3, 2, 0,200, 3, + 2, 0,201, 3, 2, 0,202, 3, 2, 0,203, 3, 2, 0,204, 3, 2, 0,205, 3,162, 0,206, 3, 7, 0,207, 3, 7, 0,208, 3, +130, 0,209, 3,146, 0, 48, 0, 2, 0, 17, 0, 2, 0,210, 3, 2, 0,211, 3, 2, 0,212, 3, 7, 0,213, 3, 2, 0,214, 3, + 2, 0,215, 3, 7, 0,216, 3, 2, 0,217, 3, 2, 0,218, 3, 7, 0,219, 3, 7, 0,220, 3, 7, 0,221, 3, 7, 0,222, 3, + 7, 0,223, 3, 7, 0,224, 3, 4, 0,225, 3, 7, 0,226, 3, 7, 0,227, 3, 7, 0,228, 3, 77, 0,229, 3, 77, 0,230, 3, + 77, 0,231, 3, 0, 0,232, 3, 7, 0,233, 3, 7, 0,234, 3, 36, 0, 80, 0, 2, 0,235, 3, 0, 0,236, 3, 0, 0,237, 3, + 7, 0,238, 3, 4, 0,239, 3, 7, 0,240, 3, 7, 0,241, 3, 4, 0,242, 3, 4, 0, 19, 0, 7, 0,243, 3, 7, 0,244, 3, + 7, 0,245, 3, 81, 0,246, 3, 7, 0,247, 3, 7, 0,248, 3, 7, 0,249, 3, 7, 0,250, 3, 7, 0,251, 3, 7, 0,252, 3, + 7, 0,253, 3, 4, 0,254, 3,163, 0, 73, 0, 27, 0, 31, 0, 39, 0, 75, 0, 2, 0,174, 0, 2, 0, 12, 1, 2, 0, 45, 1, + 2, 0,255, 3, 7, 0, 0, 4, 7, 0, 1, 4, 7, 0, 2, 4, 7, 0, 3, 4, 7, 0, 4, 4, 7, 0, 5, 4, 7, 0, 6, 4, + 7, 0, 7, 4, 7, 0, 85, 1, 7, 0, 87, 1, 7, 0, 86, 1, 7, 0, 8, 4, 4, 0, 9, 4, 7, 0, 10, 4, 7, 0, 11, 4, + 7, 0, 12, 4, 7, 0, 13, 4, 7, 0, 14, 4, 7, 0, 15, 4, 7, 0, 16, 4, 2, 0, 17, 4, 2, 0, 11, 1, 2, 0, 18, 4, + 2, 0, 19, 4, 2, 0, 20, 4, 2, 0, 21, 4, 2, 0, 22, 4, 2, 0, 23, 4, 7, 0, 24, 4, 7, 0, 25, 4, 7, 0, 26, 4, + 7, 0, 27, 4, 7, 0, 28, 4, 7, 0, 29, 4, 7, 0, 30, 4, 7, 0, 31, 4, 7, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4, + 7, 0, 35, 4, 2, 0, 36, 4, 2, 0, 37, 4, 2, 0, 38, 4, 2, 0, 39, 4, 7, 0, 40, 4, 7, 0, 41, 4, 7, 0, 42, 4, + 7, 0, 43, 4, 2, 0, 44, 4, 2, 0, 45, 4, 2, 0, 46, 4, 2, 0, 47, 4, 7, 0, 48, 4, 7, 0, 49, 4, 7, 0, 50, 4, + 7, 0, 51, 4, 2, 0, 52, 4, 2, 0, 53, 4, 2, 0, 54, 4, 2, 0, 19, 0, 7, 0, 55, 4, 7, 0, 56, 4, 36, 0, 80, 0, + 51, 0, 75, 1, 2, 0, 76, 1, 2, 0, 77, 1, 30, 0,150, 0,164, 0, 8, 0,164, 0, 0, 0,164, 0, 1, 0, 4, 0, 25, 3, + 4, 0, 57, 4, 4, 0, 19, 0, 2, 0, 58, 4, 2, 0, 59, 4, 32, 0,164, 0,165, 0, 13, 0, 9, 0, 60, 4, 9, 0, 61, 4, + 4, 0, 62, 4, 4, 0, 63, 4, 4, 0, 64, 4, 4, 0, 65, 4, 4, 0, 66, 4, 4, 0, 67, 4, 4, 0, 68, 4, 4, 0, 69, 4, + 4, 0, 70, 4, 4, 0, 37, 0, 0, 0, 71, 4,166, 0, 5, 0, 9, 0, 72, 4, 9, 0, 73, 4, 4, 0, 74, 4, 4, 0, 70, 0, + 0, 0, 75, 4,167, 0, 13, 0, 4, 0, 17, 0, 4, 0, 76, 4, 4, 0, 77, 4, 4, 0, 78, 4, 4, 0, 79, 4, 4, 0, 80, 4, + 4, 0, 90, 0, 4, 0, 81, 4, 4, 0, 82, 4, 4, 0, 83, 4, 4, 0, 84, 4, 4, 0, 85, 4, 26, 0, 30, 0,168, 0, 4, 0, + 4, 0, 86, 4, 7, 0, 87, 4, 2, 0, 19, 0, 2, 0, 77, 1,169, 0, 11, 0,169, 0, 0, 0,169, 0, 1, 0, 0, 0, 20, 0, + 63, 0, 88, 4, 64, 0, 89, 4, 4, 0, 25, 3, 4, 0, 90, 4, 4, 0, 91, 4, 4, 0, 37, 0, 4, 0, 92, 4, 4, 0, 93, 4, +170, 0,132, 0,165, 0, 94, 4,166, 0, 95, 4,167, 0, 96, 4,168, 0, 97, 4, 4, 0,194, 2, 4, 0,126, 0, 4, 0,188, 3, + 4, 0, 98, 4, 4, 0, 99, 4, 4, 0,100, 4, 4, 0,101, 4, 2, 0, 19, 0, 2, 0,102, 4, 7, 0, 26, 2, 7, 0,103, 4, + 7, 0,104, 4, 7, 0,105, 4, 7, 0,106, 4, 7, 0,107, 4, 2, 0,108, 4, 2, 0,109, 4, 2, 0,110, 4, 2, 0,111, 4, + 2, 0,214, 0, 2, 0,112, 4, 2, 0,113, 4, 2, 0,120, 3, 2, 0,114, 4, 2, 0,115, 4, 2, 0, 32, 1, 2, 0,106, 0, + 2, 0,116, 4, 2, 0,117, 4, 2, 0,118, 4, 2, 0,119, 4, 2, 0,120, 4, 2, 0,121, 4, 2, 0,122, 4, 2, 0,123, 4, + 2, 0,124, 4, 2, 0, 33, 1, 2, 0,125, 4, 2, 0,126, 4, 2, 0,127, 4, 2, 0,128, 4, 4, 0,129, 4, 4, 0, 11, 1, + 2, 0,130, 4, 2, 0,131, 4, 2, 0,132, 4, 2, 0,133, 4, 2, 0,134, 4, 2, 0,135, 4, 24, 0,136, 4, 24, 0,137, 4, + 23, 0,138, 4, 12, 0,139, 4, 2, 0,140, 4, 2, 0, 37, 0, 7, 0,141, 4, 7, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, + 4, 0,145, 4, 7, 0,146, 4, 7, 0,147, 4, 7, 0,148, 4, 7, 0,149, 4, 2, 0,150, 4, 2, 0,151, 4, 2, 0,152, 4, + 2, 0,153, 4, 2, 0,154, 4, 2, 0,155, 4, 7, 0,156, 4, 7, 0,157, 4, 7, 0,158, 4, 2, 0,159, 4, 2, 0,160, 4, + 2, 0,161, 4, 2, 0,162, 4, 2, 0,163, 4, 2, 0,164, 4, 2, 0,165, 4, 2, 0,166, 4, 2, 0,167, 4, 2, 0,168, 4, + 4, 0,169, 4, 4, 0,170, 4, 4, 0,171, 4, 4, 0,172, 4, 4, 0,173, 4, 7, 0,174, 4, 4, 0,175, 4, 4, 0,176, 4, + 4, 0,177, 4, 4, 0,178, 4, 7, 0,179, 4, 7, 0,180, 4, 7, 0,181, 4, 7, 0,182, 4, 7, 0,183, 4, 7, 0,184, 4, + 7, 0,185, 4, 7, 0,186, 4, 7, 0,187, 4, 0, 0,188, 4, 0, 0,189, 4, 4, 0,190, 4, 2, 0,191, 4, 2, 0,160, 1, + 0, 0,192, 4, 7, 0,193, 4, 7, 0,194, 4, 4, 0,195, 4, 4, 0,196, 4, 7, 0,197, 4, 7, 0,198, 4, 2, 0,199, 4, + 2, 0,200, 4, 7, 0,201, 4, 2, 0,202, 4, 2, 0,203, 4, 4, 0,204, 4, 2, 0,205, 4, 2, 0,206, 4, 2, 0,207, 4, + 2, 0,208, 4, 7, 0,209, 4, 7, 0, 70, 0, 42, 0,210, 4, 0, 0,211, 4,171, 0, 9, 0,171, 0, 0, 0,171, 0, 1, 0, + 0, 0, 20, 0, 2, 0,212, 4, 2, 0,213, 4, 2, 0,214, 4, 2, 0, 43, 0, 7, 0,215, 4, 7, 0, 70, 0,172, 0, 7, 0, + 2, 0,135, 2, 2, 0, 11, 1, 2, 0,109, 0, 2, 0,216, 4, 7, 0,217, 4, 7, 0, 70, 0, 42, 0,218, 4,173, 0, 5, 0, + 7, 0,219, 4, 0, 0, 17, 0, 0, 0, 43, 0, 0, 0, 70, 0, 0, 0,160, 1,174, 0, 24, 0, 7, 0, 15, 4, 7, 0, 16, 4, + 2, 0, 11, 1, 2, 0,220, 4, 2, 0, 18, 4, 2, 0, 19, 4, 2, 0, 20, 4, 2, 0, 21, 4, 2, 0, 22, 4, 2, 0, 23, 4, +173, 0,221, 4, 2, 0,108, 4, 2, 0,109, 4, 2, 0,110, 4, 2, 0,111, 4, 2, 0,214, 0, 2, 0,112, 4, 2, 0,113, 4, + 2, 0,120, 3,172, 0,222, 4, 2, 0,223, 4, 2, 0,114, 4, 2, 0,117, 4, 2, 0,118, 4,175, 0, 5, 0,175, 0, 0, 0, +175, 0, 1, 0, 4, 0,123, 3, 0, 0,132, 3, 4, 0, 19, 0,176, 0, 6, 0,177, 0,224, 4, 2, 0, 19, 0, 2, 0,225, 4, + 2, 0,226, 4, 2, 0,227, 4, 9, 0,228, 4,178, 0, 4, 0, 2, 0,106, 0, 2, 0,142, 2, 2, 0,126, 3, 2, 0,229, 4, +179, 0, 10, 0, 2, 0, 19, 0, 2, 0,230, 4, 2, 0,231, 4, 2, 0,232, 4,178, 0,233, 4, 9, 0,228, 4, 7, 0,234, 4, + 4, 0,235, 4, 4, 0,236, 4, 4, 0, 37, 0,180, 0, 4, 0,180, 0, 0, 0,180, 0, 1, 0, 0, 0,237, 4, 7, 0,238, 4, +181, 0, 8, 0,182, 0,239, 4,177, 0,224, 4, 7, 0,240, 4, 4, 0, 90, 0, 0, 0,241, 4, 0, 0,242, 4, 0, 0,243, 4, + 0, 0,244, 4,183, 0, 9, 0,177, 0,224, 4, 7, 0,245, 4, 7, 0,246, 4, 2, 0, 11, 1, 2, 0, 19, 0, 4, 0, 36, 0, + 4, 0,247, 4, 83, 0,248, 4, 9, 0,228, 4,184, 0, 72, 0,183, 0,249, 4,183, 0,250, 4,181, 0,251, 4, 7, 0,252, 4, + 2, 0,253, 4, 2, 0,254, 4, 7, 0,255, 4, 7, 0, 0, 5, 2, 0,126, 3, 2, 0, 1, 5, 7, 0, 2, 5, 7, 0, 3, 5, + 7, 0, 4, 5, 2, 0, 5, 5, 2, 0,236, 4, 2, 0, 6, 5, 2, 0, 7, 5, 2, 0, 8, 5, 2, 0, 9, 5, 7, 0, 10, 5, + 7, 0, 11, 5, 7, 0, 12, 5, 2, 0, 13, 5, 2, 0, 14, 5, 2, 0, 15, 5, 2, 0, 16, 5, 2, 0, 17, 5, 2, 0, 18, 5, + 2, 0, 19, 5,176, 0, 20, 5,179, 0, 21, 5, 7, 0, 22, 5, 7, 0, 23, 5, 7, 0, 24, 5, 2, 0, 25, 5, 2, 0, 70, 0, + 0, 0, 26, 5, 0, 0, 27, 5, 0, 0, 28, 5, 0, 0, 29, 5, 0, 0, 30, 5, 0, 0, 31, 5, 2, 0, 32, 5, 7, 0, 33, 5, + 7, 0, 34, 5, 7, 0, 35, 5, 7, 0, 36, 5, 7, 0, 37, 5, 7, 0, 38, 5, 7, 0, 39, 5, 7, 0, 40, 5, 7, 0, 41, 5, + 7, 0, 42, 5, 2, 0, 43, 5, 0, 0, 44, 5, 0, 0, 45, 5, 0, 0, 46, 5, 0, 0, 47, 5, 32, 0, 48, 5, 0, 0, 49, 5, + 0, 0, 50, 5, 0, 0, 51, 5, 0, 0, 52, 5, 0, 0, 53, 5, 0, 0, 54, 5, 0, 0, 55, 5, 0, 0, 56, 5, 2, 0, 57, 5, + 2, 0, 58, 5, 2, 0, 59, 5, 2, 0, 60, 5, 2, 0, 61, 5,185, 0, 8, 0, 4, 0, 62, 5, 4, 0, 63, 5, 4, 0, 64, 5, + 4, 0, 65, 5, 4, 0, 66, 5, 4, 0, 67, 5, 4, 0, 54, 0, 4, 0, 50, 2, 46, 0, 34, 0, 27, 0, 31, 0, 39, 0, 75, 0, + 32, 0, 68, 5,163, 0, 69, 5, 46, 0, 70, 5, 47, 0,206, 0, 12, 0, 71, 5,164, 0, 72, 5, 32, 0, 73, 5, 7, 0, 74, 5, + 7, 0, 75, 5, 7, 0, 76, 5, 7, 0, 77, 5, 4, 0, 25, 3, 2, 0, 19, 0, 2, 0, 4, 1, 58, 0, 0, 1,186, 0, 78, 5, +184, 0, 79, 5,187, 0, 80, 5,170, 0,180, 0,168, 0, 97, 4, 12, 0,100, 0, 12, 0, 81, 5,188, 0, 82, 5, 2, 0, 83, 5, + 2, 0, 84, 5, 2, 0,215, 0, 2, 0, 85, 5, 4, 0, 86, 5, 4, 0, 87, 5, 12, 0, 88, 5,173, 0,221, 4,174, 0, 89, 5, +189, 0, 6, 0, 47, 0,206, 0, 45, 0,255, 0, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0,106, 0, 7, 0, 90, 5,190, 0, 35, 0, + 7, 0, 91, 5, 7, 0, 92, 5, 7, 0, 93, 5, 7, 0, 94, 5, 7, 0, 95, 5, 7, 0, 96, 5, 7, 0, 97, 5, 7, 0, 98, 5, + 7, 0, 99, 5, 7, 0, 18, 1, 7, 0,100, 5, 7, 0,101, 5, 7, 0,102, 5, 7, 0,103, 5, 7, 0,171, 0, 2, 0,104, 5, + 2, 0,105, 5, 4, 0,106, 5, 2, 0,107, 5, 2, 0,108, 5, 2, 0,109, 5, 2, 0,110, 5, 7, 0,111, 5, 68, 0,112, 5, +191, 0,113, 5,190, 0,114, 5,192, 0,115, 5,193, 0,116, 5,194, 0,117, 5,195, 0,118, 5,196, 0,119, 5, 7, 0,120, 5, + 2, 0,121, 5, 2, 0,122, 5, 4, 0,160, 1,197, 0, 54, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, + 7, 0,125, 5, 2, 0,126, 5, 7, 0, 99, 5, 7, 0, 18, 1, 7, 0, 43, 0, 4, 0,127, 5, 2, 0,109, 5, 2, 0,110, 5, + 32, 0, 68, 5, 32, 0,128, 5,189, 0,129, 5,197, 0,114, 5, 0, 0,130, 5, 4, 0, 25, 3, 4, 0,131, 5, 2, 0,132, 5, + 2, 0,133, 5, 2, 0,134, 5, 2, 0,135, 5, 2, 0,160, 1, 2, 0, 19, 0, 2, 0,136, 5, 2, 0,137, 5, 7, 0,112, 0, + 7, 0,138, 5, 7, 0,139, 5, 7, 0,140, 5, 7, 0,141, 5, 7, 0,142, 5, 7, 0,171, 0, 7, 0, 74, 5, 2, 0,143, 5, + 2, 0, 62, 1, 2, 0,144, 5, 2, 0,145, 5, 2, 0,146, 5, 2, 0,147, 5, 2, 0,148, 5, 2, 0,149, 5, 2, 0,150, 5, + 2, 0,151, 5, 4, 0,152, 5, 12, 0,153, 5, 2, 0,154, 5, 2, 0, 64, 2, 2, 0,155, 5, 0, 0,156, 5, 0, 0,157, 5, + 9, 0,158, 5,191, 0,113, 5,199, 0, 25, 0, 24, 0, 36, 0, 24, 0, 64, 0, 23, 0,159, 5, 23, 0,160, 5, 23, 0,161, 5, + 7, 0,162, 5, 7, 0,163, 5, 7, 0,164, 5, 7, 0,165, 5, 2, 0,166, 5, 2, 0,167, 5, 2, 0,168, 5, 2, 0,169, 5, + 2, 0,170, 5, 2, 0, 19, 0, 2, 0,171, 5, 2, 0,172, 5, 2, 0,173, 5, 2, 0,174, 5, 2, 0,175, 5, 2, 0,135, 5, + 7, 0,176, 5, 7, 0,177, 5, 4, 0,178, 5, 4, 0,179, 5,198, 0, 6, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, + 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5,200, 0, 8, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, + 7, 0,125, 5, 2, 0,126, 5,201, 0,180, 5, 46, 0,134, 0,202, 0, 14, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, + 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5,199, 0,181, 5,203, 0,182, 5, 12, 0,183, 5, 2, 0, 11, 1, 2, 0, 19, 0, + 2, 0,184, 5, 0, 0,185, 5, 0, 0,186, 5,204, 0, 20, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, + 7, 0,125, 5, 2, 0,126, 5,192, 0,115, 5,199, 0,181, 5, 2, 0,187, 5, 2, 0,188, 5, 2, 0,189, 5, 2, 0,190, 5, + 2, 0,171, 5, 2, 0,191, 5, 0, 0, 19, 0, 0, 0, 77, 1, 9, 0,250, 1, 4, 0,192, 5, 4, 0,193, 5, 27, 0,194, 5, +205, 0, 16, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5,199, 0,181, 5, + 7, 0, 14, 2, 7, 0, 15, 2, 2, 0,187, 5, 2, 0,195, 5, 2, 0,196, 5, 2, 0,197, 5, 4, 0, 19, 0, 7, 0,198, 5, +191, 0,113, 5,206, 0, 15, 0, 0, 0,199, 5, 0, 0,200, 5, 0, 0,201, 5, 2, 0, 19, 0, 2, 0,202, 5, 2, 0,203, 5, + 2, 0,103, 1, 2, 0,204, 5, 2, 0, 37, 0, 4, 0,205, 5, 4, 0,206, 5, 2, 0,207, 5, 2, 0,208, 5, 0, 0,209, 5, + 0, 0,210, 5,207, 0, 16, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 4, 0, 37, 0,206, 0,211, 5, +208, 0,212, 5, 12, 0,213, 5, 12, 0,214, 5,209, 0,215, 5,196, 0,216, 5,210, 0,217, 5, 2, 0,218, 5, 2, 0,219, 5, + 2, 0,220, 5, 2, 0, 70, 0,211, 0, 17, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5, + 2, 0,126, 5,199, 0,181, 5, 12, 0,221, 5,212, 0,222, 5, 0, 0,223, 5,213, 0,224, 5, 4, 0,225, 5, 4, 0,226, 5, + 2, 0, 19, 0, 2, 0,227, 5, 2, 0,228, 5, 2, 0, 37, 0,214, 0, 29, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, + 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5, 47, 0,150, 2, 45, 0,255, 0, 61, 0,229, 5, 2, 0,133, 0, 2, 0,230, 5, + 2, 0, 70, 0, 2, 0,231, 5, 4, 0, 19, 0, 2, 0,232, 5, 2, 0,186, 5, 2, 0,185, 5, 2, 0,160, 1, 0, 0,233, 5, + 0, 0,234, 5, 0, 0,235, 5, 0, 0,135, 5, 7, 0, 14, 2, 7, 0, 15, 2, 7, 0,198, 5, 7, 0, 62, 1, 7, 0,236, 5, + 7, 0,237, 5,191, 0,113, 5,215, 0, 11, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5, + 2, 0,126, 5, 2, 0,184, 5, 2, 0, 19, 0, 4, 0, 37, 0,203, 0,182, 5,199, 0,181, 5,216, 0, 27, 0,198, 0, 0, 0, +198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5, 42, 0,238, 5, 4, 0,239, 5, 4, 0,240, 5, + 2, 0, 90, 0, 2, 0,133, 0, 2, 0,241, 5, 0, 0,242, 5, 0, 0,243, 5, 4, 0,244, 5, 4, 0,245, 5, 4, 0,246, 5, + 4, 0,247, 5, 2, 0,248, 5, 2, 0,249, 5, 7, 0,250, 5, 23, 0,251, 5, 23, 0,252, 5, 4, 0,253, 5, 4, 0,254, 5, + 0, 0,255, 5, 0, 0, 0, 6,217, 0, 10, 0, 27, 0, 31, 0, 9, 0, 1, 6, 9, 0, 2, 6, 9, 0, 3, 6, 9, 0, 4, 6, + 9, 0, 5, 6, 4, 0, 90, 0, 4, 0, 6, 6, 0, 0, 7, 6, 0, 0, 8, 6,218, 0, 10, 0,198, 0, 0, 0,198, 0, 1, 0, + 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5,217, 0, 9, 6, 2, 0, 90, 0, 2, 0,133, 0, 4, 0, 43, 0, 9, 0, 10, 6, +219, 0, 8, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5,199, 0,181, 5, 4, 0, 19, 0, + 4, 0, 11, 6,220, 0, 23, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5, +199, 0,181, 5, 27, 0, 12, 6, 27, 0, 81, 0, 2, 0, 19, 0, 2, 0,133, 0, 7, 0, 13, 6, 9, 0, 14, 6, 7, 0, 14, 2, + 7, 0, 15, 2, 7, 0, 15, 6, 7, 0, 16, 6, 58, 0, 0, 1, 58, 0, 17, 6, 4, 0, 18, 6, 2, 0, 19, 6, 2, 0, 37, 0, +191, 0,113, 5,221, 0, 10, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5, + 2, 0, 19, 0, 2, 0, 34, 3, 4, 0, 37, 0,191, 0,113, 5,222, 0, 42, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, + 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5,199, 0,181, 5,208, 0,212, 5, 0, 0,199, 5, 0, 0,200, 5, 0, 0,201, 5, + 2, 0, 17, 0, 2, 0,208, 5, 2, 0, 19, 0, 2, 0,202, 5, 9, 0, 14, 6, 4, 0,205, 5, 4, 0, 20, 6, 4, 0, 21, 6, + 4, 0,206, 5, 23, 0, 22, 6, 23, 0, 23, 6, 7, 0, 24, 6, 7, 0, 25, 6, 7, 0, 26, 6, 7, 0, 13, 6, 2, 0, 27, 6, + 2, 0,205, 0, 2, 0,103, 1, 2, 0,204, 5, 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 28, 6, 2, 0, 29, 6, 9, 0, 30, 6, + 9, 0, 31, 6, 9, 0, 32, 6, 9, 0, 33, 6, 9, 0, 34, 6, 2, 0, 35, 6, 0, 0,210, 5, 57, 0, 36, 6,223, 0, 7, 0, +223, 0, 0, 0,223, 0, 1, 0, 4, 0, 37, 6, 4, 0, 23, 0, 0, 0, 84, 0, 4, 0, 38, 6, 4, 0, 17, 0,224, 0, 13, 0, +198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5, 4, 0, 17, 0, 4, 0, 39, 6, + 4, 0, 19, 0, 4, 0,241, 5, 12, 0, 40, 6, 12, 0, 41, 6, 0, 0, 42, 6,225, 0, 7, 0,225, 0, 0, 0,225, 0, 1, 0, + 0, 0, 43, 6, 2, 0, 44, 6, 2, 0, 45, 6, 2, 0, 46, 6, 2, 0, 37, 0,226, 0, 12, 0, 2, 0, 45, 6, 2, 0, 47, 6, + 2, 0, 48, 6, 0, 0,115, 2, 2, 0, 49, 6, 2, 0, 50, 6, 2, 0, 51, 6, 2, 0, 52, 6, 2, 0, 53, 6, 2, 0,171, 5, + 7, 0, 54, 6, 7, 0, 55, 6,227, 0, 18, 0,227, 0, 0, 0,227, 0, 1, 0, 0, 0,132, 3,226, 0, 56, 6,226, 0, 57, 6, +226, 0, 58, 6,226, 0, 59, 6, 7, 0, 60, 6, 2, 0, 61, 6, 2, 0, 62, 6, 2, 0, 63, 6, 2, 0, 64, 6, 2, 0, 65, 6, + 2, 0, 66, 6, 2, 0, 67, 6, 2, 0, 68, 6, 2, 0, 69, 6, 2, 0, 70, 6,228, 0, 10, 0, 0, 0, 71, 6, 0, 0, 72, 6, + 0, 0, 73, 6, 0, 0, 74, 6, 0, 0, 75, 6, 0, 0, 76, 6, 2, 0, 77, 6, 2, 0, 78, 6, 2, 0, 79, 6, 2, 0, 37, 0, +229, 0, 8, 0, 0, 0, 80, 6, 0, 0, 81, 6, 0, 0, 82, 6, 0, 0, 83, 6, 0, 0, 84, 6, 0, 0, 85, 6, 7, 0, 90, 5, + 7, 0, 37, 0,230, 0, 17, 0,228, 0, 86, 6,228, 0, 87, 6,228, 0, 88, 6,228, 0, 89, 6,228, 0, 90, 6,228, 0, 91, 6, +228, 0, 92, 6,228, 0, 93, 6,228, 0, 94, 6,228, 0, 95, 6,228, 0, 96, 6,228, 0, 97, 6,228, 0, 98, 6,228, 0, 99, 6, +228, 0,100, 6,229, 0,101, 6, 0, 0,102, 6,231, 0, 71, 0, 0, 0,103, 6, 0, 0,104, 6, 0, 0, 75, 6, 0, 0,105, 6, + 0, 0,106, 6, 0, 0,107, 6, 0, 0,108, 6, 0, 0,109, 6, 0, 0,110, 6, 0, 0,111, 6, 0, 0,112, 6, 0, 0,113, 6, + 0, 0,114, 6, 0, 0,115, 6, 0, 0,116, 6, 0, 0,117, 6, 0, 0,118, 6, 0, 0,119, 6, 0, 0,120, 6, 0, 0,121, 6, + 0, 0,122, 6, 0, 0,123, 6, 0, 0,124, 6, 0, 0,125, 6, 0, 0,126, 6, 0, 0,127, 6, 0, 0,128, 6, 0, 0,129, 6, + 0, 0,130, 6, 0, 0,131, 6, 0, 0,132, 6, 0, 0,133, 6, 0, 0,134, 6, 0, 0,135, 6, 0, 0,136, 6, 0, 0,137, 6, + 0, 0,138, 6, 0, 0,139, 6, 0, 0,140, 6, 0, 0,141, 6, 0, 0,142, 6, 0, 0,143, 6, 0, 0,144, 6, 0, 0,145, 6, + 0, 0,146, 6, 0, 0,147, 6, 0, 0,148, 6, 0, 0,149, 6, 0, 0,150, 6, 0, 0,151, 6, 0, 0,152, 6, 0, 0,153, 6, + 0, 0,154, 6, 0, 0,155, 6, 0, 0,156, 6, 0, 0,157, 6, 0, 0,158, 6, 0, 0,159, 6, 0, 0,160, 6, 0, 0,161, 6, + 0, 0,162, 6, 0, 0,163, 6, 0, 0,164, 6, 0, 0,165, 6, 0, 0,166, 6, 0, 0,167, 6, 0, 0,168, 6, 0, 0,169, 6, + 0, 0,170, 6, 0, 0,171, 6, 0, 0, 92, 0,232, 0, 5, 0, 0, 0,172, 6, 0, 0,127, 6, 0, 0,129, 6, 2, 0, 19, 0, + 2, 0, 37, 0,233, 0, 21, 0,233, 0, 0, 0,233, 0, 1, 0, 0, 0, 20, 0,230, 0,173, 6,231, 0,174, 6,231, 0,175, 6, +231, 0,176, 6,231, 0,177, 6,231, 0,178, 6,231, 0,179, 6,231, 0,180, 6,231, 0,181, 6,231, 0,182, 6,231, 0,183, 6, +231, 0,184, 6,231, 0,185, 6,231, 0,186, 6,231, 0,187, 6,231, 0,188, 6,231, 0,189, 6,232, 0,190, 6,234, 0, 5, 0, + 4, 0, 19, 0, 4, 0, 37, 0, 7, 0, 63, 2, 7, 0,191, 6, 7, 0,228, 1,235, 0, 67, 0, 4, 0, 19, 0, 4, 0,192, 6, + 4, 0,193, 6, 0, 0,194, 6, 0, 0,195, 6, 0, 0,196, 6, 0, 0,197, 6, 0, 0,198, 6, 0, 0,199, 6, 0, 0,200, 6, + 0, 0,201, 6, 0, 0,202, 6, 2, 0,203, 6, 2, 0, 37, 0, 4, 0,204, 6, 4, 0,205, 6, 4, 0,206, 6, 4, 0,207, 6, + 2, 0,208, 6, 2, 0,209, 6, 4, 0,210, 6, 4, 0, 40, 6, 4, 0,211, 6, 2, 0,212, 6, 2, 0,213, 6, 2, 0,214, 6, + 2, 0,215, 6, 12, 0,216, 6, 12, 0,217, 6, 12, 0,218, 6, 2, 0,219, 6, 2, 0,220, 6, 2, 0,221, 6, 2, 0,222, 6, + 2, 0,223, 6, 2, 0,224, 6, 2, 0,225, 6, 2, 0,226, 6,234, 0,227, 6, 2, 0,228, 6, 2, 0,229, 6, 2, 0,230, 6, + 2, 0,231, 6, 2, 0,232, 6, 2, 0,233, 6, 2, 0,234, 6, 2, 0,235, 6, 4, 0,236, 6, 4, 0,237, 6, 2, 0,238, 6, + 2, 0,239, 6, 2, 0,240, 6, 2, 0,241, 6, 2, 0,242, 6, 2, 0,243, 6, 2, 0,244, 6, 2, 0,245, 6, 2, 0,246, 6, + 2, 0,247, 6, 2, 0,248, 6, 2, 0,249, 6, 0, 0,250, 6, 0, 0,251, 6, 7, 0,252, 6, 2, 0, 25, 5, 2, 0,253, 6, + 55, 0,254, 6,201, 0, 21, 0, 27, 0, 31, 0, 12, 0,255, 6, 12, 0, 0, 7, 12, 0, 1, 7, 12, 0,123, 5, 46, 0,134, 0, + 46, 0, 2, 7, 2, 0, 3, 7, 2, 0, 4, 7, 2, 0, 5, 7, 2, 0, 6, 7, 2, 0, 7, 7, 2, 0, 8, 7, 2, 0, 9, 7, + 2, 0, 37, 0, 2, 0, 10, 7, 2, 0, 11, 7, 4, 0, 70, 0,196, 0, 12, 7, 9, 0, 13, 7, 2, 0, 14, 7,236, 0, 5, 0, +236, 0, 0, 0,236, 0, 1, 0,236, 0, 15, 7, 13, 0, 16, 7, 4, 0, 19, 0,237, 0, 7, 0,237, 0, 0, 0,237, 0, 1, 0, +236, 0, 17, 7,236, 0, 18, 7, 2, 0,137, 4, 2, 0, 19, 0, 4, 0, 37, 0,238, 0, 23, 0,238, 0, 0, 0,238, 0, 1, 0, +239, 0, 19, 7,240, 0,217, 5, 0, 0, 20, 7, 0, 0, 21, 7, 0, 0, 22, 7, 2, 0, 23, 7, 2, 0, 24, 7, 2, 0, 25, 7, + 2, 0, 26, 7, 2, 0, 27, 7, 2, 0, 37, 0, 2, 0, 19, 0, 2, 0, 28, 7, 2, 0, 29, 7, 2, 0, 30, 7, 4, 0, 31, 7, +238, 0, 32, 7, 9, 0, 33, 7, 4, 0, 34, 7, 4, 0, 35, 7, 0, 0, 36, 7,241, 0, 22, 0,241, 0, 0, 0,241, 0, 1, 0, +236, 0, 17, 7,236, 0, 18, 7,236, 0, 37, 7,236, 0, 38, 7,201, 0, 39, 7, 23, 0, 52, 0, 0, 0,124, 5, 0, 0, 40, 7, + 2, 0,172, 5, 2, 0,173, 5, 2, 0, 41, 7, 2, 0, 37, 0, 2, 0, 6, 7, 2, 0, 38, 6, 2, 0, 19, 0,242, 0, 19, 7, + 12, 0, 42, 7, 12, 0,123, 5, 12, 0, 43, 7, 12, 0, 44, 7,243, 0, 21, 0,243, 0, 0, 0,243, 0, 1, 0,199, 0,181, 5, + 23, 0, 45, 7, 23, 0, 46, 7, 2, 0,172, 5, 2, 0,173, 5, 2, 0, 47, 7, 2, 0, 48, 7, 2, 0, 49, 7, 2, 0, 19, 0, + 7, 0, 10, 2, 2, 0, 5, 7, 2, 0, 9, 7, 4, 0, 43, 0,244, 0, 19, 7, 12, 0, 50, 7, 12, 0, 51, 7, 12, 0, 43, 7, + 0, 0, 52, 7, 9, 0, 53, 7,245, 0, 11, 0, 0, 0, 54, 7, 2, 0, 55, 7, 2, 0, 56, 7, 2, 0, 57, 7, 2, 0, 58, 7, + 2, 0,126, 4, 2, 0,121, 4,201, 0, 59, 7, 46, 0, 60, 7, 4, 0, 61, 7, 4, 0, 62, 7,246, 0, 1, 0, 0, 0, 63, 7, +247, 0, 8, 0, 57, 0, 64, 7, 57, 0, 65, 7,247, 0, 66, 7,247, 0, 67, 7,247, 0, 68, 7, 2, 0,129, 0, 2, 0, 19, 0, + 4, 0, 69, 7,248, 0, 4, 0, 4, 0,239, 5, 4, 0, 70, 7, 4, 0,244, 5, 4, 0, 71, 7,249, 0, 2, 0, 4, 0, 72, 7, + 4, 0, 73, 7,250, 0, 7, 0, 7, 0, 74, 7, 7, 0, 75, 7, 7, 0, 76, 7, 4, 0, 19, 0, 4, 0, 37, 0, 7, 0, 10, 4, + 7, 0, 77, 7,251, 0, 6, 0, 0, 0, 78, 7, 0, 0,201, 5, 49, 0,137, 0, 2, 0,106, 0, 2, 0,125, 4, 4, 0, 37, 0, +252, 0, 21, 0,252, 0, 0, 0,252, 0, 1, 0, 4, 0, 57, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 0, 79, 7, 4, 0, 80, 7, + 4, 0, 81, 7,246, 0, 82, 7, 0, 0, 78, 7, 4, 0, 83, 7, 4, 0, 84, 7,251, 0, 8, 3,248, 0, 85, 7,249, 0, 86, 7, +250, 0, 87, 7,247, 0, 88, 7,247, 0, 89, 7,247, 0, 90, 7, 57, 0, 91, 7, 57, 0, 92, 7,253, 0, 12, 0, 0, 0,190, 1, + 9, 0,191, 0, 0, 0,192, 0, 4, 0,195, 0, 4, 0,203, 0, 9, 0,196, 0, 7, 0,198, 0, 7, 0,199, 0, 9, 0, 93, 7, + 9, 0, 94, 7, 9, 0,200, 0, 9, 0,202, 0,254, 0, 43, 0,254, 0, 0, 0,254, 0, 1, 0, 9, 0, 95, 7, 9, 0, 26, 0, + 0, 0, 27, 0, 4, 0, 19, 0, 4, 0, 17, 0, 4, 0, 23, 0, 4, 0, 88, 0, 4, 0, 96, 7, 4, 0, 97, 7, 4, 0, 80, 7, + 4, 0, 81, 7, 4, 0, 98, 7, 4, 0,214, 0, 4, 0, 99, 7, 4, 0,100, 7, 7, 0,246, 4, 7, 0,101, 7, 4, 0,126, 0, + 4, 0,102, 7,252, 0,103, 7, 36, 0, 80, 0, 46, 0,134, 0, 49, 0,137, 0, 7, 0,104, 7, 7, 0,105, 7,253, 0, 1, 1, +254, 0,106, 7,254, 0,107, 7,254, 0,108, 7, 12, 0,109, 7,255, 0,110, 7, 0, 1,111, 7, 7, 0,112, 7, 7, 0,113, 7, + 4, 0,114, 7, 7, 0,115, 7, 9, 0,116, 7, 4, 0,117, 7, 4, 0,118, 7, 4, 0,119, 7, 7, 0,120, 7, 1, 1, 4, 0, + 1, 1, 0, 0, 1, 1, 1, 0, 12, 0,121, 7,254, 0,122, 7,186, 0, 6, 0, 12, 0,123, 7, 12, 0,109, 7, 12, 0,124, 7, +254, 0,125, 7, 0, 0,126, 7, 0, 0,127, 7, 2, 1, 4, 0, 7, 0,128, 7, 7, 0,109, 0, 2, 0,129, 7, 2, 0,130, 7, + 3, 1, 6, 0, 7, 0,131, 7, 7, 0,132, 7, 7, 0,133, 7, 7, 0,134, 7, 4, 0,135, 7, 4, 0,136, 7, 4, 1, 12, 0, + 7, 0,137, 7, 7, 0,138, 7, 7, 0,139, 7, 7, 0,140, 7, 7, 0,141, 7, 7, 0,142, 7, 7, 0,143, 7, 7, 0,144, 7, + 7, 0,145, 7, 7, 0,146, 7, 4, 0,154, 2, 4, 0,147, 7, 5, 1, 2, 0, 7, 0,219, 4, 7, 0, 37, 0, 6, 1, 5, 0, + 7, 0,148, 7, 7, 0,149, 7, 4, 0, 90, 0, 4, 0,116, 2, 4, 0,150, 7, 7, 1, 6, 0, 7, 1, 0, 0, 7, 1, 1, 0, + 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,151, 7, 2, 0, 57, 0, 8, 1, 8, 0, 8, 1, 0, 0, 8, 1, 1, 0, 2, 0, 17, 0, + 2, 0, 19, 0, 2, 0,151, 7, 2, 0, 57, 0, 7, 0, 23, 0, 7, 0,126, 0, 9, 1, 45, 0, 9, 1, 0, 0, 9, 1, 1, 0, + 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,151, 7, 2, 0,210, 0, 2, 0,182, 3, 2, 0,152, 7, 7, 0,153, 7, 7, 0, 89, 0, + 7, 0,167, 2, 4, 0,154, 7, 4, 0, 82, 0, 4, 0,118, 2, 7, 0,155, 7, 7, 0,156, 7, 7, 0,157, 7, 7, 0,158, 7, + 7, 0,159, 7, 7, 0,160, 7, 7, 0,164, 2, 7, 0,254, 0, 7, 0,161, 7, 7, 0,162, 7, 7, 0, 37, 0, 7, 0,163, 7, + 7, 0,164, 7, 7, 0,165, 7, 2, 0,166, 7, 2, 0,167, 7, 2, 0,168, 7, 2, 0,169, 7, 2, 0,170, 7, 2, 0,171, 7, + 2, 0,172, 7, 2, 0,173, 7, 2, 0,136, 5, 2, 0,174, 7, 2, 0,210, 1, 2, 0,175, 7, 0, 0,176, 7, 0, 0,177, 7, + 7, 0,208, 0, 10, 1,178, 7, 64, 0,163, 1, 11, 1, 16, 0, 11, 1, 0, 0, 11, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, + 2, 0,151, 7, 2, 0,210, 0, 7, 0,159, 2, 7, 0,160, 2, 7, 0,161, 2, 7, 0,255, 1, 7, 0,162, 2, 7, 0,163, 2, + 7, 0,179, 7, 7, 0,164, 2, 7, 0,166, 2, 7, 0,167, 2,213, 0, 5, 0, 2, 0, 17, 0, 2, 0, 69, 7, 2, 0, 19, 0, + 2, 0,180, 7, 27, 0, 12, 6,212, 0, 3, 0, 4, 0, 69, 0, 4, 0,181, 7,213, 0, 2, 0, 12, 1, 7, 0, 12, 1, 0, 0, + 12, 1, 1, 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 22, 0, 9, 0,182, 7, 13, 1, 5, 0, 0, 0, 20, 0, + 7, 0, 18, 1, 7, 0,183, 7, 4, 0,184, 7, 4, 0, 37, 0, 14, 1, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 43, 0, + 2, 0, 70, 0, 15, 1, 4, 0, 0, 0, 20, 0, 63, 0,185, 7, 7, 0, 18, 1, 7, 0, 37, 0, 16, 1, 6, 0, 2, 0,186, 7, + 2, 0,187, 7, 2, 0, 17, 0, 2, 0,188, 7, 0, 0,189, 7, 0, 0,190, 7, 17, 1, 5, 0, 4, 0, 17, 0, 4, 0, 37, 0, + 0, 0, 20, 0, 0, 0,191, 7, 0, 0,192, 7, 18, 1, 3, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0, 19, 1, 4, 0, + 2, 0,193, 7, 2, 0,194, 7, 2, 0, 19, 0, 2, 0, 37, 0, 20, 1, 6, 0, 0, 0, 20, 0, 0, 0,195, 7, 2, 0,196, 7, + 2, 0,164, 2, 2, 0, 11, 1, 2, 0, 70, 0, 21, 1, 5, 0, 0, 0, 20, 0, 7, 0,109, 0, 7, 0, 12, 4, 2, 0, 19, 0, + 2, 0,130, 2, 22, 1, 3, 0, 0, 0, 20, 0, 4, 0,118, 2, 4, 0,193, 7, 23, 1, 7, 0, 0, 0, 20, 0, 7, 0, 12, 4, + 0, 0,197, 7, 0, 0,198, 7, 2, 0, 11, 1, 2, 0, 43, 0, 4, 0,199, 7, 24, 1, 3, 0, 32, 0,200, 7, 0, 0,201, 7, + 0, 0,202, 7, 25, 1, 18, 0, 25, 1, 0, 0, 25, 1, 1, 0, 2, 0, 17, 0, 2, 0,203, 7, 2, 0, 19, 0, 2, 0,204, 7, + 2, 0,205, 7, 2, 0,206, 7, 2, 0, 43, 0, 2, 0, 70, 0, 0, 0, 20, 0, 9, 0, 2, 0, 26, 1,207, 7, 32, 0, 45, 0, + 2, 0,229, 4, 2, 0,112, 7, 2, 0,208, 7, 2, 0, 37, 0, 27, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0, 0, 0,209, 7, + 2, 0, 19, 0, 2, 0,130, 2, 2, 0,210, 7, 4, 0,211, 7, 4, 0,212, 7, 4, 0,213, 7, 4, 0,214, 7, 4, 0,215, 7, + 28, 1, 1, 0, 0, 0,216, 7, 29, 1, 4, 0, 42, 0,238, 5, 0, 0,217, 7, 4, 0, 11, 1, 4, 0, 19, 0, 26, 1, 18, 0, + 26, 1, 0, 0, 26, 1, 1, 0, 26, 1,218, 7, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,219, 7, 2, 0,206, 7, 2, 0,203, 7, + 2, 0,220, 7, 2, 0, 70, 0, 2, 0,160, 1, 0, 0, 20, 0, 9, 0, 2, 0, 30, 1,207, 7, 25, 1,221, 7, 2, 0, 15, 0, + 2, 0,222, 7, 4, 0,223, 7, 31, 1, 3, 0, 4, 0,190, 2, 4, 0, 37, 0, 32, 0, 45, 0, 32, 1, 12, 0,151, 0,224, 7, + 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,153, 7, 4, 0, 89, 0, 0, 0, 20, 0, 0, 0,225, 7, 2, 0,226, 7, 2, 0,227, 7, + 2, 0,228, 7, 2, 0,229, 7, 7, 0,230, 7, 33, 1, 10, 0, 2, 0, 19, 0, 2, 0,231, 7, 4, 0,153, 7, 4, 0, 89, 0, + 2, 0,232, 7,255, 0,110, 7, 2, 0, 17, 0, 2, 0,233, 7, 2, 0,234, 7, 2, 0,235, 7, 34, 1, 7, 0, 2, 0, 19, 0, + 2, 0,231, 7, 4, 0,153, 7, 4, 0, 89, 0, 2, 0, 17, 0, 2, 0,236, 7, 7, 0,139, 3, 35, 1, 11, 0, 4, 0,190, 2, + 2, 0, 17, 0, 2, 0, 19, 0, 32, 0, 45, 0, 77, 0,237, 7, 0, 0, 20, 0, 7, 0,238, 7, 7, 0,239, 7, 7, 0, 42, 3, + 2, 0,240, 7, 2, 0,241, 7, 36, 1, 5, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 37, 0, 46, 0,134, 0, 32, 0, 68, 5, + 37, 1, 5, 0, 4, 0, 19, 0, 4, 0, 17, 0, 0, 0, 20, 0, 0, 0,191, 7, 32, 0, 45, 0, 38, 1, 13, 0, 2, 0, 19, 0, + 2, 0, 17, 0, 2, 0,203, 7, 2, 0, 43, 3, 7, 0,242, 7, 7, 0,243, 7, 7, 0, 6, 1, 7, 0, 7, 1, 7, 0, 19, 3, + 7, 0, 22, 3, 7, 0,244, 7, 7, 0,245, 7, 32, 0,246, 7, 39, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,153, 7, + 4, 0, 89, 0, 0, 0, 20, 0, 0, 0,225, 7, 2, 0, 43, 0, 2, 0, 64, 0, 2, 0,247, 7, 2, 0,248, 7, 40, 1, 8, 0, + 32, 0, 45, 0, 7, 0,161, 2, 7, 0,249, 7, 7, 0,250, 7, 7, 0,156, 2, 2, 0, 19, 0, 2, 0,130, 2, 7, 0,251, 7, + 41, 1, 12, 0, 2, 0, 17, 0, 2, 0, 11, 1, 2, 0, 19, 0, 2, 0,164, 2, 2, 0,190, 2, 2, 0,252, 7, 4, 0, 37, 0, + 7, 0,253, 7, 7, 0,254, 7, 7, 0,255, 7, 7, 0, 0, 8, 0, 0, 1, 8, 42, 1, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, + 4, 0,153, 7, 4, 0, 89, 0, 0, 0, 20, 0, 2, 0, 77, 1, 2, 0, 64, 0, 2, 0,247, 7, 2, 0,248, 7, 64, 0,163, 1, + 43, 1, 7, 0, 4, 0,118, 2, 4, 0, 2, 8, 4, 0, 3, 8, 4, 0, 4, 8, 7, 0, 5, 8, 7, 0, 6, 8, 0, 0,197, 7, + 44, 1, 7, 0, 0, 0, 7, 8, 32, 0, 8, 8, 0, 0,201, 7, 2, 0, 9, 8, 2, 0, 43, 0, 4, 0, 70, 0, 0, 0,202, 7, + 45, 1, 6, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,153, 7, 4, 0, 89, 0, 0, 0, 10, 8, 0, 0, 11, 8, 46, 1, 1, 0, + 4, 0, 19, 0, 47, 1, 6, 0, 0, 0, 92, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 12, 8, 7, 0, 13, 8, 42, 0,238, 5, + 48, 1, 4, 0, 0, 0,179, 0, 2, 0, 19, 0, 4, 0, 17, 0, 32, 0, 45, 0, 49, 1, 2, 0, 4, 0, 17, 0, 4, 0,161, 5, + 30, 1, 10, 0, 30, 1, 0, 0, 30, 1, 1, 0, 30, 1,218, 7, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,203, 7, 2, 0, 14, 8, + 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 45, 0, 50, 1, 10, 0, 7, 0, 42, 3, 7, 0, 15, 8, 7, 0, 16, 8, 7, 0, 17, 8, + 7, 0, 18, 8, 4, 0, 19, 0, 7, 0,252, 7, 7, 0, 19, 8, 7, 0, 20, 8, 7, 0, 37, 0,255, 0, 20, 0, 27, 0, 31, 0, + 0, 0,190, 0, 51, 1, 21, 8, 9, 0, 22, 8, 43, 0,149, 0, 43, 0, 23, 8, 9, 0, 24, 8, 36, 0, 80, 0, 7, 0,139, 3, + 7, 0, 25, 8, 7, 0, 26, 8, 7, 0, 27, 8, 7, 0, 28, 8, 7, 0, 29, 8, 7, 0, 30, 8, 4, 0, 90, 0, 4, 0, 31, 8, + 0, 0, 32, 8, 0, 0, 33, 8, 0, 0, 34, 8, 52, 1, 6, 0, 27, 0, 31, 0, 7, 0, 35, 8, 7, 0, 36, 8, 7, 0, 37, 8, + 2, 0, 38, 8, 2, 0, 39, 8, 53, 1, 15, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, 4, 0,124, 5, 7, 0,125, 5, +241, 0, 40, 8,199, 0,181, 5,255, 0,110, 7, 2, 0, 11, 1, 2, 0,231, 7, 2, 0, 14, 2, 2, 0, 15, 2, 2, 0, 19, 0, + 2, 0,186, 5, 4, 0, 70, 0, 54, 1, 6, 0, 54, 1, 0, 0, 54, 1, 1, 0, 32, 0, 45, 0, 9, 0, 41, 8, 4, 0,215, 0, + 4, 0, 37, 0, 64, 0, 4, 0, 27, 0, 31, 0, 12, 0, 42, 8, 4, 0,131, 0, 7, 0, 43, 8, 55, 1, 25, 0, 55, 1, 0, 0, + 55, 1, 1, 0, 55, 1, 38, 0, 12, 0, 44, 8, 0, 0, 20, 0, 7, 0, 45, 8, 7, 0, 46, 8, 7, 0, 47, 8, 7, 0, 48, 8, + 4, 0, 19, 0, 7, 0, 49, 8, 7, 0, 50, 8, 7, 0, 51, 8, 7, 0, 18, 1, 7, 0,220, 1, 7, 0, 52, 8, 7, 0,116, 2, + 7, 0, 53, 8, 7, 0, 54, 8, 7, 0, 55, 8, 7, 0, 56, 8, 7, 0, 57, 8, 7, 0,172, 0, 2, 0,131, 0, 2, 0, 6, 5, + 56, 1, 21, 0, 27, 0, 31, 0, 12, 0, 58, 8, 12, 0, 59, 8, 12, 0, 60, 8, 9, 0, 61, 8, 4, 0, 19, 0, 4, 0,132, 5, + 2, 0,168, 2, 2, 0,192, 5, 2, 0,131, 0, 2, 0, 62, 8, 2, 0, 63, 8, 2, 0, 64, 8, 2, 0, 65, 8, 2, 0, 66, 8, + 4, 0, 67, 8, 4, 0, 68, 8, 4, 0, 69, 8, 4, 0, 70, 8, 4, 0, 71, 8, 4, 0, 72, 8, 57, 1, 38, 0, 57, 1, 0, 0, + 57, 1, 1, 0, 26, 0, 73, 8, 12, 0, 69, 3, 0, 0, 20, 0, 2, 0, 19, 0, 2, 0, 74, 8, 2, 0, 75, 8, 2, 0, 76, 8, + 2, 0, 28, 3, 2, 0, 77, 8, 4, 0,253, 1, 4, 0, 69, 8, 4, 0, 70, 8, 55, 1, 78, 8, 57, 1, 38, 0, 57, 1, 79, 8, + 12, 0, 80, 8, 9, 0, 81, 8, 9, 0, 82, 8, 9, 0, 83, 8, 7, 0, 6, 1, 7, 0,172, 0, 7, 0, 84, 8, 7, 0,200, 1, + 2, 0, 85, 8, 2, 0, 37, 0, 7, 0, 86, 8, 7, 0, 87, 8, 7, 0, 24, 3, 7, 0, 88, 8, 7, 0, 89, 8, 7, 0, 90, 8, + 7, 0, 91, 8, 7, 0, 92, 8, 7, 0, 93, 8, 7, 0,250, 1, 32, 0, 94, 8,152, 0, 9, 0, 12, 0, 95, 8, 2, 0, 19, 0, + 2, 0, 96, 8, 7, 0, 26, 2, 7, 0, 97, 8, 7, 0, 98, 8, 12, 0, 99, 8, 4, 0,100, 8, 4, 0, 37, 0, 58, 1, 7, 0, + 58, 1, 0, 0, 58, 1, 1, 0, 12, 0, 32, 8, 4, 0, 19, 0, 4, 0,101, 8, 0, 0,132, 3,232, 0,102, 8,151, 0, 7, 0, + 27, 0, 31, 0, 12, 0,103, 8, 12, 0, 95, 8, 12, 0,104, 8, 12, 0,100, 0, 4, 0, 19, 0, 4, 0,105, 8,203, 0, 4, 0, + 27, 0,106, 8, 12, 0, 95, 8, 4, 0,107, 8, 4, 0, 19, 0, 59, 1, 17, 0,198, 0, 0, 0,198, 0, 1, 0, 12, 0,123, 5, + 4, 0,124, 5, 7, 0,125, 5, 2, 0,126, 5,199, 0,181, 5,151, 0, 11, 3,203, 0,108, 8, 0, 0, 11, 1, 0, 0,184, 5, + 2, 0, 19, 0, 2, 0,109, 8, 2, 0,185, 5, 2, 0,186, 5, 2, 0,110, 8, 7, 0,111, 8, 60, 1, 8, 0, 60, 1, 0, 0, + 60, 1, 1, 0, 58, 1,112, 8, 36, 0, 80, 0, 12, 0, 14, 3, 4, 0, 19, 0, 0, 0, 20, 0, 4, 0,113, 8, 61, 1, 5, 0, + 61, 1, 0, 0, 61, 1, 1, 0, 36, 0, 80, 0, 2, 0, 19, 0, 0, 0,114, 8, 62, 1, 12, 0, 62, 1, 0, 0, 62, 1, 1, 0, + 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,115, 8, 0, 0,116, 8, 0, 0,114, 8, 7, 0,117, 8, 7, 0,118, 8, + 4, 0, 37, 0, 36, 0, 80, 0, 63, 1, 9, 0, 63, 1, 0, 0, 63, 1, 1, 0, 32, 0,119, 8, 0, 0,120, 8, 7, 0,121, 8, + 2, 0,122, 8, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0, 37, 0, 64, 1, 7, 0, 42, 0,238, 5, 26, 0, 73, 8, 4, 0, 19, 0, + 4, 0,123, 8, 12, 0,124, 8, 32, 0,119, 8, 0, 0,120, 8, 65, 1, 12, 0, 32, 0,119, 8, 2, 0,125, 8, 2, 0, 19, 0, + 2, 0,126, 8, 2, 0,127, 8, 0, 0,120, 8, 32, 0,128, 8, 0, 0,129, 8, 7, 0,130, 8, 7, 0,220, 1, 7, 0,131, 8, + 7, 0,132, 8, 66, 1, 6, 0, 32, 0,119, 8, 4, 0,133, 8, 4, 0,134, 8, 4, 0, 90, 0, 4, 0, 37, 0, 0, 0,120, 8, + 67, 1, 4, 0, 32, 0,119, 8, 4, 0, 19, 0, 4, 0,133, 8, 0, 0,120, 8, 68, 1, 4, 0, 32, 0,119, 8, 4, 0, 19, 0, + 4, 0,133, 8, 0, 0,120, 8, 69, 1, 10, 0, 32, 0,119, 8, 4, 0,135, 8, 7, 0,125, 0, 4, 0, 19, 0, 2, 0,234, 5, + 2, 0,136, 8, 2, 0, 43, 0, 2, 0, 70, 0, 7, 0,137, 8, 0, 0,120, 8, 70, 1, 4, 0, 32, 0,119, 8, 4, 0, 19, 0, + 4, 0,133, 8, 0, 0,120, 8, 71, 1, 10, 0, 32, 0,119, 8, 2, 0, 17, 0, 2, 0,190, 3, 4, 0, 88, 0, 4, 0, 89, 0, + 7, 0,249, 7, 7, 0,250, 7, 4, 0, 37, 0,151, 0,224, 7, 0, 0,120, 8, 72, 1, 4, 0, 32, 0,119, 8, 4, 0, 29, 3, + 4, 0,138, 8, 0, 0,120, 8, 73, 1, 5, 0, 32, 0,119, 8, 7, 0,125, 0, 4, 0,139, 8, 4, 0, 29, 3, 4, 0, 30, 3, + 74, 1, 6, 0, 32, 0,119, 8, 4, 0,140, 8, 4, 0,141, 8, 7, 0,142, 8, 7, 0,143, 8, 0, 0,120, 8, 75, 1, 16, 0, + 32, 0,119, 8, 32, 0, 79, 8, 4, 0, 17, 0, 7, 0,144, 8, 7, 0,145, 8, 7, 0,146, 8, 7, 0,147, 8, 7, 0,148, 8, + 7, 0,149, 8, 7, 0,150, 8, 7, 0,151, 8, 7, 0,152, 8, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 43, 0, 2, 0, 70, 0, + 76, 1, 3, 0, 32, 0,119, 8, 4, 0, 19, 0, 4, 0,136, 5, 77, 1, 5, 0, 32, 0,119, 8, 4, 0, 19, 0, 4, 0, 37, 0, + 7, 0,153, 8, 0, 0,120, 8, 78, 1, 10, 0, 32, 0,119, 8, 0, 0,120, 8, 2, 0,154, 8, 2, 0,155, 8, 0, 0,156, 8, + 0, 0,157, 8, 7, 0,158, 8, 7, 0,159, 8, 7, 0,160, 8, 7, 0,161, 8, 79, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, + 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,162, 8, 7, 0,163, 8, 2, 0, 19, 0, 2, 0,136, 5, 80, 1, 8, 0, 7, 0, 9, 0, + 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,162, 8, 7, 0,163, 8, 2, 0, 19, 0, 2, 0,136, 5, 81, 1, 8, 0, + 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,162, 8, 7, 0,163, 8, 2, 0, 19, 0, 2, 0,136, 5, + 82, 1, 7, 0, 32, 0,119, 8, 0, 0,120, 8, 7, 0, 18, 1, 7, 0, 28, 1, 2, 0, 19, 0, 2, 0, 11, 1, 4, 0, 37, 0, + 83, 1, 5, 0, 32, 0,228, 2, 7, 0, 18, 1, 2, 0,232, 2, 0, 0,234, 2, 0, 0,164, 8, 84, 1, 10, 0, 84, 1, 0, 0, + 84, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,165, 8, 7, 0,217, 0, 7, 0,218, 0, 2, 0, 32, 8, 2, 0,166, 8, + 32, 0, 45, 0, 85, 1, 22, 0, 85, 1, 0, 0, 85, 1, 1, 0, 2, 0, 19, 0, 2, 0, 11, 1, 2, 0,167, 8, 2, 0,168, 8, + 36, 0, 80, 0,151, 0,224, 7, 32, 0,164, 0, 7, 0, 88, 0, 7, 0, 89, 0, 7, 0,169, 8, 7, 0,170, 8, 7, 0,171, 8, + 7, 0,172, 8, 7, 0,157, 2, 7, 0,173, 8, 7, 0,226, 7, 7, 0,174, 8, 0, 0,175, 8, 0, 0,176, 8, 12, 0, 16, 3, + 86, 1, 8, 0, 7, 0,228, 1, 7, 0,249, 7, 7, 0,250, 7, 9, 0, 2, 0, 2, 0,177, 8, 2, 0,178, 8, 2, 0,179, 8, + 2, 0,180, 8, 87, 1, 18, 0, 87, 1, 0, 0, 87, 1, 1, 0, 87, 1,181, 8, 0, 0, 20, 0, 86, 1,182, 8, 2, 0, 17, 0, + 2, 0, 19, 0, 2, 0,183, 8, 2, 0,184, 8, 2, 0,185, 8, 2, 0,186, 8, 4, 0, 43, 0, 7, 0,187, 8, 7, 0,188, 8, + 4, 0,189, 8, 4, 0,190, 8, 87, 1,191, 8, 88, 1,192, 8, 89, 1, 33, 0, 89, 1, 0, 0, 89, 1, 1, 0, 89, 1,193, 8, + 0, 0, 20, 0, 0, 0,194, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 79, 7, 2, 0,112, 7, 2, 0,195, 8, 2, 0,133, 0, + 2, 0,184, 8, 2, 0, 69, 7, 12, 0,219, 7, 12, 0,196, 8, 27, 0, 12, 6, 9, 0,197, 8, 7, 0,187, 8, 7, 0,188, 8, + 7, 0,255, 1, 7, 0,198, 8, 2, 0,199, 8, 2, 0,200, 8, 7, 0,201, 8, 7, 0,202, 8, 2, 0,203, 8, 2, 0,204, 8, + 9, 0,205, 8, 24, 0,206, 8, 24, 0,207, 8, 24, 0,208, 8, 90, 1,150, 0, 91, 1,209, 8, 88, 1, 8, 0, 88, 1, 0, 0, + 88, 1, 1, 0, 89, 1,210, 8, 89, 1,211, 8, 87, 1,212, 8, 87, 1,191, 8, 4, 0, 19, 0, 4, 0, 37, 0, 58, 0, 20, 0, + 27, 0, 31, 0, 39, 0, 75, 0, 12, 0,213, 8, 12, 0,214, 8, 86, 1,215, 8, 12, 0,216, 8, 4, 0, 17, 0, 4, 0,217, 8, + 4, 0,218, 8, 4, 0,219, 8, 12, 0,220, 8, 91, 1,221, 8, 87, 1,222, 8, 87, 1,223, 8, 9, 0,224, 8, 9, 0,225, 8, + 4, 0,226, 8, 9, 0,227, 8, 9, 0,228, 8, 9, 0,229, 8, 92, 1, 6, 0, 4, 0,124, 0, 4, 0,126, 0, 4, 0, 69, 7, + 0, 0,230, 8, 0, 0,231, 8, 2, 0, 37, 0, 93, 1, 16, 0, 2, 0, 25, 7, 2, 0, 26, 7, 2, 0,232, 8, 2, 0, 16, 8, + 2, 0,233, 8, 2, 0, 68, 0, 7, 0,156, 2, 7, 0,234, 8, 7, 0,235, 8, 2, 0, 32, 1, 0, 0,236, 8, 0, 0,245, 4, + 2, 0,237, 8, 2, 0, 37, 0, 4, 0,238, 8, 4, 0,239, 8, 94, 1, 9, 0, 7, 0,240, 8, 7, 0,241, 8, 7, 0, 30, 8, + 7, 0,109, 0, 7, 0,242, 8, 7, 0,198, 5, 2, 0,243, 8, 0, 0,244, 8, 0, 0, 37, 0, 95, 1, 4, 0, 7, 0,245, 8, + 7, 0,246, 8, 2, 0,243, 8, 2, 0, 37, 0, 96, 1, 3, 0, 7, 0,247, 8, 7, 0,248, 8, 7, 0, 15, 0, 97, 1, 7, 0, + 0, 0,190, 1, 2, 0,123, 4, 2, 0,124, 4, 2, 0,125, 4, 2, 0, 76, 4, 4, 0,126, 0, 4, 0,188, 3, 98, 1, 7, 0, + 7, 0,249, 8, 7, 0,250, 8, 7, 0,251, 8, 7, 0, 10, 2, 7, 0,252, 8, 7, 0,253, 8, 7, 0,254, 8, 99, 1, 4, 0, + 2, 0,255, 8, 2, 0, 0, 9, 2, 0, 1, 9, 2, 0, 2, 9,100, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,101, 1, 2, 0, + 0, 0,166, 0, 0, 0, 3, 9,102, 1, 1, 0, 0, 0, 20, 0,103, 1, 10, 0, 0, 0, 4, 9, 0, 0, 5, 9, 0, 0,191, 5, + 0, 0, 6, 9, 2, 0,232, 8, 2, 0, 7, 9, 7, 0, 8, 9, 7, 0, 9, 9, 7, 0, 10, 9, 7, 0,173, 8,104, 1, 2, 0, + 9, 0, 11, 9, 9, 0, 12, 9,105, 1, 11, 0, 0, 0,125, 4, 0, 0, 17, 0, 0, 0,243, 8, 0, 0,109, 0, 0, 0, 13, 9, + 0, 0,106, 0, 0, 0,179, 0, 7, 0, 14, 9, 7, 0, 15, 9, 7, 0, 16, 9, 7, 0, 17, 9,106, 1, 8, 0, 7, 0,186, 7, + 7, 0,125, 0, 7, 0,245, 4, 7, 0, 82, 2, 7, 0, 18, 9, 7, 0,204, 0, 7, 0, 19, 9, 4, 0, 17, 0,107, 1, 4, 0, + 2, 0, 20, 9, 2, 0, 21, 9, 2, 0, 22, 9, 2, 0, 37, 0,108, 1, 1, 0, 0, 0, 20, 0,109, 1, 4, 0, 7, 0, 5, 0, + 7, 0, 6, 0, 2, 0, 19, 0, 2, 0, 23, 9,110, 1, 10, 0, 2, 0,124, 3, 2, 0, 19, 0, 7, 0, 12, 4, 7, 0, 24, 9, + 7, 0, 25, 9, 7, 0, 26, 9, 7, 0, 27, 9,109, 1, 28, 9,109, 1, 29, 9,109, 1, 30, 9, 61, 0, 9, 0, 4, 0, 19, 0, + 4, 0, 64, 0, 24, 0, 31, 9, 24, 0, 32, 9,110, 1, 33, 9, 7, 0, 34, 9, 7, 0, 35, 9, 7, 0, 36, 9, 7, 0, 37, 9, +111, 1, 4, 0, 47, 0,150, 2, 7, 0, 38, 9, 7, 0, 93, 1, 7, 0, 37, 0,177, 0, 17, 0, 27, 0, 31, 0,111, 1, 39, 9, + 61, 0, 28, 9, 51, 0, 75, 1, 2, 0, 19, 0, 2, 0, 90, 5, 4, 0,106, 0, 7, 0, 40, 9, 7, 0, 7, 2, 7, 0, 41, 9, + 7, 0, 42, 9, 7, 0, 93, 1, 7, 0, 43, 9, 2, 0, 45, 1, 0, 0, 44, 9, 0, 0,117, 3, 0, 0, 92, 0,112, 1, 10, 0, + 4, 0, 17, 0, 4, 0,125, 0, 4, 0, 19, 0, 4, 0, 90, 3, 4, 0, 45, 9, 4, 0, 46, 9, 4, 0, 47, 9, 0, 0, 92, 0, + 0, 0, 20, 0, 9, 0, 2, 0, 88, 0, 6, 0,112, 1, 48, 9, 4, 0, 49, 9, 4, 0, 50, 9, 4, 0, 51, 9, 4, 0, 37, 0, + 9, 0, 52, 9,113, 1, 5, 0, 7, 0, 77, 2, 7, 0,190, 2, 7, 0,220, 1, 2, 0, 53, 9, 2, 0, 37, 0,114, 1, 5, 0, + 7, 0, 77, 2, 7, 0, 54, 9, 7, 0, 55, 9, 7, 0, 56, 9, 7, 0,190, 2,115, 1, 7, 0, 4, 0, 57, 9, 4, 0, 58, 9, + 4, 0, 59, 9, 7, 0, 60, 9, 7, 0, 61, 9, 7, 0, 62, 9, 7, 0, 63, 9,116, 1, 8, 0,116, 1, 0, 0,116, 1, 1, 0, + 32, 0, 45, 0, 4, 0,215, 2, 2, 0, 19, 0, 2, 0, 11, 1, 7, 0,190, 2, 7, 0,194, 7,117, 1, 24, 0, 32, 0, 64, 9, +114, 1, 86, 3,114, 1, 65, 9,113, 1, 66, 9,114, 1,178, 7,118, 1, 67, 9, 7, 0, 68, 9, 7, 0, 69, 9, 7, 0, 70, 9, + 7, 0, 61, 9, 7, 0, 62, 9, 7, 0,190, 2, 7, 0,167, 2, 7, 0, 71, 9, 7, 0,106, 0, 7, 0, 72, 9, 4, 0, 57, 9, + 4, 0, 73, 9, 4, 0, 82, 0, 4, 0, 74, 9, 2, 0, 19, 0, 2, 0, 75, 9, 2, 0, 76, 9, 2, 0,120, 3,119, 1,107, 0, + 27, 0, 31, 0, 39, 0, 75, 0,120, 1, 77, 9, 4, 0, 19, 0, 2, 0, 17, 0, 2, 0,154, 8, 2, 0, 78, 9, 2, 0, 79, 9, + 2, 0, 85, 8, 2, 0, 80, 9, 2, 0, 81, 9, 2, 0, 82, 9, 2, 0, 83, 9, 2, 0, 84, 9, 2, 0, 85, 9, 2, 0, 86, 9, + 2, 0,120, 3, 2, 0, 87, 9, 2, 0, 88, 9, 2, 0, 89, 9, 2, 0, 90, 9, 2, 0, 91, 9, 2, 0, 92, 9, 2, 0,210, 1, + 2, 0,171, 7, 2, 0,147, 7, 2, 0, 93, 9, 2, 0, 94, 9, 2, 0,118, 3, 2, 0,119, 3, 2, 0, 95, 9, 2, 0, 96, 9, + 2, 0, 97, 9, 2, 0, 98, 9, 7, 0, 99, 9, 7, 0,100, 9, 7, 0,101, 9, 2, 0,102, 9, 2, 0,103, 9, 7, 0,104, 9, + 7, 0,105, 9, 7, 0,106, 9, 7, 0,153, 7, 7, 0, 89, 0, 7, 0,167, 2, 7, 0,159, 7, 7, 0,107, 9, 7, 0,108, 9, + 7, 0,109, 9, 4, 0,154, 7, 4, 0,152, 7, 4, 0,110, 9, 7, 0,155, 7, 7, 0,156, 7, 7, 0,157, 7, 7, 0,111, 9, + 7, 0,112, 9, 7, 0,113, 9, 7, 0,114, 9, 7, 0,115, 9, 7, 0,116, 9, 7, 0,117, 9, 7, 0,118, 9, 7, 0, 42, 3, + 7, 0,106, 0, 7, 0,119, 9, 7, 0,120, 9, 7, 0,121, 9, 7, 0,122, 9, 7, 0,123, 9, 7, 0,124, 9, 7, 0,125, 9, + 4, 0,126, 9, 4, 0,127, 9, 7, 0,128, 9, 7, 0,129, 9, 7, 0,130, 9, 7, 0,131, 9, 7, 0,132, 9, 7, 0,133, 9, + 7, 0,134, 9, 7, 0,114, 3, 7, 0,112, 3, 7, 0,113, 3, 7, 0,135, 9, 7, 0,136, 9, 7, 0,137, 9, 7, 0,138, 9, + 7, 0,139, 9, 7, 0,140, 9, 7, 0,141, 9, 7, 0,142, 9, 7, 0,143, 9, 7, 0,144, 9, 7, 0,145, 9, 7, 0,146, 9, + 7, 0,147, 9, 4, 0,148, 9, 4, 0,149, 9, 7, 0,150, 9, 64, 0, 75, 3, 64, 0,151, 9, 32, 0,152, 9, 32, 0,153, 9, + 36, 0, 80, 0,154, 0, 73, 3,154, 0,154, 9,141, 0, 41, 0,141, 0, 0, 0,141, 0, 1, 0,119, 1,155, 9,117, 1,165, 3, +115, 1, 79, 8,121, 1,156, 9, 9, 0,157, 9,122, 1,158, 9,122, 1,159, 9, 12, 0,160, 9, 12, 0,161, 9,155, 0, 74, 3, + 32, 0,162, 9, 32, 0,163, 9, 32, 0, 38, 0, 12, 0,164, 9, 12, 0,165, 9, 12, 0,124, 8, 0, 0, 20, 0, 7, 0,208, 0, + 7, 0,194, 2, 7, 0,166, 9, 4, 0,118, 2, 4, 0, 19, 0, 4, 0,154, 7, 4, 0,167, 9, 4, 0,168, 9, 4, 0,169, 9, + 2, 0,215, 0, 2, 0,170, 9, 2, 0,171, 9, 2, 0, 67, 3, 2, 0,172, 9, 2, 0,120, 3, 0, 0,173, 9, 2, 0,174, 9, + 2, 0,175, 9, 2, 0,176, 9, 9, 0,177, 9,130, 0,209, 3,123, 1,178, 9,128, 0, 34, 0,124, 1,179, 9, 7, 0,179, 3, + 7, 0,180, 9, 7, 0,181, 9, 7, 0, 15, 4, 7, 0,182, 9, 7, 0, 52, 3, 7, 0, 42, 3, 7, 0,183, 9, 7, 0, 9, 2, + 7, 0,184, 9, 7, 0,185, 9, 7, 0,186, 9, 7, 0,187, 9, 7, 0,188, 9, 7, 0,189, 9, 7, 0,180, 3, 7, 0,190, 9, + 7, 0,191, 9, 7, 0,192, 9, 7, 0,181, 3, 7, 0,177, 3, 7, 0,178, 3, 4, 0,193, 9, 4, 0, 90, 0, 4, 0,194, 9, + 4, 0,195, 9, 2, 0,196, 9, 2, 0,197, 9, 2, 0,198, 9, 2, 0,199, 9, 2, 0,200, 9, 2, 0, 37, 0, 4, 0, 70, 0, +129, 0, 8, 0,124, 1,201, 9, 7, 0,202, 9, 7, 0,203, 9, 7, 0,164, 1, 7, 0,204, 9, 4, 0, 90, 0, 2, 0,205, 9, + 2, 0,206, 9,125, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0,207, 9,126, 1, 6, 0,126, 1, 0, 0, +126, 1, 1, 0,125, 1,208, 9, 4, 0,209, 9, 2, 0,210, 9, 2, 0, 19, 0,127, 1, 5, 0,127, 1, 0, 0,127, 1, 1, 0, + 12, 0,211, 9, 4, 0,212, 9, 4, 0, 19, 0,128, 1, 9, 0,128, 1, 0, 0,128, 1, 1, 0, 12, 0,124, 0,127, 1,213, 9, + 4, 0, 19, 0, 2, 0,210, 9, 2, 0,214, 9, 7, 0, 91, 0, 0, 0,215, 9,191, 0, 6, 0, 27, 0, 31, 0, 12, 0,139, 4, + 4, 0, 19, 0, 2, 0,216, 9, 2, 0,217, 9, 9, 0,218, 9,129, 1, 7, 0,129, 1, 0, 0,129, 1, 1, 0, 2, 0, 17, 0, + 2, 0, 19, 0, 4, 0, 23, 0, 0, 0,219, 9, 0, 0,220, 9,130, 1, 5, 0, 12, 0,221, 9, 4, 0,222, 9, 4, 0,223, 9, + 4, 0, 19, 0, 4, 0, 37, 0,131, 1, 13, 0, 27, 0, 31, 0,132, 1,224, 9,132, 1,225, 9, 12, 0,226, 9, 4, 0,227, 9, + 2, 0,228, 9, 2, 0, 37, 0, 12, 0,229, 9, 12, 0,230, 9,130, 1,231, 9, 12, 0,232, 9, 12, 0,233, 9, 12, 0,234, 9, +132, 1, 30, 0,132, 1, 0, 0,132, 1, 1, 0, 9, 0,235, 9, 4, 0, 4, 7, 4, 0, 37, 0,201, 0,180, 5,201, 0,236, 9, + 0, 0,237, 9, 2, 0,238, 9, 2, 0,239, 9, 2, 0, 25, 7, 2, 0, 26, 7, 2, 0,240, 9, 2, 0,241, 9, 2, 0, 90, 3, + 2, 0, 38, 6, 2, 0,242, 9, 2, 0,243, 9, 4, 0,160, 1,133, 1,244, 9,134, 1,245, 9,135, 1,246, 9, 4, 0,247, 9, + 4, 0,248, 9, 9, 0,249, 9, 12, 0,250, 9, 12, 0,230, 9, 12, 0, 43, 7, 12, 0,251, 9, 12, 0,252, 9,136, 1, 16, 0, +136, 1, 0, 0,136, 1, 1, 0, 0, 0,253, 9,137, 1,254, 9, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,255, 9, 2, 0, 0, 10, + 2, 0, 1, 10, 2, 0, 2, 10, 2, 0, 3, 10, 2, 0, 4, 10, 2, 0, 5, 10, 2, 0, 6, 10, 2, 0, 70, 0, 2, 0,160, 1, +138, 1, 9, 0,138, 1, 0, 0,138, 1, 1, 0, 12, 0, 7, 10, 0, 0, 8, 10, 2, 0, 9, 10, 2, 0, 10, 10, 2, 0, 11, 10, + 2, 0, 37, 0, 9, 0, 12, 10,209, 0, 10, 0,209, 0, 0, 0,209, 0, 1, 0, 0, 0,253, 9, 26, 0, 30, 0,139, 1, 19, 7, + 9, 0, 13, 10,137, 1,254, 9,130, 1, 14, 10, 12, 0, 15, 10,209, 0, 16, 10,133, 1, 23, 0,133, 1, 0, 0,133, 1, 1, 0, + 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 5, 0, 2, 0, 6, 0, 2, 0, 17, 10, 2, 0, 18, 10, 2, 0, 19, 10, 2, 0, 20, 10, + 0, 0, 21, 10, 0, 0, 37, 0, 2, 0,255, 9, 2, 0, 0, 10, 2, 0, 1, 10, 2, 0, 2, 10, 2, 0, 3, 10, 2, 0, 43, 0, + 0, 0, 22, 10, 2, 0, 23, 10, 2, 0, 24, 10, 4, 0, 70, 0, 9, 0, 13, 10,140, 1, 8, 0,140, 1, 0, 0,140, 1, 1, 0, + 9, 0, 2, 0, 9, 0, 25, 10, 0, 0,132, 3, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0, 26, 10,141, 1, 5, 0, 7, 0, 27, 10, + 4, 0, 28, 10, 4, 0, 29, 10, 4, 0, 11, 1, 4, 0, 19, 0,142, 1, 6, 0, 7, 0, 30, 10, 7, 0, 31, 10, 7, 0, 32, 10, + 7, 0, 33, 10, 4, 0, 17, 0, 4, 0, 19, 0,143, 1, 5, 0, 7, 0,249, 7, 7, 0,250, 7, 7, 0,190, 2, 2, 0,224, 1, + 2, 0,225, 1,144, 1, 5, 0,143, 1, 2, 0, 4, 0, 54, 0, 7, 0, 34, 10, 7, 0,249, 7, 7, 0,250, 7,145, 1, 4, 0, + 2, 0, 35, 10, 2, 0, 36, 10, 2, 0, 37, 10, 2, 0, 38, 10,146, 1, 2, 0, 42, 0, 9, 6, 26, 0, 73, 8,147, 1, 3, 0, + 24, 0, 39, 10, 4, 0, 19, 0, 4, 0, 37, 0,148, 1, 6, 0, 7, 0,106, 0, 7, 0,142, 2, 7, 0, 40, 10, 7, 0, 37, 0, + 2, 0,214, 0, 2, 0, 41, 10,149, 1, 7, 0,149, 1, 0, 0,149, 1, 1, 0, 27, 0, 12, 6, 0, 0, 42, 10, 4, 0, 43, 10, + 4, 0, 90, 0, 0, 0,132, 3,150, 1, 6, 0, 12, 0,124, 8, 0, 0, 44, 10, 7, 0, 61, 0, 7, 0, 26, 10, 4, 0, 17, 0, + 4, 0, 19, 0,151, 1, 3, 0, 7, 0, 45, 10, 4, 0, 19, 0, 4, 0, 37, 0,152, 1, 15, 0,152, 1, 0, 0,152, 1, 1, 0, + 58, 1,112, 8,150, 1, 62, 0, 12, 0, 16, 3, 35, 0, 50, 0,151, 1, 46, 10, 4, 0, 54, 0, 7, 0, 61, 0, 2, 0, 19, 0, + 2, 0,252, 0, 4, 0, 43, 10, 0, 0, 42, 10, 4, 0, 47, 10, 7, 0, 48, 10,153, 1, 2, 0, 0, 0, 49, 10, 0, 0, 50, 10, +154, 1, 4, 0,154, 1, 0, 0,154, 1, 1, 0,151, 0,228, 2, 12, 0, 51, 10,155, 1, 24, 0,155, 1, 0, 0,155, 1, 1, 0, + 12, 0, 52, 10,151, 0,224, 7,154, 1, 53, 10, 12, 0, 54, 10, 12, 0, 16, 3, 0, 0,132, 3, 7, 0, 26, 10, 7, 0, 55, 10, + 7, 0, 88, 0, 7, 0, 89, 0, 7, 0,169, 8, 7, 0,170, 8, 7, 0,157, 2, 7, 0,173, 8, 7, 0,226, 7, 7, 0,174, 8, + 2, 0, 56, 10, 2, 0, 57, 10, 2, 0, 43, 0, 2, 0, 17, 0, 4, 0, 19, 0, 4, 0, 70, 0,156, 1, 6, 0,156, 1, 0, 0, +156, 1, 1, 0, 12, 0, 52, 10, 4, 0, 19, 0, 4, 0, 81, 2, 0, 0,132, 3,157, 1, 10, 0,157, 1, 0, 0,157, 1, 1, 0, + 27, 0, 12, 6, 0, 0, 58, 10, 4, 0, 59, 10, 4, 0, 60, 10, 0, 0, 42, 10, 4, 0, 43, 10, 2, 0, 19, 0, 2, 0, 61, 10, +158, 1, 6, 0,158, 1, 0, 0,158, 1, 1, 0, 12, 0, 62, 10, 0, 0,132, 3, 4, 0, 19, 0, 4, 0, 63, 10,159, 1, 5, 0, +159, 1, 0, 0,159, 1, 1, 0, 0, 0, 42, 10, 4, 0, 43, 10, 7, 0,134, 2, 39, 0, 9, 0,151, 0, 11, 3,151, 0, 64, 10, +154, 1, 53, 10, 12, 0, 65, 10,155, 1, 66, 10, 12, 0, 67, 10, 12, 0, 68, 10, 4, 0, 19, 0, 4, 0,215, 0,160, 1, 2, 0, + 27, 0, 31, 0, 39, 0, 75, 0,161, 1, 5, 0,161, 1, 0, 0,161, 1, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0, 0, 0, 20, 0, +162, 1, 6, 0,161, 1, 69, 10, 32, 0, 45, 0, 4, 0, 70, 10, 7, 0, 71, 10, 4, 0, 72, 10, 4, 0, 32, 8,163, 1, 3, 0, +161, 1, 69, 10, 4, 0, 70, 10, 7, 0, 73, 10,164, 1, 8, 0,161, 1, 69, 10, 32, 0, 45, 0, 7, 0, 6, 1, 7, 0, 74, 10, + 7, 0,194, 2, 7, 0, 30, 8, 4, 0, 70, 10, 4, 0, 75, 10,165, 1, 5, 0,161, 1, 69, 10, 7, 0, 76, 10, 7, 0,112, 7, + 7, 0,163, 2, 7, 0, 57, 0,166, 1, 3, 0,161, 1, 69, 10, 7, 0, 30, 8, 7, 0, 77, 10,118, 1, 4, 0, 7, 0, 78, 10, + 7, 0,121, 9, 2, 0, 79, 10, 2, 0, 11, 1,167, 1, 14, 0,167, 1, 0, 0,167, 1, 1, 0, 12, 0, 80, 10, 12, 0, 81, 10, + 12, 0, 82, 10, 0, 0, 20, 0, 4, 0, 31, 0, 4, 0, 19, 0, 4, 0, 83, 10, 7, 0, 84, 10, 4, 0, 72, 10, 4, 0, 32, 8, + 7, 0,139, 3, 7, 0,165, 2,120, 1, 23, 0, 4, 0, 70, 10, 4, 0, 85, 10, 7, 0, 86, 10, 7, 0, 57, 0, 7, 0, 87, 10, + 7, 0,161, 2, 7, 0, 78, 10, 7, 0, 88, 10, 7, 0,142, 2, 7, 0, 89, 10, 7, 0, 12, 4, 7, 0, 90, 10, 7, 0, 91, 10, + 7, 0, 92, 10, 7, 0, 93, 10, 7, 0, 94, 10, 7, 0, 95, 10, 7, 0, 96, 10, 7, 0, 97, 10, 7, 0, 98, 10, 7, 0, 99, 10, + 7, 0,100, 10, 12, 0,101, 10, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c index d2668d21e52..722e3ada57b 100644 --- a/source/blender/editors/datafiles/blenderbuttons.c +++ b/source/blender/editors/datafiles/blenderbuttons.c @@ -1,5501 +1,5609 @@ /* DataToC output of file <blenderbuttons> */ -int datatoc_blenderbuttons_size= 175808; +int datatoc_blenderbuttons_size= 179274; char datatoc_blenderbuttons[]= { - -137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 88, 0, 0, 2,128, 8, 6, 0, 0, 0, 64, 11, 6, -158, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0, -120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, - 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7, -228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, - 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115, -253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, - 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, - 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19, -101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176, -183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, - 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, - 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, - 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, - 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112, -248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, - 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252, -183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37, -210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, - 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, - 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, - 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, - 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, - 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, - 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, - 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218, -143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, - 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, - 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, - 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, - 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, - 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82, -221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, - 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21, -131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15, -153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, - 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103, -168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33, -107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, - 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, - 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, - 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68, -119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, - 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225, -132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77, -238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155, -223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, - 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, - 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, - 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, - 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200, -189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41, -158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47, -145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183, -200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2, -251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200, -236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, - 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, - 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190, -223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, - 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, - 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, - 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101, -133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103, -101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165, -134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, - 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, - 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202, -191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, - 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84, -164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190, -219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, - 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, - 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47, -106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, - 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, - 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95, -109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221, -244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, - 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71, -247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, - 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124, -165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79, -228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, - 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, - 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,217, 6, 17, 13, 13, 30,217,121,242, 96, 0, 0, 32, 0, 73, 68, 65, 84,120,218, -236, 93,119,120, 20,213,226, 61,119,202,246, 77, 39,141, 4, 66, 71,186, 16, 64, 9, 96,144, 14,242, 80,121,162,128,160,226,243, - 61,236, 15,177,128, 29, 20,136,250, 20,108,136,242, 84,120, 32,250, 19, 21, 36, 54,154,116, 8, 16, 68, 8,197, 8, 18, 8, 37, -132, 68, 82,183,239,206,253,253,145,157,113,179,217, 50,193, 4, 81,238,249,190,249,182,204,204,153,219,231,220,115,239,157, 1, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,174,100,116, 97,156,140,147,113, 50, 78,198,201, 56, 25, - 39,227,188,210,192, 93,196, 57,180, 17,194, 65,189, 91,230,159,128,179,177,226,222,144,220,153, 94,190,231,255, 36,225,204,188, -140, 57,105, 35,240,210, 70, 40, 83,180, 17,202,125, 99,115,162,145,226, 78, 27, 33,223,159,255,147,132, 51,243, 50,228,244, 47, - 63, 13,193, 27,168, 76,210, 6, 14, 39,109,132,112, 54, 22, 39, 26, 41,238,180,145,242,190, 33,239, 77,151, 45,132,203, 64, 96, - 0, 0,241,225, 39,151, 49, 39, 26,137,179,161,195,183,177, 17, 56, 73, 35,148,129,231,189,188,155, 26, 80, 16,201,113,111,136, - 60,162,141,192,219,152,226,170, 33,203,125, 99,115,162,145, 56, 73, 3,167,231,198, 70,224,108,168,186, 68, 27,161, 46, 53, 70, -153,247, 47, 63, 13,193,235,207,217, 16,117,201,159,179, 33,202,253,165,224, 68, 35,113,146, 70, 72,211,198,184, 55, 93,182,224, - 46, 50,177, 26, 3, 20,192,128,203, 92, 8, 53,150,200,108,104, 23,167, 49, 57, 27, 50,143,158,111,132,222,204,128, 6,204, 35, - 18, 32,188, 13,201, 73, 26, 41,156, 13,145, 79,164, 17,234, 18,105,132,186, 68, 26,161,220, 95, 42,206,134,204,163,134,170, 75, -164,145,234,146,127,124,159,111, 96, 78,210, 72,225,108,136,124, 10,196, 73, 26,129,179, 49,226,158,121, 25,243, 94,246, 16, 46, -147,112, 52,134, 16, 66, 3, 58, 25,141,233,226, 52,150,211, 70, 26, 41, 93, 55, 53, 32,215,198, 70, 8,231,166, 6,236,209, 6, - 18,132,207, 93,230,117,154,213, 37, 86,151, 46,183,186, 68,131,116, 86,158,187,204,202,121, 67, 58, 66,161, 56,126,111, 62,209, - 32, 29, 53,218,128,225,108, 72,215,154, 92,162,250,116,217,129,187,140,194,210,208,243,123, 40, 26,199, 21,107,172,120, 55,100, - 56, 7,252, 73,226,222, 24,225,124,190,145,226,254,103, 73, 83, 86,151, 88, 93,186, 28,235,146,111,153,108,168,176, 54,116, 57, - 15,196,217,144,243,144, 26,178,140, 54,118,220,233,101,158,247,127, 10, 92,140,131,213, 88,189,227, 63, 3,103, 99,112, 55, 70, - 56, 55,253, 73,210,180, 49,194,249, 60, 26,118,200,145, 52, 66, 88, 27,115,152,176, 49,202,102, 99,150,119,114,153,135,243,207, -146,239,141, 17,206,134,170, 75,164, 17,234, 61,105,132,246,169, 49,203,102, 99,114, 54, 4,119, 99,132,179,177,242,158,129,129, -129,129,129,129,129,129,225, 74, 69, 80, 37,217,189,123,247,108,189, 94,223, 38,216,126,139,197,114,246,199, 31,127,188,158, 37, - 33, 3, 3,131, 10,112,248,109, 74,130,132,198, 25,226, 96, 96, 96, 96,184,108, 16,116,136, 80,163,209,180,218,188,121,115, 59, - 73,146,224,118,187,225,241,120,224,241,120,224,118,187,225,112, 56,240,247,191,255,189,222,195,139,221,186,117,219,204,113, 92, -139,250,156,227,241,120, 78,238,223,191,191, 95,176,253, 9, 9, 9,219, 1,180, 34,228, 55,173, 72, 8,129,252,219,247,127,142, - 83,166,156,157, 57,117,234, 84,143, 80,156,132,144, 86,190,124,254, 92, 1,120, 67,114,182,111,223,126,143, 32, 8,169,129,206, - 15,198, 45, 73,210, 47,121,121,121, 25,172,152, 94, 26,116,235,214,109, 51,207,243,245, 46,159, 63,254,248, 99,208,242,217,185, -115,231, 31, 56,142,107, 26, 40,143,131,148, 39,222,227,241,252,228,229, 12, 40, 64,146,146,146,182, 83, 74, 91,169, 44,151, 50, - 78,157, 58,117,170,103,184,122, 20, 42,156, 1,184, 67,114,250,138,171,148,148,148,172,248,248,248,123, 45, 22,139, 13, 0,229, - 56,142,202,220, 50,175,199,227, 57,127,228,200, 17,246,240, 66, 6, 6,134,191,182,192,146, 36,137,179,219,237,200,207,207, 7, -165,117,219,121,142,227, 60,245,189, 24,165,180,221,250,229, 75, 19, 12,241,137,240, 56, 29,208, 53, 73, 80,184,203, 14, 29,128, -199,233,132,228,114,162, 73,207,107,229, 48, 96,192,128, 1,124, 24,218,212,169, 83,167, 38, 68, 68, 68,192,102,179,193,102,179, -193,110,183,195,110,183,195,225,112,192,225,112,192,233,116,194,233,116,194,229,114,193,110,183,227,192,129, 3, 33,195, 78, 8, - 73,125,232,161,135, 20, 78,187,221, 14,155,205,166,112,217,237,118,133,211,225,112,192,110,183,227,224,193,131, 33, 57, 5, 65, - 72,221,187,119,111,130, 70,163, 1,165, 20,146, 36,129, 82, 90,107,243, 75, 43,244,237,219,215,201,138,232, 37, 69,187,149, 47, -205, 78,208,197, 53,129,228,114, 33,238,234,116, 37, 47, 78,175,255, 22,146,203, 5,201,229, 66,218,223,198, 40,255,103,102,102, -134, 43,159,105,159, 61, 59, 35, 90, 19, 17, 1,183,205,134,150,163,110, 86,118,228,189, 51, 15,212,229, 2,117, 59,209,245,145, -167, 1, 0, 37, 37, 37,214, 14, 29, 58,156, 65,232,213, 91,169,199,143, 31, 79,144,195,224, 47,212, 57,142,171,181,109,221,186, - 21, 19, 39, 78, 12, 23,247,212,167,158,122, 42, 65,174, 35,190,101,221,229,114, 41,245,199,237,118,195,229,114,193,225,112,224, -135, 31,126, 80,229, 92, 37, 39, 39,191,212,191,127,255,201,203,150, 45, 51,125,241,197, 23,166,150, 45, 91, 66,163,209,128,231, -121,240, 60, 15,142,227,192,243, 60,110,188,241, 70, 54, 55,131,129,129,225,175, 47,176,156, 78,231,241,161, 67,135, 82, 0,112, - 56, 28, 41, 90,173, 86,227, 39,192,154,102,100,100,252,228,127, 94,184,161, 67, 67,124, 34, 62,104, 25, 11, 0, 24,123,172, 84, -185, 41,172,184,174,187,114,204,248, 19,229, 53,199, 26, 12,224, 56,142,132, 17, 67, 48,155,205, 24, 58,116, 40,180, 90, 45,210, -211,211,161,209,104, 32,138, 98,208, 77, 13, 76, 38, 19,102,206,156, 41,139, 35,152,244, 58,220,215,255, 90,232, 9,197, 7, 63, - 30,129,221, 35, 65, 16, 4, 8,130, 0, 81, 20,235, 56, 82,129,160,209,104,112,224,192, 1,240, 60, 15, 65, 16,106,125,242, 60, -143,213,171, 87,227,150, 91,110, 1,207,243, 48, 26,141, 0,155, 12,120,201,161,139,107,130,207, 50,107,140,200,219, 11, 43,149, -255,191, 29,247, 55,229,251,164,211,213, 32,132, 64,163,209,168,203,247,136, 8,124,125,203, 8, 0,192,152,252, 98,165,204,236, -159, 55, 27,162, 86, 11, 65,212,160,203,212,167, 80, 82, 82, 98, 29, 51,102,204, 86,189, 94,255,157,138,206, 10, 78,158, 60,169, -112,137,162, 88,167,220,115, 28,135, 15, 63,252, 16, 39, 78,156, 80, 21,119,171,213,138, 57,115,230, 40,113, 11,196,235,251, 93, - 69,220,185,164,164,164, 23,251,247,239, 63,113,217,178,101, 49,132, 16, 44, 88,176, 0,130, 32,224,134, 27,110, 64, 92, 92, 28, -214,172, 89, 3,141, 70,131,199, 30,123,140, 21, 62, 6, 6,134, 43, 67, 96,253,248,227,143, 35,228,239,215, 92,115,205,225,173, - 91,183, 94,229, 99,229,195,237,118,107,220,110,119, 59,121,216,208,237,118,195,110,183, 99,252,248,241, 33,123,244, 30,167,163, -142, 64, 10, 38,156,212,194,225,112, 96,236,216,177,138,136, 9, 37,174,212,220, 24, 8, 33,176,219,237, 16, 4, 1,173,155,199, -227,233,177, 61,209,151,167,176,150, 2, 40,169,198,157,201, 2,246,165,182,195,155, 39, 75,113,162,162, 10,130,160,110,180, 84, -146,164, 90,130,202,255,251,194,133, 11, 49,110,220, 56,240, 60, 95,103, 8,137,225,210, 64,114,185,194,150,195,250,230,141,219, -102, 3, 0,240, 62,130, 92, 20, 69,104,245,122,240,162, 8, 65,171, 65, 73, 73,137,117,200,144, 33, 59, 13, 6,195,146,164,164, -164,211,167, 78,157, 10, 89, 62, 41,165, 16, 69, 17,130, 32, 4, 45,243, 31,126,248, 33,150, 46, 93,138,222,189,123,171, 42,243, - 14,135, 3, 26,141, 6,179,103,207,174,179,255,157,119,222,169, 35,176,194,128, 0,224, 18, 19, 19,239, 91,190,124,121,164,124, -253,184,184, 56,136,162,136,206,157, 59, 35, 34, 34, 2, 91,183,110,133,199,227, 81, 45, 86, 25, 24, 24,174, 76, 80, 74, 69, 0, - 87, 3,136, 7,224, 1, 80, 9, 32,218,231,144,243,222,207,120,249, 55, 33,100,119, 0,158, 94,222, 99,206, 19, 66,118,251,252, -118, 0,208, 6,248,191, 20,128,193,187,217, 1,108, 7,208,217,231, 58,242,121,240,191,174,172, 12, 50, 81,243,160,186, 1, 8, -240,240, 59,121,184,240,200,145, 35, 1,135, 11,253, 2, 31,178,149,212, 53, 73, 80,156,171, 79, 91,199, 41,255,143, 43, 40, 83, - 26,216,175,123,183,133,206,108, 66,207,231, 95, 9,155,232,242,141,161,184,184,184, 78,207,251, 98, 5, 22, 0,184, 92, 46, 24, - 12, 58,124,255,238,117, 56,251,139, 27,179,179, 11,177,106,215,113, 8,130,128, 81, 87,181,197,223,221, 64, 86,172, 30,255,114, -123,224,148,168,170, 27, 24,165,180,142,184,242, 21, 89,132, 16,229, 63,118,179,249, 99, 16,119,117,186,226, 92, 45,107, 22, 81, -199,181, 2,128, 85,221, 91, 64, 31, 97, 70,231,135,167,171, 42,159, 45, 71,221,172, 56, 87, 95,165,183,130,160,209, 64,212,105, -241,247, 31, 11, 1,212, 12, 11, 14,236,218,113, 83, 25,175, 93,124,199, 29,119,252,178,126,253,122,163,154,176,106, 52,154, 90, -130, 45,144,184, 18, 4, 1, 46, 63,209, 24,170, 83, 17, 76, 56,201,245,170,158, 14, 22, 44, 22,139, 99,213,170, 85,120,243,205, - 55, 17, 23, 23,135,161, 67,135, 34, 41, 41, 9, 43, 86,172, 0,165, 20, 15, 60,240, 0, 12, 6, 3, 12, 6, 3, 43,243, 12, 12, - 12,161,180,200,117, 51,102,204,232,153,149,149, 53,167, 79,159, 62, 31,111,223,190,125, 57, 33, 36,219, 71,123,140,242,182,101, -217,242,111, 74,105, 47, 95,145,229, 21,105,241,132,144,108,249,120,223,223,242, 39,165,116, 48, 0,173,252,123,198,140, 25,157, -179,178,178,230, 76,159, 62,253,201,185,115,231,106,102,204,152,209, 53, 43, 43,107,142,124,157, 64,225,240, 21, 88, 33,159, 2, -236,116, 58,143, 15, 30, 60, 88,213,138, 31,171,213, 90, 20, 70,128, 5,116, 6,124, 93, 1, 93,132, 25,134,136, 8, 16, 78, 93, -131,235,114,185, 32, 8, 2, 56,142,195,218,181,107, 97, 48, 24, 48,114,228,200,139, 30, 34,148, 69,155, 86,171,129, 16,205,225, -142,215,246,224,252, 5,139, 50, 36,184,174,160, 16,187, 12, 6, 60,221,177, 43,204, 85, 5,168,176, 59,126,151,131, 53,110,220, - 56,216,108, 54,112, 28,167,252,199,113, 92, 88,177,202,208,120, 8,182, 8,129, 16, 2,125,100, 4,244,102, 51,120,129, 87,197, - 69, 41,253, 77, 8,105,181, 16,117, 90, 8, 26,141, 34,174,134, 12, 25,178,179,140,215, 46, 62,125,250,244, 78, 0,122,181, 2, - 75,118,176, 66,137, 43, 65, 16,224,116, 58, 85,137, 23,187,221, 14,141,230,183,153, 0, 39, 79,158, 12, 41,176,194, 69, 27,128, - 68, 8,145, 90,181,106,165,156,147,152,152,136,232,232,104, 72,146, 4, 73,146,160,215,235, 97, 48, 24,106, 93,151,129,129,225, -138, 69, 40, 45,162,203,202,202,154,227, 43, 96,252, 5,141,175,112,242, 19, 81,190, 34,173,115,152,182, 63,219, 95, 52,201,215, - 37,132,100,207,157, 59,119, 84,152,112,156,247, 23, 88,114,131, 24, 16,190,195,133, 13,117,243, 10,117, 3, 51, 68, 69, 66,107, - 50,193, 59,253,138,134,227,114, 58,157,202,156,147,123,239,189, 55,104,175,222,119,110, 74, 56, 56, 28, 14,240, 28, 15,232, 90, - 66, 66,142,114,179, 82, 54,141, 6, 5,205,187,129, 20,157,134, 32,168,155,239, 47, 59, 88,178,136,122,224,129, 7,176,104,209, - 34,101, 98, 50, 0,240, 60,143,246,237,219,227,216,177, 99,172,170,253, 1,160,148,134, 29,182,214, 71, 70, 64,103, 54,131, 87, -225, 52,202,251,149, 57, 76,122, 29,120,141, 6,130,166,102, 88,112,244,232,209,155,202,202,202, 22,119,234,212,233,103,212, 60, -198,128,168,173, 63,129,202,249,226,197,139,107,137,171,250, 56, 88,114, 61,242, 69,160,225,194, 49, 99,198,168,117,176, 40, 33, -132,138,162,136,193,131, 7,163,107,215,174, 88,181,106, 21, 36, 73,194,253,247,223, 15,131,193,128,249,243,231,195,237,118, 35, - 43, 43,139, 57, 88, 12, 12, 12,161,238,249,214,233,211,167, 63, 73, 8,201,246, 58, 73,121, 33,132, 84,160,182,189,151,159, 72, - 59, 31,228,184, 81,129, 68,150,239,119, 25, 51,102,204,232,236, 31, 14, 95,199,204, 87, 96, 53,214,251,219,106,161,236,208, 1, -101, 66,187, 60, 44, 72, 8,193,183, 25, 87, 65,107, 54, 65,111, 54,163,223,202, 45, 74,175, 25, 47,190,170,202,193,146,133, 83, -105,105,105,216, 33, 66,181,174, 24,175, 17,177,211, 44,130,138,124,173, 27,150, 40,138,224, 4, 17, 5,241,237, 64,132, 53, 16, - 60,110, 85, 55, 7,217,201,240, 93, 61,117,199, 29,119,128,227, 56, 69,100,117,239,222, 29,126,121,194,112, 9,113,102,195,119, -248,230,182,154,186,234, 59, 44,152,221,187, 13,116, 17,102,232, 76, 38,100,174,222,174, 12,231, 98,254,123, 97, 57,143,188,255, - 54,242, 94,159, 11, 65, 20,113,243,222, 2,197,185,234,123, 85,219,157, 14, 83,228,226,147, 39, 79,238, 4,192,221,118,219,109, -209, 61,122,244, 80,101,139, 17, 66,106, 77, 60, 23, 4, 33,160,184, 18, 4, 1,110,183, 91, 85,220,157, 78,167, 42, 39, 73,118, -177,212, 52,148,114, 58, 69, 69, 69, 33, 34, 34, 66, 89, 65, 43, 59, 87,242,252, 77,181,245,146,129,129,225, 47,143, 96, 90,196, - 62,119,238,220,188,185,115,231, 42, 78,146,191,131, 21,228,190,123,131, 87, 76,197,203,226, 12,128, 61,208,252,172, 64,174,152, -191,240,242,253, 47, 43, 43,107,142,127, 56,124,135, 37, 3,206,206,238,214,173,219, 55, 70,163,177,165,218,212,168,207, 67, 71, - 61, 78,103,157,158, 56, 33, 4,122,179, 25,218, 8, 51,116,102,115, 80,151, 43,216,141, 70, 30, 34,228,121, 94,185,233, 44, 89, -178, 4,102,179, 25,119,221,117,215, 69, 77,114,175, 17, 88, 60,190,212,228, 3, 26,161,206, 77,139, 23, 69,156,140,106, 6, 78, - 20, 33,120,212, 57, 4,229,229,229,224,121, 30,207, 61,247, 28,178,178,178,148,101,244,190, 75,235,125, 93, 15,134, 75, 15,223, - 73,238,181, 92,213,136, 8,165,124,250,254, 31,110, 78, 34, 33, 4,240,184,107, 86, 11,234,180,138,184, 26, 61,122,244, 38,135, - 41,114,241, 85, 87, 93, 37, 59, 87,156,209,104, 12,187,106,214,183,110,200, 66,199, 95, 92,201, 46,169,252,221,229,114,169, 42, -243,178,192, 90,180,104, 81,200,206,136,124, 93,181,229,148,227, 56,108,222,188, 25,123,247,238,197,189,247,222, 11,131,193,128, - 55,222,120, 3,110,183, 27,179,102,205,130,193, 96,128, 86,171,101,133,143,129,129, 33, 20, 98,100,129,227, 21, 73,181,156, 37, -239,220,169, 81,190,191, 3, 57, 92, 94,199,105,115,152,246,240, 43,175, 48, 11, 8,217, 73,243, 59, 39,219, 95,156, 9,126, 78, - 9, 1, 0,173, 86,219,114,219,182,109,237, 36, 73,130,199,227, 65,168, 79,135,195,129, 91,111,189, 85,245, 67, 71, 37, 87,141, -192,226,252, 86,202,233, 34, 35,160, 53,255,118, 3,243,185,137,133,109,197,101, 7,203, 87, 96, 61,247,220,115, 16, 4, 1,139, - 22, 45, 2, 0, 60,250,232,163,245,118,176,168, 4,108,247,108, 68,211, 5,221, 64, 23,235,113,110,243, 97,136,162,136,164,222, - 67, 32,245,252, 59, 74,181,145, 48,121,231, 85,169, 25,118, 44, 45, 45,197,137, 19, 39, 64, 8,193, 35,143, 60, 18, 82, 92,173, - 93,187,150,205,193,250, 3, 5, 22,199,243,181,242,195,183,124,250,137,175,240,227,100,110, 55, 68,157,174,214,106,193,178,178, -178,197, 39, 79,158,204, 1, 64, 38, 78,156, 24,109, 52, 26,241,254,251,239, 91, 0,104, 86,174, 92,105, 8,199,233, 59,143,207, -223,185,242, 23, 88, 30, 79,248, 33,108,185, 83,161,198,237,173,143,192,146,203, 55, 33, 4, 30,143, 71,113,174, 92, 46,151,242, - 91,167,211,177,130,199,192,192, 80, 71,139,248,225,188,223, 60, 39,226,231, 52,157, 15, 36,172,124,135, 3,229,239,132, 16, 87, - 0, 94,135,223,208,161,255,255,242,103,233,220,185,115,191,151,157, 43,159,255,107,133, 35,168,131,197,113, 28,236,118, 59, 14, - 29, 58,164,182,135,170,250,161,163,113,233,215, 96,252,137,114, 16, 66,176,166,127, 39,232,205,102,104,204, 38,100,124,182, 81, -105,176, 11,178, 30,131,198,100, 70, 92,191, 33,170, 26,112,143,199, 83, 71, 96,149,149,149, 65, 20, 69,188,248,226,139,224, 56, - 14, 47,189,244, 18, 82, 82, 82,112,246,236, 89,100,102,102,170,186,217,112, 18, 7,253,157,177,208,255, 43, 2,220,189,109,208, -249,111,255, 66,121,101, 11,236,119,152,208,161, 58, 31, 49, 27,158,135, 83,114,171,122, 76, 3, 33, 4,110,183, 27,223,127,255, - 61, 68, 81,132,219,237, 86,110, 62,148, 82,229, 41,249,242, 67, 29, 95,122,233, 37, 86,213,254, 0, 52,187,225, 38,220,113,198, - 2, 0,248, 38,227, 42,232, 76, 38,104, 35,204,232,247,197,102,165,124,254, 50,103, 26, 52, 38, 51,162,123,245, 87,197,217,241, -254, 71,209,225,190,105, 40, 41, 41,177, 14,238,222,121,115, 57,175,251,176, 75,151, 46,202,156, 43,163,209, 8,189, 94, 79, 80, -251,117, 50, 97, 69, 11,199,113, 97,197,149,252, 93,109,167,194,127, 21,110, 40,129,165, 22, 28,199,225,174,187,238, 66,114,114, - 50,222,124,243,205, 90,206,213,147, 79, 62, 9,151,203,133,249,243,231,179,194,199,192,192, 16,170,221,219,173,246, 88, 74,105, - 47, 31, 49,181,251, 98,120,235,115,189, 96, 8,216,242,218,237,246,130, 65,131, 6, 33,200,190, 20,157, 78, 87,171,117,149, 31, - 58, 26, 96,168,176, 11,128, 3,126, 17,255,109, 88,208, 59, 89, 88,235, 55,236,162, 53, 71, 64, 52,153,193, 5,110,196,235,112, - 6,114,176,228,161,147,242,242,114,136,162,136, 55,223,124, 19,145,145,145,176,219,237,129,122,222, 1, 57,121,158,135,229,132, - 5,199,159,217, 15,157,233, 40,218, 15,137, 64,132,120, 12,109,183,172,132,219,237, 0,124,134, 12,213,112,182,111,223, 30,207, - 61,247, 92,157,199, 51, 4, 67,122,122,122, 88,206, 6, 0,227, 12, 34, 98,116, 17,102,232, 35, 34,130,150, 79, 33,240,179,155, -106,113,202,251,101,231,170, 74, 99,252,240,228,241,227, 57, 0,184,137, 19, 39, 70, 25,141, 70, 44, 92,184,208, 2,128,123,225, -133, 23,140,105,105,105,188,154,112,114, 28,135, 37, 75,150,212,153,115, 21, 76, 96,169, 9,167,219,237,174, 35,176,198,142, 29, - 91,231, 65,163, 33, 28,172, 58,225,148,231, 96, 53,105,210, 4, 70,163, 81,121,237,150, 94,175,135, 94,175, 87,158, 14, 31, 98, -168,149,149, 79,198,201, 56,175, 28,206, 75, 46,198, 26, 19, 1, 5,214,190,125,251,134, 7, 59, 33, 35, 35, 35,127,219,182,109, -109,125,223, 77,232,118,187, 53,118,187,189,221,141, 55,222, 24,182,171, 44, 73, 18,116, 58, 29, 40,165,184,250,233,172,154, 46, - 60,247,219,144, 32,165, 20,209,125, 7,131,240, 60, 60, 30, 9, 46,151, 43,236, 42, 66,155,205, 86,107, 2,122,160,229,235, 85, - 85, 85, 33,159,243,227,207,105,181, 90,107,205,235, 34, 30,138, 95,214,173,168,187,154,208,123, 29,181,208,235,245,181,134, 77, - 84,218,165, 12,151, 8,242, 3, 60, 41,165,232,252,208,244, 26,167,136,231,106,237,143,234,213, 31, 68, 16, 33,213,204, 91, 10, -183, 48,132,156, 63,127,222, 58,122,244,232, 77,148,210, 15,110,188,241,198,159, 80,243,176, 58,106, 54,155,117,162, 40, 74, 0, -126, 5, 64, 47, 92,184, 16,117,250,244,105,201,102,179, 53, 15, 23,206,205,155, 55,227,232,209,163,232,209,163,135,226,124,202, -155, 60,124,127, 49, 14, 86,160, 39,194, 7,123,146,123,125, 28,172,168,168, 40,104,181, 90,188,248,226,139,208,104, 52, 48, 24, -106, 70, 65,231,207,159,175,164, 57, 3, 3, 3,195, 95, 9,245,126, 97,179, 36, 73,124,176,225,195,112, 67,133, 30,143,231,212, - 53,215, 92, 83,223,235,157, 11,115, 67, 60,181,101,203, 22,141,255, 11,105, 3,189, 0,215,231,191,176,156,187,119,239,214,132, - 56, 63,208,247,115,245,137,187,154,249, 43,110,183,251, 52, 43,162,151, 14,110,183,251, 84,239,222,189, 3,239,124,238,165, 96, -249,122, 46,140,104,249,185, 93,187,118,103,204,102,243, 87,137,137,137,165,219,182,109,139,235,213,171, 87,156,239, 49,189,122, -245, 74,246, 59,205,129, 16, 43,122, 9, 33,167,238,184,227, 14, 77,152,242,232,255,253, 84,152, 78,197,169,188,188, 60, 77,160, -242, 30,236,147, 82,122, 74, 69,178,158, 24, 49, 98, 4, 23,168, 14, 5, 72,203,243,172, 20, 50, 48, 48, 92,177, 2,203,102,179, - 21, 14, 26, 52, 40,224,186,111,139,197,114, 50,212,185, 7, 15, 30,236,217,208, 17, 56,125,250,116,198,159,129,179, 49,226,206, -112,249,231,209,193,131, 7,123, 3, 64,121,121, 57, 66,189,254,166, 62, 40, 44, 44,108,240,242,217, 24,156, 0,112,232,208,161, - 62,172,100, 49, 48, 48, 48,129,165, 2,106, 31,199,192,192,192,192,192,192,192,192,112,165,130, 99, 73,192,192,192,192,192,192, -192,192,208,176, 32,168, 89, 9, 16, 8,245, 89, 29,208,229, 34,174,125,128,113, 50, 78,198,201, 56, 25, 39,227,100,156, 87, 28, -103, 56,238,203,114,117,226,229,134, 46,140,147,113, 50, 78,198,201, 56, 25, 39,227,100,156, 87, 26,216, 16, 33, 3, 3, 3, 3, - 3, 3, 3, 67, 3, 67, 96, 73,240,135,129, 7,224,105, 40, 50, 74,105, 52,128, 96, 47,116,115, 16, 66,202, 46,146, 87, 11, 64, -244,110, 0,224, 2,224, 34,132, 56, 88, 22, 50, 48,252,181,144,158,158, 62,153, 82, 58, 27, 53,111,129,122, 49, 55, 55,247, 45, -150, 42, 12, 12, 13, 44,176, 90,183,110,189,135,227,184,212, 64, 47, 32, 14,246, 92, 28,143,199,115,234,200,145, 35,106,151,186, - 11,201,201,201, 99, 77, 38,211,245, 60,207,247,245,158,191,173,186,186,250,251,179,103,207,126, 10,192,125, 49, 17,106,217,178, -101,164,205,102,187,149, 16, 50,193, 43, 16, 62,210,235,245,255,119,252,248,241,138,139, 76,163, 54, 73, 73, 73, 31,137,162,200, - 23, 22, 22, 94, 15, 0,205,154, 53,251,222,225,112,120,138,139,139, 39, 0, 56, 90, 79, 62, 78,163,209,100, 93,115,205, 53,253, -182,108,217,242, 63, 0,239, 52, 80, 94,234, 56,142, 59, 17,104,135, 36, 73,105, 23, 33,172, 52, 0,162,230,207,159, 31,187,116, -233,210,238,103,207,158,237, 10, 0,201,201,201,251, 39, 78,156,248, 3,165,244, 87, 0,229,132, 16, 39,171, 70,127,110,180,109, -219,118, 15,199,113,169,245,121,150,156,247, 21, 85,167, 14, 29, 58,212, 51, 24, 39,207,243,169, 97,158, 71, 87,231,187, 36, 73, -191, 28, 60,120, 48,224, 35, 35,218,181,107,183,131,231,249,150,225,194, 22, 40,156,193, 30,193,209,174, 93,187, 61, 60,207,167, -214,151, 83,146,164, 95,242,242,242, 50, 26,146,243, 82,135, 19, 0, 50, 51, 51,117,213,213,213, 31,153,205,230,110,213,213,213, -147, 37, 73,122,118,227,198,141,137, 28,199, 97,240,224,193,207,166,167,167, 31,215,233,116, 11,108, 54,219, 15,102,179,121,252, -166, 77,155,236,172,198, 48, 48,252,254, 70,247, 92, 85, 85, 21,149, 33, 73, 18,117,185, 92,212,110,183, 83,171,213, 74,171,171, -171,105,101,101, 37,173,168,168,160,229,229,229,180,180,180,148,118,238,220,217,255,161,139, 1,199,104, 83, 82, 82,186,180,111, -223, 62,255,173,183,222,178, 23, 22, 22, 82,167,211, 73, 93, 46, 23, 45, 44, 44,164,111,191,253,182,189,125,251,246,249, 41, 41, - 41,193,198,119, 3,253,207, 37, 39, 39, 15, 73, 78, 78, 94, 62,108,216, 48,199,250,245,235,169,221,110,167, 22,139,133,174, 94, -189,154, 14, 24, 48,192,145,156,156,188, 60, 57, 57,121, 8, 2, 15,139, 6,187, 86,247,150, 45, 91, 30, 61,117,234,148,103,203, -150, 45,206,184,184,184, 47,227,226,226,190, 44, 44, 44,244,156, 60,121, 82, 74, 77, 77, 61, 10,160,123, 61,194, 9, 0, 55, 79, -155, 54,173,224,248,241,227,150,204,204,204, 29, 62,255, 19,132,127,114,123,151, 64,206, 21,165, 52,145, 82,154,132,154,135, 83, -214,217, 40,165, 73,222, 99,162, 85,114,154,142, 29, 59,150,154,152,152,152,229,117,170,106,241, 17, 66, 28,137,137,137, 89,199, -142, 29, 75,165,148,154,234, 17,247,223, 3,198,217, 72,156, 87, 93,117, 85, 81,117,117, 53,165,148, 82,143,199, 67,157, 78, 39, -181,217,108,212, 98,177,208,170,170,170, 90,245, 92,222,202,202,202,104,151, 46, 93,206,133,224, 60,103,177, 88,106,181, 29, 14, -135,131,218,108, 54,106,181, 90,169,197, 98,161,213,213,213,181,182,170,170, 42,218,189,123,247,194, 16,156,103,229,112, 74,146, - 68,221,110, 55,117, 58,157,212,225,112, 80,187,221, 78,109, 54, 91,173, 77,254,175,119,239,222, 65,195,217,161, 67,135,115, 86, -171, 85, 53,167,188,245,232,209,227, 76, 67,113,202,255, 93,125,245,213, 69,161, 56,109, 54,219,197,132,179, 48, 84, 89, 74, 79, - 79,255,252,248,241,227,212,106,181,210, 33, 67,134,216, 31,121,228, 17,234,241,120,104,118,118, 54, 29, 59,118, 44,189,231,158, -123,104,105,105, 41,157, 49, 99, 6,237,209,163,199, 23,172, 30, 49,206, 70,230,188, 50, 28, 44,142,227, 96, 50,153,240,241,199, - 31, 7,124,253,140,255,247,180, 52,117, 38, 73, 98, 98, 98,207,212,212,212, 77, 43, 87,174, 52, 36, 36, 36, 40,255, 59,157, 78, - 68, 70, 70,226,174,187,238,210, 14, 30, 60,184,237,237,183,223,190,211,237,118,103,158, 59,119,110, 79, 40,190,164,164,164, 49, -113,113,113,111, 77,157, 58, 53,113,244,232,209,136,137,137,169,181,127,212,168, 81, 24, 57,114,164,230,151, 95,126, 25,247,233, -167,159,142,251,223,255,254, 87, 84, 85, 85,245, 96, 81, 81,209,231,161,120,141, 70,227,224,182,109,219,190,191,126,253,250,212, -232,232,104, 52,109,218,148,123,230,153,103,186,180,110,221,218,144,156,156,204,157, 57,115, 6,159,127,254,121,235,137, 19, 39, -174, 58,121,242,228,100,187,221,190, 94, 69,244,181,177,177,177,143,253,235, 95,255,138,171,172,172,116,239,221,187, 87,118,191, -180, 58,157,238,217,107,175,189,182,199,198,141, 27, 63, 1,176,248, 98,156, 43, 74,105, 5,126, 27,202,147,225,146,247,171,113, -178, 40,165,218,189,123,247,198,244,237,219,247, 11,187,221,222,227, 31,255,248,199,233, 87, 94,121, 69, 27, 25, 25, 25, 9,128, -148,149,149, 93,152, 57,115,166,231,141, 55,222,120,162, 83,167, 78,131,182,109,219,118, 51,165,148, 13, 25,254,201, 97, 52, 26, -177,122,245,234,128,175,153, 10, 84,231,163,163,163,195,190,141,192, 96, 48, 96,237,218,181,202,121,190,175,150, 10,244, 61, 58, - 58, 26,148,210,144,164,122,189, 30, 91,183,110, 85, 94, 3, 20,172, 93,146, 63,141, 70, 35, 8, 33, 92, 56,206, 77,155, 54,133, -229,146, 63,205,102, 51, 80, 51,196, 31, 54,156,225,226, 44,127, 55,153, 76, 97,211, 83,167,211, 41,156,190, 28,193,126,155, 76, - 38,132,235,180, 25, 12,134,110,137,137,137,200,201,201,193,243,207, 63,175,237,220,185, 51,242,243,243,193,113, 28, 38, 79,158, -140, 78,157, 58,161,168,168, 8,157, 58,117,194,214,173, 91,187,179,154,194,192,208, 0, 2, 75, 70,176, 6,214,255, 59, 16,240, - 53, 24,181,150, 90,166,165,165,233, 68, 81,252,108,245,234,213,134,184,184,223,222, 22,226,112, 56, 80, 89, 89,137,170,170, 42, - 84, 86, 86,194,100, 50, 97,193,130, 5,134, 9, 19, 38,124,166,211,233,218,157, 56,113,194, 30,140,147, 16, 50,111,223,190,125, -137,110,183, 27, 90,173, 54,168, 88,108,211,166, 13, 30,124,240, 65,244,235,215, 47,105,220,184,113,243, 0,124, 30,140, 19, 0, -146,147,147,223,222,182,109, 91,170, 86,171, 69,126,126, 62, 78,157, 58,133, 41, 83,166,164, 73,146,132,194,194, 66,228,231,231, -227,204,153, 51,120,239,189,247, 82, 39, 76,152,176,224,244,233,211,109, 67,197,221,139,123, 30,121,228,145,182, 49, 49, 49,220, - 43,175,188, 82, 94, 85, 85,245,158,247,255, 25,243,231,207, 31,159,153,153, 25,255,143,127,252,131,110,219,182,237, 99,212,188, - 46, 37,104,122,250,206,185,242, 14,231, 1,128,135, 82,122,216,239,156, 14, 62,251, 65, 41, 77, 4, 96, 39,132,148, 7,224, 36, - 0, 34,135, 15, 31, 62,205,110,183,247,216,178,101,203,209,126,253,250,165, 1, 56, 75, 41, 61, 15, 0, 49, 49, 49,166,215, 95, -127, 61,113,212,168, 81, 63, 13, 30, 60,184,199,240,225,195,167,157, 63,127,126, 54,165,180,132, 16, 66, 67,196,253,247,130,113, - 54, 18,167,119, 40, 9,130, 32, 96,196,136, 17, 32,132, 4,124,223,230,142, 29, 59, 48,104,208, 32,136,162,136,187,239,190, 91, - 53,231,176, 97,195,224,118,187,235,240,249, 11, 16,249, 29,157,161,226, 78, 41,173,245,142,208, 64,226,194,119, 11,192, 87,135, - 83,146,164,128, 92,193, 68,150,252,178,122, 53,113, 87, 43, 46,195,133,211,151, 83, 20, 69,100,100,100, 96,239,222,189, 33,197, - 86,184,112, 2, 64,117,117,245,157, 55,222,120,227,154, 41, 83,166,232, 1,160,164,164,164,214,139,232,143, 28, 57, 2,187,221, -142,101,203,150,193,110,183,223,203,234, 17,227,108,100,206, 80,157,127, 17,192,213, 0,226, 81, 51,127,185, 18, 64,180,247, 94, -169, 5, 80, 10,192,224,221,236, 0,170, 0, 52,241,158, 94,226,237,108,248,190,166,236,188,239, 75,161, 41,165,189,188,220,242, - 43,187,226,125,142,149,175,225,255,219,255,179, 22,183, 92,171,229,225,159, 76,223, 10, 45,191,132, 53,156,184,146, 27, 71, 21, - 9,244,192,140, 25, 51, 18,125,197,149,221,110, 71, 69, 69, 5, 42, 43, 43,149,207,252,252,124,104,181, 90,140, 29, 59, 54,145, - 82,250, 64, 24, 90, 13,207,243,216,187,119, 47, 86,174, 92,137,227,199,143,215, 57,224,216,177, 99,120,253,245,215,241,234,171, -175,162,162,162, 2, 0, 52,193,200,186,117,235,246,252,248,241,227,119, 14, 24, 48, 64, 39, 8, 2,246,237,219,135,118,237,218, - 97,251,246,237, 56,121,242, 36, 46, 92,184,128, 35, 71,142,160, 75,151, 46, 56,122,244, 40, 42, 42, 42,208,185,115,103, 93,143, - 30, 61,182,164,165,165, 61, 31, 42,156, 41, 41, 41, 79,254,235, 95,255,210,157, 61,123, 86, 90,178,100,201, 54, 0,219, 1, 76, -121,234,169,167, 38, 13, 27, 54, 44,254,240,225,195, 21,187,119,239,222, 19, 68, 92, 5,114,174, 78,114, 28,119,130, 82, 90, 65, - 41,181,162,102, 2,122,173,155,145,219,237,182, 91,173,214,242,210,210,210, 18,142,227, 78,112, 28,151, 15, 64, 23,140,115,226, -196,137,173, 75, 74, 74,238,255,247,191,255,125,188, 95,191,126,105,148,210, 35,148,210, 82,111,129,181,187,221,238,210,178,178, -178,159,250,246,237,155, 60,126,252,248,163, 37, 37, 37,247, 79,156, 56,177,117, 8, 78,134,203, 31,212,227,241, 64, 20, 69,108, -220,184, 17, 91,183,110,197,214,173, 91,177,109,219, 54,108,223,190, 29, 59,118,236,192,142, 29, 59, 32, 8, 2,182,111,223,142, -237,219,183,227,193, 7, 31, 12, 91,231, 61, 30, 15, 4, 65,192,166, 77,155,176,107,215, 46,101,219,189,123, 55,118,237,218, 5, -131,193,160, 70, 12,249,118,166, 20,206, 64,219,219,111,191,173,136, 67,185,109,226, 56, 46,164, 43,230, 47, 92,252, 5, 75, 90, -139, 22,117,246,133, 11,167, 44,218, 4, 65,192,127,255,251, 95,156, 62,125, 26,111,190,249, 38,142, 29, 59,134,151, 95,126, 25, -121,121,121,152, 53,107, 22,118,239,222,141, 25, 51,102, 96,203,150, 45,242,203,223,105, 56, 78, 89, 92, 57,157, 78, 37, 60, 71, -142, 28,193,156, 57,115,176,111,223, 62, 60,251,236,179,216,177, 99, 7, 30,123,236, 49,240,124, 72,147, 13,233,233,233,147, 9, - 33,159,182,111,223, 94, 55,112,224, 64, 8,130,128, 57,115,230, 72,207, 62,251,108,241, 83, 79, 61, 85,156,157,157, 77, 91,183, -110, 13,135,195,129,136,136, 8, 80, 74, 23,167,167,167, 63,192,170, 11, 67, 99,182, 69,254, 90,196, 7,215,205,152, 49, 99, 32, - 33, 36, 59, 35, 35, 99, 34,128,104, 66, 72, 54, 0,173,247, 51,110,198,140, 25,189, 9, 33,217, 51,102,204,232, 9,160, 9, 33, - 36,219,251,251,122, 0,113,242,111,239,241,241,126,226, 45,222,231,255,120,191, 99,181,129,126,251,127,250,115,251, 58, 88,196, - 27, 49,226,219, 64,214, 71, 96,133,107,112,205,102,243,200,225,195,135,107,124,197,149,175,115, 37,127, 86, 86, 86,226,167,159, -126, 66,151, 46, 93, 52,102,179,121, 36,128,255,132,181,226, 4, 1, 77,155, 54, 69, 73, 73, 9, 14, 28, 56,128,180,180, 52,184, - 92, 46,124,247,221,119, 40, 43, 43,131, 70,163,129, 70,163,129,195, 17, 90,187,116,232,208, 97,196,210,165, 75,123,254,239,127, -255,187, 32, 8, 2,142, 28, 57,130,143, 62,250, 8,148, 82, 52,105,210, 4, 22,139, 5,197,197,197,152, 55,111, 30,156, 78, 39, -204,102, 51, 82, 82, 82,244, 15, 60,240, 64,191,153, 51,103,138, 39, 78,156, 8, 38,178,174, 25, 51,102, 76,100, 68, 68, 4, 30, -126,248, 97,201,233,116,190, 10,224,218, 49, 99,198, 60,249,224,131, 15,198, 22, 20, 20, 56,238,185,231,158, 61, 78,167,115,158, -108, 30,250, 11,166, 0,130, 53,168,115,229,118,187,229, 52, 61, 94, 89, 89,137,132,132,132,230,148, 82, 77,152, 60,210,108,223, -190, 61, 3, 0,255,194, 11, 47,232, 41,165,231,124,195,224,116, 58,101, 78,119,121,121,121,241, 99,143, 61,230, 94,190,124, 57, -239, 61,231, 16, 0, 27,107, 31,254,124,144,133,139, 40,138, 24, 49, 98, 68, 45, 65,177,121,243,102, 12, 31, 62, 92,169,239, 26, -141, 70, 57, 46, 28,167,175, 43, 38, 59, 79, 50,239,247,223,127, 95,199,121, 81,217, 73, 83, 28,150, 64,194,199, 95,116,201, 29, - 69, 53, 98, 40,144,200,146,219, 22,127,103, 72, 77, 56, 69, 81,196,131, 15, 62, 8, 65, 16,240,216, 99,143, 65, 20, 69, 92,125, -245,213, 16, 4, 1,125,250,244,129, 32, 8,184,254,250,235, 85,119, 80,229,112,238,216,177, 3,233,233,233, 74,120,174,190,250, -106,244,234,213, 11,130, 32,160,127,255,254, 16, 4, 1, 67,135, 14, 13,203, 73, 41,125,118,227,198,141,137,102,179, 25, 63,253, -244, 19,120,158, 7, 33,164,116,239,222,189,137, 0,112,195, 13, 55,148,216,108,182, 56,155,205,134, 65,131, 6, 33, 35, 35, 35, -126,249,242,229,207, 0, 96, 43, 11, 25, 26,181, 73,242,215, 34,178, 1,144,149,149, 53,135, 82, 58, 42,216,137,242,126, 66, 72, -246,220,185,115, 71,121,203,121,157,223,178,203,228, 39,222, 58,251, 58, 80,242,121,190,215, 11,117,109,191,227,207,251, 11, 44, - 10, 96, 64,160, 70, 55,144, 85,238,255, 93, 77, 3, 97,179,217,174,150,221, 43,155,205, 86, 75, 80, 85, 85, 85,213, 18, 90, 14, -135, 3,173, 90,181,130,205,102,187,186,190, 55,139,228,228,100, 56,157, 78, 44, 90,180, 72, 17, 86,190, 34, 33, 20, 14, 30, 60, -120,124,231,206,157, 61,210,211,211, 99,190,248,226,139,243,131, 7, 15,142, 31, 54,108, 24,244,122, 61,108, 54, 27,220,110, 55, -174,185,230, 26,116,232,208, 1,197,197,197,248,230,155,111, 74,218,181,107,215, 36, 39, 39, 71, 42, 42, 42, 58, 17,130,122,208, -160, 65,131, 64, 8,193, 55,223,124,243, 43,128, 92,189, 94,255,249,156, 57,115,162,237,118,187, 52,105,210,164,194, 95,127,253, -245, 49, 0, 46,173, 86,251,159,235,174,187,238,154,245,235,215,127, 34, 73, 82,189, 27, 51,187,221, 94, 43,109, 43, 43, 43, 97, - 52, 26,213, 60, 18, 66, 44, 43, 43,235, 10, 0, 70,163, 49, 22, 62, 43, 36,173, 86,171,146, 71,222,252,177,197,198,198,154, 0, -192,123,142,200,218,133, 63, 47,228,155,247,198,141, 27,107,213,111,217,129,242,175,243, 90,173, 22,171, 87,175, 86,197,233, 43, -166, 84, 12,231,133,116,155,100,129, 37, 8, 2,222,123,175,102,132,253,225,135, 31, 86,206,247,191,134,154,246, 66, 22, 67,130, - 32,160,195,115, 18, 0, 39, 78,189,166,135, 40,214, 20,105,255, 48,123, 27, 83, 85,174,216,155,111,190,137, 81,163, 70, 33, 59, - 59, 59,228,231,200,145, 35, 85,133, 83, 16, 4,232,116,186, 90,194,111,223,190,125, 1,121, 23, 46, 92, 24,118, 78,155, 36, 73, -248,234,171,175,192,113, 92, 45,199,235,233,167,159,254,151,201,100, 50,111,218,180, 9,231,206,157, 67,117,117, 53,170,170,170, - 16, 19, 19, 19, 61,104,208,160,125, 69, 69, 69, 5,135, 14, 29,186,153,213, 28,134, 70,114,177, 6, 4,248,223, 58,125,250,244, - 39, 9, 33,217,211,167, 79,127,114,238,220,185,121,222,186,145,237, 87, 87,178,195,212,165,108,175, 24,218,237,173,203,218,130, - 51, 63, 0, 0, 32, 0, 73, 68, 65, 84,189,252,196,219,121, 66,200,110, 74,233, 13,193,206, 5,224,240, 19, 84,181,134, 8,101, -238,144, 14,150,255,220,132, 80,223,189, 22,119,184, 6, 87, 32,132,212, 17, 0,129, 28, 44,151,203,133,210,210, 82, 72,146,212, -160,207,234, 10, 39,176, 14, 28, 56,112,215,228,201,147,207, 68, 69, 69,117, 43, 45, 45, 61,171,211,233,250,111,222,188,185,153, -203,229, 66,100,100, 36, 34, 35, 35,241,245,215, 95, 35, 42, 42, 10,255,254,247,191, 79, 90,173,214,237, 38,147, 41,209,106,181, -254, 88, 84, 84,244,116, 80,229, 34,138,131,250,247,239,143,220,220, 92,148,149,149,109, 0,208,109,194,132, 9, 67,155, 53,107, - 70,102,207,158,109, 59,122,244,232, 91, 0,206,155, 76,166,255, 46, 93,186, 52,179, 71,143, 30,230, 73,147, 38, 97,211,166, 77, -239,215,199, 25,178, 88, 44,181,132,149,156,166, 17, 17, 17,170,158,185,229, 77,111, 74, 8,161,114,207,223, 87, 88,249, 8, 96, -202,243,188, 4,128, 54,116, 30, 49, 92,122, 7, 75,174,235,127,251,219,223,234, 76,110,215,104, 52, 88,179,102, 13,110,186,233, - 38,165,195,146,158,158,174,218,109, 26, 61,122,180, 34, 8,214,172, 89, 19, 84, 96,133, 27,210,242,119,155, 30,122,232, 33,136, -162,136,183,222,122, 11, 83,167, 78, 5,207,243,120,237,181,215,192,113, 28,158,121,230,153,122,139, 75, 81, 20,113,252,165,154, -207,212, 71, 42, 80,250, 78, 34, 0, 32, 34, 50,178, 38, 62,146,164,254, 14,225,141,123, 56,231,202, 87, 88,133, 27, 34,244,117, - 1,243,243,243,149,239,125,250,244,169,229, 92, 9,130, 16, 86,176,121,175, 55,107,224,192,129,179, 83, 83, 83, 19,166, 76,153, - 66, 4, 65, 64,207,158, 61,155, 12, 30, 60,184, 92, 16, 4,253,163,143, 62, 26,104, 42,133, 8,160, 91,199,142, 29, 77,172,230, - 48, 92, 98, 7,203, 62,119,238,220,188,185,115,231, 6,116,168,252,157,164, 80, 78,147, 44,172,188, 66, 40, 94, 22,109,168,153, -159,188, 59,220,185,240, 14, 9, 6,114,185,124,225,239, 96,205,244,111,120,212, 8, 44, 53,243, 39,188,174,200,254,146,146,146, - 62, 58,157, 14, 21, 21, 21,117,110,218,190,162,128,231,121, 20, 23, 23,195,104, 52,238,111,200,156, 11, 55, 68, 8,192,246,243, -207, 63, 79,243,249,221,107,236,216,177,203, 63,249,228,147, 86,235,214,173, 67, 78, 78, 14,154, 52,105,130, 57,115,230,252, 82, - 80, 80, 48, 30,192,238,226,226,226,176,215,109,221,186,117, 39,179,217,140,109,219,182, 1,192, 22, 0,119,222,119,223,125,196, -233,116, 98,193,130, 5, 22, 0,235,162,162,162, 62, 95,177, 98, 69,183,110,221,186,233,214,173, 91, 87,153,147,147,179, 81,165, -184,242, 80, 74, 3, 10,171,202,202, 74, 84, 87, 87,195,108, 54,171, 17, 88,238,200,200,200, 3,149,149,149,183, 90,173,214, 10, -157, 78, 23, 81, 81, 81, 97,247,117, 24,171,170,170, 80, 93, 93, 13, 65, 16,196,252,252,252, 51, 0, 90, 71, 70, 70, 30,192, 69, - 62,183,140,225,143, 7,199,113, 84, 22, 25,235,214,173, 11, 88,215, 69, 81,196,119,223,125, 87,171,190,127,243,205, 55, 97, 69, -155, 32, 8,202, 74,194,112, 14,150, 79,227, 26,218,102, 21, 69,240, 60,143,119,222,121, 7,148, 82,197,185,226, 56, 14,211,167, - 79,135, 78,167,195,139, 47,190,136,233,211,167,171,114,177,124, 93,177,150, 79, 88,127,107, 28,189,231, 58, 29,142, 26,151,158, -227,124, 69,150, 42,167, 45,220, 4,247,250,136, 96, 95,167, 77,167,211, 5,157,220, 30,224,102, 21, 16,185,185,185, 31,116,239, -222,253,104,124,124,252,218,140,140, 12,221,158, 61,123,240,224,131, 15, 18,187,221, 30,185,110,221, 58,229,186,129,210,171,186, -186, 90,207,106, 14, 67, 35, 58, 88, 51, 3,252, 31, 35, 11, 39,175, 24, 82, 91,119,178,125,143,151, 57,252, 69,145,215, 17,219, - 28,142, 43,208,185,193, 32, 4,171,132,254,141, 68, 56,161,165,166,247,105,181, 90,215,111,220,184,177,215, 77, 55,221, 36,132, - 26, 30,172,170,170, 66, 98, 98, 34,142, 29, 59,230,182, 90,173, 97, 31,127,224,241,168,127, 32,122, 56, 7, 43, 0,118,151,148, -148,184,157, 78, 39,218,182,109,139,148,148, 20, 88,173, 86,188,254,250,235,110, 0,187, 85,114,104, 76, 38, 19, 15, 0,229,229, -229, 64,205,106,135,118,237,218,181, 67,110,110, 46, 46, 92,184,176, 10,192,160,153, 51,103,118,191,246,218,107, 53,159,124,242, -137,229,222,123,239, 93,229,114,185,102,171,236,129, 59,220,110,119, 75,142,227,156,101,101,101,167,125,133, 85, 98, 98, 98,140, -217,108,230,138,139,139, 93,106,146,167,107,215,174,187, 78,157, 58,133, 23, 94,120,225,252,156, 57,115,218, 85, 86, 86, 94, 40, - 47, 47,119,203,194,170,162,162, 2, 86,171,149,139,143,143,215, 45, 92,184,208, 8, 0, 93,187,118,221, 5,128, 61,112,244,207, -220,162,249, 45,104, 9,244,168, 6,181,147,209,253,133,203,141, 55,222, 88,199, 17,147,183, 21, 43, 86,212,154,215, 20,110,232, - 77,230,124,251,237,183,241,240,195, 15, 67,167,211, 97,254,252,249,181,230, 96, 5,233, 17, 7,229,148, 69, 91,203, 39,172, 40, -122, 35, 22,162, 40, 34,238,222,115,181,134, 8, 3,196, 77,149, 16,156, 51,103, 78,131, 12, 17,250,138, 62,249,145, 56,139, 22, - 45,194,216,177, 99,177,101,203,150,139, 30, 34,108,217,178,229,210,215, 95,127, 93,119,232,208, 33, 84, 84, 84,224,252,249,243, -176,217,108, 40, 44, 44, 84,242, 48,136, 83,110, 96,181,134,161,145,220,171, 96, 56,239, 55,127,138,248, 14,215,133,248,244, 63, - 30, 62,255,249,242,158, 39,132,184, 2, 92,239,124, 0, 81,229,127, 13,223, 99,206, 7,114,176, 2,221,184, 85, 63,166,193, 59, - 65, 50,156, 16,152,247,220,115,207,221,223,175, 95,191,216,200,200, 72,156, 57,115, 38,160,131, 21, 25, 25, 9,167,211,137,141, - 27, 55, 86, 72,146, 52, 47, 76,134,184, 92, 46, 23, 18, 18, 18, 80, 82, 82, 2, 41,136,141,207,113, 28, 12, 6, 3,170,170,170, -128, 48,147,199, 3,221, 40, 92, 46, 23,156, 78, 39,156, 78, 39, 92, 46, 87,125, 11,141,193,251, 76, 26, 84, 87, 87, 3, 64,117, -211,166, 77, 91,235,245,122,121,213, 99, 62,128,129,195,134, 13, 19, 75, 75, 75,233, 61,247,220,179,131, 82,250, 96, 24, 87,200, -177,113,227,198, 22, 0, 96, 48, 24,242, 1,160,176,176,208, 85, 86, 86,134,170,170, 42,197, 33, 52, 24, 12,184,249,230,155,147, - 40,165,216,184,113, 99, 11,141, 70, 67, 67,136, 33,123,118,118,246,193,168,168,168,229, 89, 89, 89,227,111,184,225,134,188,174, - 93,187,182,172,170,170, 42,182, 88, 44, 86,171,213, 74, 5, 65,208,196,197,197,233,214,174, 93,123,116,199,142, 29, 67, 34, 35, - 35,151,103,103,103, 31, 68,205, 42, 67,134, 63, 99,139,230, 55,183, 41,144,168,170,207, 10, 58, 95,225, 34, 8, 2,190,251,238, -187,144, 46,142, 90, 78, 95,145, 49,109,218, 52,188,241,198, 27,117, 28,172,217,179,107,250, 36, 79, 61,245, 84,189, 28, 34, 65, - 16, 80,244, 70, 44,146, 30,250,181,142,131, 69,188,225,171,207, 16,161,124,254,172, 89,179, 32,138,162, 50,132, 55,100,200,144, - 90, 67,131,106,133,149, 47,103,113,113, 49, 4, 65, 64,108,108, 44,198,143, 31,143,161, 67,135,214,225, 83,203, 91, 88, 88,248, -195,171,175,190,218, 60, 37, 37, 5,159,124,242,137,195,100, 50,105, 7, 14, 28, 72,203,203,203, 73, 40, 7,203,106,181, 50, 7, -139,225, 82,183, 83,187, 47, 37,111, 67, 92, 79, 8,215,232,254,206,199, 52,116,129,207,179, 50, 78,156, 56, 81,158,148,148, 52, - 97,220,184,113, 95,188,243,206, 59,134,214,173, 91,227,200,145, 35,184,112,225, 2,156, 78, 39, 52, 26, 13,154, 54,109,138,170, -170, 42,124,246,217,103, 22,139,197, 50,161,168,168,168, 60, 20, 39, 33,228,169, 17, 35, 70, 44,124,250,233,167,245,157, 58,117, -194,133, 11, 23, 80, 85, 85,165,244,188, 8, 33,136,140,140,132,209,104,196,129, 3, 7,176, 99,199, 14, 43, 33,228,169, 80,156, -129,132,166, 44,172,100,161, 21,110,101,146, 31,167,201,104, 52,202, 61, 63, 0,112, 55,111,222, 60, 17,128, 44,176, 78,180,106, -213,234,233, 54,109,218,144,165, 75,151, 82, 74,233,186, 32,226, 74,225, 36,132, 92,160,148,150, 1, 72,116, 56, 28, 26, 0,168, -168,168,112,198,197,197, 37,232,116, 58, 73,167,211, 73,122,189, 94, 58,123,246,172,219,237,118,107, 0, 32, 51, 51,211, 1,224, -156,223, 92, 15, 95, 78,137, 82, 90,185, 96,193,130,231,239,188,243,206, 62,125,251,246,237,124,207, 61,247, 28,186,247,222,123, -145,146,146, 18, 83, 85, 85,101,203,207,207, 47,123,231,157,119,108,187,118,237, 26, 34,138,226,137, 5, 11, 22, 60, 15,160,146, - 16, 34,169, 77,207,139, 4,227,108, 36, 78,185, 60, 4, 18, 86,190,191, 85, 8,161, 90,225,148, 69,219,173,183,222,170,172, 62, -244,119,174,234,203, 9, 64, 89, 65,248,248,227,143,215, 10,223,211, 79, 63,173,182, 87,236, 27,119,197,109, 18, 4, 1,229,139, - 82,106,137,191,122,136,170, 58,156,130, 32,224,217,103,159, 85,237, 96, 5,152,131, 21, 52,156,153,153,153,168,174,174,134, 40, -138, 88,179,102, 77, 80, 7, 43, 92,122, 26, 12,134,241,171, 86,173,250, 72,167,211,117,117, 56, 28,119,151,148,148, 44,177, 88, - 44,205,203,202,202, 66, 58, 88, 54,155, 77,199,234, 17,227,196, 37,126, 22,214,159, 13, 33,187,120,110,183, 27,205,154, 53,171, -245,110, 43,121, 50, 59,207,243,202,202, 19, 53, 43, 8,101, 20, 21, 21,173, 1, 48,230,230,155,111, 94,118,231,157,119, 70,116, -232,208, 65, 76, 75, 75,131,213,106, 69, 65, 65, 1, 10, 10, 10,220, 27, 54,108,168,176, 88, 44,183,123,143, 13,137, 51,103,206, -252,207,237,118,127, 55,113,226,196,103,187,119,239, 62,101,234,212,169,124,171, 86,173, 80, 94, 94,142,152,152, 24,196,199,199, -163,160,160, 0,159,125,246,153,167,172,172,108,161,199,227,153, 85, 92, 92,124,190, 62,137,228,118,187,121,151,203,133,113,227, -198, 65,146, 36,204,159, 63, 31,110,183,155,175, 7,133,211,233,116, 82, 0,164,164,164, 4, 0, 44,178,224,250,249,231,159, 1, -224,100,139, 22, 45,204, 0,176,126,253,122,130,154,231, 99,169, 81,222,148, 82,170, 56, 89, 29, 58,116, 40,240,111, 20,101,231, - 74,118,189,194, 77,164, 37,132,216, 40,165,231,237,118,251,176, 71, 30,121,228,217, 69,139, 22,141, 95,180,104, 81,157,227, 34, - 35, 35,151,191,246,218,107,179,198,143, 31,127,158, 16,194, 30,207,240, 87,104, 12,252,220,170,250, 78, 1, 8,198,249,229,151, - 95,214,231,225,154, 33, 93, 49, 66, 72,192, 21,137,161,218, 32, 21,157,161,160, 15, 20,253, 61,174,160, 32, 8,120,229,149, 87, - 20,231,202,119,242,249,197, 56, 88, 50,103,108,108,108, 77,175,205,100,130, 36, 73, 24, 57,114,228, 69,243,122,223, 45, 56, 70, -254,157,158,158, 62,235,227,143, 63,158, 77, 41,141, 3, 32,248,166,129,154,116,100, 96, 96, 80, 33,176, 60, 30,207,169, 1, 3, - 6,192,183,247, 20,238,101,173,110,183,251,148, 74,145,245, 93,203,150, 45, 91, 45, 90,180,232, 97,147,201, 52,216,102,179,117, - 5, 0,189, 94,191,191,186,186,122, 29,199,113,175, 23, 21, 21,169,126, 57,179, 87, 48, 61,192,113,220,252,137, 19, 39,206,206, -200,200,184,229,158,123,238, 33,130, 32,224,211, 79, 63,165,167, 79,159, 94,193,113,220, 83,103,207,158, 61,118, 49,137,100, 52, - 26,127, 90,177, 98, 69,235, 47,191,252, 18, 46,151, 11, 11, 23, 46,132, 78,167,251,169, 30, 20,231, 55,108,216,176,172,111,223, -190,227,119,236,216,177, 28,192,129, 45, 91,182,124,116,221,117,215, 77,216,190,125,251,255, 1, 56,180,113,227,198,143, 50, 50, - 50, 38,236,218,181,235,115, 0, 63,214,163,209, 85,156, 44,183, 59,240,136, 98, 16,231, 42, 20,103, 5,165,212, 57,121,242,228, - 71,110,185,229,150, 69,185,185,185,215,200,143,111,136,142,142,222,159,158,158,158,179, 98,197,138, 35, 94,231,138,137,171, 63, - 57,228, 9,233, 49, 49, 49,224, 56, 78,217,228,167,121,215, 87, 8,201,156,148, 82,196,196,196, 4,236,152,133,224, 12,169,106, - 40,165, 48,155,205, 10,167,202,213,203, 97,109, 40,179,217, 92, 43,140, 42, 64,195,197,221, 63,156,106,210, 44, 28,167,201,100, -130,211,233, 84,205, 9, 21,139, 6,124,145,155,155,251, 1,128, 15,218,180,105,243, 51,128, 54, 76, 84, 49, 48, 52,130,192, 58, -114,228, 72,207,198,188,240,241,227,199, 43, 0,204,242,110, 13,130,211,167, 79, 31, 3,112,235,214,173, 91,255,179,125,251,246, -103,188,141,235, 11,225,222,103, 24, 14, 63,254,248,227, 77,162, 40, 46, 88,188,120,113, 6,165, 20, 81, 81, 81,219,143, 30, 61, -122, 95,125, 56, 60, 30,207,148, 29, 59,118, 76,133,119, 85,160,195,225,152,178,117,235,214, 71, 1, 84,203,251,119,238,220,169, -252,174,231,205,140, 82, 74, 29,148,210,228, 32,135, 56,212,138, 43, 63, 39,203,177, 98,197,138, 42, 0,251,240,219,115,174, 92, -222,205,238, 55, 44,200,240, 39,133,219,237, 62, 61, 96,192, 0, 33, 92, 7, 42,192,121,167, 66,117,208,250,247,239,143,139,224, - 60, 29, 34,168, 39, 50, 50, 50, 56,181, 92, 50, 92, 46, 87,113, 8,241,117,170, 79,159, 62, 1,195, 25, 38,205, 66,198,189, 79, -159, 62,245, 10,163, 55, 44,167, 27,154, 51, 76,122, 6,133,213,106,189, 16, 31, 31, 95,101,179,217, 68,187,221, 46,250, 59,246, - 6,131,225,188,213,106,101,149,135,129,225, 15, 4,123,211, 56,227,100,156,140,147,113, 50, 78,198,201, 56,175, 56,112, 44, 9, - 24, 24, 24, 24, 24, 24, 24, 24, 26, 22, 36,132, 10,173,207,234,128,139, 81,178, 7, 24, 39,227,100,156,140,147,113, 50, 78,198, -121,197,113,134,227,102,171, 19, 27, 73,120, 49, 78,198,201, 56, 25, 39,227,100,156,140,243,202,227,252, 75,129, 13, 17, 50, 48, - 48, 48, 48, 48, 48, 48, 48,129,197,192,192,192,192,192,192,192,192, 4, 22, 3, 3, 3, 3, 3, 3, 3, 3, 19, 88, 12, 12, 12, - 12, 12, 12, 12, 12,191, 3, 36, 37, 37, 37, 51, 57, 57,185,207,149,154, 0, 2, 43, 3, 12, 12, 12, 12, 12, 12, 12, 13,129,102, -205,154, 69,123, 60,158, 59, 1,220,215,186,117,235,214, 0, 64, 8, 57, 64, 41,125,221, 96, 48,124,116,236,216, 49,199, 21,163, - 48, 89,113, 96, 96, 96, 96, 96, 96, 96,248, 61, 72, 78, 78,238, 14,224, 62,131,193,112,251, 53,215, 92,163, 29, 56,112, 32, 98, - 98, 98,224,118,187,113,246,236, 89,108,216,176, 1,251,246,237,251,213,229,114, 45,112,185, 92, 11, 74, 74, 74,206, 93, 73, 2, -107,147,247, 51,147, 21, 21, 6, 6, 6, 6, 6, 6, 6, 53, 72, 74, 74,122,117,248,240,225,143,196,196,196,160,109,219,182, 72, - 74, 74,130,221,110,135,213,106, 5,165, 20,130, 32,128, 82,138,202,202, 74,236,217,179, 7, 57, 57, 57,238,138,138,138,229,132, -144,215,207,158, 61,251,131, 31,221, 95, 70,139,200, 2,139, 2, 24,224, 23, 57, 6, 6, 6, 6, 6, 6, 6,134,144, 72, 78, 78, - 62,183,126,253,250, 4,143,199,131,146,146, 18,216,237,118, 88, 44, 22, 69, 96,241, 60, 15, 74, 41,220,110, 55, 0, 64,146, 36, - 28, 58,116, 8, 59,118,236, 64, 97, 97,225,107, 69, 69, 69,211,254,138, 90,132,243, 83,141, 76, 92, 49, 48, 48, 48, 48, 48, 48, -212, 11,118,187, 29, 75,151, 46, 69, 73, 73, 9,154, 53,107,134,148,148, 20, 68, 69, 69, 65,175,215, 3,128, 34,174, 0,128,227, - 56,116,238,220, 25, 19, 38, 76, 0, 33,100,130, 31,213, 95, 70,139,176, 73,238, 12, 12, 12, 12, 12, 12, 12,191, 7, 46,167,211, -137,158, 61,123,226,248,241,227,200,205,205, 69,143, 30, 61,208,177, 99, 71,148,148,148,224,204,153, 51,181, 14,222,181,107, 23, -246,238,221,139,235,174,187,238, 47,157, 40,188,247,147, 0,120, 30,192,157, 0, 22,179,178,194,192,192,192,192,192,192,160, 6, - 17, 17, 17,191,110,218,180,105,104, 90, 90,154,152,158,158, 14,157, 78,135,147, 39, 79, 34, 39, 39, 7,102,179, 25, 93,187,118, -133,205,102,195,230,205,155,177,122,245,106,148,149,149,161, 69,139, 22,192,187,239,225,231,215,204,229, 85, 85, 85,243,254,138, - 90,196,119,146,123,166,247,115, 19, 43, 46, 12, 12, 12, 12, 12, 12, 12,106,145,156,156, 28, 71, 8,121,170,105,211,166,247,223, -126,251,237, 98,155, 54,109,112,234,212, 41,148,148,148,224,194,133, 11,216,185,115, 39, 0, 32, 37, 37, 5, 41, 41, 41, 40, 40, - 40,192,129, 3, 7,172,118,187,253,222, 51,103,206,252,239,175,168, 69,216, 99, 26, 24, 24, 24, 24, 24, 24, 24, 26, 74,104, 53, - 3, 48,179, 77,155, 54,147,198,142, 29,203, 53,109,218, 20,167, 79,159,198,134, 13, 27,208,186,117,107, 20, 23, 23, 99,207,158, - 61,158,138,138,138,133, 30,143,103, 86,113,113,241,121,150,106, 23, 7,246,166,113,198,201, 56, 25, 39,227,100,156,140,243, 10, -227, 76, 76, 76,236,144,156,156,188,114,232,208,161,244,157,119,222,161, 15, 60,240, 0,237,209,163,135,148,156,156,252,105, 74, - 74, 74,235, 43, 65, 0,177, 73,238, 12, 12, 12, 12, 12, 12, 12, 13,138,115,231,206, 29, 6,112, 19, 33,228,154,188,188,188, 39, - 1, 64,146,164, 23,206,157, 59,183,231, 74, 73, 3, 38,176, 24, 24, 24, 24, 24, 24, 24, 26, 5,103,206,156,201, 1,240,183, 43, - 49,238,236,101,207, 12, 12, 12, 12, 12, 12, 12, 12, 76, 96, 49, 48, 48, 48, 48, 48, 48, 48, 48,129,197,192,192,192,192,192,192, -192,112, 69,129, 32,248, 74,128, 3,245,224,185,152, 21, 10, 7, 24, 39,227,100,156,140,147,113, 50, 78,198,121,197,113,134,227, - 62,128, 43, 8, 23,251,188, 44,182,132,149,113, 50, 78,198,201, 56,255, 60,156,164,129, 56,137,119,227,188, 27,169, 39,247,165, - 10,231,159, 37,238, 87, 10,231, 95, 10,225, 86, 17,250, 38,146,228,221,104, 3, 9, 54,174, 1,249, 24, 26, 71, 84,203, 21,131, -178,124, 98, 96,248, 75,163, 33,219,122,185,237,224,125, 56, 61,222, 13,191,179, 45,105,140,123,210,229, 30,247, 43,153,243, 47, - 41,176, 8, 0, 18, 31, 31,191, 38, 33, 33,225,250,146,146, 18, 9, 0, 8, 33,224, 56, 14, 28,199, 65, 16, 4,107, 65, 65, 65, -100,125, 47,152,144,144,240,126,124,124,252,157,165,165,165,146,204, 69, 8, 1,207,243,224,121,222,122,236,216,177,200, 63, 58, - 81,122,244,232,113,193,225,112,152,253,255,215,106,181,182,189,123,247, 70, 92, 9,229,162, 93,187,118,183, 25,141, 70, 67,144, -253,244,135, 31,126, 88,164,150,172, 69,139, 22,187, 12, 6, 67,180, 32, 8,224,121, 30,130, 32,160,186,186,186,236,240,225,195, -189,189,251,183, 25, 12,134, 56,158,231,229,178, 5,155,205, 86,122,232,208,161,190,236,190, 87, 23,153,153,153, 2,234,255,136, - 21,247,166, 77,155,220,151, 42,140,148, 82,206,145, 27,209,134,184,173,221, 8, 71,163,168, 68,202,169, 96,248, 81,155, 94,121, - 84, 85, 75, 77,136,244, 7, 39,115,115, 0,110, 0,103,234, 29,247, 0, 61,118, 1, 24,238, 1,198,121,127,218, 56,160,148, 0, -249,113,192,103,231, 0,171, 95,227,123, 41,111, 68, 4, 0, 73, 77, 77,125, 61, 49, 49,241,174,202,202, 74, 11,207,243, 32,132, - 80, 66,136,156, 23,190,249, 2, 73,146, 78, 29, 60,120,176,103,152,155,172,216,188,121,243,215,226,227,227,239,176, 88, 44, 22, - 66,136,194, 41,111,190,220, 30,143,231, 84, 94, 94, 94,207, 75, 24,206, 63, 36,238,190, 92,242,111, 73,146, 66,197, 93,225, 76, - 77, 77,125, 45, 49, 49,241,142,170,170, 42,139,247,190,249,187,195,121,153,115,254,101, 5, 22,151,144,144,176,170,119,239,222, - 3,190,252,242, 75,238,240,225,195, 92,135, 14, 29,224,241,120, 32, 73, 18, 40,165, 72, 79, 79, 55,214,247, 98,137,137,137, 75, -122,246,236, 57,110,245,234,213,220,170, 85,171,184, 94,189,122,129, 16, 2,143,199, 3,143,199,131, 65,131, 6, 25,126,103,124, -204,130, 32, 76,213,106,181,153,110,183,187, 35, 0,136,162,120,200,110,183,111,114,187,221,243, 0, 84,169, 33,113,185, 92,198, -188,188,188, 58,105,211,187,119,111,237,197, 6,172,109,219,182,219, 57,142,107,229, 91,200,194,125, 82, 74,127, 57,120,240, 96, - 70, 48,206,246,237,219,135,229,244,255, 79,146,164, 95,242,242,242, 50, 66,149,137,182,109,219,142,235,212,169,147,254,211, 79, - 63, 69, 97, 97, 33, 76, 38, 19, 36, 73,130,199,227,129,203,229,194, 77, 55,221, 84, 47,203,215, 96, 48, 68,110,216,176,161, 77, - 66, 66, 2,138,139,139, 81, 82, 82,130, 41, 83,166,228,251,236,143,251,254,251,239,219,197,198,198,194, 98,177,160,188,188, 28, - 19, 38, 76,248,211, 87,174, 33,253, 91,189, 72,128, 88,249,183, 71,194,175,235,183,253,242,244,239,229,181,219,237,103, 61, 30, - 79,140,159, 32, 9,121, 14,207,243, 23, 0,196,135,211,194, 0,254,198,243,124, 91, 81, 20,175,162,148,182,112,187,221,137, 0, -160,209,104,206,241, 60, 95,224,114,185,142, 56, 28,142,159, 1,172, 6, 80, 16,140,200,145, 27,209,198, 99,183,220, 82,109,151, - 70, 74, 20, 73, 28, 65,145, 73,103,249,218,145, 27,177, 66,173,200,250, 3,209,178,105,211,166,175, 0,192,153, 51,103, 30, 3, -112,252,247, 18,122,128,113,148,210, 40, 0, 40, 47, 47,143, 42, 44, 44, 76, 90,189,122,117,231, 57,115,230, 12,212,218,108, 47, - 59,128, 67,161,206, 31,124, 93,235, 61, 2, 33,169,138, 90,166,210,169,117,155,127,105,136, 27, 19,151,146,146,242,250,136, 17, - 35, 38, 46, 92,184,208,152,147,147, 99,236,218,181,171,183,227, 11,165,189,167,148, 42,101,236,218,107,251,132, 19,108, 66,211, -166, 77,231,143, 24, 49, 98,252,130, 5, 11,140, 71,142, 28, 49,182,108,217, 82,225,244, 45,179,114, 7,251,234,171,187, 95,234, -112, 54,106,220,135, 13, 27, 54,126,225,194,133,198,253,251,247, 27,219,181,107,167,112, 82, 90, 91, 59,115, 28,135,158, 61,123, -169,226, 28, 62,124,248,248,119,223,125,215,152,155,155,107,236,216,177,163, 87,164, 65, 9,227,197,132,243, 50,231,252, 75, 10, - 44, 46, 62, 62,126,105,207,158, 61,135,125,249,229,151, 60, 0,228,230,230,162,180,180, 20, 41, 41, 41, 48,155,205,208,235,245, -176,217,108,245,234,101, 37, 36, 36,188,223,171, 87,175,113, 95,126,249,165, 8, 0,159,223,126, 19,126, 17,129, 7,139, 29,208, -104, 52, 56,122,244, 40,120,158,255, 61, 61,183,235, 34, 34, 34,254,183,114,229,202,152, 30, 61,122,112, 37, 37, 37,104,217,178, - 37,126,253,245,215,222,155, 55,111, 78,191,251,238,187,239,174,172,172,156, 4, 96,179, 90,194,175,190,250, 10, 38,147, 73,217, -156, 78,231, 69,143, 37,243, 60,159,154,147,147,147, 96, 54,155,225,241,120, 64, 41,173, 85,129,253, 43,158, 36, 73,232,223,191, -191, 51,100,230, 9, 66,106, 78, 78, 78,130,193, 96,168,195,229,241,120,160,213,106,193,113,156,220, 67,132,219,237, 70, 70, 70, - 70, 40, 78,210,174, 93,187,219,100,113,197,113, 28, 62,249,228, 19, 36, 37, 37, 33, 33, 33, 1, 38,147, 9, 6, 67,253, 53,176, - 32, 8,136,139,139,195,253,247,223,143,219,110,187, 13,203,150, 45,131, 40,138,181,246,199,198,198,226,219,111,191, 69,100,100, - 36,210,210,210,106,237,255,179,130, 0,177,223,109,254,205,145,189,101,212,213,194,160,126, 45, 23, 40, 21,173,230, 32, 42,121, - 93, 11,201,227,185,176, 97,251,201,103, 85,116, 0,154,108,219,182, 13, 58,157, 78,221,205,221,227, 65,239,222,189,155,132, 57, -108,100,151, 46, 93, 62,191,255,254,251, 53,109,218,180, 33,162, 40, 66, 16, 4, 8,130, 32,151,199, 52, 74,105,154, 36, 73, 3, -206,157, 59, 71,223,124,243,205,151, 55,110,220,120, 51,128,175, 3,198,221,109,237, 86,109,151, 70, 82,138,164,196,193,180,121, -241, 58,130,106,187, 52, 50, 74,176, 30, 5,112, 57, 11,172, 72,131,193,240,204,167,159,126,170, 1,128,193,131, 7, 63, 99,181, - 90,255, 13,160,162,161, 46, 16, 21, 21,133,168,168, 40,116,233,210, 5, 99,198,140,137,238,222,189,251,163, 45,236,246, 41, 5, -128, 35,104, 29,226,184,212,111,190,207, 79,144,127,143,191,169,135,102,104,102,235,115,212,107,153,249,123,104,146,135,158, 90, -191,237,120, 56, 1,198, 37, 37, 37,253,103,248,240,225,183, 46, 92,184, 48, 2, 0,222,127,255,125,140, 28, 57, 18, 73, 73, 73, - 48, 24, 12,208,104, 52,208,104, 52, 16, 69, 81,249, 12,115,147,229,147,146,146, 94,190,225,134, 27,110, 89,176, 96, 65, 4, 0, - 44, 89,178, 4,163, 70,141, 66, 92, 92, 28, 34, 35, 35,161,211,233,160,213,106,189, 92, 4, 52,124,171, 95, 39,156,247, 12, 29, -136, 86, 6, 29,254, 54,251, 21, 68, 71, 71, 99,195,180,251, 32,114, 28,238,251,118, 19, 34, 35, 35,213,180, 31,117, 56,115,115, -115,113,238,220,185,128,113,231,121, 62, 92,125, 83,226, 62,114,228,200, 91,100,206, 37, 75,150, 96,216,176, 97,136,139,139,131, -217,108, 86,226,254, 27, 55,167,138,115,216,176, 97,183,188,251,238,187, 10,231,160, 65,131, 16, 27, 27,139,136,136, 8,104, 52, - 26, 37, 61,235,147, 71,151, 57,231, 95, 82, 96, 17,175,123,117,107,118,118,182,146,243,162, 40, 66,167,211, 41,133,195,247,198, -173,246, 94, 19, 31, 31,127,231,151, 95,126,169,156,228,240,171, 84,122,189,190,190,156,181, 58,120,215, 95,127,253,199,217,217, -217,122,141, 70, 3,171,213,138,188,188, 60, 68, 69, 69, 65,171,213,226,198, 27,111,228, 51, 50, 50,226,174,191,254,250,207,126, -250,233,167,241, 0,214,169, 24,226,128,217,108,174, 37,176, 40,189,120,253, 71, 8,129,193, 96,192,170, 85,171, 32, 8, 66,173, - 66, 22,168, 17, 75, 76, 76, 12,235, 74, 0,128, 78,167,195,246,237,219,193,113, 28, 68, 81, 84,182,175,190,250, 10,211,166, 77, -195,185,115,231,148,125, 17, 17, 97, 71, 55,137,209,104, 52,200,226, 74,206,123,131,193, 0, 81, 20,137, 32, 8,132,231,121,185, - 73, 39, 80, 57,148, 33, 8, 2, 10, 10, 10,112,251,237,183, 99,241,226,197,120,225,133, 23, 48,126,252,248, 90,251, 43, 42, 42, - 16, 19, 19,131,232,232,104,232,116,186,223, 83, 22, 46, 27, 72,126,169, 51,235,133,151,141, 18, 0,137, 74,128, 4, 80, 80,229, -251,217,179, 71,241,234,127,222,224,213,114,235,116, 58,108,219,182, 13,190,195,174, 28,199, 65,163,209,212,250, 79, 16, 4, 36, - 39, 39,171,225,155,185,114,229, 74,237, 39,159,124,130, 47,190,248, 2, 30,143, 7,162, 40, 66,175,215, 35, 50, 50, 18,177,177, -177,202,150,150,150, 70, 62,248,224, 3, 77,183,110,221,102, 86, 84, 84, 4, 22, 88, 28,141,146,188,226, 10, 0, 18, 6,211,230, -199,190,228, 99,162, 35,106, 92,156,203,184, 61,156,241,214, 91,111,197,165,167,167, 3, 0,222,122,235,173,184,201,147, 39,207, - 0,240, 52,106,134, 12, 47,174,131, 5,124, 76, 8, 25,231,117,108,245, 67,134, 12,209,190,253,246,219,184,234,170,171,240,208, - 67, 15,197,190,250,242,203,127, 3,176, 34,120, 89,170, 93,152,230,190,242, 70,180,111,135,234,183, 13,248,245,124, 1,158,121, -230, 69, 21,250, 31, 92,211,166, 77,239,126,239,189,247,148,233, 16,177,177,177, 74, 27,228,223, 70,201,159, 33,218, 37,226,117, -133, 38, 47, 92,184, 80,225,140,143,143,175,197, 33,138, 34, 10, 14,253,128,111,222,207,130, 41, 46, 25, 19,166,205,173,119, 56, - 83,116, 90,164, 26,180,232,214,173, 27, 12, 6, 3,114,197,154, 91,153, 44,174,212,132,211,159,147,231,121, 37,140,148, 82,216, -108, 54, 84, 86, 86,194,227,241,192,225,112, 32, 61, 61, 93, 85,220,223,125,247, 93,133,179, 73,147, 38, 74,251,238,219,206,203, -155,220,129, 9, 19,206,201,255,253,239,127, 21,206,184,184, 56,133, 75, 16, 4,104, 52, 26, 44, 89,178, 4, 42, 29,109,213,156, -245,205,119,127,206,227,199,143, 99,206,156, 57,208,104, 52,242, 20, 32,197,177, 76, 73, 73,193,155,111,190,169,234, 30,247, 87, -115,176, 72, 73, 73,137,116,248,240, 97,110,207,158, 61,208,104, 52,136,143,143, 71,239,222,189, 1, 0, 78,167, 19,130, 32,192, - 96, 48,144,182,109,219,158,147, 19, 77,254,244, 27, 75,151,151, 90,114,191,254,250,171,180,102,205, 26,110,217,152, 97,112, 80, -160,251, 51,115, 49,108,212, 40,124,151,162, 5, 15,160,247,225, 18,104,181, 90, 33, 41, 41,201, 37,103,130,204,235, 55, 55,203, -127,249,102,132,201,100,250, 96,245,234,213,122,142,227, 80, 89, 89, 9, 73,146,208,183,111, 95, 16, 66,176,127,255,126, 60,253, -244,211,248,252,243,207,177,114,229, 74, 67,143, 30, 61, 62,176, 90,173, 29, 1, 84,250,112, 28, 8, 84, 56, 35, 35, 35, 97, 48, - 24, 20,129,101, 48, 24, 72,251,246,237,207, 5,153, 71,112,250,224,193,131,233,193, 56,101, 39,225,230,155,111, 86,230,156,201, - 55, 64,223,202, 38,127,207,203,203, 11,148, 95,117, 56, 37, 73, 66,191,126,253, 0, 0, 38,147, 9,102,179, 25,223,127,255,189, -178,191, 71,143, 30,112, 56, 28,104,210,164, 9, 14, 29, 58,164,138,179,168,168, 8, 75,151, 46,133, 40,138,136,139,139,131, 40, -138,154,117,235,214,189, 96, 50,153,162,120,158, 71,116,116, 52, 70,141, 26,181,208, 39, 12,158,175,191,254, 90, 8,198,201,243, - 60,244,122, 61,150, 44, 89,130, 57,115,230,224,201, 39,159,244,119,247, 96,179,217, 16, 23, 23,135,152,152, 24,196,196,196,168, - 10,103, 3,160, 81, 57, 41, 40,242,246,126,135,131,251,214,193, 67, 61,144, 60, 18,168, 68,225,145, 36,236, 93,187,171,221,217, - 95,206,164, 80,208,154, 41,181, 0, 60, 85,213,238,204, 56,237, 85, 0, 86,109, 42,117,204, 15, 23, 78,158,231,225,116, 58,241, -221,119,223,225,232,209,163, 88,179,102, 13,172, 86, 43,154, 52,105,130,232,232,104,100,100,100, 96,242,228,201,193, 4,214, 1, -191,178,185,228,244,233,211,221, 51, 50, 50, 72,121,121, 57, 74, 74, 74, 80, 89, 89, 9,167,211, 9,167,211,169,228,161,201,100, - 66, 82, 82, 18,172, 86, 43,181,219,237, 75,130,198, 93, 34,229, 28, 65,209,177, 85, 66,147,214, 55,186, 13,231,190,143,179, 91, - 29, 26,247, 59,171,140,147,191,122,162,245, 80,142,114, 20,168,137, 58, 33,160,146,199, 83,178,110,203, 47,247,255,193,249, 62, -101,234,212,169, 29,125,135,167, 39, 76,152,128,188,188,188,142,243,230,205,155, 2,224,173,250,114, 26,128, 20,212, 40,179,111, - 81,179, 97,166,213, 74, 94, 88,181,234,102, 0,119,172, 92,185, 18,227,199,143,199,127, 94,126,185, 75, 0,129,117,192,183,195, - 87,144,191, 25,199,243,183, 65,146, 36,239, 70,131,126,167,234,194, 73,170,170,170,108, 57, 57, 57,230, 15, 63,252, 16,177,177, -177,104,209,162, 5, 34, 34, 34,160,211,233,234,136, 1,121, 11, 23,119,139,197, 98, 59,124,248,176,249,227,143, 63, 70, 92, 92, - 28,210,210,210, 96, 50,153,160,215,235,149, 14,122,206,154,149,152, 50,233, 70,148,158, 60,130, 55,254,125,155,234,112,222, 51, -100, 32, 82, 13, 90,220, 56,107, 46, 58,118,236,136, 21,183,141, 6, 71,128,123, 55,236,132, 40,138,248,112,228,117,208,233,180, -184,119,195,110,213,156,187,119,239, 6,165, 20,105,105,105,176, 90,173,138,203,166,209,104,176,110,221, 58,140, 30, 61, 26,203, -150, 45,195,181,215, 94, 27, 54,238, 85, 85, 85,182,253,251,247,155, 63,250,232, 35,196,198,198,162, 89,179,102, 48, 26,141, 10, -159,175,136,105,213,170, 21,202,202,202,208,186,117,235,144,156,213,213,213,182,220,220, 92,243,178,101,203, 16, 27, 27,139,212, -212, 84, 24,141,198, 90, 78,216,204,153, 51,107, 17,116,235,214,237,119,115,214, 55,223,253, 57,199,140, 25,131,214,173, 91, 35, - 50, 50, 82, 73, 3,127,161, 93, 31, 80, 74,123,161,246, 52, 7, 7, 0,173,207,231,121, 66,200,238, 0,199,201,255,139, 0,174, -246,238,243,120, 53, 64,116, 0,190, 96, 60, 37, 94, 83, 33,222,239,248, 90,215, 9, 36,176,228,250, 56, 0,192, 86, 0,232,208, -161, 3, 74, 75, 75,161,211,233,208,187,119,111,156, 63,127, 94,177,249, 36, 73,194,216,177, 99,249, 39,158,120, 34,129,227, 56, -184, 92, 46, 80, 74,193,243, 60,228,158,159,191, 14,224, 56, 14, 25, 25, 25, 56,232, 77,211, 97,163, 70, 33, 53, 53, 85,153,196, -161,211,233, 48,126,252,120, 50,109,218, 52, 65,118, 47, 40,165,176, 90,173,232,214,173,155, 33,132, 59,242,239,207, 62,251, 44, - 74,171,213, 42,226, 74, 14,203,225,195,135,241,234,171,175,226,142, 59,238,192,201,147, 39,145,156,156,140, 71, 31,125,212,156, -149,149,245,111,167,211, 57, 43, 92,134,154,205,230, 90, 2,107,210,164, 73, 66, 70, 70, 70,130,209,104, 84,220, 45,175,168, 68, - 70, 70, 6, 9,231, 96, 73,146,132,111,191,253, 54, 96,239,208,191,199, 64, 8, 1,165, 84, 21,103, 78, 78,142, 34,206,100,247, - 66,222,159,151,151,167, 56, 88, 94, 33, 24,138,147,202, 66, 77,182,201, 69, 81,212,228,228,228,204, 78, 78, 78, 54, 79,154, 52, - 9,149,149,149,104,218,180, 41,134, 14, 29, 10, 73,146,224,116, 58,241,224,131, 15,134,116, 94, 68, 81,196,174, 93,187,144,149, -149,133, 39,158,120, 2, 11, 23, 46,196,224,193,131,107, 57, 88,114, 79, 55, 50,242, 15, 95,227,208,128, 22, 22,224,116,187, 96, -177, 88, 65,169, 7, 30,137, 66,242, 72,216,191,113,111,187, 95,246, 29,237,156,189,124,169, 8, 0,182, 77, 43,125,207, 74, 30, -179,224,255,218,103,198,136, 57,155, 46,184,114,194, 12, 59,227,190,251,238,195,179,207, 62,139, 91,111,189, 21,107,215,174,197, - 83, 79, 61,133,187,239,190, 91, 17,239,114, 89, 80, 49,236,248,222,132, 9, 19,254,181, 98,197,138,171, 30,121,228, 17, 78,174, -147, 70,163, 17,132, 16,216,108, 54,101, 59,124,248,176,244,207,127,254,243, 39,135,195,241, 94,208,130, 36, 24,126, 52,233, 44, - 95,159, 45,229,218, 22,109,136,229,136, 16,233,140, 79, 27, 80,126, 67,187,193,116,240,109, 45, 98,168, 84,227,240, 81, 80,216, -109,213,120,242,137,199,248, 63, 56,183, 70, 14, 25, 50,100,232,236,217,179,235,236,152, 61,123, 54, 14, 29, 58, 52,116,237,218, -181, 5,193,134, 68,131,136,171,212,168,164,164,121, 0, 96, 40, 42,154,106, 5, 78, 1,192, 11,192, 48, 15, 48,122,237,218,181, - 0,128,230,205,155, 67, 2, 58, 17,224,127, 60,240, 49,128,111, 2, 57,234, 78,151, 27, 86,171, 13, 18,173, 41, 71, 18,149, 32, -121,106, 92, 80,127,145,165, 98,220,141, 2,144,120,158, 71,151, 46, 93, 48,108,216, 48,104,181, 90,152,205,102,165,157,247,111, -147, 84,220, 20, 41, 0,137, 16,130, 86,173, 90, 97,232,208,161,208,104, 52, 48,153, 76,136,140,140, 84, 4, 22,207,243,232,146, - 49, 16, 31, 47,123, 5, 19,135,117,198,164,235, 18,241,217,254, 18, 85,225, 76, 51,106,145,102,208,161, 67,135, 14,136,136,136, - 0, 33, 0,207,115, 74, 56, 77, 70, 61, 52,202,240,163,186,184, 23, 21, 21,161,160,160, 0, 5, 5, 5,224, 56, 14,125,251,246, -133, 86,171,133, 32, 8,200,207,207,199,172, 89,179,224,112, 56, 84,113,114, 28,135,182,109,219, 98,224,192,129,208,106,181,144, -239, 21,190, 67,131,162, 40,162,178,178, 18,109,218,180,193,170, 85,171,208,191,127,255,176,156, 29, 59,118,196,128, 1, 3,160, -209,104, 96, 48, 24,148,169, 58, 90,159,184, 86, 85, 85, 41,233,208,189,123,247,122,113,174,217,117, 18,139,214,124, 15,187, 67, - 66,133,197, 85,235,132,228, 38,145,216,250,209, 19,170,226, 46,115,190,247,222,123, 40, 43, 43, 83,218, 33,121, 65,155,108,158, -164,166,166,226,221,119,223, 13,122, 15,242,106,145, 77,126,251,226, 9, 33,217, 62,117, 98, 20, 33, 36,219,247, 51,216,113,222, -175,215,205,152, 49,163,103, 86, 86,214,156, 62,125,250,124,188,125,251,246,229,193,248,130,241,204,152, 49,163,115, 86, 86,214, - 28,223,227, 3, 92, 39,160,131, 37, 15,249,112,178, 51,147,146,146,162,140, 59,155,205,102,104, 52, 26,229, 96,183,219,141, 15, - 62,248, 0, 9, 9, 9, 72, 76, 76, 84, 62,131,101, 0,199,113,160,148,226,161,243, 53, 83,128,190,109,170, 65, 1,128, 27,206, - 83,133,207,227,241, 96,197,138, 21,136,136,136, 80, 42,186,217,108, 14, 57, 92,164,213,106, 7,244,234,213,139,179,219,237,138, - 77,206,113, 28, 14, 31, 62,140,172,172, 44,140, 31, 63, 30,237,219,183,135,199,227, 65,117,117, 53,174,191,254,122,241,141, 55, -222, 24,160, 86, 96, 25,141, 70,101,222,145,221,110,199,250,245,235, 17, 29, 29,141,152,152, 24,196,197,197, 33, 54, 54, 22, 58, -157, 14,132,144,240, 45, 26,165,184,249,230,155,107, 57, 87,190,174,149,111,131, 38, 15,251,169,225,188,246,218,107, 21,247,202, -108, 54,227,155,111,126,107,159,123,247,101,240, 54,107, 0, 0, 32, 0, 73, 68, 65, 84,238, 13, 74, 41,226,227,227,177, 99,199, - 14, 53,141, 46, 36, 73, 66, 66, 66, 2, 68, 81, 36,235,214,173,123,193, 43,174,136, 40,138,248,225,135, 31,144,151,151,135,248, -248,120,165, 87, 26, 14,213,213,213,103,223,120,227, 13,207,219,111,191, 13, 0, 24, 52,104, 16,202,203,203,139,125,246,151, 78, -156, 56,177, 86,124, 47, 92,184, 80,250, 23,208, 87,112, 59,221,176, 88,109,168,170,172,134, 75,242,192,229,246,160,248,244,249, -232, 39,166, 77, 21,255,243,224,100, 0,192,180,249,111,161,242,221,223, 26,176, 47,166,141, 75,184,249,213, 79,166, 3,184, 49, - 20,191,197, 98,129,205,102, 67,243,230,205,177,123,247,110, 84, 86, 86, 98,240,224,193,181,220,223, 48, 67, 16,190,112,156, 62, -125,186,239,168, 81,163,118,191,246,218,107,173, 59,117,234, 68,170,171,171, 81, 93, 93, 13,139,197, 2,249,251,129, 3, 7,232, -242,229,203,127,177, 88, 44, 25, 8, 49,103, 72,155, 94,121,212,145, 27,177, 98,203,143,154, 81,127, 31, 51, 58,234,212,233, 66, -119,169, 85, 95, 85,110,253,201,238,161,135, 64, 61, 20, 30, 74, 65, 61, 18, 60, 84,250,163,215,111,167,182,107,215,238,159,203, -150, 45, 11, 40, 72,121,158,199,178,101,203,208,175, 95,191,127,230,231,231, 31, 70,136,201,253, 50, 90, 0, 90,183, 40, 62,241, -127,255,247,127, 26, 0, 24, 56,112,224, 19, 45, 92,174,105, 5,128,163, 83,215,174,183,108,223,190, 61,202,104,172, 89, 39, 20, - 21, 21, 5, 74, 41,111,177, 88,162, 50, 50, 50,110,217,191,127,127, 93,129, 37, 81,184, 92,110, 88,109,118,148,149, 87,193,229, -112,193, 45,185,225,113, 75,112, 75, 53,238,168,219,227,129,228,246,192, 45,121,192, 11,124, 68,230, 53,205,170,106,188, 44, 82, -182, 57,167,176, 89,160, 34, 90,179,194, 11, 72, 74, 74, 82,134,132,125,231,202,168,112, 49,234, 24,245, 53,109, 33, 85,218,198, - 31, 55,102,163,248,208, 86,104, 8,133,228,113, 65,114, 59,225,113, 57,193, 67,194,161, 99,167,209,169,105,216, 54, 68, 9,231, -240,103, 94, 68,239,222,189,241,217,184, 27, 65, 8,112,239,250, 29,208,104, 52, 88,126,211, 96,104,245, 90,252, 99,205, 78,181, -225,172, 21,247,220,220, 92, 60,244,208, 67,120,233,165,151, 96, 48, 24,148,206,201,145, 35, 71,240,201, 39,159, 96,200,144, 33, -170,227, 78, 72,205, 80,171,156,134, 51,102,204,192,153, 51,103, 48,111,222, 60,244,236,217, 19,162, 40,162,172,172, 12, 25, 25, - 25, 56,119,238,156, 42, 78, 74, 37,196,198,198, 42,211,117,252,231,136,201, 29,217,250,228,145, 47,231, 93, 55, 37,227,203,109, -203, 65, 64,176,243,163,169,181,238, 71,239,124,178,165,222,156,207, 62,251,108,173,112,214,211,189,146,181, 8, 9,114,207, 27, -165,210,241,146,143,147, 19, 89,151,149,149, 53,199,255,252,112,124,190,251,253,206,119,248,137,178,115,106,134, 8, 41,199,113, -144, 36, 9,102,179, 25, 90,109,141, 3,230,127, 35, 53,153, 76,181, 20,121,184,241,100,158,231, 65, 41, 85, 18,150, 15,176,127, -199,142, 29,117, 68,192,127,255,251,223,144,227,180,110,183,187, 99, 68, 68, 4, 42, 43, 43,149, 57, 82, 90,173, 22,211,167, 79, -199,196,137, 19, 21,113,165,213,106,177,120,241, 98,164,167,167,195,225,112,116, 12,149,160, 26,141,198,210,181,107, 87, 78,118, -129, 12, 6, 3, 25, 63,126, 60,239,116, 58,161,215,235,107,185, 78,242,220,180,112, 98, 72,118,155,190,251,238, 59, 85, 14,150, -218, 57, 72,148, 82,236,221,187,183,150, 80,243, 46, 53, 6, 0,236,219,183, 79,185,209,170, 29,239,246,120, 60, 48, 24, 12, 68, -163,209, 16,147,201, 20, 53,105,210, 36,133, 87,206,115, 57,222,106, 38, 90,239,223,191,255,250,144,227, 53, 7, 14,252, 37, 31, -199, 32, 73, 18,156, 46, 23,172, 86, 27, 42,171, 45,152, 57,215, 59,162, 54, 19, 57, 0,114,250, 78,121, 8,247, 13, 27, 50, 16, -225, 87,247, 5, 68,108,108, 44, 62,255,252,115,136,162,136, 85,171, 86, 33, 50, 50, 18,163, 71,143, 70,100,100, 36,158,120,226, - 9,220,118,219,109,245, 17, 88, 0, 80, 94, 90, 90,218,119,234,212,169,187, 95,126,249,229,230,205,155, 55,135,211,233,132,195, -225,128,211,233,196,177, 99,199,176,124,249,242, 66,139,197,210, 23, 64,121, 56, 50,109,122,229,209,236, 71, 90,159,237, 55,230, - 38,219,161,162, 53, 56, 87,116, 30,110,207, 41,184, 61, 30,184, 93,238, 26, 65, 32, 73,112, 59,221,224,121, 46,242,250, 62,105, -235,106, 38,252, 19, 7,128, 17,151, 48,171,104,126,126,126,105,124,124,188,220,131,140,116, 56, 28,196,219,150, 80,252, 54,193, -189, 26,128, 83, 13, 97, 33, 48,229, 63, 47,189,212, 76, 30,190,127,233,165,151,154, 61,250,200, 35, 83, 0,188,126,104,255,254, -165,119,221,117,215,212, 79, 63,253,180,214, 57,119,221,117, 23, 14,237,223,191, 52, 88,207,199,229,114,193,106,181,163,164,228, - 87,220,115,239, 51, 62,221,125,170,244,251,107, 38,189, 83, 0,208, 3, 64,201,185,159,241,224, 67,143,234, 66,117,168,188,245, - 29,162, 40,214,153,132,236,219,190,171,104, 63,168,255, 20, 11,141, 70,131,163,219,179, 49,117,202, 45,128,199, 13, 56,171, 1, -167, 5,212,105, 1,117, 84,131,104, 13,160, 46,155, 42, 94,143,199,163, 76,219, 16,120, 14, 58,237,111,237,166,209,104,128, 86, -175, 85, 27,206, 58,113, 63,113,226, 4,238,191,255,126, 56, 28, 14,140, 25, 51, 6, 54,155, 13,118,187, 29, 54,155, 13,173, 90, -181,130,213,106, 85, 29,119, 73,146, 20, 23,112,234,212,169,232,217,179, 39,102,205,154,133,199, 31,127, 28,173, 90,181,194,148, - 41, 83,240,241,199, 31,163,115,231,206,176, 88, 44, 97, 57,229,182,196,108, 54, 67, 16, 4,165, 13,246,205, 43, 89, 96,169,205, -163, 64,156,132,252, 54,239,214, 55,223, 31,158, 52,168,222,156,115,230,204, 65, 73, 73, 73, 29,231,202,215,193, 90,176, 96,193, - 69, 85, 86, 63,151, 41,236,113,132,144, 92,239, 95,214,233,211,167, 63, 73, 8,201,158, 62,125,250,147,115,231,206,205, 83,195, - 23,104, 63, 33,228, 43,239,253,247, 6,159,255,114,213, 8, 44,200,110,147,108,107,202, 9, 39,239, 3, 0,163,209,136,236,236, -108,172, 88,177,162,214, 13, 37, 24,100,209,246,117,124, 77, 1, 24,233,117,174,228,223, 35,138, 37,140, 26, 53, 10,173, 90,181, -170,229, 94, 25, 12,134,144, 98, 67,146, 36,156, 56,113, 2, 7, 14, 28, 64,159, 62,125, 80, 94, 94, 14, 1,192,180,253,251,209, -105,210, 36,216,189,194, 79,171,213,226,159,255,252,167,170, 12,220,179,103, 79,173, 73, 64, 29, 59,118, 60,149,145,145,145,178, - 99,199, 14,197,209,210,233,116,208,235,245,138,200, 80, 83,169, 41,165,184,229,150, 91,106,137, 33,127,129, 37, 87,158,111,191, -253, 86,213, 16, 33,165, 20,153,153,153,138,123, 21, 17, 17,129, 47,190,248, 66, 57,230,186,235,174, 3, 33, 4, 9, 9, 9,248, -230,155,111,194,114,202,105, 42,231, 61,207,243,168,174,174, 70,110,110, 46,180, 90,173, 50, 63,195, 96, 48, 40,241,103, 8,150, -225, 18, 28, 46, 23, 44, 86, 27, 42, 43,107, 26,210,163, 7, 62,171,117,136,211,126,241,139,211,100, 39,180,162,162, 2,235,215, -175,199,231,159,127,142,158, 61,123,214, 26, 30, 84, 59, 68,232, 59,143,224,215, 95,127,237,247,248,227,143,239,124,225,133, 23, -154,198,197,197,193,233,116,226,196,137, 19,248,224,131, 15,206, 88, 44,150,126, 0,206,171, 79, 3, 10,183,203, 13,155,197,138, -242,202,106, 60, 63,123,113,208, 38, 2, 0,156,142, 74,140, 26,145,169,189,196, 57,117, 26,192,221, 62,191,151, 2,144, 39,227, - 87, 0,152, 88, 31, 50, 17, 24, 48,230,150, 91, 6, 78,157, 58, 85,249,111,234,212,169,216,185,115,231, 64,113,197,138, 3, 46, - 96, 35,191, 98, 69,151,121,243,230, 41,199,204,155, 55, 15,159,175, 88,177,193, 3,108, 12,210,109,175,113,176,172, 54, 84, 85, - 91, 17, 25,157,140,211,199, 55,133, 13,139,134,183,131,134,104,151,229, 54, 36,216,188,155,122,136, 43, 37,164,242,177,242,188, -163, 46, 3,111,193,107,175,255, 23, 58,142,226,230,129,157, 16,111,144, 64,140,177,208,100, 78, 7,137, 78,171, 57,235,249,171, -161,166,173,219,244,212, 52, 28, 51,233,241,207,181,219, 32,138, 34, 62, 31, 55, 18, 26,173, 6,119,124,181,185,102,113,207,228, -155,161,209,105, 49,244,157, 79,212,220,168,149,184, 31, 61,122, 20,219,182,109, 67,135, 14, 29,240,243,207, 63, 43,115,108,229, -251,150,202, 14,175, 18,119,185, 29, 47, 42, 42,194,168, 81,163,160,209,104,176,120,241, 98,108,218,180, 9,143, 63,254, 56,238, -186,235, 46, 92,127,253,245,193,230,197,214,225,244,205,163, 96,243,163,234,155, 71,254,156, 74,249,253, 29,249, 46,115,202,147, -219, 3,137,245,223, 59,177,221,199, 45, 74, 12,176,239, 6,127,231,137, 82,218,203, 59, 55,202, 62,119,238,220,188,185,115,231, -142, 34,132,100,207,157, 59,119, 84, 48, 7, 43, 16, 79,128,253, 97,219, 65,193, 79,133, 14,240, 21, 81,218, 16, 99,217, 38,147, - 9,119,223,125, 55,158,120,226, 9,101, 34, 99, 40,200,202, 53, 20,178,179,179,235,252,183,106,213,170,112, 67,132,135,163,162, -162,122, 14, 28, 56, 16,229,229,229, 56,121,242, 36,204,102, 51, 58,189,250, 42,246,223,119, 31,174, 94,184, 16,220,192,129, 74, -133,223,191,127, 63,116, 58,221, 97,155,205, 86,175, 76, 53,155,205,136,137,137,129, 94,175, 71, 68, 68, 4, 34, 34, 34, 96, 50, -153, 20,161, 21,110,136, 80, 46,124, 95,125,245, 85, 72,231,202,215,242, 85, 35,134, 40,165,216,177, 99, 71, 29, 7, 75,190,166, -188, 79,118, 50,212,112,122, 29, 75,170,211,233,192,243, 60,140, 70,163, 98,247,235,245,122,101, 83,235, 96,133,123,144,104, 90, - 90, 90,173, 7,145,254, 63,123,231, 29, 30, 69,181,134,241,119,102,182,111, 54, 13, 82, 72, 15, 1, 2,129,208, 66,151, 38,160, - 8, 72, 17, 68,176, 97,167,169,112,189, 82, 45, 24, 80, 1, 69, 64, 16, 1, 1, 5, 1, 1, 43, 77,138,244, 38,229,146,208, 99, - 66, 40,233, 33, 36, 33,109,179,117,202,185,127, 36, 27, 55, 33,101, 55, 4, 80, 56,191,231,217,103,119,167,188,115,206,204,153, -153,119,190, 83, 70, 46,151,151, 27,136,244,223, 95, 69,104, 70,177,190,184,206,245, 45, 22, 11,100, 50, 25,126,253,245, 87,116, -234,212,169,204, 92,217,140,149,253,113,119,146,180, 91,183,110, 61,186,120,241,226,147, 11, 22, 44,240,212,235,245, 88,179,102, - 77,129, 94,175,127, 20,165,237,136, 28,190, 24, 2,224,173, 2, 12,102, 51,244, 69, 37,251,224,234,197, 95,106, 52,101,255,102, -154,183,106,245,226,234,213,171,111,155,190,122,245,106, 36, 38, 38,190,136,243,231, 15, 6, 1,203,167, 78,157,218,184, 93,187, -118, 65, 0, 48,117,234,212,212, 32, 96,121,117,231,185,173,138, 80, 95,106,214, 77,197, 57,117, 22,105,173,248,192,119,167, 55, - 68,134, 97,202, 76,198,227, 35, 94, 67,198,181,120, 68,104,115,224,227,225, 2,169, 40, 3,138, 62,209, 56,127, 75,139, 47,151, -239,118, 42,157, 90,165, 2,106,205,223,213, 77,106,141, 26,170,210, 90, 5,134, 97,160,214,106, 32, 87, 42,157,206,123,124,124, - 60,180, 90, 45, 68, 81,188,237,126,227,108,143,102, 66, 72,217,189,115,193,130, 5,152, 60,121, 50,214,172, 89,131,243,231,207, -163, 77,155, 54,120,236,177,199,112,243,230, 77,156, 59,119, 14,102,179,217,225,116,218,223, 47,226,226,226,176,119,239, 94, 36, - 36, 36, 32, 53, 53,181,214,199,189, 98, 53, 99,105, 13, 78,137,121,221,123, 6, 79, 63, 30, 85, 43,205,232,232,104,220,188,121, -243,182,200,149,125,243,163,106, 34, 88,101, 94,164,154,242, 21, 99,111,130,108,145, 38,123, 67, 84,241, 63, 0, 79,219,180,105, -211,166,189,231,232,122,246,255,109, 17, 48, 71,170, 22,237, 13, 22, 83,177,186,142, 97,152,178,157,110, 31,153,178,253,214,106, -181,101, 81,166,144,144,144,106,163, 87,182, 19,142,227, 56,116,191, 86, 4,165, 82, 89, 86,157,215,255,166, 84, 46, 68, 30, 22, - 22, 86,174, 13,150,253, 65,169, 12,179,217,124,240,224,193,131,109, 7, 15, 30,204,197,197,197, 65, 38,147, 65,146, 36,152, 59, -119, 70,155,229,203,113,225,157,119,208,227,250,117,152,121, 30,106,181, 26,187,118,237,178, 26, 12,134,131,206, 20, 26,150,101, - 25,155,193, 82,169, 84,112,117,117,133,155,155, 91, 89, 52,199,153,139, 80, 85, 79,136,246, 31,103, 78,104, 91,131,126,251, 27, -171,237,248, 25,141,198,114,134,203, 81,236,171, 12,108,166,200,221,221,189, 92,181,168, 45,138,231,136,193,170,105, 32, 81,149, - 74,229,118,248,240,225,198,110,110,110, 32,132, 32, 39, 39, 7,207, 62,251,236,229,127,125, 0, 11,164,164,145,187,209, 4,189, -209, 84,231,250, 63,252,240, 3,174, 92,185, 2,171,213,138, 57,115,230,220,102,172,106, 25,193,178,113, 69,163,209, 72,253,250, -245,195,241,227,199,161, 82,169,120,212, 98,252, 42, 34, 73,176,242, 2, 76, 70, 51,244,197,197,120, 24,184,116,254,252,207, 46, - 46, 46,207, 2,208,229,231,231,115,238,238,238,208,106,181, 48, 26,141, 5, 92,105, 79,193, 36,192,162,225,249,207, 70,140, 24, -177, 16, 0,100, 60,255, 89,117,227, 96,149, 25,172, 58,222,143,182,235, 86, 85,209,171,218,154, 43,134, 97, 74,186,231,179, 44, -214,204,153,140, 8,109, 54,162, 26,186,192,116,243, 10, 84,110, 94, 96, 60, 66,241,229,242,221,136, 75,186,229, 84, 58,159, 91, -247, 11,130,130,130,176,253,165, 33, 80,169, 84,120,246,151,189, 37,141,180,199,142,132, 66,173, 66,159, 37, 63,212, 42,239, 6, -131,161,202, 72,149, 19, 17,172, 50, 77,155, 1,140,138,138, 66,147, 38, 77,112,240,224, 65, 68, 69, 69, 33, 49, 49, 17,137,137, -137, 72, 74, 74,194,249,243,231,145,151,151,231,244, 49,218,180,105, 19,178,179,179,161, 80, 40, 80, 88, 88,136,235,215,175, 87, -215,254,217,225,227,110,163,217,147,209, 0, 0,127,111,119,167, 12,150,189,230,188,121,243,156, 25,230,161,156, 76, 53,243,114, - 42,180,117,178,253,183, 84, 48, 59, 21,255, 87, 92, 30, 0,110, 2,224,106, 88,175,226,255,156, 57,115,230, 28,180, 69,190, 74, -117,185,170,218, 95, 85,140, 96,217,155, 0, 99,179,102,205, 52,246,245,167, 44,203,194,213,213,149,153, 52,105, 18,199, 48, 12, -116, 58, 29,220,221,221, 17, 30, 30, 14,171,181,230,102, 9, 10,133,194,216,177, 99, 71,141,125,232,149, 97, 24,184,184,184,112, - 83,166, 76, 97, 86,173, 90, 85,233,122, 91,183,110,173,182,112, 11,130,176,112,212,168, 81,175,167,165,165,121,250,250,250, 34, - 51, 51, 19, 10,133,162,100,180,216, 94,189,208,253,218, 53, 88, 75, 13, 67,124,124, 60, 86,174, 92, 89,108,181, 90, 23, 58,123, -209,208,233,116,168, 95,191, 62, 84, 42, 85,185, 94, 49,118,161, 85,135, 34, 88,117,105,174,108,154,246, 55, 86,219,239,177, 99, -199,150,253,119,230, 34,169, 80, 40,200,147, 79, 62, 89,246, 14, 66, 15, 15, 15,120,121,121, 33, 43, 43,235,239,158, 58,165,145, - 59, 71, 13, 86, 77, 3,137,202,229,114, 88,173,214,178,234,204, 37, 75,150,220,137, 49,248,231, 24, 44, 65, 98,116, 58,111,248, -251, 55,133,183,143, 9,146, 36,214,153,182, 32, 8, 24, 55,110, 92,185, 49,175,108, 55, 98,219, 32,182,182, 30,190,246,225,127, -103,159,196,239, 56, 58, 66, 0, 94, 40,141,226, 25, 44,255,186, 99, 24, 18, 18,226,150,156,156, 92, 89,187,168, 74,123,251, 1, -127, 15,201,192, 1,159,164,164,164,180,116,119,119, 71,223,190,125,177,109,243,230,173, 31, 2,101, 33, 27, 35,144,166,185,113, -227, 63,165,191,211,107, 10,234,217,170, 8,139, 13,117,109,214,153,219,162, 87,119, 90,149,195,178, 37, 15,102,191,125,243, 25, - 34, 52, 89,104, 19,172,194,177, 19,231,208, 41,136,128,152, 21,181, 78,167, 78,167, 43,105,140,175,213, 66,165,250,187,205,149, - 74,171,129, 66,169,170,117,222,237, 35, 85,119, 26,193, 98, 24,182,220,126,124,253,245,215, 49,117,234, 84,244,237,219, 23,137, -137,137, 56,124,248, 48, 46, 95,190,140, 9, 19, 38, 32, 50, 50, 18, 79, 60,241,132, 83,199,232,183,223,126, 67, 65, 65, 1, 8, - 33,200,206,206,134,201,100,194,140, 25, 51,238,248,184,219,184,182,103, 54, 0,224,151, 61,177,181,214,156, 62,125,122,217, 24, -140,182,123,126, 13, 81, 43, 71,238,119,167,170,251,239,236,250,247,130, 74, 13,214,229,203,151, 43,237, 43, 31, 17, 17,145,213, -167, 79, 31,159,132,132, 4,232,116, 58,132,135,135,195,108, 54, 87, 87, 13,209, 18,165, 99,101, 92,186,116,169, 82,205,176,176, - 48,235,227,143, 63, 46,111,208,160, 65,185,200,149,173,135,141,189, 51,174,168, 89, 74,145,201,100, 26,221,181,107,215,181, 59, -119,238,212,132,135,135,163,160,160,164,253,237,154, 53,107,240,214, 91,111, 65,163,209, 32, 33, 33, 1, 67,134, 12, 49, 24, 12, -134,209, 40, 63, 6, 86,101,154,183, 25, 25,133, 66, 81, 86, 77,102,171, 42, 83, 86, 31,138,190, 77,147, 97, 24, 44, 94,188,184, -210,177,160, 42,178,124,249,242,202,220,124,165,233,252,226,139, 47,234, 76,243,228,201,147,229,222, 49, 56,112,224,192,111,158, -120,226, 9,164,166,166,150,171, 22,172,193, 96,149,211,172,105, 32, 81,142,227,224,235,235,139,143, 63,254, 24, 94, 94, 94,104, -208,160, 65,101, 6,171,218, 99, 84, 75,238,170, 38, 97, 73,204,162, 5,209,221,190,249,246, 23,185, 74,201,226,248,225, 95, 80, -152,119,163,124, 4,214,250,119,151,104,101, 84, 31, 88, 98,247, 57,148, 78,179,217,140,207, 63,255, 28,209,209,209,136,142,142, -174, 54, 65, 85,116,135,174, 49,239,246, 6,203, 65,179,117,155,166, 36,137,140, 90,235, 9,173,139, 63, 34, 35, 61, 33,145,154, -199,234,148,238,255,113, 55,164,166,166,186, 7, 5, 5,225,242,229,203, 12,254,110,143,245,247,177, 82, 42,159,173, 96,176,110, - 63,223,129,243, 27, 54,108,104,217,170, 85, 43, 44, 89,178, 4, 0, 94,250,252,143, 63, 70, 70, 27, 75,194,153, 28,176,177,212, -140,213,152, 78,145,136,140, 90,235, 1,141,174,116, 63, 74,142,143,121, 74,170,201,187,237,230,119, 39, 15,122,149,105,218,214, -191,122,252,119, 60,217, 63, 16,127,158, 60,143,125,105, 46, 8, 82,101,192,207,144, 13, 41,251, 47,252,103,120, 20,190,252,185, -228, 38,126,254,116,205,154, 12,195,224,232,164,209,208,169, 85,120,122,195, 14,200,229,114, 28,124,231,101, 40, 20, 10,244, 92, - 80, 82, 37,123,225,243,233,144,169,148,136,152, 16,237, 80, 58, 43,214,212,216,218, 92,217,155,171, 26, 34, 88, 85,230, 93,175, -215, 35, 47, 47, 15,107,215,174,197,171,175,190,138,155, 55,111,226,250,245,235, 72, 72, 72,192,198,141, 27,203,221,227,224,196, - 49,154, 54,109, 26,222,125,247, 93,176, 44,139,150, 45, 91, 34, 58, 58, 26, 93,186,116,113,250, 24, 85, 60,238, 21,113, 32,122, - 85,165,230,162, 69,139,156,238,176,245, 32,226, 84, 3, 13, 91, 36,203,203,203, 11, 46, 46, 46, 0, 80,238, 6, 91, 83, 53, 97, - 85,154,130, 32, 64,163,209, 64,163,209,148, 27, 22, 97,240,224,193, 53, 70,176, 74,217,149,144,144,240,124,139, 22, 45,190,139, -142,142,118,121,244,209, 71,229,254,254,254,104,215,174, 29, 18, 18, 18,240,251,239,191, 91,151, 46, 93,106, 48, 24, 12,175, 2, -216, 83, 27,243,108,107,248,109, 63,162,189, 51,136,162,152,122,253,250,117,191, 47,190,248,130, 99, 24, 6, 11, 23, 46, 44, 55, - 64,107,197, 60,158, 56,113, 66, 32,132, 92,169, 33,138,145,122,253,250,117,191,249,243,231,151,211,180,125, 42,154, 20, 71, 52, -171,194,150,231,138,251,192,145,147,167,166,129, 68,101, 50, 25,226,227,227,241,209, 71, 31,129, 97,152,114, 29, 39,254,205,252, -249,191,204, 85, 93,218,193,243,217,225,189, 91, 49, 96, 97,169, 36,210,203,229,230,151,153,171,161,243, 55,225,183,119, 71, 58, -114, 44,174, 31, 58,116, 40,120,246,236,217, 28,199,113,152, 55,111, 94,185,178, 84,241,184,239,223,191, 95,212,104, 52, 41,181, -205,135,213,106,117,164, 23, 85, 85, 39,248,177,197,243, 62,234,251,205,234,109,114,134,177,224,248,161, 95, 80,144, 95,121,215, -116,165, 92,134,117, 27,182, 10, 50,142, 77,189,207,135,238,155,199, 30,123,108,198,222,189,123,101, 65, 65, 65,181, 22, 9, 4, -182, 45, 94,188,184,255,168, 81,163,234, 53,111,222,220,214,249, 68, 89,250, 65,233,200,238,187, 28, 52, 73, 91,190,252,226,163, -151, 86,172,222,166,100, 25, 43,142, 31,254, 5, 5, 21,204,250,237,209,104, 57,214,111,216, 98,149,201,184,248,154,174,193,181, -233,193,236, 8,109,159,124, 21, 95,239, 88, 9,159, 86,253,241,204,160,110, 56,186,228, 37,140,104,110,132,245,199,231,208,242, -153,117, 88, 51,189, 36,122,211,230,167,233, 14,221, 43,220,116,127, 15, 88,201,178, 44, 84,106, 13,228,202,191,163, 47, 74,173, - 22,156, 19, 17, 91, 91,222,171,139, 84, 57,187, 63, 56,142, 67, 88, 88, 24, 26, 53,106,132,174, 93,187,162,109,219,182,232,213, -171, 23,206,157, 59,135,115,231,206, 97,194,132, 9,213,153,171, 26,143, 81,223,190,125,209,175, 95,191, 59, 62, 54, 21,143,123, - 93,224, 72, 89, 26, 63,126, 60, 0,220, 81, 52,235,129, 54, 88,222,222,222, 80, 42,149,181, 50, 84,149,105, 90, 44,150, 50, 99, -165,209,104,202, 34, 86, 91,183,110,117,166,128,239, 49, 26,141,145, 31,124,240,193, 68,141, 70,211,203,104, 52, 70, 0,128, 86, -171,253,203, 96, 48, 28,176, 90,173,139, 0,228,223, 73, 90,237, 13, 70, 37, 81,174,106, 31,241,179,179,179,159,120,241,197, 23, -247,176, 44,219,176,186, 23, 51,219,153,213,164,172,172,172,254, 53,105,190,240,194, 11,149,106, 86,166,235,136,102, 21,230,176, -156,169,178,239, 97,232, 80, 33,171, 97, 32, 81,185, 92, 14,157, 78,135,205,155, 55,163,126,253,250, 15,212, 9,118, 60, 38,243, -243,234,230,247,172,175, 60, 4,192,123,232,252, 77, 41,135,114,173, 33, 67,231,111, 74,254,237,221,145,193, 53, 24,158, 71,230, -206,157,123,148,231,249, 16, 7,203,109,178,217,108,238,230,108,218, 9, 33,136,143,143,151, 94,127,253,245,156,236,236,236,103, -106,147,255,195,199,147, 23,116,235,232,239, 53,124, 72,183, 14, 96, 24, 88, 44, 85, 52,234,101, 64, 8, 33, 68,198,177,169,135, - 78,164,190,126,159, 95,161,113, 54, 57, 57,121, 86,227,198,141,199, 0,168,234, 78,184,177, 38,145, 36,192,162, 52,155,191,104, -223,190,253,148,247,222,123,207, 99,208,160, 65, 8, 10, 10,130,187,187,243,111, 11, 58,118, 42,125, 76,231,118, 98,224,211,131, -187, 61,193, 50, 12, 49, 91,170,111, 28,205,216,246,167,140,139, 63,124, 50,173,117,117,209,121,155, 41,191, 27,209,134, 62,195, - 95, 65,159,225,175,148,149,167,125, 63, 63,138,152,244, 63,208,142, 77,135,121, 69, 55, 48,110,182,162, 94,243, 48, 55, 44,203, - 98,208,234,205, 80, 40, 20,101,233,124,100,110,249,126, 1,225,111, 58,254, 46,117,251,188,219, 71,176, 42,185, 22, 59,213, 6, -139,227, 56,228,228,228, 32, 33, 33, 1, 89, 89, 89, 48, 24, 12,136,139,139,131,197, 98, 65, 94, 94, 30, 90,182,108,233,220,211, -253, 93, 56, 70,247, 83,243, 97, 48, 86,181, 50, 88,132,144,180, 78,157, 58,213,116, 51,118,170,151,145, 76, 38, 51,117,235,214, -141,169,172,183,129,237,183, 70,163,113,244,241, 57,223,106,181, 70, 91,173,214,104,148, 86,133, 89,173,214, 59,110, 72, 34,138, - 98, 70,199,142, 29,185,234, 46,250,146, 36, 85, 59, 98, 92, 78, 78, 78,113, 78, 78, 78,157,190, 58,252,110,104, 86,114,210,136, - 99,198,140,169,214, 73,185,184,184, 84,219,184,168,166,129, 68, 13, 6, 67,230,139, 47,190, 40,218, 87, 53,219, 15, 68,250, 64, -195,144,228, 1,207,190, 22,114, 40,215, 26, 2, 0, 54,147, 5, 66,146,171, 90,229,244,233,211, 89, 0, 26,223,237,164, 93,187, -118,205,210,169, 83,167,245, 69, 69, 69,227, 1, 24,106,171,115,244, 84,198,244,127,225,145, 57, 11, 96,236,157,138, 88,128, 56, - 95,147,105, 92,244,135, 31, 62,253,209,135, 31,134, 75, 64,125,148,142, 81,197, 57, 96,210,236, 57, 17,115,163,206,199, 6, 19, - 69, 49,237,145, 71, 30,113,122,157,154,230, 87, 51,146, 56,126, 64, 16,112,218,121,205,187,145, 78,155,102,171, 86,173,208,166, - 77,155,178,111, 27,246,211,219,182,109,235,144,102, 84, 84, 20,154, 55,111, 94,229, 8,237, 21,219, 92,221,239,188,219,176, 61, -250,182,109,187,187,206, 52,239, 52,157,148,234,105, 73, 53,169, 38,213,252,215,106,114,116,127, 82, 77,170, 73, 53,239,161,230, - 3, 5, 75,119, 1,133, 66,169,234, 1,147,238, 2, 10,133, 66,169, 29, 76, 53, 46,212,153,158, 59,181,113,178, 23,168, 38,213, -164,154, 84,147,106, 82, 77,170,249,208,105,214,164, 93,215, 61,135, 31, 72,104,248,148,106, 82, 77,170, 73, 53,169, 38,213,164, -154, 15, 29,180,138,144, 66,161, 80, 40, 20, 10,165,142,145,209, 93, 64,161, 60,220, 68,223,225,131, 86,244,109, 99,131, 62,220, -233,164, 80, 40, 20,128, 70,176, 40, 20, 10,133, 66,161, 80,168,193,162, 80, 40, 20, 10,133, 66,161, 6,139, 66,161, 80, 40, 20, - 10,229, 33,131,161,187,128, 66,121,184,137,166,109,176, 40, 20, 10,165,206,161, 17, 44, 10,133, 66,161, 80, 40,148, 58,198,214, -139,208,254,125,125, 52,170, 69,161, 80, 40, 20, 10,229, 94,243, 64,121, 17, 25, 53, 86, 20, 10,133, 66,161, 80,254, 33, 60, 48, - 94,132,173,194, 57, 82, 40, 20, 10,133, 66,161,220,107, 30, 24, 47,194, 62,136,174,145, 66,161, 80, 40, 20,202,191,146, 7, 54, -130, 69,163, 88, 20, 10,133, 66,161, 80,238, 23, 15,140, 23,145, 61,104,142,145, 66,161, 80, 40, 20,202,191,146, 7,202,139,220, -237, 97, 26,232,155,198,169, 38,213,164,154, 84,147,106, 82, 77,170,249,208, 65,199,193,162, 80, 40, 20, 10,133, 66,161, 6,139, - 66,161, 80, 40, 20, 10,133, 26, 44, 10,133, 66,161, 80, 40,148,135, 10, 25,221, 5, 20,202,195, 77,244,191,228, 29,125,209,244, - 93,130, 20, 10,229, 95, 4,141, 96, 81, 40, 20, 10,133, 66,161,212, 49, 12,170,238, 9,112,193, 9,157,218,244, 38,184, 64, 53, -169, 38,213,164,154, 84,147,106, 82,205,135, 78,179, 38,237, 11,160,220, 21,227, 69, 53,169, 38,213,164,154, 84,147,106, 82,205, -135, 79,243,129,130, 86, 17, 82, 42, 34, 67,245,109,243,106,154,127,175, 52, 41, 20, 10,133, 66,249, 71,223, 76, 41, 20, 27, 93, - 0, 12, 44,253,189, 29,192,113, 39,231,223, 43,205,251, 66, 84, 84,148, 70,173, 86,247,221,191,127,191, 34, 62, 62, 30, 39, 78, -156, 32, 63,252,240, 3,111, 50,153,254,136,141,141, 53,210,226,243, 96,208,182,109,219, 39, 24,134,153, 10, 0,132,144,207,206, -156, 57,179,251, 14,228,152,198,141, 27, 79, 80, 42,149, 3,228,114,185,191, 40,138,140,217,108,206, 48, 26,141,123,210,211,211, -231,163,118, 13,247, 59,120,121,121,141,141,140,140, 12,191,118,237, 90,106, 74, 74,202, 58, 0,187, 1, 60, 17, 28, 28,252, 98, - 88, 88, 88,208,197,139, 23, 47,231,228,228, 44, 7,240,191,251,152, 78, 10,133, 26, 44, 7, 96, 61, 61, 61, 31,215,104, 52, 19, -245,122,125,148,155,155,219, 69, 65, 16, 22,103,102,102,110,167, 39,222, 3, 85, 22, 6, 18, 66,228, 0,192,113,220,144,142, 29, - 59,134, 48, 12, 35, 49, 12, 67, 8, 33,204,201,147, 39,219,138,162,200, 2, 0,195, 48, 3, 75, 47,222, 66,109, 53, 5, 65, 96, - 78,159, 62,237,172,230, 93,161, 69,139, 22,179, 9, 33,254,213,238, 32,153,172,253,190,125,251,154,109,217,178, 69, 88,183,110, - 93,254,200,145, 35,117, 47,191,252,178,108,205,154, 53, 95, 3,248, 79,197,229,155, 55,111,190,128,101, 89, 47, 71,182, 47, 73, - 82, 78, 92, 92,220,127,105, 49,188,255, 48, 12, 51,245,181,185, 7,123, 72, 4,248,110, 90, 79,182,212,188,212,214,172,125,255, -212, 83, 79, 61,219,180,105, 83,153, 36, 73,224,121, 30,102,179,185, 89,108,108,236,163,187,119,239,110,159,148,148,244,140,147, -146, 3,167, 77,155,182,114,214,172, 89,222,114,185,156,225,121,190,243,143, 63,254,216,111,236,216,177,103,151, 47, 95,222,102, -196,136, 17,174,182,233, 31,125,244, 81,255, 57,115,230,188, 3, 96,227,125, 72, 39,133, 66,111,170,213,205,212,233,116, 77,188, -189,189,223, 45, 44, 44,236,223,190,125,251,130,209,163, 71, 95, 61,119,238, 92, 92,100,100,164,126,245,234,213,159,242, 60,191, -212,211,211,243,143,194,194,194,249, 89, 89, 89,113, 78,110,187, 9,128,209, 0,250, 3, 8, 4,144, 1, 96, 39,128,149, 0,226, -107,147, 25,127,127,255, 86, 46, 46, 46, 83, 24,134,233, 92, 92, 92, 28,232,226,226,146, 65, 8, 57, 89, 84, 84, 52,239,198,141, - 27,177,181,209, 12, 8, 8,104, 4,224,109,153, 76,214, 93, 20,197,134, 28,199, 37,139,162,120, 68, 20,197, 37,153,153,153,151, -107,163,249, 72,160,110,144,164,115,155,207,115,154, 32,189, 73, 80,232, 84, 50, 94, 46,153, 82,165,226,252,105,167, 82,139,127, -249, 39, 20, 12,165, 82,201,174, 91,183,174,141, 82,169, 4, 0, 88, 44, 22, 68, 70, 70,222,209,123,162,228,114, 57, 59,111,222, -188, 54, 10,133, 2, 0, 96,181, 90,209,187,119,239,127,196,187,167, 24,134, 9,140,137,137,113,183,165,173, 34,162, 40, 98,200, -144, 33,161, 74,165, 18,203,151, 47, 23,114,114,114,162,190,251,238,187,152,175,191,254,218,235,251,239,191, 31, 94,153,193, 98, - 89,214,171, 42, 77, 81, 20, 97,181, 90, 33, 8, 2, 44, 22, 11,122,245,234, 69,175, 70,255, 16, 8, 33, 33, 4,192,206,115, 38, - 0,168,127, 39, 90, 26,141, 38, 98,232,208,161,178,236,236,108,200,229,114, 88,173, 86,220,184,113, 3,141, 26, 53,226, 44, 22, - 75, 83,103,245,154, 53,107, 54,118,206,156, 57, 62, 59,118,236,176,174, 95,191,222,252,216, 99,143, 41, 94,125,245, 85,183, 30, - 61,122,116, 15, 12, 12,100,191,251,238, 59,243,222,189,123,173, 47,188,240,130,106,246,236,217, 62, 59,119,238,124,246,252,249, -243, 27,239,117, 58, 41, 20, 74, 53, 6, 75,167,211, 29,210,233,116,141,223,120,227,141,248,241,227,199,255,161,211,233, 68, 0, -184,113,227,134,106,200,144, 33,217,195,134, 13,187,105, 48, 24,184,165, 75,151, 6,127,245,213, 87,123,116, 58, 93,186, 94,175, -239,232,200,189, 12,192, 68,150,101,223,238,219,183,239, 33,158,231,179, 55,111,222,252,211,240,225,195,187, 73,146,228,178,127, -255,254,223, 69, 81,252, 6,192, 23, 78, 68,199,184,176,176,176,104, 47, 47,175, 73,203,150, 45, 83, 53,108,216, 16, 90,173, 22, - 69, 69, 69,193,151, 47, 95, 14,154, 56,113,226, 96,141, 70,179,216,221,221,253,131,216,216, 88,222,209,123,174,191,191,255,127, - 92, 93, 93, 63,249,244,211, 79,213, 45, 90,180, 96,180, 90, 45,146,146,146, 90, 30, 63,126, 60,242,219,111,191,125,149,101,217, -153,233,233,233, 14,167,179, 39, 32, 51, 55,246,222,237, 26,218,178,215,242,149,223, 50, 94, 46, 90,200, 24, 6,188,213, 42,207, - 50, 24,195,222, 26, 55,230,167,206,170, 75,199,138,228, 89,125,226,226, 96,189,199,101, 65, 0,176,157,227,184, 33, 74,165,146, - 29, 50,100, 8,246,238,221,203,152, 76, 38, 25, 0,168,213,106, 97,200,144, 33,208,104, 52,176, 88, 44, 18, 74,170,243, 4, 0, -170,210,245,205,213,105,202,229,114,182, 87,175, 94,134,211,167, 79,231, 26, 12, 6,185, 77,179, 87,175, 94,245, 84, 42,149,150, -231,121, 71, 53,239,166,169,196,149, 43, 87,110, 51, 66, 55,111,222, 68,110,110, 46,204,102, 51,147,151,151, 7, 81, 20, 97, 54, -155,179, 69, 81, 4,203,178,182, 50, 93, 41, 10,133, 2, 9, 9, 9,183, 77,183, 90,173, 48, 26,141,224,121, 30,133,133,133, 26, -181, 90,221,184, 91,183,110,105, 0,182,232,245,250,249,231,206,157, 75,166,151,167,251, 70,202,239,103, 76,193, 0,172, 0,174, -221,161,113,151, 0,224,200,145, 35,200,202,202, 66,118,118, 54,178,179,179, 17, 20, 20, 4, 66,136,211,209,255,248,248,248, 69, -109,219,182,101,206,158, 61,187, 13,192,202, 77,155, 54, 13,189,117,235,214,178,201,147, 39,215,155, 55,111,222,173, 41, 83,166, -140, 3,240,219,166, 77,155, 94,105,213,170,213,160,243,231,207,127,121, 63,210, 73,161, 80,170,105,228, 78, 8,241,111,210,164, -201,173,133, 11, 23, 54,155, 54,109, 90,125,189, 94,207,149, 70,137, 76, 0, 96, 48, 24,184,169, 83,167,122,207,157, 59,183,153, - 74,165,202, 19, 4,193,187, 18,153,202,186, 90,190,237,230,230, 54,248,234,213,171,155,154, 53,107, 86,111,206,156, 57,103, 92, - 92, 92,200,151, 95,126, 25,219,168, 81, 35,191,228,228,228,181,110,110,110,189, 1, 76,170, 34,105,183,105,134,134,134,126, 52, -124,248,240, 73,199,142, 29, 83,181,110,221, 26,174,174,174,224, 56, 14, 30, 30, 30,232,212,169, 19,115,248,240, 97,213,128, 1, - 3, 38, 20, 20, 20,204,115, 84, 51, 32, 32, 96, 82,191,126,253, 62, 61,125,250,180,166, 79,159, 62,140, 82,169, 68,126,126, 62, -148, 74, 37,186,116,233,194, 44,251,122,137,166,101,139,230, 31, 5, 6, 6,206,114, 84,211,220,196,107,207,200,241, 83,123,111, -223,185,155,241,245,245,197,213, 47,102,225, 72,143, 72, 36,126, 60, 13,126,126,126,216,182, 99, 23, 51,112,212,248,110,110,188, -239,126, 71, 53,235, 0,123,205,227,145,145,145, 49,113,113,113,232,222,189, 59,126,250,233,167,214,147, 39, 79, 30, 63,121,242, -228,241, 63,253,244, 83,235,238,221,187, 35, 46, 46, 14,145,145,145, 49, 40,105, 43, 53, 30,192,173,210,207,248,234, 52, 15, 29, - 58,132,222,189,123,231,109,218,180,169,209,140, 25, 51,102,207,152, 49, 99,246, 79, 63,253, 20,214,187,119,239,188, 67,135, 14, - 57,171,121, 55,242, 94,102,168, 42,126, 8, 33,144, 36, 9, 62, 62, 62, 55,119,236,216, 65, 6, 14, 28,200, 53,104,208, 32, 99, -200,144, 33,170,147, 39, 79, 18,134, 97,182, 59,147, 78, 66, 8,140, 70, 35,140, 70, 35,174, 93,187,166, 89,188,120,113,183, 73, -147, 38, 53,249,241,199, 31, 3, 38, 76,152, 48,206,205,205, 45,182,117,235,214, 33,247, 58,239, 84,179, 44,242,120,163,212, 92, - 21,179, 44,155, 82, 91,205, 97,195,134,181, 12, 9, 9,241,253,241,162, 39,242, 20,205, 32,202,221, 33, 41, 60, 32,214,239,128, - 68, 69, 63,248,251,251,251, 6, 7, 7,119,113, 50,157,123,206,158, 61,219, 31,192,114, 0, 34,128,159,167, 76,153,242, 58,195, - 48,191, 76,153, 50,101, 12,128,159, 75,167,175, 58,127,254,252, 32, 0, 7,238, 83, 58,105, 89,162,154,117, 10, 33,164, 3, 33, -228,201,210, 79, 71, 66, 72,167, 10,255,149, 21,150,123,172,138,239, 39, 43,252,239, 80, 97,189, 14,117,109,176,136,221,199,246, - 68,195,127,254,249,231, 39,190,253,246,219,189,153,153,153,126, 97, 97, 97, 79, 14, 29, 58, 52,164,176,176,144, 29, 54,108, 88, -168,159,159,223,192, 3, 7, 14, 52, 24, 54,108,216,254,225,195,135, 31,103, 24,198,145,118, 51,141, 56,142,123,231,236,217,179, - 71, 67, 67, 67,173, 25, 25, 25,174,109,219,182, 45, 2,128,240,240,112, 67,110,110,174,198,213,213, 21, 59,118,236, 56,197, 48, -204,104, 0,205,106, 18,244,243,243,107,235,229,229, 53,233,147, 79, 62, 81,113, 28, 87,233, 50, 42,149, 10,159,124,242,137,202, -205,205,237, 13,127,127,255,206, 53,105,250,250,250, 70,184,186,186, 70, 47, 94,188, 88,109,177, 88, 96,181, 90,225,235,235, 11, -157, 78,135,204,204, 76,164, 95,191,142,155, 73, 73,152,240,218,107, 26, 23,141,230, 29, 63, 63,191, 54, 53,105,118, 11,209, 13, -209, 5, 52,127,244,173,183, 39,226,210,196,215,176, 55, 64,137, 6,111, 79, 69,235,131, 23, 16, 56,115, 62, 14,132,185, 33,230, -153,199,241,206, 59,239, 66,225, 19,246, 72,151, 64,151,145,247, 37,164, 41,147, 17,149, 74, 5,147,201, 36, 59,114,228, 72,119, - 65, 16,228,130, 32,200, 15, 31, 62,252,232, 31,127,252,209,127,206,156, 57, 79,104, 52,154,113,157, 59,119,254,158, 97,152, 69, -132, 16, 13, 33, 68, 3, 96,158, 93,228,233, 54, 77,185, 92, 14,163,209, 40, 63,125,250,244, 24, 81, 20,149,162, 40, 42, 79,159, - 62,253,230,129, 3, 7, 94, 92,190,124,185,211,154,247, 10,142,227, 32,147,201, 32,151,203,209,166, 77,155,171, 27, 54,108,224, -253,253,253,101, 43, 86,172,240,244,241,241,113,249,254,251,239,243,243,242,242, 62,119, 70,211, 98,177,192,108, 54,195,104, 52, -226,200,145, 35, 13,223,120,227, 13,153,197, 98, 17, 71,141, 26,117,139,231,121,243,155,137,186,117,110, 0, 0, 32, 0, 73, 68, - 65, 84,111,190,233,166,211,233,222,165,207,127,247, 7, 66,136, 8,160, 24,128,158, 16, 98, 6,128,144,144, 16,149,191,191,127, -171,144,144, 16,135,203,163, 94,175,255,102,193,130, 5,129,172,202, 3, 71, 45, 3,176,137,204,194, 30,143,175,145, 29, 58, 25, -190, 65, 77,208,175, 95, 63, 31,134, 97,150,212, 65,146,183, 0, 24, 14,224,215,218,172,124,183,211,217,190,125,251,238,237,218, -181, 59, 29, 21, 21,149,217,174, 93,187,211,237,219,183,239,126,167, 25,158, 57, 6,143,205,125,139, 77,155, 53, 22,100,238, 91, -108,218,204, 49,120,140,150,220, 7,227,244,171,232, 69,236,240,102, 24,102, 59,195, 48,219,167, 79,159,222, 11, 64,253, 10,255, - 31,177, 95, 14,128,178,178,111,219,199,110,186, 55, 33,228, 73,187,245,188,235,236,126,106,247,187,210,106, 14,111,111,111,203, -123,239,189,119,214,100, 50, 93,248,254,251,239, 27,143, 31, 63,190,109, 72, 72, 72,194,176, 97,195,126,215,106,181,130,173,141, -142,131,188, 54, 96,192,128, 29,245,234,213, 99,114,114,114, 20, 22,139, 69,118,227,198, 13,133, 40,138, 12,199,113,196, 96, 48, -200, 18, 19, 19,229, 86,171, 85,234,220,185,243,214,227,199,143,143, 6,240, 78,117,130, 90,173,246,205, 21, 43, 86,168,171, 50, - 87,162, 40, 66,175,215, 67, 16, 4,204,156, 57, 83, 61,105,210,164,137, 0, 78, 84,167, 41,151,203, 39, 44, 92,184, 80,109,171, - 2,146, 36, 9,177,177,177,200,185,121, 19,230,162, 66, 88,138, 10, 97, 41,200, 3,171, 47,192,139,253,159, 80, 47,255,117,243, -127, 1,188, 88,237, 77, 85,165,155,251,253,202,111, 33,138, 34, 50, 54, 87,222, 36,226,214,177,131, 16, 5, 30,179, 63,155,199, -188,243,218,136, 57, 64,241,166,127, 74,169, 87, 42,149,236, 23, 95,124,209, 76,169, 84,130, 97, 24, 98,177, 88,208,162, 69, 11, -230, 14, 53,185, 69,139, 22,181, 85, 40, 20,140, 77,179,101,203,150,204, 63,237,140, 87, 40, 20,208,104, 52, 8, 13, 13, 53, 14, - 26, 52,232,248,162, 69,139,130, 57,142,211,202,100,178, 93, 5, 5, 5,115, 46, 93,186,228, 84, 53,146,217,108,134,201,100,130, -201,100, 66, 74, 74, 74,131,198,141, 27, 51,255,249,207,127,196,226,226,226,176, 85,171, 86, 93,217,180,105,147,118,201,146, 37, -195, 0,188, 77,175,183,247,150, 70,141, 26, 41, 1,184, 7,215,151, 21,203, 57, 20,103, 10,130,111, 64, 64,192, 84, 65, 16,218, -135,135,135,123, 38, 38, 38,230,249,251,251,159, 96, 89,118, 99, 90, 90, 90,102, 13, 70,141, 17, 4, 1, 99, 58,230, 99, 92,103, - 22,130, 32, 32, 63, 63, 31, 41, 41, 41,184,120,241, 34, 78,158,188, 88,171, 52,134,134,134,190,166, 86,171,251, 42,149,202, 80, - 81, 20, 89,131,193,144,108, 54,155,247,102,100,100,124, 83,197,141, 9,247, 35,157,118,250,243,135, 14, 29,234,239,238,238,142, - 51,103,206,248,159, 59,119,110, 62,128,246,119,116,237,144,179,223,141,122,125, 73, 64, 61, 15, 15, 36,197,109, 11,216,178,243, -199,239, 0, 41,144,150,224, 7,130,170,238, 1,217,132,144,129,165, 1,160,237,115,230,204, 25, 88, 90,190, 6,218,255,119,160, - 60,222,182, 28,195, 48,219, 43,155, 94,151, 6,139, 84,147, 49,168,213,106,113,236,216,177, 9, 91,183,110, 13,109,223,190,253, - 95, 85, 53, 6,174,129,174,205,154, 53, 75, 62,117,234, 20,241,246,246,182, 72,146,196,104,181, 90, 81,163,209, 72, 5, 5, 5, -224,121,158, 36, 39, 39,203, 82, 82, 82, 20, 94, 94, 94, 10, 0, 53,134,234,228,114,121,151,134, 13, 27, 86, 25, 41,208,235,245, - 40, 42, 42,130,217,108,134,175,175, 47,195,178,108,167, 26,195,122, 44,219,173, 89,179,102, 76, 94, 94, 30,252,253,253,113,244, -232, 81,232, 11,242, 97, 46, 42,130,185, 32, 31,214,194, 2,136,133,249,200,191,153,137, 80,191, 64,134, 97,152, 46, 53,105, 10, -156, 38,196, 71,231,130,196, 89, 83,209, 33, 54, 25,140, 92,129, 83, 45,253, 64,248,146,166, 86, 29,207,103,128, 81, 40,241,215, -132,151,209,224,249, 55,192,179,170,128,251, 81,178, 5, 65, 96,204,102, 51,212,106,181,208,189,123,247, 35, 28,199, 61,170, 84, - 42,217,113,227,198,225,198,141, 27,229, 78,128,113,227,198, 65,163,209,192,108, 54, 11, 0, 38,163,138, 54, 83,130, 32, 48, 60, -207, 67,163,209,240,237,219,183,255,134,227,184, 55,149, 74, 37,215,180,105,211,172,185,115,231,102,184,184,184,184,164,164,164, -220, 82, 42,149,105,161,161,161, 29, 53, 26, 77, 72, 77,154,247, 18,149, 74, 5,153, 76, 6,150,101, 81,191,126,253,226,220,220, -220,147,215,174, 93,123,174, 54, 90,162, 40,194, 98,177,128,231,121,152, 76, 38, 72,146,132,115,231,206, 65,165, 82,201, 69, 81, -188, 40,138,162, 86, 46,151,131,227, 56, 58, 70,221, 61, 38, 42, 42,234,209, 80, 13,230,143,243, 51,123, 54, 26,232,162,215,170, -184,226,103, 55,243, 29, 30,123,236,153, 39, 38, 79,158,170,243,242,242, 82, 94,191,126,221,244,229,151, 95, 54,252,237,183,223, - 24,148,180, 19,173,146,140,140,140, 95,230,206,157, 91,239,209, 71, 31, 13,147,203,229, 76,126,126, 62,178,179,179,113,243,230, - 77,164,164,164,144,164,164,164,171,130, 32,252,228, 76, 26, 91,181,106,181,106,224,192,129,163, 90,180,104, 33, 39,132,128,231, -121, 24, 12,134,182, 39, 79,158, 28,124,244,232,209,238,215,175, 95,119,186, 92,102,102,102,254,244,217,103,159,185,244,236,217, -179,153, 92, 46,103,235, 34,157, 21,110,104,254, 58,157, 14,123,247,238,133,155,155, 27,106,234,173,235, 8, 86, 65, 10,168,231, - 81, 31,166,203, 11,224,239, 22, 2,171, 32, 5,208, 18,252, 64, 69,177,152, 74, 76,208,255, 8, 33, 79,222,169, 25,186, 91,102, -170, 86, 17, 44, 27, 55,110,220, 80,233,245,122,153, 36, 73,172,217,108,150, 75,146, 4,185, 92,206, 59,185,189, 22, 67,135, 14, - 61,209,161, 67, 7, 67,105, 4, 67,112,119,119, 23, 10, 10, 10, 80,106,176, 36,153, 76,102,210,233,116,166,176,176, 48,192,129, - 42, 66,163,209, 24,172,209,104,110,155,110, 48, 24,160,215,235,203, 12,150,193, 96,128,155,155, 27,138,139,139,107, 60,185, 69, - 81, 12,213,106,181,200,200,200, 0, 0,232,243,243, 96, 42, 44,132,181,168, 0,214,252, 60,240, 5,249,224, 11,242,192, 26,141, -240, 8, 12,130, 32, 8, 65, 53,105, 22,155, 69, 37, 7,130,155,219,127,129,239,155,147,171, 92,238,214,145, 3,208, 53,110, 10, -163,209,122, 63,198, 40,235,114,241,226,197,118,205,155, 55,199,144, 33, 67,240,204, 51,207,156,211,104, 52, 62, 75,150, 44,105, -145,158,158,126,219,194, 79, 61,245, 20,222,126,251,109, 12, 29, 58,116,237,217,179,103,151, 86,167,217,179,103, 79,244,234,213, -171,222, 51,207, 60,147,164,211,233, 98, 86,174, 92,217,113,230,204,153, 89, 6,131, 33, 61, 38, 38,166, 85, 90, 90,154, 54, 60, - 60,252, 96,100,100, 36,187, 99,199,142,144, 26, 52,239,181,233, 4,207,243,176, 90,173, 48,155,205, 32,132, 56, 28,101, 35,164, -124, 64,129,231,249,178, 30,132, 38,147, 9, 60,207, 51, 91,182,108,198,182,109,219,216,184,184, 75,129,211,166, 77, 71,126,126, - 62, 68, 81,164,151,217,123, 68,187,118,237,250,203,136,180, 98, 68, 3, 94,253,130,175,160,151,177, 68,127,249,219, 15,138,207, -121,200,204,230, 98,198,245,253, 15, 62,240,188,114,229,138,245,179,207, 62,203, 28, 50,100,136,250,245,215, 95,111,190, 99,199, -142,238, 65, 65, 65,223,166,166,166,230, 87, 21,248,236,220,185,243, 9, 79, 79,207, 70,235,215,175,207,202,200,200,168,199,243, -188,214, 98,177, 88, 45, 22,203, 21,171,213,122,212, 98,177,236,189,113,227, 70,140, 51,105,213,233,116,173, 71,142, 28, 41,207, -203,203,131, 76, 38,131,213,106, 69,118,118, 54,162,162,162,184,125,251,246,181,168, 77,254,227,226,226, 22,228,231,231, 31,220, -182,109, 91, 95, 23, 23,151,118, 74,165,178,129, 40,138,162,201,100,202, 50,153, 76,103,107,147,206, 10, 55,180,140,216,216, 88, -127, 87, 87, 87,164,167,167,131, 97,152,140, 59, 61,102, 10, 57,155,154,244,215,214, 32,127,183,134,136,143, 63, 1,133,156, 77, -165, 35, 6, 61,216, 17, 44,187,182, 82, 3,107, 48, 73,198,105,211,166,189,199, 48,204,246,105,211,166,189, 87, 77, 4, 75,180, - 95,206,110,249, 58,123,168,175,246, 38, 94, 84, 84, 36,251,223,255,254, 87, 63, 37, 37, 69,215,160, 65, 3, 67,100,100,100, 62, -195, 48, 68, 20, 69,246,214,173, 91, 46,105,105,105,106, 79, 79, 79,115, 80, 80, 80,129,131,219,187,252,214, 91,111,245,156, 49, - 99, 70,204,227,143, 63,158, 3, 0,121,121,121,200,206,206,182,245,210, 66, 70, 70, 6,123,250,244,233,122,187,118,237,106, 11, - 7,122,240,104, 52,154,148,162,162,162,166, 30, 30, 30,101, 55, 52,155,169,178,255,182, 90,173, 40, 42, 42,130,139,139, 75,141, - 39, 55,203,178,233,233,233,233,141,141, 70, 3,146, 19, 19, 97, 46, 42,128,181,176, 0,124, 97, 62,248,252,124,136,249,183,192, -234,139,160,211,104, 80,116, 43, 23, 28,199,221,168, 73,211, 69,197, 89,120, 65, 84,122,247, 27, 12, 48, 85,223,159, 61, 58,117, - 3,137,104, 13,141,230, 87,254, 30, 23,106, 25,128,129,182, 49,169, 52, 26, 13, 62,253,244, 83,196,196,196, 72,213, 85, 3, 43, -149, 74,176, 44, 43, 58,162,169, 82,169, 52, 51,102,204,208,156, 61,123, 86,173, 84, 42,161,211,233,180,103,207,158,109,245,231, -159,127,178, 6,131,129,107,220,184,241,208,128,128, 0,125, 13,154,119,213, 72, 85, 54, 77,175,215,151,181,155,186,117,235,150, - 76,173, 86,135,119,239,222,253,184,197, 98,249, 73, 16,132,213,177,177,177,133, 85, 62,105, 91,111,239, 12, 42, 73, 18, 4, 65, -128, 32, 8,144,201,100,210,150, 45, 91,241,213,210, 69,248,121,211,175,164,103,207,158,204,142, 29, 59, 32, 73, 82, 26,189,206, -222, 27, 36, 73,154,127, 96,234,211,106,136,162,222,124,112, 67,241,238, 92, 89,241,183, 23, 14,156,206,229,205,170, 38, 77,194, - 34,220, 92,221,217,239,215,125,123, 43, 51,235,234,229,175,190, 74, 11,154, 61,123,182, 71, 88, 88,152,123, 66, 66, 66, 0,128, -252, 42,140, 80,232,203, 47,191,252,234,173, 91,183,228, 43, 87,174, 92,147,158,158,126, 24,192,213,138, 65, 51,148,180, 51,148, - 3,240, 69, 73, 15,218, 61, 0,214, 86, 99, 86, 36,134, 97,112,240,224,193,219,122,251, 73,146, 84,107,135,145,153,153,153,215, -169, 83,167,214,151, 47, 95,222,146,159,159,191,190,146,235,236,224,200,200,200,103, 79,157, 58,245, 33,128, 43, 78, 70,176,222, -137,139,139,251, 92,146,164, 16,150,101,147, 9, 33, 83,238,244,152, 89,172,210,235, 91,119,110, 90,105,225,197, 96,165,156, 75, -177, 88,165, 55,104, 73,126,224,177,181,145,130,189,113,170,196, 24,253, 57,103,206, 28,205,220,185,115, 49,103,206,156,139,149, - 69,176,108, 70,107,206,156, 57, 23,109,203,217, 45,127,184,174, 13, 22, 83,201,141, 69, 55,125,250,244,174,109,219,182,205,120, -244,209, 71, 51, 27, 54,108,104,176,205,211,106,181, 22, 15, 15, 15,139,217,108, 86,101,100,100,120,255,245,215, 95, 13, 37, 73, -210, 56,176,189,253, 30, 30, 30,245, 78,159, 62, 93,127,227,198,141, 77, 98, 99, 99, 67,158,127,254,249,158,102,179, 25, 22,139, - 5,215,174, 93, 11, 89,177, 98,133,164, 80, 40,242, 25,134,249, 31, 74,122,195, 84, 11,207,243,199, 47, 95,190, 28,222,169, 83, - 39,134,231,249,114,166,202,254,183, 82,169, 68,122,122, 58,145, 36,233,164, 3,233, 60,113,250,212,169,198, 45,155, 55,135,185, - 32, 15,150,194,124, 88, 11,242, 33, 20,228, 67, 42,204, 7,171, 47, 66,253,122,114,104, 52, 46,184,156,145,137,210,180, 86,139, - 92, 48, 38,165, 23, 20, 54,109, 28,253, 5, 14,132,185,129,240,214,178,106, 65, 0,101,213,133,143,252,149,141, 35,127, 30,135, - 76, 52,167,223,207,146,108,177, 88,164, 97,195,134,157, 98, 89,182,206,222, 55,197,243,188, 52,126,252,248, 50,205,212,212,212, - 91,169,169,169,106,163,209,200,234,116, 58,253,253, 62,123,121,158,175,212, 32, 89, 44, 22, 24,141, 70,100,102,102, 42,247,236, -217,211,253,248,241,227,138, 75,151, 46,225,248,241,227,109,182,108,217, 50,189, 89,179,102,173,227,227,227,111, 56, 98,218, 36, - 73,130,237, 62, 72, 8, 1, 33,132, 3,128,173,191,109, 71,191,126,253,152,162,162, 34,108,219,182,173, 78,170, 81, 40, 14, 83, - 12, 65,212, 88, 14,109, 40,126, 55, 81, 89,120,209, 32,251, 36, 38, 38,102,247,128, 1, 3,142,248,251,134,185, 1,128, 74,161, -243,230,136,171,206,219,219, 91, 5, 0,254,254,254,237,120,158, 95,154,158,158,222,173, 50,193,167,158,122,234, 17, 31, 31,159, -182, 59,119,238, 60,155,158,158,126,164, 18,115,133,166, 77,155,206,188,112,225, 66,127,185, 92,206,216, 93,252, 73, 85, 6,107, -216,176, 97, 77,149, 74,101,253, 29,151,221, 81,168,104, 12,137,205, 7,225, 84, 16, 61, 90, 35, 89,209, 2,190,190,127,213,215, -106,181,109,174, 94,189,122,214,201,252, 7,143, 24, 49,226,247, 85,171, 86, 69,244,235,215, 79,121,236,216,177,219, 12, 86, 68, - 68,196,176,125,251,246, 13, 31, 55,110, 92,235,245,235,215, 15, 2,144,232,168,120,108,108,236, 49,148,188,177,161,206,248,232, - 27,236, 5,196,144,210, 64, 4, 45,193, 15,120,244,170,148,108,187,232, 83, 54, 0,166,194,255,179,165,231,144,133, 16, 98, 91, - 54,219, 46,106,101,169, 16,245,170,108, 94, 54,195, 48,117, 22,220,144, 85,243,228,189,231,218,181,107, 29, 70,140, 24,145,109, -111,174,236,171, 71,116, 58,157,217,205,205, 77,127,234,212, 41,127, 81, 20, 15, 58,176,189,149,251,246,237, 59,176,120,241,226, - 13,245,234,213,227, 95,124,241, 69,118,234,212,169, 71,114,115,115, 73,110,110, 46,150, 44, 89,210,163,123,247,238, 71,146,147, -147,197,152,152,152, 87, 0,244,171, 73,208, 96, 48,124,253,230,155,111, 62,123,228,200, 17,181,197, 98, 65,126,126,254,109,209, - 43,158,231,193,113, 28,150, 46, 93,106, 46, 46, 46, 94,228, 64, 36,227,155,175,191,254,122,248,138,175, 22,171,101,188, 21,134, -252, 60,136,165, 31,206, 84, 12,157,154, 69,227,182,222,200,207, 80, 97,221,206, 99, 70, 65, 16,190,174,209, 96,153,244,147,199, -141, 25,189,125,207,254, 3,168,223,173, 55,114, 14,236,186, 61, 26,228,237, 11,139,213,138, 79,102, 69, 19,198,152, 63,245, 94, - 7,112, 0,108, 47, 29, 77, 29, 0,182,159, 61,123,246,120,155, 54,109,250, 91, 44,150,234,140, 24, 36, 73,226,106,163,169, 82, -169,210,154, 54,109,186,191, 81,163, 70, 67, 1,160,121,243,230,191,177, 44,219,187, 6,205,187,106,176,102,204,152,129,185,115, -231, 98,218,180,105,101, 6,201,246, 0, 96, 54,155, 27,238,218,181, 75,121,236,216, 49,178,110,221,186,156,167,159,126,218,227, -249,231,159,247, 88,191,126,253,127, 0, 76,173, 74,115,202,148, 41, 88,190,124, 57,198,142, 29,123,219,124,142,227,164,244,244, - 52,152, 45,102,178,117,235,214, 12,153, 76,230,249,229,151, 95,106, 38, 77,154,196,208,107,237,189, 65, 20,197,247,187, 45,216, - 50, 17,208,240,130, 32, 44, 58,127, 62,230, 96,105,212,198,103,193,130, 5, 74, 0,248, 98,222, 23,114, 66,136,220, 54, 48,236, -199, 31,127,172, 30, 51,102,140, 79, 85,154,191,252,242, 75,222,199, 31,127, 92,255,245,215, 95,239,119,224,192, 1,245,169, 83, -167,118,161,228, 45, 5, 57,165,142,192, 43, 33, 33,225,152,183,183,183,223,166, 77,155, 26,247,237,219,215,165, 70, 23, 88, 92, -252,237,178,101,203, 66,231, 31,118,197,142,226,161, 72, 37,207,128,212, 35,168,167, 40, 66,115, 93, 10,122,250,165,250,175, 95, -191,126, 37,128,118, 78,100,191,197,211, 79, 63,189,121,213,170, 85, 13, 71,143, 30,157,118,236,216,177, 84, 0, 51, 43, 46, 20, - 19, 19,147,251,242,203, 47, 39,175, 89,179,166,177, 36, 73,187, 55,108,216,208, 15,192,101, 90,122, 40,247,204,121, 57, 16,200, -168,205,178,119, 19, 89, 53, 23,157,215,242,242,242, 34,167, 77,155,246,185,191,191,127,112,116,116,244,245,230,205,155, 23,219, -230,231,230,230,234, 14, 29, 58, 20, 86, 88, 88, 88, 36, 8,194, 40, 0,231, 42,145,105,137,242, 99,101, 36, 75,146,244,121,155, - 54,109,158,253,241,199, 31, 15,185,186,186, 22,158, 56,113,194,205,205,205,173,224,210,165, 75, 46, 28,199, 25,174, 94,189,138, -189,123,247,246, 0,240, 85, 21, 79, 73,229, 52, 51, 51, 51,207, 40,149,202, 47, 38, 77,154, 52,233,195, 15, 63, 84, 75,146, 4, -163,209,136,162,162, 34,152, 76,166,178,198,201, 27, 55,110, 52,155,205,230, 21, 25, 25, 25, 39, 28,208, 60,206,113,220,242, 69, - 95, 46, 26,255,198,179, 35,148, 36, 63, 23, 5,153, 70, 48,166, 98,232,212, 74,180,232, 29,128,226, 92, 6,171, 14,157,182,220, -178, 88, 55,101,100,100, 28,172, 73,243, 88,170,254,247, 78,202,196,189, 31,207,138,126,108,250,234, 95, 33, 73, 18,254,122,243, - 69,228, 29,222, 11,109,243, 86,120,228,175,108, 88, 44, 22, 76,155, 50, 9,156, 33,235,200,201,212,226,159, 29,216,159,117,129, -189,230,113,252,253,238, 50, 1,192,248,115,231,206,141,138,136,136,192,184,113,227,240,212, 83, 79,149, 91,113,243,230,205, 88, -182,108, 25,204,102,243, 40, 0,177, 0,150, 58,163,217,176, 97,195,142, 45, 90,180,224,252,253,253, 13,165,102,163,247,197,139, - 23, 59, 68, 68, 68,212,164, 89,231,121, 39,132,228, 37, 38, 38,186,205,155, 55,143,177, 90,173,152, 57,115, 38,108,198,210, 22, -113,122,255,253,247,253, 93, 93, 93, 49,127,254,124, 75, 78, 78, 78,159,220,220,220,125,139, 23, 47,246,218,184,113,227,115,118, - 6,203, 94,243,102, 92, 92,156,235,242,229,203, 89, 65, 16,176, 96,193,130,219, 34, 90,239,188,243, 14,172, 86, 30,114,153,220, - 98, 54,153, 91,104, 52,154, 43,158,158,158, 26, 73,146,200, 61, 60,238, 15,181,230,249,243,231,247,160,164,106,174, 82,108,237, -232,140, 70, 35,114,114,114,144,147,147, 3,119,119,247,138, 79,219,229, 52,141, 70,227,217, 41, 83,166,196,124,243,205, 55,253, -254,252,243,207, 17,135, 15, 31, 30,176,119,239, 94, 83,114,114,178,192,243, 60,241,243,243,147,117,235,214, 77, 61, 96,192, 0, - 23,149, 74,197,190,255,254,251, 57,159,126,250,169, 23,128,220,170, 52, 9, 33,156, 36, 73,248,111,247, 66, 76,233, 37,131,217, - 92,242, 64,153,145,145,142,139, 23, 47,226,248,241,120, 48, 12,195, 58,185, 63, 23,173, 95,191, 62, 76,169, 84, 50, 27, 54,108, - 8,222,176, 97,195,132,154,118,222,218,181,107, 67, 55,108,216,176, 20,192, 99, 40,105,248, 68,203, 18,213,164, 56, 99,176, 74, -185, 40, 8, 66,191,148,148,148,110,163, 71,143,254, 44, 34, 34,194, 44, 8,130,124,247,238,221,205,114,114,114,148,130, 32, 76, -129,243,245,149,203, 77, 38, 19,134, 12, 25, 50,165, 81,163, 70,251, 98, 99, 99, 91, 63,249,228,147,187, 55,111,222,220, 77, 16, -132,171, 23, 46, 92, 24, 5, 96, 81,169,193,114,136,164,164,164,153,123,247,238,101, 78,156, 56,241,238,180,105,211, 84,222,222, -222,140,135,135, 7,140, 70, 35, 82, 83, 83,201,154, 53,107,204,102,179,249, 43,119,119,247, 15, 28,213,244,246,246,158,122,248, -244,105,101,194,149,196, 87, 94,233,255,184, 58, 56,188, 41,116, 12,160,191,149,139, 67,135, 50,177,250,228, 89, 83,142,197,250, - 3,199,113, 14,119,165, 15,188,146,221,111,207,166, 85, 59, 15,238,223,255,216,236,185,159, 51,254, 47,188, 1,151,144,134,144, - 66,155,224,208,193,131,248,244,227,153,132,211,103, 29,230,175,100, 61,126, 31,203,132,205, 1,168, 0,204,147, 36, 73, 86,250, - 52,143,183,223,126, 27,246,175,206, 89,182,108, 25,140, 70, 35, 0,200, 24,134,153, 7,224, 59, 84, 61,162,123,101,154, 65,191, -255,254,123,144,189,102, 68, 68,132,163,154,117, 74, 86, 86,214, 7,175,189,246,218, 92,185, 92,238, 46, 73,210,109,141,211, 1, -192,197,197, 5,133,133,133, 16, 69, 81,168, 87,175, 94, 60,207,243,144,201,100, 85,158, 71,197,197,197, 31,140, 29, 59,246, 19, -134, 97,170,140,116,104, 52,154,228,163, 71,143, 54,121,254,249,231,217, 77,155, 54, 93,123,238,185,231, 84,127,254,249,167,136, - 90,142,105, 68,185,251, 16, 66, 80, 92, 92, 12, 84, 63, 36, 66,202,143, 63,254, 56, 37, 38, 38, 70, 61,118,236,216,118, 47,188, -240,130, 91,175, 94,189,116,246, 11, 24,141, 70,105,219,182,109,197,203,151, 47,207, 61,124,248,240,255, 94,125,245,213,161, 0, -170, 12, 23,103,100,100,252,190,100,201, 18,247,158, 61,123,134,139,162,136,156,156,156,178, 54, 88,105,105,105, 72, 78, 78, 78, -150, 36,105,171,147,217,121,243,249,231,159,223,177,102,205,154,144,209,163, 71,167,109,220,184,113, 43,128,202,218,212,234,134, - 13, 27, 54,120,205,154, 53, 33, 99,198,140, 73, 1, 48, 1,180, 85, 57,133, 82,167, 12,225, 56,238, 79, 0, 67,156,112,184, 85, - 17, 2,224, 19,148,212,155, 22,148, 58,225,217, 0, 26,213, 86,211,223,223,191, 85,120,120,248, 15, 77,155, 54,189, 30, 16, 16, -192, 55,109,218, 52, 57, 60, 60,124, 83,131, 6, 13,162,106,171,233,231,231,215, 53, 40, 40,104,119, 96, 96, 96, 78,112,128, 63, - 9, 12, 12,188, 21, 28, 28,188, 55, 32, 32,160,103,109, 53, 59, 5,233, 6,118,106, 26, 16,223, 46,178,137, 57,188, 81, 67, 18, -213,162,137,185,115,179,160,132,142,193, 46,195,238, 96,127,222,201, 83, 72,101,168, 0, 24, 72, 41, 12,195,240,109,218,180, 89, - 30, 21, 21,181, 52, 42, 42,106,105,235,214,173, 87, 48, 12,195,219,230, 3, 48,224,239, 65, 65,239,165,230,221,200,123,165,116, -235,214,109,237,134, 13, 27,196,217,179,103, 23,116,238,220, 57,119,246,236,217, 5, 27, 54,108, 16,187,117,235,182,182,182,154, -173, 91,183, 14,233,222,189,251,173,181,107,215, 10,151, 47, 95, 38,107,215,174, 21,186,119,239,126,171,194, 72,238,247, 61,239, - 15,163,230,240,225,195, 19,137, 29, 22,139,133,100,103,103,147,132,132, 4,114,228,200, 17,242,248,227,143, 39, 58,160, 41, 3, -208, 11,192,130,192,192,192, 61, 93,187,118,189,220,189,123,247, 43,141, 26, 53,250, 83,161, 80,172, 7,240, 50, 74,222,119,232, -135,146, 97, 73,124,171,211,244,243,243,235, 18, 17, 17, 49,187,109,219,182, 91, 59,119,238,124,172, 93,187,118,199,155, 54,109, -186,189, 97,195,134,115,253,252,252, 30,169,101,222,131, 71,140, 24,113, 81,175,215,139, 61,122,244,216, 86,217, 74, 81, 81, 81, -107,244,122,189,248,194, 11, 47, 36,160,228, 61,178,180, 44, 81,205,187,161, 73,121, 88, 11,138, 51,163, 56, 63, 32,121, 31, 95, -106,114, 12, 40,255,218,154,154,230,223,107,205,123,178, 63,155, 55,111,238,249,216, 99,143,189,185,117,235,214,119,175, 94,189, -250,238,214,173, 91,223,237,219,183,239,155,205,155, 55,247,188,147,116,182,110,221, 58,164, 91,183,110, 95,117,237,218, 53,173, - 91,183,110, 95, 85, 48, 87,244, 34,126,159, 52, 7, 13, 26,180,115,196,136, 17,137, 35, 71,142,188, 50,114,228,200,196,225,195, -135, 39, 14, 29, 58, 52,113,208,160, 65,137,253,250,245, 75,236,213,171,215,206, 7, 40,239,193, 29, 58,116,248,193,213,213,245, -133,202,102, 42, 20,138,193, 93,186,116,249, 25, 64, 99, 90,150,168, 38, 53, 88,212, 96, 81,205,186,209, 84,161,250,215,213, 84, - 54,255,126,104,210,227, 78, 53,169, 38,213,164,154,212, 96,253, 99,144,209, 93, 64,169, 1,243, 29,206,191, 87,154, 20, 10,133, - 66,161,252, 99, 96,170,113,161,206,244, 14,168,141,147,189, 64, 53,169, 38,213,164,154, 84,147,106, 82,205,135, 78,179,162,246, -211, 21,166, 87, 28, 7,114, 5,181,107,117,115, 96,168, 38,213,164,154, 84,147,106, 82, 77,170,249,240,105, 86,198,232,127,171, - 1,162, 47,148,165, 80, 40, 20, 10,133, 66,161, 6,139, 66,161, 80, 40, 20, 10,229,159,141, 67,141,220, 21, 10, 69, 36, 33,228, - 85,134, 97, 26, 48, 12,115,131, 16,242,157,213,106,189,248,176,237, 44,133, 66, 17,201, 48,204,171,132,144, 6,132,144, 27, 12, -195,220,215,253, 64, 0,102,102,116,201,104,210, 31, 69,131, 48,213, 15,124, 72,161, 80, 40, 20, 10,229,126, 27,172,144,192,192, - 17, 44,199, 44,182,242,162, 39, 47, 8,236,146, 37, 75,216, 65,131, 6, 97,219,182,109,152,240,246,219, 19, 88,142,149, 20, 50, - 89, 30,145,132, 9,201,105,153, 63, 58,178,177,161, 67,135,102,241, 60, 95,229,168,214, 28,199,221,220,178,101,139,239,157,102, -202, 63,234,153, 44,222,106,173,114, 59, 50,153,252,102,230,217,159, 29,218, 78, 96,160,223, 8,142, 97, 23,243,162,228, 41,138, - 18,251,213, 87, 95,149,237,135,183,222,122,107,130, 92, 38,147, 20,114, 46, 79, 18,201,132,228,180,180, 31,239,213,129,179, 55, - 87, 0, 48, 51, 26, 12,137, 6,168,201,162, 80, 40, 20, 10,229, 31,108,176, 24, 22, 75, 55,124, 51,207, 51,247, 86, 30, 54,110, -222,141,136,136, 8, 92,186,116, 9, 17, 17, 17,232,214,177, 53,251, 68,151, 54, 44,199,194,123,198, 87,235,150, 2,112,200, 88, -240, 60,239,243,219,111,191,129, 97, 24,136,162, 8, 65, 16, 32, 8, 2,120,158, 71, 81, 81, 17, 38, 78,156,232, 83, 23,153,226, -173, 86,159,171,255,251, 21,114,142, 1, 47, 18,240, 2, 1, 47, 72,176,138, 4,133, 6, 1,189,159,124,222,225,237,176, 96,151, -126,183,120,158,103,126, 65, 1,126,221,177,167,220,126,232,221,181, 3,251,204,128, 71, 89,173, 70,225, 61,122,234,103, 14,239, -135,186,192,222, 92,149,155, 22, 77, 13, 22,133, 66,161, 80, 40,255, 88,131,101,225, 69, 79,223,122,238, 88,253,221,119,152, 50, -237, 99, 52,107,214, 12,132, 16, 48, 12,131,247, 62,156,133,133, 31, 79,195,200,254, 61,192, 11,146,103, 53,250,183,117,213,100, - 24, 6,215,175, 95,135,209,104, 44,247,137,140,140,116, 52,205, 14,117,255,148,115, 12,126,143, 45,130,149,151, 96, 21, 74, 63, -188,132, 94, 45, 93,157,210,228, 69,201,211,195, 77,135,149,223, 44,195,148, 89,243,202,237,135,169,239,125,136,175,231,126,128, -119,198,189, 4, 11, 47,122,214, 38,157, 78, 66, 53,169, 38,213,164,154, 84,147,106, 62,168,154, 15,164,193,234, 9,224,160,205, - 3,149,153, 11,139, 9, 45,130,234, 99,217,252, 79, 64,192, 66, 34, 4, 32, 0,145,120, 52,244,210,194,104, 48, 56,189, 65, 73, -146, 96,181, 90,193,243, 60, 86,172, 88, 1,189, 94, 15, 73,146, 16, 17, 17, 1, 0,136,138,138,178,143,192,164,196,198,198,134, -212,164,233,221,114, 72, 50, 8,130,237,167,125, 52,239, 91, 28,139,189, 10, 66, 0,149, 70,139,225, 47,140,129, 40, 17, 88,121, -231,223, 79,106, 50, 24,224,167,147, 99,225,167, 31,130,149, 43,192,130, 1,203, 50, 96, 25, 9,205, 2, 61, 97, 46,121, 57,241, - 61,229,163,104,144,138, 81,172,143,162, 65,162,105,153,166, 80, 40, 20,202,191,147, 74,189,200,191,221, 96, 29,172, 44, 51, 22, -147, 17,129,158, 10, 52,208,185, 67, 16, 68, 92,180,250,161,200, 96,130,213,202, 35,217,106,197,149, 51,153,120,228,145, 71,192, -243,188,104,181, 90,161, 80, 40, 10,182,108,217, 82,175, 38,131,197,243, 60,172, 86, 43,138,139,139,177,126,253,122,200,100, 50, - 72, 82,137,241, 41,121,199,111,201,119,215,174, 93,131, 29,202, 5, 65,240,149, 83,191,192, 85,205, 65,144, 8, 4,129,128, 23, - 1, 81, 34, 48, 88, 36, 12,123,237, 3, 8,146, 4, 65,146, 96,113,192, 96,217, 27, 54, 1,192,144,233, 27, 1,232,202,230,187, -169, 8,166,116,101,161, 80,170,160, 84,112, 48, 27, 13,247,252,192, 49, 0, 33,209,127, 87, 21,210, 70,238, 20, 10,133, 66,249, -151,115,240, 65, 48, 86, 21, 13,150,189,123, 60,244,183,193, 50, 64,224, 69,240,130, 8,129, 23, 80,160, 55,226,243,207, 63,135, - 74,165, 2,195, 48,101,102, 73,146, 36,150,231,121, 12, 24, 48,192,179,166, 13,138,162, 8,171,213, 10,171,213, 10, 66, 8, 56, -142, 67,167, 78,157,110, 91,238,196,137, 19, 78,101,196, 85,205,161,225, 99,211,111,155,126,242,151, 79, 64, 8,129, 40,150,124, - 28, 49, 88, 53, 25,182,182, 61,159,129,217,194,131, 16, 0,164, 36,194,117, 63, 96, 0, 98,107,115, 21, 77, 79, 76, 10,133, 66, -161, 60, 24,148,243, 34, 15,138,193, 42,231, 30,205, 70, 35,120, 94,128, 32,136,224,249, 18, 99,164,209,104,208,163, 71,143, 18, - 31, 98, 23,109,218,189,123, 55,172, 86,107,141, 27,180, 53,106, 47, 53,102, 32,132, 96,227,198,141,144,203,229,101, 31,133, 66, -225,116, 70, 4,145, 96,250,212,255, 66, 33, 99, 33,151,177,101,223, 34, 33, 32,164,196, 28,137, 18,129,153,119, 44,200, 83,157, - 97, 3, 0,139,217, 10, 16, 2, 2, 2, 99,113, 49, 61, 29, 40, 20, 10,133, 66,169, 27, 30,136, 72,150,205, 96, 61,138, 74,170, -151, 44,198,226,210,232,149, 8, 94, 16,202, 12,212,252,249,243, 33,147,201,160, 84, 42, 33,147,201,202, 12,145, 35, 6,203,100, - 50, 33, 44, 44, 12, 22,139, 5, 17, 17, 17, 32,132,224,217,103,159,189,109,185, 83,167, 78, 57,149, 17, 94, 36,152,243,217,130, -219,166, 31,253,233, 99,180,106,222, 16, 29,155,184,192,100,149, 80,104, 16,238,216,176, 1, 40,137, 96, 1, 32, 4, 48, 22, 27, -232,233, 64,161, 80, 40, 20,202,157, 81,169, 23,249,183, 27,172, 67,149,185, 69,147,193, 0,129, 23,202, 76,150,197, 98,129, 36, - 73,120,251,237,183,111, 19,218,183,111, 31, 44, 22, 75,245, 27,147,201,110,190,241,198, 27,229,134, 72, 32,132,224,151, 95,126, -129, 74,165, 42, 23,197, 98, 24,231,204, 43, 47, 18, 68,191, 63, 9, 74, 57, 87,206, 16, 73, 18,176,237,247, 63,176,237,247, 63, -202,150,229, 56,249,205, 59, 49,108, 0, 96,177,148, 70,176, 8, 65,177,190,136,158, 22, 20, 10,133, 66,161,220, 25,149,122,145, -127,187,193,170, 20,147,177, 24,188, 93, 27, 44,171,213, 10, 65, 16,176, 98,197,138,114,213,121,114,185, 28, 44,203,214, 24,193, -218,188,121,115,185,193, 61,163,162,162, 8, 33, 4,195,135, 15, 47,171,110,124,229,149, 87, 48,122,244,104,167, 13,150, 32, 18, -204,156, 61,191, 76,103,192, 99,221, 49,164,127, 79, 72,165, 94, 56,251,226, 22,167, 4,171, 51,108, 0, 96, 49,151,180,193, 34, - 0, 12, 69,180,138,144, 66,161, 80, 40, 20,138, 3, 6, 75, 46, 99, 11,174, 36,223,112,247,114, 81, 67,144,204, 16,164,146,158, -127,162, 40, 98,244,232,191, 95,110,253,220,115,207, 97,212,168, 81, 85, 25,172,150,168, 97,172, 12, 73,146,112,244,232, 81, 48, - 12, 3,150,101,203, 62,213, 80,169,102,177, 89,194,177, 31,103, 65, 34, 4, 18, 1, 36, 82,226,167, 44,130, 67,209,198,219, 52, -107, 50,108, 42,157, 7, 56,150,128, 97,128, 43,105, 89,144,113,108,129,179,121,175, 5, 84,147,106, 82, 77,170, 73, 53,169,230, -131,170,249,112, 24, 44, 34,146, 9,203,183,159, 88,204,139,146,187,109, 90,139, 22, 45, 96,181, 90,177,107,215,174, 50,227,193, -113, 92, 89,149,158, 35,109,176, 42,144,210,163, 71,143,234,134, 98, 72,113, 72,133, 65, 74,251, 94, 35,130,171,155,239,108,194, -106, 50,108,171, 14,255,253, 10, 66, 25,203, 22,128,144, 9,180, 56, 81, 40, 20, 10,133, 66,169,214, 96,165,102,100,172, 3,176, -206,126, 90,155, 54,109,244,131, 7, 15,214, 8,130, 0,139,197, 2,171,213, 10,139,197, 82,246, 81,169, 84, 78,141,184,233,200, - 32,162,142,144,125, 97, 75, 72,157,238, 21, 7, 12, 91,102,102,102, 8, 45, 62, 20, 10,133, 66,161, 80,156, 50, 88,149, 97, 48, - 24, 60, 24,134,145,101,100,100,220, 54,239,198,141, 27, 64,201,184,156,255,122,234,220,176, 81, 40, 20, 10,133, 66,161, 6,171, - 42, 14, 29, 58, 36, 60, 40, 38,138, 66,161, 80, 40, 20, 10,229,110,193,210, 93, 64,161, 80, 40, 20, 10,133, 82,183, 48, 40,233, - 9, 80, 25,206,244, 14,104, 89,139,109, 95,160,154, 84,147,106, 82, 77,170, 73, 53,169,230, 67,167, 89,147,182,253,250,163, 1, -172,160,118,173,110, 14, 12,213,164,154, 84,147,106, 82, 77,170, 73, 53, 31, 62,205,202, 24,253,111, 53, 64,180,138,208, 25,162, - 70,203,233, 78,160, 80, 40, 20, 10,133, 82, 19,178,123,181,161,232,232,104,246, 14,215,151,238,219, 94, 10, 24,214,152,147,225, -243,214,193, 1,253,207,228, 14,221, 65, 68,102, 42,210,127,189, 66,139, 79,237,104,227, 2, 47,158,145, 15,244,212,169,135, 4, -187,202, 58, 39,230, 24,254, 52, 88,165,109,132,225,183,196, 21, 33,143,238, 33, 10,133, 82,233,165, 56, 32,192,243,216,177, 99, -193, 93,187,118, 77, 73, 79, 79,207,115,116, 94, 85,248,134,181, 27,229,170,211,190,105, 50,155, 27,186,187,185,221,188,149,155, -187, 60,243,218,153, 37,182,249, 13, 27, 54,116,219,176, 97,131,255,115,207, 61,151,113,253,250,245, 66,122, 4, 40,247,212, 96, -181,111,223,190,161, 36, 73, 47, 1,120,129, 16,114,246,204,153, 51, 79,215, 70,103,223,190,125, 1, 60,207,119, 16, 4, 33, 10, - 64,148, 70,171,107, 99, 54,155,110, 50, 32, 47,247,239,223,255,140,179,122, 81, 81, 81,191, 3, 24, 80,217, 60,134, 97,102,198, -196,196, 68, 59,170,197,201,240,249, 31, 91, 86, 13,201, 52,104,112, 40, 38,249,169,239,190,152, 6, 0, 67,255,137, 7,212,207, -207, 79, 3,224,101,150,101,251,168, 84,170,112,147,201,148, 4,224, 60,195, 48, 75,211,211,211, 51,106, 41,203, 70,234,228,175, -105, 53,218,126,126,174,202,168,244,188,194,116,147, 85, 58, 34, 49,214,121,206, 26,162, 70,128,210,167,158,199,161,119,135,117, -139,104,221,162, 9,164,228,179, 48,229,103, 15,142, 73, 55, 12,254,230,228,205,255, 90,138, 12, 81, 87, 1,139, 35, 90,129,129, -129,126,162, 40,202, 50, 51, 51, 83,109, 23, 67,179,217,220, 30, 64, 4,128,191, 84, 42,213,233, 59,189, 40,254, 91, 52, 3, 2, - 2,252, 37, 73,122,221,215,215,247,201,172,172,172,223, 89,150, 93,117, 7,199,155,242,144, 16,210,233,197, 5, 12,203,120, 57, -179, 14,145, 72, 78,242,201,117,255,189,151,233, 36,164,100,164,231,128,128,128, 87,130,131,131,155, 16, 66, 18, 8, 33, 95, 86, - 56, 7,110,155,199, 48, 76,149,175,242, 8,105,209,101,243, 27, 47, 61,215,123,226,184, 87,116, 90,173, 6, 6,163,169,254,210, -149,223,127,177,116,229,250, 1, 73,151,142,245, 7, 0,127,127,255,161, 65, 65, 65,161, 22,139,229, 58, 33,228,251,154, 52, 41, -148, 59, 54, 88,205,155, 55,119, 81, 42,149,195, 89,150,125,185, 85, 84,231,110,131,159,121,153,225, 25, 45, 62,157,244,156,211, - 67, 56,196,198,198,170, 50, 51, 51, 63,110,216,172,221,127, 30,237, 59,132,109, 30,209, 12, 94,245, 61, 33,177, 74,172,217,117, -185,254,193,111, 94, 89, 2,160, 75, 45,146, 57,224,199, 29, 39,145,153, 47,130, 97, 0,134, 1, 88, 6,208,155, 36,188,247,106, -183,143, 0, 56,102,176,162, 70,203, 35, 26,248,244,191,124, 75,141, 93, 23,120, 0,254,208,122,250,246, 55,120,143,150, 35,118, - 5,255, 79, 58,152, 13, 26, 52,136,170, 87,175,222,215,175,188,242,138,103,120,120,184,159, 82,169,212,154, 76,166, 38,201,201, -201, 13, 23, 46, 92,248,120,131, 6, 13,230,222,184,113,227, 87,103, 52,155,185,171,130, 67, 27,248,254, 56,117,220, 75, 29,195, -195,130, 32,179, 20,131,152,245, 65,201,215,175,118,153,189,234,215, 55, 24,198,244,236,165, 66, 97,175,163,122,106, 87,197,251, -239,141,126, 54,162,177, 43,129,229,210, 81,200, 56, 2,181,171, 39, 58, 6,115, 96, 64,154, 71,239,207,120, 15, 69,214,143, 28, - 48,146,179, 68, 81,124, 15, 0,211,160, 65,131, 31,229,114,249,169,246,237,219, 55, 27, 57,114, 36,211,170, 85, 43,156, 57,115, -166,249,182,109,219,158, 22, 4, 33,222, 98,177,156,172, 95,191,254,217,184,184, 56,171,131,229, 91,145,155,155,219, 70,169, 84, -118,250, 39,107,250,249,249,105, 44, 22,203, 75,129,129,129,163, 31,121,228,145, 86,131, 6, 13, 98,154, 54,109,138,248,248,248, -118, 59,119,238,252,232,200,145, 35,231,211,210,210, 86, 40,149,202,239, 51, 51, 51, 29, 26, 4,120,120, 31,196,255,188, 15,205, -106, 59,191, 2, 30, 0,212, 0, 50, 29, 9, 38, 0,208, 2,184,118, 31, 52,239, 70,164, 37,142, 97,152,122,165, 55,100,219,131, - 93,185,223,246,223,162, 40, 22,167,164,164, 52,170, 78, 51, 40, 40,168,185, 36, 73,156,253, 52,185,188,234, 86, 11,130, 32, 72, -105,105,105,151,170,211,100, 88,198,107,197,215, 11,220,101, 44, 32,146,210, 15, 79, 32, 18, 2, 73, 2, 68, 9, 16, 37, 9,130, - 72, 32, 4,150,212,198, 0, 0, 32, 0, 73, 68, 65, 84, 17, 9,188, 64, 48,243,163,247,238,231,101,238, 73, 0, 61, 0, 28, 6, -176,168,154,121, 95, 86, 39,226,221,168,205,139, 47, 61, 59,188,215,123,147,222,212, 17, 66, 64, 8,129, 70,173,194,228,137, 99, -149, 38,147,165,171, 95,147,246,163, 51, 19, 79,175,100, 24,166, 23,128,246, 0, 78, 3,248,158, 90, 6,202,221, 50, 88, 76,187, -118,237,122, 16, 66, 94,110,224, 31, 56,124,216,243, 99, 52,161, 77, 90, 66, 47,185,225,122,142,132,216, 3, 27, 0, 96,147, 51, - 27,223,189,123,119,123, 66,176,122,220,180, 5,205, 90,183,237,128, 11,233, 2,142,165,138, 40,190, 34, 66,198, 25, 33, 73, 0, - 33,196, 92,219,204,165,229, 9, 56, 18,111, 1,199, 2, 44, 11,112, 44, 3,206,217,247,116,199,174,224, 47, 5, 15,221,241,199, -169,244,167,160,246,133, 33, 47, 29,134,188,172,157, 72,219,252,143, 50, 87,254,254,254,189, 67, 67, 67,191,156, 56,113, 98,131, -204,204,204,122, 39, 79,158,132, 74,165,130,167,167,167,204,203,203,171,217,180,105,211, 10,102,207,158, 61,217,199,199,231,204, -205,155, 55,147, 28, 50, 5, 46,138,136,238,173, 34,254,156, 49, 43,218,221, 28,179, 19,249, 63,255, 12,142,149,160,112,209,193, - 79,163,197,162, 39, 67,235, 77,219,157,250, 43,107,181, 68, 92, 48,153,210, 29,209, 12,242,169,215,183,113,120, 83,228,111, 95, -138,196,124, 51,142,103,153, 49,184,103,123, 52,246,212,160,173, 32,162,190, 90,214,187, 38,131, 21, 16, 16,224, 41, 73,210,212, -164,164, 36, 86,161, 80, 48, 13, 27, 54,124,118,197,138, 21,164,121,243,230,101,111,221,238,210,165, 11,186,116,233,194,232,245, -250,136, 99,199,142, 69,108,222,188,153, 47, 40, 40,136,201,200,200, 88, 83,117,100, 41, 44,197,108, 54, 5,153,204, 22,211,194, -133, 11,127,232,220,185,179,164, 84, 42,113, 39,154,165,198,119,189, 86,171,213,206,152, 49, 35,167, 67,135, 14,164, 46, 52, 67, - 67, 67,255,232,216,177, 99,175,190,125,251,202,186,118,237, 10,127,127,255,178,121, 94, 94, 94,232,222,189, 59,147,154,154,218, -250,200,145, 35, 75,255,248,227,143,197,103,206,156, 57,144,148,148,212,215,129, 67,212,244, 14,231,151, 11,254, 2,152, 3, 96, - 37,128, 99,213, 61,198, 0,120, 14,192,231,247, 73,179,250,135, 2,181, 58,203,100, 50,249,148,254,190,105, 50,153,124,107,188, - 88, 50,140,110,225,194,133, 62, 10,133, 2, 44,203, 66, 20, 69,136,162, 8, 73,146, 64, 8, 41,251,182,189,114,108,214,172, 89, - 98, 77,154,146, 36,177, 11, 22, 44,144,107, 52, 26, 0, 0,207,243,229,190,109,216,254,207,154, 53,203,161,107,148, 70,201,225, -195, 73,163, 59,178,162, 69, 93,237,246, 57,165,233,181,201, 95,158,186, 15,102,213, 51, 32, 32,224, 37, 0,131, 0,216,206,241, - 86, 1, 1, 1,251, 43, 44,218,170,244,187, 56, 32, 32,224, 0,128,223, 3, 2, 2, 86, 87, 86, 93,232,238,226, 58,246,221,183, - 95,119, 37,132, 96,230,207, 57,152,249, 75, 14, 62, 28, 90, 15,147, 7,104,241,234, 11, 79,187,172, 94,247,211,152,210, 50,102, - 35, 1, 37,189,238,105,244,138, 82,247, 6,171,109,219,182, 59,250, 15, 29,213,175,115,143,190, 16, 20, 62,136,191,201, 32,245, - 58,129,140, 19,192, 66,194,181,255,109, 33, 44,203, 86,116,248, 85,118,213,220,177, 99,199,127,131, 27,183,153,251, 94,244, 28, -238, 66,150, 18,171,143, 24, 33,154, 11, 96,204,185,130,226,155,151, 81,116, 35, 14,249,233, 23,206,179, 44, 27,237,168,230,237, - 97,101, 64, 34, 4, 12, 97, 0, 9, 37,231, 6, 91,169,195,170, 86,147,136,204,212,152, 63, 86, 63,213,118,200,116, 92, 62,178, - 14, 32,236, 84, 7, 54,127, 55, 94,130,121,161,138, 72,198,227, 33, 33, 33,243,198,140, 25, 19,120,238,220, 57, 55,131,193, 80, -124,234,212,169, 67,153,153,153,190, 94, 94, 94,169, 35, 71,142,124,196,199,199,199,167, 71,143, 30,218,221,187,119,191, 15,224, -245,154, 52, 35,181,138,200,174, 29, 90, 30,255,100,222,124,151,156, 95, 23,195,114,253, 28,142,103,153,112, 46,219, 72, 2,220, - 10,152, 17, 45, 61,225,162,148, 97,116, 39, 31,221,127,182, 37,125, 6, 19,158,119, 36,239, 13, 3,124, 27,241, 70, 35, 76, 70, - 43,118, 92, 46, 48, 30,207, 43,240, 97, 93,211,178, 39, 63,213, 94,205,229,100,160,129,171,188, 9,110, 58,183, 63, 25,134,129, - 86,171,173,116,158,187,187, 59,186,116,233,130, 70,141, 26,201,159,123,238,185,206, 0,214, 84,165,105,181, 90,253,210,211, 51, - 16,222, 52, 92,213,167, 79, 31,134,227, 56, 88, 44,150, 59,210, 4, 0, 23, 23,151, 65, 81, 81, 81,178,181,107,215,230, 39, 37, - 37, 93, 28, 54,108, 88,186, 86,171, 45,119, 67,213,106,181, 8, 14, 14,198,248,241,227,229,111,188,241, 70,141,154,190,190,190, -143,175, 91,183, 14, 12,195,148,221,188, 43, 18, 18, 18,130, 6, 13, 26, 96,192,128, 1,178,167,159,126,250,241,164,164,164, 42, -247,231,240, 62,136,183,153,167,225,125,170,191,137,148,206, 79,168, 36,146, 85, 49,157,185, 0,150, 3,248, 13,192,240, 42, 12, - 81, 87, 0, 63, 3,232, 15, 84,122,228,171,212, 84, 40, 20, 10,171,213,234, 89,137,241,113, 86,179,236, 84,143,137,137, 65,187, -118,237, 80,241,219,102,132, 24,134,241,113,244,220,228, 56, 14,203,150, 45, 3,203,178, 80, 40, 20,144,203,229, 80, 40, 20,183, -125,218,182,109,235,240,249, 46,151,203,177,108,217, 50,136,162,200, 38, 37, 37,189, 44,138,226, 16,147,201,228,163,209,104,178, - 21, 10,197,246,158, 61,123,126,167, 82,169, 4,103, 52, 89, 14, 96, 69,139,122,239,238,173, 46, 85,173,100, 54,155, 49,112,200, - 8,176, 12,123,207,175,117,199,142, 29, 11, 14, 14, 14,110, 90, 26,157, 2,128,195,233,233,233, 61,236,254,219,115, 56, 61, 61, -221,214, 52, 36, 49, 37, 37, 37, 56, 36, 36, 36,175,162,166,197, 98,109,168,211,185,128, 16,130,153,191,228,192,180, 54, 12,234, - 81,215,240,106, 39, 51, 92, 93, 93, 33, 8, 66,179,128,128,128,239, 1,132,151, 70,175, 6, 7, 4, 4, 52, 37,132, 28,104,216, -176,225,111,118, 85,250,247,236, 58,255,144,104, 86,115, 63, 39, 29, 0,120,219, 77,178, 0,176, 61,173,230,148, 26,224,250, 21, -166,219, 47,103,251,206,182, 5, 50, 75,215, 35,118,186,217, 12,195,252,175,174, 13, 22,177,115,231, 85,197,120,220,210,140, 30, -208, 95,247,130,140,149, 32,227, 24,200, 56, 0, 96,144,155, 22, 7, 75,113,238,209,152,152,152,235,142,108,116,215,174, 93, 93, - 66,155,119,252, 44,250,147, 47,216,239, 14, 27, 81, 96, 48, 33,231,210, 86,100,158,250, 54, 83, 18,172, 91, 89,150, 61,205,178, -108,108, 84,235, 86,241,126,126,126, 98,109, 51, 39,145,146, 16,119,153,177,146, 0,166, 54, 15, 32,233,191, 94, 65,216,251,229, -255,255, 67, 8, 8, 8,232, 31, 22, 22, 54,103,204,152, 49, 33,177,177,177,174, 69, 69, 69,217,123,247,238,141,183, 90,173,103, - 88,150, 93,148,145,145,209,115,221,186,117,218, 41, 83,166,244,109,218,180,105,211, 63,254,248,195, 80, 99,228, 74, 43,111,253, -194,139, 35,142, 15, 25, 61, 65,125,241,151, 37, 80,197,199, 98,197,165, 60,241,116,150,241,125,147, 94,248, 82,163,149,117,205, - 55, 9,123,222,237,238,199,250,185,202, 17,228,174,120,244, 92,145, 99, 47,250, 86,202, 85, 50, 34, 83,195, 98, 22, 80,108,145, - 44,113, 57, 40,126, 92, 16,173,196,197, 75, 13, 0, 50,142,173,209,244,167,167,167,231,249,249,249,125, 22, 26, 26,250, 1,195, - 48,164, 71,143, 30,151,218,181,107, 87, 44, 73, 18,140, 70, 35,172, 86, 43,228,114, 57,140, 70, 35,146,147,147,113,242,228, 73, -184,187,187, 59,181, 95,243,243,243, 17, 26, 26, 10,173, 86,123,199,154,146, 36, 49, 75,151, 46, 85, 95,188,120, 81,253,219,111, -191,213,251,239,127,255, 91,208,182,109,219,184,167,158,122, 42,181, 94,189,122,214,179,103,207,226,248,241,227,200,203,203, 67, -199,142, 29, 29,210,180, 90,173,144,201,100, 48, 26,141, 80,169, 84,144,201,100, 16, 4, 1,146, 36,149,153, 46,189, 94,143, 91, -183,110, 65, 46,151,215,248, 34,118,155, 89, 26,222, 7,228,167,159,255,188, 89, 82, 55, 84,200,195, 90,192, 67, 40,224,193, 23, -240,224,243,249,103, 38,206,111,253,243, 62, 56, 19, 7, 62, 81,106,174,126,174,196,100,117,181,155,126,214, 89, 77,171,213,122, -212,102,124,212,106,181,143, 45,186,160, 82,169,120,179,217,220,203, 73, 77,196,196,196, 32, 42, 42,138, 43,213, 36,132, 16, 91, -123, 27,167, 47, 26, 12,195,128,227, 56,200,229,114,112, 28,135,168,168, 40, 12, 26, 52, 8, 77,155, 54, 69, 90, 90, 26, 14, 30, - 60,136,203,151, 47, 67,161, 80,148,171, 58,172, 9,185, 92, 14,150,101,217,132,132,132,239,250,244,233,211,120,194,132, 9,202, -224,224, 96,196,199,199, 55, 88,186,116,233,168,125,251,246,245, 28, 58,116,232, 40, 0, 66,117,213,135,229,140, 96,169,105, 50, -155,205,136,139,139,171,126, 89,167,171, 0,238,156,174, 93,187,166, 16, 66, 18, 81, 82,245,215, 42, 61, 61,189, 71, 64, 64,192, - 14, 0, 21, 13, 97,113,122,122,250,128,128,128,128, 2, 0,231, 1, 36, 48, 12,147, 82,153,166,135,187, 91,182, 94, 95,236,235, -226,162,197,251, 67, 60,160, 30,117, 13,111,247,226,192,243, 60,174, 94,189,142,134,161,129,204,166,213, 91,108, 85,131,237, 79, -159, 62, 13,148, 84, 21, 38,165,166,166,250,119,234,212,137, 54,120,191, 75, 62,170, 26, 47,226,205, 48,204,118, 59,195, 53,208, -246,127,218,180,105,239,205,153, 51,231, 34,195, 48,219,237,167,219, 47,103,255, 93,122,142,110, 39,132, 12,156, 62,125,122,228, -220,185,115,103,219,150,189, 47, 17, 44,142,227,134, 93,216,245,229,137, 38, 86, 18,226, 27,249,100,185,253,144,124,118, 23, 36, - 73, 90,227,136,206,241,227,199,213,130,132,239,166,188, 55,139,253,230,128, 17, 89, 55, 50,144,113,232,115, 24,111,198,173,214, -104, 52,239,246,233, 55,240,142, 11,110, 84, 84, 84,164, 71,253, 6, 48, 91, 73,169,193, 42,111,178, 30, 20,252,252,252, 6,133, -133,133,205,218,186,117,107,136,209,104,116, 61,118,236, 88,254,158, 61,123, 18,173, 86,235,170, 27, 55,110,172, 47, 93,108,171, - 76, 38,251,152, 16, 2,157, 78, 39,227, 56, 78, 83, 93,168, 59,210, 77, 30,245,210, 11, 47, 28,253,239,162,149,234,196, 11,103, -177,120,211, 14,168,136, 85,188,148,107,121,234,162, 94, 40, 41,180, 6, 97,127, 64,142, 49,157, 16, 4,201, 89, 6,245,180,242, - 6,157, 1,245, 9,192, 84, 83,154,189,130, 66, 88, 33, 32, 12, 71, 12,102,232,220, 20, 74, 0, 8, 8,111,193,157, 45, 20,112, -236,212, 95, 80,171, 61, 21,142,228, 61, 51, 51,115,134,191,191,127,232,158, 61,123, 88,131,193, 80,124,238,220, 57,212,175, 95, - 31, 62, 62, 62,112,115,115, 67,124,124, 60,246,238,221,139,132,132, 4, 16, 66,170,139, 18, 84, 74, 86, 86, 22, 10, 11, 11,235, - 68, 83, 16, 4, 6, 0, 34, 35, 35, 17, 25, 25,169, 76, 79, 79,247,217,190,125,187,231,236,217,179,111,248,249,249,237, 54, 26, -255,110, 30, 85,177,186,167,186,136, 2, 0,152, 76, 38,152,205,102, 40, 20, 10,168,213,106, 40, 20, 10, 20, 22, 22, 34, 43, 43, - 11, 69, 69, 69, 37, 55, 19, 15,143,178,229, 29, 66,148,128, 19,221, 78,223,238,230, 95,246,169,101, 81, 61, 86,106,162,246, 3, -176, 29,223, 44, 91, 64, 12,213, 87,245, 85,167, 89,110,127,216, 69,153,228,181,209,180, 69,170, 24,134, 41,119,149, 80,171,213, - 55,109,145,171,210, 72, 89,141, 90,182,106, 65,165, 82,137,200,200, 72,188,251,238,187,136,143,143,199,209,163, 71,225,227,227, -131, 39,158,120, 2, 50,153, 12,169,169,169, 96, 89,214, 33,131,165, 80, 40,192,243, 60, 18, 19, 19, 95,238,221,187,119,216,226, -197,139,149, 73, 73, 73,136,143,143,135,155,155, 27, 62,254,248, 99,213,212,169, 83, 3,119,239,222,253, 70,155, 54,109,150, 57, -124,109,103, 74,170,255, 6, 14, 25, 81,137, 17,113,145,175, 93,243,173,210,102,188,216,251, 48,176, 79,122,122,122, 30, 33,100, - 1,128,133,165,213,130, 61, 0,184,164,167,167,247,178,187, 9,147,210,106, 65, 0, 56,159,158,158,222, 27, 0,169,170, 65,122, -230,205,204,229,159, 47,250,102,225,204,247,222, 81, 78, 30,160,197,171,157,204, 16, 69, 17, 28,199, 97,241,242,213,252,229,184, - 11,231,218,183,111,191, 29,192,224,211,167, 79,163,125,251,246, 69, 0, 46, 3,184,174, 84, 42,105,231,145,251,233,192, 42,152, - 32,155,113,154, 51,103,206,192,202, 76, 85, 37, 15, 63,229,166,207,157, 59,119,182,221,255, 58,237,197, 46,171,224, 28,171,123, - 10,247,243,240, 14,168, 55,230,249, 39,176,249,156,237,133,132, 4, 86,179, 1, 55,226, 15, 24, 44, 22,203,207,142,108, 48, 55, - 55,247,227, 87,223,157,223,248,116,138, 12,153,121, 6,100,236,155, 69,172,249, 73,195, 7, 13, 26,180,185, 46, 50, 20, 21, 21, - 21,233,233,229,127,240,131,207, 86, 98,127,162, 5, 18, 1, 24,130,191,141,213, 3, 50,242,151,191,191,127, 19, 15, 15,143, 47, -182,108,217,226,163, 84, 42, 93,207,159, 63, 47, 30, 58,116, 40,131,231,249,165, 55,110,220,216,104,183,220, 11, 45, 91,182,228, - 93, 92, 92,144,153,153,105,226,121, 94, 95,213,177,110,161, 86, 7, 70,181,138, 56,252,223, 69, 43,213, 38,139, 5, 5, 70, 51, -188,253,252,196,163,231,227,158,138,211,139,101, 79, 4,205,117,178, 71,218,135, 7, 4,176, 26, 87,192, 80,136,244, 66, 75,134, - 35,230, 10, 0, 92, 92, 61,216,192,246,143,162,253,196,175,112, 41,250,125, 2,228,194,195,215,159,237, 53,254, 83,232,218, 13, -194,178, 9, 47, 75,127, 71,112,107,196, 24, 30, 30,142, 51,103,206,216,202, 22,114,115,115, 17, 22, 22,134,197,139, 23,151, 91, -208,145,155, 98, 21,229,245,142, 53, 37, 73, 98, 42, 68, 29, 49,110,220, 56,249,206,157, 59, 93,236,205,149, 51,154, 22,139,165, -204, 80, 16, 66, 96,177, 88, 96,177, 88,224,226,226,130,196,196,196,242,126, 73, 20, 43,173,234,172, 58,193, 5,149,135,187,248, -220, 59,105,119,120, 12,128,194,206, 4,249, 2,232, 86, 75,115,117,155,241,169, 11, 98, 98, 98, 42,189, 14,218,170, 30, 99, 98, - 98, 72,187,118,237,124, 29,213, 35,132, 64,169, 84, 98,240,224,193,248,235,175,191,144,145,145, 1, 87, 87, 87,152,205,102,152, -205,102, 68, 69, 69, 33, 43, 43,203,225,232,149,157,110,255,183,223,126, 91,125,253,250,117,220,186,117, 11,106,181, 26,130, 32, - 64, 20, 69,188,241,198, 27,234,241,227,199,247, 3,224,184,193,226, 24, 60,246,242,103,149,182,173,218,255,237,127,122,170, 84, -170,178,234, 22,142,253, 71, 93, 64,237, 31, 20,157,218,137,217,215, 47, 44, 91,183,241,183,199, 5,171,181,215,107, 47,141,112, -213,185,104,113,245, 90, 18,150,173, 90,203,239, 63,114,106,127, 86, 90, 98,127, 0, 76, 64, 64, 64,211,210,200,213,229,244,244, -244,151,170, 51,109,148, 58,141, 98, 85,100, 52, 74, 59,182, 84,101,156,156, 49,104,246, 17, 46, 27,211,167, 79,143,156, 51,103, - 78,157,182, 49,148, 85, 81, 88, 43,154,150,182, 30, 94, 1, 7,166,207, 94,169,251,237, 28,135,188,204, 4,152,110, 38, 32, 40, -106, 8,178, 18,142,129,136,252,175,113,113,113,197, 53,109,108,247,238,221,225, 65, 77,219, 79,108,211,174, 19, 62,255, 93, 15, -253,165,141,176,228, 93, 95, 54,112,224,192,186, 51, 87,245,253, 14,190, 55,119,101,189,109, 23,229,200,205, 72, 64,252,150,169, - 16,173,183,213,138,237,112, 70,183, 39, 32, 19, 60,173,120,188, 57,131,155,127, 26,144,217, 19, 50, 28,186,191, 47,189,206,200, -200, 72,244,240,240,248,126,229,202,149, 99, 91,183,110,173,157, 56,113,226,229,194,194,194, 79, 50, 51, 51,127,180, 51, 87,189, -195,194,194, 38,205,154, 53,171,113,114,114, 50, 14, 31, 62,156,200,113, 92,149,245,203,151, 76,166, 52,246,252,165,165, 71,127, - 88, 53,153, 13, 14,199,166, 89, 83,132, 63, 47,196, 13,142,211,139, 59,203,204,149,139, 34,162, 75,100,163,237,111, 78, 24,195, -138,103,119, 33, 62,249, 38, 50,245,252, 62,135,159, 70,139, 12,188, 92,165,129,174, 65, 40,146,141,146,194,223,223,255,100, 90, -190,241,255,236,157,119, 84, 20,215,223,198,159,153,237,187,176, 75, 93, 96,169,162, 2, 82, 5, 4,172,216,162,177,196, 22,147, - 88,163,198,196,104,138,198,168,137, 53,118,209, 24,141, 53,197,216, 73, 20,219, 27, 19,107,140,138, 88,176, 3,118, 68, 68,250, -210, 59, 44,108,155,251,254, 1,248, 67, 66, 89, 74, 98,202,124,206,217,179,187, 51,179,207,222,153,185,115,239, 51,223, 91,134, - 79,115,184,160,185,124, 36,228, 87, 52,169, 18,103,152, 63,134, 36,107,155, 22, 0,141, 54,145, 53,234,228, 90,160, 89, 29,193, -250,131, 95,209,106,169,230,106,214, 52, 88,181,205, 84, 93,199,168, 73, 6, 75, 83, 84,247, 57, 80,231,182,198,192,142,234,132, - 8, 90, 98,174,170,141, 79,117, 7,116,161, 80,248,220,168, 24, 26,101,170, 47,130,213,208,122,131,107,126,138, 2,195, 48,224, -241,120,112,113,113,193,213,171, 87, 33,147,201, 96,108,108, 12,137, 68, 2,161, 80, 8,153, 76, 6,129, 64, 0,154,166, 65, 27, -104, 92,180, 90, 45,212,106,181,141,189,189, 61,158, 60,121, 2,145, 72,244,252, 37, 16, 8,224,230,230,134,146,146,146, 38,153, -206,166,152, 38,206,191,104,106,234,164,135,145,175,219,184, 6, 77, 56,240,127,199, 63,172,168, 80,123,119,112,107,143, 71,247, -162,238,100,166,198, 15, 98, 61,206,223,198, 56, 87,243, 3, 42, 71,137,182, 74, 51, 94, 93, 38,107,205,154, 53, 33, 53,163, 96, -173,109,176,208,144,185,154,187,234, 7,217,161, 40, 26, 5,202, 88, 36,157, 94, 80,172,215,148,229, 51,140,214, 41,255,233,101, -224,197, 14,185, 13, 85,134,129,221,250, 14,167, 47, 60, 82, 67, 83,156,142,162,251, 7, 18,133, 66,225,188,214, 52, 87,243, 86, -111, 55,255,249, 14, 23,121,233,143,241,244,228,252, 66,189,166,172,111, 84, 84, 84,147,231,209,122, 31,224,253, 0,104,135,201, -229, 35,100, 66,122,237,228,145, 82,244,236, 39,134,140, 47,195,242,175,232, 71,165,221,152, 57, 89,145, 56, 6,127,240, 16,133, -151, 50,162,240,193,131, 7,171,182,111,223, 78,235,116,186,201, 26,141,102,169, 82,169,124, 30, 69, 84, 40, 20,253, 29, 29, 29, -215,174, 88,177,194, 62, 49, 49, 81,112,237,218,181,188,232,232,104, 70,175,215,175,105, 72,243, 94,145,250,243,143, 63,158,206, -105,239, 96, 59, 61, 62, 53,117,216,253, 98,253,233,234,117, 94, 18,190, 87, 55, 95,247, 43, 43,150,205,151,106,174, 29, 65,105, - 70, 42,182, 94,203, 40, 98,244,218,249, 6, 70,221,204, 47,159, 63,135,249, 83, 38, 49,197,197,197,144, 8,248, 76,106,236, 83, -206,132,126, 61,245, 95,206,157, 77,103,100,100,160,172,180,148, 99,107,107,107,158,158,158,158,103,136,102, 93,134,162,174,202, -181, 73, 6,163,238,202,188,217,154,181, 35, 88, 13, 25, 44, 67, 53,107, 54,137, 53,118, 60,244,122,125,211,154, 8,117,245, 24, - 44, 77,182,166,133, 89, 54,153,162, 40,199,234,207,173,113, 13,148,151,151, 91,213,136,138, 1, 0,213,220,104,101, 85, 4,171, -193,245, 77, 49, 89,213, 17,172,248,248,120,200,229,114,232,116, 58, 24, 25, 25, 65, 44, 22, 67, 44, 22, 67,165, 82, 65, 32, 16, -128,195,225, 52, 41,157, 66,161, 48, 35, 54, 54,214,201,204,204, 12,122,189,254, 5,147,245,236,217, 51,152,152,152,100, 25,218, -255,170, 50,130, 5,156,221, 51,183,206, 81,132,166, 38, 70, 47, 8,113, 40, 10,127, 35,106,246,211,105, 86, 84, 41, 35,238,198, -143, 0,126,180,179,179,219,187,111,199,137,128,128,128,128, 19, 45,213,100,249,147,221, 87,149, 49,170,217,151,106,222,188,121, -205,158, 59,100,222,188,121, 11,234,138,104,181,166,193,162,106,189,255,207, 92, 89,216,134,207, 89,177, 77,182,239, 22,141, 66, -229, 35,164,159, 93, 84,200,104,202,250,210, 52,173, 76,137,252,225, 48,128,178,168,168,168, 8, 3, 43, 67,255, 14,174,174, 56, -116, 95,135,242,140, 59,160, 41,178,167, 95,191,126,101, 45,221,137,106,115,245,121,200, 15,230,135,162,185,200,175, 52,129,133, - 76, 51,204,213, 88,129,160, 61,143,166,215, 58,248,186,191, 54, 58, 33,185,164, 79, 59,145,233,224,246, 66,112,174, 29,197, 49, -219, 44,228, 89,158,199, 7, 27,236,218, 71,254, 82,244,107,148,176, 52,207,215,199, 91,118,203,232,222, 9, 45,209,127,158,115, - 9,127,121,231,247,248,248,248, 21,214,214,214, 63,103,102,102, 62,239,157,106,103,103, 55,200,209,209, 49,100,249,242,229,109, - 82, 82, 82,164, 49, 49, 49, 69,135, 15, 31,126, 70,211,244,242,140,140,140,172,198, 52,239,151,104,103,147,100,229,142, 7,165, -250,216,231,145, 43, 9,175,227,132, 9,163,175,246, 27,243,142, 40,225,194, 94,152,167, 62,192,198, 27, 89,250,212,194,242,177, -177, 42,100, 24, 98,174, 4, 2,193,161,205, 71,142, 60,241,246,246,166,202,202,202,160,213,106,145,157,157,141,175,126, 58,116, -159, 97, 24,152,153,153,225,220,185,115,204, 39,159,124,114,200,214,214,246, 45, 67, 76, 22,195, 48,207, 43,171,250,162, 64, 98, -177,184,105, 6,163,234, 55, 53, 13, 76, 75, 52,235, 51, 88,181, 35, 91, 77,212,172,188,128,171, 58,183,215, 23,209,227,112, 56, - 96, 24,166,206, 72, 95,253, 97,146,130,122, 12, 86, 86, 75,111, 36,156,208,240, 64,154,151,134, 72, 36,202,172, 50, 79, 76,125, - 83, 49, 52, 53,130, 5, 0, 2,129, 0,145,145,145, 24, 56,112, 32, 24,134,129, 80, 40,132, 88, 44,134, 72, 36,194,141, 27, 55, -192,231,243,193,225,112,154,212, 76,200,227,241, 78,109,221,186,117,210,154, 53,107,196, 12,195, 64, 32, 16, 64, 44, 22, 67, 40, - 20,226,235,175,191, 86, 9, 4,130,211, 77, 50, 88,104,124, 20, 97, 77, 51,246, 87, 83,107,154,134,218, 83, 49,212,164,246, 20, - 14,245, 78,211, 96,107,107,107,110,111,111,255, 30, 33,196,179,106,209, 11,163, 5,107,108, 90, 93,176,184,218,217,217,237,173, - 99, 20, 33, 75,235, 71,175, 80, 79, 25,145, 93, 43,122,165,174,241, 61, 27, 0, 85,245, 61,187,134, 1,171,249, 89, 93,199,178, -220,213,171, 87,135,215,136, 92,101,183,230,206,212, 27,193,242,245,245,117, 55,181,176, 13,159,181, 98,155,108,239,117, 14, 10, -149, 15,145, 19,254, 69, 33,209,169,106,154,150, 30, 77,252, 63, 63, 43, 43, 11,228, 68,150, 67,155,255, 4, 20, 69, 69,181,116, - 7, 2, 3, 3, 93,164, 38,242, 11,115, 86,254, 96,190,255, 54, 23, 5,233,255, 51,129,205,137, 92,113,105,250,171,245,191, 29, - 24, 38,204,120, 4,213,157, 11,166,188,188, 84,220,207,210,224, 80,100, 70,241,133, 43,219, 47,211, 30, 36,184,239, 88, 83,227, -190, 99,205,177,241,131,211,230,153,229, 15,112, 61,238,248,240,144,249,199, 9, 94,210,236,238, 53,205,149, 66,161, 24,106,107, -107,187,236,196,137, 19, 78, 58,157, 78,122,241,226,197,226,195,135, 15, 63,213,233,116,155, 51, 50, 50, 78, 24, 28, 29, 43,213, - 60, 55, 87, 94, 50,158,255,228,137, 19, 47,127,178,225,123,209,131,219, 55,177,118,239, 9, 72,121, 90,253,237,244,242,183, 30, -148,254,175,249,176,193,227,202,229, 46,223,191,127,191,145,135,135, 7,149,155,155,251,188,194,215,104, 52, 40, 42, 42, 66, 97, - 97, 33,212,106, 53,188,189,189,233, 37, 75,150, 24, 45, 94,188,120, 57,128,143, 26,137, 16,100, 45, 91,182,204,234,253,247,223, -135, 76, 38, 67,110,110, 46,180, 90,237,243,104,147, 80, 40,132,169,169, 41, 10, 10, 10,112,246,236, 89, 16, 66, 26, 52,151,124, - 62, 95,105,103,103,235, 32,150, 24,169, 37, 18, 9, 49, 54, 54,110,177,102, 85,101,155, 49,120,240, 96,155,101,203,150, 9,106, - 86,210, 26,141,134,106,174, 38, 33,164,236,213, 87, 95,149,108,222,188, 25, 78, 78, 78, 80,171,213, 96, 24,230,121, 4,171,122, -106,128,228,228,100,172, 90,181, 10,132, 16,195,111,100,180,249, 90,216, 79,148, 67,147,171,133, 38, 87, 11,117,142, 22,154, 44, - 45,116,101,127,187, 33, 34,205,233,128,110, 64, 36,204,170,165, 17, 44,138,162, 64, 8, 1,159,207, 71, 74, 74, 10,206,157, 59, -135,160,160, 32, 72,165, 82,148,150,150,226,234,213,171,200,200,200,104, 86, 4,171,111,223,190,123,206,156, 57, 19,252,241,199, - 31, 59, 79,155, 54, 77,236,238,238,142,196,196, 68,108,216,176,161,252,225,195,135,105, 51,102,204,216,222, 20, 61,186,106,234, - 26,131, 70, 17,210,127,189, 55,174,103,154,134,193,245,108, 94,115, 10,135,218,211, 52, 60,231,232,209,163,206,118,118,118,238, -168,236, 95, 5,252,113,180, 96, 77,110,221,186,117, 43, 0,236, 40,194,151, 29,185,186,249, 79, 75, 51,183,254,139,142,254,180, -243, 27, 11,101,123,174,113,145,159,118, 31,133,151,150,212, 54, 87,134,224,141, 26,115,101,240, 68, 82,111, 29,225, 3, 40,135, -174,224, 41, 4, 2, 65,116, 51,210,252,130, 38,195, 48,179,187,188,177,208, 60,244, 38, 23,133,233, 15,145,125, 97,113,115,204, -149, 55,128,123,239, 3, 60, 7, 63,207,215,132,153,143, 81,126, 33, 12, 20,128, 29,209,165,184,154,170,254, 90,163, 86,175,124, - 88,164, 46,176, 19,195, 44, 44, 36,107,241,160,215,125, 62,113, 27,125, 22,215,179,191, 3, 36,128,153,156, 59, 40,203, 95, 87, -179,185,240,133,116,182, 18, 13,106,218,218,218,186, 24, 27, 27,127,117,234,212, 41,185, 64, 32,144, 61,120,240, 64,127,228,200, -145, 20,189, 94,191,190,102,199,247,166,104,122,138, 68,246, 30,109, 29, 34,102,172,255, 86, 84, 92, 82,138, 82,181, 6,182,142, -118,250,136,219,143,222,120, 80,170,249,197, 16, 77, 43, 43,171, 62, 35, 71,142,236,216,169, 83, 39,186, 62,115, 85, 84, 84,132, -146,146, 18,164,166,166, 34, 56, 56,152,118,119,119,247,174,168,168,232,147,149,149, 21, 94, 95, 58,149, 74,229,210,176,176,176, -238, 7, 15, 30, 28, 50,101,202, 20,233,200,145, 35, 33, 22,139, 81, 90, 90, 10, 7, 7, 7, 48, 12,131, 75,151, 46, 33, 46, 46, -174, 24,192,113,165, 82,121,165,161,116, 62,123,150,224, 8,128,182,183,183,239, 62,112,224,192, 86,209, 4,128,236,236,236,246, - 17, 17, 17,115,135, 15, 31, 62,115,192,128, 1,210, 5, 11, 22,240,157,157,157,161,215,235,169,230,106,230,231,231,155, 68, 69, - 69,173,235,209,163,199, 71, 3, 7, 14,228,134,132,132,192,196,196, 4,122,189, 30, 98,177, 24, 69, 69, 69, 88,190,124, 57, 46, - 95,190,172, 35,132,124, 83, 88, 88, 56,167, 33,205,154,243, 96,189, 53,227,107,223,134, 50, 97, 3,243, 96,253,229,121,190, 42, -210, 68,208,180,166,193, 70,211, 89,213,161,253, 15,243, 97, 25,170, 89, 61,245,130, 64, 32, 0,151,203, 69,118,118, 54,206,156, - 57,243,194,252, 87, 2,129,224,249, 52, 14,245, 68,176,234, 76,167, 84, 42,101,222,124,243,205,201,167, 78,157,154, 52,123,246, -236,225,197,197,197, 86, 50,153, 44,219,200,200,232,248,140, 25, 51,118,153,154,154, 54, 52, 69,195, 31, 52, 57, 52, 85,239, 40, -194, 23,162,166, 28, 65,121, 61,221,181,254,212,243, 94,107,154,134,218, 83, 49,212,164,246, 20, 14,181,167,105,120,174, 57, 98, -196,136,103,168,156, 60,148,174,122,175, 61, 90,176, 26,215, 91,183,110, 5, 4, 4, 4, 92, 4, 32,198, 31, 71, 17,254,229,121, -254, 95,174,249,175,162,161, 62, 88,162, 43,183,227, 64, 11,179, 80,124,253,171,230,152,171, 63,160,171, 40,141, 95,113, 32,193, - 79,175, 86, 65, 87,148,244,120,224,107,131,179, 90,186, 3,132, 16,163,203, 81,241,224,138,114, 81,112,237,203, 2, 74, 95,209, - 55, 42, 42, 42,166, 57, 90, 63, 0,218,113,119, 30, 93,120,122,249,220, 43,182, 0,146,242,212,136,137,205, 59,115, 84,165,154, - 93,189, 77,218, 53,228, 3,152,249, 27,247, 94, 7,115,215,194,254, 38,182, 64, 86,178, 22,249,217,186, 83, 47,171, 47, 86, 53, -233,233,233, 79, 60, 61, 61,247,238,220,185,243, 3,127,127,127,227,233,211,167,199, 21, 22, 22,190,208,241,189,169, 60, 40, 47, - 79, 69,124,226,119, 23,118,108,248, 76,228, 30,132, 35, 33,243,245, 23,111,199,142,184, 95,162, 49,184,205, 90, 40, 20,246,254, -224,131, 15,248,101,101,101,245,154,171,162,162, 34, 20, 23, 23,163,168,168, 8, 49, 49, 49, 24, 57,114,164,240,209,163, 71,189, - 1,132, 55, 84,230,167,166,166, 94,106,215,174,221,141,239,190,251,174, 95,104,104,104,255,119,223,125, 87,208,187,119,111, 60, -120,240, 0, 55,110,220, 80,107, 52,154,223, 69, 34,209,217,167, 79,159, 26,218, 9,235,207,208,212,169, 84,170, 85, 98,177,120, -243,225,195,135, 87,158, 63,127,254,237, 73,147, 38, 25,233,116, 58,170, 37,154,133,133,133, 51, 45, 45, 45, 23,157, 60,121,114, -207,153, 51,103, 70,188,253,246,219,244,140, 25, 51,176,101,203, 22, 28, 57,114,132,209,235,245,191,240,120,188,137, 57, 57, 57, -141, 14, 64,169, 57, 15, 86, 67,243, 92, 53,182,222, 0,254,140,187,208, 22,107,214,142,132, 85,143, 22,172, 54, 85, 77,105, 30, -172, 73,199,142, 29, 95,152,231,170,186, 67,123,245,139,195,225,128,203,229, 54,169,137,208,203,203, 11, 60, 30,143,241,243,243, -219, 5, 96, 23,240,226, 35,115,120, 60,222,243, 73, 77, 13,161, 66,199, 96,199,206,189, 55,116, 12,129,158, 33, 32, 12,160, 37, - 0,163,103,160,103, 8,244, 12, 83, 57, 45, 26, 1, 84,229,250,191,188, 92,171, 49, 77,195,215,117, 76,197,240,156, 58,166,112, -168,247,185,129,233,233,233,121,132,144,234,254,168,117,141, 22,172,214,220, 91,181, 92,156,150,150, 54,161, 33, 77, 22,150,166, - 24,172, 5, 37,183, 55,105, 1, 88, 80, 20, 53, 63, 42, 42,234, 65, 75,255,140,195,161,231,103, 29,123,103, 51, 1,242, 57, 20, -230,183,198, 14,232,245,250,133,165, 81,155, 25, 66,136, 41, 69, 81,243,110,223,190,221,162,116, 18,157,238,195,175,182, 95,250, - 90,110, 34,232,159, 83, 80,113, 18, 20, 85,231,172,237, 58,144,143,127,252, 50,249, 75, 51, 57,119, 80,126,182,238, 20, 67, 99, -238,223,225,132, 62,120,240, 32,100,251,246,237,156,239,191,255,126,178, 90,173,126,161,227,123,179, 53, 75, 52,159,127,250,249, - 34, 78, 7,103,251,233,177,137,201,195,239,151, 24,214, 44, 88, 3,129,157,157,221,253,178,178, 50, 80, 20,133,138,138,138, 23, - 12, 85, 77,131,165,209,104,144,149,149, 5,103,103,103, 80, 20,101, 80, 13, 81,101, 74, 78, 88, 88, 88, 92,220,180,105,211,107, - 91,182,108,233,198, 48, 76,164, 70,163, 57,145,155,155, 91,210,156,125,254, 51, 52,171,126,247,137, 78,167, 91,179,101,203,150, -117, 34,145, 40, 32, 43, 43, 43,162, 37,154, 85,230,233, 13,115,115,115,219,189,123,247, 30,218,185,115,103, 23, 46,151,123,141, -162,168,183, 10, 11, 11,155, 51, 95,207,227, 22,174,111,140, 35,127, 66,182,111,177,102,205, 62, 87,205,109,102,124,161,124,208, -233, 74,230,207,159,159, 85,251,153,131, 53,231,188,170,249,174, 86,171,203, 13,208,100,190,248,226,139, 6,111,226,106, 26,173, -242,242,242, 70,155,116, 9, 67,114, 6,143,250,176,105,101, 36, 67,114, 94, 98, 17,119, 12,192,147,170, 23,105, 96, 93,147,118, - 9,149,115,180, 37, 18, 66, 18,107,233,214, 92,206,194,210, 58, 6, 43, 42, 42, 42, 5,192, 59,173,249,103, 3, 7, 14, 60, 7, -192,189, 53, 53,239,220,185,147, 4,224,237,214,210,219,175, 86,199, 3, 24,242,126,150,154,247, 19,234,143, 72, 85,117,104,127, -189, 86,179,224,223,130,186, 58,190,183,148,251, 37,218,217, 36, 33,237,133,142,239, 77,168,108,126, 19, 10,133, 84, 81, 81, 17, - 52, 26, 13,138,139,139,159,155,171,154, 38, 75,167,211,129,162, 40, 20, 23, 23,195,216,216, 24, 90,173,182, 73,119,138, 85, 38, - 37,172, 87,175, 94,135, 35, 34, 34, 90,101, 26,141, 63, 67, 83,165, 82,101,168, 84,170,113,189,122,245,226,182,150,102, 94, 94, - 94, 58,128,110,237,218,181, 19, 52, 33, 10, 86,111, 36,171,185,235, 13,224,251, 63, 33,203,255,244,119, 43, 88,147,146,146, 60, - 90, 91, 51, 37, 37,229, 97,171,167,243,250,143,179,254, 9, 21, 85,117,212,200,206,206,110,111,114,114,178, 35, 69, 81,201,181, - 35, 73, 13,173,107, 72, 19, 0,156,157,157,143,166,164,164,216, 10,133,194,116, 67,150,179,176,252, 29,240,102, 53, 89, 77, 86, -147,213,100, 53, 89, 77, 86,147,213,108, 38,239,255, 83, 13,208,191,104,218, 56, 22, 22, 22, 22, 22, 22, 22,150,191, 7, 84, 3, - 46,180, 41,163, 3,154,227,100,239,177,154,172, 38,171,201,106,178,154,172, 38,171,249,159,211,108, 76,187,230,239,223, 71,229, - 76,238, 44,173,112, 98, 88, 77, 86,147,213,100, 53, 89, 77, 86,147,213,252,239,105,214, 5,219, 68,200,194,194,194,194,194,194, -194,194, 82, 9,151, 61, 4, 44,134, 96,103,103,183,186,115,231,206, 31,222,188,121,115,125, 74, 74,202,242,102,106,216, 90, 88, - 88,172, 2,208,141, 16, 34,228,112, 56, 15,115,114,114, 66, 82, 83, 83, 47, 53, 55, 93, 10,133,194, 65, 46,151,175, 2,208,133, - 97, 24, 62,143,199,187,159,153,153,185, 50, 61, 61,253, 90,115, 53, 45, 45, 45,141, 20, 10, 69, 0, 33,196,138, 16, 66,243,120, -188,252,180,180,180,152,236,236,236, 44, 54, 39,176,176,176,176,176,180,216, 96, 45,253, 24, 10,104,192, 93,250, 3, 82,170, 22, -201, 80, 57,233,154, 59,128, 71,168,124,188, 64, 75, 31, 25,240, 79,209,252,187, 67,155,154,154,190, 42,145, 72, 62, 41, 41, 41, -241,147,201,100,247,117, 58,221,102,165, 82,121, 28, 64,139, 30,113, 34,151,203,173, 70,140, 24, 49,111,211,166, 77,152, 60,121, -242,162, 19, 39, 78,108,104,234,188, 77,238,238,238,195,164, 82,233,182, 21, 43, 86,202,131,130,130, 40,145, 72,132,248,248,120, -187,133, 11, 23,248, 91, 90, 90, 30,138,142,142,254,168,169,233,242,244,244,124, 75, 42,149,110, 14, 9, 9,145, 7, 4, 4, 80, - 92, 46, 23,119,239,222,181, 95,182,108, 89,144, 92, 46,223, 27, 19, 19, 51,187,169,154, 94, 94, 94,206,198,198,198,221, 86,174, - 92, 41, 10, 10, 10,130, 80, 40,196,195,135, 15,141, 22, 44, 88, 32, 87, 42,149, 79,162,163,163,175, 55, 69,207,255,253,219, 60, -190, 68,195, 5, 0, 77, 25, 95, 23,245, 67, 39,173,161,203,216,226,137,133,133,133,229, 95,104,176,150, 77,195,114, 74,135, 5, -160, 65,125, 50, 6, 7,183, 28,164,111,244,237,219,183,195,187,239,190, 75, 85, 61, 58,194, 35, 44, 44,236,141,227,199,143,199, - 50, 12,115, 29, 64, 12, 0,141,129,255,203, 7,224, 75,211,116,231,191,185,230,223, 30, 99, 99, 99, 23,185, 92, 62,187,168,168, -104, 80, 64, 64, 64,209,180,105,211, 18,175, 93,187,150, 16, 24, 24, 88,190,115,231,206, 16,173, 86,251,173,169,169,233,239,197, -197,197,235,154, 59, 47, 22,143,199,115,167, 40, 10,105,105,105,224,241,120, 60,129, 64,224, 1,192, 96,163, 97,111,111,175,144, - 74,165,223, 31, 60,250,155, 85, 81, 5,141, 39,217, 12,128, 50,232,105, 75,172, 88,187,197, 98,221,170, 69, 99, 75, 75, 75, 47, - 63,121,242,228,128,161,154, 10,133,194, 65, 42,149,110, 62,127,254,188,149, 80, 40, 4,195, 48, 40, 46, 46,134,149,149, 21, 86, -175, 94,109,190, 98,197,138,119, 11, 11, 11, 47, 38, 38, 38, 30, 51, 84,211,210,210,210,200,216,216,184, 91,120,120,184, 72, 32, - 16, 80, 90,173,150,170,168,168,128,141,141, 13,249,250,235,175,133, 11, 23, 46,116, 43, 40, 40,200, 72, 76, 76, 76, 54,200, 92, -109,187,205, 43,250, 45,188, 43, 73, 81, 45, 2, 0, 74, 36, 94,217,107,105,226,141,180,187,135,131, 26, 91,230,191,237,246,213, -168,169,172,201, 98,249,107, 81, 40, 20,221,157,157,157,143, 38, 39, 39, 71,114, 56,156,209, 73, 73, 73, 21,173, 32,107, 15,192, - 25,128, 25, 42, 7, 86,229, 1, 72, 4,158,223,184, 55, 25,139,118,189,135, 66, 40,121, 7,132,248,210, 0, 64,211, 49,140,166, -116,119,110,220,133, 99, 45,210, 20, 25, 77, 6,195,248,210, 32, 12,104,206, 29,162, 43,221,158, 19,123,225, 20,155, 51, 88, 90, -205, 96, 45,125, 23,102, 20, 48,119,254,180,247,105, 46,135, 67,133,108,251, 97,204,205,200, 99, 68,225,232,251,252,145, 27,193, -193,193, 8, 14, 14,166,214,174, 93,235,126,254,252,121,247,125,251,246,105, 35, 35, 35,111, 3,216, 83,223,159,133, 76, 23, 39, -235,180, 42, 7,208,226,242, 54, 93,190,221,215,173, 91, 48, 35, 20, 10,209, 18, 77, 0,248,240, 77,238,239, 21,148, 3,213,123, -200,226,164,214,210,252,135,152,171, 8,169, 84,218,126, 55,110,175,251, 0, 0, 32, 0, 73, 68, 65, 84,234,212,169, 79, 62,248, -224,131,139, 70, 70, 70, 4, 0,178,178,178,140, 94,123,237,181,252, 17, 35, 70,228,150,149,149,225,187,239,190,115,216,188,121, -243,239, 82,169, 52,173,184,184, 56,168, 41,249, 67,161, 80,172,233,215,175,223,172,113,227,198, 65, 42,149, 98,210,164, 73,168, -168,168,136, 60,127,254,252, 90,165, 82,185, 8, 64,163,207,206, 48, 51, 51, 91,178,108,217, 50,171, 18, 53, 7,139, 66,227,145, - 87, 82,233, 27, 36, 2, 26, 31,189, 34,196,132, 9, 19, 77,162,163,163,215, 2, 48,216, 96,201,229,242, 85, 33, 33, 33,242,234, -115, 93, 82, 82,130,146,146, 18, 20, 23, 23,163,164,164, 4,227,198,141,147, 61,121,242,100, 35, 42,103,119, 54,180,114, 9, 88, -185,114,165, 72, 32, 16,224,216,177, 99, 29,203,203,203,185, 90,173, 22,132, 16, 93,135, 14, 29, 98, 38, 78,156,200,143,139,139, -235, 10,192, 32,131,165,200, 0,175, 80,165,250,102,235,151,159,201, 1,224,227,185, 95,125, 3,168, 58, 19, 3,150, 41, 50, 16, - 24, 5,176, 6,171, 97, 56, 0, 94,231,241,120, 35,219,183,111, 31,240,228,201,147,104,157, 78,247,127, 0,254, 15, 45, 63,118, -175,216,218,218,174, 74, 79, 79,223, 10,224,199,255,202, 1,109,215,174,221,207,251,246,237,179, 56,121,242,228,176, 21, 43, 86, -140, 2,176,183, 5,114, 60, 0, 93,171, 76,213,163, 42, 99,133, 42,163,213, 1, 64, 59, 0, 87,154,114,195,107,225,218,205, 24, - 92, 89, 88,215,238,189,122,188,245,198, 8,169,220,220, 4,165, 21,122,196, 37,102, 56,158, 57,249,115,175,199,124,113,164, 78, - 83, 56, 38, 55, 46,178,164,169,154,125,250,246,239,209,247,149,126, 82, 19, 19, 83,228, 22,107,241, 52, 49,213, 41,226,247, 95, -130,105,174,248, 34, 40,237,219, 89,247,126, 47, 99, 47, 57,150,166, 96, 80, 39,119,138,162, 96,100,108, 84,231, 58, 19, 19, 19, -244,238,221, 27, 33, 33, 33, 60, 0, 93,106,173,126, 97,168,166, 94,175, 86, 44,250,104, 58, 4, 92, 34,124,109,208, 0, 74, 38, -147,181, 88, 19, 0,172,205,117,253, 58,187,169,122,101,198,204, 24, 31, 19,177,202, 91, 93, 94,240,135, 39,157, 74, 36, 18,184, -184,184, 96,225,194,133, 6,105,182, 2,127,186, 38, 33,196,214,195,195,163,120,195,134, 13,110,139, 23, 47, 54, 43, 47, 47, 55, - 2, 96,239,225,215,221,150,166,105, 7,181, 90, 45, 93,186,116,169,229,151, 95,126,233, 38,151,203, 11, 8, 33,242,166,164, 83, -161, 80,108, 8, 9, 9,153,189,123,247,110, 42, 48, 48, 16, 82,169, 20, 93,187,118, 69,104,104, 40,189,100,201,146,121, 10,133, - 98,141,129,251, 30, 28, 20, 20, 68, 49, 0,242, 75,116, 8, 95,221, 9, 87,190, 10, 68,153,154, 65, 97,113, 9, 84, 42, 21, 68, - 34,145,216,194,194,194,184, 9,199,179, 75, 64, 64, 0, 5,224,185,169, 42, 46,174,124,149,148,148, 66,173,214,128,166,105,153, -147,147,147,176, 9,199,211, 42, 40,168,210,127,150,151,151,115,135, 13, 27,134, 33, 67,134,160,184,184,152, 91, 84, 84, 4,181, - 90, 13,154,166,249, 85, 21,123,163,154,106, 9,143, 98, 8, 99,109, 36, 17, 91, 26, 73,196,150, 12, 97,172, 1,192,144,101,106, - 9,143,122,201,249, 83, 78,211,244,174,118,237,218, 61,164,105,122, 47, 0,155, 22,106, 6, 2, 8, 17,139,197,103,221,221,221, - 83, 36, 18,201,121, 0,107,170, 42,224,230,104, 10, 36, 18,201,249,144,144,144, 67,209,209,209,163,206,157, 59,231,124,247,238, -221, 55,214,174, 93, 27,102,108,108, 92,253, 96,222,102, 95,155,206,206,206, 59,175, 95,191, 30,216,173, 91,183, 29, 0,132,173, -116,189,115, 0,248, 85, 25,142,191, 69, 25, 82, 19, 59, 59,187,246,126,126,126,150, 28, 14, 7,193,193,193, 32,132, 4,183, 80, -179, 27,128, 12, 0, 17, 0,178,171,110,198,244, 0,114, 0, 92,170,186, 81, 9,110,146, 38, 87, 22,246,201,167,159, 15,156, 51, -253, 61,105, 84,146, 30,219,207, 40,113,240,114, 54,210,138,133,232, 63,124,178, 73,175,193,227, 6,112,249, 38, 97, 77,213,156, - 55,111,193,192,247, 38,141,151,222, 75,167,113,232, 74, 14, 46, 63, 42, 66, 25,101,134,222,195,223, 55,243, 8, 26,244, 26, 5, -254,158,191,195, 57,250, 15,104,254, 7, 34, 88, 59,145,191,108, 26,190, 12,249,238,135, 69, 52, 69, 17,123,215, 1, 15,156, 93, -186,148, 50, 12, 3,149, 74, 5,141, 70, 3, 30,143, 7,149, 74,133,164,164, 36, 92,191,126, 29, 38, 38, 38, 77,250,227,130,194, - 66,216,217, 59, 67, 34,145,180,138,230,148, 55, 71,112,147,149, 74,110,100, 84,120,167, 3,155,246,117,114,104,215,255,145,111, -239,207,239, 25,155, 56,170, 98, 98, 98,112,245,234, 85,228,231,231,163,186, 2,253, 55, 64, 81,148,118,221,186,117, 81,233,233, -233,184,116,233,146,223,178,141, 63,181,185, 87,212,142,155, 93, 66,120,114,227, 76, 39,119,241, 99,125,126, 94, 94,194,236,217, -179,207, 43, 20, 10,245,244,233,211,123, 25,162,107,103,103, 39,162, 40,170,211,128, 1, 3, 62,154, 56,113, 34, 18, 19, 19, 49, -103,206, 28,117, 76, 76, 76, 65,167, 78,157,204,214,173, 91,199,127,255,253,247, 17, 25, 25, 57, 59, 60, 60,252, 48,128,251,105, -105,105, 13, 61, 75, 77, 32, 18,137,128,194,202, 27, 85,141,142,160,186, 91, 88, 73, 73, 9,104, 82, 0, 62,159, 79,211, 52, 45, - 7, 96,208,157, 39,195, 48,124,129, 64,128,210,210, 82,148,148,148, 32, 45,187, 4, 73,153,165, 40, 46,173,128, 74,165, 69, 69, - 57,129, 80,106, 77,107,179,179, 45, 0,164, 25,162, 73, 8,161,171,155, 27,213,106, 53, 84, 42, 21,212,106, 53,212,106,245,243, -199,249,112, 56, 28,169,157,157,157, 44, 45, 45, 45,191,209,218, 84, 32,214,113,104,126,200,130,149,223, 44, 5, 0, 14,205, 15, - 49, 70, 57, 99,200, 50,142, 64,172,123,137, 89, 75, 40,151,203,195, 15, 29, 58,228,225,226,226,130,103,207,158,185,191,245,214, - 91,157,149, 74,165, 31,128,166,222,197, 75,104,154,254,114,226,196,137, 31,142, 29, 59,150,114,117,117, 5,151,203,133, 78,167, -179,143,143,143,239,115,240,224,193,185, 59,119,238,220,174,215,235,103, 27,122,238, 1,208, 2,129,224,192,182,109,219,122,118, -238,220, 25,123,247,238,197,141, 27, 55,152,192,192, 64,122,194,132, 9,112,114,114,234, 50, 97,194,132, 35, 21, 21, 21, 67, 12, -137,176,214,129, 83,215,174, 93, 29, 56, 28, 14,186,117,235,198,143,140,140,244, 7, 16,217,210,128,179,189,189,125, 68,239,222, -189,253,206,158, 61, 27,149,145,145,209,187, 9,251, 11,133, 66, 49,220,218,218,122,173, 84, 42, 53, 51,244, 55, 37, 37, 37,101, -153,153,153,115,210,211,211, 15, 27,152,255,187,249,248,248, 64,167,211,193,196,196, 4, 54, 54, 54, 61, 40,138,154,109, 98, 98, -242,122, 81, 81,209,172,180,180,180, 27, 77,216, 95,187,170, 27,248,234,231, 2,182,169,138, 90, 1,149,207,179,124, 6, 32, 1, -128, 45, 0, 7, 24,208, 92,104,209,174,247,208,110,193,125,122, 4,119,246,166, 87, 31, 78,132,158, 97,192,133, 30, 92, 14,131, - 28, 61, 15, 20, 69,193,201, 45,144, 99,125,239, 86, 23,157, 70, 51, 52, 55,238,236, 49, 67, 52, 7, 14, 24, 16,220,193,205,149, - 94,127, 52, 25, 5,105,247,244,153,143,206,231, 80, 52,141,182,190,253, 45,157,220,252, 56,237,253, 94,225,101, 38,222,235,163, -105,223,179, 95,126,252,197,179,172,109, 96,105,142,193, 34, 53,239,172,150,124,143,197, 22,166,104,243,224,222, 29, 58, 37, 67, - 93,122,231,206, 29, 88, 88, 88,192,202,202, 10, 50,153, 12,177,177,177, 56,123,246, 44, 30, 63,126, 12, 66, 8,252,252,252,154, -244,199,153, 25, 25,200,205, 43,110, 85, 77, 71,133, 2,142, 10, 5, 55, 39,191, 0, 87,239,220,245, 56,182,189, 95,135, 76,122, -234,110,149, 74,245,124, 27,173,246,223,215,234, 98,101,101,165,255,248,227,233,185, 83,190, 73,104, 55,166,175, 29,103,120, 87, - 27, 28,141, 84,114,194, 46,112,200,162,119, 59,230,196,199,199, 25,188,211,142,142,142,171,122,246,236,249, 25,151,203,229,189, -255,126,229,244, 35, 51,102,204,168,184,123,247,174,103,106,106,106, 66, 69, 69, 69,135, 89,179,102,221, 61,114,228, 8,239,189, -247,222,163,202,203,203,111,240,120, 60, 18, 17, 17,177, 92,169, 84, 46,173,211,104,112, 56,209, 15, 30, 60,104,163, 19,217,194, - 82, 74, 99,192,162,168,202, 26, 71, 72,144,147,153,134,251,241, 55, 33,151,203, 77, 44, 45, 45, 31,101,101,101, 85,100,102,102, -126,146,144,144,176,167,161,116,242,120,188,251,119,239,222,181,183,182,182, 70, 73, 73, 9, 82,178, 74,177,235, 42,133,178, 10, - 49, 0, 49, 56,144, 66,106,233, 32,109, 75,202, 98,204,204,204, 52,106,181,122,222,147, 39, 79,126,108, 68, 51,255,225,195,135, - 70,118,118,118,224,112, 56,154,131, 7, 15,242,213,106, 53, 8, 33,186,147, 39, 79,142, 46, 40, 40,232,214,174, 93, 59,218,201, -201,105,157,163,163,163, 74,169, 84, 78, 73, 76, 76,172,247, 65,195,167,103,180,215,244, 90,122,225,219,130,103, 41, 7, 1,192, -174,179, 71,222,241,165,254,234, 94, 75, 75, 26, 93,118,122, 70,251,151,217, 79,240,157, 5, 11, 22,120,152,155,155, 99,218,180, -105, 88,182,108, 25, 22, 47, 94,236, 50,109,218,180,247, 1,108,104,130,142,216,198,198,230,230,166, 77,155,220,187,119,239,142, -147, 39, 79, 98,255,254,253, 72, 72, 72,208, 57, 59, 59,115, 59,119,238,140, 37, 75,150, 96,192,128, 1, 83,166, 79,159,222, 43, - 61, 61,221,223, 64,211, 49,121,201,146, 37,195,123,244,232,129, 73,147, 38, 85, 92,184,112, 97, 20,128, 51,191,255,254,123,223, -136,136,136,195, 63,253,244,147, 56, 36, 36,100,224,172, 89,179, 62, 0,176,181, 25,251, 63,162,103,207,158, 0,128, 30, 61,122, - 96,237,218,181, 3, 90,104,176, 4, 22, 22, 22, 39,246,238,221,235,231,230,230,134,183,223,126,219,127,212,168, 81, 39,242,243, -243,251, 3, 48,232,185,145, 10,133,226,203,109,219,182,181, 23,139,197, 6,255,169, 90,173, 54,159, 58,117,234,154,166, 24, 44, -111,111,111, 92,184,112, 1,253,250,245,131,151,151, 87,251,169, 83,167,174, 27, 48, 96, 0, 62,253,244,211,203, 58,157,206, 54, - 51, 51,211,208, 7, 61, 59, 1,168,126,110,169, 35, 0, 23, 84, 54, 7, 2, 64,231,170,247,103, 85,102,171,131, 33, 6, 11, 34, -163,119,134, 13, 25, 34,253,191,200, 44,232, 25, 6,238,118, 34,120, 56,202,144,152, 85,142,196,180, 92,240, 40, 13,164, 98, 33, -124,186,189,102,150,151,153,248, 14, 12,233, 30, 32,148,188, 51, 98,216, 16,227,159,175,102,161, 32,237, 62, 73,186,121,240,188, -182,188,116, 10, 0, 60,184,248,227,247,214,102,162,254,174,190,157, 56,101,193,195,205, 34,142,126,247, 78, 62,192, 26,172, 63, - 31,210,132, 40,239, 63, 47,130, 85, 77,110, 1, 84, 22, 54, 30, 72,201,136,174,252,158,155,139,220,220, 92,180,109,219, 22,155, - 55,111,126, 97,219,230, 62,129,254,207,208,180, 52, 51,197,176, 62,189, 56,247, 98,191,227,168, 24, 85,171,104,254,109,115, 34, - 33,132,162, 40, 42, 41, 71,107,154, 83,164,229,143,238,227, 64,120, 28, 26, 99,250, 56, 82, 91,143, 37,241,115, 84, 18, 83, 14, -135, 67, 19, 66, 26,189,147,247,247,247,231,121,123,123,127,182,115,231, 78,158, 82,169,132,169,169, 41,180, 90, 45,162,163,163, -211,149, 74,101, 2, 0,100,100,100,196,222,184,113, 35, 83,175,215,219,187,187,187, 99,234,212,169,232,208,161, 3, 53,123,246, -236,185, 7, 14, 28, 88,142, 58, 70, 44,102,102,102,134, 44, 92,184,176,231,170,181,155, 45,198,119,166, 80, 90,166, 70, 73, 73, - 9, 18,227,238,131,148,168,177,126,253,215, 16,139,197, 20, 0,126,118,118, 54,127,233,210, 37, 59, 76, 77, 77,135,220,190,125, -123,100,189, 6, 61, 51,115,229,146, 37, 75,130,214,175, 95,111, 94, 82, 82, 2, 85,121, 57,138, 85, 2, 92,255,186, 50, 66,217, -121,214, 13,108,253,106, 29,237,237,100,100, 81, 82, 82,130,207, 62,251,108,147, 68, 34,233, 18, 19, 19,243, 97,125,154,105,105, -105, 49, 11, 22, 44,144,111,217,178, 69,216,161, 67,135,187, 69, 69, 69,200,207,207,167,143, 28, 57,178,194,201,201,201,124,211, -166,205,148, 68, 34, 1, 0,164,164,164,240, 23, 45, 90,120,192,216,216,248,167,123,247,238, 77,170,239,244, 68, 44,237, 93, 1, - 16,165,173,109,219,246,101, 87,233,165,182,182,229,151, 35,150,166,135, 2, 68, 89, 21,135, 36, 54, 54, 54,227,147,247, 10,123, - 84, 84, 48, 27, 51, 50,146, 30, 3, 47,247,161,178,150,150,150,211,135, 15, 31,142, 53,107,214,224,216,177, 99,179,204,205,205, -191, 94,182,108, 25,108,109,109, 63, 78, 79, 79,223, 88, 85, 0, 26,194, 87, 27, 54,108,112,119,119,119,199,196,137, 19,213,103, -207,158, 93, 0,224, 40,128,164, 75,151, 46, 57,238,217,179,103,232,129, 3, 7,214,108,218,180, 73,180,101,203,150,246,111,188, -241,198, 70,134, 97,222,109, 76,212,218,218,250,211,177, 99,199, 98,221,186,117,184,112,225,194, 27, 0, 78, 86,173, 58,117,229, -202,149,161, 33, 33, 33,231, 22, 45, 90,132, 13, 27, 54,204, 76, 77, 77,109,170,193, 50,246,240,240,248, 98,224,192,129,184,116, -233, 18,130,131,131,209,181,107,215, 89, 87,175, 94,221,140,202,166,173,166, 66, 27, 27, 27, 31,216,189,123,119,112,155, 54,109, -176,114,229, 74,124,246,217,103,216,185,115,103,240,219,111,191,125,160,180,180,116, 36, 12, 24,229,107,108,108,108, 44, 22,139, -177,102,205, 26,146,156,156,220,104,244, 84,161, 80,152,125,241,197, 23,148,137, 97,205, 0, 28, 91, 91, 91, 19,107,107,235,158, - 54, 54, 54,216,180,105, 19,172,172,172, 48,107,214, 44, 88, 88, 88,160,180,180, 20, 35, 71,142,228, 93,187,118,109, 12,128,205, - 6,238,183, 5,128,234,136,151, 71,149,185, 42,174,250,126, 13, 64,143, 42,131,149, 7,192,220,160, 3, 73,136,183,153,169, 12, -233,119, 51,193,133, 14,238,142, 82,220,138, 47,133, 70, 79, 32, 49, 50, 70,105,113, 1,124,219,203, 81, 84,102, 15,128, 49,104, - 18, 76, 62,135,238, 36, 16,138,145, 85, 84,136,140,135,231,114, 53,250,138,169,133,207,174,164, 0,128, 89,219,224,169,247,175, -159,190, 53,114, 80,176, 85,118,190, 35, 8, 97,130,192,194,210,148,139,191,177, 13, 24,230,143,215,126,205,136, 80, 53, 26, 77, -203,110,184,255, 12,205,186,248, 51, 52,255, 14, 62,203,206,140, 91,104, 36,162,117,191,223,202,210,107,117,122,252,118, 43, 67, - 47, 17, 82, 58, 51,161,186,136, 97, 24,131, 42,196,168,168, 40,237,165, 75,151,246,206,159, 63, 31, 27, 54,108,192,211,167, 79, -193,227,241,224,230,230,102,109,111,111,175,168, 42,184, 29,188,188,188, 44, 57, 28, 14,226,227,227,177,127,255,126, 44, 93,186, -148,220,190,125,123,103,125, 21,133, 82,169,140,206,204,204,220,182,122,249,130, 2, 94, 69, 58, 36,250,108,232, 11,158,130,167, - 47,196,244, 89,243,241, 44, 71,143,232,103,197,136,126, 86,140, 12,149, 8, 95,172, 92,207,113,113,113, 25,106,103,103, 55,160, -190,180,166,167,167, 95, 83, 42,149,161,139, 23, 47, 46,204,201,201,121,158,127, 52, 58, 6, 26, 29, 83,187,114,194,234,213,171, - 77, 21, 10,197,104, 91, 91,219,222,245,105,102,103,103,103,165,167,167,199,207,159, 63, 95,147,157,157,141,162,162, 34,156, 62, -125,250,141,182,109,219,154,207,158,191,156,122,150, 67,158,167,179,144, 49,197,186,205,219, 57,237,218,181, 27,167, 80, 40, 26, -236, 71,100,107,107,215,222,195,163,221,161,107,215,174, 77,106,223,190,253,135,213,198,170,218, 72, 57, 59, 59, 79,187,125,251, -246,100, 63, 63,207, 67,214,214, 54, 29, 94,114, 94,234, 51,122,244,232, 14, 12,195,224,208,161, 67,119, 1,108,248,249,231,159, -111, 86, 84, 84, 96,204,152, 49,206, 0, 6, 26,168, 19, 56,110,220,184, 15,131,131,131, 49,115,230, 76,205,217,179,103, 59, 1, -248, 26,149,163,199, 8,128, 36, 0,155, 35, 34, 34,124,167, 79,159, 94, 17, 20, 20,132, 73,147, 38, 77, 70,253,125,114,170,233, - 54,118,236, 88,119,134, 97, 16, 22, 22,118,167,134,185,170,230,252,225,195,135,175,169,213,106,140, 31, 63,190, 45,128,190, 77, -216,119,190, 80, 40, 60,180, 98,197, 10,211,180,180, 52, 76,152, 48,161, 34, 54, 54, 22, 75,151, 46, 21,155,152,152,156, 4, 96, -220,212,131, 41, 20, 10,127,248,238,187,239,134,251,248,248,224,131, 15, 62, 80,127,251,237,183, 51, 62,252,240, 67,117,167, 78, -157,240,205, 55,223, 12, 23, 8, 4, 77,122, 4, 72,102,102,102, 65, 68, 68,132, 69, 99,175,140,140,140, 76, 67,244, 28, 28, 28, - 76,189,188,188,238, 6, 6, 6,230,116,236,216,177, 29, 0,220,191,127, 63,251,208,161, 67,196,194,194, 2,167, 79,159,198, 15, - 63,252,128,238,221,187, 67, 42,149,142,105, 98, 20,130,212,248, 92,215,250,218,219, 53, 12, 69,145,194, 50, 29,184, 52, 13, 30, -135, 32, 41,179, 28, 26, 61, 1,159, 71,131,199, 1,184, 52,129,133,148, 7, 30,143, 3, 67,111, 82,104,138, 66,126,169, 22, 92, - 14, 5,158,128, 79,209, 58,253,243, 16, 33,205,213,139,133, 34, 33,101,101,194, 7,159, 75,129,162,192,194,210,122, 17, 44, 0, -208,235,255, 24,248,168, 43, 10,164, 86,171, 91,148,144, 63, 67,179, 46,254, 12,205,151, 73, 81, 81, 17, 55, 34, 34,194,132,199, -227, 25, 13,241,233,158,251,229,193, 56,203,101,251, 30, 67,192, 1, 53,180, 35,173,188, 16,126,150,202,207,207, 55,115,113,113, -201, 55, 68, 47, 33, 33, 97, 74,104,104,232, 74,154,166,131,244,122,253,193, 13, 27, 54, 96,235,214,173,146,105,211,166,197,234, -245,250, 52, 87, 87, 87,135,141, 27, 55, 10, 1, 32, 52, 52, 20,191,253,246,219, 8, 30,143,119, 35, 57, 57, 57,163, 33,221, 59, -119,238, 44, 42, 40, 40,136, 76, 72, 72,216, 76, 81,148,169, 84, 42, 53,251,249,231,159, 41,101,129, 26,139, 66,159, 62, 31, 89, -104, 36,228, 96,254,235,114,188,249,230, 91,220, 39, 79,158,124,149,150,150,246, 91,125,154,209,209,209,179, 10, 10, 10, 34,226, -226,226, 54,240, 45,220, 44, 68,222,239, 75,251,206,175,108,126, 84,152, 11, 65, 87, 21,136,133,133,133,200,201,201,193,228,201, -147, 77, 87,173, 90, 53, 55, 61, 61,253, 66,125,154, 49, 49, 49,215, 10, 11, 11,149,113,113,113, 93, 8, 33, 2, 19, 19,147,238, - 27, 54,108,160,146,242,212,152,183, 39, 30,197,229,149,233,148,138,120, 88, 62,214, 30,147, 38, 77,226, 62,123,246,236, 75,165, - 82,217,163,110,115,101,235,226,225,225,113,104,223,190,125, 30, 27, 55,110,204,123,242,228, 73,169, 66,161, 88, 86,115,155,196, -196,196,138,213,171, 87,231,134,134,134,186, 77,152, 48,225, 80, 84, 84,212,168,230, 78,169,209, 82,100, 50,217,154,169, 83,167, -226,192,129, 3,200,207,207,223, 88,149,199, 54,236,219,183, 47,108,202,148, 41, 8, 13, 13, 93,147,157,157,125,218,128, 74,113, -208,152, 49, 99,112,234,212, 41,156, 59,119,238, 11, 0, 15,234,217, 46,238,210,165, 75,115,127,249,229,151, 77, 99,199,142,197, -174, 93,187, 6,162,178, 3,116,125,244, 31, 48, 96, 0, 78,158, 60,137,220,220,220,111,234,218,160,160,160,224,219, 95,127,253, -181,203,128, 1, 3,176,122,245,234,254, 0,206, 27,176,235,238, 38, 38, 38,187, 55,109,218, 20,232,227,227,131,113,227,198,149, -107, 52,154,129,159,125,246,217,177,253,251,247, 75,247,238,221, 27,240,254,251,239, 95,207,202,202,122,175, 42, 2,211,120,229, - 77,211, 33,235,215,175,127,183,119,239,222,152, 53,107,150,238,183,223,126, 27, 6,224,204,233,211,167,227, 63,255,252,243, 19, -235,215,175,231,172, 91,183,238,221, 79, 62,249, 36,155, 97,152, 5, 47,227,124, 83, 20,181,110,253,250,245, 30,158,158,158, 40, - 47, 47,199,211,167, 79,145,153,153,185,239,244,233,211,103,238,221,187,183, 54, 35, 35,227,136,181,181,245,148, 89,179,102,217, - 7, 6, 6, 6,150,150,150,154, 25,210,255,176, 70,100, 42, 11,192, 67, 84, 14, 44,170, 62,110,157, 81,217, 52, 8, 84,142, 40, -204, 55, 48,177,119,227,158,165,181, 53, 51,150, 33,159, 17,224, 89, 90, 14,196, 70, 70,160, 9, 13,157, 42, 31, 46, 78, 86, 96, - 8, 80,148,147, 6,154,166,238, 26, 34,169,213, 51,183, 19, 83, 50,237, 76,141, 68,112,233, 52,216,226,206,249, 93, 63,202,218, -118,127,159,203,161, 56, 60,129,241,182,113, 99, 39, 90,106,245, 4, 37,249, 74, 80, 28,250, 6, 88, 88, 90, 59,130, 85,187,221, -191,118, 20, 72, 44, 22,163,162,162,105,211,165,252, 25,154,134,252,103,107,107,190, 76,180, 90,173,244,195, 15, 63,236,145,154, -154, 42,115,115,115,139, 31, 28, 40,191,186,115, 70,219,171,157,101, 15,202, 22,190, 70, 93,117, 16,101,222, 20, 10,133,201,249, -249,249,130,208,208, 80,127,173, 86, 43, 49, 68, 55, 35, 35, 35, 57, 61, 61,253,208,225,195,135,127, 60,126,252, 56, 58,116,232, -128,139, 23, 47, 74,227,226,226,220,195,195,195,141, 92, 92, 92,112,228,200, 17,252,250,235,175,219,149, 74,229, 47,141,153,171, -106,146,147,147, 79,199,196,196,180,207,205,205,109,111,106,106,170, 53, 53, 53, 69,237,145,133,165, 21,122, 20, 20, 21,195,212, -212, 20, 18,137,196,185, 49,205,196,196,196, 99,119,238,220,105, 11,115,247, 96, 78,194,190,194,111, 63,238,128,111, 63,238,128, - 21,111,183,131,141,153, 0, 5, 5, 5,200,206,206, 70,118,118, 54, 8, 33,208,235,245, 30, 6,104, 38,199,196,196, 28, 72, 75, - 75, 59, 43,151,203, 41, 99, 99, 99, 16, 0,249, 37, 26, 92, 89, 27,136, 43,107, 3,145, 95,162, 65,113, 73, 41,236,236,236, 32, -149, 74,235,108,142, 48, 51, 51,147, 18, 66,246,236,216,177,195, 93, 42,149,114,166, 76,153, 98,122,245,234,213, 30, 87,175, 94, -157, 87,235,213,227,227,143, 63, 54,147, 72, 36,156, 93,187,118,185,114, 56,156,221, 78, 78, 78, 38,127,113,118,226, 0,248,104, -202,148, 41, 1, 34,145, 8, 91,183,110, 77, 0,240, 83,213,186, 67,223,126,251,109, 44, 0,204,152, 49,195, 11,192, 44, 52, 60, -146, 18,124, 62,191,147,135,135, 7,174, 94,189, 10, 0, 63, 55,242,223,135, 35, 35, 35,225,226,226, 2,145, 72, 20,216,200,182, -206, 14, 14, 14,136,141,141, 5,128,232,250,188,119,108,108, 44, 28, 28, 28, 64, 81,148,179, 1,251, 62,252,213, 87, 95,189, 27, - 30, 30, 30,216,173, 91, 55,188,251,238,187,234,235,215,175, 15, 6,112, 49, 58, 58,186,207,248,241,227, 75, 93, 93, 93, 17, 17, - 17,225, 62,126,252,248, 72,154,166, 87, 26,160, 57,121,249,242,229,243, 71,140, 24,129,229,203,151,147,131, 7, 15,142, 3,112, -166,106,221,111, 97, 97, 97, 19, 86,173, 90, 69, 70,142, 28,137,101,203,150,205, 7,240, 65, 67, 98,101,101,101,133,122,189, 30, -101,101,101, 6,221, 33, 26,186,125,219,182,109, 7,121,122,122,226,151, 95,126,129, 64, 32,192,239,191,255, 14,154,166, 79,100, -100,100,156,185,125,251,182, 79,122,122,250, 10,165, 82,121, 56, 62, 62, 30,193,193,193,180, 94,175, 31,105, 96,126,122, 6,192, -167,234,115, 10, 42,251, 99,117, 3,208, 29, 64, 92, 85, 36, 19,168,124,158,221, 51, 67, 4, 25,117,201,222,115, 39, 15, 23,154, - 25,243, 97,105,102, 4,107, 75, 25, 56,218, 82, 64, 93,128,246, 78,214, 8,242,176,193,179, 44, 53, 34,207, 30, 42, 40, 43, 41, - 51,104,122, 9,189,166,116,247,185,211,191, 20,154, 27,243,209,166,189, 39,134,142,155,233,231,238,211,249,119,111,255, 30,191, - 45, 90, 18,210,241,213, 30, 30,212,131,148,114, 92, 59,119, 52,191,172,184,104, 55,107, 25, 88,154, 27,193,170, 43, 0,154, 53, -107,214, 44,171,217,179,103, 67, 38,147, 33, 55, 55, 23, 90,173,246,121,180, 73, 40, 20,194,212,212, 20,185,185,185, 8, 11, 11, - 67,213,221, 74,253, 37, 56, 71,160, 92,249,205, 22, 7,138, 99,164, 22,138, 37,196, 92,210,114, 77, 0, 80,107,185, 89,223,133, - 29, 49, 31,212,179, 43,215, 81,161,248,195,250,230,104,254, 67, 12,214,239, 25, 25, 25, 1, 29, 58,116,200,112,114,114, 82,149, -151,151,131,168, 84,197, 39,195, 54,182,115, 48,249,224, 41, 77,211, 68, 44, 22, 51,166,166,166,165, 79,159, 62,165,116, 58, 93, -120, 83,244, 9, 33,211,166, 77,155, 70, 95,186,116,105,220,219,111,191,141, 54,109,218, 32, 58, 58, 26,161,161,161, 56,124,248, -240, 30, 62,159, 63,163, 57,233, 78, 73, 73, 41,241,240,240,120, 33, 2, 82,123,100,161,182, 34, 27, 12,195, 24,220, 57, 63, 63, - 42,244, 49,199,210, 82,235,229,248,191,233, 68,242,243,243,145,157,147,131,236,236,108,228, 84,189, 19, 66, 12, 14, 97, 82, 20, - 85,172, 86,171,107,165,243,127,205,143,165,165,165,208, 84,100, 65,175,215,215,169,153,159,159, 95,172, 80, 40,182,108,222,188, -121,253,138, 21, 43,172, 54,108,216,144,247,232,209,163, 34,154,166,203,107,221,196,136,218,183,111, 47, 93,183,110,157,245,230, -205,155,243, 24,134,217,146,148,148, 84,248, 23,102,165, 17, 62, 62, 62,123, 6, 13, 26, 36,253,240,195, 15,177,121,243,102, 40, -149,202,121, 0,170, 71, 50, 50, 57, 57, 57,159,127,243,205, 55,199,231,206,157, 11,141, 70,179,238,228,201,147,203,162,162,162, -166,213, 48, 97, 47, 32,151,203,237,185, 92, 46,162,162,162,138, 0, 60,109,204,211, 71, 69, 69,101, 82, 20,101,173, 80, 40,218, - 37, 36, 36,212,187,161,185,185,121,123,169, 84,138,180,180, 52, 52, 80, 49, 39,166,167,167, 19,129, 64, 64,217,218,218,186, 84, -109, 91, 47,102,102,102,159,239,216,177,131, 27, 30, 30,142, 37, 75,150,164, 38, 37, 37,141,175, 17, 69,139,186,125,251,118,112, -159, 62,125,246,207,157, 59,215,237,203, 47,191,164, 98, 99, 99, 63,136,138,138, 90,212,144,166,147,147,211,180,201,147, 39, 99, -203,150, 45,216,182,109,219, 7, 0, 14,213,218,100,255, 55,223,124, 99,102, 97, 97,177,101,234,212,169,216,189,123,247,248,103, -207,158,125, 87,159, 94, 90, 90,218,220,209,163, 71, 47,206,203,203, 11, 49,228,132, 26,178,189, 66,161, 24, 22, 16, 16, 96, 77, - 8,193,230,205,155, 51,182,108,217, 82, 86, 84, 84,244,147, 82,169, 12,175, 21,137, 59,114,250,244,233, 89, 31,126,248, 33,194, -195,195,183, 70, 68, 68, 16,165, 82,185,163,145, 36, 40, 81, 57,207,149, 71, 85, 4, 43, 5,127,236,200,238, 86,245,158,106,200, - 62,229,198, 93, 56,198,225,137,174,196,220,184,240,170,179, 87, 48,207,202, 76, 10, 59, 23, 75,152, 27,243, 65, 0,220, 75, 82, -225,218,197, 51,218, 44,101,114,164, 33, 35, 8,171, 53,159,240,197,145, 18, 75,167, 87,219,122,246,224, 58,187,184,162,127,247, -142,102, 22, 50, 30,212, 90,130,223, 99, 10,113, 53,226,148, 54, 43, 51, 37,156, 29, 65,248,215, 5, 86,255, 75, 17,174, 96, 46, -151,251,213,231,159,127,190,237,225,195,135,219,226,226,226,182, 69, 69, 69,109, 91,185,114,229,182,165, 75,151,110, 11, 8, 8, -216, 70,211,244, 87,168,236, 59, 81, 59, 34,230,253, 87,104,246,234, 5,238,184,129, 88,185,124, 26,183, 44,116,165,131, 54,251, -226, 40, 66,238,127, 64,150, 79, 3,105, 65, 58, 91,202, 95,165,233,197,229,114, 79, 59, 57, 57, 93,219,187,119,239,129,168,168, -168, 93,230,230,230,233, 43, 87,174,220, 49, 99,198,140, 48, 27, 27,155, 27, 60, 30,239, 44,128,142,205, 77,167,181,181,245, 27, -111,191,253, 54, 57,117,234, 20,121,243,205, 55,137,173,173,237,224,150,238,123,151, 46, 93, 50,238,221,187, 71, 30,166,148,146, - 55, 86,197,144,238,115,110,146,238,115,110,146,129,139,110,144,239,247,159, 33, 75,150, 44, 37,222,222,222,103,155,162,233,235, -235, 27,151,149,149, 69, 8, 33, 36, 47, 47,143,196,198,198,146, 75,151, 46,145, 35, 71,142,144,109,219,182,145,144,144, 16,166, - 99,199,142,123,154,162,217,181,107,215,188, 39, 79,158,144, 7,201,165,100,196,138, 59, 85,233,188, 65,134, 44,185, 77,194, 78, - 92, 35,203,151, 47, 39,158,158,158, 7, 27,210, 84, 40, 20, 99,230,204,153,163,204,203,203,211, 6, 6, 6, 70,212, 94,239,239, -239,127, 52, 39, 39, 71,187,112,225,194, 76, 91, 91,219,137,127,117, 94,178,176,176,184,146,154,154, 74, 18, 18, 18,200,103,159, -125, 70, 56, 28, 78,157,149, 39, 77,211, 91,103,206,156, 73,158, 62,125, 74,210,211,211,137, 66,161,136,110, 32,157, 67,172,172, -172,110, 1, 24, 97, 96,122,134, 88, 89, 89,221, 0, 48,178,161,125,119,116,116,124,144,154,154, 74, 60, 61, 61,243, 26, 18,115, -113,113, 73, 73, 77, 77, 37,174,174,174,105, 6, 28,207,215,172,173,173,111, 3, 88, 5, 64,212,192,205,232,167, 54, 54, 54, 87, - 0,124,100,128,230,112, 55, 55,183, 40, 0,211, 27,217,239,247,157,157,157, 99, 0,188,246, 87,159,119, 47, 47,175,171,105,105, -105,100,251,246,237, 68,161, 80,204,109,232, 71,109,218,180,249,229,216,177, 99, 68,169, 84, 18, 63, 63,191, 40, 3,211,201, 5, -208, 11,149,253,224,108, 80, 57,241, 40, 15,128, 53,128,222, 0,250,160,242, 9, 28, 6,151, 33, 22,174,221,140,173,189, 7, 29, -247,124,117,122,222,164,213,225,100,238,158,120,242,197, 79, 9,100,230,230,203, 36,112,200,204, 60,219,142,175, 29,183,112,237, -102,220, 84, 77,133,207,224, 19, 29, 7,127,154,247,206,234,115,100,193,222,167,100,233,254, 4,242,201,198, 8, 18, 52,108,102, -174,125,199,161, 63, 91,121,247,151,188,228,114,254,191,162, 89,231, 53,242,111, 55, 90, 2, 0,175, 73,165,210,205, 75,150, 44, -217,118,253,250,245,109, 67,134, 12,217, 38, 16, 8, 54, 87, 21, 12,130,102,156,128, 86,215, 28, 24, 4,233,228, 97,244,174, 21, - 31,112, 53, 71, 55,116,208, 46,159, 6,210, 10,233,252,167,100,232, 30, 60, 30,239,170,143,143, 79,184, 84, 42,205,110,211,166, -205, 37, 30,143,119, 3, 64,207,150,166,211,218,218,218,242,221,119,223,101,158, 61,123, 70, 38, 78,156, 72, 12,104,190,106, 84, -211,193,193,161,239,200,145, 35,181, 41, 25, 5,228, 82, 76, 10, 57,126,241, 1,217,119,252, 42,217,182,255, 12,217,248,221, 30, -210,191,127,255, 10,107,107,107,167,166,104, 58, 58, 58, 14, 28, 54,108, 88, 65, 78, 78, 14,137,141,141, 37, 23, 47, 94,124,110, -174,190,251,238, 59,210,177, 99,199, 92, 59, 59, 59,219,166,104, 58, 57, 57, 13, 31, 63,126,188, 86,153, 91, 74,174, 63,200, 32, -191, 95,143, 39, 71,207,223, 33,251,143, 95, 37,123,246,255, 76,122,245,234, 85,110,105,105,105,221,152,166, 66,161, 24, 61,106, -212,168, 39,110,110,110,223,215, 97, 6,190, 25, 53,106, 84,146,173,173,237,132,151,148,151, 6,218,217,217,197,242,249,252, 19, - 0, 38, 52,242,187, 49, 92, 46,247,152,141,141,205, 77, 0,175,191,132, 60, 63,196,202,202,234, 26,128, 97, 6, 24,182,107,245, - 24, 60,182, 82,172,204,147, 67,124,125,125, 99,108,108,108,214,163,145, 38, 95, 59, 59, 59,145, 66,161,248,202,207,207,239,170, -141,141,205,200, 38,166,211,190,234,198,118,120,213, 43, 24,149,115, 95, 53,123,223, 45, 92,251, 13,181,243, 27,118,212,182,227, -107, 73,182, 29,135, 36,217,251, 15, 63,106,225,218,111,104, 75, 53,237,253,135,255, 98,235, 59, 36,217,222,119,104,162,163,255, -240,163,150, 29,250, 13, 98,205, 16,107,176,254, 42,140, 1,140,161,105,122, 43,128, 49,104,124, 84,141,247,203,208, 28,216, 11, -118, 31,190,201, 57, 57,111, 18, 47,187, 21,211,249, 79,201,208,195,185, 92,110,100, 85, 65,214,106,233,116,113,113,217, 49,117, -234, 84,189,163,163,227,150,214,210,244,240,240, 88, 63,116,232, 80,205, 15, 63,252, 64,126,253,245, 87,178, 99,199, 14,242,217, -103,159,145,222,189,123, 87,184,185,185, 77,106,142,166,143,143,207,138,190,125,251,230,132,133,133,145, 3, 7, 14,144,173, 91, -183,146,144,144, 16,198,207,207, 47,203,205,205,109, 72,115, 52,189,189,189,127, 24, 62,124,184,102,239,222,189,228,252,249,243, -228,192,129, 3,100,209,162, 69,164, 87,175, 94,229,174,174,174,111, 24,170,217,174, 93,187,250, 12, 62,252,253,253,121,108,129, -203,106,178,154,172, 38,107,176,254,187, 6,171, 26,238,159,112, 2,254, 41,154,255,217,139, 68,161, 80,136, 91, 91,211,214,214, -182,163,151,151,215,185,206,157, 59,231, 7, 6, 6,102,121,123,123, 31, 81, 40, 20, 14, 45, 76,167,159,191,191,255, 33, 63, 63, -191, 39,254,254,254,247,125,124,124,190,175,158,102,162, 5,233,236,236,227,227,115, 33, 40, 40,168, 32, 48, 48, 48,211,211,211, - 51,172, 86,228,138,205, 75,172, 38,171,201,106,178,154,172,193,106,178, 1,169,205,159,241, 24,143,127,138,230,127, 22,165, 82, -169,106,109,205,244,244,244, 59,233,233,233,175,180,114, 58,163,149, 74,229, 91,173,156,206,235,233,233,233,189,217, 92,192,194, -194,194,194, 98, 8, 52,123, 8, 88, 88, 88, 88, 88, 88, 88, 88, 90, 23, 10,245,135,249,154,242,164,236,230,132, 10,239,177,154, -172, 38,171,201,106,178,154,172, 38,171,249,159,211,172,173, 93,187, 47,107,237,209,191, 63,128,165, 85, 78, 12,171,201,106,178, -154,172, 38,171,201,106,178,154,255, 61,205,127, 21,108, 19, 33, 11, 11, 11, 11, 11, 11, 11, 11,107,176, 88, 88, 88, 88, 88, 88, - 88, 88, 88,131,197,194,194,194,194,194,194,194,194, 26, 44, 22, 22, 22, 22, 22, 22, 22, 22, 22,214, 96,177,176,176,176,176,176, -176,176,176,176,176,176,176,176,176,176,176,252, 87, 32,236, 33, 96, 97, 97, 97, 97, 97, 97, 97,189, 72,203, 96,155, 8, 89, 88, - 88, 88, 88, 88, 88, 88, 88,131,197,194,194,194,194,194,194,194,242,207, 48, 88,108,211, 32, 11, 11, 11, 11, 11, 11,203,203,228, - 95,233, 69,122, 85,237, 88, 47,246,252,178,176,176,176,176,176,176,176, 94,132,133,133,133,133,133,133,133,133,133,133,133,133, -133,133,133,133,133,133,165,249,176, 79, 26,103, 53, 89, 77, 86,147,213,100, 53, 89, 77, 86,243, 63, 7, 59,138,144,133,133,133, -133,133,133,133,133, 53, 88, 44, 44, 44, 44, 44, 44, 44, 44,172,193, 98, 97, 97, 97, 97, 97, 97, 97, 97, 13, 22, 11, 11, 11, 11, - 11, 11, 11, 11, 11,107,176, 88, 88, 88, 88, 88, 88, 88, 88,254, 54, 80,168,127, 36,192,189, 38,232, 52,103, 52,193, 61, 86,147, -213,100, 53, 89, 77, 86,147,213,100, 53,255,115,154,141,105,223, 3,203,159, 98,188, 88, 77, 86,147,213,100, 53, 89, 77, 86,147, -213,252,239,105,254,171,224,178,135,128,133,229,159, 13, 57, 4, 14,172, 58, 56,131, 33,182,224, 10,148, 56,127,247, 41,181, 20, - 76,139, 53,109, 61,157,160,214, 90, 67, 44,202,198,111,119, 18, 90,170,201,194,194,194,194, 26, 44, 22, 22,150,127, 14, 10,119, - 55,232,177, 26, 28, 40, 64, 52,241,232,238,185, 26,120,208,178, 16,187,133,187, 27,180,204, 74,112,105,123,168, 53,143,209,179, -195, 26, 32,246, 1,123,176, 89, 88, 88, 88, 12,227,165,116,114, 15, 8, 8,184, 29, 16, 16,176,162, 87,175, 94, 66,246, 20,176, -176, 52, 31,114,215, 91, 2,157,126,144, 90,203,216,157,142, 44,176, 42, 43,215,187,129,175, 27, 76,174,184, 26,183, 72,147, 71, -189, 90,174,101, 28,127,252,189,204,186,180, 92,231, 1, 26, 45,210,172,198,203,203,203, 52, 48, 48,240,180,175,175,175, 37,123, -246, 88, 88, 88, 88,131,213,202, 48, 12,227,111,101,101, 53, 75,165, 82, 37,117,234,212,105,216,127,233,128,119,238,220, 57,178, - 75,151, 46,153, 93,187,118,205,236,218,181,107, 84, 99,203,255,141, 40, 20, 10, 55,111,111,239, 36, 79, 79,207,199, 53,151,203, - 59,190,222,205, 61,120,194, 18, 11,207,225,189,216, 75,211, 64, 74, 25,107,208,156, 62, 15, 18,203, 36, 25, 5, 90,235,219,177, -101, 82, 16, 78,111,104,160,104,145, 38, 67,250,198,196,171,140,174, 62,149, 91, 95,186, 87, 33, 3,161,251,128, 80, 54, 45, 77, -174, 64, 32,248,128, 16,210,159,199,227,205,100, 79,222,127, 30,111, 0,195, 0, 4,182,162,230,151, 29, 58,116, 72, 3,240, 9, -123,120, 89,254, 49, 6,235, 77,103,116, 31,219, 22, 17,163,156, 81, 60,186, 45, 74,198,183,197,229, 55,218,161,217, 21,225,145, - 35, 71,196,161,161,161, 86,158,158,158, 97, 65, 65, 65,151, 59,117,234,228,218, 28,157,128,128,128,211, 1, 1, 1,111,213, 94, -214,169, 83,167,209, 53,151, 5, 6, 6,222, 15, 12, 12, 44, 12, 8, 8,120,106,136,174,191,191,255, 19,127,127,255,210,128,128, -128, 39, 53,151,119,234,212,105,116, 96, 96,224,233, 90,255,247, 86,237,101,245, 30,112,154,182, 63,118,236,152,213,137, 19, 39, -172,184, 92,174,117,237,229,199,143, 31,127, 97,121, 51,142,199,148,128,128,128,200, 90,251,242, 94,237,234,112, 30, 91, 0, 0, - 32, 0, 73, 68, 65, 84,101, 13,209,169, 83,167, 72,127,127,255,247,106,233, 70, 6, 4, 4, 76,105, 13,115,213,179,103,207,203, -209,209,209,142, 82,169,212,180,230, 58, 27, 11,211, 1,145,199,191,153, 53,233,173, 87, 63,144,123,140,240, 97, 47,207,134, 33, - 15, 61,248,208, 49, 61, 25,134,200, 31, 60, 45,151, 15,126,237, 77,110,204, 19,149, 92,171,211,155,131,226,244, 38, 23,156,132, -205,210,212,106,131, 25, 66,172,207,197,240,229,189,135,126,204, 9,191,203,149,107,245,122, 11,104,209,171, 57,154, 53,242, 33, -143,195,225,204,154, 58,117, 42, 77, 81,212,199,237,218,181, 19,252,151,206, 87,144, 55,236,250,118,226,220,240,247, 64,247, 86, -148,245,146, 72, 36,183, 0,184,253,195, 14,135, 63, 0, 9,128, 95, 1, 88,163,117,186,171,108, 88,190,124,249,231,247,238,221, -179,109,219,182,237, 50, 0, 28,182,148, 96,249,219, 27,172,209,206, 88,106,109, 99,119,102,225,134,125, 61,119, 68, 36, 24,127, -123, 44,202,104,214,220,144,238, 54,102,242,147,227,219, 97, 77, 3, 63,189,215,192,157, 44,158, 62,125,138,205,155, 55,139,150, - 46, 93,218,205,196,196,228, 78, 80, 80,208, 70, 15, 15, 15,163, 70,146,243,130, 38, 33,164, 59,143,199,219, 17, 20, 20,180,187, -186,192,166, 40,170,187, 80, 40,252, 33, 40, 40,232,199,234,102,200, 78,157, 58,181,189,113,227,134,140,162, 40,107, 67,210, 25, - 20, 20,164,184,125,251,182, 4,168,140, 4,244,234,213, 75, 24, 24, 24, 24,106,103,103,183, 13,168, 44, 32,219,181,107, 39, 8, - 10, 10,218,237,224,224,176,157,162,168,238,134,236, 59, 77,211, 48, 53, 53,197,190,125,251,192,225,252,239,250,167, 40, 10,166, -166,166,248,233,167,159, 64, 81, 84,147,143,167,135,135,135, 81, 64, 64,192, 17,133, 66,177,145, 97,152,174, 0,224,237,237, 45, - 9, 12, 12, 60,108,103,103,183,169,122,153, 33,154,132,144,174,124, 62,127, 99, 96, 96,224, 97,111,111,111, 9, 0, 48, 12,211, -149,203,229,110, 8, 8, 8, 56,210,148,115,228,231,231, 55,213,199,199, 39,221,199,199, 39,221,205,205,109,149,181,181,245,133, - 45, 91,182, 88,212,220,247,234,200, 85,102, 86,110,126,228,205,251,177,179,166,190,217,219,209,193,122,188, 73,199,225, 38,134, -236,123, 11,248,103,107,230, 82, 86,160, 72,191,216, 36,149,168,141, 75,128,145,149,251,155,144,155,114,133, 87, 31,150, 74,193, -193, 43,224, 73,228,205,211,228,190,114, 63, 65, 37, 54,107, 59, 72, 18,216,165, 39, 40, 35, 87,225,133,232, 82, 25,184,116,243, - 52,107,220,167,117,237,218, 85,208,175, 95, 63,216,218,218,114, 76, 76, 76,198,255,235,207, 81, 13,115, 37, 21, 9,174,175, 95, -254,105,128,173,133,228, 23, 3, 77, 86, 99,233,244,178,178,178, 10,255,230,155,111, 58, 73,165,210,139, 6,154,172,191,195,241, -244, 7,192, 7,112,173,234,251, 3, 0,193, 45,212,220,176,116,233,210,153,243,231,207, 71,113,113, 49, 38, 77,154, 36, 3,176, -222, 80, 77, 99, 99, 99, 23, 31, 31,159, 31, 61, 61, 61,147,125,125,125,213,238,238,238,229,110,110,110,137, 94, 94, 94,123,132, - 66,161,243,191, 61,127,254,141, 52,235,191,249, 35, 68, 64, 8,233, 67, 8,121,141, 16,242, 10, 33, 36,168,234,115, 96,213,235, - 53, 66, 72,191, 90,239,129, 85,191,173, 94,223,185, 30,141,215,106,255,174,198,111,106,127,127,225,179, 33, 6,139,212,122,127, -206, 91,109,209,205,194,198,238,243, 47,143,222, 20, 51,113, 49,184,253,110, 95,196,126, 50, 2,226, 39, 49,152, 55,125,158, 88, - 42, 53,155,254,102, 91,244,105,206, 1,123,252,248, 49,194,194,194, 96,105,105, 73,237,220,185, 83,248,214, 91,111,125, 32,147, -201, 82, 2, 2, 2,198, 27,170,193,225,112,244,187,119,239, 54, 30, 62,124,248, 24,115,115,243,251,254,254,254,109,105,154,214, -239,221,187,215,120,244,232,209,111,169,213,234,135,157, 58,117,114,141,138,138,210,223,188,121, 19, 52,109, 88,208,238,246,237, -219,186, 83,167, 78, 85, 71,116, 92, 9, 33, 15,215,172, 89, 51,230,231,159,127,150,154,152,152, 48,254,254,254,109, 29, 28, 28, -238,127,249,229,151,227, 15, 31, 62, 44,149,201,100, 6,141,176,162, 40, 10,229,229,229, 16,137, 68, 47, 24, 41,138,162,160, 82, -169, 32, 20, 10, 13, 78, 99,141,200,128,151,133,133,197,163,213,171, 87, 15, 63,122,244,168, 88, 42,149, 34, 32, 32,192,195,212, -212, 52,118,237,218,181, 35,126,249,229, 23,177, 84, 42, 53, 88,143,207,231,227,167,159,126,146,140, 27, 55,110,152, 80, 40,124, - 20, 16, 16,224,193,231,243,177,127,255,126,201,248,241,227,135, 72, 36,146,135,254,254,254, 94,134,104,105,181,218,197, 55,111, -222, 84, 92,184,112, 65,225,228,228, 52,227,219,111,191,181,230,241,120, 0, 0,189, 94,255, 66,228,106,252,200,254,157,103, 46, -254, 38, 92, 85, 94,161, 94, 57,111,114,111,158, 30, 93,216,123,160,122, 10,155, 67,224,128,209,251, 3,104, 31,245, 88,101,233, -219,115, 60, 23, 89,191, 34,200,195,152, 27, 17, 85, 98, 69, 8,113,130,142, 4,145, 11,189,184, 77,210,228, 16, 95, 80,140,235, -153,104,202,178, 91,191,241,220,164,164, 36, 56,123,244,230, 28,191, 9,107, 66,136, 51, 24, 4, 52, 69,179, 38, 60, 30,111,201, -168, 81,163,140, 18, 19, 19,209,173, 91, 55,137, 64, 32, 88,220, 26, 81, 60,114,205,205,137, 68,184,246, 38, 87, 92, 21,205, 77, -219,159, 29,185,146,137, 4,215,246,255,120,192,214, 39,120, 10,181,237, 83, 39,115,185,148,247, 75, 11, 35, 89, 94, 86, 86, 86, -231,175, 95,191,110,241,234,171,175, 98,233,210,165,114,153, 76,102,168,201,122,217,145,171,106,115, 37, 70,101,243, 96, 26, 0, -251, 22,104,110, 90,186,116,233,204, 5, 11, 22,224,218,181,107, 88,187,118, 45, 6, 13, 26, 4, 51, 51,179, 70,203,143,183,223, -126, 91,210,173, 91,183,219,195,134, 13,139,153, 57,115,230,248,227,199,143, 59,236,222,189,155,255,206, 59,239, 8, 71,141, 26, -229,244,233,167,159, 78, 28, 60,120,240,189,160,160,160,235,111,190,249,166,168,153,198,128, 34,132, 80,108,169,101,216,225,170, -207,139, 0,232, 56,127,254,252, 32,138,162,142,207,159, 63, 63, 0,128, 37, 69, 81,199, 1,200, 1,200,171, 62, 11,106,189,203, - 9, 33,253,106,172,183,168, 75,163,250, 85,243,119,213,191,169,227, 63,106,127, 54, 40,130,213, 11,192,197,218, 27,112, 9,150, - 79,157,181, 66,244,108,207,215, 80,254,184, 1,116, 78, 26, 56, 5, 25,168,184,248, 43,180,151,142, 97, 66,215,174, 98, 49, 69, -173,108,206,145,148, 74,165,224,243,249,136,139,139,195,195,135, 15, 49,120,240, 96,254,230,205,155, 77,189,188,188,126,232,214, -173, 91, 76, 64, 64, 64, 71, 67, 12,139,139,139, 11,198,140, 25, 35,248,228,147, 79,218,137, 68,162, 40, 66, 8,207,217,217, 25, -163, 71,143,230,207,157, 59,183,141, 72, 36,186,201, 48, 12, 95, 34,145, 52, 20, 29,250,131,174, 88, 44, 6, 0,158,171,171,235, -173,176,176, 48,231,238,221,187,115,207,156, 57,131,162,162, 34,174,155,155, 91,204,254,253,251,219,119,235,214,141,123,249,242, -101,148,150,150, 18, 67,117, 75, 75, 75, 33, 22,139,255, 96,176, 74, 75, 75,255, 96,188, 26, 35, 32, 32, 96, 74,251,246,237,111, -134,133,133,217, 7, 7, 7,115,194,195,195, 81, 92, 92, 12, 39, 39,167, 91, 97, 97, 97,246,221,187,119,231, 68, 70, 70,162,184, -184,216, 96, 77,129, 64, 0,103,103,103,140, 26, 53,138, 55,103,206, 28,123, 30,143,119, 83, 32, 16,192,201,201, 9,163, 70,141, -226,207,158, 61,219, 94, 32, 16, 92, 55,176,201,144, 3, 0, 58,157, 14,111,189,245,150,145, 88, 44, 70, 74, 74, 10, 24,134, 1, -195, 84,122, 82,101,118,238,221, 43, 55,239, 61,154, 53,237,173, 94,165, 21, 21, 21,191, 93,184,245,208,211,213,201,158,162, 72, - 27,182,188,169, 7, 51, 79, 11,112,208, 63, 41, 93, 45, 20, 24,217, 75,141, 45, 59, 0,121, 23,209,214, 86, 8, 16, 74,116,243, - 81,153, 17,104,210, 31,200,177,104,146,166,158,233,159,144,166, 22,106,196,222,198,182,118,142,200,205,205,133,131,179, 59, 42, - 32, 23, 68,222, 43, 53, 6,105,162,102, 21,190,190,190,193, 14, 14, 14, 54,109,218,180, 65, 78, 78, 14, 92, 92, 92, 96,108,108, -108,230,239,239,223,191,217, 37,241, 5, 39, 33, 10,209, 29, 26,106, 61, 40,122, 25, 8,119, 53,184,217,254,228,182, 63,239,111, -103,174,126, 58, 96,103,161,112, 7,238,189, 11,107,115, 1,118,206,247, 53,151, 75,133,205, 53, 89, 94,214,214,214,231,175, 95, -191,110, 41, 18,137,112,251,246,109,120,122,122,226,235,175,191,150,155,153,153,253,157, 77, 86, 77,115,101, 14, 64, 5,128, 1, - 48,182,153,209, 16, 10,192,214, 21, 43, 86,204, 88,176, 96, 1,174, 94,189, 10, 59, 59, 59,100,101,101, 33, 56, 56, 56, 41, 63, - 63,191,193,122,201,211,211,211, 62, 46, 46, 46,237,211, 79, 63,245, 15, 13, 13, 21, 27, 25, 25,161,160,160, 0,219,183,111,199, -252,249,243, 65, 81, 20, 8, 33,216,181,107,151,100,242,228,201, 65,241,241,241,105, 78, 78, 78, 6,117,223,168, 50, 85, 2, 66, -136, 4,128, 17, 0, 9, 33, 68, 52,125,250,116, 1, 0, 97,149,185, 20, 1,224,177,133,217, 31,168,211,139, 0,176, 92,179,102, - 77, 8, 33,100,200,154, 53,107, 66,106,212,157,199, 27,168,111,107,154, 38, 0, 64,109, 13, 66,200,144,154,239, 53,127, 75, 8, - 25, 66, 8, 25, 82,243,247, 13,253, 95, 67, 6,235, 66,213,142,213,182,147, 29,109,218,118, 64,193,239,135, 32,230, 80, 47,188, -232,132,187,112, 16,113,161, 37,196,171, 57, 71,209,216,216,248,249,139,166,105, 40,149, 74,112, 56, 28, 44, 94,188, 88, 52,125, -250,116, 31, 62,159,127, 53, 56, 56,120,117, 99,134, 5, 0,110,220,184, 1, 23, 23, 23,106,193,130, 5,178, 94,189, 42,239, 98, -239,220,185,131,246,237,219, 83,171, 86,173,146, 14, 29, 58,148,146, 72, 36, 6, 71,135,104,154,134, 88, 44, 70,239,222,189,169, -221,187,119, 27, 11,133, 66,156, 56,113, 2, 57, 57, 57,120,245,213, 87,185,187,119,239, 54, 22,137, 68,136,136,136, 64, 97, 97, -161,193,186, 20, 69,161,162,162,162, 78,131, 85, 87,100,171, 33,186,118,237,186,211,198,198,102, 99,104,104,168, 80, 44, 22, 35, - 60, 60, 28,133,133,133, 24, 51,102,140,238,167,159,126, 18,201,100, 50, 68, 70, 70,162,176,176,176, 89,185,252,198,141, 27,104, -223,190, 61,181,112,225, 66,113,215,174, 93,181, 0, 16, 29, 29, 13, 87, 87, 87,106,225,194,133, 98,153, 76,182,161,123,247,238, - 59, 27,210, 96, 24, 6, 74,165, 18,247,238,221, 67, 66, 66, 2,114,114,114,144,157,157,141,226,226, 98,232,116, 58, 0,128,164, -184,232,196,214,221,199, 98,140,196, 98, 73,103, 31, 87,199,235, 81, 15,178,140,196, 98,137,171,179,163, 27,176,148,125,156,211, - 31,175, 73, 10, 60,181, 43, 8,229,127,237, 65,137,121,240,128,177,124,100,159, 2,136, 22,160,184,232,211,217,158,251,203,229, - 82,107, 48,232, 8, 62,220, 9, 1,101,144, 38, 87,227, 2, 80, 1,103,110,235, 44,122, 12,248,128,159,154,154, 10, 62,159, 15, -161, 80, 8,191,238,111,112,247,135,107,109, 0,248,130,135, 14,134,104,214, 68, 40, 20,126, 49,121,242,100,163,180,180,180,231, -154,131, 6, 13, 50,146, 72, 36, 75,154,109,174,104, 73, 87,232,200,204,251, 9, 42,167, 85,123,148,238, 79, 83, 84,238, 32,152, - 13,173,214,175,165, 38,203,209,209,177,183,171,171,107, 66,155, 54,109,122,180,208, 92, 93, 13,251,233,128,157,185, 77,165,185, -130,190, 12,224,136, 97, 99,101,134,157, 75,122,155,203,101,226,166,154, 44, 47,107,107,235,115,215,174, 93,179, 20,137, 68,184, -117,235, 22, 4, 2, 1, 68, 34, 17,124,124,124,176,109,219, 54,185,185,185,249,223,197,100,153, 1, 24, 0,224, 77, 0,111,212, - 48, 87,206, 0,250, 2,232, 15,192, 6, 64, 4,128, 24, 3, 53,123,112, 56,156, 19, 29, 59,118, 76,231,114,185, 15, 66, 66, 66, - 62,154, 59,119, 46, 54,109,218,132,222,189,123, 63,157, 55,111, 30, 98, 99, 99,117,101,101,101,195, 0, 52, 88, 17,150,148,148, -252,186,112,225, 66,147,215, 95,127,189,250, 59, 46, 95,190,140,189,123,247,194,200,200,168,166, 89,194,208,161, 67, 49,101,202, - 20, 51,181, 90,125,164, 33, 77, 43, 43,171, 87,194,195,195, 93, 1, 8,170, 12, 84,181,193, 50, 58,123,246,172,169, 72, 36, 50, - 15, 10, 10,146, 85, 45,151,188,254,250,235, 22, 92, 46,183, 7, 91,170,189, 64,157, 94,164, 62,131, 83,219, 0,213,181,174, 46, -243,212,236,242,183,129,255,107,200, 96,245,174,202,232,127, 64,147,151, 9, 33,244,144,112, 40,136,185, 84,229, 59,135,130,152, - 98,192,205,207, 4,213,204,224,167,177,177, 49,164, 82,233, 31,140,150, 74,165, 66, 73, 73,137, 65, 70,163,186, 47,143,153,153, -217,243, 74,219,216,184,114, 52,185,185,185, 57, 42, 42, 42, 64, 81, 20,140,140,140, 96,100,100,212,164, 8,150, 72, 84, 25, 17, -142,140,140,196,149, 43, 87,192,229,114, 97,110,110, 14, 0,184,117,235, 22,238,222,189, 11,129, 64, 0, 11, 11,139, 38,233,106, - 52,154, 58,155, 8,213,106,117,147,154, 8,105,154, 70,121,121, 57,185,117,235, 22,238,221,187, 7,161, 80, 8,185, 92, 14,129, - 64,128,148,148, 20, 60,122,244, 8, 2,129, 0,114,185,188, 89,231, 71, 38,147,161,160,160, 0, 12,195, 84, 71,243, 32,147,201, - 80, 82, 82, 2,154,166, 13, 74, 39,195, 48, 72, 75, 75, 67, 78, 78, 14,146,147,147,145,157,157,253,220,100, 85, 55, 17,178, 52, -145,203, 94, 38,160,120,175,102, 23,104,133,217, 37, 2, 19,235,246,253,128,156, 83, 0,197, 1,120,102,232,226,223, 22, 73, 25, -122,163,216,100,181, 8, 90, 12,192,121, 55, 51,131, 52, 57,188,254, 89,133, 90, 97, 98,129, 92,230,225,221, 9, 89, 89, 89, 16, - 10,133, 16, 10,133, 8,232,242, 10, 18,210, 25,201,131,103, 42, 9, 8, 94, 53, 72,179, 10, 63, 63,191,118, 98,177,184,171,191, -191, 63,149,153,153, 9,161, 80, 8,145, 72,132,174, 93,187,130,166,105, 31, 95, 95, 95,247, 38, 21,112,241,237, 4,224, 73,186, - 0,100,230,163,103,101,182,191, 68,170,220,134,142,120,195,124,195,193, 44,247, 71,207,202,157,161,214,205, 65,169,166, 83,115, - 77,150,147,147, 83, 47, 99, 99,227,227, 95,124,241,133,179, 80, 40, 60,213,166, 77,155,224,102,149,111, 66,206,247, 95,204, 28, -107,103, 86,109,174,116,165, 0, 71, 12,112, 36,149, 38,203,218, 18, 43, 63,233,103, 46,225,243,254,207, 80, 77,177, 88,188,127, -235,214,173,242,106,115,197,231,243, 33, 18,137,158,191,252,253,253,177,120,241, 98,185,185,185,249,190,151,156, 75,205, 81,217, -175,234, 14,128, 35, 0,206,213, 48, 87, 46, 0,254,175, 42,106, 21, 5, 32,201, 64,205,110, 3, 7, 14, 12,127,250,244,233,224, -152,152, 24, 69, 70, 70,134,251,236,217,179,177,113,227, 70,204,157, 59,119, 31, 33,196,237,208,161, 67,126, 55,110,220,240, 49, - 36, 34,150,145,145, 49,110,222,188,121, 57, 57, 57, 57, 0, 0,111,111,111, 20, 20, 20, 96,206,156, 57,152, 57,115,102,117,222, - 5, 0,100,101,101, 97,221,186,117,153, 25, 25, 25,147, 26,210,212,235,245, 41, 63,255,252,115, 87,181, 90,237, 88,101, 40,133, - 0, 36, 73, 73, 73, 38,165,165,165, 50, 14,135, 35, 53, 50, 50,146, 9,133, 66,163,201,147, 39,243, 31, 60,120,224,161,211,233, -210,216, 66,237, 5,234,245, 34,117, 69,154,234, 91,214,220,237, 13, 53, 89, 77, 53, 88, 17, 0,122,254,193,192, 80,184,147,124, - 51, 2,230,158,254, 47, 70,176,184, 20, 36, 82, 25, 18,210, 82,192, 7,117,191, 25, 9,124,110,170,106,154, 44,165, 82,137,121, -243,230,149,253,248,227,143,119,213,106,117,215, 75,151, 46,205, 55, 36,130,101,101,101,133,228,228,100,242,213, 87, 95, 21,157, - 58,117, 74, 87,189, 44, 37, 37,133, 44, 90,180,168,248,192,129, 3,164, 41, 77,132,213, 17,172,136,136, 8,178,100,201,146,194, -244,244,116, 98,110,110, 14, 11, 11, 11,156, 61,123, 86, 55,127,254,252,194,248,248,120, 98,110,110, 14,115,115,243, 38, 25, 44, -157, 78, 7,177, 88,252,130, 65,161, 40, 10, 90,173,246, 15,145,173,134,184,114,229,202,187,133,133,133,159,206,153, 51, 71,245, -240,225, 67, 34,151,203, 33,151,203,177,103,207, 30,238,196,137, 19, 85,119,238,220,121,190,172, 57, 88, 90, 90,226,241,227,199, - 36, 36, 36, 68,117,238,220, 57, 30, 0,200,229,114,196,198,198,146,229,203,151,171, 10, 10, 10, 62,189,114,229,202,187,141, 20, - 56, 72, 72, 72, 64, 81, 81, 17,244,122, 61, 42, 42, 42,144,157,157,141,212,212,212,231, 6, 75,101, 36, 27,248,241, 59, 67,125, - 75, 85,170,178,235,119,227,146, 59,251,123, 90,149,170, 84,101,113,207,146, 31, 3, 75,217,217,195,255,112,241, 48, 54, 32,164, -199,229,187, 37,166,253, 95, 27, 45,160,138,110, 0,218, 18,128,103, 6,240, 76,193, 21, 89, 96,208, 43,126,156,221,191, 21,217, -128, 98,186, 65, 36,108,188,127, 11, 67,172,193, 48,193,103,111,149,155,245, 24, 60, 93,144,151,151, 7,154,166,159, 27, 44,137, -145, 17, 94, 25,242, 54,189,235,183, 10, 27, 48,164, 59, 56, 28,131,251,204,240,249,252,207,223,121,231, 29,126,126,126,254, 11, -154, 98,177, 24, 35, 70,140, 16, 74,165,210, 69, 6,239,250, 67, 15, 62, 50,133, 93,192,144,153,177,137, 42,219,159,175,168,220, -102, 47,222, 37,246,234,216, 25,211,134, 91,137, 87,133,102,121,198,196,151, 57,131,214,207, 66,153, 58,128,108,107,154,201,106, -211,166, 77,176,145,145,209,137,163, 71,143, 74,250,244,233,131,217,179,103, 27, 9,133,194, 83, 78, 78, 78, 61,155,122,154, 74, -139,245, 31, 47,223, 16,154,121,231,224, 0, 64, 87, 92,101,174,254,247,202, 42,100,176,120,107,120,161, 86, 79,198, 26,170,169, - 82,169, 38,190,247,222,123,185, 71,142, 28,249,131,185, 18,137, 68,120,246,236, 25, 86,173, 90,149,151,151,151, 55,233, 37,231, - 82, 63, 0,209, 0,202,171,162, 17, 18, 84,142, 20,236, 10,224, 44, 0, 61,128, 76, 0, 74, 67, 5, 57, 28,206,220,111,191,253, -150,171, 82,169, 48,101,202, 20,164,164,164, 32, 61, 61, 29, 11, 23, 46,124,198, 48,204,196, 42,205, 24, 0,143, 12,209,211,104, - 52,177,249,249,249, 67, 6, 14, 28, 88,144,159,159,143,142, 29, 59, 98,200,144, 33,176,177,177,129,173,173, 45,134, 13, 27, 6, - 87, 87, 87,228,230,230, 98,236,216,177,121,217,217,217, 3, 0, 52, 56, 10, 61, 55, 55, 55,254,224,193,131,241, 31,125,244, 81, - 96, 74, 74,138, 55, 0,133, 86,171, 53, 87,169, 84, 82,157, 78,103, 44,147,201, 44, 58,117,234, 36,159, 54,109,154,233,205,155, - 55, 61, 83, 83, 83, 75,154, 96, 48,255, 43,212,233, 69,154, 11, 69, 81, 39, 90, 18,169,170, 43, 2,102, 40,213, 53, 60, 85,235, -253,127,153, 16, 88,188,247,240,222,114,129,147, 43, 76,220,125, 33, 17,137, 32, 22, 10, 32, 54, 53, 71, 57,195, 96,199,179,140, -178, 82, 66, 22, 53, 35,241, 47, 68,174, 24,134,193,182,109,219,202, 87,174, 92, 89,144,145,145, 49,237,210,165, 75,190,183,110, -221,186, 99,136, 17, 42, 42, 42,194,161, 67,135, 84,187,119,239,126,170, 82,169,252,249,124,190, 86,173, 86, 99,223,190,125,229, - 27, 55,110, 76, 44, 43, 43, 11,228,241,120,154,166, 52,191, 85,247,193,226,241,120,218,242,242,114,255,176,176,176,248, 19, 39, - 78,168,100, 50, 25,120, 60,158,182,172,172,204, 39, 52, 52, 52, 54, 44, 44, 76, 37,147,201,154,100,220, 24,134,169, 51,130,165, -215,235, 33, 20, 10,155,212, 7,235,214,173, 91,219, 53, 26, 77,231,125,251,246,165,238,218,181,171, 92, 38,147, 1, 0,180, 90, -109,224,222,189,123, 83,191,255,254,251,138,166,116,112, 7, 0,181, 90, 13,189, 94,143,208,208,208,138,253,251,247,167,234,116, -186,192,234,101,187,118,237, 42, 15, 13, 13, 77,213,104, 52,157,111,221,186,181,189, 49, 45,189, 94,175, 47, 40, 40, 0,151,203, -197,211,167, 79, 43,132, 66, 33, 56, 28, 14,226,226,226,158, 27, 44, 43, 75,115,207,238,129,222,238, 95,127,127, 40,194, 72, 40, - 20, 14,232, 29,224,241, 32, 46, 41,149, 16, 42,145, 45,107,234,170, 25, 32, 1, 5,113, 92, 74,133, 84,196,211, 82,200,248, 63, -128,111, 86,101,176, 42, 95,182,118,246,184,249,168, 76, 10, 10, 2,168,181, 86,141,106,106,137, 17, 40, 72,238, 37, 65,202,229, -139,169,140,140,140,231,145,166,106, 67,228,220,222, 3, 81,113, 37,198,160,136, 16,149, 67,235, 13, 46,168,140,141,141,185, 74, -165,242,185,214,115, 77,103,103,142, 86,171, 29, 96,240,190,103,235, 21, 96,152,143, 31, 39,151,219, 30,189,162,114,157,181,120, -151, 88,204,201, 7, 18, 55,193,203,213, 6,179, 39,249, 10, 22,238,200,246,186,249,160,172, 29, 40, 50, 13, 94, 37, 6,223, 93, -180,105,211,166,135, 68, 34, 57,117,244,232, 81,137,145,145, 17,158, 62,125,138,142, 29, 59, 98,197,138, 21, 18,137, 68,114,210, -209,209,177,119, 83, 78,211,245,199, 72, 42, 41,214,119,253,124, 91, 74,198,157,103,250, 74, 99, 69, 87,154,171,236, 66,130,247, -190, 56, 86,144, 95, 84,254,198,181,123,186,243, 77,144,141, 46, 44, 44,124,245,139, 47,190,200,205,201,201,121,193, 92, 37, 37, - 37, 85, 27,129,222, 0,238,191,228, 92,106,132,202,206,235, 29, 0,180, 7,224, 11, 64, 7,160,184,202, 8, 53, 25, 79, 79, 79, -127, 39, 39, 39,124,247,221,119,216,177, 99, 71,254,215, 95,127, 13, 66, 8, 92, 93, 93,101,205,213,204,202,202,186, 17, 27, 27, - 59,192,215,215,247,225,150, 45, 91, 82, 21,255,207,222,119,135, 71, 81,237,239,191, 51,179,189,164,145, 30, 8,129, 64, 72, 72, - 8, 37,244,222,164, 74, 23, 5, 20,165, 72, 85, 4, 47,136, 32,160, 72, 7,169,162, 20,165, 55,129, 0, 82,165, 72, 71, 66, 13, - 37, 9,164, 64,122,223,180,221,108, 47, 51,231,247, 71, 18,164,164,108,128,251,189,247,231,157,247,121,246,201,206,236,204,155, -211,230,156,119, 62,159,207, 57,199,219,155, 27, 55,110, 28,198,142, 29, 11,119,119,119,118,221,186,117,169, 29, 59,118,140,122, -242,228,201, 59,122,189,254,161, 61,205, 61, 47, 47,239,250,214,173, 91,111,117,239,222,221, 97,244,232,209,158, 91,182,108,241, -122,252,248,113,109,189, 94, 95, 51, 55, 55, 87,113,229,202, 21,201,206,157, 59,189, 98, 98, 98,146,140, 70,227, 45,148, 31,208, -253,191,138, 10,181, 8, 0, 85,169,208, 49,191,244, 87, 85,197,111,246,222, 91,238,119, 59,174,171, 16, 85,206,184, 57,152,136, -235, 31,213, 43, 90,177,112,219,230,175, 70, 54,110, 40,171, 83, 55, 24,172,182, 8, 15,179,179,177, 51, 75,173,183, 18,242, 83, -120, 34, 46,190,174,192, 98, 24, 6,103,206,156, 97,247,238,221,107, 33,132,252,162,209,104,230, 62,122,244, 72,103, 47, 15,199, -113,204,152, 49, 99,180,133,133,133,135,179,178,178, 38, 62,125,250,212,220,161, 67, 7,230,195, 15, 63,212, 22, 20, 20, 28,163, - 40,106,220,221,187,119, 77,237,219,183, 7, 33,246,183, 99,138,162, 32, 18,137, 64, 81, 20,238,220,185,147, 20, 28, 28,220,232, -198,141, 27, 63,199,197,197,125, 64, 8, 97, 34, 35, 35,211,194,194,194,154, 92,191,126,125,253,227,199,143, 71,112, 28,199,216, -203, 91,102, 29,123, 94, 72,209, 52,253, 76,212, 81,213,244,185, 70, 70, 70, 70, 7, 7, 7, 7,223,186,117,107,199,248,241,227, -123, 1,144,223,185,115,231, 81,104,104,104,195, 27, 55,110,236,248,228,147, 79,122,151,190, 65,218, 55,126, 91, 44, 24, 52,104, -144, 94,173, 86,159, 46, 46, 46, 30, 21, 21, 21,165, 15, 11, 11, 43, 59,119,166,168,168,104, 84, 53,234,104,193,143, 63,254,248, -109,105, 93,237, 88,179,102,205,167, 51,102,204,112,207,200,200,120, 38,176,114,243, 10, 46,180,123,119, 10,155, 95,164, 54,111, - 91, 51,115,168, 76, 42, 17,207, 93,182,237,146,149,121, 54,141,155,199,243, 16,179, 26, 16, 58,115,104, 55, 23,201,186,159,182, -138, 70, 15,168, 39, 13,109,232, 87, 34,174, 68, 46,184, 29, 83,132,111,127, 56,200, 45,159,228,158, 8, 14,105, 96, 17, 91, 37, -167, 82,160,129,209,154,251,105, 47,145,100,233, 47,211,252,219,247,251, 74, 18, 28,218,234,153, 16,122, 28,125, 7,107, 22, 79, -225,150, 79,172,145, 8,142,202,132,205, 62, 43, 1, 0,216,108,182,161,203,150, 45, 59, 61,122,244,104, 69,163, 70,141,158,113, - 38, 37, 37, 97,249,242,229, 6,147,201,244,158,125,125, 6, 40, 92, 21, 52, 99, 89,214, 99,207,217,252,128, 47,191,152, 40,151, -209, 5, 64,226,202, 18,241, 34,116, 66,179, 80, 55,124,251,133,151,112,250,210,227, 33,215,126,246,215,194, 42, 10, 6,144,105, - 15,191, 64, 32, 56,185,100,201, 18,185, 76, 38, 67,124,124, 60,100, 50, 25,164, 82, 41,154, 55,111,142,181,107,215,202, 63,251, -236,179, 63, 58,119,238,172,188,124,249,178,173, 58, 34,171,117, 32,219,118,230,134, 39, 17, 43,166, 58,123, 53, 9,114, 67, 94, - 49,240,233,119, 39, 10, 11, 52,134,247,171, 41,174,158,137,172,162,162,162,158,211,166, 77, 59,187,125,251,118,215,224,224, 96, -164,165,165, 97,248,240,225,249, 42,149,170,235,127,129,184, 2, 0, 29,128,154, 0,226, 80, 18,139,148,128,146,184,164,215,158, -229, 25, 19, 19, 19,153,146,146,226, 61,118,236, 88,104, 52, 26,151, 97,195,134,225,233,211,167,136,139,139,187,247, 38, 9, 53, - 26,141,183,211,211,211, 27,127,249,229,151, 35,103,206,156,217,222,193,193,161, 46, 33,132,104, 52,154, 68,150,101,175, 1,216, - 11, 84,107, 31, 78, 2, 32,225,201,147, 39,137, 79,158, 60,241,220,177, 99,135,115,105, 25, 0, 37,129,253,234, 82,235, 29, 31, - 35, 81, 61, 75,212,237,255,196,189,255, 39, 24, 90, 23,237, 71,215,163, 46,127,232,143,226, 17,254,208,142,174, 79,217,179,208, -104,185,187,109,135,133,133, 17,155,205, 70,206,158, 61, 75,250,244,233,163,235,208,161, 67,117, 22, 26,125,129,179, 75,151, 46, -175, 44, 52,218,165, 75,151,211,173, 90,181,122, 97,161,209,206,157, 59, 71,119,238,220, 89,221,169, 83,167,167,246,164,179, 83, -167, 78,143,219,183,111,175,235,212,169,211, 11, 3, 73,203,150, 45, 7,118,235,214,237, 5,147, 99,171, 86,173, 6,188,124,174, -162,188,191,243,206, 59,105,113,113,113, 36, 53, 53,149,244,237,219,247, 89,199,223,189,123,247,180,251,247,239,147,184,184, 56, -210,187,119,239,204,234,148,231,243,104,209,162,197,184,142, 29, 59, 94,127, 41,205,159,190,124,174, 50,206,142, 29, 59, 94,111, -217,178,229,167, 47,159,171,198, 66,163, 21,166,211,219,219, 59,176, 89,179,102,185,107,214,172, 33,254,254,254,185,207,255,214, -168,203,152,121, 69, 26,173,102,198,130,141, 7,202, 89,104,148,223,181,190,172,247,126, 20, 44, 34,127, 5,183, 39, 87,130, 79, - 62,222,229,247,104, 84, 79,133,233,238,222,222,132, 60,254,138,220, 56, 56,150,180, 13, 22,179,127,253,236, 27, 71,174, 52,252, -131, 92, 13,236, 68,254, 40,119, 65,207, 87, 57,175,212,239, 72,174, 52,252, 35,102,135,223,163, 65,157,220,205,123,119,109, 38, - 9, 9, 9,228,216,145,189,164, 77,176,188,148, 51,248, 44,185, 18,220,213, 30,206,151,158,249,246,109,219,182,213, 30, 56,112, -128,196,199,199,147,115,231,206,145,118,237,218,233,155, 53,107,214,213,222,188, 19, 2,138, 92, 14, 25,100,187, 24,116,109,246, -112,101,209,167,189,164,166,225, 93,197,230,129,109, 69,150,158, 97, 34, 91,251, 96, 1,219,196,159,230,130,125, 65,122, 54,151, -153,200,149,160,171,228, 90,112, 47,123,211,217,160, 65,131,212, 58,117,234,144,138, 62,129,129,129,170,178, 9, 52,213,173,247, -214,129,240,123,167,165, 36,235,252, 47, 93, 73,255, 78, 14,249,109, 66, 5,221,222, 66, 91,106,230,230,230,150,183,125,251,118, -226,233,233,169, 2,208,232,191,168,205,215, 0, 48, 16,127, 79, 99, 87, 2,232, 10,192,255, 13, 56,219,245,236,217,211, 26, 25, - 25, 73,158, 62,125, 74, 78,159, 62, 77,218,183,111,111, 67, 73,204,206, 63,246,121,255, 31,227,252, 71,154,227,254, 93, 8, 69, - 57,193,134, 97, 97, 97,164, 87,175, 94,134,203,151, 47,107,205,102,243,132,187,119,239, 30,123, 83,206,127, 71, 58,255, 29,156, - 93,187,118,189, 78,211,180,127,233, 20,224,204,243,231,207,135,149,138,194,235, 12,195,248,151, 90,247, 50, 47, 92,184, 16,246, - 79,203,251,243, 34,139,166,233, 51, 0, 76, 25, 25, 25,207,102, 59,185,135, 12,104, 91,195,197,169,107, 81,145,250, 94, 78,244, -177, 63,254,137,121,127, 91,156,228,143,122, 98, 56,136, 91,128,197,172,168,167,250,186,115,183,230,213,235,215,179,157,112,199, -193, 43,220,138,201, 30, 79,218,133, 40,146, 64,113,203,193,154,110, 81, 93, 82, 76,118,115,202,169, 86,128,112,214,253, 39,122, -191, 25, 27, 10, 3,222,233,255, 41,115, 60,124, 51,247,195,100,215, 39,237, 66,148,169, 0,150,131,211, 71,216,203,249,178,200, -146, 72, 36,127,140, 24, 49, 66,185,111,223, 62,131,209,104,236,119,239,222,189,139,213,201, 59,185, 30, 84, 27, 54,106, 49, 64, -124,171, 46, 54, 58, 1, 54,110, 33,213, 45, 54,245,191,161,222, 91, 7,194, 79,225, 32, 57,161, 55,217,166,217,105,185,178, 39, -157,205, 92, 92, 92,118, 23, 22, 22, 14,179,211,114,245,127,153,119,119,148,172,115, 37, 40, 29,107,162, 81, 69, 12,147, 29,156, - 29, 24,134,249,186, 94,189,122, 77,158, 62,125, 26,197,178,236, 15, 40,153,117,246,143, 31, 59,254, 71, 56,121,129,245,166, 21, -208,161, 67,135,187, 44,203,158, 22,137, 68,139, 47, 95,190,108,226, 27, 31,207,201,115, 86,159,243,121,145,117, 55, 78,231,191, -116, 79,129,223,191,134,185,164,218, 33,174, 42,231, 44, 21, 89,183, 98,245,117,150,239, 45,246,155, 62, 76,153,106,135,184,178, - 43,239, 97, 97, 97,237,165, 82,233, 78,131,193, 48,206, 14,113,245,170,192,122, 20, 44, 66,161,181, 38,108, 76, 40,104, 84,188, -213, 14, 71,244, 16, 50, 81,200, 66, 14,245,254, 35, 11,223,150,120, 78,158,147, 23, 88,255,215,248,143,172,122,124,237,218,181, -230,124,209,243,224,241,134,111, 71,125,158,154,201, 31,245,238,192, 65,188,172,121,160,108,202,225,197, 50, 61, 56, 42, 29, 20, -183,182, 10,113, 85, 21,231, 45,200,173,203, 90, 5,202,166, 29, 89, 44,211, 3,200, 6,193,154, 42,196,149, 93,136,140,140,252, - 11,246,187,137, 94, 77, 95,240, 35, 11,128, 36, 66,144,140,239, 43,121, 65,252, 14,132,162,248,224, 97, 30, 60,120,252,143, 9, - 44, 30, 60,120,188, 69,145,245, 40,248, 54,242,153, 25, 96,225, 15,137, 45, 5, 69,182,108,170, 79,138,249, 13, 57,111, 34,159, -154, 10, 14,129, 16,219,158,160,200,252, 70,156,111, 61,223, 37,226,169, 98, 1, 53,159,111, 27, 60,120,240,224, 5, 22, 15, 30, - 60,222, 68,108,148, 88,117,210, 75, 63,255,181,156, 60,120,240,224,241, 63,213, 55,163,226,153, 0,213,241,173,190,206,108,130, - 40,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,231, 56,171,226,230, 99,187,254, 77,194,139,231,228, 57,121, 78,158,147, -231,228, 57,121,206,255, 61,206,127, 20,248,141,116,121,240,224,193,131, 7, 15, 30, 60,222, 50,254,163, 49, 88, 50,215, 6,222, - 16,208, 77, 40,142, 52, 4, 0, 66, 83,143, 97,227, 30, 24,242,227,179,222,152,220, 35, 84,174, 20, 50,123,181, 86,246, 67,228, - 70,233,223, 82,146, 59, 0,240, 67,201,222, 81,215,248,230,195,131, 7, 15, 30, 60,120,240,168,150,192,106,208,118,208, 85,133, - 76, 17, 0, 0, 28, 33, 96, 57, 64, 83,152, 27,145,250,240,207,193, 0,224, 29,210,237,136, 88,225,214,150,227, 8, 56, 66, 96, -227, 8,108, 38, 67, 66,222,163, 83,118,237, 60,175,112, 15, 28,220,237,157,238, 67,250,245,123, 55,168,113,104,227,250, 0,240, - 48,234,225,147, 19, 39, 78,198, 94,248,147, 58,172, 83,197, 29,121,147,140, 41,133,194,121, 45, 91,181,238,117,251,246,205, 57, - 90,224,155,183, 84, 94, 34,114,173,239, 46,170,195,169,238,124,211,225,193,131, 7, 15, 30, 60,120, 84, 91, 96, 41,100,138,128, - 11, 71,183,122, 28,185,154, 6, 0,120,167,185, 23,190, 95,181,125,208,150,135,127,198, 2, 64,219, 78,125, 2,231,126, 57, 10, -215,163, 85, 32,132,160, 89, 64, 13, 12,250,232, 51,187,254,169,212, 51,184,229,208,161,239,125, 56, 99,198,244, 1, 9, 9, 9, -201,251,246,237,187, 10, 0, 29, 59,117, 10, 88,178,100,201, 7, 43, 93,106, 72,246,135, 31,202, 48,230, 60,122,173,253,131, 20, -158,245,220, 26, 6, 5,124,186,247,215, 31, 4,221,250, 14, 31,155,106,213,172,209,229, 60,205,123, 29, 46,113,173, 16,127, 39, -161,232,123,138,166, 5, 38,109,129, 7, 0,184,248, 54, 59, 33,113,240, 96,165, 82,217, 67,157,193,176, 51,247,209,233, 45,224, - 55,236,228,193,131, 7, 15, 30, 60,120, 84, 37,176, 0, 64, 41, 21, 32, 54,169,196, 91,231, 44, 7,198,127,242, 30,114,114,178, - 3, 45, 54, 14, 35,135, 13, 70,100,108, 22,226,146, 84, 32, 4, 8,172,101,247, 94,194, 96,192,181, 24, 51,118, 76,231, 51,103, -207,222,154, 55,119,222, 46,138, 66, 4, 0,108,254,229,215,182,223,126,247,237,184,145,159,140,236, 17, 30, 30, 30, 13,224,181, - 4, 22, 45,114, 94,179,124,241,247,202,140, 60,163,241,139,233, 95, 49, 51,190,156,186, 18,192, 39,175, 35,174,130,125,107, 45, -190,122, 54, 92, 46,151,203,177,101,203, 22, 9,112, 20,243,103,140,145,190,219,175, 31, 88, 48,237,126,248,121, 95,147,179, 98, -241, 88,189, 94, 63, 56, 63,254,207, 44,190, 73,241,224,193,131, 7, 15, 30, 60, 42, 21, 88, 44, 71,240, 56, 49,187, 68,180, 48, - 2,188,219,222, 9, 43, 23,125, 13,131,137,197,253, 68, 53,126,255, 43, 13, 38, 93, 17, 8, 1,218,135,122,148,103,195,121, 97, -170,229,202, 47,100, 97,140, 88, 56, 44, 34, 78, 81,167,134,139,139, 75,252,173, 93,186,111, 63,202, 9, 22,216, 44,119, 23, 29, -111,153,168,112, 16,183, 59, 24, 30, 30,210,191, 95, 63,177,163,163,211, 76,145,115,143, 90,156,209, 50, 93,157,114, 89, 93, 17, -231,203, 80,120,134,116,238,255,110,223,119,189,188, 60,217, 17, 75, 34, 30,255, 52,165,121,237, 6,129, 13,187,196, 89,245,157, -117, 57,113,151, 43,184, 45,170, 60,113, 85,223,219,115,241,229,211,225,114,163,209,136,196,196, 68,228,231,231,151,252, 72, 81, -160,105, 6, 53,189,189,177,126,233,116,249,190, 35,141,155,207, 91,186,241, 40,128, 86,248,187, 20,254, 29,211, 76,121, 78,158, -147,231,228, 57,121, 78,158,243,159,202,249,143, 66,217, 44,194,114,221, 91, 79,210,242, 17,155,152,133,176,134, 53, 81,191,142, - 23,110,197, 23, 98,239,133, 52,108, 59,155,140, 11, 15, 84,224,132, 14,200, 46,166,144,144,146,131,184,228,188, 42,125,100,140, - 88, 56,108,218, 10,245,140, 16,127, 77,155, 75, 7,166,192, 71, 25, 31,242,245,170,162, 41,140, 88, 56,204,195,203,121,223,140, -169, 19, 63,114,144,203,196,102,147, 25,117,235,248, 74, 39,141, 27, 51, 90,164, 84,236,179, 55, 51,110,110,193, 10,177, 76,177, -107,241,183,211,165,171,143,196,167,234,204, 68, 23,126, 61,243,233,140, 89,223,106, 24,161,236, 23, 55,183, 96,133, 61, 60,226, - 90, 33,254,126,174,174,139,175,157, 9,151, 91, 44, 38,100,102,102,194,108, 54,195,102,179, 61,187,134, 0, 40, 54,216,144,152, -101, 64,231, 78,237,153,176,102,141, 26,186, 55,236, 51,129,111, 82, 60,120,240,224,193,131,199,107,225, 31, 21,106, 83,225, 50, - 13, 58,131, 46,225,227, 9, 51,114, 3, 28,178,204,131,187, 6, 3, 4, 80,101, 37, 35,230,214, 25,196,223, 61,139, 98, 85, 42, - 8, 1,234,212,169, 13,145, 33,209,188,121,211,134, 92,206,102, 76,168,136,111, 64, 15,239, 90, 9, 25, 10,122,197,140,218, 17, -241,113, 89,110,147,103,108, 71,124, 92,150,219,138, 25,181, 35, 18, 50, 20,180, 92,196,182,251,100,248, 64,106, 96,191,222,248, -250,235, 25, 24,216,175, 55,102, 76,252,128,146,138,133,109,236,205,140, 81, 44, 93, 54,107,222, 2,135,236, 34,139,249,102,156, -198,164,148,203, 37,127, 61,214,233, 77, 68,102, 25, 48,108,188,202, 36, 18, 44,176, 71, 92,121, 59, 58, 46,190,254,231, 33, 57, - 33, 4,233,233,233,176, 88, 44,176, 90,173,176, 90,173,207,174, 43,210, 90,145,170, 50, 32, 37, 87,143,168,100, 13,250,244,238, - 45, 23, 8,197, 31,241,207, 7, 15, 30, 60,120,240,224,193,163, 66,129, 21, 31,241,123,199,200,243,187, 61,243,114,114,212, 10, -137, 0, 2,154, 70,110,124,167, 94,155, 0, 0, 32, 0, 73, 68, 65, 84,250, 83,236, 92, 53, 21,225, 63, 77, 71, 81, 86, 2, 8, - 1,100, 34, 6, 38,109,190, 58,251,126,184,103,126, 37, 51, 8, 41, 88,123,252,188, 59,169,110,114, 22,113,218,123, 90, 43, 4, -128,189,167,181,194,228, 44,226,244,243,238,164,186, 98,162, 2,199,178,232, 55,240, 61,236,218,177, 5,109,187, 13, 68,248,149, - 84,232, 13, 22,187,246, 63,147,120, 52,168,227,225,229,245,222,180,145,221, 29, 90, 5,186, 40, 27,248, 58, 51,140, 80,100, 19, - 11, 37,220,241, 59,234,140, 94,253, 6,211,114,133, 99,111,137, 71,131, 58,149,241, 56, 9, 69,223,255,117,246,144,156, 97, 24, -164,166,166,194, 98,177,192,108, 54,195,100, 50, 61,179, 96,105,244, 86,100,228, 27,144,166,210, 35, 85,165,199,163, 84, 13,196, - 10, 23, 88,173, 86,126,225, 53, 30, 60,120,240,224,193,131,135,125, 11,141,102,230, 22,160,134, 3, 3,119,159,186,248,112,234, - 74, 0, 0,203,217, 64, 80,178, 60,131, 61, 54, 61, 2,225,185,207, 71,214, 77,172,227, 77,169, 63,234, 35, 55, 0,192, 71,125, -228,134, 58,222,148,250,243,145,117, 19,245,172,139,133,101, 89, 92,139,206,197,138,253,143, 48,111,251, 3,156,185, 99,127,204, -184, 64, 40,155,182,124,233, 18,185,128,161,168,232,148, 98,109, 86,129, 77, 43, 18, 9, 45, 66,177,192,170, 53, 83,134,100, 21, -155,223,251,253,201, 73, 12, 35,156, 92,101, 90, 9, 7, 66, 8, 76, 38, 19,204,102,243,179, 79,153, 5,171, 64,107, 65,102,190, - 17,169, 42, 3,210, 74, 63, 57,133, 6, 16,194, 79, 36,228,193,131, 7, 15, 30, 60,120,188, 40,176,202,221,157,158, 3, 16,159, -172,130, 68,192,161, 86,237,250,127, 95, 65, 0, 66, 0,171,141,179,235, 31, 29, 59,151,149,238, 95, 83, 71,102,174, 76,109, 27, -218,208,245,193,164, 17,190,143, 67, 27,186, 62,152,185, 50,181,173,127, 77, 29,177,114, 98,150, 16, 2,194, 17, 16, 66, 64, 8, -192,113,246, 11, 22,138, 98,218, 52,107,232, 39,248,126, 95, 66,202,228, 13,113,143, 41,129,192, 42, 22,139,109,158, 78, 50,170, -150,155, 76, 80,108,130, 49, 40, 52,204, 74, 1, 97,149,241,168,173,150,239,218,247,122, 95,111,177,216,224,235,235, 11,179,217, -252,204, 69, 88,102,193, 42,210, 90,144, 81, 96, 68,154,202,128, 84,149, 1, 6, 35,139,135,143,147, 65,209, 12, 31,244,199,131, - 7, 15, 30, 60,120,188, 62,202,213, 34,255, 63, 11, 44,234,185,207, 43,240,243,245,196,205,168, 20,212,246,148,192,209,201, 1, -143,159,164,131,102, 4, 96,104, 10, 54,214,254,114, 32,102,235,254,213, 51,157, 86,166,102,177, 55, 54,236,126,154,144,154,197, -222, 88, 61,211,105, 37, 49, 91,247, 3, 37,130,141, 35, 4,220,115,127,237,230, 38,156,135,155,147, 68,112,251,137,182,128, 98, - 4, 38,145, 80, 96,242,118,149, 80,222,110, 50,129,175,171, 76,172,144, 10,105,111, 79, 79, 14,132,120, 86,198, 99, 78,143, 73, -204,214,104,230,116,236,249,158, 94, 40, 20,194,223,223,255,153, 5,171, 76, 96,149, 88,176, 12, 72, 85,233,145, 93, 96,132, 76, - 66,227,126,196,121, 61,203, 90,119,242,207, 6, 15, 30, 60,120,240,224,241, 90,168, 84,139,252,255,134,170,183,202, 33, 4, 10, -185, 12, 28, 45,197,181, 59, 79,208, 48,184, 9,182, 31,187,133,250,161,173,145, 85,108, 3,169,198,118,134, 51,126, 52, 68, 2, -136, 28,208, 67, 94,107,112,159,154, 61, 8,132,231, 54,252,166, 73, 7,128,160, 54, 40, 21, 86, 37,150, 43,142,148, 44, 19, 81, -141, 90,201, 76,205,213, 41,235,122, 41,240, 40,205,108,114,144, 75,109,206,114,145,192,221, 73,204, 56,202, 4, 2,129,136,166, -139,138, 84,197, 0,149, 89, 21,151, 57, 61, 38, 49, 21, 33,115, 58,245, 25,190,248,234,233, 3,242,122,245,234,225,254,253,251, -207, 92,132,122,163, 13, 84,177, 5, 66, 25, 65,131,154, 74, 60,142,188,202,230,231,102,196, 20,198,157,222,194, 63, 31, 60,120, -240,224,193,131, 7, 15,187,212, 17,199, 17,184,187,185, 64,162,116, 66,162,202, 12, 45,220,161, 54, 80,224, 88,128,181, 85, 42, -130,202, 13,250, 62,118, 46, 43,253,232,185,188,173,199,206,101,165,191,168,229,254,118, 15, 18, 66, 42,114, 17,134,150,175, 3, -217, 63, 78,156,187, 86, 48,168,141,135, 51, 45, 20, 26,196, 18,198, 34,147, 10,173,114,137, 0, 30, 78, 34,113, 45, 23,145,228, -210,201,223,104,138, 35, 23,236,225, 52,167,199, 36, 38,229,230,206,233,214,111,132,222,211,203, 11, 35, 71,142, 68,237,218,181, - 1, 0, 53, 20, 52,252, 92,104, 8, 76,217,184,124,108,171,238,241,221,139,119,193,154, 6,227, 69,179, 38,191,203, 58,207,201, -115,242,156, 60, 39,207,201,115,254,143,194,174,205,158,235,121, 43, 16, 80, 83, 1,163,217, 19, 6, 51, 11,157,201,134, 98,189, - 21,106,189, 21,201,217,122,196, 93,122,243,132,144, 82,129, 5, 66,129, 35, 4,160, 74,220,132,196, 78, 67,161, 78,168, 89,185, -124,201,247,195, 15, 28, 60, 66,190,232,235, 93,235,102,130, 33, 77,194, 8,205,114, 9, 45,112,148,209,108, 82, 98, 82,230,217, - 19,191, 53,210, 75,245,163,236, 77,147, 57, 61, 38, 49, 30,152, 19, 20,214,237,123, 16, 8,204, 6,181, 98, 86,251, 16,156, 57, -125,210, 32,190,118,215, 74, 9,196, 81, 28,107,217, 93,106,185,226, 35,220,121,240,224,193,131, 7, 15, 30,246, 9, 44,189, 65, -159,208, 99,200,167,165, 27, 62, 19,176,108,137,101,137, 45,115,229,113, 4,172,197,144,240,166, 9, 97, 57,238,214,198,237,251, -251, 54,109,214,154, 9,241,115,128,166, 40, 15,119,110, 70,216, 8,199, 69,216, 69,144,146, 98,178,121, 72, 63,120,255,189, 65, -191,141,157,248,133,182, 99,231,174,114, 87, 87, 71, 91, 94,110,190,102,231,150, 3,133, 71, 14,236,105, 68,113,220,199, 72, 73, - 49, 85, 39, 93,230,244,152, 68, 51, 80,182,190, 85, 55, 32,164,179, 46,243, 65,127, 29,112,129,111, 62, 60,120,240,224,193,131, - 7,143,215, 18, 88, 9, 55,126,239,248,127,145,144,130,130,156,145,187,127, 59,188,104,207,129, 99,237, 77, 22, 75, 77, 14, 76, - 26,107,181, 94,150, 20,231,127,107, 47,135, 46, 55, 54, 6,126,126, 45,126,253,105,229,151,191,252,188,186, 59, 56,182, 62, 40, - 42,137,226,200, 5,173, 84, 63, 22,153,213, 19, 87,229, 32,143,234,112,170, 39,128, 60,190,233,240,224,193,131, 7, 15, 30, 60, - 94, 91, 96,253, 95,161,240,233,173,226, 66,224,139, 55, 38, 74, 73, 49,105,129,165, 40,249,188,109, 68,129,223,127,137, 7, 15, - 30, 60,120,240,224, 81, 5,104,190, 8,120,240,224,193,131, 7, 15, 30, 60,222, 46, 40, 84, 60, 19,160, 58,150,154,215,153, 77, - 16,197,115,242,156, 60, 39,207,201,115,242,156, 60,231,255, 28,103, 85,220,188,167,232,223, 36,188,120, 78,158,147,231,228, 57, -121, 78,158,147,231,252,223,227,252, 71,129,119, 17,242,224,193,131, 7,143,255, 57,184, 54,232,175,116,109,208, 95,105,239,245, -110,193, 67, 61,221,130,135,122,242, 37,199,195, 94, 8,248, 34,120, 43,144,160,100,219, 70,203,127, 42, 1,206,206,117, 29,109, - 14,110, 71,104,206,180, 92,147,254,240,220,219,206, 95, 72, 72, 72, 51, 0,136,137,137,185, 7,224, 77,103, 99, 66,238, 17, 56, -194,197,209,121,130,133, 51,179,122,157,126,163, 46, 39, 62,252,109, 38,216,205, 45, 88, 97,150,200, 86,128, 34,125, 64, 64, 19, -154, 58,207,104,172,255, 82,171, 31,168, 43,187,207,119,192,146,134, 99,135,190, 59,119,107,248,201, 69,105,199,190,121,252,242, -239, 46,189,127,116,248, 98,100,247,153, 63,237, 63,177, 60,255,248,215, 90,190,233, 87, 31,190,237, 71, 56,219, 4, 94, 76,214, -229, 85,249,213,185,175,102, 96,155,104,161, 80,232,110,177, 88,114, 51,227,111,218,245,246, 92, 43,168,109, 36,195,208, 62,172, -141, 75, 79,143,139,104,193,151,126,213,144,121, 7, 53,163, 88,246,107,194,177, 66, 14,204, 26, 83, 94,194,181, 55,225,243,246, -246,150, 57, 57, 57,117,114,116,116,244,149,203,229,210,194,194, 66, 67, 97, 97, 97,106, 74, 74,202, 5, 0,182,255, 68, 30,221, - 66, 6,206,102,104,124, 87,250,253,251,188,152,163, 75, 43,191,126,192, 34,138,178,206, 46,253,190, 52, 47,230,216,220,255,134, -186,242, 8, 29,220, 26,132,251,146,166,153,118, 44,177, 45, 81, 69, 29,219, 80,157,251,219,180,105, 51,200,106,181, 74,202,142, -133, 66,161,233,198,141, 27,191,243, 79,193,127, 72, 96,213, 12, 30,234, 98, 21,144,249, 2,134,126,143, 35,196, 33,251,126,184, -226,191, 57,131,181, 91,141,188, 67,211,116,173,231,207,113, 28,151,158,122,107,247,219,234,108,107,173,154,214,252,235,156,124, -131,230,135, 61,143, 23, 86, 36, 62, 60,154, 14,191, 78,209,148, 63, 69, 81,160, 41,128,161, 41, 0,200, 76,187,181,167,188,205, -167,189, 29, 21,130, 64,141,206, 22, 5,160,202, 65, 72, 90, 35,192, 71,224,226,121,185,203,224, 41,117,239,156,217, 30,204, 90, - 44,221,117,185,177, 49,111, 33,111,238,245,235,215,111,201, 48,140,235,148, 41, 83, 68, 0,176,102,205,154, 0,150,101,243,159, - 60,121,114, 27,128,234,181,196,149,123,208,200,117, 63,124,191,171, 79,159, 62,200, 84,233,176, 98,205,134, 46,167, 79, 28,120, -255,173,137, 44,239, 48,153, 77,204, 68,125,246,229,183,181,250,118,109, 41, 40,210, 90,113,234,194,141,145,225,219, 86,116,115, - 66,147,198,149,137, 44, 78, 95, 52,215,211,129,244,230,244, 69, 0, 48,226,149,246,175,180,190, 83, 67,142, 62,222, 18,193,253, -124,224,112,149, 73,105,241,241, 25,161, 72,228, 71, 81,116, 73,189, 51, 20,232,210, 54, 96,179,154, 83,158, 92,219,222,235,191, -162,163, 14,251, 40,155, 2,229, 74,151,166,143,162, 0,154,166, 33,160, 0, 16,162, 73,140,216,225,250, 22,254,141, 83,104,128, -115,163,246, 1,186,173,151, 19, 11,148,130, 78,211, 78, 82,132,222,144,122,117,245,125,123,110,150, 74,165, 46,199,143, 31,119, -239,221,187,183,147, 71,163,129,151,237,185, 71,204,104, 67, 78,156, 56, 38,234,221,187, 87, 53,218,103, 96, 15,208,244,110, 10, - 16,114, 28, 89,195,112,228,128, 54, 63,238, 9,170,185,152,176,123,163,129, 11, 64, 33,216,238, 27, 8, 30,169,162,143,126,251, -154,101,203,200, 60,130, 70,201,164,210, 25, 1,129, 13, 3,147,147,158,198,105, 52,234,213,134,220,184,173,165, 47,127,118,131, -178,177,211,206, 94,184, 62, 84, 32, 20, 82,189,186,182, 84,152,128, 94,213,229,120, 30,158,158,158,131,214,175, 95, 95,175,109, -219,182, 0, 0,155,205,230,120,240,224, 65,175,133, 11, 23, 42,226,226,226, 14,191, 14,167,143,143, 79, 77, 39, 39,167,218, 50, -153,172, 38, 0, 24, 12,134, 12,181, 90,157,154,153,153,153, 81,101,122,154, 14,117, 35,172,117,193,233,195,191, 8, 0,160,215, -144, 9,139,234,116,158,225, 66, 49, 66, 67,121,215,179, 54,179,194, 84,152,244,229,249,227,219, 41, 0,232, 62, 96,244, 44,183, -224,161, 63,229, 61, 10,207,249,143, 60,172, 67,135, 50,110,241,150, 65, 20,161,254, 21,214,188,121,155, 33, 3,251, 32,164,190, - 15, 6, 13,159, 52, 3, 64,181, 4,150,213,106,149,132,135,135,215,162,105,154,177, 88, 44,198,225,195,135,231,190, 73,210, 2, -218,127,124, 29, 20,229,107,177,217,126, 77,185, 81,127, 17, 48,159,123, 57,237,222, 73,130, 57,160,232,113,132,227,210,178,239, -253,214,142, 23, 88,165,112,109,208, 95,105, 21,144,168, 46, 29,219,184,206,158, 52, 88,188,233,192, 85, 28, 3,149,145,117,255, - 96,205,255,214, 12,210, 52, 93,235,232,222,245, 30, 50, 9, 3, 0,208, 26, 88, 12, 25, 57,165,234, 7,184,197,135,151, 64, 33, -168,204,135,202,178, 54,169, 64, 32, 52, 82, 0, 64,149,204, 14,144,201,196, 55,166,183,137, 85,143,238,239,255,241,215, 63, 69, -238, 0,224, 12, 32,187,220, 78,139,166,107,253,182,109,141, 71, 77, 87, 41, 4, 12, 5,173,193,134,193, 31,255,139, 45, 79,176, -109,157,211,118,193,200, 62,117,134,121,244, 62, 52,164,168,216,252, 71,101,233, 84,120, 6, 55,148, 59,185,159, 27, 50,126,129, -143, 1,142,152,187,104,181,199,245,179,225, 87,179, 50, 82, 44,169,233,233,122,155,197, 26,155, 95,144, 53, 93,155, 21, 31,111, -111, 71,173, 84, 42,235, 41,149,202,166, 77,154, 52,145,206,152, 49, 67,216,165, 75,151,103, 63,142, 31, 63, 94,116,233,210, 37, -239,149, 43, 87,246,125,240,224,129, 81,171,213,222,215,106,181, 79, 1,176,246,214,137,151,151,251,231,239, 13,234,143,110,239, -125, 6,150,163, 48,110,242, 52,156,249,227,240, 68, 0,111, 69, 96, 41, 25,250,251,113, 83,190,169,213,185,109,115,193,178,131, - 9,112,146,139,208,171,117, 11,129,132,153,233,253,219,182,149,171,161,198,152,242, 44, 87,156,190,104,110,168,155,101,248,128, -118,254, 56,246,155,101, 56,186,127, 5, 90,238,252,204,146, 85,175,247, 20, 7, 9,155,187,190,166, 51,227, 33, 97,115,215,215, -235, 61,229,207,167,167,215, 23, 87,150, 22,161, 72,228,183,245,167,197, 13,106, 40, 69, 96, 24, 10, 2,154, 6,195, 80, 48,153, - 89,140,156, 52,251,109, 53,115, 70,230,209,160, 47, 13,140, 70,201, 72,184,221,144, 27,127,170, 58,117, 66,209,140,235,193,109, - 43, 5, 30, 78, 98, 48, 12, 5,134, 46,249, 36,101, 27,240,197, 87,243,157,222, 84,168,247,105,239,209,242,171, 97, 65,189,218, -132,214,104,178, 63,130,114,110,211,103,152,107,158, 81, 54,234,183,163,151,134,147,142, 95,222, 36,132,251, 33,253,218,186,179, -149,145,152, 76,166,156, 94,189,251, 56, 82, 2,133,252,207, 35, 59, 58,149,109, 54,111,101,185,191, 55,135, 39, 64,217, 75, 12, - 71,128,241,159,142, 69,175,222,125,244,156,141, 75,175, 70,167,177,251,244,159,215,220,141, 86,130, 85,235,183, 44,208,169,243, - 22, 36, 62,118, 77,214,170,243,190, 52,228,198, 31,179, 95,169, 32, 56,238,250,193,193,123, 79, 68, 32, 52, 36, 24, 44, 87,178, -191,106, 96, 45, 5,246,157,188,129,134, 65, 13, 75, 22,111,230, 8,130,124,149,232,252,238,199,175, 89,188,157, 5, 10, 79,213, -190, 65,195, 70, 15, 29,252,222,112, 56, 59, 42, 97,182,152, 2, 47,156,253,227,151,141,235, 87,180,215,102,199,142,170,142, 56, -228, 56, 86,252,247,119,171, 20,128, 16,128,249,117, 43,223,199,199,199,189,101,203,150,207,142,109, 54, 27,234,214,173,139,140, -140,140,160,106,191, 8,120,120,200,125,124,124,222,157, 62,125,186, 71,215,174, 93,133,238,238,238, 0, 0,149, 74, 85,243,226, -197,139, 97,171, 86,173,202,205,204,204, 60,153,155,155,171,175, 80, 84,112, 70, 17, 67, 4,140, 68, 34, 43,213,181,160,103, 76, -249,176,137,187,187,123,185, 47,199,249,249, 5,226,239,190,251,150, 18, 8,132, 37,215, 19, 66, 19,142,173,112,143,145,182,109, -219, 14,176, 88, 44,210,242,126,203,179,185,247, 53,114,226, 97, 40,221,204, 88,192, 48,133, 89,247, 15,185,219,253, 32, 53, 30, -208, 83,240,148,108,236, 63,112, 96,157, 65,125,187,192,219,221, 9, 23,110,196, 98,234,156, 85,176,218,216,181,175,213,121, 48, -140, 32, 55, 55, 55,217,197,197,197,235, 45,140,183,254, 71,247,254,232,113,241,234,157, 89, 63, 73,126,155,100,182,142,178,150, -109,127,199,114, 4,242,124,145,176,211,192, 30, 14,174, 53, 3,101, 91,126, 90, 38,228, 45, 88,207, 87,132,152, 89,216,161, 93, - 75,215,217,211,198,138, 23,110,185,140,136,179, 39, 13, 89,247,195,223,138,184, 82,186, 7,182,165, 24,193, 4,138, 97, 20, 20, - 77,137, 57,150, 75,179,153,205,139, 12,249,241, 89,111,202,205,114,192,161,191,170, 41,204, 9, 9,248,229,231, 85, 30,158,206, - 18, 24,204, 54,140,249,124, 30, 54,175, 93,224,224,238, 36,134,201,194, 98,251,209,219,121, 77,116,171,201,232,190,254, 31, 47, -222, 26,125,248,135,221,143, 15, 87,214,137,209, 20, 13, 15, 39, 9, 22,237,139,133,163, 92,136, 26, 74, 49,104,186,124,113, 53, -186,127, 9,103, 81,177,217, 6, 64, 92, 81,231,166,240,106,212,209,193,205, 39,124,240,167, 11,220,227, 85, 20, 8, 49,227,169, -147, 4, 67, 70, 78,114,174,239, 37,131, 66,202, 32, 57, 45,171,238, 87, 51,103,182,136, 34,116, 75, 83,118,108,106, 85,217,174, - 83,167,206,144,126,253,250,201,167, 79,159, 46,244,245,245,197,238,131,103,252,122, 12,253,162,127, 70,118,190, 47, 71, 0, 79, -143, 26,105, 99,135,245, 61,126,234,212,169,148,180,180, 52,225,138, 21, 43, 90, 31, 57,114, 36, 36, 59, 59,219,238, 55, 81,150, - 16, 24,204, 44, 88,150, 3,203, 81, 80, 21,189,150,199,145,174,248,173,154, 12,236,217,165,149, 96,205,239, 79, 81,172,183, 66, - 38, 98,144,144,165, 67,219,182, 45, 5, 7,182, 83, 93,203,187, 99,236,208,119,231,122, 58,144,222, 3,218,249,195,195, 69,142, -109, 63, 45,198,177,235,137,189,115,138, 41,172, 39,204, 4,111,137,160,135,130,203, 90,223,165, 69,128, 87,247,230,126,184,211, - 34,192,235,202,221,199,113,178,247, 87, 77,201,208, 10,255, 44, 60,253, 69,113, 69,245, 94, 67, 41,194,150, 51,201, 80, 72,132, - 80, 72, 5, 37, 31,137, 0, 52,253,102, 27,198, 75,189,131,125, 25,142, 29,203, 48,130,177,195, 63,120,223,103,196,240,161,132, -162, 25, 28, 60,124,124,224,158, 61,187,179,172, 22,243, 22,150,102,182, 26,179, 30,165, 85,169, 5, 40,192,195, 73,140,175,126, -141,130,131, 92, 8, 71,185, 16, 14, 50, 33,186, 55,117,127,147,116,186, 76, 28, 88,175,239,196,193,117,186, 6,213, 86, 54,184, -255, 68, 29, 51,118,209,157,181,151,138,186, 78, 91,191, 38,196, 85, 92,104, 18,204,155,241,169, 32, 35, 51,171,235,193,227,151, -187,177,230, 49,177, 54,139,238, 27,213,131,131, 71,203, 35, 75,143,141, 8,171,217,102,168,212,162,181, 62,188, 31,151, 94,191, -192, 40, 70, 76,138,166,180, 76,133, 80,150,149,109,105,249,102,165, 39,163, 64,207, 92,203,112,165,187,226,114, 68,181, 92, 81, - 6, 11,135,251,137, 90,212, 9, 12,131,151,183, 15,204,125, 63,172,115,235,194,161,163,183, 46, 31, 93,170,207,126,252,141,189, - 60,123, 79, 68, 96,225,210,181,241,160,240,168,116, 52, 15,158,254,175, 41, 13, 86,173, 94,255,194,185, 73,159, 77,110,240,186, -226, 90,238,153,187,231,157, 1,163,134, 54,105,221, 3,241, 79,158, 34, 62,250, 14,186,191,211, 11,125,250, 13,134,217,100,252, -120,235, 47,235,111,235,114, 98,127,126,165,207,245,106,216,161,113,104,240, 30, 31,111, 31, 95, 66, 74,183, 38, 35, 4, 38,147, - 17, 51,191, 28, 7,189,182, 24, 65, 65,161,237,157, 59,246, 52,129, 98,192,113, 4,249,249,121,186,216,199, 49,239, 24,115, 99, -111,218,155, 64,189, 94,111, 85,169, 84,184,119,239, 30,226,226,226, 16, 29, 29,141,252,252,124, 56, 57, 57,105,117, 58,157,221, - 25,117,118,118,118,108,220,184,241,135, 7, 14, 28,144, 58, 57,253,173,249,205,102, 51,228,114, 57, 6, 13, 26, 36,236,208,161, - 67,205,209,163, 71,127, 98,177, 88,246, 22, 21, 21,105,202,227, 41,120,120, 50,211, 51,116,224,166,190, 67,199, 79, 2, 0,145, - 68,153,184,238,215,195,209,149,253,111,145,212,209,239,157, 65, 99,234,131, 16, 80, 20,181, 46, 63,246, 72,118, 69,215, 90, 44, - 22,217,254,253,251,107, 82, 20,245,194,248,186,224,199,253,237, 30,198,103,189,179,113,254,215, 2, 7,133, 4,121,106, 51, 38, - 76,154,226,102,183,184, 10, 29, 48,185,101,179,176,159,231,205, 24, 7,133, 92,134,179, 55,158,226,203,217, 75,109, 5,121,185, -187, 64, 81,107,242, 98,126,127, 83,175,197, 91,217,238,173, 65, 77, 37, 28,122,181,149,142,251,160,139,212,108,101, 81,168,181, -194,100, 97,193, 17, 2,181,206,138,152,148, 98,184, 57,137,176, 5,255,124, 84, 75, 96, 9,132,226,126, 95,140,234, 43, 94,185, -247, 38, 34,206,238, 53,100,221, 11,151, 63, 83, 6,205,135, 37,166,223,221,239,255,210, 45, 81,246, 12, 18, 2,138, 89,221,174, - 77,139,158,227, 39, 76, 34, 77,130,252, 68, 0,141, 71,241, 73,214,109, 91,183,140,186,120, 77,188, 86,147, 30, 53,247,185,193, -180, 90,211, 55, 57,142, 75,127,217, 98,197,113,175,188,205, 70,149, 55,224, 56, 43,132,216,116, 50,177,228,205, 24, 4, 78,114, - 33,246, 93, 76,135,166, 32, 35,175,137, 97,245, 95, 99,251,122, 12, 88,180, 53,230,232,134,227, 57,119, 1, 68, 3,200,169,136, -147,162, 1, 1, 67,193, 73, 33,130,147, 92, 8, 39,165, 16, 52, 69, 85, 40,174,230,253,242, 96, 7,128,216,151,196,213, 51, 78, -185, 71, 96, 35, 7,215,154,191,191, 55,113,137,203,195, 84, 11,104, 26,240,247, 82,192, 69, 41,134,217, 10, 36,171, 44,165,121, -117,196,228,233,243,221,103,253,107,226,169,156,236,206, 77,128,203,182,202,242,174,215,235,197, 35, 71,142, 20, 90,173, 86,203, -232,169,139,122,102,229,228, 13, 92,187,228, 43,137,155,155, 43,116, 70, 27,238, 61, 74, 14, 94,250,195, 79,254,127, 92,186,117, -100,214,196,129,199,122,247,238,237,180,127,255,126,174, 58,245,174,202,201,251,105,251,238,240, 93,107, 86, 46,197,227,228, 2, -108,251,101, 3, 8,107,219, 84, 69, 85,190,192,185,121,243,102,143, 29, 59,118,208, 55,110,220,200,127, 89,128, 82, 20, 20, 5, -106, 19,156, 21, 34,200, 37, 2,120, 57, 75,224,234, 32,130, 68, 68,131,166, 95,232, 68,158,113,110, 13, 63,185,136,211, 23,225, -216,111,150,225,219,126, 90,140, 49,159,207, 65, 84,158,232, 52, 45,119, 94,244,249,176,129, 95,215,144,163, 79, 77,103,218,163, -123,243, 58, 80, 72, 69,152,253,197, 72,180,188,155,236,145, 94,196,205, 41,208,163,233,252,211,152, 91, 94, 58,105,134,130,128, -161,225, 32, 19,226,210,201,125,185,250, 98,181,154, 98, 74, 44, 44, 86,179, 37,197,206,102,252, 74,121,202, 61, 2,103, 53,107, -220,104,241,164,241, 99,233,246,109, 91, 17,154, 22, 32, 79, 99,161, 8, 8,166,125, 62, 17,147, 39,142,243, 74,207,200,249,246, -231, 13,155,231, 94, 56, 71, 22,234, 84,143,231, 87,198,201, 80, 52,104,154,130, 66, 38,132, 82,250,247,199,104,230, 64, 81, 96, -106,134, 13, 83,131, 2, 40,138,202, 76,191,243, 91,176, 61,233,244,105,220,231,252,229, 92, 81, 67,253, 41, 99, 68, 66,124,228, -162, 91, 15, 82,111, 1, 40,240,237,228,252,137,213, 74,160, 53,218,144,148,163,135,205, 76,168, 49,189,253, 80,119, 40, 21,180, -100, 91,228,174, 63, 30,192,241,185,206,254, 5,206,140, 27,225, 70,215,208,193,195,214,252,184,249,246,202,197,115,152,124,141, - 25, 44, 1,100, 98, 6,210,210,143, 76,196,192,168, 83,227,231, 77,191,102,219, 64, 13,193,229,202,219,252,171,157, 6,249,104, - 72,223, 78,191, 81,128,152,162, 69,233, 62,126,117,252,186,245, 27, 37,237,222,255, 99,176, 54,203,172,187, 87,201, 69,125,110, -236,121,123, 56, 67, 67,130, 1, 10,143, 84, 81, 71,135,148, 12,146, 3, 15, 55, 12,106,216,224,229,115, 1, 1,129, 13,236,169, -247,178,102, 37,115,111, 48, 62,160, 97,227,153,109, 58,116,171,147,153,111,130, 75,205, 0,220,139,188,139, 51, 7,127,142, 52, - 20, 23,174, 60,115,226,200,204,133,203,214, 54,237, 55,232, 3, 28,253,253,192,116, 93, 78,236,134,210, 50,125,198, 73, 56,238, -163, 29, 91, 54,251, 10, 69, 18, 88, 89, 2,171,141,131,149,229, 96,181, 17,100,101,101,162, 88,171,133, 84,230, 0,133, 99, 13, - 88,109, 37,150, 66,147,201,170,152,248,113,191,201, 70,224,102,121,233,172,211,234,163, 59,160,169, 90, 37,239,168,165,117,102, - 50,234,189,189,189,119, 1,128, 68, 34,129, 68, 34,129,205,102,195,195, 76, 76,243,246,234, 52, 27,164,180,178, 57, 46, 61,251, -222,111, 45, 42,202,187,175,175,111,255,242,196,149, 86,171,197, 95,183, 31, 56,109,223,127,182,119,114, 90,118, 61,142,245, 48, -201,188,154,246, 42, 42,186,216,191,162,242,204,137, 58, 58,217,183,243, 84,122,250,164,145, 1,235,126, 13,191,149,112,102, 81, -165,230,228,186,221,191, 54,207,156, 60,162,197,242,117,219,226, 51,174,172,251,178,170, 58, 18,137, 68, 66,149, 74,245,236,249, - 94,176,254, 80,159,212, 28,205, 59, 63, 44,158, 35,186,247, 84,139, 7, 73, 89, 24,213,195,207,238,231,221, 43,100, 80, 80,173, -218, 53,215,174, 93, 56, 21,113,153, 6,172, 63,116, 11,151, 79,238,186,107, 49, 22,191,171,138, 57,158,251, 58,125,200, 91, 16, - 88,175,112,150, 13, 4, 23, 31,228,161,216, 80, 34,172,172, 44,135, 98,131, 13,185, 69, 38,168,117, 86,104,141, 86,140,122,199, -175,250,234,143,144,150, 0,220, 1,168, 40,138,186,253,252,113,153, 6, 45, 27, 98, 94, 58,206, 43,181, 24,186,150,142, 21,226, -231,104,205,207, 25, 49,202, 59, 95,118,127, 12,128,224, 82, 78, 22,192, 45,138,162, 10,237, 17, 88,164,204, 92,249, 92, 33,151, -251,202,202,218,172,181,124,188,189,193,145,244, 23, 46,241,107, 53, 76,255,197,216,247,101, 43, 89,155, 46,235,254, 33,187, 99, -178,148,238, 13,218,137, 68,226,147, 75,151,173, 32,195,250,119, 22,103,171,173,134,152, 12,163, 74,107, 34, 54, 47,247,250,146, -101,203,151, 43,151, 44, 91,249,217,145,195, 92,145, 54, 39,230,135,242, 56,188, 91, 12,191, 67, 81,116, 45,250,111,179, 60, 8, - 71,210, 51,238,236,107, 1, 0,111, 18,107,165, 51,218,192, 48, 20,132,165, 49, 41,122, 51, 11,125, 81,118,126, 19,253,218,191, -198,246, 46, 17, 87, 55, 51,188,158, 50,140,202, 2,160, 82, 23, 4, 77, 81,208,232,173,112,148, 9,225,164, 16,193, 89, 46,122, -222,130, 85,158,184,138,174,140, 83,100,177,164,177, 86,147,145,176, 44,250,182,116,135,135,147, 24,222, 46, 18, 72,197, 2, 88, - 89,192, 96,230, 96, 48,179, 72,201,213,163, 88, 47, 65,227,206,195, 3,220,188,111,234,179,147, 90,236,200, 79,185, 51,161, 82, - 11, 19,203, 98, 79,248,153,128,140,172,220,129, 71,119,175,150,228,170,173,120,144,172, 69,110,161, 25,132,114,194,236,185,115, - 37,243,230,125, 55,248,192,239,231,147,218,181, 8, 76,175,110,185,234, 85,177,187, 15, 30, 10,255,233,221,254,131, 28, 98,110, -253,129,248,123,231,231,233,114,171, 23,127,229,231,231,199,254,252,243,207,206,155, 54,109, 10, 56,122,244,104,154, 74,165, 74, - 44,123,168, 92, 29, 68,153,231, 46, 92,113,237,220,190,147, 32, 45,207, 8, 55, 7, 17,252, 60,229,184,123,253,162,153,166,168, -211,229,241,149,186, 1, 71,160,251, 87, 56,118, 61,177,119,116,190,228,210,167,227,198, 36,159, 59,121, 43,255,199,221,231, 87, -212, 84, 90,239, 75,185,220,245,119, 91, 4,120,205,154, 50, 18, 75,127,220,141,203,119, 31,231,234,104,159,197, 89, 38, 91,133, -147, 10, 24, 26, 16, 10, 40, 56,200,132,208,235,212,234,232,243, 27, 3,223,210,203,209, 39,103,126,223, 77, 23, 20, 91,145,158, -103,160, 50,243,139, 97,227, 56, 56, 43,196,176,113, 64, 81, 65, 30,181,103,207,110,220,190, 29, 65,131,161, 63, 5, 48,191, 42, - 11, 22, 67, 83, 80, 74, 5, 80,202, 74,172, 64, 74,153, 0, 22, 27,135, 6,254,190, 88,187,224, 11, 71,119, 15, 79,244, 28, 50, -193,238, 4,202, 20, 46, 77,119,110, 92,136, 75, 17,247,187, 92, 76,216,215,210, 35,180,233,143, 66, 86,184, 18,132, 24, 76, 86, - 22, 26,117, 33,140,166, 52,180,170,153,135, 26, 10, 22,201, 26,111, 68,101,199, 43,171,234,232,243,163,142,220,163,200,160,185, - 7,143, 95, 88,218,171, 71, 23, 68, 39,105, 74,196,149,168, 68, 92, 9, 40, 14,171, 55,109,182, 22,170,139,251,229, 71, 31,205, -123,141,246,249,103,105,103, 92, 34, 16, 88,173,251,158,245,115,119,142,155,185,162, 87,175,193,159, 80, 81,183, 47,126,163, 7, -206,219,107, 61,127,245, 28,177,235, 92, 69, 93,137, 71,253, 22,123,183,239,216, 55, 44,164,129, 47,114,138,172,200, 44,180,224, -234,221, 4, 28,217,252, 77, 81, 81,206,211,143, 96,209,106, 57,202,166, 62,123,230,248,233,207,190,152,137, 70,141,154,214,209, -164,107, 28, 95,142, 61,228, 24,106,243,199, 99, 39, 14,243,244,240,116,224, 74, 45, 88, 28, 33, 8, 10, 10, 65,223,254, 67,112, -233,202,117,196, 68, 63, 40, 57,207, 1,132, 16, 20, 21,230,103,219,172,230, 29, 21,182, 35,134,170,181,125,211,106, 15,154, 2, - 44, 54, 14,102, 43,135, 89,179,231,153,167,126,187,190, 67,175,246, 77,162, 25,112,154,212,172, 34,231,219,177, 89,141, 41,161, -163,247,135,227,191, 22, 25, 44, 44, 52,122, 43,206, 31, 92, 87, 97,166,189,253,155,180, 85,214,110, 63,118,252,156, 77, 18, 9, - 67, 91, 26, 5,250, 38,118,110,211, 40,173,182,143, 91,241,146,117,123, 90, 93,191, 27,219,119,200,123,131,165,195,234,133, 80, - 62,174, 82,135,137,147,167, 52, 97, 3,218,127,156,147,240,215,174, 10, 7, 63,129,164,200,183,150,239, 51, 87,162,123,163,129, - 15, 0,188, 60,242,167,168,162,143, 54, 1, 0, 15, 79, 47, 35, 37,148, 20, 87, 67, 16, 16, 0,248,254,199,240,190,233, 42,237, -208, 31, 22,207, 17,221, 75,212,225,222, 83, 53,196, 34, 6, 38,139,253, 97,109, 44, 69,166,125, 61,101,140,176, 64,103,195,197, - 7, 42, 68,221,185, 64,108, 22,205, 40, 66, 9, 70,187, 53, 26,248, 49, 5,212, 37, 64, 18, 77,225, 23, 51,141, 29,234, 7, 71, -213,175,107,193,114, 15, 30,220,142, 98,208,151, 17,136, 90, 2, 92, 67,155,213,234, 65, 51, 76, 94,206,131, 67,158,213,200, 59, -244,185,241, 88,177,228, 91,172,221,114, 4,183,226, 10,224,100, 75,195,209,109,139, 49,125,233, 30,232,205,108,101,105,168, 72, -143,184, 83, 20,117,130, 16,210,143, 16,242, 14, 0,113,217,113, 73, 31, 70,157, 40,253,223, 47, 28,207,154, 53,235,155,165, 75, -151, 70,151, 93, 91,118,190,236,218,202,206, 63,119,191,235,236,217,179, 67,151, 45, 91,182,164,109,219,182,191, 93,191,126, 61, - 17,128, 93, 2,235,249, 76, 84,248,148,123,132, 14,104, 69, 8,199,120,185, 42, 17,224,239, 11,197,251,163,101,167, 40, 74,199, - 48, 52,189,125,205,108,105,190, 65, 0, 1,195,216,109,239,149,122, 4,181,150, 41, 21,167,246, 31, 56, 68, 26,212,241, 18, 31, -186, 81,148,122, 55, 81,255,204,164,171, 81,165,136, 3,106,152,152, 97, 31, 12, 81,156, 62,123,110,154, 22,248,161,252,129,129, -174,245,227,234,229, 30, 14, 50, 33,104, 10,208, 24,108,152,246,175,175,223,120,244, 34, 32,204,228,127,125, 7,154, 42, 25,124, -180,234, 2, 44, 94,179, 93, 59,164,214,133,107, 99,123,187, 13, 88,180, 53,230,232,217, 71,178,132,193,131,187,169,147,147,147, - 11, 51, 51, 51, 43,119,193, 16, 54,125,232, 39, 83, 69, 52, 93,226, 54,162, 40, 10, 0,155,243, 58,226, 10, 0,138,138,146, 52, - 82,177,114,240,238,213, 83,182,212,174, 85,179,134,131, 92, 10,165, 66, 66, 53, 12,170, 47,109,211,186,173,204,175,126, 35,209, -149, 71, 90,164,170, 12,120,154,161,129,196, 61, 84, 56,172, 75, 15,236, 94,247,117,223,252,148, 59, 85,230,255, 66, 68, 84,255, - 13, 43,231, 72,114, 10, 45,120,148, 86,140,236, 2, 19,178, 11,141,200, 46, 52, 65, 41, 21,160, 77,247, 33,146, 99,231,195, 7, -181,107, 17,248,227,235,148,239,211, 39,137, 71, 82, 50,178, 70, 53,105,214, 10,123,118,110,111,131,154, 53,165,200,200, 48,218, -123,255,150, 45, 91, 10,194,194,194,220,126,248,225, 7, 93, 80, 80, 80,211,205,155, 55,251,199,197,197, 93,170, 87,175, 94,255, -141,235, 22, 94,154, 58,103,165,159, 0, 54,167, 54,237,219, 51,114, 49,133, 27, 87,206,154,118,108,217,148,105, 41,210,206,172, -116,244,146, 59, 47,202, 41,166,224,238,227, 27,165, 16, 90,123, 10,229,150,184,194,221, 95,236, 46, 4, 14,215,235, 61,229,207, -139,119, 98,227,154,223, 77,246,184,112, 55, 46,183, 64,111, 13,124,122,122,122,165, 29, 46, 67,149, 90,176,228,127, 91, 44, 61, -154, 12, 77, 32, 20,229, 94, 38,108, 40,148, 88,180,168,146,135, 48, 51, 35,242,128, 29,129,209, 20,225, 56, 32, 46, 93,139, 98, -131, 13, 70,171, 13,190,110, 10,168,114,210,177,241,199, 29,136,188,115, 27, 61,251, 12,192,207,191,238,193,184,143,223, 55, 86, -245, 96,210, 52, 5,154,166, 74, 45, 87, 37,226, 74, 41, 21, 0, 20, 80,164,179,226,240,181, 52,212,247,167, 65, 85,195, 91,232, -160,148, 65, 93,108, 4, 45, 84,226,241,213, 93,242, 63, 46,220,154, 61,127,229,214,175, 52,218,156,212, 39, 49, 17, 8,114,201, -135,191,143, 25,209, 57, 78,184, 83, 80, 7, 65,245,235,129, 22,221,182,139, 59, 47,186,241,138, 99,244,161,126, 45,155,133,180, -173,237,225, 4,131,153, 45,181, 98, 9,176, 99,251,118, 36, 39,165,143,205,143, 57, 26,249, 54,148,172, 46, 55, 81, 37,241, 8, -248,236,225,141,243,137,131, 62,154, 12,175,154,181,155, 22,165,222,179, 51, 60,193, 62, 49,197,217, 39,176,232, 26,117,154,237, -220,185,251,224, 48,255,218, 94, 56,119, 43, 9,145, 79, 10,225,232,224, 12, 70,225,141,192,206,163,157, 31,158, 94,247,158, 33, - 79,187, 83, 40,146,127,218,170, 77,123, 16, 66, 16,251, 56,186, 64,173,118,122,165, 9, 24,178, 98,239, 69,100,197, 58,190, 32, -138,221, 26, 54,117,112,170,113,207,104, 97,145,145,145,142,191,174, 95, 10, 51,100,197,222,171, 78,121, 73, 68, 52,206,222,205, -133,197,198,193, 98,229, 16,214,184,161, 81, 40,146,117, 92,190,229,100,155,236,156, 92, 90,174,116,226,156,220,234,137,156,173, -217,166,251,137,106,145,197,198,161,158,119,229,239,229,242, 26,245,150,124,249,175,169,193, 2,177, 12, 26,157,201,156,149,158, -225,245,203,190,139,218, 71,177, 49, 53,235,214,169,237,184,112,225,124,145,198, 72,144, 91,100, 66, 94,177,133,250, 96,196, 88, -159, 93,219,126,254, 8,192,174,106, 36,189,241,111,187, 54, 89,107, 40, 69, 84,177,222, 74, 84, 26, 35, 59,249,179,105,141,223, -164,237,188, 32,174,158,234,112, 47,177, 8, 18, 17, 3,137,136,129,213,102, 95,136,164, 91,240, 80,133,155,171,226,163,214,205, - 2,112,230,174, 10, 2,134,130, 65,167, 49, 75, 37,202,168,134, 13, 27,208,205,154,134,162, 75,135,118,120,146,152, 28,116,230, -220,133, 53,183,110, 71, 46, 22, 54, 26, 52, 51, 47,250,247,159,171,147,214,148, 12,149, 34,199,230, 59,220,195,203, 45,116,192, -128,254,146,218, 53, 61, 41, 55, 87,103,176, 16, 97,210,228,207, 61,236,246, 26, 17, 2, 2, 96,217,130,217, 48,153,205,240,112, - 22,131, 16, 96,219,250,239, 97, 54,155,225,227, 42,133, 90,103,173, 74,232, 85,168, 71,202, 19, 68, 47, 11,173,178,239,101,215, - 45, 93,186,180,223, 75, 2,176, 95, 5,194,240,149,235,202,238, 95,182,108,217,146,231,126,215, 87,199, 69, 72, 85,150, 41,183, -198,131,218, 75,196,178,179, 63, 47,157, 70, 23,233, 44,144,136,104,212,243,175,139, 41, 95, 76,149,119,111,230, 1, 3, 28,113, -104,223, 14,141,141,181,158,176,235,205,214, 51,160,133, 66, 38, 63,189,109,231, 62,206,203,195,141,250,229, 79, 85,162, 74, 99, -123,182,196, 65,220,205, 99,220,157, 51,191,120, 19, 80,167,229, 82, 89,128,201,108,114,169,176,199, 41,173,208,109,103,147,193, -208, 52,152,183,180,178, 23, 77,211,236,175, 63, 46,132,155, 99, 73,204,213,247,107,119, 23,247,119, 63,125,225,121,113,213,172, - 89, 51,117,211,166, 77,139,104,186,234,127,154,118,123,111,121,179, 37, 94, 75, 92,149,193,152,243,240,182, 17, 8, 85, 39,255, -125,238, 15,132, 9,221,234, 30,156, 62,252,195,143,102,123, 54,234,239,144,148,165,134,152,182,162,101,176, 55, 46,157, 57,204, -165, 37, 62,154,104, 15,119,110,190,218,215,205,213, 21,145, 79,181,200,204, 55, 34,171,160, 68, 92,101, 23, 24,161, 49,216,208, -172,174, 7,138,212, 90,223,215, 22,176, 20,249,253,204,233, 51,163,250, 12, 28,134, 41, 95,205,239,179,101,195,170, 7, 90, 15, -135,143,141,185,143,111,217,115,127,120,120, 56,123,231,206,157,196,188,188,188,150, 51,103,206, 44,174, 91,183,174,215,194,133, - 11,199,215,171, 87,207,167,123,215,174,234,219, 23,219,236,156,250,213,252,174,223, 76,221,226, 79,211,116, 14,225,200,177, 76, -157,245, 59,228, 61, 50, 84, 90, 79,199,190,121,252,221, 83,203,168,238, 29, 93,143,185,202,232, 16, 33,101, 26,129,224,249, 7, -240,104,190,229,233,233,245,197,178,247, 87, 77,201, 40,226,230, 24,105,175,197, 85,137,171, 18, 11, 22, 5,179,133,131,163, 76, - 88, 54,115, 20, 32,240,222,176,126,149,220,221, 73, 2, 1, 67, 65,200,208, 80,235,173,200,215,152,241,213,204,153,246,150, 32, -199,114, 28,244, 38, 22, 6,179, 13, 20, 40, 20,107,242, 48,251,171, 47, 75, 32,211, 47, 0, 0, 32, 0, 73, 68, 65, 84,209,167, -255, 16,140,157,248, 47, 20, 25,128, 59,137,197,176, 88,173, 85,202, 34,134, 2,244, 38, 27,198,246,242, 67,126,177, 5, 58,163, - 13,102, 11, 7,185, 84, 0,129,128,134, 66, 34,128,131, 76, 8,138, 34, 34, 47, 47,175,241, 0, 32, 20, 10,141,105,105,105,187, - 43,118,207, 19,212,241,245,132,193, 66,163,213,176,149,120,167,109, 32,238,157,219, 42,184,114,243,161,255, 87,243,215, 96,242, -136,182, 8,143,173,143, 26, 30,117,160,148, 75, 97, 37, 52, 0, 98,103, 64,222,124,142,182, 12, 30,177,233,215,109,177, 11,230, -125, 45, 45,212, 81,144,136, 4,184,112,225, 79, 68,220,188,179, 46, 47,230,232,238,183, 25, 75, 33, 36,180,167,163,147, 35,164, - 98, 6, 22,139,201,238,128,111,150, 35, 0, 65,176,123,232,192,195,165,117, 31,204,149,115,206, 14, 11, 22,229,228, 19,186,125, -211,150, 61, 31,121,123,121,224,200,249, 7,216,185,229, 39,212, 12,237,131,132,187,155,224,219,124, 16,148,254,221, 32,118, 56, - 56,158,102, 4,141, 39, 79,157, 61,164,121,139,182,184,126,245, 34,114,179,179, 54, 1,177,118,197,160, 49, 66,234,139,174,239, -244,131,201,194,162, 99,183,126, 56,125,252,200, 20,148, 78,158,120, 93, 48, 12,205,125, 62,110,184, 48,183,200, 44,204, 85,155, -144,145,103, 64, 98,182, 14, 71,247,111,181,219,108, 71, 49,116,203,206, 77,107, 9,199,175,184,144,230, 91,203,219, 36, 52, 25, -100,113, 79,158, 52,252,116,212, 71,194,186, 1, 65,180,170,200, 4,149,218, 12,149,218, 12,157,209,138,250, 62,181,105,147, 77, -208,182,186,105,245,112,146, 10,127, 62,145, 8, 71,185, 0,237,130, 93, 95, 59, 8,155,227,184,191,197,213,162, 18,203,213,253, - 68, 53,164, 34, 6, 98, 33, 3,137,136,134,149, 37,118,142, 69,182,225, 19, 70,125, 32, 51, 91, 9,242, 52,102, 48, 52, 5, 47, - 55, 87,137,175,119, 32,182,173,252, 28, 0, 48,238,235, 13,248,116,204, 72, 4, 5, 6, 64,173, 46,150,125, 58,105,234,106, 0, -118, 9, 44, 66, 8,217,115,244, 74,200,157,168,148,233,159,140,250, 88, 56,108, 64, 39, 58,242,169, 6, 89, 5, 38, 60, 77,208, -195,108,173,222,106, 52, 54,182,196,231,187,253,192, 9,200, 69, 12, 84,234,146,199,101,209,250, 3, 80,202, 4,200, 46, 52,131, -227, 42,181,222, 85,170, 71, 42,178, 58, 85, 7,207,139,176,202,206, 83, 20,117, 98,214,172, 89,223, 0, 32,179,102,205,250,166, -236,120,233,210,165, 6, 0,153,246, 10, 44, 84,228, 22,116,107, 60,168,189, 76, 44, 61,187,107,253, 55,178,243,113, 4,235,206, -222, 69,223, 54,222, 16, 9, 40, 72,149, 94,184,151, 88,132,243,231,143, 22, 95,141,184,105,164,104,107,149,211,162,100, 94,129, - 97,114,137,226,207,159, 54,239,180,121,122,121, 97,223,181,194,204,124,173,205,250,183,123,202, 74,221, 57,243,139,191,141,179, -246, 54,230, 36,220,174,234,205,155, 35, 68,180,116,227, 49, 16, 66, 0,142, 5, 7, 14,140, 72,162,168,221,234,163, 28, 80, 0, -203,114, 82, 1, 67, 27,159,249, 65, 74,134,166,244,212, 91,251, 90, 84, 85,195,142,114, 33,246, 95, 78,135,186, 32, 51,175,191, -251,233,191,202,196,213,233,104, 73, 66,243,230,205,212,173, 91,183, 46,146, 72, 36, 96, 24,230,117,234,248,141,196, 85,197,136, -180,230, 37, 97,217,161, 67,210, 1,125, 20,161,173,197,148, 16,205, 27,122,227,210,217, 35, 92,196, 31, 91, 7, 27,114,227, 79, -218,107,226,213, 26,109,200, 44, 48, 32, 35,207,128,172,194, 82, 11, 86,129, 9, 20, 5, 24,205,111,182,124,141, 33, 55,254,248, -238,221, 91, 55,153,172,152,216,177,231, 32, 76,159,255, 83,192,238, 77, 43,174, 38, 19, 91, 75,189, 42,225,161, 93,111, 92, 41, - 41,166, 61,123,246, 68, 22, 23, 23,247, 88,189,122,181, 54, 56, 56, 88, 44,147,201,242, 1, 72,227, 99, 99, 69, 23, 78, 29, 76, - 82,101,102, 78,176, 90,173,183,237, 77,151, 95,231, 81, 18,153, 37,114,188,159,188, 93,175,122, 94,114,248,201,117,189, 26, 42, -239,255,144,223,109,234, 18,213,133,117,185, 89, 38,219,185, 2, 61,154,102,104,133,127,218,213,217, 88,204, 41, 31, 78,152, 5, -134,166, 96, 49,153, 83,158,185, 35,156, 36,152,191,251, 17, 28,100, 66, 40,101, 66, 56,200, 4,104, 31,236,138,106, 24,136,136, -213, 70, 96, 48,219, 96, 48,177, 48,152,108,112,171,237,140, 95,119,133, 35, 85,101,192,177,219,121,120,156,172, 65,160,175, 2, -132, 84,109,119,226, 8,171,251, 96,252, 28, 7,134,166,193, 80,160, 27, 6,212, 65,129,214, 12,145,128,134, 88, 44,134, 92, 42, -128,163, 92, 8,161, 64,136, 91, 15, 30,192,100, 50,161,117,235,214,210,170, 28, 14, 14, 74, 25, 26,248,251,192, 98,181,225,212, -149, 24, 44,154, 54, 24, 61, 58,181,192, 87,140, 24,143, 77,205,224, 80,195, 1, 28,197,192, 98,227, 96,178,178, 0,168,202, 4, -112,187,210,184, 8, 35,128, 27,217,177, 71, 82, 89,102,224,248, 63,206, 94,216,221,191,111, 79, 68,222,143,198,161, 35,199,174, -230,185,170,103, 60,111,149,192,223,179,224,162, 95,179,185, 82,132,166,167,181,109,223, 5,218,194, 92,228,164, 37,217,221,169, -135,212,118,192,151,211,166, 52, 8, 10, 10,106,192,114, 4, 28, 71, 16,226,231,128, 9,147, 38, 53,168, 31, 16,216,128, 43,157, - 69,216,208,215,161, 82, 30,133,103,208,228,197,171, 55,126,236,235,235,139,211,215, 30, 97,233,156,137,145,114,185,178,110,139, - 26, 14,206, 92, 80, 83, 36, 70,157, 67,141, 58, 69,112,244,108, 80,107, 64,143, 81,181,250,188, 59, 8, 15,239,223,197,218, 31, - 22, 70,232, 24,217, 18,123,210,170,240,240,119,111, 26,214,234, 67,199, 26,158, 40, 84,107,161,116,241, 64,112,147, 22, 31,198, -220, 55,125,173,203, 77, 84,189,238,179,206, 17, 2,147,133, 67,129,214,130,116,149, 1, 73, 57,122, 36,101,235,193,113,132, 60, -239,162,174,188, 63,166, 40,133, 68, 32,168, 97, 77,168,253,224,207, 11,196,207,215,147, 90,177,112, 38, 99, 33, 18,228,170,205, - 80,105,204, 80,169, 77, 80,105, 74, 4,150,139, 82, 0,142,112,213,158,157, 81,160,181,192, 65, 38,128,147, 66, 4,150,125,253, -152,239,249,107,246,181, 75, 87,105,187,255,176,104,142,232, 94,146, 14, 15, 18,213,144,136,232, 18,235, 85,169,192,178,215, 45, -204, 8,232, 41,239,190,211, 26,105, 42, 35, 4, 12, 13, 1, 67, 35,160, 81, 24,220,228, 28,186, 15,155, 5, 0,232,223,183,100, - 25,146,196, 44, 29,142,223,200, 2, 0,145,189,105,205,205,211, 72,143,156,139,156,186,239,215, 21, 98, 35, 43,196,198,147,201, - 48,154, 89, 72, 68,165,110,119,113,245,198, 55, 27, 91, 98,193, 74, 83, 89,160, 51,177,208,232, 45, 32, 4,184,149, 80, 12,189, -137,133, 90,111, 65,155,160, 26, 85, 62,115, 85,140, 79,253,222,200, 67, 85,114,191, 10,127,199,105, 85,105,193, 90,186,116,105, -244,210,165, 75,203,181,136,217, 35,176,202, 23, 87, 34,233,217,157, 63,126, 35,251, 51,150,224,210,131,124, 12,237, 88, 11,249, -185,233,216,178, 97, 29, 71, 8, 32,145,138,179, 89, 27,247,135,145,179,205, 84, 63, 56, 81,169,223, 87,238, 22,220, 68, 42,150, - 92, 88,186,118,147,197,203,187, 22,119,248, 70, 81,174, 90,207,190, 96, 43,100, 77, 38,154,112, 68,100,204, 73,176,107, 80,164, -105,202, 50,127,202, 96,112,132,224,187,117, 7,176,116,250,112, 40,165, 2, 57, 69, 81,114,157,209,134,105, 11,183, 98,245,220, - 49, 14,114,137,160, 84, 24,176,152, 56,229, 43,251, 68,128,137,133,174, 48, 59,191,177,118,205, 75,226,170,185,186,101,203,150, - 69, 46, 46, 46, 80, 40, 20,175, 35,176, 94, 17, 87, 94, 94, 94, 62,114,185,188, 70,153, 53,140, 97, 24,176, 44,171, 75, 72, 72, -120,173, 69,223, 52, 69,121,191,103, 38, 69,181,110,223,229, 93, 92, 62,251, 59, 23,113,106,203,224,234, 76, 49,119,118,114, 76, -187, 27,147, 18, 12, 40,145,145,111, 68,118,161, 17, 89, 5, 38, 88,108, 28,252, 60,229, 72, 79, 75,133,179,147, 50,205, 94, 62, -153,103, 64,111,154, 48, 19, 56, 10,191, 26,114, 98, 79, 1,128, 46, 51,102,210,129,221,155, 30, 70, 71,223, 95,219,111,248, 20, -113,143,247, 38,137, 54, 47,251,108, 22,128,225,118,119, 14,185,185,250, 99,199,142, 69,248,248,248,244,251,238,187,239, 76, 0, -196, 38,147, 73, 62,102,204, 24,121, 74, 74,202,151, 0,236, 74, 99,135,209,219,220, 40, 41,233, 45, 34,198, 17,126,114, 93,207, -110,157,218,162, 93,168, 47,210, 59,181, 5,128, 47, 82,244,202, 64, 83,189, 95,247, 91, 89,252,177,113,199,169,165,227,134,117, -251,114,183, 96,254,234,172, 19,243, 43,181,136,197, 93,221,214,171,188,174, 67, 88, 26,248,254,188,192,178,177,164, 58, 46, 56, - 98,101, 57,232, 77, 54,232, 77, 54,104,141, 86,156,191,151,139,156, 34, 51, 10,117, 22, 24, 77, 44, 8, 0,139,149,148,173, 42, - 82,185, 88,141,216,233, 92,246,189,102,216, 48,245,186, 5, 83, 28, 15, 93, 75,135, 66, 82, 18,143,229,164, 16,195, 81, 46, 4, - 64,112,233,210, 37,148, 77,143,175,234, 45,254,208,233, 91, 88,189,227, 2, 78,111,157, 9,169,152, 65,211, 65, 11, 48,106, 80, -107,112, 28,193,147,216,168,156, 6,193,205, 60,105,165, 28, 52,141,178,152,148,202,202,211, 21,192, 49, 0,253, 0,188, 11,128, -168, 98,142, 22,254,206,230,235, 46,156,220,167,208, 25, 76,182,194,148, 71, 63, 65,151,215,185, 44, 9,165,111,192,151, 0,116, -122, 93, 99,182,204, 35,112,221,167,147,166, 13,173, 95,191, 30, 14,236,221, 6, 66,168, 67,246,222,188,251,120, 4,214,172,125, -113,198,224,132, 73,147, 26,108,222,184,241,133,115, 31,143, 25, 95,217, 44, 66,202,217,221,123,102, 80,195, 16,220,136, 78,199, -138,121,147, 35,141,185,137, 35,204, 74,215, 9, 22, 93,214,191, 66, 66,155,193,203,211, 21,217, 89, 57,232, 58,176, 7,250,244, -234,133,135,247,239, 98,209,183, 95, 69, 64,111,238, 89,149,213,246,111, 33, 36,156,216,165,215, 32,161,222,100,193,250, 21,223, - 98,194,140,197,104,211,181,191, 48,234,222,205,137, 0, 22,216,155,103,179,149, 67,215, 38,238, 48, 91, 89, 88,172, 28,142, 37, - 50,130, 87, 45, 5,128,128,161,233,102,245, 74,220,187, 26,131,181,242, 74, 16, 80,217,133,154,226, 58, 63, 45,158,202,232, 76, - 44, 84,106, 19,114,139,204, 80,105, 76,200, 83,155, 74,196,149,218,140, 60,181, 9, 2,134, 66,124, 98, 6, 24,134,170,118,252, - 93,145,206,130, 86,129, 46, 0, 40,208,175,233, 14,201,179,185,247,185, 31,151,222,125,197,194, 57,162,123,137, 90, 60, 72,210, -148, 10, 43, 26,226,231, 4, 22,103, 71, 8,150,123,112,255,118, 35,134,244,109,228,168,144, 34, 35,182, 24, 2,154,130,128,161, -224,232,238, 11, 39,169, 17, 83, 38, 79,128,107, 13, 39,164,230, 25,177,238, 72, 28, 30,196, 36,128, 51, 84, 47,219, 27,246,156, - 30,252,241, 71,195, 36,180, 80,138,221,103, 19, 33, 22, 49, 16,192,140,152,155, 87, 76, 57,233, 73,150, 98, 77,145, 66, 32, 16, -218, 69, 74, 1,196,198,114, 32,132, 96,201,247,179,241,219,142, 13, 56,125, 39, 7, 4, 37, 75, 53,252,117,120, 21,166,205, 90, - 4,149,198, 12,128,122,109, 5, 75, 81,212, 73, 66,200,187, 47, 11,161,151, 69,210,115, 22,168,242, 56,110, 63,207, 81,118,125, - 69, 2,238,249,152, 44,216,185,216,182,160, 28,165, 72,149,137, 43,169, 88,124,118,199,186,217,178,243,113,120, 38,174, 12,218, - 60,236,218,186, 89, 75,192,189,147, 27,125,236,150,189, 5, 34,119,111, 16, 42,145, 75, 46,207, 89,180,206,228, 83,203,223,118, -234,158, 38,191,216,200,190, 98, 6, 17,201, 21,172,194,201,221, 40, 16, 75, 86, 11, 13,230,111,243,242, 30,233,170,170, 82,142, - 16, 28,191,153, 13,112, 37,149,120,224, 74, 70,201, 58, 62, 12, 5,150, 43,241,115,159,139,204,125,118,206,190, 10, 4,246,159, -141,204,171, 72, 92, 57, 59, 59,195,217,217, 25, 74,165,178,186,109,163, 92,203,149, 92, 46,175,113,230,204, 25,169,163,163, 35, - 24,134,129,201,100, 66,143, 30, 61, 94,171,241,201, 61, 2,135,183,233, 54,120,105,135,174,239,226,226,153,195, 92,196,169,237, - 67, 12,170,106,172,223, 3,160, 79,167, 38,199, 87,172, 90,239, 63, 99,214, 28,137, 66, 42, 64,161,214, 2,134,166,224,231, 33, -131,171,146, 65,196,133, 19,198, 17,189,155,217, 45,254,124,107,213,217,181,106,221, 38,215,213,203,191,239,121,239,170,217,179, -168, 40, 73, 3, 0, 6, 85,252,166,184, 40, 42,182, 86,237,179,151,155,118, 26, 12,143,154, 1,125,147,114, 98,171,149, 95,149, - 74,149,123,248,240,225, 71, 33, 33, 33, 45,134, 12, 25, 66,150, 44, 89,226,146,158,158,126,208, 94,113, 5, 0,221,122,181,155, -166, 16, 90,219,186,202,232,144,122, 94,114,180, 11, 45,241,126, 14,123,183, 3,106,249,214,198,211,108,125,179,124, 3, 39,210, - 89,133,245, 54,110,218,118,219,175,134, 96,156, 77,107,136, 1,112,180,218,157, 3, 74, 59, 73,121,169,184,146, 10,160,148, 9, -193,145,146,223,236,183, 96,113, 48, 91, 56,232,205, 54,232, 77,108,137,216, 50,179,224,184,146, 96,101,138,162, 96,177,178, 85, -190, 13,150,215, 75, 58,186,184,193,191, 78, 73, 26,159,125,100, 66, 80, 20,224,238,238, 14, 87,215,170,215, 29,229, 56, 14,102, -139,173,116,208,101,159, 77,234, 48, 91,108, 32,132, 32, 46, 46,126,102,114, 98,242,192,128, 6,245, 59,133, 52,105, 86, 67, 38, -166, 81,106,157,170,236,173,118, 4, 0, 43,158, 91, 51, 77,200,192,120,228,240, 33, 69,191,254,253, 11, 45,186,188,231, 39, 75, - 48, 0,122,151,138, 49, 67,117,171, 73,225, 30, 56,200,197,181,198,226,145,163, 39, 4,118,125,167, 23, 46,157, 63,135, 99,135, -247,237,212,171,226,206,218, 75, 18, 20, 20,244,202, 44,194,250, 1,129,175,204, 34,172,227,223,160, 66,129,229,228,212,196,177, - 73,203, 46,190, 41,121, 22,252,241,199, 41,232,212,217,243,204,102,173, 30, 66,178,229,207,195,191,140, 29, 49,241, 59,199, 54, - 45, 91,192,217, 65, 14, 55, 23, 37,238,222,137,192,242, 5,115, 34,160, 55,247,172,186,255, 44, 69,112,176,168,166,204,119,170, - 95,189, 70,184,123,243, 26,158,196, 69, 69,223,187, 29,209, 40, 32,180, 53,220,125,252,166,166,184, 49,203,240,232, 81,149, 59, - 85, 16,150,164,127, 50,254, 95,165,131, 94,201,185, 54, 77,253,197,175, 54, 66, 10, 54,171,133,221,189,121,121,238,243,179, 8, - 43,226, 53, 22, 23,133, 95,189,249,240,171, 1,189, 58, 82,101,174,192, 50, 81,245,242,113, 64, 77, 5,158, 60,124,204, 89,117, -234, 67,213,171,114,146, 51,105,242, 23,178,146,180,115, 32, 37, 11,171, 85,183,221,192,200,138, 62,220,248,253, 55,212,253,100, - 29, 30, 38,105, 74,220,130,165, 2, 75, 34, 98, 32, 46,253, 75,136, 29,250,130,166, 87,124,252,126, 47,228,169,205,224, 8, 41, - 93, 75,143,130, 64, 32, 68,138, 6, 72,211,104,161, 42,202, 65, 98, 82, 50,212,217,137,160,105, 6,174, 53, 3,160, 79,181, 47, -173,197,172, 50,208,202,161,254,251,253, 58, 50,191, 95,207,130, 76, 34, 64,113, 94, 26,174,157, 57, 96, 32, 44,187,201,108, 53, -255,230, 65,196, 81,143,162,194, 45,118,118, 29, 42,141,206,236, 41, 17, 49, 56,176,253, 39,124, 48,106,210, 51,107, 54, 0,124, - 53,103, 33, 40,138, 66,161, 90, 11,128, 82,217, 97,185,122,254, 88,245,156,229,233,149,227,231, 68, 81,121,199, 84,233,177,185, - 2, 14,243, 75,162,202,252,210,121,243, 75,124,118, 45,142, 92,161, 5, 75, 72, 51,231,182,175,253, 70, 26,157, 43,193,173,199, -217, 24,218,177, 22,244,154, 60,108,254,121,141,214,104,181,244,201,139,178, 95, 92,149, 54,148, 94, 31,140,153, 30, 93, 47, 32, -216,124, 62,170, 56,177, 72,103,173, 48,142,161,245,208,111,162, 35, 79,254,212, 87,109, 77,156,172,240, 14, 97, 57,155,109,133, - 65, 21,247,125,249,157, 56, 17,127,183,238, 64,137,184,226, 56,124,189,124, 23, 8,199,150, 46,224,199,130,176, 28, 62,159,183, - 1,182,210,239, 44,199,130,178,178,242,170,146,171,148,138,206, 54,214,174,113,122, 89, 92,133,133,133, 21, 57, 59, 59,195,213, -213, 21, 46, 46, 46, 40, 19, 68,111,234, 22,164,105, 26, 74,165, 18,151, 46, 93,130, 82,169,132, 66,241,122, 11,228, 43, 60,130, - 62,104,213,109,208,158,174,253,199,208,127, 30,217,204,222,188,116, 98,168, 81, 21,107,183, 8, 96, 89,150,178, 90,173,232,213, -165,121,202,189,216,212,211, 11,191,255,190,119,203,110,239, 73,218, 5,121,192, 96,182, 33, 61, 45, 13, 17, 23,143, 25, 3,106, -187,157,110,215, 34, 48,221,106,181,130,101,217, 42, 7,112,147,201,156, 79, 11,165,174,195,134,127, 40,185,125,235,214, 30,185, - 71,224, 62,154,225,238, 19,150,105, 2,194,125,208,164,113, 48, 44, 54, 14, 6,189,166,224,117,242, 29, 29, 29,125,123,213,170, - 85, 65, 66,161,176, 86,120,120,120, 94, 97, 97, 97,181,182, 11, 58,119,242,214, 58,129,210, 26, 95,102,193, 74,235,216, 22,195, -251,117,192,111, 39,175,225,226,149, 8,164,232,149,247,116,102,230,247,244,244, 76, 83,136,139,250,240,160,246,117,153, 67,187, - 52,135,162,187,204,124,159, 16,217,185,188,203,243,237,158,224, 65, 81,128,198, 96,125,206,130, 85, 18,223, 68,211,148,221, 22, - 44, 10, 72,188,114,253,110,104,243,192, 96,220,123,170,129,170,208, 4,189,185,164,221, 19, 16,184, 58,138, 32, 17, 49, 72, 73, - 74, 4, 71, 44, 73,213, 27,103,160,234, 51,116,130,160,244,245, 69, 32, 20, 10,158, 5, 68,200,164, 98,173,135,135,135, 93, 2, -203,202,178, 24,210,171, 53,218,180,108,130,129, 19, 87, 1, 0,206,239,252, 26, 46, 74, 17,194,195,195,145,246,215,218,221,254, -109, 39,158,141,122, 24,243, 94,116,228,245, 15,251, 52,151, 53,243, 18,100,137, 42, 81,197, 71, 75, 93,132, 93, 1,244, 40,181, - 76, 89, 89, 27,151,218,187,119, 47,142,101,185,231, 99, 34, 92, 0,180, 5, 80, 0,224,110,169, 40,171,228, 5, 48,232, 29,208, -216, 7,138,146, 42,101,242,148,186,117,235,249,180,108,211,218,105,208,144,247, 33, 22,137,241,231,185, 51,248,113,205,178, 3, -218,172, 71, 99,170,229, 30,179, 51,160,189, 50,119,145, 90,237,164,139,139,185, 87,152,152, 99,118, 17, 56, 55,128, 80,226, 48, -129,114,242, 89,199, 72,148,223,213,108, 51,202,241,252,181, 91,136,190,119, 29, 62,110, 50, 36, 62, 73,208, 71,221,143,220,160, -167,132,223, 35,239,145,222,222,116,202,243,217,247,218,140,236,237, 98,180,176,184,122,225,164,145,179,113,189,111, 92, 62,245, -196, 55,176,165, 52,180,101,119,151,188,163, 91,134,232,129,223,170,226, 73,190,181,231,149,208, 11,134,188,159,121,234,220, 21, -165, 79,237, 0, 6, 20, 13,147, 65, 7, 85, 74,148,205,168,201,209,231, 70, 29,245,177, 43, 28,192,150, 49,239,219,101,155, 38, - 55,111,218, 72, 65,136,248, 5,139, 85,217,247,252, 98,115, 73,204,172,174, 8, 79, 31, 94, 51,170, 18,212,179, 43,239,235,172, -242,252,252,130,103, 83,243,101, 90,231, 58,106, 39,181,228,217,176,206, 0, 78,106,231,103,150,138,252,252, 2, 49,203, 90,229, -246, 60,158,206, 14, 82, 60, 76,202,124, 22,208, 46, 17,209,165,177, 87,127, 91,178,236,124,206,155, 11,196, 10,100,228, 27, 65, - 19, 2,142,179,193,102, 53, 67,171,209, 32, 51, 35, 27, 57, 57,185,208, 22,171, 33, 83, 58, 35,180, 89, 11, 56, 56, 56,224,209, -157,139, 0,168,227,118,137, 65, 78,212,160,101,139, 22,194,232,228, 98, 88,172, 28,132,176,224,234,233,253, 70,155,213,220, 63, - 55,234,232, 5,192,142,173, 68,158,119, 15,114,228,207,168,216,148, 70,190,110,222, 84,228,211, 34,236,250,101,125,201,108, 82, - 91,137, 53, 51, 58, 85,135,204,124, 29, 50,210, 82, 8, 56,246,207,234, 60, 75, 20, 69,221,174,236,248, 53, 45, 97,111,204,241, - 90, 2,203,102,179, 73,107,251,213,193,240, 9, 35,177, 97,195, 70,196, 61, 77,193, 47, 63,175, 45, 17, 87, 15,127,255,203, 78, -254, 80,148,174,149,161,207,137, 93, 97,116,105,149,126,252,126, 33,109, 48, 19, 91,229,157, 93, 93,116, 28,179,250,140,161,184, - 64,204,154,244,130,227,187,199,236, 43,143, 19, 0, 24,154, 50,151,186, 5, 65, 81, 20,202,220,130, 27, 22,140,131, 92,194,128, -162, 40,232, 77, 54,124,252,229,106,236, 92, 93,242,102,245,233,228,233,250,138,210, 89, 38,132,190,108, 27, 79,141,238,237, 63, - 96,209,214,152,163,215,146, 93,159,190,251,110,103,117,179,102,205,138,100, 50, 25, 20, 10, 5, 28, 29, 29,225,232,232, 8,103, -103,231, 42,243, 94, 10,207,170, 98,174,104,154,134,163,163, 35,100, 50, 89, 69,194,237,101,206, 23,197,149,103,131,247, 91,117, - 25,184,175,219,128,177,244,159, 71,126,225,238, 92, 58,254,190, 81, 21,247,187,189,117, 84,106,117,184, 63,100,200,144,198, 19, - 38, 76, 16,125, 51,121,200,153, 51,151,238,198, 29, 62,119,168,127, 65, 81,177, 47, 33, 4,206, 78,202,180,161, 61, 26, 31,239, -216, 50, 40,229,252,249,243,220,190,125,251, 76, 20, 69, 61,172, 42,157,121,121,185,219,207,159,191,176,188, 83,231, 46,248,101, -199,190,119, 99, 98, 30,189,251, 36, 33, 30,190,126,245, 80,183, 94, 3,232, 41,103,156,191,124, 21,197, 5, 57,219,237, 44,207, -191,127, 8, 13,173,201, 48, 76,173,162,162, 34,227,188,121,243,130, 88,150, 61, 22, 26, 26,218,130,227,184,172,152,152,152,116, -123,242, 30,177,251, 99, 21,128, 93,126,157, 71, 29,204,180, 20, 77, 5,176,204,183,118,109, 92,188, 18,129, 27,127,221,220,152, - 39,175,253,253,232, 15, 63, 25, 87,199, 85, 56,110, 96,187, 58,140,135,139, 28,123,127, 89,197, 28,189,158,188, 38, 57,223,250, -235,242,203,243, 23,217, 83, 71,101, 40, 40,182,160,125,136, 43,108, 54, 2,150, 16,208, 20, 5, 7,153,160, 34,129,245, 10,167, -192, 44, 25, 51,105,226,132, 39,161, 77,154, 77,251,112,212, 4, 81,179,250,181,113, 43,190, 16, 0, 5, 87, 71, 57, 50, 51,179, -112,245,216,175,182,194,140,199, 27, 25,134, 91, 80,157,242,204,136,220, 31, 80,246,221,203,203,107,252,189,168, 40, 92,186,116, - 9,174,174,174, 40, 19, 87, 21,184, 8, 95,224, 44, 44, 44,254,107,225,170, 95,219,143,251,104, 32,250,117,105,132,203,183,159, -192,108,229, 96,177,113,207,130, 92, 19, 35, 54,137,167, 14,171,103,158, 60, 36, 80,163,183,138,147,191, 75,214, 92,198,139,139, -200,190,156, 78, 51,128, 51, 0, 90, 3, 24, 8,224,236, 75,123, 12, 82, 40,137,187,106, 4, 32, 2, 64,162, 93,121,167,177,247, -238,237, 59,174, 22, 27,135,171, 55,239, 7,119,107,223, 12,132, 35,184,125,251, 14,182,108,219, 98,124,248,224,222, 74, 93,142, -215, 2, 84,188,101, 76,185,229,105,239, 44,194, 10, 4, 86, 41,231,101, 91,118,114,208,198,235,215, 46,207,145,248,180, 64,195, -190,223, 12,200,184,127,108,128, 87, 72, 47,184,213,111,143,204,251,191, 35,242,175,189,167,238,216,108,179,164, 28,157,162,207, -139,213,217,251,188,151, 65, 34,149, 79,105, 20,214, 25,105,169,201, 72,138,143,218,105, 44, 72,200, 76,121,194,236,204, 72, 79, -153, 88, 55,164, 61,174,157,249,237,139, 74, 4, 86,165,109,222, 77,172,222,120,233,218,245,225, 25, 7,143,121, 22,107, 13, 50, -129,128,214, 75, 24,228,136,244, 79,246,219,157,206, 71,143, 44, 69,245, 28,135,124, 56, 97,238,201, 53,203,231, 9, 61,156, 37, -200, 46, 52, 66,163,183, 66, 99,176,130,161,128, 0, 31, 37, 12, 58, 13,110,156,218,101, 37,150,130, 33, 64,164,181, 34, 78,183, -144, 1,139,140,249,137,159,207,157, 59, 27,140,216,209,167,110,183,217,150, 18, 85,254,210, 98,230, 53,128,186,254,179, 97,210, -100,245,159, 59,119,118, 16, 33,164,187, 91,200,128,226,231,246, 34, 44, 55,239,249,197, 22,124,212,213, 23,102,107,201,250, 97, - 44, 91, 18,107,199,149,174,106,142,202,237,202,207, 56, 9, 32, 58,112, 50, 2, 25, 57,133, 48,152,172, 48, 91,108, 48,219, 88, -208, 52, 3, 23, 23, 23, 4,248,135,193,217,201, 17,185,121,249,184, 29,113, 13, 55,226,238, 37, 18, 96, 81, 94, 13,245, 30,123, -234,136, 18, 40, 2, 60, 61,220,168,156, 98, 51,164, 18, 6, 55, 46, 93,182, 2,216, 94, 38,174,170, 51,118, 0,128, 90, 95,180, -122,214,194,117, 35, 54,172,250,206,171, 73, 93, 71,164,229, 25,145,174, 50,160,216,104, 3, 64, 96, 99, 9,204, 70, 53, 98,111, -159,206,182, 65,191, 26,255,112, 84,108,193, 18, 10, 77,183, 31,196, 73,102,205,255, 1,143, 18, 18,177,101,227,122,157,169,122, -226,234, 21,108,255,204,255,183,127, 71, 38,202,115, 11,114,132,224,248,141,236,103,219,126,148,185, 10,239, 38, 20, 85, 69, 39, -252, 97, 74,179,153,101, 66,232,199, 35, 25, 55,254, 31,123,247, 29, 30, 69,185,254, 13,252,187,187,179,125,211,235,166, 27, 82, -128, 64, 40,161,183,208,133, 32, 45, 8, 10,210,132, 35,130,192, 81,218, 15, 57, 82,130, 98, 59,162, 20, 11,138,116,233, 77,138, - 84, 67, 12, 72, 21, 66, 66, 32,164, 39,164,215,205,166,109,159,221,121,255,128,228, 32, 39,101,131,250,158,115,224,254, 92, 87, - 46, 72, 50,251,205,204,236, 51,179,247, 60, 83, 30,137,164,204,146,147,147, 83,177,123,247,238,250,162, 71, 32, 16,160,238,122, - 41,131,193,208,236, 93, 69,142,118,226,246, 83, 34, 94,120,181,177,226, 74, 32, 16,192, 98,177,212,247, 94,181,244,212,163,220, -181,245,208,110, 3,198,238, 27, 52,230,111,252,232, 31,191,183,220,252,229,248,248,218,210,148,163, 45, 93,151,106,181,250, 46, -128,212,181,107,215,118,222,178,101, 75,171,197,139, 23,103,124,255,241,236,141, 15,143,224, 30, 30,203,196,197,197,113,115,230, -204,209,235,116,186,204,138,138,138, 91,176, 98,144,107, 77,113,242,218,237,223,252,179, 77,110,126,225,244,192,246, 61,224,226, -223, 29,202,192, 30, 80,213, 24,113, 61, 45, 31, 25,247,162,145,116,229,208,126,109,169,251, 71, 64,138,213,243,219,169, 83, 39, - 95, 62,159, 63,138,227,184,214, 10,133,194,159,227, 56, 49,195, 48, 19,120, 60, 94, 42,203,178,247, 66, 66, 66,162,147,146,146, -172, 30, 51,236, 65,236, 14,189, 95,255,233, 27, 30,104, 20, 3, 50,138, 52, 97, 15, 52,138, 56,141,196,126, 97,233,133, 13,250, - 29, 2,175,117, 48,149,223, 61,180,179,242,200,158,205,159, 11, 38,207, 90,100, 78, 84,217,189,205,216,200, 90,212, 91,198,231, -241, 10, 23, 47, 94,242,175,199, 52,240, 30,158, 24,124,244,200,134, 2,107, 50, 30, 61,211,104,105,194, 61,225, 87,137,239,204, -254,160, 67,183, 62, 83,250, 15,127,149,111, 35, 82,224,252,209,111,185,204,132,152,131, 12,103,126, 79, 91,154,145,249, 71,183, - 47,131,193,240,187,194,202,154,222, 43, 0, 40,117,174, 28,240,211,185, 95,166,159, 60, 19,251,113,196,208,190,206, 95,175,120, - 5,255,252,238, 24,108,228, 18,112, 22, 51, 94, 25,232, 51,126,229,223,218,142,242,113,151,122, 29,142,201,187, 56,111, 93,226, - 82,141,198,152,130,230,199,189,227, 0, 92, 3, 16, 4, 96,212,163,233, 21, 0,106, 1,212, 60,250,253,143,143,190,183,154,145, -181, 32,171, 88,135, 99, 71, 14, 33,254,122, 52,146,146,146,171,147,238, 37,125,201, 99,184,117,181,197,169, 42, 32,181,197,235, -206,220,224, 29,131,104,248,206,194, 38,212, 10,100, 31,197,157,252,108, 64,240,160,191,247,114, 14,236, 3, 71,191,135, 53,101, -101, 94, 34,114,127, 59,116,172,186, 64, 52, 1,184,107,170,125,202,247,216,211,167, 85,176, 69, 32,198,149, 95, 78,129,179, 88, - 54, 1, 0,103,177,108,186,253,235,169,217, 61, 34,102,194,201,205,175,147, 58, 39,174,201, 71,249, 52, 70,198,176,149, 63,237, -248,232, 96, 86, 86, 22,238,223,191,143,180,180, 52,168, 84, 42,236,217,115,169, 69,207,106, 42,205,184,122,158, 39, 96,134, 77, -122,253,157, 19,145, 47, 71, 74,125,253, 3,249,109,188,237,224,108,203, 32, 57, 61, 31,233,137,169,150,180,132,139, 58, 78, 91, - 50,182, 52,253, 74,163,189, 35, 46, 33,227,221,249,124,211,187,209,199, 31,142, 45, 56,100,204,140, 54,255, 55,111,113, 79, 39, -103,199, 6,247,227,170,242, 10,113, 84,212,202, 54,117,211, 55, 55, 22, 33, 95, 32,168,158, 53,123,190,130,207,227,215,159, 6, -228,234, 86, 91,221, 63, 28, 7,240, 0,145,144,105,246, 45,155, 30,217, 23,172,197,130, 26,173, 17, 53, 26, 35,212, 53, 58, 20, -149,169,113,247, 94, 58,110, 92, 58,141,172,244,180,106,150,101, 99,192,225, 72,169,115,229,254, 6, 30,172,219,120, 15, 43, 4, -190, 78,142,182,200,170,208, 65, 38, 98, 80,144,147,198, 26, 89,221, 83, 63,100,189, 60,254, 68,161,160,253,232, 23, 95,127,235, - 31,103,194,195,251,217,117, 12,235,170,112,177,179,133,136,225, 33, 61,167, 24,119,226,126,171,125,144,114,187,202,108,210, 14, - 47,191,123,226, 15,143,210,242, 63, 91, 96, 25,205,236,144, 69,255,248,228,156,217,108,150, 49, 2,129,214,196, 89,134,255,145, -226,234,175,194,113,150,188,183,222, 94,242,187, 3, 2,147,217, 34,251,219, 91,139,181,143, 31, 32,240, 76,102,121, 93,207, 21, -199,113, 77,245,106, 8, 74,213,250,234,101,223,196,239,252,116,231,189, 67,120,248, 4,215,188, 63, 58,159, 21, 85,134,120,231, -161, 7,198, 84,107, 88, 30,128,164, 6, 50,107, 7, 13, 26, 84, 95,108, 61, 58, 93,103,245,254, 82, 44,149,207, 30, 56,106, 6, - 63,250,216, 22,203,111, 49,199, 38, 60, 77,113,245,248,219,175,211,233,174,235,116,186,196,247,222,123,175,155,187,187,187,251, -202,149, 43,165, 85, 85, 85,194,175,191,254, 90, 87, 86, 86, 86, 84, 85, 85,117, 21, 45,187,174,197, 82,145,119,231,245,159, 14, -155,190,229, 29,218,250,162,163,155,215, 48, 7, 23,159,214, 21,165,121,233, 85,229,121,103,120, 22,156,175, 41, 77,185,218,210, - 25,141,143,143,207, 9, 13, 13,253, 81, 32, 16,120,155,205,102, 23, 30,143,103,195,113, 92, 5,203,178, 21, 22,139,165,176, 37, -197,213,227, 69,150, 79,219,190,123,203,181, 22,177,145, 39,221,251, 32,118,135, 30, 0, 74,206, 47,209, 0, 56,142, 1,255, 23, -121,236, 74,214,151,119, 43,236,230,151,198,254,243, 68, 75,243, 11,110, 31, 8,250,179,218,191,174,240, 94, 30,128,233,119,110, -226,243,196,184,171,171,120, 28,132,102,176,107,180, 37,105, 55,255,140,124,161, 80,168,235,218,181,107,131,119, 11, 74, 36,146, -166,159, 91, 22, 27,203,150, 0, 91,208,191,255,142, 51,209,151,166,159, 62,255,235,199, 61,123,245,117,150, 74, 60,225,231,104, -196,142, 37, 93,254, 30, 29, 87,122, 99,244,146,139,223,100, 20,232, 18,208,244,245, 87, 13, 73, 3, 80,249,168, 39,107, 51,128, - 89,143,182,173,196, 22, 23, 2, 22,188,214,171, 87,247, 61, 60, 30,143,225, 88,203, 63,175, 10, 5,123,117,133, 73,121,248,131, -195,135,116,244,183,195,172,217,179,131, 3, 2,255,117, 23, 97,251, 23,108, 49,121,250, 27,193,126,173,130,235,127,214,198,167, -153, 3,170,194, 56,109,141, 91,232,208,228,115,107, 87, 56,167, 95,126, 75,230,228,109, 83, 91,150,173,170,200,190,185, 86, 83, -226,190,182,129, 17, 26, 90, 36, 43,237,238,186,173,159, 47, 93, 92,152,159,190, 69, 83,154,250,240,172, 67,105,106, 98,210, 45, -172, 40, 43,202, 91, 92, 94,146,177,246,105,215, 69,109,109,109,193,238,221,187, 29,250,244,233,195,119,119,119, 71,105,105, 41, - 98, 98, 98, 44, 22,139, 37,191,165, 89, 37,169,151, 98, 16, 16,224,180,119, 71,229, 63, 25,153,237, 8,214, 12, 79,142,227,192, -240,121,133, 70,125,229,153, 82, 7,237, 18,220,185,214,100, 59,226, 44,102, 30,199,231,248,117, 99, 11, 90, 44, 22,222,103, 95, -237,202, 22, 8,197, 13,158, 82, 53,155, 12,114,139,197, 98,245, 88,132,197,130, 7,206,161,166,182,205,223,197,199, 1,137,188, -251,205, 28,156,114,103,123, 71, 76, 29,198,178,102,211,163,237,163,238,171,132,227,120, 23,192, 51,159, 43,115,170,190,218,146, -162,234,119, 59,122,163,209, 1,124, 17,108,229, 38,240,193, 67, 85,101,165,196,213, 44, 78, 42,251, 3,109,169,228,238,241,187, - 37,253,251,251, 25,126,190, 48, 45,246,210,229, 9,156,197,226,111,230, 0,112,188, 44,131, 81,119,176,196,174,108,231,211,206, -239,255, 26,222, 95,156,111,213,233,146,255,194, 76, 17, 0, 23, 60,124, 36,126,241,159, 60,159,141,142, 45,248, 71,150,221, 70, -217,182,175, 68, 42, 95,162,209, 84,111,209,150,164,158,248,147,215,167,189, 68, 34, 9,179,177,177, 17,150,149,149, 93,127,244, -161,246, 44,190,239,245,250,190,190,205,101,208,176,222,239,156,255,233,198,134, 71,167, 15,235,121,141,255, 66, 58,121, 68,248, -194, 93, 71, 78,174,107,224, 46,194,255,249,101,255,203, 50,251,247,103,220, 42,236,166,155,205,150, 53,131,130,171, 53, 69,153, -201,115, 46,221, 41,189, 14,160,250, 15,206,231,164,199,122,176,246,254,183, 44,187,107,251, 49,239,131,135, 16,171, 19, 56, 36, -149,222, 61,182,178,217,249, 12, 9, 17,201, 75,225,168, 41,115, 41,127,138,194,234, 63,209,150, 4, 29, 58,116,232, 39, 18,137, -124,205,102,179,220, 96, 48,104,180, 90,109, 86,118,118,246, 21, 52, 62, 32,249, 95, 58,159,110,161, 99,214, 9,133,194,183, 1, -192,100, 50,109, 40, 73, 60,182,160,169, 23, 54, 49,253, 95,191, 62,199,143, 23,224,208, 33,243, 95,241, 30,121,118,126, 89,109, - 50,177,245, 99, 15,137,132, 76,101,254,237,195, 14,255,193,182, 68, 90,248,166, 82, 38,101, 82, 38,101, 62,137, 79,235,147, 50, -255,147,153, 30, 33, 35,125, 60, 66, 70, 90,253,176,228, 70,166,167,245, 73, 26,197,208, 42, 32,132,252, 7, 88,104, 21,144,255, -164,194,164,147,185,127,229,244,132,240,154,168, 66, 91,210,245,247, 52,149,108, 34,101, 82, 38,101, 82, 38,101, 82, 38,101, 62, -119,153,205,101,211,169,199,191,168,240,162, 76,202,164, 76,202,164, 76,202,164,204,231, 47,243,153,194,167, 85, 64, 8, 33,132, - 16, 66, 5, 22, 33,132, 16, 66, 8, 21, 88,132, 16, 66, 8, 33, 84, 96, 17, 66, 8, 33,132, 16, 42,176, 8, 33,132, 16, 66, 8, - 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, - 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,127, 29, 26,105,156, 50, 41,147, 50, 41,147, 50, 41,147, 50,159, 59,244, - 36,119, 66, 8, 33,132, 16, 42,176, 8, 33,132, 16, 66,168,192, 34,132, 16, 66, 8,161, 2,139, 16, 66, 8, 33,132, 80,129, 69, - 8, 33,132, 16,242, 95,131,135,198,239, 4, 72,108, 65,206,211,220, 77,144, 72,153,148, 73,153,148, 73,153,148, 73,153,207, 93, -102,115,217,137, 32,127, 73,225, 69,153,148, 73,153,148, 73,153,148, 73,153,207, 95,230, 51,133, 78, 17, 18, 66, 8, 33,132, 80, -129, 69, 8, 33,132, 16, 66, 5, 22, 33,132, 16, 66, 8, 21, 88,132, 16, 66, 8, 33,132, 10, 44, 66, 8, 33,132, 16, 66, 8, 33, -132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, - 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66,200, 95,136, 70, 26,167, 76,202,164, 76,202,164, 76,202,164,204,231, 14, 61,201,157, - 16, 66, 8, 33,132, 10, 44, 66, 8, 33,132, 16, 42,176, 8, 33,132, 16, 66,168,192, 34,132, 16, 66, 8, 33, 84, 96, 17, 66, 8, - 33,132,252,215,224,161,241, 59, 1, 18, 91,144,243, 52,119, 19, 36, 82, 38,101, 82, 38,101, 82, 38,101, 82,230,115,151,217, 92, -118, 34,200, 95, 82,120, 81, 38,101, 82, 38,101, 82, 38,101, 82,230,243,151,249, 76,161, 83,132,132, 16, 66, 8, 33, 84, 96, 17, - 66, 8, 33,132, 80,129, 69, 8, 33,132, 16, 66, 5, 22, 33,132, 16, 66, 8,161, 2,139, 16, 66, 8, 33,132, 16, 66, 8, 33,132, - 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, - 8, 33,132, 16, 66, 8, 33,132, 16,242, 23,162,145,198, 41,147, 50, 41,147, 50, 41,147, 50, 41,243,185, 67, 79,114, 39,132, 16, - 66, 8,161, 2,139, 16, 66, 8, 33,132, 10, 44, 66, 8, 33,132, 16, 42,176, 8, 33,132, 16, 66, 8, 21, 88,132, 16, 66, 8, 33, -255, 53,120,104,252, 78,128,196, 22,228, 60,205,221, 4,137,148, 73,153,148, 73,153,148, 73,153,148,249,220,101, 54,151,157, 8, -242,151, 20, 94,148, 73,153,148, 73,153,148, 73,153,148,249,252,101, 62, 83,232, 20, 33, 33,132, 16, 66, 8, 21, 88,132,128, 85, - 79,218, 0, 0, 32, 0, 73, 68, 65, 84, 16, 66, 8, 33, 84, 96, 17, 66, 8, 33,132, 80,129, 69, 8, 33,132, 16, 66,168,192, 34, -132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, - 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132, 16, 66, 8, 33,132,252,133,104,164,113,202,164, 76,202,164, 76,202,164, - 76,202,124,238,208,147,220, 9, 33,132, 16, 66,168,192, 34,132, 16, 66, 8,161, 2,139, 16, 66, 8, 33,132, 10, 44, 66, 8, 33, -132, 16, 66, 5, 22, 33,132, 16, 66,200,127, 13, 30, 26,191, 19, 32,177, 5, 57, 79,115, 55, 65, 34,101, 82, 38,101, 82, 38,101, - 82, 38,101, 62,119,153,205,101, 39,130,252, 37,133, 23,101, 82, 38,101, 82, 38,101, 82, 38,101, 62,127,153,207, 20, 58, 69, 72, - 8, 33,132, 16,242, 39, 99, 26,252, 97,247, 53,197, 44,203,186, 1, 0,195, 48, 37,166, 27,203,149, 77,133,248,120,120, 12, 49, - 3,223, 3,128, 0,120, 35,175,176,240,124, 3,153,231, 89,150,117,124,148, 89, 97,186,177,252,197,166, 50,133,221,215,156,123, -124,122,246,198,242,161, 79, 78,195, 1,124, 97,247, 53,133, 79,204,171,135,181, 11,207, 3, 44,255, 63,230,243,127, 37,243,121, - 38,236,177,166,216,100,122,216,142,132, 66,166,196,120,189,233,118, 36,234,177,166,240,241,233, 77,215,151,187, 63, 57,141,184, -215, 71, 57, 38, 19,235, 1, 0, 18,177,184, 52,200,207,125,125, 83,153, 25,185, 37,239,104,117,122,215, 71,153,133,134,171,255, -240,253, 95,221, 54,173,229,238,238,222,149,207,231, 47,231,241,120,118,143,253, 56,161,160,160,224, 29,106,149,132,144,103,174, -192, 98, 89,214,237,214,209, 85,168,213, 3,131,167,174,113,107, 53,118,243,158, 39,167, 49,233, 42,196,154,212, 99,237, 4, 38, -181,163,131,140,115, 76, 77, 77,229, 3,128,167,167,231,247, 0,124, 27,200,116,188,117,116, 21, 52, 6, 32,124,226,106,199, 78, -126,126,118, 85, 60,222, 34,153, 76, 54, 72,167,211,181, 7, 0,169, 84,122, 87,171,213, 94,176,227,184,207,159,156,190,177, 5, -120,124, 94, 7, 77, 89,227,214, 58,242,251,191,155,205,102,177, 62,227, 64,127, 75,245, 3, 70, 96, 54,124, 53,188,176,240,244, -119,128,217,154, 21,242,248,223,237,255,234, 63,156,125, 60, 60,134,200,228,242,174,114, 27,155,126,102,179, 57,196, 98,177,192, - 98,177, 36,105,107,107, 47,177, 38,211, 77,179, 73,227,124,235,199,143, 44, 77,205,231,147,203,210, 5, 96, 74,148,202, 9, 50, - 27,155, 1, 2,129,160, 15, 0,152,205,230,203,218,154,154, 95,220,138,138, 14, 90,179,236,214,174,159,167,157,254,121, 99, 50, -177,110,153,103, 87, 65,111, 2,194, 94,254,216,173,227,107, 59,247, 2,128,161, 36,222,189, 38,245,120, 15, 0, 80, 4,142,188, - 46, 81,134, 21, 3, 0,243,160,208, 45,229,228,123,208,155,128,144,145,171,221, 26,202, 52, 24,140, 62,105,167, 86, 64,111, 2, -254, 22,117,200, 99,201,236,241,114, 0,136,249,241,187,192,115,135, 54,188, 4, 0, 47,142,127,251,167,129, 99,223, 76, 7,128, -207,190, 61,228,177,251,195,241,208,155,128,208, 49, 31,248, 60,237,182,201,234, 43, 69,234,148,147, 65,166,170, 2, 71, 31, 5, -163,108,233,182,105, 15,216,215, 0,243,120, 2, 65,223,160,160,160, 46, 0,144,158,158,126,203,194,178,191,218, 0, 95,253,153, -109, 73, 32, 16,252, 61, 63, 63,127,212,227, 63,243,242,242,162, 6, 73, 8,121, 54, 11, 44, 0,168,213, 3,177,105, 64,255,158, - 29, 49,107,242, 75, 54,143,255,238,199,237,159,248,228,223, 61, 23,242,217,190,245,130,214,173, 91, 35, 53, 53,213,170, 63,166, - 49, 0,191,164, 2, 18, 93,150,173, 70, 40,204,136, 90,190,220,174,111,223,190,140,167,167, 39, 0,160,164,164,164,231,165, 75, -151,186,174, 94,189,122,142, 68,151, 85,161, 49,160,250, 23, 43,162,235,230,181,125,235, 23,240,222,252,137,246, 0,176,126,209, -193,174,167,174,196, 59,101,101,101, 13,254,232,163,143,202,189,174, 94,221,100, 99,177,108, 75, 46, 46,206,181,102, 62,247,159, -142,147, 5, 25,207,183, 26, 63, 99,198, 17, 95, 95, 95,185,183,183, 55, 79, 42,149, 66, 32, 16,160,166,166,198, 51, 57, 57,121, -200,237,219,183,181, 23,175, 30, 19,198,199,141,203, 44, 16,134,105,173, 89,118, 17, 91, 38,173, 13, 14,190, 55, 62, 34,194,123, -228,200,145, 82,127,127,127, 0, 64, 86, 86, 86,240, 79, 63,253, 52,233,212,169, 83, 43, 69,108, 25,171, 49, 64,215,220,178,215, -101, 2,128, 16,232,237,228,230, 54, 89, 40, 20,134,178, 44,235,245,168,119, 33,223,100, 50, 37,170, 74, 74,118, 63, 57, 61,249, -119,122, 19,144, 84, 8, 12,233, 23,134, 41,227,134, 40, 0, 96,233,171, 31,246,124,144,149, 38, 50, 24, 12,104,221, 38,164,207, - 7, 31,127,113, 22,124, 62,126, 56,242,115,253,244, 77, 22,182, 28, 31,169, 37, 64,194,253, 76,172,250,112, 35, 87,148,112,168, - 27, 91,113,111,104,121, 89, 25, 3, 0,206, 46, 46, 19,246,239,221,125, 94,217,113,252,111,233,197,181,245,211, 91,211,222, 27, -218, 54, 79,237,219,232,153,159,120,161,221, 55,103,183, 8,125,125,125,145,152,152,216,162,109, 19,149,201,182,114, 15,143,164, -168, 37, 75,148,225,225,225, 80, 40, 20, 16, 10,133, 48,153, 76, 67, 46, 95,190, 60,100,213,170, 85,115,170, 42,147,107,173,221, - 54,173,232, 59,252,220,189,117,255,129,145,163, 71,120, 12,234,223, 19,227,134,247,161,134, 72, 8,121,118, 11, 44,134, 97, 74, -134, 78,251,200,173, 95,143, 80,252, 22,159, 82,153,149, 83, 84, 83,247, 59,245,253,163,193,179, 35, 59,133,110, 62,117, 18, 70, -163, 17, 87,174, 92,193,205,155, 55,113,229,202, 21,238,243,207, 63,215, 10,128, 55, 26,201,172, 8,159,184,218, 81,162,207,181, -233,226,156,235,191,127,239, 47, 2,173, 86,139,216,216, 88, 84, 84, 84, 64, 34,145,192,203,203, 11,253,250,245, 99, 98, 98, 98, -156, 94,157, 52,217,254,197,177, 51, 51,245, 18,159, 26,134, 97, 42,216,198, 22,128, 97, 74, 6, 79, 93,227,214, 46,248, 5,164, -103, 23, 84,190,247,241,150, 26,139,153, 99,116, 15,242,140, 23, 47, 94, 68,231,206,157,177,127,255,126,231,138,138,138, 21, 59, -118,236, 88,238,254,229,246, 13,197,121,201,139,208,120, 94, 69,248,196,213,142,173,205,209,190, 7,247,108, 19,197,199,199,139, - 54,109,218, 4,149, 74, 5,177, 88, 12,123,123,123, 40,149, 74,180,110,221,154, 55,103,206, 28,249,192,129,169,120,111,209, 12, -223, 34,199,200,228,198,230,179, 46, 83,100, 40,148, 7, 11,110, 6,126,191,115, 39,191,123,247,238,188,199,167,241,245,245,197, -128, 1, 3,164,145,145,145,129,115,230,206,183, 12,137,124, 51,221, 40,246,208, 52,151,137,218, 92,153,179,230,170,231,144,137, - 19, 79, 68, 69, 69, 57,120,120,120, 64, 46,151, 3, 0, 42, 43, 43,189,179,179,179,123,174, 90,181,106,252,245,132,253, 76,248, -200,220, 2, 40,124,180, 77,173,207,231,149, 80,200,148,212,245, 68,217, 42,100, 21,185,121,197,181, 15,123,161, 12, 48, 24, 12, -208,235,245,120,107,206,155,130, 55, 94,238, 30,228,215,239,239,183,179,242,139, 85, 33, 63, 95,115,170,123,173,169,225,204,178, -118,163, 63,112, 4, 0,126, 85,102,109, 69,246,185,191,189,187, 96,129,151, 82, 57, 27, 34,145, 8, 0,176,125,219, 54,166,188, -188, 60,226,131, 15, 62, 8,229, 20,131,171,218,141,254, 64,241,232,181, 21,166, 22,110,155, 21, 41, 39, 91,125, 56,111, 88,167, -239, 63, 62, 9,179,217,140,107,215,174,225,226,197,139,248,226,139, 47,184,211,167, 79, 87,218, 41, 20, 77,110,155,168, 76,182, -237,235, 81, 20,240,233,167,135,121, 98,177, 24,199,142, 29,195,253,251,247,193,231,243,209,177, 99, 71, 76,153, 50, 5, 67,134, - 12, 81,206,154,245, 38, 23, 62,252,213, 12,216,183,169,254, 99,109, 41,138,207, 58,222,249,251,188, 89,175,121,188, 60,102, 24, - 54,126,249, 13, 21, 88,132,144,103, 27, 7,240,252,199,110,222,123,240, 22,119,210,127,236,230,189, 28,192,227, 0,158, 4,240, - 29, 52,104,144,161,166,166,134,139,143,143,231, 38, 76,152, 80,177,116,201,146,173, 59,183,111,143,210,107, 52,111,117,233,212, -105, 10,247,240,209, 15, 13,103, 58, 56,216, 5, 4, 4,148,230,230,230,114,167, 79,159,230, 86,175, 94,205,237,217,179,135, 59, -115,230, 12, 23, 29, 29,205,157, 57,115,134, 59,112,224, 0, 23, 31, 31,207,165,165,165,113,129,129,129,165,254, 14, 14,118, 77, -100,242, 57,128, 31, 20,249,221,162, 67, 55,205, 81,193,145,223,191,195, 1,252, 64,165,178,205,208,161, 67,205,135, 15, 31,230, -118,239,222,205,237,220,185,147, 75, 72, 72,224,202,202,202, 56, 47,191,128,210,186,215, 53, 54,159, 28,192, 11, 11, 11, 43, 85, -171,213,156,175,175, 47, 39, 18,137, 56, 55, 55, 55,174,117,235,214, 92,207,158, 61,185,225,195,135,115,147, 38, 77,226, 86,172, - 88,193,169,213,106,206,207,207,175,184,238,117,141,101,246,244,242,146, 6, 6, 6,230,220,185,115,135,107,140, 78,167,227,202, -202,202,184, 11, 23, 46,112,129,129,129, 57, 61,189,188,164, 77,101, 10,129,176,208,208,208,210,178,178, 50,206, 98,177,112, 26, -141,134, 43, 47, 47,231,202,203,203,185,138,138, 10,206, 96, 48,112, 22,139,133,179, 88, 44, 92,114,114, 50, 23, 16, 16, 80, 34, - 4,194, 26,203,124,206,219, 60,191,161, 47, 47,119,247,225, 74,165, 82,123,248,240, 97, 46, 63, 63,159,219,177, 99, 7,199, 7, - 62,124,114,186,134, 50,199,135,140, 23,133,133,205,146, 9, 4,178,151,122,247,238,109,190,114,229, 10,119,235,214, 45,238,221, -119,223,229, 70,141, 26,197,141, 30, 61,154,139,138,138,226,114,114,114,184,220,220, 92,238,197, 23, 95, 52, 11, 4,178,151,194, -194,102,201,198,135,140, 23,181,100,219,148, 2, 62, 35, 71,142,212, 26,141, 70, 46, 35, 35,131,107,223,190,125,158, 0,152, 44, - 2, 66, 2, 0,113,115,237,211, 14,112,240,240,240, 40,188,122,245, 42,119,248,240, 97,206,207,207,175, 84, 0,188, 46, 1,252, - 37,128,191, 0,120,189, 85,171, 86,165, 87,175, 94,229,202,202,202, 56, 95, 95,223, 66, 59,192,225,233,219, 82, 20,223,173,253, -216,109, 31,124,121,152, 75,206,171,229, 62,248,242, 48,231,222,122, 64, 14,199,113,156,135,135,199,121,106,145,132,144,103,178, - 7,171, 49,124,153,108,213,199, 31,127, 44,210,106,181,120,255,253,247, 75,223,154, 61,123,141,139,155,155, 81, 40, 20, 66, 40, -145, 52, 31, 96,103,247,206,178,101,203, 28, 12, 6, 3,226,226,226,208,165, 75, 23, 72,165, 82, 8,133, 66,136, 68, 34, 48, 12, - 3,165, 82,137,178,178, 50,184,187,187, 99,206,156, 57,246, 95,109,220,248, 14,212,234,247,155,138,181,152, 57, 6, 0,204,102, -179,216,199,211,115, 86,251, 14, 29, 62,159, 51,103, 14, 95,161, 80, 64,175,215, 67,175,215, 35, 57, 57, 25,206,206,206,144,203, -100, 86, 45, 51,159,207,231,219,216,216, 32, 54, 54, 22,219,182,109, 67,102,102, 38, 10, 10, 10, 96,103,103,135,206,157, 59, 35, - 36, 36, 4,125,250,244, 65, 90, 90, 26,120, 60, 94,179, 31, 50,197, 2,193,188, 41, 19, 39,186,133,134, 54,124,103,171, 94,175, -135, 90,173,134, 90,173,134,187,187, 59, 34, 34, 34,220, 78, 28, 59, 54, 15,192,218,134,166,151, 3, 74,255,224,224, 19, 55,110, -220,112,225,243,249,136,141,141,133, 70,163,129, 78,167, 3,203,178,224,241,120,144, 74,165,232,213,171, 23,156,157,157, 17, 28, - 28,140,163, 71,143,186, 14, 29, 58,244, 39,121,113,113, 24,128, 66,106,254,205,203, 43, 46, 62,215, 5,112,126,237,181,215, 78, - 39, 36, 36,132, 79,158, 60, 25,197,197,197,255, 16,188,251,110,133, 25, 88,215,212,107, 15, 38, 29, 98,189, 1,133,147,171,235, -119,159,124,242, 9,191,168,168, 8, 11, 23, 46, 44, 47,200,205, 93, 38, 5,174, 2,192, 79,199,143,247,218,181,107,215,199,187, -119,239,118,222,185,115, 39,191, 75,151, 46,155, 75,226, 54,183,187, 5, 84,182,164,114,209, 1,127, 95,191,126,189, 84,167,211, - 97,232,208,161, 25,154,172,172,142, 44,160,181,246,245, 53,192,188,168, 37, 75,148, 18,137, 4,139, 23, 47, 46, 43,123,240,160, - 61, 11,148, 62, 54, 73,182, 34, 51,243,244,212,169, 83,239, 38, 36, 36,184,172, 91,183, 78,249,114,100,228, 60, 0,107,172,253, - 27,255,186,160,157,111,103,182,137, 13, 30, 59, 60,194,189, 77, 43, 55, 28, 62,118, 22, 95,109,222,179, 29,234,244,239,188,188, -188,230,241,249,252,207,168,229, 17, 66,158,171, 2,203,209,209,177,107, 96, 96, 32,162,163,163,209,182,109,219,163,110,117,197, -149, 80, 8,179,185,249,107,200,101, 10,197,224,240,240,112,230,202,149, 43,240,247,247,135, 76, 38,171, 47,172,234,138, 44,161, - 80, 8,165, 82,137,202,202, 74,244,237,219, 87,184,109,219,182,193, 0,222,111, 46,187, 48, 59,217, 6, 25,219, 94, 91,253,193, - 7, 1, 93,187,118,133,209,104,124, 88,136,200,229,208,235,245, 16, 10,133, 48, 26,141,208, 25,184, 42,107,150,213,108, 54,155, - 5, 2, 1,124,125,125,177,114,229, 74,232,116,186,250,211, 58, 85, 85, 85, 80,171,213,136,139,139, 67, 86, 86, 22, 44, 22, 11, -215, 92,158,220,198, 38, 98,244,232,209,226,134,126,103, 48, 24,234,139,171,202,202, 74,232,116, 58,116,234,212, 73,124,225,194, -133,136,198, 10, 44,158, 84, 58,126,231,206,157,110, 98,177, 24, 58,157, 14,169,169,169, 72, 79, 79, 71,114,114,178, 94,165, 82, -177, 54, 54, 54, 60, 15, 15, 15, 65,101,101,165,120,234,212,169,188,234,234,106, 0, 64,100,100,164,243,246,173, 91, 95,129,193, -176,142,154,191,117,110, 1,250, 64,131, 97, 84,247,238,221, 47,252,246,219,111, 93,222,126,251,109, 36, 36, 36,252, 83,190,127, -255, 69, 13,112,187,201,118, 9,204,249,108,233, 82, 15,133, 66,129, 41, 83,166,168, 52,185,185, 29, 89,160,232,177, 73, 82,156, -179,178,206, 76,155, 54, 45, 49, 33, 33,193,113,221,186,117,202, 87,198,143,159, 3,224,227,150,204,163,189,189,125,119,165, 82, -137, 51,103,206, 32, 39, 43,107,105, 75,138, 43, 0,224, 9, 4,125,251,247,239,143, 31,127,252, 17,121, 15, 30, 44,125,162,184, - 2, 0,212, 2,165, 76, 70,198,210,237,219,183,111,155, 49, 99, 6,248, 12,211, 23,172,245, 39, 8, 27,186,160,253,173,165,159, -225,232,153,107,219, 75,238,118,248, 27,240,163, 5,192, 13,106,113,132,144,103, 65,139,158,131,213,170, 85,171, 86, 18,137, 4, -217,217,217,232,209,163, 71,150, 80, 44,134, 68, 44,134, 68, 38,179,238, 40, 91,167,235,160, 84, 42, 81, 85, 85, 5, 23, 23, 23, -136, 68, 34,136, 68, 34,136,197, 98,136,197,226,250,239,109,109,109,193,231,243,225,229,229, 5,157, 78,215,161,185, 92,182, 50, -213,237,236,142,165,115, 79, 29,221, 21, 16, 25, 25, 9, 79, 79, 15,120,121,121, 66,161, 80,128, 97, 24,248,250,250, 34, 48, 48, - 16, 91,183,110, 5,207, 46,248,186, 53,243,250,120,209, 36, 16, 8, 96, 54,155, 81, 92, 92,140,228,228,100, 36, 36, 36,224,234, -213,171,136,139,139, 67, 77, 77,141, 85,203,174,209,104, 58, 55,212,209,245,100,113,165, 86,171, 81, 90, 90,138,244,244,116, 84, - 87, 87,135, 53, 90,236, 58, 59,143, 11, 13, 13, 21, 0,128, 84, 42, 69,171, 86,173,240,237,183,223,178,231,207,156,121, 69,246, -219,111, 14,230, 11, 23,236,247,254,240,195, 43, 51,103,206, 52, 95,191,126, 29, 85, 85, 85, 72, 73, 73,129,171,171, 43, 35,145, -201, 94,161,166,223, 50,233, 64,173,162,186,122,120,239,222,189, 51, 43, 43, 43,241,217,103,159,241, 25, 91,219,239,222, 4, 4, - 77,110, 96, 2, 65,191,129, 3, 7,226,216,177, 99,200,123,240,224,221,242,223, 23, 87, 0,128,114,160, 40, 43, 61,125,233,246, -237,219, 17, 17, 17, 1,134, 97,250,181,116,254,122,246,236, 25,202,113, 28,238,220,185, 3, 49,112,173,165,175, 15, 10, 10,234, - 98, 99, 99,131,251,247,239, 67, 8, 92,108,108, 58, 33,112, 49, 46, 46, 14, 50,153, 12,237,218,181,235,218,178,191, 34,252,220, -189,117,255,194,183,150,126,134, 35,103, 46, 3, 0,126, 60,113,186,248, 97,113, 21,101,161, 86, 70, 8,121,110, 11, 44, 0,224, - 56, 14, 2,129, 0, 34,134,129, 76, 34,129, 88, 34,129, 88, 40,180,254, 72,153,199,131, 68, 34,249,183,162,170,174,208,170,251, - 87,161, 80, 88,157,105, 42,252, 53,124,250,180,169, 98, 27, 27, 27,152,205, 44, 24,134,129, 92, 46,135, 82,233,142, 54,109,218, - 64,165, 82, 97,212,232,177,186, 7, 42,230,132,208,123,112,194,211,172, 40,150,101, 81, 91, 91,139,138,138, 10,168, 84, 42, 84, - 85, 85, 65,167,211,193,138,179,131,245,117, 90, 78, 78, 14,246,237,219,135,242,242,242, 70,139,171,140,140, 12,236,218,181, 11, - 89, 89, 89, 16, 8, 4, 86,191, 63,131, 7, 15,198,201,147, 39, 5, 3, 6, 15,222,242,192,207,175,240,129,159, 95,225,128,193, -131,183, 28, 63,126, 92,224,229,229,133,156,156, 28,196,197,197, 65,165, 82,193, 98,177,208, 53, 88, 79,161, 0,168,208,168, 84, - 51,254,241,143,127,112, 54, 54, 54, 88,187,118,109,231,173,192,164,166, 94, 19, 16, 24,216,197,198,198, 6, 73, 73, 73,144, 55, - 81,184,200,129,139,183,110,221,130, 76, 38, 67,155,144,144,174, 79,179, 93, 90, 44, 22,152,205,230, 6,159,239,102,205,118, 41, - 20, 10,193,231,255, 85,207, 30,142,226,179,142,157,254, 62,111,222,124,143,191,207,127, 11, 23, 98, 31,214,128,130,154,140, 84, - 42,174, 8, 33,207,162, 22,157, 34, 76, 79, 79,207,210,233,116, 33,254,254,254,184,123,247,174,127,251, 14, 29, 18,132, 66, 33, - 36, 66, 97,211,135,241,143, 72,165,210, 59,197,197,197,125,188,189,189, 97, 50,153,234, 79, 9,214,157, 38,172,251, 30, 0, 36, - 18, 9,146,146,146, 32,149, 74,239, 52,187, 16,230, 26,191, 86,173, 90,161,168,168, 24, 18,137, 4,142,142, 14,144,201,100,144, - 72,164,248,248,227,143, 45, 91, 54,111,254, 90,210,126,158,122,193,204,165,220,141, 53,223,255, 71, 86,180, 92, 46,191,227,239, -239,223, 75,161, 80,224,232,209,163,200,202,202,130, 90,173,174,191,110, 74,171,213, 66,175,215, 67, 42,149,162, 93,187,118,112, -114,114,194,221,187,119, 27, 93,246,138,242,242, 35,137,137,137,189,186,117,235, 86,191,234, 7, 12, 24,192, 27, 48, 96,128,203, - 99,189,102, 40, 47, 47, 71,124,124, 60, 98, 99, 99,193,178, 44,238,221,187,103,214,107,181,251,169,233, 63, 29, 29,112, 89,176, -125,251,182,217,179,103,207,236,211,167, 15, 56, 96, 4,128, 31, 26, 61,130,225,243,121, 12,195,128,199,227, 53, 89,248,240, 0, - 11,199,113,117,197, 78,139, 11,224,171, 87,175, 38,154,205,230, 62,173, 91,183,134, 30,232, 14,224,100, 75, 94,159,150,150,118, -203,100, 50, 13,233,212,169, 19,142, 28, 60, 24, 14, 32,187,193,131, 25, 32, 60, 44, 44, 12, 90,173, 22,247,238,221,187,105,109, -113,229,214,254,206,150,121,179, 94,123,253,229, 49,195,112,248,216, 89,252,120,226, 76,238, 55,159, 46,241,225, 56,139,145, 90, - 21, 33,228,185,239,193,170,172,172,252,237,254,253,251,232,217,179, 39,210, 50, 50, 34,245, 90,173,168,174, 23,139, 47,104,190, -196,210,214,214, 70,255,250,235,175,108,231,206,157, 81, 83, 83, 83, 95, 84, 61,222,123, 85, 87,112, 41, 20, 10,156, 62,125,218, -168,173,173,141,110, 46,215,204,154, 45,124, 62, 31, 60, 30, 15,122,189, 30,133,133, 69,208,233,244,248,254,251,239,177,117,243, -230, 73,121,133,133,239, 64,226,168,253, 43, 86,160,181,159,133, 90,173, 54, 58, 58, 58,218,228,239,239,143,233,211,167, 99,193, -130, 5, 88,176, 96, 1,222,124,243, 77,188,254,250,235,152, 60,121, 50,198,141, 27,135, 30, 61,122,192,213,213, 21,153,153,153, - 38,173, 86,219,232,178,115, 58,221,161,105,211,166,149,232,116, 58,152,205,102,232,245,122,104,181,218,250, 94,182,184,184, 56, - 28, 57,114, 4,155, 55,111,198, 79, 63,253,132,218,218, 90, 84, 85, 85,225,214,173, 91,106,129,201,116,128,154,254, 31,218,104, - 14,255,250,235,175,112,116,116,132,167,183,119,255, 38, 15, 74,210,210,110,155,205,102,116,236,216, 17,181, 64,163,211,214, 2, -253, 59,119,238, 12,157, 78,135,164,123,247,226, 90, 58, 79,213,213,213, 55, 50, 51, 51, 49, 96,192, 0,120,120,123,127,238, 14, -200, 90,242,122, 11,203,254,122,249,242,101, 76,157, 58, 21,126,173, 90,125,170, 0, 92,159,156, 70, 1,184,250, 7, 6,126,250, -250,235,175,227,220,185,115,176,176,236,175,141,229,185,187,187,119,245,240,240, 56,238,233,233, 25,235, 30,120, 62, 59,114,120, -207,215, 31,191,160,157, 83,167, 79,240,242,242,218,205,231,243, 23, 83,139, 34,132, 60,247, 5,150, 69,171, 93,189,108,217, 50, -131, 64, 32,192,220,185,115, 93,191,250,230,155,213, 7, 14, 28,232, 22,127,231,142,210,160,215, 55, 95, 97, 85, 85,173,255,224, -131, 15,212, 70,163, 17,109,219,182,133, 74,165,130,217,108,134, 64, 32, 0,195, 48, 16, 8, 4,224,243,249,144,203,229, 72, 76, - 76,196,254,253,251,171, 80, 85,181,190,217,249,178, 88,238, 28, 61,122, 20, 12,195,112, 82,169,180,190,232,217,184,113, 99,201, -204,194,194, 35, 0, 32, 16, 8, 12, 0,192, 23,240,172,186, 42,151,207,231, 55,123,225,186, 88, 44,174,187,184,191,249,139,220, - 89,118,253,183,223,126, 91,157,154,154, 10,141, 70, 83,127,106,176,166,166, 6,213,213,213,245,223,215, 21,137, 23, 47, 94,172, -150,179,108,163,203,174, 1,138,178, 82, 83, 71,117,235,214,173, 60, 59, 59, 27, 53, 53, 53, 72, 75, 75,195,213,171, 87,113,242, -228, 73,196,196,196, 32, 61, 61, 29, 6,131, 1, 14, 14, 14,168,170,170,194,241,227,199,171,244, 53, 53,195, 52, 13, 92, 7, 68, -254,197,199,195, 99,176,187,155, 91,174,171,139, 75,190,143,135,199,224, 6, 10,141,148,148,148, 20,152,205,102, 4, 4, 4, 56, - 53,117, 29,150,153,101,127,189,122,245, 42, 38, 79,158, 12,165,151,215,199,174, 13, 20, 46,174,128,171,135,183,247,199,211,167, - 79, 71,116,116, 52,204, 77, 20, 46,141,145, 2, 27,151, 44, 89,162, 21,137, 68,216,191,127,127,128, 93, 80, 80, 50, 3,188, 38, - 6,218, 6, 2,162,230, 94,111, 3,124,181, 98,197,138, 34, 0,216,189,123,183,139, 71, 96,224, 93, 6,152, 46, 5, 94,144, 2, - 47, 48,192,116,143,192,192,187,251,247,239,119, 97, 89, 22, 11, 22, 44, 40,178, 1,190,106, 44, 79, 32, 16,252,189,160,160, 96, - 84,126,126,126,120, 81,218, 21,159,111, 62, 93,130, 11,177,215,240,213,230, 61,219, 75,238,118,248, 91, 73, 73,254,141,130,130, -130, 41,249,249,249,137,212,226, 8, 33,207,162, 6,187, 95,152,238,107,138, 1,206,173,127,207,142,248, 45, 62,185,210,217,209, -254, 76,221,239,212,247,143, 6,191, 50,192,175,243,234,213,171,193,227,241,112,255,254,125, 36, 36, 60,188,172,233,179,207, 62, -211,240, 57, 46,242,177,241,206, 66, 1, 36, 62,202, 60,207,178,172,163, 68,159,107, 19,230,152,217,234,135,157,219, 5,182,182, -182,168,169,169,129, 64, 32,128, 84, 42,133, 66,161,128, 68, 34, 65, 66, 66, 2,166, 78,159, 97, 78,103, 59,253,235, 65,163,255, - 26,239,172, 62,179,238,249, 67,125,156,157,229, 57, 34,209, 34, 87,119,247, 37,243,231,207,151,133,135,135, 67, 44, 22,163,107, -143,126, 69,178,206, 75, 54,240, 5, 60,182,160,172,114,121,224, 11,158,246,247, 82,179, 1,240, 74, 76, 55,150,123, 60,118,202, -230,223,230,179,131, 52, 33,224,135,111,222,183,107,223,190, 61, 56,142, 67,101,101, 37,138,139,139, 81, 82, 82, 2,181, 90, 13, -173, 86, 11,139,197,130,159,127,254, 25, 63, 95,207,168, 42,182,125, 49,163,177,249,252,215,178,103,219,134,200, 82,252, 55,172, -251, 92,224,232,232,136,226,226, 98,148,149,149,213,159, 42, 52,155,205,168,174,174,198,177, 19, 63,153, 51,204, 29,178,244,146, - 23,170,155,203, 68,109,174,204,169,230,178, 87,215, 80,127,238,205, 55,223,180,181,179,179,131,197, 98,129, 74,165, 66, 86, 86, - 22, 82, 82, 82,112,233,210, 37, 77, 73,149,137,211,186, 12,205,171,127,208,104, 3,153,127,162,255,185,204,199,159,101,229,233, -225, 81,248,224,193, 3, 55,179,217, 12, 47, 47, 47, 86,173, 82,125, 34, 6,206,137,128, 2, 30,192, 85, 3, 43,214,109,216, 48, - 99,204,152, 49,232,222,189,123,110, 81,113,241, 11, 13,181, 37, 14,224,123, 2,142, 34, 63,191,164,107,215,174,185,166,164,164, - 96,218,180,105,165, 5,185,185,139,236,128, 88, 0,168, 2,250,123,250,248,124,190,119,239, 94,215,208,208, 80,116,236,216,177, - 84,159,149, 21, 82, 0, 84, 52,210, 62, 27,221, 54, 43, 82, 78,182,154, 27, 25,218,237,173,183,222, 2,203,178,136,141,141,197, -245,235,215,145,147,147,131,203,151, 47,171,237, 20,138, 87,155,218, 54, 81,153,108, 27, 17, 92, 27,176,123,247, 15, 60,145, 72, -132,237,219,183, 35, 46,238, 97,103, 90, 88, 88, 24, 94,127,253,117,176, 44,139,201,147,167,112, 63, 37,203,254,245,160,209, 6, -218,146,151,151, 87,168,197, 98, 89,203,227,241, 68,102,177, 91,183,162,204, 56,169, 71,235,190, 5, 69,169,131,125, 90,120,205, - 21,181, 79,202,164,204,231, 39,243,153,210,236, 88,132,107, 54,193,254,247,195,113,188, 81,120,108,251, 39,204,136,151, 70,133, - 44,127,111,153,160, 67,135, 14,176, 88, 44,232,222,189, 59,166, 77,155, 38, 15, 9, 9,105,110,188,179,154, 23,199,206,204,124, -241,197, 23, 29,230,206,157,107,223,191,127,127, 97,221, 80, 57,119,238,220,193,169, 83,167,140,251,246,237,171,202, 23,247, 83, - 95, 62,189,181,198,154,241,206, 46,151,151,107, 0,188,223,218,104,220,188,226,189,247,162,218,119,232, 48,243,157,119,222,225, -219, 40,228,194, 53,203,223,144, 2,192,135, 95,238,179, 31, 51,254, 53,172, 15, 2,250, 79,106,120,236,184,199,231, 51,175,176, -228,193,107, 51, 38, 4,205,156, 28,105, 25, 59,118,172,220,222,222, 30, 62, 62, 62,112,112,112, 64,102,102, 38,238,220,185,195, -157, 59,119,174, 38,254,126,142,112,215,129,115, 15,196, 54,110,214,140, 27, 88,253,226,152,105, 89,211,167, 79,119,140,140,140, -180,109,223,190,189, 80, 40, 20, 66, 34,145,160,172,172, 12,121,121,121,198,152,152,152,154,124, 81,175,138,203,103,118, 84, 91, - 57, 22,161, 54,124,226,234,180,232,179, 81,239,196,199,199, 79, 1,208,201,104, 52,122,155,205,102, 30,159,207, 47, 52,155,205, - 9,186,154,154,109,108, 88,212,122, 26,139,208, 58,102,179, 89,100, 54,155,161, 86,171,113,254,252,121, 38, 61, 61,125,121,124, -124,252,242,130,130, 2, 24,141, 70,140, 31, 63, 30, 97, 97, 97,248,229,151, 95, 80, 90, 92,124,162,169,172, 2,160,130,121,240, - 96,198,156, 57,115, 78,238,216,177,131,119,231,206, 29,215,109,219,182,253,112,235,214, 45, 0, 64,151, 46, 93, 48, 99,198, 12, - 48, 12,131,105,211,166,113, 57, 89, 89, 51, 88,160,162,137,246,217,212,182, 89,122,106,223,198,248,177,227,198,183, 91,181,226, - 61, 97,159, 62,125,224,234,234,138,126,253,250,193,104, 52, 58, 88,177,109, 86,135, 15,127, 53,163, 83,167, 78,138,117,235,214, - 41,103,204,152,129,121,243,230, 1, 0,180, 90, 45,206,157, 59,135, 5, 11, 22, 20,229, 48, 61,106,111,197,236,111,178,125, 62, -234,153, 26, 10, 0,158,158,136, 5, 16,206,175,205,206,160, 11,218, 9, 33,207,117,129, 5,252,107,188,179, 75,215, 19,241,248, -112, 28, 15, 57, 37,153,156, 34, 51,102, 44,248,164,157,192,164,118,148, 49, 6,199,132,248,120,126,102,102,102,147,127,172,110, -188, 51,189,196,167,198, 92, 88,222,109,227,250,245,239,108,217,178,101,112,221,163, 24,164, 82,233, 29,109,109,109, 52,170,170, -214,235,253,125, 46,180,116,236,188,148,242,242, 98, 0,179, 3, 45,150, 13,211,103,190,249, 25,207,198,135, 89,182,230,123,157, - 64, 32, 48,100,228, 23, 99,125, 16,160,176,226,121,168, 26, 3,112,167,220,141,189,203,245, 79, 94,251,201, 39, 11, 55,125,245, - 85, 15,153,141, 77,184,209,104, 12,177, 88, 44, 0,144,164,211,104, 46,178, 70,227,245,124,207, 89, 95,136,109,220, 56,107,199, - 13,212, 75,253,171, 21,218, 75,221, 14, 31, 60,248,246,233,211,167,255,109,217,109,129, 13,122, 59,255,104,107,150,253,241,105, - 76,192, 21,148,148, 92,105,170,171,146,198, 34,180, 14,159,227,222,112,116,116,252, 97,240,224,193,210, 33, 67,134, 96,196,136, - 17,232,221,187, 55, 44, 22, 11, 56,142, 67,117,117, 53, 14, 28, 56,128,127,254,243,159,169,238,192,234,230,242, 88,224, 12,115, -236,216,232, 46, 93,186,108, 91,183,110,157,243,236,217,179, 33,123,244,104, 19,173, 86,139,152,152, 24, 44, 88,176,160, 60, 59, - 35, 99, 6, 11,156,105, 46,175,233,109, 83,154,194, 58,140,201,122,117,222, 39, 65,166,170, 2, 71,103, 57,171,188,155,120,199, -234,109, 19,246,109,170, 43,227, 14,116,127, 57, 50,114, 30,159, 97,250,214, 61,138,225,222,189,123, 55,235, 6,123, 70,216,235, - 63,183,164, 45,113,220,195,103,207,113, 28, 71, 23,180, 19, 66,158,239, 2,139, 97,152,146,186, 94, 30,134, 97, 74, 50,127,156, -245, 90, 83, 33, 62, 30, 30, 67, 30, 29, 29,163,185,177, 8,235,254,159,169, 86, 87, 63,122, 66,123,131, 15, 17, 21, 62, 49,125, - 75,198, 59, 75, 47, 46, 78, 6,240, 18,240, 0, 72,190,244, 48,175,251,154,119, 31, 95,166, 70, 87,200,239,254,174, 72,149, 87, - 92,124, 9,192, 37, 0,255,108,112, 62,125, 69,170,230,230,243,201,101,143,127,240,160,234,209,114, 55,188,236,110,205, 47,251, -147,153,205,190,209,127, 96,125, 62,111, 10, 75, 75,127, 4,160,112, 57,121,210,253,212,201,147,175, 44, 92,184,240,101, 79, 79, -207, 32, 23, 23, 23, 71, 91, 91, 91,254,181,107,215, 50, 13, 58,221,134, 64, 96, 71, 10,160,177, 38,147, 5, 78, 41, 51, 50,218, -142, 30, 57,242, 29, 62,195,244, 13, 9, 9, 9, 3,128,164,164,164, 56, 11,203,254,234, 10,172,103, 1,149, 21,239, 99,203,182, - 77, 73,203,183,205, 74,160, 18,192, 26,176, 44,144,144,240,135,183, 77,139,197,178,198,203,203,171,154,158,208, 78, 8, 33,127, -158, 80,202,164,204,103, 40, 83, 0,192,142,214, 39,101, 82, 38,101, 82,230, 95,146,249, 76,225,211, 42, 32,196,106,102, 0, 85, -180, 26, 8, 33,132, 52,135,215, 68, 21,218,146,187, 3,158,166,146, 77,164, 76,202,164, 76,202,164, 76,202,164,204,231, 46,179, -185,108,186, 59,241, 47, 42,188, 40,147, 50, 41,147, 50, 41,147, 50, 41,243,249,203,124,166,208, 41, 66, 66, 8,121, 36, 42, 10, -124,142, 3,143,227,162,248, 28,119, 80,192,113,227, 5, 28,135, 63, 52,118,231,248,241, 13, 63,136,118,254,107,176,165, 53, 78, -200,179,139,161, 85,240,159,163, 84, 42,125,221,221,221,191,227, 56,142, 87, 82, 82, 50,171,168,168, 40,135,214,202,127, 31, 39, - 39,167,193, 0,160, 82,169,162,159,213,101,108,231,143, 72,142,135,182,143,255,140,103, 65,206,189,236,223,143,179,216,238, 5, - 76,225,248,191,127,150, 22,143,195,253,123, 89, 56,218,146, 3,187,177,131, 93,215, 2,192,143,209,165,139,241, 20,131, 83, 55, -199,195,195,163,181,179,179,243, 89,129, 64,192,152,205,230, 57,137,137,137, 39,155, 59,208,124,107, 28,150,177, 69, 46,203, 86, -204,230, 9, 13,250,207,212,122,157,174,146,207,231,103,137, 68,162, 75,243, 39,115,103,190,220,109,186,219,200,235, 27,157,255, -246,254,136,224,235,219,141, 10,107,155,153,177,118, 66,247,245,253,103,186, 8, 51,111,222,182,217,116, 52,231, 59,123, 7,247, - 81,127,127,181,232,164, 68,102,158,242,207,109,168,161, 45,205, 58, 31, 1, 78, 70,160,131, 72, 34,241, 54,179,172, 59, 0, 8, - 24,166,216,164,215,231,138,128,132,101,128,250,191, 36,211,197,196, 48,161, 34,177,216,219,108, 50,185,243, 0, 14, 66, 97,137, -197, 96,200, 53,179,108, 98, 20, 80,254,180,243, 41,148, 72,124,204, 44,235,206, 3,184, 63,107,217,255,204, 76,210, 76,129, 21, - 16, 16,112,147,207,231,123,243,249, 15, 59,185, 30, 31,115,175,238,255, 79,254,107, 54,155,243,146,147,147,187, 90,251,199,253, -253,253,237,116, 58,221, 43, 60, 30,239, 53, 0,224, 56,110,143, 84, 42, 61,144,149,149,245, 84, 23, 18,251,251,251,219,113, 28, -183, 88, 38,147, 13,210,233,116,237, 1, 64, 42,149,222,213,106,181, 23,120, 60,222,218,167,204,101, 60, 60, 60, 38, 40, 20,138, -129, 44,203, 14,228, 56,142,199, 48, 76,140, 70,163,185, 80, 88, 88,120, 16, 64,139,159,120,224,225,225, 33,115,118,118,254,208, -193,193, 97,210,220,185,115,203,157,156,156,218,172, 94,189,250, 55,103,103,231,189, 42,149,234,189,194,194, 66,237,127, 73,251, - 8, 84, 42,149,123,132, 66,161, 32, 55, 55,119, 32, 0,248,248,248,196, 24, 12, 6,115, 73, 73,201,107, 0,210, 91, 18,230,226, -226,162, 16, 10,133, 61, 21, 10, 69, 87,133, 66, 17,110, 54,155, 67, 44, 22, 11, 44, 22, 75, 82,109,109,237, 69,147,201,116,211, -100, 50, 93, 43, 43, 43,171,253, 47,218, 70,108, 69, 34,209, 15, 44,203, 2, 64, 48,128,234,103,113, 71,192,241,208,246,222,221, -164, 54,191, 43,166,218,135,252,251,116,124,248, 54, 50,157,213, 5,214,136,190, 14,195, 71, 69,116,226, 3,128,209,240,219,240, - 83,191,170, 79,253,217,197,213,136, 17, 35,174,108,216,176,193, 81,175,215, 99,201,146, 37,123,244,122,253,215,105,105,105,203, -154,122,157,157,157,253,194,247, 63,250, 74,254,104,127,230,102,177, 88,220, 10, 11,114,131,147,239,223, 25,158,124, 63,241,227, -249,227,239, 95,213,178,230, 55,183,254,136,251,214,204, 71,200, 11, 24, 57,106, 92,228, 75,239,175,140,194,164, 73,147, 94,184, -171,210,201,188,238,198,139,107, 57,155, 64, 23, 55,239,209, 75,223,251,148,119,237,202, 47,163, 15,238,219,114,225,255,102,152, - 6, 81,145,213, 44,222, 26,134,233,105, 31, 20, 20,254,234,143, 63,194,198,199,135, 97, 36, 18, 62, 0,176,122,189, 79, 77,110, -174,199,254,209,163,123, 68,165,164,252, 18, 5, 92,255, 79,102,190,207, 48,125,236,131,130,250, 76, 58,117, 10, 54, 30, 30, 12, - 95, 36,226, 3,128,197,104,244,174, 42, 40,240,216,255,210, 75,221,163,210,210, 46, 70,177,236, 53, 88, 49,212,218,255,208,178, - 19,107, 10, 44, 62,159,239, 29, 23, 23,231,166, 80, 40,240,168,248,129,217,108,134,217,108,198,163, 15,197,250, 7, 47,114, 28, - 7,150,101, 49, 96,192, 0,171,142, 94, 61, 60, 60, 6, 1,152, 30, 20, 20,244,242,226,197,139, 69,125,250,244,129,217,108,198, -133, 11, 23,250,173, 91,183,238, 75,189, 94,127, 4,192,142,194,194,194,104,107,143,110,149, 74,229, 48,129, 64,176,123,249,242, -229,118,125,251,246,101,234,158, 14, 95, 82, 82,210,243,210,165, 75, 93, 87,175, 94, 61, 71,169, 84, 78, 46, 42, 42, 58,107,237, -202,241,242,242, 10,149,203,229,135, 34, 34, 34,188,187,118,237, 42,109,221,186, 53, 56,142,195,237,219,183,103, 36, 39, 39, 79, - 60,117,234,212, 42,141, 70, 51,190, 5,227,169,241, 2, 3, 3,167,217,218,218,126,184,112,225, 66,167,177, 99,199,138, 19, 19, - 19, 43, 2, 2, 2,120, 71,142, 28,113, 61,113,226,196,156,175,191,254,122,130, 92, 46,127, 47, 61, 61,125,167, 53, 27, 94, 80, - 80,208, 77, 62,159,239,109, 77, 1,220,194, 34,184,179,191,191,255,129,139, 23, 47,250,103,103,103,155, 35, 35, 35,119, 1,192, -229,203,151, 59,114, 28,199,235,211,167,207,233,188,188,188, 87, 0,220,182,102,193, 61, 61, 61, 59,218,219,219, 31, 27, 59,118, -172,147,175,175,175,220,219,219,155, 39,149, 74, 33, 16, 8, 80, 83, 83,227,153,156,156, 60,228,246,237,219,218,203,151, 47,171, - 68, 34,209,232,130,130,130,132, 22,180,227,222,110,110,110, 83,132, 66, 97, 40,203,178, 94, 0,192, 48, 76,190,201,100, 74, 44, - 41, 41,249, 1,192,149,167,221, 64,220,221,221,191, 92,183,110,157, 75,113,113, 49, 23, 21, 21,245,101,101,101,229,180,103,121, -135,144,120,251, 26, 46, 93,190,136,111, 55,255, 80,201,113,120,240,111, 5,150, 5,105,237,219,135,184,190,249,198, 20,167,126, -125,194, 17,218,185,103,179,153, 99, 6, 57,191, 47, 22, 49,206, 26,189,254,122, 89, 30,255,152, 92, 33,138,156, 60,174,107, 6, - 0,156,249,249, 78,100,247, 0,199, 95, 93,188, 45, 99,228, 18, 73, 15,131,145, 45, 63,118,161,124,101, 75,138, 41,165, 82,121, -214,198,198, 70,174, 86,171,139,202,203,137,167, 96,192, 0, 0, 32, 0, 73, 68, 65, 84,203, 55, 69, 68, 68,172, 89,183,110,157, - 99, 70, 70, 6,114,115,115, 49,125,250,116,155,252,252,252,185,122,189,254,106,110,110,110,163, 61, 89, 85,213,149,235, 63,140, - 90,184,202,214,222, 81, 32,151, 41, 96, 99,107, 7,255, 86,193,232,214,163, 31,134,188, 56, 26, 25,233,201,189, 14,236,222,114, -123,206,184,188,143,147, 85,248, 32, 54,182,241,125, 83, 59, 63,244, 31,253,242,195,226,106,229,251, 81, 72, 73,190, 95,157,157, -195,159,255,211, 45,190, 60, 98, 80, 59,137, 65, 95,147,125,237,202, 47,254, 61,123, 15, 0,128,174, 7,247,109,185, 16,245,154, -105,112,212,158,103,179,128,255, 51,138,171,247,133,194,105,195,214,173,115, 11,155, 51, 71, 84,147,149,101,204,248,246, 91, 77, -241,197,139,102, 70, 34,225,124,134, 15,231,185, 14, 28, 40,157,147,148, 36,186,252,201, 39,225,194,213,171, 3,222, 51, 26,119, -255,167, 50, 71,108,220,232,218,121,214, 44, 81, 85, 70,134, 49,229,203, 47,181, 69, 63,255,204,138,164, 82,139,247,136, 17, 2, -247,161, 67, 37,115,238,222, 21, 93,253,236,179, 62,204,138, 21,173,150,155, 76, 63, 60, 35,203, 78, 90, 80, 96, 65,161, 80, 96, -223,190,125, 16, 10,133, 16, 10,133, 96, 24,166,209,255,251,249,249, 89, 83, 4,141,115,118,118,254,106,225,194,133,238,163, 70, -141,130,163,227,239, 71,217, 24, 57,114, 36, 70,140, 24, 33,202,204,204,156,120,240,224,193,137,187,118,237, 42,170,169,169,153, - 95, 84, 84,116,164,153, 15,239,129,254,254,254, 71,246,237,219, 39,211,106,181,136,141,141, 69, 69, 69, 5, 36, 18, 9,188,188, -188,208,175, 95, 63, 38, 38, 38,198,105,226,196,137, 71,248,124,254,200,130,130,130, 24, 43, 62, 88,187, 58, 58, 58,198,110,222, -188, 89,218,182,109, 91, 94, 90, 90, 26, 58,117,234, 4, 0, 40, 47, 47,199,200,145, 35,165, 99,199,142, 13,156, 59,119,238, 85, -150,101, 7, 20, 23, 23,223,108,102,217,187,184,187,187,239, 28, 62,124,184,231,187,239,190,107,103, 99, 99,131,236,236,236, 66, -165, 82, 25, 92, 87, 4,141, 25, 51, 70, 60,116,232, 80,143, 77,155, 54,109, 56,117,234,212,146,210,210,210,105, 69, 69, 69,183, -154,172, 86,249,124,239, 91,183,110,185,201,229,114, 20, 23, 23, 99,247,238,221,152, 59,119, 46, 24,134, 65, 73, 73, 9, 14, 28, - 56,128,249,243,231,131,207,231,163,170,170,202,170, 34, 88, 46,151, 15, 9, 10, 10,218, 26, 29, 29,237,237,224,224, 0, 79, 79, - 79,254,138, 21, 43, 66, 3, 2, 2,100, 30, 30, 30,252,130,130, 2, 28, 57,114, 36, 96,202,148, 41,199,114,114,114,102,232,245, -250,102, 79,157, 57, 59, 59,111,219,181,107,151,111,124,124, 60, 54,109,218, 4,149, 74, 5,177, 88, 12,123,123,123, 40,149, 74, -180,110,221,154, 55,103,206, 28,249,192,129, 3,229, 81, 81, 81,219, 0,116,182,162,253,118,114,115,115,251,110,224,192,129, 1, - 81, 81, 81, 14, 30, 30, 30,144,203,229, 0,128,202,202, 74,239,236,236,236,158,171, 86,173, 26,127,243,230,205,204,146,146,146, - 55, 1,196,183,112,251,232,220,174, 93,187,145, 99,199,142, 21, 20, 21, 21, 97,203,150, 45, 35, 43, 43, 43, 59, 91, 91, 84,254, - 47,186,116,249, 34, 6, 14,159, 8, 45, 43, 19,158, 56,186,155,171, 62,251,133,179,141,131, 3, 3, 0, 53,106, 53, 59,226,181, - 69,150,145,163, 39, 27, 7, 13, 31,163,185,112,102,143,220,154, 2, 75, 44, 98,156,247,111,157,157,123,241, 90,106,200,217, 11, -217, 67,198,142, 30,194,103, 20,109, 2, 1, 96,209, 59,111,136,127, 60,254,243,215,195, 6,189, 80, 24,222, 51, 56,247,213,153, -223,250,180,164,184, 10, 8, 8,248,229,236,217,179,238, 98,177, 24, 21, 21, 21,206,219,183,111,255,162,103,207,158,252,244,244, -116,220,191,127, 31, 89, 89, 89, 80,171,213,232,222,189,187,205,189,123,247, 54, 1,104,180,192,250,230, 48, 62,252,100,169,251, - 70, 87, 15, 87,127,147, 65,239,202,234,139,219, 71,159,141,239,120,248,128,166,139,155,210, 59,120,226,228, 89, 88,186,226, 83, -225,209, 67, 59, 87, 34,230, 28, 98,155,122,138, 63, 15,189,255,241,238, 50, 84,105,244,152,252,218, 27,152, 50,249, 13,103,206, - 98,240,224, 44, 58,133, 65, 87,225, 96, 47, 74, 62,185,115,251,129, 72, 0,222,143, 21, 89,209, 84,100, 53,236,125,134,233,241, -226,231,159,187,117,154, 51, 71, 18,191,122,117,109,217,197,139,218, 86, 35, 70, 84,132,205,158,173, 7,128,234,172, 44, 81,202, -170, 85,114,215,240,112, 89,159,255,251, 63, 7,147, 70,163,124,255,163,143,186,175, 4,110,180, 52,211,127,210, 36,243,218, 35, - 71,186, 93,251,228,147, 1,248,224, 3,193,192,176,176,219, 43,190,253, 54,207,154,204, 53, 12,211, 51,226,235,175,221, 58,188, -254,186,228,230,178,101,181,234, 27, 55,180,129,145,145,170,110, 11, 22, 24, 32, 16, 64,147,151, 39, 76, 95,189, 90, 97,223,163, -135,172,215,162, 69, 14,102,131,193, 61,106,213,170, 30, 77,245, 16,189,207, 48, 61,134,175, 95,239,218,105,246,108, 73,252,154, - 53,181, 5, 23, 46,232,171, 66, 66,208,249,229,151,203,189,156,157,245, 79,187,236,143,103,150,197,196,252,225,245, 73, 26,218, - 13, 52,162,117,235,214,197,201,201,201,110,135, 15, 31,182,170,192,242,244,244, 68,191,126,253, 74, 18, 19, 19,221,155,216, 33, -230,230,230,230,122,179, 44, 11,177, 88,220,228,140, 85, 87, 87, 35, 33, 33, 1, 19, 39, 78,204, 43, 44, 44,108,116,167,235,232, -232,104,235,232,232,152, 17, 19, 19,227,114,239,222, 61,220,188,121, 19, 1, 1, 1,112,116,116,132, 80, 40,132,201,100, 66,117, -117, 53,130,130,130, 32,151,203, 49, 98,196,136, 50,149, 74, 21, 80, 81, 81,209,232, 78,204,207,207, 79, 34, 20, 10, 83, 15, 31, - 62,236, 19, 26, 26,138, 27, 55,110,192,199,199, 7, 74,165, 18, 0,144,149,149,133,203,151, 47, 35, 34, 34, 2,137,137,137,152, - 61,123,118,174,201,100, 10,126,240,224,129,190,209,211, 5, 33, 33,133, 7, 15, 30,204,107,219,182,173,174,182,182,150, 95, 92, - 92, 44,188,120,241, 34, 91, 83, 83, 99,163, 86,171,133,149,149,149, 76,101,101,165,176,182,182, 86,200,231,243, 69,122,189, 94, -120,237,218, 53,129, 74,165,106,242,193,150,109,218,180, 41,190,127,255,190,219,241,227,199,209,161, 67, 7, 28, 62,124, 24,139, - 23, 47,198,229,203,151,225,237,237,141, 67,135, 14, 97,241,226,197,184,127,255, 62, 92, 93, 93, 49,104,208,160, 38,223, 35, 0, - 8, 12, 12, 76, 75, 72, 72, 8, 20,139,197, 72, 79, 79, 71, 94, 94, 30,194,195,195, 97,177, 88, 80, 84, 84,132,212,212, 84, 20, - 20, 20, 32, 48, 48, 16,175,189,246, 90,122,126,126,126, 80,115, 13, 45, 44, 44,172, 52, 58, 58,218,165, 99,199,142, 40, 42, 42, -130,131,131, 67,253,151,189,189, 61, 28, 28, 28,208,170, 85, 43, 44, 92,184, 16,157, 58,117, 42,121,240,224,129,123,115,197, 79, -104,104,232,217, 11, 23, 46,184, 56, 57, 57, 65,167,211, 65,167,211,213, 31, 28,200,229,114, 8,133, 66, 0, 64,106,106, 42, 70, -142, 28, 89,154,145,145, 49,188, 5,197, 17,223,221,221,253,126,124,124,124,176,173,173, 45,114,115,115,145,152,152,136,153, 51, -103,166,214,214,214,182,197, 95,112,221,208,127, 82, 72, 43, 44,191,119, 55,169, 77,187,118, 33,149, 83,103,188, 41, 28, 51,106, - 76,109,220,245,115, 38,161,254,151,154, 23,251,217, 23, 0, 64,244,181,106, 55,189,176,159,168,107,247, 97,188, 99,199,142, 73, -119,238,248,142,185,123, 55, 73,217,174,125, 72,114, 82, 38,214, 52,150,253,210, 0,251,169,139,231, 13, 15, 9,239, 19,206, 84, -213,114,202,173,219,190,239,254, 32, 59,195, 29, 0,252, 94, 8, 40,158, 57,227,141, 27,118, 10, 94,209,197,203, 23,217,181, 95, -157, 73,250,233,151,202, 93, 86,244, 46, 7,248,248,248, 92,221,190,125,187,139,139,139, 11,236,237,237,161,209,104, 96, 52, 26, -113,239,222, 61,221,254,253,251, 77,118,118,118,182, 69, 69, 69,168,168,168, 0,195, 48,184,118,237, 90, 78,113,113,113, 67, 71, -130,245, 55,251, 28, 60, 24,197,244,239,234,235, 40,226,115, 50,177, 57,217,147, 17,112, 98, 30, 28,220,163, 99,175,117,250, 37, -246,226,228, 17,163, 94,117,237,213,103, 32, 62, 93,179,212,148,149,155,219,249,209,233,194,127,107, 11,109,253, 49,104,236,184, -200, 9,239,175,140, 66,212,251,171,113,242,196,143,149, 54, 50,190,222,206, 86,104, 31,222,183,143,110,225,252, 87,114, 53,213, -106,159, 47,214,173,157, 52,116,120,164,119,207,222, 3,112,237,202, 47, 56,184,111,203, 77,145,132, 78, 23, 62, 46, 10,112,116, - 8, 8,120,115, 94,106,170,232, 78, 84, 84, 13, 91, 80, 80,209,117,193,130,178,134,166,205, 59,127, 94, 33,246,244,180,115, 30, - 61,218,113,157,159, 31, 76, 37, 37,223, 53,116, 13, 81, 67,153, 55, 60, 60, 28,142,198,196, 12,182, 48, 76,255,185,243,230,201, -134, 12, 25,130,170,170, 42,156, 60,121, 18,123,247,236,209, 43,149,202, 4,135, 27, 55,110, 7, 20, 22, 46,111, 40,243, 35,192, -201,182,117,235, 89,115,147,146, 68,113,203,151,215, 64,165, 82,133,205,159, 95,110, 54,155,121,179,214,172, 25,145, 81, 88,216, -191,184,172,204, 15, 0,220, 28, 28,114,219,122,120,196,109,220,181,235,222, 87,109,218,112, 53, 5, 5,223, 69, 53, 48, 6,233, -147,243,185,255,242,101,247,211,165,165,127,115,116,116,148,149,149,151, 11, 68, 66,161,170, 75,112,240,254, 79,231,207,143,213, -222,188, 41,126,218,101,239,186, 96, 65, 89,165, 70,195,188,183,113, 99,159,130,242,242, 23,106, 13,134,160,202,154, 26, 37,107, - 52,242,109,101,178,242, 23, 2, 3,139,171, 46, 92, 40,242,171,169,121,123,131, 70, 83, 66,173,242, 15,246, 96,241,120, 60,112, - 28,103, 85,113, 37, 20, 10,127,119, 26,170, 9, 34,129, 64,128, 27, 55,110,160,164,164, 4, 29, 58,116,128,191,191,255,239, 38, -200,200,200,192,169, 83,167, 80, 81, 81,129, 46, 93,186, 0,128,168,169, 64, 91, 91,219,119,150, 45, 91,230, 96, 48, 24, 16, 23, - 23,135, 46, 93,186, 64, 42,149, 66, 40, 20, 66, 36, 18,129, 97, 24, 40,149, 74,148,149,149,193,221,221, 29,115,230,204,177,223, -184,113,227, 59, 21, 21, 21,239, 55,150,201,113,220,188,137, 19, 39,186,133,134, 62,188, 11, 53, 55, 55,183,110, 94, 0, 0,110, -110,110,184,125,251, 54,186,116,233, 2,119,119,119, 68, 68, 68,184, 29, 59,118,108, 30,128,181,141, 46,184, 72,196,111,219,182, -109, 55, 0, 80, 40, 20,224,243,249, 41,118,118,118,174,238,238,238, 10, 59, 59,187,127, 91,198,237,219,183,171,197, 98,177,201, -154,149, 90, 84, 84,132,208,208, 80,168,213, 15,183,165,218,218, 90, 4, 5, 5,161,178,178, 18, 0,160,215,235,225,233,233, 89, - 95,128, 52,166, 99,199,142, 81,109,219,182,125, 81,161, 80, 72, 24,134, 65,124,124, 60,194,194,194,176,127,255,126,248,249,249, - 65, 46,151, 35, 57, 57, 25, 29, 59,118, 68,108,108, 44, 92, 93, 93,209,190,125,123,137,155,155,219, 37,149, 74, 21,243,224,193, -131,168, 38,122,218,248, 54, 54, 54,136,141,141,197,182,109,219,144,153,153,137,130,130, 2,216,217,217,161,115,231,206, 8, 9, - 9, 65,159, 62,125,144,150,150, 6, 94,243,141, 73, 25, 28, 28,124,242,198,141, 27, 46,124, 62, 31,177,177,177,208,104, 52,208, -233,116, 96, 89, 22, 60, 30, 15, 82,169, 20,189,122,245,130,179,179, 51,130,131,131,113,244,232, 81,215,161, 67,135,158, 42, 46, - 46,238, 12,160,168,185,117,234,232,232,248,246,202,149, 43,125,220,221,221, 81, 93, 93, 13,141, 70, 3, 79, 79, 79, 12, 29, 58, -212,235,212,169, 83,111, 27, 12,134,117,207,212,145,150, 5, 57,237,218,135,128,227,240,224,196,209,221,156,183,171, 52,116, 64, - 23,139, 91,202, 61,166,215,181,107,137,237, 1,192, 81,225, 31, 31, 28, 98, 76,137,253,237,124,222,201,227,123,227,205,102,240, - 67,218,133,180,225,115,200,111, 42,187, 44,143,127,236,236,133,236, 33, 29, 59,246, 19,108,252, 98,213,152, 89, 51,134, 73,156, - 28,251,241,170,242, 14,224,242,173, 59,126, 43, 86,188,235,246,193, 7,159,156, 56,123, 33,219, 92,150,199,255,208,154,249, 13, -124,193,233,203,195,159, 11, 93,170,171,247, 32, 62,205, 6, 60, 89, 71,248,183, 10, 68, 85, 85, 21, 36, 18,137,116,210,164, 73, -230,101,203,150,105,108,109,109,229,143,218,114, 9,159,207, 31,214,108,240,253, 36,176, 29,130, 88,161,173,193, 98,225,108,180, -208, 85,138,238,164,101,160,223,192,136,226,238, 93, 58,175,249,100,237,186,229, 1, 65,109, 92, 39, 77,125, 83,248,249,167,203, -191, 5,184,126, 13,198,100,225, 2,239,240, 81, 25,128,151,222, 95, 25,133,140,140, 84,199, 89,227,212,171, 25,129,204,179,109, -135,254,182,223,110, 63, 63, 60,168,117,155, 23,102,205,121,251,167,205,155, 54,188,244,120, 79,214,190, 61,155,143, 1,230,193, -176,238,218,156,231, 65,199, 41, 39, 79, 66,147,147, 99, 82, 93,186,164, 27,252,213, 87,101, 93,166, 78, 93,103, 52,153, 92,120, - 60,222,239, 46,133,224,241,120,128,197,194, 99,214,174,229,115,158,158, 48, 57, 56, 76, 71, 74, 74,235,230, 50, 63, 49,153,198, -141,237,220,249,165,173,187,119,195,207,207,175, 62,211,222,222, 30,243,230,205,195,156, 57,115, 36, 9, 9, 9, 61, 78,157, 58, -213, 99,215,215, 95,187,163,180,116,220,147,129, 70,160,195,164,227,199, 81,147,149,101, 84,221,184,161, 27,180, 97, 67,249, 47, -191,253,230,244,238,215, 95,175,232, 16, 22,230,245, 77, 84,148,196,215,247,225,253, 33, 57, 57, 57, 65, 27,214,175,247, 29, 56, -116,104,159,165,139, 22,109,191,189,112, 97, 59, 60, 28,146,173,209,249, 44,186,120,209,112, 90,165,250,219,193, 67,135, 28,218, -180,105, 3,142,227,144,150,150,230,182,109,219,182, 55,251,207,153, 51,101,209,196,137, 43,134,102,102, 86,152,203,203,197, 35, -191,252, 82,184,111,194,132,246,205,101,214,173, 79, 0,120,121,241,226,119,186,247,238,221, 46, 98,210, 36, 39, 79, 79, 79,158, - 76, 38,131,209,104, 68, 81, 81,145, 99,114,114,114, 96,116,101,101,213,185,219,183,127,128, 70, 51,148,154,228, 31, 44,176, 0, -192,108, 54,183,168,192,178,178,200,170,239,241, 42, 43, 43, 67, 98, 98, 34,252,252,252, 96, 50,153,112,246,236, 89,168,213,106, -136, 68, 34,136, 68, 34, 24, 12,134,102,179, 20, 10,197,144,240,240,112,230,202,149, 43,240,247,247,135, 76, 38,171, 47,172,234, -138, 44,161, 80, 8,165, 82,137,202,202, 74,244,237,219, 87,184,109,219,182, 33,104,100, 28, 64, 0,176,177,177, 25, 49,122,244, -232,250, 46,182,218,218, 90, 8, 4, 15,239,180, 54, 24, 12,168,174,174, 70,121,121, 57, 42, 43, 43,161,211,233,208,169, 83, 39, -241,133, 11, 23, 70, 52, 85, 96, 61, 78,163,209,212,148,148,148, 56,244,235,215,207,113,199,142, 29,201,189,122,245,250,221, 69, -195,191,252,242,139, 78,175,215, 51, 98,177,216,170,139,221,119,239,222, 93,191,238, 11, 10, 10,240,221,119,223,193, 98,177,128, -199,227, 33, 53, 53, 21, 27, 55,110,172,191, 86,174,169,247,168,109,219,182, 17, 63,252,240, 67,215, 93,187,118, 85, 48, 12,131, -228,228,100,236,217,179, 7, 28,199,193,197,197, 5, 26,141, 6, 37, 37, 37, 88,183,110, 29,140, 70, 35,108,108,108,224,229,229, - 37,157, 55,111, 94,223,213,171, 87, 11,155, 42,176,204,102,179, 89, 32, 16,192,215,215, 23, 43, 87,174,132, 78,167,131, 72,244, -176,174,172,170,170,130, 90,173, 70, 92, 92, 28,178,178,178, 96,177, 88,154,252, 96,145, 74,165,227,119,238,220,233, 38, 22,139, -161,211,233,144,154,154,138,244,244,116, 36, 39, 39,235, 85, 42, 21,107, 99, 99,195,243,240,240, 16, 84, 86, 86,138,167, 78,157, -202,171,174,174, 6,199,113,136,140,140,116,222,186,117,235, 43, 6,131, 97,125, 51,171,212, 85,169, 84,254, 99,214,172, 89,210, -186,245,102,177, 88, 80, 90, 90,138, 9, 19, 38,200, 99, 98, 98,150, 25, 12,134, 61, 0, 74,159,149, 29,193,227,119, 11, 86,159, -253,194,249,220,185,111, 94, 72,185,199,244, 18,160,188, 71, 88,255,183, 25, 0,184,127,115,123,159,180,164, 27,102, 27, 11, 47, -227,167, 61,107,175,218, 6,191, 89, 14,224, 88, 83,189,128, 35,250, 58, 12,151, 43, 68,145, 99, 71, 15,225,111,221,246,125,247, - 89, 51,134, 73,220, 58,125,207, 3, 0, 71,137, 55,122,155, 22,241,117,134, 90,233,214,109,223,119, 31, 59,122,196,245,172,236, - 7,235,156,149, 14, 71, 79,253,170, 62,211, 84, 47,161,135, 11,227,229, 40, 43,131,163,207, 16,248,133, 56, 34, 46, 46, 14,199, -142, 92, 65, 80,155,110, 48, 24, 12, 48,153, 76,138,145, 35, 71,106, 14, 29, 58,164, 43, 47, 47,175, 54, 26,141,253, 11, 11, 11, - 83,154,173,175, 80,102,233,196,183, 24,197,102, 33,171,173, 21,215,206, 95,113,228,149,238,189, 35,186, 56,249,122, 9,157,165, -236,137, 1,253,195,119,239,221,245,221,194, 69, 75, 63, 64,167,176, 94,189,231,139,126,107,255,229,110,211,157,134,178,146,178, -113,146,127,244, 40,155,145,146,246,210,131,220,236,188,214, 62, 74, 67,122, 14,103,122,123,217,183, 67,251, 13, 25,223, 49,176, - 77, 79,241,221,251, 87,120, 11, 23, 44,220,251,197, 23,159, 77,170, 43,178, 46,198,158,237, 31, 53, 61, 91, 28,181, 3,122,250, -136, 2, 68, 18,137,183,141,159, 31,147,181, 99,135, 54, 96,212,168, 10, 0, 48,177,172,203,181,235,215,237,229,114, 57, 56,142, -131,201,100,250,221, 53,194,117,215, 5, 15, 25, 48,192,221,154,204,220,111,190,233, 56,119,238, 92, 20, 21, 21,129,101,217,250, -222,239,199,246,217,168,170,170,194,184,113,227,176,125,211,166, 6,207,139, 11, 37, 18, 31, 27, 31, 31, 38,107,199, 14,109,224, - 75, 47,169, 96, 54,243,150,126,253,245,202, 69, 75,150,248, 79,120,229,149,223, 29, 55,134,132,132,224,155, 77,155,196,123,246, -236,241,250,100,211,166, 25, 17, 18, 73, 6,244,250, 38,231,179,186,125,123, 56, 38, 38,202,218,180,105, 83, 95, 80, 6, 7, 7, -227,211, 79, 63,149, 76,158, 60, 89, 60,109,202,148,207,239,182,105,179, 33, 42, 43, 43,205,185,117,107, 59, 70, 34,241,110, 46, -179,110,125, 2, 64,141,193, 16, 26,245,193, 7,142,215,175, 95, 71, 65, 65, 1, 56,142,171,255, 59, 29, 59,118,228,189,242,202, - 43,246, 61,187,118,237, 78, 45,242, 79,234,193,106,168,192,106,172,208,178,182,184,122,242,111,120,120,120,192,104, 52,226,251, -239,191,175, 47,172,234,143, 8,140,198,102, 51,116, 58, 93, 7,165, 82,137,170,170, 42,180,110,221,186, 62,163,110,190,234,190, -164, 82, 41,116, 58, 29,188,188,188,160,211,233, 58, 52, 83, 0,117,182,183,183,175,235,205,130,254, 81, 35, 53, 24, 12, 80,171, -213, 80,171,213, 48, 24, 12,168,168,168, 64, 77, 77, 13,212,106, 53,170,171,171,195,172, 89,102,139,197,130,196,196,196,244, 54, -109,218,116, 22, 8, 4,176,177,177, 81,212,214,214,162,238,102, 2,149, 74,133,157, 59,119,214, 78,157, 58,213,229,218,181,107, - 90,107,214,225,252,249,243, 33,145, 72,160,209,104,176,105,211, 38,204,159, 63, 31, 34,145, 8,213,213,213,216,180,105, 19, 22, - 46, 92, 8,134, 97,160,215,235,177,127,255,254,198, 63,100,239,221,203,186,118,237, 90, 88,151, 46, 93, 28,143, 30, 61, 90, 58, -100,200, 16,215, 97,195,134,213,175, 59,150,101,209,163, 71, 15,180,109,219, 22, 37, 37, 37, 56,125,250,116, 89,112,112,176,203, -245,235,215, 45, 69, 69, 69, 15,154, 89,238,250,162, 73, 32, 16,192,108, 54,163,184,184, 24,106,181, 26,165,165,165, 40, 40, 40, - 64, 94, 94, 30, 24,166,249, 39,135, 56, 59, 59,191, 28, 26, 26, 42,120, 84,108,161, 85,171, 86, 88,180,104, 17,171,213,106, 39, - 0, 56,253,104,178,136,189,123,247, 30, 13, 10, 10, 98, 60, 61, 61,145,154,154, 10, 87, 87, 87, 70, 38,147,189,218, 92,129,165, - 84, 42,183,159, 56,113,194,169,238, 14,218, 58, 90,173, 22, 44,203, 98,226,196,137, 78, 91,183,110,221,110, 52, 26, 71, 60,139, - 59, 5, 27, 7, 7,230,197,126,246, 5,215,174, 37,182, 15,235,255, 54,227,212,122,213,195, 2, 28, 96,226, 46,110, 8,235,215, - 35,116, 79,221,117, 89, 77, 25, 59,216,117,237,168,136, 78,252,201,227,186,102, 48,138, 54,129,187,119,110,112,119,114,236,247, -175, 29, 5,227, 4,133, 20,104,235,103,230, 95, 61,153,225,190,112, 97, 27,195,158,111,255,150,177,251,200,205, 33, 34,113,252, -160, 31,163, 75, 23, 54,150,125, 55,195,116,188, 82,231, 20, 98, 95,121,132, 7,231, 55, 16, 22, 22, 6, 87, 87, 79,124,179,249, - 7,120,189,208, 5, 6,131, 1,118,118,118,242,135,187, 17,227,110,107,138, 43, 0,136,138,138,181,132,135,247, 55, 50,174, 46, -236,188,121, 95,140, 27, 22, 49, 46,164,255,128,193,220,249,243,103,140,189, 67,140, 5,131,251,247, 44,250, 37, 54, 54,181,168, - 40, 63,184,109, 72, 71, 36,223,189, 57,140,227,144,200,227, 53,220,219,116, 55, 19,103,116,188,123, 49,251,151,204,178,104, 13, -113,178, 53, 95,223,137,120,105,204,180,208,240,190,253, 44,231,127, 62,103, 16, 67,157,100,211,183,119,254,180, 41,175, 30,221, -127,224,240,139, 49, 63,159, 12,170, 84, 23,159, 92,251, 3, 21, 87,245, 7,103, 44,235,206, 72, 36,252,226,152, 24,182,211,204, -153,245,235, 69, 46,151,227,216,177, 99, 16,139,197, 16,137, 68, 16,139,197,245, 95, 34,145, 8, 74,165, 18, 60,142,227,183, 36, -179,176,176, 16, 69, 69, 69,176,183,183,135,171,171, 43,138,138,138,112,249,242,101,164,166,166,130, 97, 24, 68, 68, 68,128,223, -200,231,230, 19,153,134,191,189,255,254,240,246, 29, 59,122, 62, 89, 92,213,125,182,169, 84, 42,244,239,223,159,119,254,252,121, -215,139, 25, 25, 99,160,215,255,208, 84,102,135,209,163,203, 75,162,163, 27,252,219,237,218,181,227, 29, 61,118, 76, 50,105,226, -196, 5,159,110,222,188,126,197,231,159, 23,129,101,149, 45, 89,118, 30,143,199,231,241,120,240,241,241,129, 74,165, 66, 77, 77, - 77, 93,135, 3, 28, 29, 29, 97, 50,153, 96,177, 88,132,212, 34,173,199,111,174, 24,120,178,144,106,236,139,207,231, 63, 85,145, -213, 20,107, 10,172,186, 34, 67, 34,145,252,110,227,170,251,122,124,227,171, 43, 98,172, 32,168,170,170,194,145, 35, 71,160, 82, -169, 80, 93, 93,253,187,226,170,174,231, 42, 51, 51, 19,123,247,238, 69,126,126, 62, 4, 2,129, 85, 15,109,205,204,204,188,233, -239,239,223,185,174, 71,108,224,192,129,222,151, 46, 93, 42,168, 43,230,150, 47, 95, 94,214,179,103, 79,151, 39, 63,220,155,156, - 89,129, 0,151, 47, 95,134, 70,163, 1,199,113, 16,137, 68, 72, 78, 78, 6,203,178,224, 56, 14, 12,195,160,180,180,180,217, 30, -172,196,196,196,215,103,204,152,177,126,230,204,153, 49, 75,151, 46, 61, 63,104,208,160, 92, 30,143, 7,147,201, 4, 59, 59, 59, - 40,149, 74,164,164,164, 64,171,213,226,157,119,222,201,217,181,107,215,207,155, 54,109,138,217,178,101,203,250,188,188,188, 25, - 45,121,111, 89,150, 69,109,109, 45, 42, 42, 42,160, 82,169, 80, 85, 85, 5,157, 78,247, 84,109,104,240,224,193, 56,121,242,164, - 96,240,224,193, 91,253,252,252,138,252,252,252,138, 6, 15, 30,188,245,248,241,227, 2, 47, 47, 47,228,230,230, 34, 46, 46, 14, - 42,149, 10, 22,139,133,215, 76,239,234,192, 41, 83,166,244,245,245,245,229, 25,141, 70,232,245,122, 24, 12, 6, 24,141, 70,152, -205,102,228,228,228,160, 93,187,118,124, 95, 95,223, 94, 0, 6,210, 46,164,101,170,242, 14,128, 43,249, 10,156,106, 31, 44, 37, - 95,163, 86,247,116, 57, 21, 21, 21, 31,190,245, 81,101,137,185, 50, 6,247,110, 29, 65,181,150,129,119,208, 64,188, 57,115, 34, -126,187, 30,131,242,242,114, 36, 37, 37, 33, 60, 60, 92,196,227,241, 90,212, 54,247,237, 59,105,158, 52,241,255, 94, 25, 60,108, - 92,215,193, 67, 70,152,207,159,143,214,223,184,122,230,102,144,191, 93, 9,199,170,139,237,237,228,183,210, 82,146, 16,220,166, - 29, 76,172, 37, 28,136,106,178, 77,101,100,192,240, 83,145,135,249,149,249,137, 83,134,141,154,222,105,240,144, 97,166,179,103, - 78,152, 47,157, 59, 20, 55,108,224, 11,177, 31,127,182,199, 71,101,106,221, 94,106,167, 60,213,171,179,188,223,236,177,190,179, -168,165, 52,208,235, 36,149, 90,240,104,191,201,227,241, 96,177, 88,126, 87, 84, 61,249,101,205,103,210,227,153,117, 56,142,131, - 90,173, 70,106,106, 42, 62,251,236, 51,220,190,125, 27,102,179,185,190, 39,171,209,207,161, 71,167,116, 69, 82,169, 5, 0, 50, - 10, 11,251,207,157, 59, 87,210, 80,113, 85, 94, 94,142,178,178, 50,228,231,231, 35, 34, 34, 66, 84,229,228,212,185,185,249,244, -114,115,211,203,165,210,226,148,148,148,127,155,223,234,234,106, 72, 36, 18,124,245,245,215,162,147,137,137,243, 47, 93,190,236, -208,146,245, 89,151,195,227,241,224,230,230,134,192,192, 64,132,133,133,161, 67,135, 14,144, 74,165,184,123,247, 46,190,251,238, - 59, 8,120, 60,150, 90,226,159,208,131,213, 88,129,213,208,255, 25,134, 65, 75, 10, 2,107, 89,115,138, 80, 42,149,222, 41, 46, - 46,238,227,237,237, 13,147,201, 84,223,123, 85,119,154,176,238,123, 0,144, 72, 36, 72, 74, 74,130, 84, 42,189,211, 84,166, 92, - 46,191, 35, 16, 8,122,117,235,214, 13, 71,143, 30, 69, 76, 76, 12, 50, 51, 51,161,213,106,161,211,233,160,213,106,113,247,238, - 93, 88, 44, 22,132,134,134,194,222,222, 30,114,185,252, 78,115,243, 90, 91, 91, 91,200, 48, 76, 27,153, 76,246,175, 83, 29, 30, - 30, 40, 43, 43,179,152, 76, 38,236,220,185,179, 74,169, 84, 42,100, 50,153,213,235,147,199,227,161,164,164, 4, 62, 62, 62,168, -170,122,248,152,175,234,234,106,184,185,185,193,104, 52,194, 98,177, 64,175,215,195,198,198,166,190,203,183,169, 14,193,180,180, -180, 69,143,125,223,109,194,132, 9,123,247,239,223,223,234,231,159,127,198,245,235,215,225,226,226,130,143, 62,250, 40, 51, 59, - 59,123, 18,128,223, 74, 74,254,255, 95,239, 88, 94, 94,126, 56, 49, 49,177, 87,183,110,221,234,247, 14, 3, 6, 12,224, 13, 24, - 48,192,229,241, 46,253,242,242,114,196,199,199, 35, 54, 54, 22, 38,147, 9, 73, 73, 73,102,173, 86,187,175,169,125,142,151,151, -215,142, 21, 43, 86,216,176, 44, 11,129, 64, 0,161, 80, 8,150,101, 33,145, 72,234,123,106,115,114,114, 16, 25, 25,105,191, 97, -195,134,237,122,189, 62, 16,128,241, 89,218, 41,212,168,213,108,244,181,106, 55, 71,133,127,252,253,155,219,251,180,125,180,159, -184,127,115, 27, 43, 85,248, 92,191, 30,175,181,237, 33, 85, 55,187,163,253, 49,186,116,177,209,240,219,240, 51, 63,223,137, 92, -244,206, 27, 98,191, 23, 2,138, 47,223,186,227,215,219,180,136,175,144, 2,181, 58, 64, 85, 9,220,127, 32,176,248,189, 16, 80, -252,219,173,100,241,231,235,183, 4,104,106, 13,117,167, 8, 27,149,159,159,175,187,196,113, 99, 23,125, 33,143,157, 56, 89, 32, - 22, 75,157, 80,173, 74,131,159,159, 23, 94, 25,219, 7, 95,125,127, 14,246, 14,142,112,119,119, 7,143,199, 83,180, 96,241,121, - 87,163,227,102, 78,157,241,102,207,161, 47,142, 48,159, 61,119, 10,209,103,143, 92,223,177,126,217, 17, 35, 83,173,224,155,107, -100, 62,222,202,132,172,204,148,215,194, 7,188, 8,169, 76,254,255,216,187,238,240, 40,170,183,123,102,182,167,247,186, 36,144, -132,144,132, 36,148, 16, 64,233, 85, 32,128, 20, 65, 84, 16, 16, 21, 80, 64,177, 80, 68, 1, 65, 4,233,216,144, 14,210, 5, 1, -233, 61, 64, 32,210, 75, 26, 33,189,236,166,183,221,108,223,153,185,223, 31, 36,252, 2,134,100, 19,208,207, 50,231,121,246,201, -238,100,230,204,189,115,239,204, 61,243,190,239,125,111,115, 32,164,214, 81,188,101, 51,188, 9, 26,190,224,144,253,235,246,249, -178, 55,223,122,183, 83,191, 1, 47, 51, 39,143, 31,196,201,195, 63,255, 62,111,106,179, 99,233,119,118,138, 99,175,229,202,134, -142,152, 92,118,228,108,162,241,149, 5,126,201,222, 45,218,234,128,116,126,116,170,126,129, 20, 10, 11, 24,131,193,167, 73,191, -126, 2,109, 86,150,200,214,195,131,169,126, 73,171,249, 82,253,164, 5,139,166,105,128,166, 57, 75, 56, 45, 45,139, 78,167, 3, -247,148,220,135, 84, 53,231,128, 1, 2,109,110,174,168,176,164,164, 89,179,102,205, 30,219,199,108, 54,163,164,164,228,209,167, -188,188, 28, 50,153, 12,165,102,179,135, 37,229,236,214,186,245,182,149, 43, 86,124,178,126,195,134, 71,174, 30,181, 90, 13,149, - 74,133,138,138, 10,208, 52,141, 25, 51,103, 74,103, 46, 88,240,254, 32,161,112, 58, 24,198,226,235, 89,253,178, 78,211, 52,132, - 66, 33,178,178,178, 30,125,178,179,179, 33,147,201, 64, 40,138,227,123,228,115, 16, 88,213, 65,238,245,137,171,234,239, 2,129, -192, 50,115,111,213,155,192,243,178, 96,105, 52,154, 51, 49, 49, 49, 29,251,245,235, 39,140,141,141,133,151,151,215, 31,220,132, - 66,161, 16, 20, 69,193,218,218, 26,199,143, 31, 55,105, 52,154, 51,245,220, 68,103,207,158, 61, 27,249,209, 71, 31,137,198,141, - 27,135,248,248,120, 76,154, 52, 9,101,101,101, 80,169, 84, 40, 41, 41,129, 78,167, 67,199,142, 29, 33,147,201,144,146,146, 98, -214,233,116,245,165, 42, 32,133,133,133,149,110,110,110, 94, 79,254, 99,196,136, 17, 30, 63,254,248,163, 54, 41, 41,201,220,185, -115,103,123, 0, 13, 18,172,187,118,237,122,212,102,247,239,223,199,218,181,107, 31,197, 33,220,188,121, 19,203,151, 47, 7,203, -178,150, 8,172, 39,113,189,184,184,152, 49,153, 76, 8, 12, 12,132, 92, 46,135, 78,167,195,154, 53,107, 24, 0,215,255,140, 14, -105,137, 5, 75,175,215,239, 27, 59,118,236,204,219,183,111,123,137,197,226,106,211, 53, 56,142,131,201,100, 66,102,102, 38, 18, - 19, 19,145,146,146,130,226,226, 98, 16, 66, 96, 52, 26,113,243,230,205,114,179,217,188,247,105,188,110,110,110,159,111,218,180, -201,211,202,202,234, 15,137,117,171, 31, 58,213,174, 87,119,119,119,244,232,209,195,253,220,185,115,159,155, 76,166,185,255,244, - 7, 65,117,134,118,194, 33, 37,234,141,143,185,201,147, 38,136, 91,180, 52, 37,167, 36, 94, 99,111, 93, 92, 19, 1, 0, 50, 27, -159,171, 45,130,219, 37, 92,138,179,229, 6,190, 57,163,109,136, 63, 4, 20, 65, 48, 69, 80,252,100,198,247,234,119,180, 99, 49, -229,199, 58, 4, 56,197, 28,252,237,204, 15,179, 62,126,231,218, 23, 95,204,114,215, 27, 53,178,144,166, 44, 13, 60, 20, 87,177, -241, 54,250,133, 11,223,185,182,100,197, 54, 46, 59,213, 52,253, 90, 90,249, 83,103,248,214, 20, 45, 52,173,148,121, 6, 76, 87, -250,181,232,213,236,238,239,235, 40, 87,123, 1,236, 90, 14,194,128,254, 47,225,244,217, 24,100,229,233, 80,245, 2, 80,103,218, -131,150, 77, 49,166,154,147,162, 33, 27, 51,254,221,110, 3, 6,188, 76,142, 29,253,141, 57,248,203,207, 49,187,118, 47,223, 75, -139,197, 66, 19,103,111,164, 4,250,114, 86,224, 24,175,169, 40, 5, 0,136,132, 98,251, 58,252, 3,190, 9,241, 73,193,161,161, - 33,158, 99,198, 79,116,136, 26, 48,132, 28, 59,118,144,219,187, 99,219,249,189,223,182,218,193,153, 85,226,188, 76,173,180, 66, -109,174, 32, 2,137, 99,165,154,211, 22,232,155,235,189,127, 31, 97, 2,246,241,163, 83,245, 56, 96, 48,228, 86,230,228,120, 57, -119,239, 46, 77,153, 63,223,218,163, 99, 71, 61, 69, 81,245, 10, 44,129, 64, 0,242,148, 56,190, 39, 57, 27, 34,176, 8, 69,213, - 58,249,136, 53, 24,114, 42,179,178,188, 92,187,119,151,165,206,157,107, 93,155,213,190,164,164, 4,165,165,165,143, 9,172,170, -103,141, 69,229, 92,246,225,135,191,183, 31, 55,174, 52, 54, 54,214,227,197, 23, 95,164, 84, 42,213, 35,113, 85,253,221,205,205, -141,242,109,214,204,238,140, 66, 17, 80, 91, 12, 86,109,215,211,146,186,211, 52,253,212,235,201,227, 25, 44, 88,150, 10, 44, 11, - 6, 71,179,217,108,134,187,187, 59,138,139,139,193,113,220, 83, 27,210,202,202,170,218, 7, 92,231, 76, 58,181, 90,189,122,225, -194,133, 83,122,246,236,233, 26, 18, 18,130,162,162, 34,184,187,187, 67, 32, 16, 60, 42, 87, 53, 95, 92, 92, 28,246,236,217,163, - 82,171,213,171,235,169,247,170,159,126,250,233,253,168,168, 40,103, 55, 55, 55, 56, 57, 57,225,238,221,187,112,116,116,132, 90, -173,198,253,251,247, 97,103,103, 7,138,162, 96, 48, 24,112,241,226, 69, 53,199,113,171,234,185, 49,201,229,203,151, 77,214,214, -214,119, 75, 74, 74, 4,197,197,197,130,170,244, 12,162,138,138, 10,209,137, 19, 39, 92, 29, 28, 28,180,231,206,157, 43,242,245, -245, 21,100,100,100, 8,140, 70, 99,189, 42,139,162, 40,124,248,225,135, 16,139,197, 48, 24, 12, 88,189,122, 53, 62,254,248, 99, - 8,133, 66, 24,141, 70, 44, 93,186, 20,115,230,204,121, 36,152, 15, 31, 62,220,160, 14, 82, 29, 64,106, 50,153, 96, 50,153, 96, - 54,155,255,212, 14,105,161,139, 48,255,193,131, 7,131,218,183,111,127,234,224,193,131, 46,246,246,246, 80, 42,149, 40, 42, 42, - 66, 65, 65, 1, 10, 11, 11,161, 86,171, 97, 48, 24,224,232,232,136,172,172, 44,156, 58,117, 74, 85, 89, 89,249, 18,234,152, 65, - 40, 16, 8,198,118,235,214, 77,248,100, 25,104,154,126,212,159, 68, 34, 17, 36, 18, 9, 20, 10, 5,186,117,235, 38,185,112,225, -194, 88, 0,255,120,129, 85,157,161, 61, 44,172,165,219,160,151, 71,155, 34, 59,244,171,188,112,253,116,174, 45, 71,165,117,237, - 24,190, 19, 0,174,222,209,217, 93,138,179,229,218,180,235, 67, 13, 28,164,107,187,117,243,122, 73, 66,124,130, 95,104,120,104, -157, 25,253, 93,155,112, 67,250,245,106,150,103,111, 67, 9, 23, 46, 92,114,120,211,230, 13, 29, 98,143,252, 47, 77,195,194,133, - 15,211, 52,244,235,213,140, 73,184,159, 60, 4,105,248,217, 82,209, 50,104, 80,191, 91,155,182,236,129, 34,229,176,247,170, 79, -172, 36, 40, 41, 4,172,219,161, 91,164, 11,110,108, 76,196,157, 59,119,242, 57,142,171,219,149, 75,195, 55, 46, 46, 33, 56, 44, - 60,212,243,205,241,239, 58, 68, 69, 13,193,177, 99,135,176,125,203,250, 11, 47, 58, 70,108,202,186, 94, 44,144, 7, 59,137,173, - 29, 37, 98,161, 88, 38, 20, 11,197,197, 38,243, 67,235,186, 80, 44,178, 7, 70,214, 57,232, 76,154, 56,218,161, 87,223, 33, 56, - 90,197,249, 69,219, 17, 27,253,132, 45,169,142,159, 44,155,236,215,212,175,169, 70, 91,160,162,105,137, 73,111,224,236,150,109, -204, 92,153,150, 58, 54, 13,192, 10,240,179, 8,171,113,119,123, 84, 84,135,105,169,169, 98,183, 46, 93,172,148,231,207, 91, 63, -233, 34,172, 77, 96, 9,133, 66,128,166, 25, 75, 56,169,211,167,105, 0, 16,139,197, 79,125,177, 23,139,197,208,106,181, 96, 40, -170,214, 29,196,192,221,237,131, 6,117,156,150,154, 42,114,238,217,211,218,237,246,237,236,140,140,140,160,136,136, 8,176, 44, -251,152,229,170,250,163,215,235, 97, 52, 26, 33,147, 74,227, 44, 41,103,193,197,139,250, 57,227,199,207,125,255,189,247,190,221, -179,119,175,204,222,222, 30, 42,149, 10,106,181,250,209,199, 96, 48, 32,178,125,123,209,207,247,239,143, 65, 89,217, 60, 75,174, -167, 71,207,158,218,250,158,201, 85,130,149,119, 17, 54, 0,116,125, 22,172,103, 76,211, 16,254, 4,231,156, 1, 3, 6,232,211, -211,211,225,227,227,243, 72,164,212, 60,167,189,189, 61, 28, 29, 29,145,144,144,128, 77,155, 54,233, 40,138,154, 83, 23,103, 89, - 89,153, 90,175,215,143,122,237,181,215,116, 34,145, 8,193,193,193,143,220, 58,132,144, 71,177, 87,113,113,113, 24, 59,118,172, - 86,175,215,143,170, 37, 7,214, 99,156, 89, 89, 89, 21, 26,141,230,141,209,163, 71,107,147,146,146,208,181,107, 87,220,190,125, - 27, 26,141, 6,149,149,149,200,200,200, 64,104,104, 40, 76, 38, 19,246,237,219,167,213,104, 52,111,100,101,101, 85,212,197,169, - 86,171, 7,127,243,205, 55,130, 99,199,142,249,121,123,123,135,181,111,223, 62,164, 87,175, 94,205,135, 13, 27,214, 52, 42, 42, -202,171, 69,139, 22,250,126,253,250,185, 13, 24, 48,192, 77, 32, 16,136, 82, 83, 83,243, 8, 33, 3,234,226,172, 41, 0,146,147, -147, 97, 50,153,254, 16,115, 85, 61,155,144,101, 89,139,218,168, 54,145, 93, 45,172,170,133,150, 5,150,176,240, 90,202, 88,239, - 65, 18,137,164,218,194, 73, 44,224,188,157,152,152,216,183, 83,167, 78,183,198,142, 29, 35,244,127, 68, 0, 0, 32, 0, 73, 68, - 65, 84,171,206,206,206,134, 88, 44,134, 92, 46, 71,211,166, 77, 97, 99, 99,131,210,210, 82,236,219,183, 79,123,252,248,241, 56, -149, 74,213, 3,127,204,129, 21,254, 68, 25, 51,106,123,184, 10, 4,130, 63, 8,172,234,149, 2,104,154,206,104,200,245,108, 36, -254, 50,206,137,239,140,113, 30, 56,120,136,221,161, 67,135,100,107,215,110, 76,232,218,245,221,109,182, 94,239,159,176,245,122, -255, 68,199, 23,223,222,249,221, 79, 91, 30, 28,248,237, 55,171,129, 3,135, 57, 76,126,119,140, 55, 40, 74, 88, 31,167,181, 84, -218,177,219, 11, 45,202, 47, 94,190,200, 44, 89,177,141,237,220, 53,234,234,183,223,253,180,247,219,239,126,218,219,185,107,212, -213, 37, 43,182,177, 23, 47, 95,100,186,189,208,162,220, 90, 42,237,104, 73, 57, 39, 77, 28,237, 48, 48,106, 8,142, 28, 57,192, -236,218,182,122,233,161,104, 99,247, 17, 51,245, 5, 89, 15,206, 18,228, 47,130,187, 36, 6,217,217,217, 21, 12,195,244,172, 37, -192,189, 86,206,201,239,142,174, 41,174, 46, 38,100, 96,195,250, 91,183,216, 31,199,207, 55,239, 60,121, 64,119,228,194, 45,213, -133, 27,217,101, 69, 15, 42,210, 52,106,149,145,227, 56, 16,142, 21,124,249, 37,168,186,218,168,115,231, 30, 56,119,122, 39,182, -109, 94, 87,193,113,208,143,220,183,143, 29,249,227,124,210,180,105,179,166, 59,118,236,164, 6, 13, 30,234, 64, 8,184,193, 67, -135, 56,238,218,177,139,242,247,247,111, 22, 16, 0,241, 63,189, 47, 61, 47,206,249, 64,153, 42, 43,235,194,245, 53,107,140, 30, -163, 70, 57, 75, 60, 60,236,193,113, 84,125, 49, 88,181, 88,176,158,202,233,225,236,172, 56,121,242, 36,130,131,131, 33,151,203, - 31,243,200,136, 68, 34,248,250,250,194,205,205, 13,167, 78,157, 2, 1,110,212,198, 57, 27, 40, 47, 79, 75,139,190,186,108,153, -193, 99,196, 8,167,182,254,254, 55,190, 93,179,198,200,178,236, 35,171, 85,205,191,101,101,101, 96, 89, 22,231,207,157, 51, 86, -234,116,155,234, 42,231,205,239,191, 55, 84,215,189,163, 94,175, 25, 26, 25,185,120,204,152, 49,166,140,140, 12,176, 44,139,154, -150,172,194,194, 66,216,217,217, 65,167,215, 55,113,119,119,183,182,132,179,240,216, 49, 91,212,243, 92, 23, 8, 4, 79,186, 8, -255,140,118,255,239, 88,176, 24,134,129,143,143,207, 99,121, 70,170, 3, 7,171, 45, 67, 22, 90,174, 0, 0, 74,165,242,103,134, - 97, 78,142, 25, 51,102,110,219,182,109, 39, 77,159, 62, 93,224,239,239,143,138,138, 10, 56, 57, 57,193,205,205, 13,153,153,153, -216,191,127, 63, 91, 94, 94,254, 19,203,178, 11, 10, 11, 11,139, 44,224, 61, 15, 96,208, 75, 47,189,180,231,253,247,223,119,232, -222,189,187,168,122, 0,188,119,239, 30,142, 29, 59,102,218,189,123,183, 74,175,215,143,178, 36,139, 59, 0,228,231,231,159, 2, -240,202,184,113,227,118, 12, 27, 54,204, 78,175,215,139,210,211,211, 97, 52, 26,193, 48, 12, 74, 75, 75, 77,209,209,209,149, 90, -173,118,116,213,190,245,241,221,204,207,207, 15, 53,153, 76, 99,111,221,186,181,232,149, 87, 94,113,233,212,169,147,152, 97, 24, -196,196,196, 20, 69, 68, 68,184,171, 84, 42,211,229,203,151, 75,244,122,253, 28,165, 82,105,209, 82, 57, 20, 69, 65,165, 82,193, -213,213, 21,122,189, 30, 28,199,193,104, 52,194,206,206,238,209,242, 70,132,144,135, 55, 71,195, 93,132, 96, 24, 70, 96, 54,155, -241,218,107,175,129,227, 56,172, 94,189, 26, 12,195, 8, 26,202, 99,107,107,123, 35, 62, 62,126, 80, 88, 88,216,163,242,208, 52, - 13,154,166, 33,149, 74,225,234,234, 10, 23, 23, 23,156, 57,115, 6, 52, 77,223,176,144,246, 78,113,113,113,187,147, 39, 79,118, -186,115,231,206,155, 0,218,152, 76,166, 38, 44,203, 82, 52, 77,231,177, 44,123,183,178,178,114, 19, 44, 92, 42,167,176,176,112, -209,216,177, 99, 35,118,237,218,101, 43, 20, 10, 31, 93, 47,154,166, 33, 22,139,225,234,234, 10,153, 76,134,230,205,155, 67,167, -211,225,243,207, 63, 87,105,181,218, 69,255,166, 7, 66,215,206,221,112,238,196, 78,235,109, 91,183,171, 89, 22,116, 85, 42,134, - 71, 8,241,135, 96,235,230,245, 18,153, 80,239,212,181,115, 55,139, 92, 43, 70, 19, 83, 50,106,194, 79, 62, 85, 75,229, 44,202, -200,204, 90,181,243,167,183,211, 0, 96,197,234,141, 1,217,169,166,233, 9,247,147,135,172,221, 24,221,209,104, 98, 44, 90, 0, -247,127,162,101, 71, 5, 8,244, 74,165,242, 42, 69,201,253,186,190,101,154, 19,220,140,122,185,160,132, 83, 80, 20, 53, 85,169, - 84,166, 89, 90,247, 78,157,186, 35,250,244, 46,108,219,178,163,130,226,160,175,190,255,246, 1,100,223,252, 11, 4,184, 80,189, -171,102,242, 43,248,114,206,140, 73, 31,171,212, 21, 43,215,254, 88,183,219,164,117,155, 23,208,186,205, 11,152, 50,245, 51,135, -208,176, 16, 95, 0,216,183, 15,108,152, 95,194,225,185, 11,230,191,188, 96,238,124,168,180, 6, 84, 47,171,115, 63, 41,225,104, - 90, 58,140,252,240,244, 63,204,101,152,171,248,244,211, 22,250,138, 10,183, 46, 51,103,186, 10,151, 45,163,171, 95,160,159,180, - 96, 61,178, 94, 53,128,243,196,217,179, 71, 63,253,228, 19,197,242,101,203,250, 45,249,230, 27,171,150, 45, 91, 34, 63, 63, 31, - 33, 33, 33,144,203,229,136,137,137,193,169,227,199, 53,149, 58,221, 28, 79, 79,207,181,121,121,121,181,114,206, 7,174, 10,231, -204,105,110,212,104, 60,150,111,222,252,160, 87,159, 62, 5,155, 54,109,106,210,191,127,127, 90,171,213,162,162,162, 2, 21, 21, - 21, 48, 24, 12, 16,139,197, 80, 42, 20, 92,174, 66,113, 55, 59, 59,123, 83,157,229,252,232,163, 22,218,210, 82,183, 46, 51,103, -186,154, 75, 74,100, 31,103,102,230,210, 91,183,126, 51,105,226,196, 79,166,127,244,145,180, 73,147, 38,148,193, 96,120, 36,180, -204,102, 51,172,172,172,204, 12,195,184, 0,208, 90,194, 41, 59,122,148, 41, 41, 41,129,179,179,243,163,180, 75, 52, 77, 67, 38, -147,193,201,201, 9,149,149,149, 32,132,240, 9,112, 27,226,145,121,218, 63,130,131,131,111, 8,133,194, 38, 53, 77,132,181,173, -109, 87,243, 59,195, 48,185,241,241,241,145, 79, 40,220, 90, 77,159,114,185, 60,128,227,184,175, 59,117,234,244,202, 59,239,188, - 67, 93,184,112, 1,103,207,158, 37, 10,133, 98, 31, 77,211,115, 20, 10, 69, 90, 29,111, 54,181,114, 58, 57, 57,217,217,217,217, -125,104, 99, 99,211,167, 58, 21,131, 76, 38,187,167,209,104,206,168,213,234,213,117,100,111,127, 42,167,159,159,159, 61,199,113, - 31,216,216,216,244, 45, 46, 46,110, 11, 0,174,174,174,183, 53, 26,205,105,154,166,215,212,177,128,244, 83, 57,189,188,188,172, -108,109,109, 23, 57, 59, 59,191,241,206, 59,239,184, 92,184,112, 33,239,246,237,219, 98,149, 74,181,147, 97,152,186, 22,123,254, - 3,103,203,150, 45, 31, 91,139,240,121,182, 17, 0,180,110,221,250,200,224,193,131, 7,190,241,198, 27, 48,155,205,248,233,167, -159,112,234,212,169,163,169,169,169,131,234,121,251,124,140,211,195,195,195, 85, 46,151, 71,143, 30, 61,186,233,208,161, 67,173, - 29, 28, 28, 32, 16, 8,160,209,104,144,150,150,134,123,247,238,145, 83,167, 78, 85, 38, 36, 36,228,234,116,186, 30, 5, 5, 5, -197,150, 94,207,103,124, 75,126,140, 83, 40, 20,118,247,241,241,217, 61,111,222, 60,187,190,125,251, 90,185,184,184, 64, 40, 20, -130, 97, 24, 20, 20, 20, 32, 46, 46, 14,199,142, 29,211,252,242,203, 47,154,146,146,146,215, 80, 99,212,253, 43,203,249,188, 57, -171, 51,185, 63,214,183, 66, 91, 38, 36,101, 96,241, 99,219,252,240, 81, 66,124, 66,171,154,150,171, 26,153,220, 45, 42,103, 84, - 23,199,168, 87,134,182,239, 3, 0,251, 15, 94, 63, 83,207, 98,207, 79,150,243,139,132,248,164, 39, 22,155, 14,185,159,152,142, -133,141,174,187, 31,230,198,197, 37, 60,198, 25, 30, 30,122, 63, 49,227,233,217,233,159, 52,244,214,122,111, 86,199,139, 61,190, -103,118, 98,230,255, 92,160, 45,155, 97,208,144, 87,134, 13,252,108,214,108,124,189,100, 49, 14,237, 63,112, 52, 49,243,209,114, - 62,255,200,190,244, 39,114, 82, 95, 9,133, 47, 88,123,121,117,219,229,234, 58,251,228,233,211,182,213,241,181,213, 49,146, 79, - 78,184,138,136,136, 40,188,115,231,142,135, 37,156,131,190,251,206,164,183,179,147, 46,249,233,167,238, 90,163,177,251,199, 31, -127, 44,188,113,227, 6,118,239,220,201,232,114,114,118,228,179,236, 7, 79,241,126,252,161,238, 95,137, 68, 29,101, 46, 46, 61, - 90,204,158, 45, 93,178,103,207, 56,121,147, 38, 30,131, 6, 15, 22, 11,133, 66,104, 52, 26, 40,149, 74, 92,142,137,209,103,101, -103,199,233,245,250, 97,185,185,185,121,150,214,125,208,119,223,153, 28, 3, 2, 96,235,225,193, 93,186,124,217,113,230,188,121, -147, 60,188,188, 28,186,116,237, 42,178,182,182, 70, 89, 89, 25,178,179,179,113,233,210,165,194,180,180, 52,111, 0,172, 37,156, -191,221,187,215,250,220,213,171, 35, 62,253,244, 83, 73, 72, 72, 8,236,236,236,160, 82,169,144,152,152,136,203,151, 47, 27,246, -236,217, 83,161,209,104, 38,229,230,230,254,246, 39,182,251,127, 67, 96,253, 85, 55,158,135,135, 71, 36, 77,211, 95, 84,185,163, - 22,214,183,166,223,191,233,161,227,233,233,233,235,228,228,180, 94,167,211, 17,131,193, 48, 49, 63, 63, 63,251,111, 88, 78, 97, -100,100,228,143,133,133,133,157, 8, 33,112,112,112,184, 18, 31, 31,255, 30,234,246,197, 63,141, 83,224,233,233,217,201,198,198, -166,163,141,141, 77,119,147,201,212,178, 42, 14, 47, 81,171,213, 94, 48,155,205, 87,243,243,243,175, 84, 61, 16,254, 63,235, 46, - 0,208,215,219,219,251,109,142,227, 2,105,154,118,172,114,149,150, 19, 66, 82,202,202,202, 54, 2, 56,253, 55, 40,231,115,227, - 12,245,195, 48, 66, 33,228,177,135, 3,135,236, 39,131,215,171,131,225, 31,219,143, 32, 41, 33, 3, 7, 26, 80, 78,122,104,111, -183,229,192,195,153,134,168, 59,112,246,113, 49,100,129,104,105,176,192,106,138,177,181,114,102, 97,187,133,124,220,179,180, 81, -104, 83,116, 7,133, 78, 28,133,171, 73, 25, 56,247,111,124,214, 61, 79,206,175, 1,231, 95,130,130,174,208, 66,161, 39, 69, 81, - 52, 0, 80, 52,205,113, 0, 11,154,102,106,186, 5,159,120,161,172,147,211, 4,180, 18, 75,165, 77, 88,134,241, 40, 17,139,237, - 46,219,216,180, 51, 0,149,158, 44,251,197,217,210,210,251, 13, 45,231,124,192, 9, 64,168, 80, 42,245,189,108,109, 61,184,212, -201,169, 93, 25,195,120, 0,224,164, 82,105,124,165, 86,187, 41, 39, 39,103, 99, 45,158,138,122,203, 41,146, 74,125, 88,134,241, -160, 0, 66, 11,133,133, 39,165, 82,159, 34, 55,183, 55,181, 58, 93, 83,169, 84,106, 6,160, 50,153, 76,163,115,114,114,206, 54, -132, 51, 91, 32, 8,189,107,103,215,149,181,183,119, 49, 1, 54, 38,142, 51,153,204,230, 28,131,193,112, 79, 32, 16,172, 84, 40, - 20,169,127,114,187,243,104,224, 77,194,115,242,156, 60, 39,207,201,115,242,156, 60,231,159,204,233,238,238,110,237,233,233,233, - 91,245,146,248, 79,172,251,191, 10, 66,254, 18,240,224,193,131, 7, 15, 30,255,124, 20, 22, 22,106, 81, 75,204, 21,143,255, 31, -212, 53,251,165, 33,166,191,198, 40,217, 56,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,115,156,245,113,243,174,199, 63, - 73,120,241,156, 60, 39,207,201,115,242,156, 60, 39,207,249,223,227,252, 87,129,230, 47,193, 83,225, 81,245,121,222,251,242,248, -119,247,133, 39, 33,175,250, 52,100,127, 47,254,146,243,224,193,131,199, 63, 27,255, 31, 49, 88,213, 3, 85,193,115,218,239,121, - 31, 11, 0,139, 41, 10, 51, 0,128, 16, 44, 5, 48,251, 89,246, 37, 79, 89,209,253, 73,132,133,133,185, 82, 20,213,219,193,193, -161,149, 90,173,142, 35,132,156,190,119,239, 94, 9,101,225,250, 79, 62, 62, 62,126, 50,153,108, 28, 69, 81, 45,171,206,155,168, -215,235,183,230,228,228,100, 60,135,118,163, 0,188, 43,149, 74, 95,117,116,116, 12, 44, 43, 43, 75, 49, 26,141,191, 0, 88,135, - 70,100,156,246,242,242, 10, 2, 48,150,227, 56, 33, 77,211,187,242,242,242,238, 88,122,172,123,216,144,189, 4,104, 1,128,230, - 40,110, 4, 77,232,125, 0, 56, 10,120, 80, 24,127,232,213,231,220, 95, 27,210, 23, 30,127,123,161,233, 37,132,112,159, 2, 0, - 69,209,203, 88,150,253,172,174,253, 5, 2,193, 10,194,113, 31,128, 2,161, 40,122, 25,199,113,179,248, 71, 20, 15, 30, 60,120, -252, 7, 32,151,203, 7,120,121,121,237,240,242,242,218, 33,151,203, 7, 88,112, 72,120, 45,131, 21, 75, 81, 96,129,199,243,235, - 52, 96,191,250,204,146, 53,143, 93,110, 97,213,106,114,122, 80, 20, 88, 82, 5,138, 2,231,238,238,190,222,219,219,123,245,147, - 31,119,119,247,245, 20, 5,174,198,190,108, 13,113, 23, 94, 83, 96,213,247,137,136,136,112,121,235,173,183,214, 40, 20,138,117, - 38,147,105,125,118,118,246,186,145, 35, 71,174, 9, 14, 14,246,180,164,238,254,254,254, 67,135, 12,125, 37,250, 98,236,141,251, -201, 41, 89,202,132,251,105,153, 39,207, 92,186,218,111, 64,212, 25,127,127,255,161, 13,104, 35, 10,192, 68,161, 80,120,222,214, -214, 54, 87, 40, 20,158, 7, 48, 89, 32, 16,252,182,120,241,226,204,248,248,248,130,152,152,152,242,232,232,104,197,132, 9, 19, - 82, 40,138, 58,140, 63, 90, 66,195,235,179,226,120,121,121, 45,200,201,201,185,145,151,151,119,179, 73,147, 38, 63, 60,193, 81, -155,213,231, 17,167, 91,216,144,187,133, 21, 38, 82, 88, 97, 34,110, 97, 67, 72,141,239,119, 27,216,165,235,235, 75,127,232, 11, - 54, 54, 54,193, 79, 8,121,143,167,112,254,225, 88,103,103,103,111, 66, 8,221,188,121,243, 14,114,185,252,123,185, 92,254,125, -243,230,205, 59, 16, 66,104,103,103,103,111,153, 84, 90,111, 95,122,142,224, 57,121, 78,158,147,231,252,187,113,254,119, 45, 88, -132,144, 55, 83, 82, 82,172, 57,142, 67,112,112,240, 24, 0,199, 27, 98, 85,162, 40,204,224,184,135,214, 28,154,166,102,246,236, -217, 43,194,202,202,234,177,140,197, 58,157, 78,114,254,252,185,222, 28, 71,168,170,253,102, 16,130, 53, 22, 90,163, 60, 40, 10, - 51,140, 70, 3, 45, 18, 73, 32, 16,208, 31,135,135,183,138, 44, 46, 46, 62,203,178,236, 79,181, 36,175,172,223,108, 67, 81,216, -180,105, 83, 75, 15, 15,143, 63,172,161, 82, 80, 80, 32, 30, 60,120, 80,131,248,222,108,213, 74,166, 79, 75,235, 74,139, 68,190, - 38,179,217, 21, 0, 68, 34, 81,137,204,214,214,231,243, 57,115,172,109,108,108,184,146,146, 18,168, 84, 42,106,202,148, 41,178, - 41, 83,166,244, 5,176,173, 46,206, 38, 77,154,248,135,183,110, 59,109,235,150, 45, 29, 43, 74, 75,245, 27, 87,174,189,101, 16, - 74,181, 77, 91, 6,137,191,152,247,149,195,130,185,179, 39,154, 76,166,184,220,220,220,244,250,140, 46, 0, 14,124,248,225,135, - 97,131, 6, 13,146,168,213,106,153, 86,171,109,182, 99,199,142,207,219,183,111,111, 27, 17, 17, 33,217,189,123, 55, 85, 94, 94, - 14, 66,136,117, 72, 72, 8, 25, 57,114,164,126,239,222,189, 83, 0,124,219, 16, 11, 16,203,178,162,234, 76,233, 12,195, 72,170, -250,162,201, 18,139, 17, 5, 60, 8,235, 50, 18,160, 16, 24, 31,243,139, 44,172,235, 72, 61, 8, 82, 40,224, 65,213,139,192, 59, - 28,199,249, 61,197,170,148,161, 80, 40, 54, 52,230,102, 25, 56,112, 16, 0,172,191,121,243,230,197,162,162,162, 38, 28,199,142, -182,212,178, 69, 81, 20, 37, 20, 10,199, 2, 88,162,211,233, 38,156, 61,123,182, 45, 0,244,238,221, 91, 12,224, 6, 33,164, 19, -254,252,188,116, 60,120,240,224,193,227,111, 42,176,196, 0,112,241,226, 69, 16, 66, 36,141, 56, 31, 85, 83,184,124,240,193, 7, -240,242,122, 60,220, 36, 47, 47, 15,209,209,231,159,165, 78,143, 13, 82,139, 22, 45,114, 40, 41, 41,121,121,211,166, 77,253, 0, -124, 94, 80, 80, 16, 93,207,241, 5,132, 96, 41, 77, 83, 51, 41,138,130, 68, 34,205,152, 56,113,226,141,170,250, 7, 28, 62,124, -216,122,240,224,193, 90,138,162,210, 0, 64, 34,145,186, 11, 4,180, 31, 33,164,122,160,125,170, 16,124,197,214, 54,152, 16, 50, -120,210,138, 21,108,187,168, 40,161,189,187,187, 0, 52,141,162,236,108,151,245, 63,252,208,233,254,169, 83, 82,207,144,144,108, -163, 68, 82,158,156,156, 12, 47, 47, 47,136,197,226,122,223, 18,172,173,173, 39,124, 56,253, 19,183,138,210, 50,157, 89,173, 54, -217,114, 44, 99, 47, 19, 81,170,162,146,242,140, 28,123,237,132,201,211,132,115,103,125, 52, 1,192,103,245, 80, 77,153, 62,125, -122,203, 14, 29, 58,200,247,236,217, 67, 85, 84, 84, 64, 40, 20,218,182,109,219, 22,145,145,145,236,217,179,103, 41,127,127,127, -132,135,135, 35, 38, 38, 6,151, 47, 95,166, 34, 34, 34,172, 15, 28, 56, 48,198,108, 54,127, 91,159,168, 22, 8,232, 89, 35, 70, -140, 28, 96,109,109,109,214,233,116,120,231,157,119,160,209,104,208,178,101,203,214, 61,122,244,136, 53, 24, 12,162, 67,135, 14, -134,179, 44,135,186,196,117,181, 27,176,202, 98,213, 10, 4, 41, 69,241,135, 90, 87,255,159,227, 56,191,251,247,239,135,150,151, -151,131,227,184, 71,107, 50, 2, 64,183,110,221, 26,210,151, 10, 8,193,210,193,131, 7,205, 4, 40,244,234,213,171,100,218,180, -105,108, 98, 98, 98,143,225,195,135,189,240,224, 65, 74, 93, 47, 1, 5, 20, 69, 47,163,105,106, 6, 69, 81,212,184,113,227, 11, -108,109,109,135,249,248,248,220,167, 40, 74, 40, 22,139,171,239, 3, 65,203,150, 45,221,194,195,195, 39, 59, 57, 57, 21, 10,104, -218,157,128, 16,138,162,151, 17,194, 21,240,143, 40, 30, 60,120,240,248, 15, 8, 44,138,162,138,111,223,190,237,165,215,235, 65, - 81,148, 37,214,160,184, 39, 6,156, 31,105,154,122,143,162, 40,132,135,183, 74, 95,189,122,117,109,235,109, 25,195,195, 91,165, - 11, 4,180, 63, 33, 4, 20, 69,175,125, 98,160,137,171,111, 64,148, 72,164, 51, 0,192,203,203,187,224,200,145, 35,230, 17, 35, - 70, 96,217,178,101,146, 89,179,102,125, 69,211,244,168,188,188,188,220, 58,202, 9, 0,179,221,220,220,157, 55,109,218,212,114, -226,196,137, 55,148, 74,229,135, 0,224,237,237,189, 26, 64, 43,138,162,210,106,108,195,186,117,235, 34, 39, 76,152,144, 88, 88, - 88, 56,251,105,156,175,216,217, 5,186,120,123, 15, 93, 30, 19, 67,132, 12, 67, 85,220,184, 81,158,155,159,111, 50,178, 44,125, - 60, 61,189,227,168,241,227,197, 30, 94, 94,228,208,186,117, 77,181, 34, 17, 97,101,178,138,248,248,120, 98, 50,153,238,213, 87, -119,138,162, 66,156, 28,157,108, 54,174, 88,123,195, 77, 42,160, 92,125,188, 41,177,189,163,144,182,181,147, 18,129, 64,215,212, -199,219,142,162,168,144,250,218, 72, 44, 22,143,233,215,175,159,245,238,221,187,169,240,240,112, 56, 58, 58,226,226,197,139,184, -125,251, 54,202,202,202,104,134, 97,208,190,125,123, 44, 93,186, 20, 62, 62, 62,168,168,168, 64,102,102,166,171, 88, 44,118, 51, -155,205, 79,187,158,143, 9,222, 25, 51,102,192,221,221, 29, 44,203, 34, 47, 47, 15,149,149,149,176,177,177,129,131,131, 3,148, - 74, 37, 14, 29, 58,104, 73, 95,178, 8, 47,190,248,162, 22, 64,230,147, 22,172,134,112,202,229,242, 83,133,133, 69, 93,123,246, -236,137,242,242,114,211,188,121,243,208,182,109, 91,180,104, 17, 84,111, 57, 89,150,253,204,213,213,117,179,139,139,203,138,105, -211,166,121,186,184,184,192, 96, 48,204, 41, 41, 41,193,140, 25, 51, 0, 0,145,145,145,173, 8, 33, 71, 39, 76,152, 0, 63, 63, - 63, 69,105,105,105,246,253,251,247, 39, 22, 22, 22,198,213, 88,226,232,207,152,178,204,115,242,156, 60, 39,207,249,119,227,252, - 87, 10, 44, 82, 99, 32, 36,120,138,171,130, 16, 82, 38,151,203,189,172,172,172, 64, 8, 41,107,232,201, 56,142,155,226,226,226, - 82, 56,123,246,236, 46, 65, 65, 65,198, 41, 83,166,196,101,102,102,206,169,185, 79,179,102,205, 22,125,255,253,247, 72, 78, 78, -206, 92,188,120,113, 76, 73, 73,201,194, 6,158,102, 22, 33, 88, 13, 0, 74,165,178,248,240,225,195, 29, 46, 92,184, 48,107,245, -234,213, 94, 83,166, 76,145, 76,155, 54,109,178, 5,150, 28, 8,133, 66, 93,109,110,193,218,224,225,225, 97, 18, 10,133, 79, 91, - 63, 16, 19,219,181,147, 18,142, 27,250,205,197,139, 28,151,155,171, 63,182,101, 11,150, 93,190, 60,201,193,213,213,215,205,205, -141,248, 53,105, 82,100,197, 48, 5,170,162, 34, 58,162, 95, 63,209,201,109,219,154, 74,253,252, 18,246,237,219, 87,201,113,220, - 41, 11,138, 80,105, 52,155, 13, 54, 62,222,230,193, 67,250,181,186,119,237,118,178,149,179, 51,221,170,125,219,208,164,148,204, -155, 20, 96, 4,234, 95, 60,214,193,193, 33,168,184,184, 24, 42,149, 10,110,110,110, 88,179,102, 13, 60, 60, 60,160,213,106, 17, - 31, 31, 79,154, 52,105, 66, 93,186,116, 9,222,222,222, 40, 42, 42,130,209,104,132, 86,171, 45, 52, 26,141, 79,171,123, 1, 77, - 11, 54,210, 52,245, 14, 69, 81, 8, 12,108, 81,240,237,183,223,154, 9, 33, 8, 9, 9,193,176, 97,195,112,241,226, 69,196,199, -199, 87, 91,153,204,126,126,254, 5, 52, 77,185, 63,236,110,117, 91, 4,235,233,107, 0,144,153,151,151, 55,187, 49,199,203,229, -114, 25,203,178,147, 2, 3, 3, 7,189,254,250,235, 38,177, 88, 12,173, 86, 91,125, 45, 76,253,251,247, 47, 25, 60,120,144,203, -209,163, 71,235, 44,103,113,113,113, 90,203,150, 45,223,249,228,147, 79,182,175, 93,187,214,241,179,207, 62,123,180, 8, 55,203, -178,224, 56,238,145,149,237,192,129, 3,200,200,200,248,186,176,176,144,127,112,241,224,193,227,191, 8,139,180,200, 63,209,130, -245,151, 84, 70, 32, 16,172, 59,117,234, 84,219,110,221,186, 9,123,247,238, 29,126,226,196,137,112,133, 66, 17, 87, 53,168,133, -247,238,221, 59,220,221,221, 29,107,214,172,209, 10, 4,130,117,141, 60,205,163,193, 46, 47, 47, 47,150,162,168, 47,126,253,245, -215, 77, 19, 39, 78,132,135,135, 71, 91,165, 82,249,151, 94,228,178,228,228,206,227, 22, 44,224,100,128,224,232,246,237,228,171, -152,152,111,246,254,242,139, 56, 32, 32, 0,132, 16,100,102,102,218,255,180,105,147,243,168,190,125,227,243, 53, 26, 42, 53, 63, -159, 77, 56,114,132, 46,161,233,239,210,210,210,138,107, 46,214, 92, 27, 76, 38,211,245,236,172,172,160,206, 93, 59,123, 93,188, -145,112,107,248,208, 65, 61,105, 33, 77,103,100,229, 93,119,115,113,182,185,124, 37, 70,101, 50,153,174,215, 87, 78,141, 70,147, -193, 48,140, 51, 33,196, 45, 58, 58, 26,174,174,174, 40, 43, 43,131,217,108,134,201,100, 50,106,181, 90, 89, 82, 82, 18, 12, 6, - 3, 12, 6, 3,236,237,237,113,239,222,189, 2,134, 97,206, 61,141,147,101,217,119, 1, 44, 32,132, 32, 57, 57, 89, 81,229,250, -108,225,232,232,184,147, 97, 24, 40,149, 74, 68, 71, 71,143,206,203,203, 75,174,169,111,170,254, 42, 26,125,151, 18,210,232,246, -114,115,115, 11, 23,139,197,179,167, 78,157,234, 17, 22, 22, 6,189, 94, 15, 0,176,181,181,133, 86,171,133,189,189, 61, 58,117, -234,148,184,112,225, 66, 19, 33, 24, 7, 32,191, 46,190,196,196,196,162,160,160,160,169, 19, 39, 78,252, 50, 40, 40,200,159, 16, -130,192,192, 64,244,235,215, 15,199,142, 29,195,131, 7, 15,160,209,104,216,107,215,174,237,206,201,201, 57,194, 63, 99,121,240, -224,193,139,172,127,143, 5, 11, 85, 21, 34,127,246, 9, 11, 11, 11,139,146,146,146, 78,220,188,121,115,208,171,175,190,138,232, -232,232,113, 0, 62, 2, 0,169, 84, 58,238,213, 87, 95,197,205,155, 55,145,148,148,116,162,176,176,176,232,121,156,147,162, 40, -173,209,248,208,128, 35,147,201,172, 26, 56, 80, 7, 84,185, 6, 65, 8, 9,120,218,182,122,172, 97,190, 47, 14, 27, 70, 87,222, -190, 93,190,224,228,201, 15,119,253,250,171,216,199,199, 7,106,181, 26, 2,129, 0,246,246,246, 84,191,168, 40,167,141,187,118, -121,250,216,217, 93,158, 60,126,252,253,175, 79,159,214, 94,174,168,176, 40,189,130, 94,175,223,180,104,225, 23, 61,183,239,216, - 27, 18, 28, 18,232,116,236,212,249, 91, 46, 46,246, 86,126,126, 1,210,138,242,114,195,247,171,151, 9, 53, 26,205,230,250,120, -116, 58,221,129,179,103,207, 14,245,241,241,113,139,139,139,131,209,104, 4,203,178,232,211,167, 15, 8, 33, 82, 0,156, 80, 40, - 68, 98, 98, 34, 76, 38, 83,225,131, 7, 15, 20,169,169,169, 82, 0, 75,234,161,126, 76, 40,209, 52, 61,106,208,160, 65, 96, 24, - 6,253,250,245,195,193,131, 7, 95, 5,240,229,211,246,127, 6, 11, 86, 51, 47, 47,175,197, 85,231,180, 40,184,221,211,211,179, - 75,243,230,205,191, 92,190,124, 41,229,225,225, 5,150,101, 96, 54,155, 80, 84, 84, 2,181, 90,141,208,208, 80,248,250,250, 98, -201,146, 37, 0,112,176, 62,113, 85,141,228,228,228, 20, 0,175,141, 31, 63, 94,124,241,226,197, 72,189, 94,191,170,111,223,190, -184,117,235, 22,238,220,185,243,134,187,187,123,161,143,143, 15, 35,151,203,223,161, 40,202, 94, 38,147,237,122, 30,215,129, 7, - 15, 30, 60,254, 97,248, 75,180,200, 95, 45,176,234,172,152,187,187,187,117, 89, 73,225, 7,126,126,126, 50, 0,144,138, 5,189, - 92, 92, 92,190, 46, 41, 41,169,108,232, 73,181, 90,237,222, 29, 59,118,188,180,114,229, 74,113, 84, 84, 84,243, 95,127,253,181, - 3, 0, 68, 69, 69, 53,183,179,179,195,142, 29, 59, 76, 90,173,118,239,243,170, 36,199,113,253,218,183,111,143,210,210, 82,100, -102,102,222,104,200,177,135, 15, 31,182, 6,208,170,190,109,117,193,104, 54,187,217,123,121, 9, 11, 46, 94, 52,233, 24,198, 55, - 40, 40, 8,106,181, 26, 18,137, 4, 6,131, 1, 25, 25, 25, 16,139,197,212,131,244,116,215, 89, 31,125,116,201, 42, 40,200,182, -122,134,161, 37,200,203,203,211, 1,152,246,213,162,175,118, 46, 95,182,204,189,180,164, 44, 89, 44,177,210, 91, 91, 73,157,103, -126,178,144, 20, 20, 20,124, 92,181, 70, 85,125, 88,178,115,231,206,254, 47,189,244,210, 93, 31, 31, 31,247,226,226, 98, 79,149, - 74, 69, 74, 75, 75,169,170,190, 65, 1,192,221,187,119,145,149,149,197,176, 44,123, 9,192, 2, 88,224,126,124,100,154,146,203, -157, 58,116,232,208,223,197,197,229,145, 43, 50, 34, 34,162, 63,128,239, 20, 10, 69,217,243,236,220,167, 78,157,178,230, 56, 46, - 20, 0,250,247,239,111,169, 24,127,115,212,168, 81,148,149,149, 13, 24,134,129, 84, 42,134, 84, 42,133,173,173, 61,156,157,157, -145,149,149,133, 94,189,122,113,233,233,233,135,172,173,173,183, 52,180, 76,231,207,159,127,185, 67,135, 14, 31, 77,158, 60, 25, -102,179, 25, 67,135, 14,133, 66,161, 88,158,145,145,177,199,211,211,115,244,156, 57,115, 92, 93, 92, 92, 48, 99,198, 12, 43, 0, -243,249,103, 45, 15, 30, 60,120,145,245,239, 16, 88, 79, 27, 20,219, 59, 57, 57, 77, 41, 44, 44,148, 85,187, 94, 40,138,146,181, -105,222,124,157, 88, 44,254, 49, 47, 47,239,114, 67, 78, 90, 94, 94,174, 74, 79, 79, 63, 20, 27, 27, 59,114,248,240,225, 56,125, -250,244, 88, 0, 24, 62,124, 56, 98, 99, 99,145,158,158,126,168,188,188, 92,245, 60, 42,232,237,237,253, 74,143, 30, 61,198,118, -232,208, 1,135, 15, 31, 6,203,178,231, 26,114,124,205, 25,131,181,205, 34,172,222,102, 9,151,228, 97,158, 35,176, 44, 11,129, - 64, 0,189, 94,143,188,188, 60,220,191,127, 31,246,246,246, 40, 43, 45,165,236,157,157, 77, 6,131,129,109,104, 61,243,242,242, -114,111,223,248, 61, 85,167,215,139,156, 92,156,181,118, 54, 18,162, 82,171,233,187,119,111,229, 21, 22, 22,102, 90,170, 5, 9, - 33,221, 79,158, 60, 57, 87, 32, 16,188, 42,151,203, 49,114,228, 72,170,119,239,222,144, 72, 36,208,233,116, 40, 47, 47,175,190, -142,254, 0,224,234,234,234, 97,109,109,189,159,166,233,130,140,140,140, 9,245,157,128,101,217,225, 67,134, 12, 17,154,205,102, - 44, 92,184, 16,243,231,207,199,128, 1, 3,132,215,175, 95, 31, 14, 96,195,243,234,216,132, 16,188,244,210, 75,143,130,220,159, - 8,110,175, 21,221,187,119, 23,166,167,167, 7,200,229,114,100,102,102,194,218,218, 26, 30, 30, 30,112,116,116,132,171,171, 43, - 86,174, 92,137, 85,171, 86,221, 17, 8, 4,107,243,242,242, 82, 27, 90, 38, 95, 95,223,119,198,140, 25,243,206,200,145, 35,161, - 86,171, 17, 27, 27,139,206,157, 59, 99,241,226,197,158, 49, 49, 49,211,219,183,111, 15,161, 80,136, 11, 23, 46,128,101,217, 28, -254, 25,203,131, 7, 15, 30,255,124,129, 69, 61,161, 28, 1, 0,142,142,142,246, 50,153,108, 98, 84, 84, 84,151,161, 67,135,162, - 95,191,126,143, 29,188,102,205, 26,219,232,232,232,153,223,126,251,109,119, 0,107,149, 74,101,105, 3,172, 74, 7,118,238,220, - 25,245,226,139, 47, 90,247,236,217, 51, 0, 0,164, 82,169,113,231,206,157, 90,142,227, 14, 52,162, 46,143,101,111,151,203,229, -237, 5, 2,193,184, 1, 3, 6,180,127,235,173,183, 16, 31, 31,143, 29, 59,118, 36, 6, 5, 5,157, 46, 40,176, 60,110,250,137, - 25,131,181,205, 34, 92, 93,159, 53, 75, 34, 18, 21,169,242,242, 92,132, 94, 94, 18, 27,137, 36,231,250,245,235, 1,205,155, 55, -167,210,211,211,145,156,156, 12,147,201,132,219,183,111, 19, 26,200, 21,216,219,211, 89,119,239, 82, 98,145,168,193, 57,187,172, -196, 92,187,207,103,188, 27,168,215,235, 66, 43, 42, 42, 24,161, 80, 40,148,138,216,244, 6,210, 24,124,124,124,134,176, 44,235, -106, 52, 26,205, 30, 30, 30,162, 51,103,206, 64, 34,145,224,225,236,207,112, 72, 36, 18,163, 92, 46, 87, 3,128,173,173, 45,189, -120,241, 98,209,244,233,211,227,235, 35,142,136,136, 16, 73, 36,146, 81, 65, 65, 65,184,114,229, 10, 18, 18, 18,210,174, 92,185, - 18,208,174, 93, 59,248,248,248,140,242,242,242,218,122,235,214, 45,243,243, 18, 88,104, 96,144,251,133, 11, 23, 56,111,111,111, - 80, 20, 5,129, 64, 0,173, 86,139,244,244,116,116,234,212, 9,155, 55,111,198,234,213,171,127,206,207,207,223,210,152,242,140, - 31, 63, 94,220,186,117,235, 55, 71,142, 28,137,180,180, 52, 44, 89,178,164, 36, 63, 63,255,252,201,147, 39,135, 79,158, 60, 89, -208,185,115,103, 20, 23, 23, 99,235,214,173,204,173, 91,183,182, 68, 69, 69,109, 95,191,126, 61,255,132,226,193,131,199,127,205, -114, 85,219,247,127,151, 5,203,219,219,123,160, 76, 38,123,123,212,168, 81,130,224,224, 96, 20, 20, 20,192,206, 70,106,164, 40, - 74, 2, 0,118, 54, 50,163,217,108,198,228,201,147,209,182,109,219, 14, 51,103,206,108,207,178,236,207, 5, 5, 5,251, 45, 57, -113, 97, 97,161,150,166,233,125,239,189,247,222,146,219,183,111,249, 3,192,181,107,215,210,149, 74,229, 44, 11,221, 89, 53, 81, -157,156,146,146,201,172,238, 6, 6, 6,150, 68, 70, 70, 58, 13, 27, 54, 12,174,174,174,184,117,235, 22, 22, 47, 94, 28,175,215, -235,167, 92,184,112,129,249,171, 47, 50,195, 48,217, 87,143, 28,113,122,105,244,104,167,133,163, 70,125,255,214,248,241, 75,191, - 94,188, 88, 44,151,203, 41,123,123,123,220,185,115,135,108,220,176,193,180,103,217,178,239, 5, 86, 86,226,139, 7, 15, 74, 88, -179, 57,165, 33,231,144,203,229,221,219,119,236, 16,190,124,229,183,208,105, 43,113, 45,246, 8,202, 74,139,177,110,195,175,173, -228,114,121,119,133, 66,113,161, 1,229, 13,216,183,111,223, 67,113, 40,145, 96,193,130, 5,240,246,246,134,189,189, 61, 42, 43, - 43,241,238,187,239, 74, 62,248,224, 3, 0, 64, 66, 66, 2,108,109,109, 45,181,178,245,156, 56,113,162,189,217,108,198,241,227, -199, 13, 44,203, 78, 59,125,250,244,129, 54,109,218, 72,187,117,235,102,191,125,251,246, 94, 0, 78,254, 63,222, 15, 28, 33, 36, -251,212,169, 83,190, 35, 71,142,132, 88, 44, 70, 89, 89, 25,236,236,236,176,124,249,114, 98, 50,153,246, 55,150, 88,161, 80, 72, - 92, 93, 93, 37, 44,203, 98,223,190,125, 80,169, 84, 19,114,115,115,243,155, 55,111,126, 96,230,204,153, 31, 7, 6, 6,250,165, -164,164,100,177, 44,187, 76,161, 80,100, 0, 0, 47,176,120,240,224,193,227, 95, 40,176, 0,188,113,226,196, 9, 1,199,113, 88, -191,126, 61,110,222,188, 73,108,237,157, 63,180,115,160,182,217,219,219,179,229,229,229,111, 44, 93,186,116,232,220,185,115,169, -174, 93,187, 34, 54, 54,150,242,247,247, 31, 14,160,230, 32, 20,142, 58,114,101, 84, 84, 84, 92, 47, 40,200,247,175,145,181,221, - 95, 42,149,213, 55,219,237, 73,206, 39,147, 89,182, 89,180,104, 81,156,187,187,187, 57, 46, 46, 14,107,215,174,229,110,222,188, -121, 20,192,242,194,194, 66,157,133,156,207, 3,143, 56,157,130,130, 46,111,158, 61, 59,226,197,151, 95, 38,189, 94,125,149, 91, - 33,145,124,242,197,188,121,211, 74, 85, 42, 31,142,227,224,226,224,144,253,243,162, 69, 43, 59,119,237,170,187,247,251,239, 54, - 49,191,253,102,229,209,172,217,165,134,148, 83,161, 80, 92,136,142,190,132,173, 27, 86,194,100, 50, 32, 79,145, 5, 0, 40, 46, -169, 64, 61,226,234, 15,156, 52, 77,151,143, 27, 55,206,218,104, 52, 82,163, 70,141, 18, 21, 22, 22,162,121,243,230, 0, 0,149, - 74,133,163, 71,143, 34, 36,228, 97, 90,173,123,247,238, 61,250, 94, 95, 57,173,173,173, 95,237,210,165, 11, 50, 51, 51, 17, 31, - 31,127,172,176,176,176, 40, 33, 33,225, 88, 86, 86,214,240,200,200, 72, 28, 56,112, 96,100, 29, 2,171, 65,109, 84,157, 88,180, -129,125, 9, 12,195,204, 60,112,224,192,196,216,216,216,238, 31,125,244, 17,213,187,119,111, 0,128, 70,163, 97, 45,140, 55,124, -106, 57,171,221,195, 28,199,193,199,199, 71, 3, 0,169,169,169, 25, 0,222,111, 44,231,243,232,159, 60, 39,207,201,115,242,156, -127, 19,206,255,140,192, 98, 56,142, 67,116,116, 52,126,253,245, 87,214,104, 52,206,206,207,207,191, 95, 53,152, 3,192,150,219, -183,111, 95, 26, 62,124,248,138,228,228,100, 65, 66, 66, 2, 8, 33, 13,138, 29,210,235,245,230, 39, 51, 16,232,245,250,103,118, - 17,109,222,188, 25,249,249,249,198,172,172,172,223, 76, 38,211,142,146,146,146,188,198,114, 61,143, 89,132,235,110,222, 52,188, - 98,103,119,112, 86,207,158,195, 23,158, 56, 33, 27, 48,126,188,177, 71,255,254, 95,195,104, 52,138, 68, 34, 14, 86, 86, 2,129, -149,149, 56,225,247,223,109,150, 79,154,228, 66,209,244,161, 31, 18, 18,116, 13,181, 96,245,232,209, 21,227,222,158, 14,157,174, - 18,191, 95, 57,130,242,210, 98,196, 94, 79,134,193,132, 6, 89,176,132, 66,161,175,217,108,150, 50, 12,163, 32,132,224,205, 55, -223, 4,203,178,208,235,245, 80,171,213, 40, 45, 45,213, 79,157, 58,149,174, 18, 77,120,233,165,151, 44,202,234, 31, 16, 16,224, - 43, 20, 10,113,242,228, 73, 8, 4,130,253, 15, 5,177, 96,255,217,179,103,135,143, 26, 53, 10,114,185, 60, 40, 45, 45,173,222, -224,198, 71,139, 61, 83, 8, 4, 0, 80, 8,116, 11, 27,114,183,122,177,103,154,166, 51,218,182,109,107, 81,220,213,147, 40, 42, - 42, 42,196,195,192,253, 95,102,204,152, 49,185, 67,135, 14,225, 95,126,249, 37, 0, 8,158,217, 60,198,113, 96, 24,230,153, 82, - 72,240,224,193,131, 7,143,127,184,192,162, 40,106,119,207,158, 61, 95, 35,132, 8,104,154,222, 81, 45,174,106, 34, 55, 55, 55, - 93, 46,151,175,247,243,243,123,189,202,242,177,171,129,231, 47, 32, 4,223,208, 52, 85,115,237,185,130, 70,112, 44,173,226,160, -132, 66,209,142,171, 87,175,126,166, 84, 42,243, 1,176,207,122,129,158,199, 44, 66, 0,216,175, 86,167,188, 98,107,123,104,114, -155, 54,131,135, 78,155, 70, 34,251,246,117,240,108,214,140, 97,204,102, 54,237,238, 93, 42,230,192, 1,113,204,111,191, 89, 9, - 40,234,240,126,141,230,126, 67,203,169, 80, 40, 46,156, 59,127,225,212,136,225, 81, 47, 5,248,121, 3, 0,210, 50,148, 40, 46, -173, 56,213, 16,113, 5, 0, 89, 89, 89, 6, 0, 6, 79, 79,207,225,123,247,238,221, 71, 81, 20, 85,115,185, 25, 0, 6,161, 80, -216, 2, 0,212,106,117,211, 3, 7, 14,236, 20, 10,133,185,245,241, 38, 36, 36,236,158, 55,111,222,232,244,244,244,223, 20, 10, - 69,106, 85,185, 83, 47, 93,186,180, 86,169, 84,142,206,202,202,218, 14, 11,102,142, 16,160, 69,124,204, 47,173, 0, 32,172,203, - 72,196, 15, 89,161,117, 0, 0, 32, 0, 73, 68, 65, 84,199,252, 34, 3,208, 42,172,203,200,234,107,241,204,193,242, 85,121,185, - 62,184,118,237,218,139,253,250,245, 27, 71, 8, 41,124, 22, 62,153, 76,102, 54, 24, 12, 12,203,178, 66,147,201, 68,100, 50,153, -153,127,252,240,224,193,131,199,191, 23,127,118, 16,153,165, 38,196,199, 2,212, 27,201,217, 16,142,122, 57,189,188,188,166, 80, - 20, 21, 96, 41, 1, 33, 36, 45, 47, 47,239,251,218, 56, 9,121,232,190, 4,158,190,216, 51, 49,155,179,100, 1, 1,151,126,190, -119, 79, 95,139,216,229, 26,114, 61, 3, 3, 3, 73, 74, 74,138,165,237, 91, 39,167, 92, 46,151, 9,133,194, 39, 45, 84,134, 42, - 17, 86,179, 31, 9, 0, 48, 13,108,247, 70,181,209, 35, 11, 22, 64,115, 20, 55,130, 38,244, 62, 0, 92,181, 5,235, 79,232,159, -141, 42,103,205,118, 7,128,128,128,128,247, 66, 66, 66, 70,223,189,123,119,111, 78, 78,206,154,122,111,206, 6,182,251,159,116, -111,242,156, 60, 39,207,201,115,254, 85,156,245,141,179,237, 1,184, 85,253,172,206,147,233,246,196,119, 35,128,154, 99, 86,245, -239, 34,138,162,174,215,224,120,180,221,130, 99, 1,160, 24,192, 93,138,162,140,248,155, 32,156,231,228, 57,121,206,255,161,123, -247,238, 66,254,122,242,156, 60, 39,207,201,115, 54, 92, 92, 17, 66, 6,226,161,151,131, 16, 66, 6, 86,255,126,242,123,245, 62, - 53,127, 87,253,197,147,251, 89,114, 44, 0, 50,107,214,172,217,132,144,158, 13, 41, 51, 13, 30, 60,120,252,101,248,255,152,197, -202,131, 7, 15, 30,255, 2,184, 81, 20,117,132, 16, 50,136, 16, 50,136,162,168, 35,117,136,177, 65, 53,255,214,133,218,120,170, -207, 81,243,247,146, 37, 75,190, 6,208,160,149, 96,132,117,168,208,134,152,254,194, 27,241,191, 56,158,147,231,228, 57,121, 78, -158,147,231,228, 57,255,115,156,207,235,248,103, 70,109, 98,173, 90,200,213,252, 61,107,214,172,207,208,128, 85, 75,254, 10,240, -230, 83,158,147,231,228, 57,121, 78,158,147,231,228, 57,159, 85, 8, 61,213,165, 87,151,187,240,201,239,150,184, 8,235,218,183, - 33,101, 22,130, 7, 15, 30, 60,120,240,224,193,227,239,141,162,154,214,166, 42, 11, 19, 59,107,214,172,207,170,183, 85, 89,153, - 12, 0,164, 79, 30,252,196,113,117,162, 33,251,242, 2,171, 17,104,211,156, 94,232,235,235, 30, 89,117,145, 65,170, 82, 20,112, - 85, 89, 4, 72,117, 50, 35,194,129,112, 4,202,188,242,155,247,210,241,197, 83,148,119,189,177,110, 93,187,122, 58, 11,116,149, -171, 88,142,237, 12, 0, 20,232,139, 34,145,227, 71,103,175, 41,202,107,204, 38,171, 19, 33, 1,104, 41, 19,226, 83,142, 67,107, -138, 2, 40, 10,119,245, 12,150, 37,165, 33,241, 57, 92, 18, 42,204, 31,239, 74,164,214,163, 28, 28,157, 2,203, 74,138, 31,152, - 76,134, 95, 18, 50,176, 14,141, 88,148, 51, 56, 0,109,193, 98, 38,203, 65, 36,164,177, 42, 41, 19, 49,124,175,227,193,131,199, - 95,100, 13,121,166,248,227,218,158,201,132, 16,234, 25, 57,249, 4,121,117, 95,159,235, 85,129,238,213,162,167, 8,192,189,197, -139, 23,151, 45, 94,188,184,230,182, 59, 0,218, 84,237, 87, 84,139, 80, 50, 86,253, 54,214,178,143,209,146,125,255, 20,129, 21, -218, 4,147, 65, 48, 31, 20, 8,128, 47, 19,114,177,182, 65,199, 55, 71, 31,153, 80,176, 17, 4, 2,189,153,253,152,176,184, 88, -235,133, 20,160,155, 76, 36, 88, 1, 10,156,158, 97, 39, 36,164,226,140,165,231, 8, 11, 68,127, 33, 69,111,231, 56, 34, 98, 57, -178, 13, 28,142,216,154,113,249,119, 5,244, 13, 41,171,175,175,123,228,193, 51,121, 47,157,223, 61, 13, 29,219, 6,130,112,102, -128, 48,176, 14,249, 20,103,127,126, 19, 29, 91,249, 62,220,198,153, 97, 27,177, 2, 3,186, 56,144,123,233,141, 91,159,186,107, - 87, 79,103, 43,142,187,187,118,211,118, 79,223,192, 23, 41,194, 25,144,114,251,248, 27, 31,204,152,211,179,119, 7,121,107, 0, -245,174,241,216, 58, 16,111,251,250, 6,127, 58,125,206, 74,218,219,187,137, 45,199, 24,153,188,156,132,118,223,173,156,183, 95, - 76,103,173,184,155,130,141,150,246,227, 80, 63, 76, 20,138, 36, 35,173,172,109, 2,181, 90,117, 10,107, 54,255, 66, 11,132,253, -151, 45, 93,221,182,123,207, 1,182,156, 33,159, 54, 51, 84,232,158,189,187,154,126,255,227,218,168,184, 52,246,101, 0, 92,131, - 42,205,226,195,123,135,222, 29, 33, 18, 10,168,144,129, 27,108, 0,166, 95,131, 57, 0,132,249, 33,140,212,159, 9, 29, 20,240, - 67,124, 6,226, 27,211, 62, 33,126,216, 68, 1, 65, 0,246, 81, 4,187, 19, 50, 81,200, 63,238,120,240,248,119, 65, 46,151,159, - 87, 40, 20, 61,159, 51,103, 71,133, 66,113,149,191,186,207, 79,100,213,178,249, 90, 45,219,174,255, 29,202,219, 80, 11,214, 87, -241, 41, 57, 78,224, 76, 8, 11, 10, 88, 8, 52, 76, 96,201,132,130,109,215,239, 22,120,130,152,176, 97,229,123,123,140,102,128, - 97, 76, 96, 25, 51, 88,198,252,240, 59,107, 6,199,232, 49,111, 85, 52,192,168, 17,217,182,197, 54,128,245,178,244, 28, 34,208, -219,111, 94, 62,229, 76, 49, 21,216,179,117,241,212, 44,101,229,212, 51,215,148,197,161, 34,221,236,132, 76,108,105,200, 32,126, -126,247, 7,216,177,255, 88,238,154, 13,123,147, 56, 16, 56,217, 74,131,199, 12,143,247,249,121,255,249,156,213,155,245, 73,132, - 35,112,180,147, 6,143,125, 57,197,247, 89, 26, 65,160,171, 92,245,227,134, 45,158,190, 77,155, 82,230,140,175, 0,179, 1, 62, -190, 81,130, 57,211,223,246,250,114,233, 15, 43, 1,140,173,211, 26,228,143,208,102, 1, 45, 63,222,182,231,138,175,166,178,208, -120,238,232,103,169, 20, 33,102, 87,215, 16,241,130,175,150, 91,125, 62,123,250, 71, 70, 54,247,234,253,116, 36,212, 83, 20,186, -165, 31, 14,125,253,245,178,214,189,251, 14,182,101,141, 69, 2,125,165, 58,104,227,150, 77,243, 67,194, 58, 88,119,137,104, 34, - 46,186, 60,137,210,170, 75, 97, 34, 86,210, 94,145,189,237,181, 99, 94, 53,111,250,121,215,148,132,116,124,219, 32,125,197,252, - 47,215,136,137,129, 12,128, 8,141, 8, 32, 36,192,251,183, 99,207, 79,100,202,174, 3,156,169, 74,244,154, 0,206, 12, 82,227, -239, 11,175,111, 1,128, 73,141,105, 31,154,194, 75,103,206, 92,247, 42, 40,200,107,191,106,213,215,179, 9,117,253, 56, 40,108, - 79, 76,199,133,198,136, 66, 30, 60,120,252, 61,225,237,237,205, 42,149, 74,193,243,228,148,203,229, 81, 10,133,226,216,179,112, -120,121,121,125, 10,224,237,170,159, 27,243,242,242,150, 61,107,185, 34, 35, 35,155, 16, 66, 60,171,132, 75,254,141, 27, 55,114, -249, 30,240,255, 43,176,100, 32, 28,112,121, 40, 64, 53,108,186, 98,213, 96, 40, 3, 37, 0,204,149, 24, 50,168, 15, 92, 93,188, - 0, 86, 3,176, 58,128,209, 2,236,195, 79,113, 81, 22,192,104,128,162,227, 96, 8,145, 54,184, 86,230, 10,160,240, 23,188,244, -162, 47, 28,237,100,248,224,181, 80,215,245, 7,147, 55,110, 60,120,191, 79, 66, 58, 70, 89, 84, 86, 66,208, 49, 34, 16,107, 54, -104,146, 14, 71, 23,245, 3,128,168,238, 46, 39, 58,182,106,234,179,122,179, 62,233,216,197,178,254, 0,208,191,179,253,241, 14, -225,158,190,220, 51, 44,127,194,114,108, 23,223,230, 17, 20,147,189, 20, 52, 93,134,202,202, 98,228,164,109,133,171, 71, 63,154, -225,184,110,245, 29,111, 37,196,172, 15, 62, 93, 34,212, 84, 22, 24, 9, 83,200,121,216, 22,139, 69,160, 4,156,230,146, 81,151, - 95, 94,249,225,251, 99,152,143,103,125, 61, 11,192,232,186,120, 66,253, 49,101,197,210,213,173, 58,119, 8,118,207,143,249,128, -170,172, 40,128,153, 88, 73, 95,238,222, 25, 78, 77, 67,185,130,219, 43, 40,169, 87, 31, 56,249, 5, 32,247,222, 14,100,221,253, -149,234,218, 97,184,116,219, 78,241, 24,192, 84,171,192, 10,244, 68,151,126, 47,117,216, 19,208,212,219,139, 16, 14, 28,199,129, - 16, 14,122, 35,139,217,223,167, 66,163, 99, 48,168,207, 11,157, 93, 28, 4, 6, 26, 0, 33, 28,114,148, 37,218,115, 87,146,122, -167, 41, 81,239,155, 31, 5,252,208,230,197,158, 93,238, 94,139, 13, 49, 41,143,160,253,176,197, 73, 20,254,231,110, 36, 64,151, - 91,103,183,132, 0, 91, 26,253,210, 68, 8,216,236,223,151,160, 73,196,187,130,117, 91, 78,184, 85,148, 40,198,254,186,247,199, - 17, 63,174, 95,183, 35, 41,189,113,162,141, 7, 15, 30,127, 63, 40,149,202,231, 46,178,174, 92,185,162,124, 22,145, 21, 25, 25, -217, 77,169, 84, 46, 85, 42,149,213, 34,112,105,135, 14, 29,230, 86,143, 83, 79,160,130, 16, 50,250,198,141, 27, 23,235,226,156, - 62,125,186,247,229,203,151,253,110,220,184, 1, 0,104,223,190,189, 95,100,100,164, 95,109,251, 90, 91, 91,179,109,218,180,201, - 92,181,106,149,146,239, 33,127,174,192, 74,202,191,244, 97,132,177, 84, 11, 0, 73, 22,236,255,216, 84, 75,189,153, 93,178,117, -245,216, 37, 97, 65, 78, 80,169,141, 56,125, 41,179,202,130,197,128,101,205,143,254,246,123,209, 21,157,152, 73,248,118,247,125, - 48, 44,183,184, 46,206, 39, 97,226,184,215,219,118,123,117, 47, 71,136,196,218,154,174,104,238,227,226,254,241,152, 54,244, 7, -175,133, 65,167,103, 94,221,121, 60,245, 92, 98, 38, 54, 88,196,201, 49,181, 8,175, 90,182,113,108,189,117,127, 26,218, 4, 91, -117, 28, 54,160,171, 61,204,165, 96, 53, 25, 48,178, 28,242,242, 52, 72, 87,138,225,192, 21, 88,196,201,113,104,237,233,233,101, -125,229,212,204, 12,119,187, 50,177,139, 21, 43, 22, 83, 28,161,205, 68, 96, 52, 38,233,157,188,251,136, 56, 14,173,235,107, 35, - 43, 43,187, 55,187,246, 28,232,144,125,246,109,202,202,103, 0,220,253,155, 32,227,230, 86, 20,198, 29, 65, 73, 97, 22,229, 64, -202, 96,221, 34, 0, 3,134,191,134,165, 83, 34,161, 82, 85,130, 42, 74,115,144, 72,164,142,128,169, 86, 78, 66, 99,244,138,111, - 22,121, 9,133,244,195,235, 73, 24,128,152, 1, 98,134,186,210, 0,163,209, 8,153,152,192, 70, 70,128, 42, 55, 44,203, 26,173, - 91,247,158,245, 30,192, 94,173,175,238,241, 25,136, 15,245, 67, 12, 8, 19, 66, 88, 29, 40, 32, 38, 33,227,127,162, 39,204, 15, - 97,237,122,143,127,159, 2,126,104, 76, 27,133, 55,195,160,200, 16, 91, 27, 43, 38, 9,185,209, 83,145,202,202,136, 71,171,183, -241,218,232, 41,214,235, 54,174, 31, 12,144,201,120, 60, 6,237,207,152, 94,204,115,242,156,255, 72, 78,123,123,123,255,102,205, -154,205, 53,155,205,221,196, 98,177,135,201,100, 2,199,113,249, 18,137,228, 82,102,102,230, 2,149, 74,149,254,119,171,251,241, -227,199, 27, 34,178,234,229, 20,137, 68, 56,118,236, 88, 74, 3, 68,214, 99,156, 52, 77,111,223,183,111, 31,246,238,221, 11, 0, - 56,127,254, 60, 90,180,104, 97, 83,219,129, 57, 57, 57, 54,175,188,242,202,118, 0, 62,117,113, 62,120,240,192,127,209,162, 69, -216,183,111, 31, 0,224,231,159,127, 70, 80, 80, 80,173,133,185,115,231,142,224,243,207, 63,247, 7,160,252, 11,218,232, 95, 43, -176, 8,234, 95, 90, 37,205,211, 78, 20, 1,179, 25, 0,210, 26,122,178,196, 52,124,179,102,211,137,254,103,127,253,161,155, 76, - 66, 99,254,170,143,115,138,138,212, 47, 8, 5, 15,221, 44, 12, 11,218,201, 81, 18,187,120,106, 27,223,178, 10, 61,126,187,160, -184,152,144,142, 6,153, 66, 19,210,112, 26,224, 28,171,108, 67,208,168, 10,131,198,206, 57,189,123,247, 55,253, 91, 79, 31,221, - 26,135,162, 51,167, 3, 76,189,107,213, 17,142, 3, 33,204,163,160,246,170,141, 85, 46,167,255,109,227, 8, 1,136, 25,164,129, -113,222, 95,126, 57, 82,120,104,247,129,254, 54, 82,225,119,147,222,153,104,111, 46, 73, 64, 69, 57,139,252, 98, 13,178,138, 28, -193, 90, 53, 71,114,252, 85, 86, 64,211,245,198,159, 81, 52, 84,196,172,177,115,178,178,162, 67, 59,188,231, 85, 17,247,153, 74, - 42, 48, 11, 28,219, 46,178, 43,184,183, 34,155, 49, 20, 86, 82,244,227, 10,168,214,135,161,131, 67, 11,131, 58, 83, 80, 81, 94, - 2,199, 86,161, 24,240,242, 96,204,159,208, 18,106,181, 6, 69, 37, 87, 72, 96, 83, 7, 74,127,107, 39,230,188, 25,130,146,226, - 60, 24,205, 0,173,210,151,234,141,250,202,167, 91, 2,177,238,195,143,103,188,222,180,137,155, 77,245,100, 1,194,177,104, 19, - 30,128,190, 61, 59,226,116,236, 21, 92,191,149, 12,142,112, 85,147, 9, 88,228, 22,150, 23,232, 77,236,214, 6, 89, 71, 57,230, -161, 37,180, 22, 1,134, 70,184, 6,195,195, 97,205,106,240, 69,251,150,118, 19,102,190,217,212,206, 78, 66, 65,111,197, 66,175, - 55, 67,157,244, 61, 92,154,180,130,181, 76, 70, 69, 68,232,132,183,110,129, 95, 87,144, 7,143, 26, 24, 49, 98,132,172,160,160, - 32,218,199,199, 39,180, 79,159, 62,214,221,186,117,131, 70,163,193,201,147, 39,161,213,106,155,250,248,248, 52, 61,117,234,212, -240,172,172,172, 4, 31, 31,159, 30,251,246,237,211, 55,244, 28,213, 65,229,207, 59, 56, 92, 34,145, 32, 54, 54,246,185, 90,178, - 36, 18, 9,174, 93,187,150,210, 24, 75,150, 70,163, 17,123,122,122,194,197,197, 5, 44,203, 66,163,209,224,224,193,131, 80,169, - 84,224, 56, 14, 86, 86, 86, 88,113,188, 2,250,251,251,176,241,187, 69,168,168,168, 16,215,199, 89, 92, 92, 76, 5, 7, 7,195, - 96, 48,128, 97, 24,232,245,122,156, 57,115,230,209,111,161, 80,136,133,251, 10, 96, 72,222,141,109,235, 86,160,184,184,152,250, - 11,187,143, 37, 90,228, 31, 37,176,170, 43,244,167, 87,140,101,153,217,235,183,238,142,157, 61,117, 20,166,188,217,219,103,193, -183, 7,250, 36,166, 99, 27, 0,180,244,199,216, 49, 81,129,190,142, 54, 34,124,249,211, 13, 0,100,246,179,158, 47, 62, 11,201, -161, 1,220,244, 3,209, 89,209,159, 77,136, 64,128,143,125,139, 50, 83,169, 36, 45,205,130,120, 31,206, 12, 39, 91,105,112, 84, -119,151, 19, 32, 28, 28,109,165, 33, 32, 44, 28,237,164,193,253, 59,219, 31,231, 8,129,163,141, 56,132,112,150, 39,231,238, 16, - 46,125,199, 74, 68,191, 99, 99,231,232,251,225,164, 49, 86, 3, 7,190, 98,101, 35, 33, 40, 73, 56, 6, 21, 9,131,209,198, 6, - 68, 91,142,244, 7,113,236,241, 11, 55, 20, 82, 23,175, 79,128,140,186,139,201,226,162, 50, 39,113, 88,179,192, 62,142, 69, 55, -230, 20,250,247,222,233, 71,131,165, 53,177,195, 11,109,236, 66,197, 49,119,226, 24,142,197,149,250,202,166, 86,169, 50,205, 38, -120,233,205, 34,187,212,107, 91, 48,107, 76, 24,202,203,138,160, 55, 48, 40,215, 48, 38, 47, 87,147, 84, 95,118, 15, 6, 35, 3, -131,137, 64,100,237,141, 83,177,113,197, 28, 99, 62,254, 84, 69,158,135,219,105, 59,110,219,214,220, 22,224,133, 54, 51,157,172, -110,131,213, 33, 43, 91,137,109,251, 99, 35,210,242,112,251,217,110, 73, 6,132,249,223, 51,186, 58,248,189, 49,193,237, 33, 77, -209, 65,204,136,190,251,114,214,192,208, 30, 97,172,148,210,231,129, 2, 96, 45, 19,194, 32, 99,225, 32, 11, 0, 49,169,137, 86, -175, 47,143,143, 3,159,153,157, 7,143, 26, 8, 14, 14,246, 84, 40, 20,241, 31,127,252,177,243,176, 97,195, 30,137,129,173, 91, -183, 98,245,234,213,152, 63,127, 62,204,102, 51,214,175, 95,111,189,127,255,254, 14, 63,252,240, 67,174,175,175,111, 88,118,118, -118,190,133,162, 74, 92, 53,118, 61,140, 42, 32,132,253,242,203, 47,201,252,249,243, 81,189, 13, 0, 11,212,255, 82,249, 52, 49, - 36,145, 72,144,148,148,244, 92, 68,150, 72, 36,130, 88, 44,134, 68, 34,193,253,251,247, 27, 44,178, 24,134, 17,228,230,230, 66, -165, 82,161,239,224,193, 88,189,100, 9,186,117,235,134, 62,125,250,128, 16,130,179,103,207,162,147, 83, 50,156, 7,119, 71, 98, - 98, 34,204,102,179, 69,158,169,220,220, 92,148,148,148,160,255,224,193,216,240,227,143,104,215,174, 29,130,131,131, 1, 0,209, -209,209,232, 45,207,132,109,112, 31, 36, 39, 39,255,149,221,231, 47,211, 34,127,181, 5,235, 47, 65,124, 26,126,231, 14, 92, 56, -242,218,192,246,131, 6,247, 10,197,134,221,231, 22, 65,170,218, 13, 0, 46, 82,233, 87,111, 14, 12, 64, 66, 90, 25,206, 94, 83, - 30, 73,204,192,239,207,227,156, 28, 11, 87, 23, 71,107,128,150, 64,107,100, 25,123,251,250, 3,147, 57, 16, 88,183,156,133, 49, -195, 18,125, 58,182,242,241, 33,132,169,154, 49,184, 18, 99, 95, 78,241,109, 31,230,225,251,208,229,101,134,125,167,157, 0,103, - 83,111, 57,186,182,149,157,250,100,218,212, 23, 7, 14,126,205, 74,108,237, 2, 78,151, 3,115,233, 93,148,164,159,135,193,170, - 45,138,114, 51,176,251,208,111, 21, 73,233, 5, 42,129,128, 62, 45,116,240,152,113,230, 76,122, 37, 69,213,221,207,244, 2, 44, -158, 63,119,246,192,221, 59,118, 57, 88,121,119,197,131, 67, 81,229, 18,129, 89,234, 46, 15,130,142,177, 99,151,111, 62,226,168, - 1,150,212, 87, 62,173, 70,245,235,153,179, 39, 70, 5,122,117,177,203,136, 59, 2,173,214, 8,131, 25, 8,111,215, 19, 44, 71, - 36, 20, 77,113,246, 2, 1, 85, 80, 80, 10,202,204, 21, 92,186,149,145, 23,115, 61, 77, 96,160,235,231,126,172,211,137, 5,211, - 6,247,105, 3,176, 58,188,220, 55, 28,171, 54,159,157, 10,176,227,159,237,182, 52,131,176, 58, 16,160, 75,168, 31,126,226,128, - 46, 55,143,175, 10,137, 28, 48, 29, 13,177, 96,133,249, 97, 64,104,144,247,150, 85,139,102, 59, 59,187,251, 8,192,234, 64, 49, - 42,194,149,254, 14,161,230, 1,236,155, 12, 4,235,208, 25,235,126, 92, 94,201,113,100, 55, 26,145,162,130, 7,143,127, 51,244, -122,253,175, 75,150, 44,113, 30, 52,232,225,108,247,202,202, 74, 92,185,114, 5, 27, 55,110,132,141,141, 77, 77,177,132,168,168, - 40, 16, 66,156,231,205,155,247, 43,128, 23,159,198,217,169, 83,167,193, 43, 87,174,204, 6,240, 0, 15,115, 28,137,241,112,129, -121,114,230,204, 25, 26, 0, 58,116,232,192, 94,187,118,141, 3, 64, 70,143, 30, 45, 58,116,232, 80, 11,141, 70,115,161,177, 2, - 75, 34,145, 64,161, 80, 60,179,200, 18,137, 68,143,248,196, 98, 49, 20, 10, 69,131, 68, 22,195, 48,194,163, 71,143,226,214,173, - 91,248, 50, 34, 2, 31,120,121,193,197,197, 5, 23, 46, 92, 0, 33, 4, 54, 54, 54, 40, 45, 45,197,238,221,187,209,179,103, 79, - 48, 12, 35,182,132,247,224,193,131,184,121,243, 38, 22, 70, 70, 98,170,141, 13, 28, 29, 29, 17, 29, 29, 13, 0,144, 74,165, 80, - 40, 20, 56,115,230, 12,122,244,232,193,119,234, 63, 91, 96,117, 7,132,165, 20, 60,205, 38, 29, 8, 67, 0, 10,222, 45, 91, 66, -156,152,216,240,183, 4, 26,152,179,102,243,145,129,171,102,191, 76,189, 59, 34,194,123,193, 15,231, 39, 3,192,132, 87,131,228, -214, 82, 33,214,236, 78, 32, 52, 48,231,121, 84,176,101, 75,136, 41, 3, 38,247,237, 28, 12,101,177, 17,105,217, 21,231, 18, 51, - 44,115,233,156,221, 54, 6, 63,255, 26,157,179,122,203,227, 51, 6,183, 28,188,153,189, 98,155, 62,137,128,192,209, 74, 20, 50, -254,229, 78,245,206, 34,236, 16, 46,125,103,230,244,233, 47, 14,121, 99,134,149, 57,247, 0, 12,153, 71, 1, 86, 11,173,134,130, -138, 9, 68, 94,118, 46,190, 92,181, 43,199, 96,166, 95,191,145,160,111,144,176,124,240, 0,149, 66,127,213,176, 37,223,204, 61, -253,245,151,243,108,165,138,179, 42,145, 16, 26,218,165,155,232,171,185,107,133,234, 10,227, 43,105,217, 80,215,199, 99,160,177, -228,155, 21,223, 14,124,123,204,176,164, 32,159, 30, 46,108,126,154,139,182,162,162,112,231,241,155,158, 85,111, 19, 20, 0,164, -102,148,160,168, 84,195,176,140,249,130,157, 9, 11, 18, 20,150,207,254,243,119,135,219,160, 94, 97,111,184, 57, 74,160,211,148, -193,221, 73,140,126, 93,154,191, 97,214, 39,207, 76, 47,108, 88,142,145,199,244, 85,149,139, 48,118, 99,175, 16,112,166, 16,194, -153, 97,204,218,222,152,215,167,233,211, 71, 53,117,112,182, 49,210, 20,171, 1, 68, 78,128,196,141,162,173,252, 32,176,242, 69, -102,202, 13,102,250,123,163, 74, 50, 51,243, 55,185, 18, 44,227, 31, 33, 60,120, 60,142,172,172,172, 55, 63,251,236,179,152,142, - 29, 59,122,184,186,186, 34, 60, 60, 28,135, 15, 31,198, 39,159,124,242,104,159,182,109,219, 2, 0, 74, 74, 74,240,205, 55,223, -228, 43,149,202, 55,235,124, 49,143,143, 79,218,190,125,123,151,214,173, 91, 27,197, 98,113, 89,181,200,202,202,202, 18,106, 52, - 26,202,104, 52, 18, 27, 27, 27, 78, 42,149,154, 71,142, 28,105,186,118,237, 90, 11,141, 70,147,245, 44, 22,172,200,200,200,123, -229,229,229, 21, 20, 69, 61,115, 10,135,106,113, 21, 18, 18,226,102, 52, 26, 89, 0,165,141, 73,225,192, 48, 12, 34, 35, 35,113, -230,226, 13, 28,191,120, 15,149, 69,105, 24,253, 74, 63,132,132,132,224,228,201,147,141,110,179,200,200, 72,156, 57, 19,131,232, - 27,247, 81,144,149,128, 49,175, 13, 69,112,112, 48,206,156, 57,195,119,232,231, 32,176,234, 52,201,133,248,162, 13,109, 47,249, -121,206,203,205, 67,133,225,243, 65, 9,173,112, 96,203,225,206,179,191,254, 41, 73, 80,145, 61, 58,206,130,217, 94,143,221, 44, - 25,136, 39,184,191,235, 78, 66,200, 27, 47,119,243,193,134, 95,172,191, 0,128, 87,251,250,227, 90, 66, 17,174,198, 21,238, 74, -104,100,206,162,154, 8,119,135, 53,107,192,174,111,102, 12,233,209,180,137, 39, 54,238,141, 1, 69,240,171, 69, 3, 45, 33,164, - 99,107, 95,172,222,242,228,140, 65, 47,223, 21,219,244, 73,167,174,168, 7, 0, 64,223, 23,172,143,183,111,233,236, 75, 72,221, -211, 8,101, 34,250,221, 1, 47,191,105,197, 20,156, 4, 87,250, 11, 68, 18, 49,116, 26, 22,121,133, 6,232,172,173,112,238,210, - 5, 93,165,150,153,126, 55,133,105,148,213, 46, 49, 29,105, 98,225,173,108,141, 78,231,101,235,220, 92, 67, 83, 32,149, 70, 17, -185,153,160,208, 36,100,227,190, 37, 28,105,105, 48,190, 32,103,186,174,219,246,203, 92,145, 72,242,170, 64, 0,202,221,209,198, -237,167, 53, 11, 97,103,103, 11,194,168, 65, 12,197, 24, 54,225,235,162,184, 20,179, 63, 0,180,104, 1,219,174,173, 69,219,132, - 52,149,123,254,182,233,243,250,206, 65, 9, 48,105,244,203,109, 68,156, 89,131,105,243,246, 96,221, 87, 47, 99,204,224,150,162, -163,231,146, 39, 1, 88,208,120, 51,229, 67, 23,225,139,239, 94, 76,162,128, 24, 2,116,185,113,228,171, 16, 52,192,243, 24, 17, - 1, 17, 91, 73,181,108, 41, 55,138,216,220,221,160,100,114, 34,112,237, 1,216,180,160,136,109, 56,190, 95, 51,183,114,195,198, -141,167, 56, 10, 95,222,207,172, 55,229, 5, 15, 30,255, 85,164, 41,149,202,254, 81, 81, 81,103, 79,158, 60,233, 28, 30,254,112, - 69,149,155, 55,111, 2,192, 35, 87, 84, 65, 65, 1, 94,127,253,245,226,188,188,188,254,168, 39,166, 87,173, 86,167, 31, 56,112, -192, 67,167,211,181,255,252,243,207, 11,154, 53,107,166, 54,155,205, 68,173, 86,131, 97, 24,226,230,230, 38,106,215,174, 29, 21, - 22, 22,166, 59,123,246,172, 75, 78, 78,142, 26, 64,102, 99, 10,255,246,219,111, 99,255,254,253, 0,128,231,145, 23, 75, 44, 22, - 35, 42, 42, 74,126,229,202, 21, 69, 21,103,163,243, 98, 17, 66,112,247,238, 93, 92, 74, 97, 33,177,113, 66,102,146, 10,103,126, - 59,132,209,239, 78, 4,195, 52, 62, 90,225,206,157, 59,216,125,230, 14, 60,228,205, 81, 97,184,139,131, 7, 15, 98,242,228,201, -207,196,217, 72,252,107,220,131, 79, 90,176,254, 80,161,128, 0, 72,164, 70,204,235,219, 65, 62, 99,100,239,230, 2, 70,171, 4, -199,113, 16, 0,112,181,163,177,121,195, 58,255, 95, 14, 28,139,253,238,219, 31,190,133,145,155, 19, 87, 8,109, 3,204, 88,243, - 86,110,189,252,234,246,133,221,133,147, 71,132, 56, 3,128, 88, 68, 99,205,174,120, 6, 52,230, 61, 75,165, 94,144, 67, 86, 41, -198,187,238,238, 14, 95,204,126,111,160,115,143,142, 65,184, 16, 27,135,111,119,196, 94,148, 56,225,103, 75,111, 59,194, 49,143, - 5,180, 63,220, 86,139,241,139,212,223, 9, 89,142,120, 74,172, 93,161,207, 60, 6,161, 68, 10,134, 49,161,168, 64,139,140,124, - 14, 50,111, 17,174,221,205,210, 13,125, 99,216,209,103,233,152, 54,214, 50,239,121, 95, 45,111,162,211,169, 25, 85,121, 49, 35, - 20,199, 10,173,173,164,249, 15, 87, 14,176, 12,191, 43,160,239,214, 70,212, 14,132, 19, 72, 5, 68, 59,123,250, 56, 27, 69,242, - 73, 4,186, 41, 65,129,192,202,123, 32,236,108, 4,226, 46,173, 69,217, 0, 96, 99,109, 45,249,102,193, 39, 14, 31,206,252,242, -146, 37,214,196, 32,119,207, 15,195, 3,157,113,225,106, 34, 46, 94,207,138,191,248,123,114, 88,207, 14,222, 8,242,119,252, 64, -226, 88,190,164, 49, 22,209,135,109,240,208, 69, 88, 61,139, 48,204, 15, 97,237, 7,125,254,180,217,131,181,194,239, 22,184,100, -127, 2,138, 18,128,128, 2,244, 10, 48, 57,219, 33,240,159, 74,126, 61,244,149,110,227,134,141, 11, 19, 51,121,171, 21, 15, 30, -245,161,162,162,226,110, 82, 82, 82,191, 54,109,218,108,157, 54,109,154,221, 27,111,188,225,253,246,219,111,211, 0, 80, 80, 80, -192,173, 94,189, 90,249,221,119,223, 85, 20, 23, 23,143, 55,155,205,247, 44,185,195,243,242,242,174,108,222,188,185, 40, 38, 38, - 38,236,133, 23, 94,176,110,223,190, 61,231,238,238, 46,214,106,181,108, 78, 78,142, 46, 54, 54,150, 77, 73, 73,113, 40, 47, 47, - 79, 1,144,138, 70,184,239,189,189,189, 65,211,244, 2, 31, 31,159,185, 10,133,162,213,243,136,193, 10, 12, 12,244, 6,144, 34, -151,203, 3, 27,234, 30,252,195,128, 45, 20,162,172,172, 12,234,220, 84,104, 75,138, 17, 44,208,162,173,179, 43,236,236,236,158, - 73, 12, 85, 84, 84, 64,104, 40, 64,218,221, 44,148,231,103, 34,180,105, 36,108,108,108, 96, 48, 24,254, 63,186, 15,245,111,185, - 15,158,234, 34, 12,109,130,201, 86,192,234,113, 35,253,197,254, 77,155,192, 88,116, 19,183, 83, 43,241,249,166, 14, 9, 2,177, -157, 97,202,216,190,237,122,246,113, 67,247, 30, 29,168,102, 77, 29, 63, 88,178,100,237,251,161,146,226, 79, 18,114,176,198,146, - 19, 39,164, 33,157,227, 10, 55,158,191,174,152,212,196, 77, 7, 2,130,243, 55,242,112, 47,181,108, 99, 82, 6,210, 27, 82,137, -208,230,232, 35,164,232, 61,132, 37, 50, 7, 59, 27,117,104, 72, 19,215, 62, 93, 90,211,253,123,182,135, 88, 8,196, 92,189,131, -233, 95,253,250, 59, 39, 33, 3, 45,158,241, 69,184, 63, 8,167,135, 51, 6,153,199,102, 12, 18, 66, 8, 56, 6,132,212, 29,214, - 37,160,169,124, 77,193, 13, 79,137, 93, 40, 76, 37,231, 80, 80, 80,137,248, 52, 19, 42,225,131,178,220, 92, 16,194,102,207,155, -247, 75,163,239, 16, 87, 87, 87,119,255, 22, 65,205,191,219,176, 15, 38, 67, 5,210, 18,182,160, 82,149,143,175, 22,255,214, 92, - 46,119,233,174, 80, 40, 46, 88,222,187,169,160,179,231,118,185,131, 0, 2,161, 20, 71,215,239, 69,177,208, 10,174, 14, 98,112, -250, 66,188,251,206,104,135,168,129,163, 29, 0, 32, 59,245, 14,124,157, 45,211,213,166,114, 12,127,117,124,176, 35, 88, 45,126, - 62,120, 71, 79, 83,232,255,243,111,241,169, 61,219, 57,202, 94,237,219,212,105,193,186,242, 87, 0,236,106,148,190,226,216,199, -102, 17, 54,102,246,224, 62,128, 13, 33, 72,221,117,166,200,118,100, 84,132,149, 88, 72, 81, 68,175, 0, 71,137,169, 53, 63,108, - 86, 75, 40,172,231,135, 78, 30, 60, 44,131, 78,167,187,169,211,233, 90,125,250,233,167,175,127,246,217,103,221,108,108,108,252, - 1, 64,163,209,164,155,205,230,139, 85,247, 58,219,144,219, 28, 64, 74,106,106,106,122,106,106,170,199,207, 63,255,236, 8, 64, - 86,245, 63, 61,128,114, 0, 5, 13,228,124, 12,213, 98,202,219,219,123,238,243,186, 14,213, 98, 74, 46,151, 7, 54,230,120,129, - 64,192,210,244,195,149,125,164, 82, 41, 46, 93,186,132, 1, 93,186,226,206,153, 44,132,120,248,160,231,232,113, 56,120,254, 60, - 4, 2, 65,245,254, 13, 26, 71,132, 66, 33, 98, 98, 98, 48, 98, 80, 15, 28, 60,120, 16, 1,145,109, 48,117,234, 84,156, 56,113, - 2, 66, 33,191,154,222,159, 34,176, 64,176,224,244,158,175,197,224,204,216,183,115, 41, 78, 95,215, 26,239, 43, 48, 39, 56, 23, -171,247, 65,205, 21, 22,239,159,116, 52, 58,109,217, 91,227, 7, 89,247,234,222, 23,189,186,245, 20,134,181,233,254, 5,240,152, -192, 10, 71, 29,185, 50, 88, 51, 22,174,223,159, 52,113,207,177,100, 10,140, 26,163, 94,110, 79, 88, 51, 22,214, 83,230, 63,112, - 58, 88,219,238,137,185, 20,235, 4,182, 18,249, 25,231,101,158, 30,254, 0, 49,227,193,131,100,124,191,249, 32, 23, 29,123,127, -187, 81,128,105,105,137,208, 88,202,249, 80, 81, 49,112,176,149,252, 97,198,160,163,149, 40,164,239, 11,214,199, 9, 33,196,206, - 90, 20, 66,106,183, 96, 61,198,169, 55,115,235,183,111,219,176,124,194,132,183,109, 74, 12, 10, 36,231,196, 67, 47,144, 67, 96, -221, 28,241, 55, 78,234,116,102,110,131, 5,237,245,212,235, 89, 92, 92, 92,120,243, 70, 41,246,108, 93, 12,179,217,128,194,188, -135, 26, 53,175, 64, 5,123,123,121,172, 66,161,176,152,211,196,112, 21,195,135,189, 43,182,146,193,106,244,171, 3, 37,169, 74, - 3, 34,130,237, 30,118, 11, 83, 49,146,162, 47,161,167,251,195, 96,200,212, 36, 1,124, 95,240,182,168,156,118,118,226,105, 3, -186,202,145,158,149,143, 75, 55, 21,219,210,149, 80,178, 36,111, 91,106,118,249,164, 33, 61,125,177,106,123,194, 84,192,188,171, - 33,117, 15,243, 67, 24, 7,116, 1, 49,131, 48,122, 16,160, 75,152, 31,194, 44,156, 57,248, 7, 78, 33,141, 55, 86,238,201,252, -124, 95,116,209,144, 25,111,119,181,239,252,226, 0, 9, 56, 51, 81,107, 13,230,196, 12,168,158,165,141,158, 1, 60, 39,207,249, - 79,229,100, 1,108, 55,155,205,219,203,203,203,159, 39,167, 18,127,204,203,244, 76,117,175,233, 14, 84, 42,149, 2,111,111,111, -214,130, 32,247,250, 56,175,214, 20, 90, 85,214,171,250,172, 88, 79,114, 42, 59,118,236,232, 60,120,240, 96, 48, 12,131,148,148, - 20,100,101,101, 97,240, 91,227,225,228,228,132,171, 9, 9, 72, 73, 73,193,220,185,115,193, 48, 12,174, 93,187,150, 91, 31,167, - 72, 36, 50,181,105,211, 70, 60,116,232, 80, 48, 12,131,180,180, 52,100,102,102, 98,234,212,169,112,112,112, 64, 66, 66, 2,210, -210,210, 48,119,238, 92, 24, 12, 6,164,167,167,155,254,162,190,244, 31, 17, 88, 20, 88,112,102, 84, 92,159,135,159,142,192,100, - 98, 16,146,144,139,140,234,192,147,132, 92,172, 21,144,187,135,239,198, 39,165,223,188,218, 75, 2,213, 61, 52,244,205,225, 65, - 46,242,236,172,213,106, 48,106,123, 20, 29, 71,134, 66, 93,249, 32, 23,121,141,176, 94, 80, 96,255,143,189,243, 14,143,162,106, -219,248, 61, 51, 91,179,233,125,119,211, 12, 33, 9, 9, 53, 33,180, 36, 72,135,208, 68, 4, 4, 68, 16, 84,148, 34, 42,168,116, - 1, 1, 1, 17, 68,170,128,136, 40, 34, 32, 85,164,133,222, 33, 36, 4, 8, 33,161,132,132,148, 77,239, 91,103,119,102,190, 63, -146,205, 27, 48,101, 19,248,240,149,119,126,215,181,215,102,119, 38,247,158,153, 51, 51,231, 62,207,105, 26,160,228, 58,246, 31, - 58, 3,137,244, 6, 98,226,238, 50,151, 98,147,119,146, 28, 22, 38,166,226, 94,195, 53, 57,216,180, 93,133,119, 94,123, 80, 49, - 98,144, 51,130, 99, 77,176,143,216,129,177,175,133,123,183, 11,114,240, 6,107, 4,199, 25,225,216,227, 52, 48, 71, 90,167,222, -181,219,250,205,157, 67,164, 67,202, 74,243, 59,244,234,214,213,218, 53,240, 77,148,220,187,131,132,184,104,237,245, 91,201,151, -175,221,214,111,126,150,140,244,240,240,120,181, 71,143,102, 24,254,206, 76,208,250, 98, 60, 76,248, 9,101,165,217, 56,127,209, - 6,119, 31,151,118, 2, 96,113, 4,235,114,130,169, 5, 80,132,136,150,194,199,118, 98,131,124,244,208, 1,144, 8,116, 96,141, -101, 32,232,124, 60, 40,164, 75,134,204,203, 96, 0, 64, 38, 37, 4,214,130, 18, 59,139, 34,141,126,206, 1, 50,145, 17,191, 28, - 72, 0, 75, 84, 44,179,196, 18,216,240,203,159, 15, 62, 92, 56, 57, 20,205,253, 28,219,220,184,159,107,110,131,183,180, 74, 59, -233,250,193, 5, 65,186,132,185,224, 88, 35, 46, 44,119, 12,234,252,121,209, 36, 52,114, 89,156,219, 15,145, 9,224, 67, 48,154, -141, 31, 47, 62, 58, 55,172,229,157,200,105, 31, 14,178, 3,193, 47,140,206,195,195,243,226,209,104, 52, 31, 76,159, 62,125, 35, - 69, 81,174, 0, 8,142,227,160,215,235, 5, 63,254,248,163,208,100, 50,145, 20, 69, 49, 82,169,212, 20, 27, 27,107,100, 89, 54, -143,166,233, 15,234,211, 52, 24, 12, 15,214,174, 93,219,212,104, 52, 86,141, 56,212,235,245,248,245,215, 95,161,215,235, 33,145, - 72, 96, 99, 99,131,135, 15, 31,130, 32, 8,154, 97,152, 7,124, 78, 60, 79,131, 5, 44,136,120, 99,222, 60,112, 32, 64, 96,254, -157,140,191, 79,198,116, 43, 19, 89,205, 61,233, 79, 91,132,116,153, 87,105,202, 22, 52, 52, 1, 58,134, 25,218,174,109,224,239, - 0,160,103,153,183, 27,115, 16,165, 58,237,155, 33,237, 59,237,100, 57, 78, 96, 98,184, 31, 73, 18,123,116, 64,226,195, 71,245, -143,156,171,141, 44, 85,113,108,223, 72,123,206,188, 4, 78, 85,179, 96,229,116, 12, 28,199,113, 85,205,130,115,164,200, 47,208, -215,219,155,250,252, 13, 93,239,246, 45, 37,239, 31, 59, 27, 55,158, 97, 57, 57, 69, 18,217, 58, 35,187,233, 89,205, 85,101,237, -232,236,137, 19,153,199,111, 70,186,247,118,169,156,102, 53,191, 24,200, 47,193,241,204,204,242,179,141,209, 44,210, 26, 7,205, - 90,126,224,160, 88, 64, 9, 0, 14, 44, 91,113,188, 58,154, 41,172, 48, 97, 64, 43,127, 40, 63,255,209,244, 59, 69, 17,105,245, -233, 93,189,165,250,110,248,231, 39, 62, 75,184, 95,244, 99,106,102, 69,205, 39, 53, 19,183,119, 29,123, 52,247, 65,122,217,103, -183,239, 23,125,139, 6,246,155, 32,128,117,237, 94,155,247,183,239,158,245,124,222,125,140,120, 0,131,193,101,244, 26, 62, 97, -205, 52,130, 0,191, 76, 4, 15,207,255, 16,230, 40, 22, 73,146, 95, 61, 47, 77,115, 20, 11,192,253, 6,164,227, 42,128, 86,207, -243,216,226,226,226, 10, 0, 20,240,185,252,239,166, 37,175, 9,112, 28, 71, 62,203,171,161,233,244,247,247,231, 26, 96, 84,248, - 60,226, 53,121, 77, 94,147,127, 38, 63,227, 51,153,227, 56,226, 89, 94,124, 30,189,124,240,205, 30, 47, 0,130, 32,216, 23,249, -123,247,239,223, 39,248,179,206,195,195,195,243,226,158,201,207,123,201, 30,158,127, 63, 36,127, 10,120,120,120,120,120,120,120, -120,158,179,233, 70,237, 97,190,134,140, 14,104, 76,168,240, 54,175,201,107,242,154,188, 38,175,201,107,242,154,255,115,154,245, -105,243,163, 19,255,159,140, 23,175,201,107,242,154,188, 38,175,201,107,242,154,255,123,154, 47, 21,124, 19, 33, 15, 15, 15, 15, - 15, 15, 15, 15,111,176,120,120,120,120,120,120,120,120,120,131,197,195,195,195,195,195,195,195,195, 27, 44, 30, 30, 30, 30, 30, - 30, 30, 30, 30,222, 96,241,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,188,236,152,151, 86,233,194,159, 10, - 30, 30, 30, 30, 30, 30, 30,222,139, 60,191,131,170,254,206,195,195,195,195,195,195,195,195,123, 17,222, 53,242,240,240,240,240, -240,240,240, 94,228,191,211, 53,242,240,240,240,240,240,240,240,240, 94,228, 25,225, 71, 17,242,240,240,240,240,240,240,240,240, -240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240, 60, 71,248,149,198,121, 77, 94,147,215,228, 53,121, 77, - 94,147,215,252,159,131,239,131,197,195,195,195,195,195,195,195,195, 27, 44, 30, 30, 30, 30, 30, 30, 30, 30,222, 96,241,240,240, -240,240,240,240,240,240, 6,139,135,135,135,135,135,135,135,135,135, 55, 88, 60, 60, 60, 60, 60, 60, 60, 60,255, 53, 16,168,125, - 36,192,237, 6,232, 52,102, 52,193,109, 94,147,215,228, 53,121, 77, 94,147,215,228, 53,255,231, 52,235,211,190, 13,158,255, 23, -227,197,107,242,154,188, 38,175,201,107,242,154,188,230,255,158,230, 75, 5,223, 68,200,195,195,195,195,195,195,195,243,156, 17, -252,195,230,206,108,240, 88,252,103, 21,237,255, 54, 77, 30, 30,158,231, 64,231, 54,152, 46, 22, 9,199,233,104,227,178,139,241, -248,169, 75, 40,156, 77, 44,150, 74, 69,130,206,122,131,189, 50,127,110, 0, 0, 32, 0, 73, 68, 65, 84,233,155, 11, 55,241, 99, - 3, 37,137,167, 62,243,247,250, 51,210,171, 87,175,241, 0,230,113, 28,199,177, 44, 59,251,212,169, 83,219,158,199,179, 94, 46, -151,143, 0, 32, 3, 0,146, 36, 75,178,178,178,118, 91,242,143, 93,186,116, 17,148,151,151,167, 2,240,168,252,234, 94, 92, 92, - 92, 96,125,219,120, 26, 78, 76, 76, 12,231,227,227,131, 86,173, 90, 37,101,103,103,175, 1,176,129, 63, 43,255, 69, 6, 43,208, - 85,218,241, 21, 47,215,254, 71, 99, 31,207,174,239,134,243,240,240, 88,234,234,234, 58, 65,163,209,232, 0,112, 36, 73,114, 4, - 65,192,252, 2, 0,134, 97,242,146,146,146, 44, 13, 67, 62, 55,205,128,128,128,235, 36, 73,122,154,255, 7, 0,234,251,155,101, -217,140,196,196,196,176,250, 18, 41,151,203,251,144, 36, 57,163,190,253, 88,150, 93,154,157,157,125,172,174,125, 90,182,108, 25, -103,109,109,237, 78,146, 36, 81,219, 62, 28,247,159, 50,199,100, 50,113, 26,141, 38,231,206,157, 59,161, 13,205, 91,165, 82, 57, -155,227,184, 80, 0, 63,171, 84,170,195, 0,152,103,185, 86,148, 74,229, 16,142,227,230, 84,158,195, 69, 89, 89, 89,123, 26,242, -255,254,254,254,215, 69, 34,145, 39, 69, 81,196,211,121, 82,211,103,150,101, 57,131,193,144,145,156,156, 28,198,223,246, 47,158, - 78,109,208,177,169,175,226,203,201,111,117,195,103, 75,119, 78,142,104,105,202, 23,137, 69, 27,134, 68, 54,117,104,238,231,128, -175, 54, 94,158, 2,176, 13, 49, 88,132,151,151, 87,136,187,187,187,175, 86,171, 53, 95,139, 28, 69, 81, 79,236, 68,211, 52,157, -148,148,116,152,207, 1, 11, 11, 4,129,224,203, 63,255,252, 83,193,178, 44,250,245,235, 55, 31,192,243, 48, 88,132, 68, 34,177, -122,244,232, 17,140, 70, 35,233,227,227, 99,211,192, 50,202, 37, 54, 54, 22, 52, 77, 27, 58,117,234,228, 83,125,155, 88, 44,118, -185,116,233, 18, 0, 24,218,182,109,235,211,216, 4, 6, 7, 7, 91, 91, 91, 89, 77,165, 8,162, 39,195,113, 65, 0, 64, 17,196, - 93,134,227, 78,168,181,218,149,137,137,137,234,151, 61,239,163,163,163, 49,126,252,120,220,186,117,171,217,225,195,135,215,207, -158, 61,123,146, 74,165,234, 6, 32,143,191, 51,254, 97,131,213, 84,110,221,204,213,209,225,208,178,197, 11,112,180,247, 59,117, - 25, 44, 82,161, 80, 44,235,220,185,243,184,237,219,183, 91,239,219,183,207,218,215,215, 23, 34,145, 8, 20, 69,129,162, 40,144, - 36, 9,138,162, 48,104,208, 32,194, 82,115, 85, 93,243,228,201,147,214,129,129,129, 85,133, 44,199,113, 85, 38,171, 95,191,126, -245,106,146, 36,233, 25, 23, 23,231, 38,149, 74,171,254,159,101,217, 39, 94, 28,199, 85,189, 24,134, 65,231,206,157, 45, 75, 40, - 73,206, 72, 76, 76,124, 85,173, 86, 63,161, 97,254, 13,243,223,175,190,250, 42, 0, 28,171, 71, 75,121,241,252, 73, 55,130, 78, - 1, 76,133,224, 40, 39, 64,220, 4, 32, 37, 53,238, 95, 88, 88,136,110,221,186, 81,141,201, 95, 87, 87,215,209,103,206,156,241, -127,244,232,209,235, 95,127,253,117,193,229,203,151,215, 3,216,162, 82,169,210, 27,163,199,113,220,162,148,148,148, 0,142,227, -224,231,231,183, 16, 64,131, 12, 22, 69, 81,158,209,209,209,110, 98,177,184, 42,159,107,123,103, 24, 6, 52, 77, 35, 42, 42,202, -196,223,242,255,208,131,134,192,194,225,175,245,130,214, 72,194,104, 52,185, 42, 92,109,127,157, 50,186,139, 16,156, 1,219, 14, -198,193,104, 98,127,106,168,185,234,219,183,175,207,134, 13, 27, 4,137,137,137,130,224,224, 96, 48, 12, 83,245, 98, 89,182, 65, -247, 37, 79,149,193, 34, 72,146, 68,102,102, 38,108,108,108,236,187,118,237,154,197, 48,204,172,243,231,207,111,251,127,248,185, - 39, 34, 91, 4, 65,168, 85, 42,213,142, 23,125,204,109,218,180,233, 44, 21, 10,119, 46,152,247,169, 91, 80,139,150,164,179,171, - 51, 30, 60,200,128, 88,192, 69, 60, 72,186,215, 97,225,146,239, 63,108,211,166,205,240,248,248,248,243, 47, 91,126,123, 15,222, -188,158, 53,209, 19, 0, 96, 99, 12, 0,108, 66, 89, 89, 25,222,123,239, 61, 28, 56,112, 32,184, 99,199,142, 75, 25,134, 25,199, -223, 25,255,160,193,242, 83, 74, 61,108, 68,210,227, 27,127, 88, 67, 24,203,114, 28,235,185,161, 22,117,238,220,249,237,237,219, -183, 59, 18, 4,129,147, 31,189, 11, 7, 90, 7,229,151,223,192,209,197, 21,134, 25,227, 97,203,152,208,234, 84,124, 67,110,210, - 39, 52,147,146,146, 80, 88, 88, 8, 87, 87, 87,200,100, 50, 72, 36, 18,136, 68, 34,136,197, 98,203,158,222, 4, 1,169, 84,138, -232,232,104, 8, 4,130,170, 23, 69, 81, 53,126,118,119,119,183,248, 92,177, 44,187, 52, 40, 40,168,117,114,114,178, 93, 81, 81, - 17, 58,117,234, 84, 74, 16,196,205,106,198,163,245,205,155, 55,237, 44, 46,105,232, 20,148, 63,254, 1, 92,209, 30,192,225, 13, - 48,118,195,161, 67,147, 39, 10, 25,179, 41,100,152,198, 7,157,242,242,242,232,115,231,206, 33, 36, 36, 4, 59,119,238,116, 46, - 42, 42,250,242,231,159,127,158,179,106,213,170,217, 42,149,106,105, 35, 36,157, 0, 32, 41, 41, 9, 0, 28, 27,147, 38,177, 88, -140, 43, 87,174,128,227,184, 42, 83, 78,146, 36, 72,146,196,159,247, 93,160, 54,144,208,228,220,198,148,129, 62,240,245,245,253, - 91, 84,139,231,197, 16,217, 26,253,218,182,110,217,209,199,203, 27,103, 46, 93,131, 72, 44,116,152, 56,102, 0,108,109, 4, 88, -190,229, 47,246,113, 70,225,228, 11, 55, 45,142,148, 16, 10,133,162,117,239,222,189,189, 54,108,216, 32, 2,128,219,183,111, 67, -165, 82,193,205,205, 13, 82,169, 20, 66,161, 16, 20, 69, 65, 36, 18,241, 39,191, 1,132,134,134,182,104,209,162,133, 53,195, 48, -208,104, 52,248,225,135, 31,236,165, 82,169,253,128, 1, 3, 44,142,100,213,210,108, 23,164,215,235,181, 10,133, 66, 6,128, 37, - 73,178,252,233,200, 22, 0, 40, 20, 10,235, 26, 36, 77, 0,242,219,182,109,235, 1, 64, 12,224, 94,245,109, 6,131,161,182,109, -150, 30,115, 68,104,235,102,135, 23, 46,154,103,157,157,115, 15,246,118,217, 96,141,185, 88,191,126, 61,172,172,236, 48,127,254, - 44,193,254,176,182,242, 79, 62,157,121, 72, 32, 16, 68, 93,191,126,253,242,203,148,231,172,137,158,208, 38, 44,188,234,243,182, -232,213,208,219,135, 34,115,254,124,172, 90,181, 10, 1, 1, 1,237,239,222,189,203,223, 28,255,148,193,106,225,101,231,192,177, -220,241, 31, 55,172, 20,131, 86, 59, 38,197, 92,172,190,185,250, 80, 75, 2, 0,233,238,238, 62,113,199,142, 29,118,230,194, 46, -144, 96,224, 0, 26,175, 52,111, 14,153,189, 3,114, 76, 52, 56, 35, 13,177, 72, 84, 91,129, 88,175, 38, 73,146, 16, 10,133, 79, -188,196, 98, 49,170, 71, 59,234,208,172, 94,155, 3, 69, 81,136,142,142,134,209,104,196,208,161, 67,107, 52, 91,181, 80,163,102, -118,118,246, 49,165, 82,121,147,227,184, 87, 89,150, 5, 65, 16, 55,179,178,178,186,152,183,203,229,242, 62,109,218,180,153,193, -178,236,210,250, 52, 57,142, 3, 76, 5,224, 10,119,192,182, 83, 62, 74, 47,187,128,176,238, 9, 6, 62,184,125, 63, 27, 39,175, -167, 34,191,176, 28,109, 3,221,208,187,147, 31, 88,150,181, 56,157,213, 81, 40, 20, 1,193,193,193, 65, 70,163, 17,231,206,157, - 3,195, 48,104,213,170, 21,198,142, 29, 75,174, 94,189,122, 44,128,165, 13,213, 4, 16, 31, 27, 27,219, 51, 59, 59, 27, 0,110, - 89,176,255,237,154,140,240, 47,191,252, 2,157, 78,247,183,157, 29,187,124,141,207,222,240,193,216,143,182,225,155,228,221, 88, -183,110,221, 19,205,165, 13, 72,103, 67,225, 53,255,150, 81, 24, 59,108,240,235,160, 68,214, 72,122,144,129, 46, 29, 67,225,230, -230,134,155,137, 15,240, 56,179, 48,135, 32,240, 78,159,112,241, 82,173,214, 48,231,124, 60,182,212,167,169, 80, 40,154,108,218, -180, 73, 88,253, 59,145, 72, 84, 21, 5,175, 30, 13,127,186,201,144,207,163,154, 53, 67, 67, 67, 91,244,234,213,235,252,188,121, -243,108, 31, 63,126,140,139, 23, 47,194,199,199, 7, 90,173,182,166,251,166, 46,205,154,154,237,216,236,236,236,223, 26,147,206, -179,103,207,154, 0,120,214,180, 67, 93,219, 44, 57,246,150, 45, 91,202, 68, 2,193,174,175, 22,206,181,142,141, 61,140,240,136, - 40, 88,217,250,195, 68,103,160,160,176, 28, 69,247,179,176,100,201, 74,204,153, 51, 19, 95, 47, 94,104, 59, 98,212,216,157, 29, - 59,118, 12,184,114,229,138,238,101,201,119, 82, 32,218, 16,127,253,210, 4, 0, 40, 77,220,139,143, 71,134,163,172,236, 62, 62, -252,112, 46, 50, 51, 51,113,239,222,189,216, 23,156,206,151,214, 96,113,248,123,167,209, 58,241,240,128,148, 49, 26, 15,173,255, -110,169,189,173,141,204,245,250,241,253, 72, 75,203,174,243,127, 52, 26,141,225,192,129, 3, 56, 62,105, 28, 2, 8, 19, 28,191, - 92, 14, 55,165, 18, 37,227, 6,161,220, 72,163,233,145,107,144,216,216, 64,108,109, 99,113,196, 65,163,209, 24, 78,159, 62,141, -132,132, 4, 8, 4, 2,216,216,216,192,218,218, 26, 18,137,164,202, 88,153, 31,192,150,106,114, 28, 7,129, 64,128,219,183,111, - 35, 45, 45, 13, 14, 14, 14,184,120,241, 34,122,246,236,249,132,185,162, 40,234,137, 62, 94,150, 98,110, 90,172,201,128,161,158, -166,193, 39, 16,186, 0, 78,111,163,236,138, 18,112, 28, 5, 35,103, 15,150, 99,113,227,126, 1, 62, 24,213, 31, 0, 48,113,206, - 15,232,217,193,183,170, 9,178, 33, 40,149,202, 15, 90,181,106,181,114,194,132, 9,164,181,181, 53,244,122, 61,244,122, 61,146, -146,146,224,236,236, 12,153, 76,214,168, 48, 1,199,113,143,148, 74, 37,164, 82, 41, 56,142,123,212, 24, 13,130, 32,176,107,215, -174, 26,183,189,179,242, 14, 4, 21,221,179,176, 97,195, 6,152, 76, 38,112, 28,199,135,176,254, 9, 56,120,184,203, 61, 65,114, - 70,100,229,228, 99, 80,191,222, 16,136,108,144,154,145,143, 54,205,253, 20,111, 13,140, 80, 80,132, 9, 95, 44,219, 49, 17, 96, -183, 88,112,191, 51,137,137,137,194,248,248,120, 80, 20, 5, 59, 59, 59,200,100, 50,136, 68, 34, 72, 36,146, 42, 99,197, 71,176, -234,166,119,239,222,147, 89,150,157,197,178,108, 81,187,118,237,148, 11, 22, 44,176,207,200,200,192,237,219,183,177, 99,199,142, -124,142,227, 76,149,157,221,231, 63,235,111, 89, 16,217, 2, 65, 16, 13,238,231, 20, 28, 28, 44, 50,209,197, 31,219, 91, 49,175, - 9, 72, 59, 31, 83,105,249,163, 82, 35,121, 32, 57, 35,107,117,101,244,171, 86, 36, 66,225,228, 85,203,103,185,187, 56,211,232, -211,231, 53, 60,124, 84,132,153, 51,135,162,180, 84,135,237,191,172, 0, 32, 6,109,162, 16,218, 62, 10, 10,133, 23, 34,195, 35, - 21,231, 46,156,155, 8, 96,197,203,114, 13, 60,222,247,254, 68, 0, 11,189,189,189,207,254,176,100,137,127,143, 30, 61, 0, 0, - 39, 79,158,196, 79, 35, 71, 98, 62, 48,218, 22, 80,125, 12,204,124,161, 79,140, 6,122,145,255,118,131,101, 62,160,134, 28, 24, - 33, 53,217,238, 94, 48,107,178,175,119, 19, 63,249,213,191,118, 33, 37, 37, 19, 57, 57, 69,117,157, 52,150, 32, 8,182, 73,147, - 38,176, 51,234, 96,207, 25,224,166, 80,194,214,201, 25, 69,198,202,200,149,181, 53,196,214, 54,150, 62, 28,171, 52,155, 55,111, -142,156,156, 28,136, 68, 34,216,216,216,192,214,214,182,202, 96,153,205,149,165, 15, 92,130, 32,192,178, 44, 4, 2, 1,110,222, -188,137,200,200, 72,120,121,121, 97,231,206,157,232,211,167,207,223,162, 88,141,105,122, 50,247,185,170, 30,185, 34, 73,114,134, - 37,157,219,159, 64,220, 20, 38,219, 55, 65,202,122,128,230,236,160,231, 20,149, 77,130, 28,254,186,150,131,228,180,252, 39,154, - 11, 45, 55,207, 30, 74,169, 84,186,109,230,204,153,221,195,194,194, 64,211, 52, 0, 64, 38,147, 65,175,215, 67, 40, 20,130,166, -105,104,181,218,204,127,226,194, 53,159,243,227,199,143,131, 32,136, 42,163,107,110, 42, 84,171,210, 49,118,202,118,136, 5,192, -205,155, 55, 17, 20, 20,196,151,168,255, 16, 86, 82,169,179, 88,106, 15,214,164,131, 64, 40,132,183,215, 43, 96, 25, 61,138, 74, - 53,120,231,205,129,136,187,117, 7,135, 79, 95, 53, 25,141,236,106, 75, 53, 3, 3, 3,145,155,155, 11,138,162, 96,107,107, 11, -107,107,107, 52,107,214, 12,233,233,233, 79, 68,177,120,106,135, 36,201,217,135, 15, 31,118,167, 40, 74,110, 50,153,144,158,158, -142,155, 55,111, 98,205,154, 53, 57,106,181,186,107, 92, 92, 92,114, 35,100,107,107,182,171,169,179,122, 99, 34, 91,213, 43,127, -254,118, 18,195,137,229,203, 38,121,182,106,211,142,144, 82, 54, 37,154, 7,185,145,215,174, 94,142,152,179,229,143,201,105,197, -154, 30,185,185,185,181, 86,222, 40,146,236,217,172, 69, 75,146,101, 51, 64,137,130,240,221,202,207, 80, 88,164, 70,121,153, 22, -128, 24, 6,163, 0,122, 61,129,110,221,123, 96,231,174, 3,104, 23,214,142,162, 72,178,247,203,100,176, 0,128,162,168,165,251, -247,239,247,151, 74,165, 88,188,120, 49,108,109,109,113,101,225, 66,252, 36, 18,193, 10,192, 6,154,158,129, 23,103,176, 26,227, - 69,254, 21, 17,172, 6,225,233,233,185,162, 99, 68,135, 87,155, 52,111, 39,189,122,116, 47,238,223, 75, 67,126,126, 9, 56, 64, - 91,215,201, 35, 8,130, 19, 10,133,112,251,226, 43,120,183,106, 5,205,248, 33, 40, 50,210,240,251,235, 10, 36, 54, 54,184,219, - 43, 20,156,193,128,206,137, 57,150, 26, 23,142, 32, 8, 14, 0, 92, 92, 92, 32, 18,137, 32,149, 74, 33,149, 74,171,250, 94, 85, -127, 89,106,134, 88,150, 69,105,105, 41, 30, 61,122,132,241,227,199, 67, 38,147,129, 32, 8,228,228,228,192,199,199, 7, 20, 69, - 33, 51, 51, 19,167, 78,157, 66,147, 38, 77, 32, 22,139, 27,116, 49, 84,235,212,222, 90,169, 84,158,229, 56,174,245,245,235,215, -237,194,194,194,208,160, 8, 22, 33,130, 30, 62, 96,224, 9,150,251, 79, 95, 43,163,233,201,202,155,217,100, 89,130,187,187,123, -112, 80, 80,208,229, 53,107, 86,219,186,185,185,131,101, 25, 24,141, 70,148,148,148, 66,163,209,192,219,219, 27,214,214,214,220, -242,229,203, 9,134, 97,254,177,161,188,102, 67,101,142, 32,154,251, 95,145, 36,137, 41,175,121,163,168,200, 22, 20, 85,241,217, -210, 99,231,121,254, 88, 91,219, 58, 9, 68,214, 96, 73, 1,236,237, 29, 33, 16, 91,131, 53, 9,192,176,128,173,189, 11, 46,197, - 37,225,242,173,178, 15,114, 11, 96,201,208,125, 78, 32, 16,112, 20, 69,193,205,205,173,202, 76, 9,133, 66,243,181,139,210,210, - 82, 80, 20, 85,245, 29, 79,221, 21,201,212,212, 84,168,213,106, 92,185,114, 5,187,118,237,202,123,218, 92,245,234,213,107,130, - 76, 38,155,163,211,233, 22, 31, 59,118,108,125, 93,154,141,104,182,107, 76,228, 43, 48, 52, 52, 84, 40,228,138, 14, 31,217,187, -210,211,142,137, 35,144,250, 62,144, 92,154,104,115,205, 45,188, 71,251, 1, 68,243,175, 62,241, 25, 52,119,229,145,220, 92, 4, -163,150, 17,207, 28,208, 82,106, 37, 5, 56, 2, 23, 47, 28,173,104, 22, 44, 44, 67,185, 90, 7, 61, 77, 65,111, 32,160,163, 9, -244,232, 25,133, 77, 91,126,135, 42,183, 8, 28,208,234,101,187, 14, 2, 2, 2,218,122,120,120,224,147, 79, 62,129,110,199, 14, -148, 3, 24, 0, 96,127,101,165,218, 22,152,198,223, 45, 47,208, 96,121,120,120, 76,110,221,186,245,123,155,127,222,110,179,108, -238, 23,165, 69,137,183, 40,131,150,182,214, 27,141,134, 7,170,130,213,245,152,161,138, 90,167,131, 35,100,118,246,208, 63, 21, -185,226, 12, 6,176,180, 1, 34,203, 31,142, 28, 65, 16,224, 56, 14, 86, 86, 86, 16,139,197, 53, 70,174, 26, 18,193, 2,128,226, -226, 98,236,218,181, 11,237,219,183,135, 76, 38, 3, 69, 81,104,221,186, 53, 18, 19, 19,225,231,231, 7, 0,216,191,127, 63,222, -120,227, 13,220,191,127, 31,193,193,193, 54, 49, 49, 49, 13, 50, 88, 12,195,224,248,241,227,118, 28,199,189,202,113, 28,242,242, - 26, 55, 26,150, 97, 24,168,213,106, 28, 63,126, 28, 89, 89, 89,144,203,229, 40, 41,177,133,157,146,173, 50,139,230,151,133, 15, -222, 47,222,125,247, 93, 91, 27, 27, 27, 48,140, 9, 66,161,176,202,184, 10,133, 34, 36, 37, 37, 97,228,200,145, 37,169,169,169, -159, 55,114,212, 15, 33, 16, 16,238, 37, 37, 69, 40, 43, 45, 6, 69,193, 11, 0,133, 70, 76,253, 64,146,100,213,187,249, 69, 16, - 4, 68, 66, 10,114,119,215,170,142,239,149,209, 59,190,137,240, 5,250, 42, 0,195, 1,188, 93, 84,102, 16, 20,150,105, 1,147, - 1,143, 82, 31,161, 88, 77,131, 51, 25,241, 56, 67, 5,181,158, 69, 65, 97, 25,218,180,237,179,230,244,233,211,179,105,154,158, - 5,224,144, 37,215,124, 76, 76, 12,206,157, 59,135, 11, 23, 46,192,220, 81, 26, 0,236,236,236, 16, 29, 29,141,110,221,186,241, -185, 80, 7, 52, 77, 47,238,221,187,247, 44,185, 92, 46, 93,177, 98,133,189,183,183, 55, 8,130, 40,125, 58,114, 21, 22, 22, 54, -123,198,140, 25,138,161, 67,135, 78, 1,176,190,145, 63, 87, 87,103,245, 58,203,168,154,166, 98,200,205,205,158,176,113,219, 88, - 87,107,225,163, 44,164,126, 87,105,190, 40, 64, 83, 10,156,222, 14,209,171, 95,165,142,234, 62,209, 45,171,108,245,187,153,217, -153,155,106,121,208,177, 73,201,105, 88,183,110, 21,230,204,153,136, 29,219, 87,129,229, 68, 40, 83, 27,225,174, 12,129,193,200, -130, 32,133,232, 20,222, 25, 23, 46, 93, 5, 24, 26, 83,198, 95,126,233,230, 90,187,119,239,222,181,180,180,180,160,185,115,231, - 98,171,135, 7,108,109,109, 49,117,222,188,203, 12,195,132,243,119,201,243, 49, 88, 22,135,228, 60, 60, 60, 6, 43, 20,138,101, -219,183,111,183,202,202,202,130, 50,160,133,221,159,127,236,210,187,217,136,180,170,194,162, 49,241, 89,234,122,135,219,147, 36, - 9,211,194,169, 40, 48, 25,224,251,231, 37, 72,108,108,144,220, 39, 12,156,193,128,240,216, 84, 72,108,108, 32,144, 90, 53,248, - 96,106,138, 88, 85,127,153, 11,227,250, 48, 24, 12, 14, 61,123,246, 68,143, 30, 61, 48,100,200,144,170,166,192,144,144, 16,252, -254,251,239, 24, 60,120, 48,226,227,227,161, 84, 42,209,172, 89, 51, 52,107,214, 12,167, 79,159,110, 88, 28,180, 50,130,213,167, - 79,159, 82,130, 32,110,114, 28,215,250,218,181,107,118, 13,213, 48, 27,168,227,199,143,163,127,255,254,240,243,243, 67, 92, 92, - 28,162,191, 90, 14,129,141, 11, 64,186,129, 99,185,170,200,150, 37,125,176, 68, 34, 81,100,147, 38, 77,144,157,157, 3,137, 68, - 2, 71, 71, 7, 88, 89, 89, 65, 34,145, 98,201,146, 37,236,166, 77,155,214, 18, 4,241,149, 74,165, 42,108,132, 57,111,234,226, -226,242,203,152,209,163, 58, 56, 59,187,192,221, 93,129, 25,211,103, 70,237,248,125,103,194,227,199,143, 71,100,101,101,221,178, - 84,139, 32, 8, 24, 12, 6, 80, 20,133,253,201,174, 80, 27, 8,148,102,196,226,227,215,124,170,204,150,185,169,215, 60,253, 5, -207,139,129,162,168,173, 83,167, 78,237, 58,108,216, 48, 66, 68, 26, 13,209,199,182, 9, 24,198, 68,124, 54,235, 71,230,204,249, -179, 36,195,152,136, 33, 35,167,177,135, 79,221, 34, 63,152,178,156, 9,233,216, 31,183,111,223,150, 15, 24, 48, 96,145,209,104, -180,200, 96,153,243,184,150,223,231,155, 8,235,225,228,201,147,107, 1,172,237,213,171, 87,182, 76, 38, 67,121,121,249,223,250, - 41, 6, 7, 7, 91,167,164,164,136,196, 98, 49,218,182,109,235,202,178,108, 50, 65, 16, 43,142, 31, 63,190,185, 33,191, 85, 75, -100,171,209,211, 52,216, 58, 49, 3, 91,181,107,102,155,100, 61,215,214, 74,168,187,241, 74,178,212,142, 0, 80,162,149, 63,188, -152, 49,162,156,204,165,218,180,234,222, 28,182, 66,217,107, 0,106, 52, 88, 4,112, 83, 93, 86,214, 91,163, 53,225,236,153,120, - 12, 29,234, 13, 29, 77, 66,171, 35, 65, 27, 57,144,148, 8, 4, 37,194,152,113,239,193, 96, 98, 81,172, 82,129, 0,226, 95,182, -235,128, 97,152, 25,131, 6, 13,106,183,120,241,226,224,169, 83,167, 2, 0,148, 74,101,167,217,179,103,223,249, 7,230,193,122, -105,154, 7,159,142, 96,213,121, 96, 93,186,116,217,108, 52, 26, 95, 47, 44, 44,116,124,239,189,247,232,252,252,124,236,219,183, - 15, 63,253,244,147, 70,109,164,174, 23, 23,152, 70,167,168,212, 25,150, 20,138, 36, 73, 66,100, 52,130, 51,253, 39,114,197,234, -245, 85,145, 44,161,149,172, 97, 57, 82, 25,193,170,201, 84,153, 35, 89, 13,121,216, 74, 36,146,226, 11, 23, 46,184,101,100,100, - 60,209,161,221,215,215, 23, 0,112,237,218, 53, 92,185,114, 5, 35, 70,140,128, 64, 32,128, 72, 36,194,205,155, 55,203, 26,146, -102,179,225, 49,143, 34,148,203,229,125, 58,116,232, 80,219,232,193,122,181, 30, 63,126, 12, 63, 63, 63,232,245,122, 56, 56, 56, -160, 64,245, 8,143, 31,165, 64,163, 79, 70, 19,185, 20,185,185,185,144, 72, 36,150,222,112,140,185,224,210,235,245, 80,169,178, -161, 84, 42,241,235,175,219,177,121,243,230, 17, 42,149,106,119, 99,174, 53,133, 66, 49,173, 95,191,126,139, 94,127,253,117,129, - 70, 93, 14,142,173, 48, 60, 34,177, 8,223,127,255,125,179, 83,167, 78,221, 88,179,102,205,215, 82,169,116,209,195,135, 15, 13, -245,229, 57, 0,108,221,186, 21, 0, 32,235, 56, 15, 51,134,189,130,183, 39,110,195,138, 21,123,159, 56, 86,138,162,176, 96,193, - 2,190, 68,125,129,116,236,216, 49,100,214,172, 89, 66,115,159, 56,165,247, 98, 19, 77,211, 44, 0, 4,181,126,245, 63,145,202, - 62,192,253,251,247,177, 98,197, 10,168,213,106, 8, 4, 2,145,209,104,180,232, 55,122,246,236,137, 62,125,250, 84, 53, 19,186, -184,184,128,166,105,152, 76, 38,222, 92, 53, 48,146,213,191,127,255, 89, 44,203,114, 44,203,206, 53,127, 31, 26, 26,106,229,230, -230,118,113,213,170, 85,206, 38,147, 9,211,166, 77,115,200,207,207,119,152, 52,105,210, 76, 0,155,107, 41, 39, 26, 50,187,186, - 69,211, 52,212,212,167,139, 32,136, 38,214,214,246,200, 67, 54,138, 93,140, 33,197,206,166,194,227,170, 15,110,122,165,183, 9, -178, 98,140,126,100,169, 1,246, 86,118, 0,203, 5,212,250,156, 99,217,227,137, 9,119,122,120,122,248, 81, 7,254, 60,131,254, - 3, 7, 67,103, 32,160,163, 73, 16,148, 16, 4, 37, 66,187, 14,225,240,245, 11, 4,203, 2,119,226, 99,105, 35,203, 30,121,153, -242,190,250, 60, 88,211,190, 63,137,217, 11,191,195,168, 33,125, 48,118,236,216,127,114, 30,172,151,182, 15, 86,109,230,234, 29, - 71, 71,199,145,227,198,141,179,186,118,237, 26, 22, 46, 92, 40,136,142,142,166, 99, 98, 98, 76, 12,195, 76,203,202,202,218,216, -144, 31, 37, 73, 18, 77,182,255, 5,165, 92,142,123, 81,237,158,136, 92,157,109,237, 9, 86,175, 71,175,148,146, 6, 31,140,185, - 41,203,108,172,204,230,170,142,169, 20,234,170,129,215, 56,239,213,135, 31,126,136,205,155, 55, 35, 60, 60, 28,254,254,254, 16, - 8, 4, 85,205, 82,141,137, 96,153,105,240,232,193,167,106,243,222,222,222,184,117,235, 22,236,237,237,241,203, 47,191,192,203, -211, 3,163,123,251,194, 96, 48,192,104, 52, 66,173, 86,155, 35, 88,245, 38,148,101,217,132,125,251,246,249, 13, 27, 54,140, 19, - 8, 4,132, 94,175, 7, 0,172, 94,189, 58,183,161, 51,174, 87,214,134,134, 72, 36,146, 45, 35, 70,140,176,109,214,172, 25,114, -114,114,112,245,234,101,204,156, 57,227,170, 80, 40,208, 69,245,237,215, 53, 56,184, 5, 38, 78,156, 72,134,132,132,204,153, 57, -115,230, 52, 79, 79,207,177, 25, 25, 25,187,234, 51, 89,191,255,254, 59, 0,224,221,239,239,194, 96,168, 40,152, 55,108,216, 0, -185, 92,254,196,190, 15, 30, 60,224, 71, 17,190, 64, 76, 38, 19, 71,146, 36,145,158,158, 78,203,100, 50,194,201,201, 73, 32,145, - 72,160,215,235,171,140,214,253,251,247,113,232,208, 33,100,100,100,192,201,201,137,180,183,183,135,201,100, 42,178,244,154,175, - 62, 90,208,108,168,120,115,213,112,206,158, 61,187, 22,192, 90,243,231, 30, 61,122,140, 39, 8, 98,186,209,104,180,219,188,121, -179,131,157,157, 29,113,232,208, 33,195, 15, 63,252, 80, 78, 81, 84, 17,128,229,117,149, 41,207,107,118,245, 58, 34, 95, 96, 76, -184, 87, 84,158,226, 35,180, 81,176,241, 58,226,210, 39,233, 51,130,138,200, 0,119,162, 69, 11,211,208,220,132,139,163,141, 15, -195,243,114,114, 9,134,227,106,157,196,169,168,164,100,253,150,159,119,126,188,111,207, 54,111,169,157, 12,163,222,158,140,227, - 39,206, 67, 44,145,225,234,245, 27, 48,208, 12, 82, 31,103, 98,196, 91,163,160,112,115, 6,165,201, 82,233, 13,134,141, 47, 83, -222, 63, 49, 15, 86, 88, 56, 46,238, 93,142,223,147,189,145,185,112,225, 63, 61, 15,214, 75, 23,193,170,145,246,237,219,219, 22, - 23, 23,127,255,233,167,159, 90,169,213,106,228,231,231,163,160,160, 0, 87,175, 94,141, 54, 26,141, 31,215, 53, 74, 3, 21,171, -109,223,126,186, 80,164, 40, 10, 78,174,110,144,216,216,130, 51, 24,170, 34, 87, 34,153, 53, 88,189, 30, 44,109, 0,106,111,206, -169, 81,147, 32,136,191, 69,173, 26, 96,174,158,208, 52, 71,196,106,154, 84,212,203,203, 11, 95,127,253,245,223,166,105,176, 36, -157, 64,197,104, 65,142,227, 90,155, 35, 79, 28,199,181,150,203,229,125, 44, 28, 57, 88,163, 38,203,178,232,210,165, 11,162,163, -163,113,235,214, 45,144, 36,137,190,125,251,130, 32, 8,216,219,219, 67, 32, 16, 84,153, 57,243,128,128,186, 52, 25,134,121,251, -167,159,126,250,236,200,145, 35, 95,124,244,209, 71, 86,175,190,250,170,185,159, 87, 30, 42,214,120,108, 80, 58, 89,150,157,127, -243,230, 77, 91,147,201,132,197,139, 23,227,250,245,235,234, 7, 15, 30,124,170, 82,169,182, 0,224,138,138,203, 70, 61,124,248, -104,221,151, 95,126,105,219,189,123,119, 92,187,118, 77,234,229,229,245, 37,128, 93,245, 29,251,213,171, 87, 65, 81, 20, 76,133, -105,152, 56, 99, 39,108,100, 66, 36, 37, 37,161,160,160,160,234, 90,171,163, 41,169, 70,205,103,132,215, 4, 16, 19, 19,243,199, -218,181,107, 63, 28, 51,102,140,136,227, 56, 38, 45, 45,205, 8,128,144,203,229, 84, 76, 76, 12,123,240,224, 65,104,181, 90,120, -122,122,146, 30, 30, 30, 68,116,116, 52,155,152,152,120,149,227,184, 89,150,166,179,186,185, 18, 10,133,208,106,181,150,154, 43, - 62,143,234,102,222,222,189,123, 21, 58,157, 14, 98,177, 24,187,119,239,166,183,109,219,118,167,180,180,180,115, 92, 92,156,182, - 49,154,141,152,166,161, 78,205,178, 34,242, 80,244,241, 59,173,141,221,126, 36, 62,202, 46,136,172,170,184, 18,132,203,110,247, -150, 46,210,246,109, 50,109,206,125, 75,150,115,154,131,181,105, 62,124,248,208, 96, 27, 18,242,198,212,207,230,158, 94, 56,127, -158,237,210,111,150,225,118,255,161, 40, 46,209, 64,111, 96, 64,155, 88,204,159,255, 21,220,156, 28,224, 40,162,203,139,181,196, - 27,137,137,137,244,203,148,239,207, 56, 15,214,255, 71, 58, 95, 42,234,117, 31, 26,141,102, 97, 96, 96,160, 56, 49, 49, 17, 15, - 30, 60, 64,114,114, 50, 24,134,185,159,153,153, 57,160,177, 63, 74,146, 36,236,237,237, 33, 22,139,209,233, 86, 38,196, 34, 17, -196,214, 21,203, 83,245, 74, 41, 1, 56, 14,164, 88,210, 96,205,167,231,188,122,150, 81, 68, 12,195, 84,205,208, 94,125, 61,195, -167, 71,171, 53, 52,114, 69,146,228,140,203,151, 47,219,165,165,165,129,227, 56,236,221,187,215,110,200,144, 33, 51, 26, 19,189, -226, 56, 14, 5, 5, 5, 96, 89, 22, 66,161, 16,221,187,119, 71,104,104, 40,202,203,203,193, 48, 76, 85,243,165, 72, 36,106,208, - 40,194,220,220, 92, 13,128, 5, 70,163,113,227,156, 57,115, 22,180,108,217,242,189, 79, 62,249,132, 68, 35, 7, 69, 16, 4, 97, - 50,153, 76,216,189,123, 55,246,236,217, 83,198,113, 92,160, 74,165,202,174, 22,189,219,126,229,202,149,232,193,131, 7,223,127, -248,240,161, 93, 73, 73, 9, 80,207, 28, 54,149,215, 38,252,253,253,193, 48, 12,150, 77,244, 68, 89, 89, 43, 48, 12, 3,147,201, - 4,153, 76,246,196, 18, 68,252, 44,238, 47,184,102,204,178, 51,103,207,158,125,244,235,175,191,158, 49,101,202,148, 14, 99,198, -140, 17,138, 68, 34, 54, 51, 51,211,180, 99,199, 14, 34, 32, 32,128, 20, 10,133,196,241,227,199,217,107,215,174, 93, 49,153, 76, -203, 0, 52,104, 41,146,234,230,138,239,115,245, 92,217, 53,108,216,176, 49, 67,135, 14,181, 10, 9, 9,145,252,244,211, 79,197, -106,181,186, 54,115,245,183,224,101,109,211, 52, 60,167, 9, 72, 1, 0, 42,149,106,227, 87,243,206, 77, 28,229, 63, 50,224, 61, -231, 87,112, 66,157,139, 34, 33, 69,218, 57,144, 8,241,161,160, 41,126,232,118,226,218,222,100,149, 74,181,181, 46,157, 27, 55, -110,196,145, 36,217,229,237,119,222,221, 55,110,204, 56,229, 23,159,124, 44, 60, 20,125, 26,140, 81,143,243, 39, 79,194,197,134, -100,104,117, 78, 86,137,145, 28, 20, 23, 23,247,210,245,191,170,156, 7,107, 34,128, 17,243,230,205,219, 49,113,226, 68,176, 44, -139, 51,103,206, 96,221,244,233,152,207, 48,163,109, 1,205,199, 21,251,240, 60, 47,131,213,174, 93,187, 87,212,106,245, 47, 6, -131, 33,132,101, 89,241,217,179,103,161,211,233,144,152,152,168,101, 89,246,143,103,248,205,180,190,125,251,146, 79,175, 23, 87, -139,201,177,180,115, 93, 90,207,158, 61,159,155, 38,203,178, 25,213,215, 48,171, 77,183,250,103,147,201,148, 97, 73, 66, 89,150, - 93,218,169, 83,167,191,125,215,200, 66, 44,165, 71,143, 30,244,211,166,171,166,191,171, 29,127,134,165,250,249,249,249, 57, 0, - 62, 96, 89,118,213,216,177, 99,231, 1,184,223, 72,131,181, 40, 56, 56,120, 78,197,159,196,194,172,172,172,236, 26, 76, 93,158, - 82,169,124,207,203,203,171,106, 1,232,250,142,189, 87,175, 94,116,125,139, 60, 87,143, 92,177, 44,155,193,223,242, 47,148,243, - 26,141,230,252,146, 37, 75, 58,175, 91,183,110,230,135, 31,126,216,126,248,240,225,130, 46, 93,186,224,240,225,195,204,153, 51, -103,174,106,181,218,165, 13, 53, 86, 4, 65,148, 63,125, 15,213, 81, 9,209,241,217,208, 48, 78,158, 60, 57, 53, 60, 60,124,222, -174, 93,187, 82,125,124,124, 36, 4, 65,152, 44, 52, 87,207,125,154,134,186,140, 28, 85,174, 27,184,125,228,135,135, 66, 62,122, -215,167, 79,120, 91,169,103, 83,133, 60, 41,173, 0,233, 55,163,181, 15,207,174,123,196,233, 10, 6,194,130,136,123,108,108,108, -188,159,159, 95,224,198,159, 54,191, 43,162,168, 94, 44,199,133,126, 62,105, 52, 72,130,136,163, 25, 38,186,180,172,108, 75,125, -125, 66,255,237, 72, 68,162,209,147, 38, 77,194,175,191,254,138,125,171, 86,161, 79, 70, 6,126, 23,137, 96, 37, 18, 97, 3, 77, - 79, 0,111,176, 26, 69,173, 78, 36, 48, 48,240,247,194,194,194,161,165,165,165, 38,147,201,196, 16, 4, 97, 34, 8, 66,203,178, -236, 87, 44,203,254,128,138, 78,104,245,193,135,226,121, 77, 94,147,215, 52,211,217,206,206,238, 19,150,101, 81, 94, 94,190,202, - 66, 99,197,159,207,127, 72,179, 91,183,110, 43, 73,146,236,192, 48,204,207,103,206,156,217,244, 44,154, 13,236,252,222,144,116, - 10,228,114,249, 56,206,209,102, 0,140, 2,127,142,166,146, 40,186,240, 80,101,228,138,229,243,221, 50,205,164,164, 36,206,201, -201, 9,133,133,133,216,211,172,217, 19,219,108,129, 13,181, 68,176, 94,104, 19, 33,199,113,237, 0,184,154,235,255, 0,146, 0, -180, 5, 96, 5, 64, 15,160, 28,128, 75,181,127, 41,168,220,102,222,126,142, 32, 8, 35, 94, 34, 90,242,154,188, 38,175,201,107, -242,154,188, 38,175,201,107, 62,163,193,234,143,138,192, 14, 55, 99,198,140,153, 28,199, 69,205,152, 49, 99,102,181,207, 85,219, - 43,118,231,250, 63,181,189, 29, 94, 50,248,139,143,215,228, 53,121, 77, 94,147,215,228, 53,121,205,231, 98,176,234,122,175,237, -239,106,239, 47, 20,162,142,147,116,251,255,249, 68,223,230, 53,121, 77, 94,147,215,228, 53,121, 77, 94,243,127, 78,179, 62,237, -219, 53, 25, 44,130, 32, 14,113, 28, 55,160,250,123,181,237, 3, 0,192,188,205,252,119,245,237, 4, 65,252,133,151, 8,222,221, -243,154,188, 38,175,201,107,242,154,188, 38,175,249, 76,252, 27, 35, 88,181,142, 34,228,118,239,166, 50,131, 97, 39,182,146,137, - 0,192,160,213,208, 30,137, 40, 37,134, 13, 99,192,195,195,195,195,195,195,195,243,130, 33, 8,226,208,140, 25, 51,102,253, 27, -210, 42,168,205, 92,229,135,201, 92, 4,250,162, 64,198, 68, 7, 1,128,128,228,238,230,135, 57, 38,115,187,119,231, 63,111,147, - 21, 21, 21, 53,139,227, 56,119,161, 80,248,151, 92, 46, 63,179,105,211, 38, 35,127, 25,189,120, 56,142,171,119,177,198,182,109, -219, 58,234,245,250,229, 44,203,118,175, 92,231,239,140, 72, 36,250,236,198,141, 27,133, 4, 65,212, 58, 36,218,219,219,123,135, -159,159, 95, 32, 87, 1, 0, 60, 49, 47,151,249, 59,243,246,199,143, 31,223,203,200,200,120,203,210,180,123,121,121,249, 74,165, -210,119, 8,130, 8,174,212, 73,212,233,116, 63,167,167,167, 63,250, 95,203, 71,133, 66, 97,197,113,220,235, 66,161,112,140,147, -147, 83,251,188,188,188,249, 89, 89, 89,223, 61,195, 51, 98,154,131,131,195, 8, 7, 7,135, 38,133,133,133, 15, 75, 75, 75,119, - 1, 88, 1,160,222,251,244,171, 73,202,142,175,246,235, 50,247,220,225,179, 11,191, 92,151,117,229,233,237,243,167, 41,156,187, -247,136,152,123,228,175, 75, 95, 45, 89,151,213,208,181, 45,201,202, 23, 80, 49, 98,204,220,193,245,191, 53, 95, 66, 0, 76,103, - 24, 70, 72,146,228,119,217,217,217, 23,254,219,175,165,102,205,154,125, 33, 22,139, 39,144, 36,249, 48, 39, 39,103,156, 74,165, -122, 94, 83,157,144, 62, 62, 62,182,105,105,105,101,176,108,242, 98, 30, 0, 29, 59,118,204,161,105,218,173,174,125, 68, 34, 81, -238,149, 43, 87,220, 95,194,195,207, 55, 55,253, 1,200, 5, 64, 85,126, 54, 84,190,231, 84,251, 46,167,150,237,255,188,193,202, - 12,134,157, 64, 95, 20, 88,144,115,103,120,158,234,198,155, 0,224,170, 8,217,229,236,222,124,103,102,176,152,150, 55, 27,108, - 35,148, 9,214, 83,148, 48, 68,103,208,187, 8, 5,194,124,218,100,188, 65, 26,184,137,217, 73,251, 30, 91,242,195, 3, 6, 12, - 8, 4, 96, 31, 26, 26, 26,115,254,252,249,246,223,125,247,157, 98,207,158, 61,173, 99, 99, 99, 71, 14, 28, 56,240, 79,142,227, -142, 29, 58,116, 72,219,160,163,233,210, 69,224, 86,236, 52,154, 18, 8, 6, 2,104,205,113, 0, 8,234, 38,107,164,255,202,117, - 44,248, 25, 21,115,180, 52,238,194, 14,117, 10, 36, 88,250,115, 33,197,117, 54, 50,196,121,142, 20, 45,191, 18, 87,152,108,185, - 1, 80,244, 20, 11,136, 31, 1,192, 96,226,222, 75, 79, 87,157,120,150,253,106,121,128,247, 2,176,157, 32, 8, 33,128, 13, 12, -195,236,207,201,201,137,135, 5,147,118, 90, 66,243,230,205, 93, 9,130,184,185,114,229, 74,231, 14, 29, 58, 80, 44,203,226,212, -169, 83,111,205,153, 51,167, 79,139, 22, 45, 90, 86, 94,244, 53,226,231,231, 23,120,242,228,201, 54, 71,143, 30, 69,120,120, 56, - 88,150, 5,203,178,112,112,112,192,193,131, 7,209,161, 67,135,170,239,220,221,221,209,165, 75, 23,100,100, 88,246, 44,111,210, -164,201,235, 45, 90,182,153,242,233,231,211,221,221,156, 93,108, 77,140,137,206,204, 84, 41, 87,125,183,172,163, 80, 40, 92,159, -146,146,178,191, 49, 21, 37, 79, 79,207,225, 66,161,112, 0,128,224,202,239, 18,141, 70,227,161,140,140,140,157,150, 22,228,173, - 91,183, 62, 71,146,228, 43, 13,249, 97,134, 97, 30,223,186,117, 43,178, 49,121,164, 84, 42,135, 41,149,202,159, 58,118,236, 40, - 11, 9, 9,129, 72, 36,194, 55,223,124, 51,205, 2,131, 37, 0, 48, 77, 38,147, 13,183,182,182,246, 43, 47, 47,127,160,213,106, -247,136,197,226,158,223,127,255,189, 87, 68, 68,132,109, 78, 78, 14, 65, 81,148,251,159,127,254, 57,122,205,154, 53,125, 76, 38, - 83,143,250,174,173,162,135,236, 92,137, 48,168,115,209,131,211,115, 1,244,125,122,187, 73, 39, 29, 67, 9,189, 6, 80, 92, 92, -122,165,105,179,184,128,246,244,244,252,222,221,221,125,172, 86,171,213, 17, 4,193, 85,190,204,181, 92, 0,128,193, 96, 40, 74, - 78, 78,110, 86,151,208, 43, 29, 29,175, 83, 36, 85,235,220, 77, 12,203,100,164, 94, 41, 10,123, 14, 21,166,190,165,130, 0, 0, - 32, 0, 73, 68, 65, 84,152, 79,226,227,227,135, 10, 4, 2,162, 77,155, 54,214, 0,250, 88,106, 46, 20, 10, 69, 32, 65, 16,179, - 57,142,139, 81,169, 84,235, 1, 48, 74,165,178, 27,199,113, 95, 84, 30,239, 55, 89, 89, 89,167, 43,175,129,245,254,254,254,175, -221,191,127,127, 67, 86, 86,214,162,198,166,215,223,223,127,226,228,201,147,231, 77,152, 48,193,170,160,160,192,167,119,239,222, -191,169, 84,170,206,207,114, 14, 66, 67, 67,133,217,217,217,211, 92, 93, 93, 63,106,215,174,157,226,206,157, 59,217,105,105,105, -171,229,114,249,138,184,184,184,122, 13,123,171, 86,173,148, 2,129, 96, 44,128,209,149, 5,232,239, 0,126,190,113,227,198,195, -255, 5,131, 69,211,180,219,137, 69,115, 65, 80, 20,164,157,123,130,101, 89,228, 47,159, 7, 83, 97, 62, 92, 22,173,134,201,100, - 66,207,158, 61,221, 94,210,200,213,181,127, 91,154,107, 52, 88, 98, 43,153,136, 49,209, 65,121,170, 27,111,182,143, 90,109, 15, - 0,215,142, 78,121,211,217,163,197,109,177, 64,150, 44,177,147,238,125, 99, 96,207,144,161, 3,186, 16,158, 10, 55,100,168,114, -221,183,252,126, 44,234,208,177,211,123, 81, 49, 47, 69,189,148,150,150, 46,246,241,241,113, 61,121,242,100,170, 88, 44,182,146, - 74,165,196,176, 97,195,172, 70,142, 28,217,252,212,169, 83,126, 71,143, 30, 29,250,218,107,175, 29, 21,137, 68,127,253,241,199, - 31,245,174, 79,230,214,242,245,230,100,153,228,143, 65,175,247,125,165,127, 47, 55,177,143,220, 21, 44, 43, 69, 82, 10,237, 29, -125, 62, 46,234,240,209,227,159, 51,193,175, 15,203, 75,220,127,203,210,147,211,162,133,157,131, 21,201, 77,181, 18,115, 35,186, -134,251,251, 14,236, 27, 78, 52,105,218, 4,201,137,201,126,167,207,198,140,149, 80,119, 30,105, 13,196,239, 90,150, 88,153,144, - 80, 90, 92,151,150, 88, 64,108,189,153,112, 95,201, 48, 12,190, 89,246,117, 52,203,145, 85,179,171,155, 95,230, 89,200,191,253, -246, 91,232,245,122,180, 11,105,177, 21,255,153, 55,198, 18,126,187,115,231,142,179, 70,163,193,209,163, 71,103,170, 84,170,153, -199,142, 29, 83,165,167,167,127,174, 82,169,126,127, 14,181,251,181, 27, 54,108,112,110,223,190, 61, 69,211, 21,243,155, 70, 68, - 68, 80,179,102,205,114, 90,178,100,201, 42, 0, 35,234, 40, 92,184,163, 71,143,226,151, 95,126,201, 95,182,108, 89, 6, 0,184, -184,184,120,188,245,214, 91,174,219,183,111,207, 91,185,114,101, 6,199,113,112,118,118,246, 28, 62,124,184, 43,199, 89,150, 84, - 79, 79,207, 38, 45, 91,135, 76,249,121,235,214, 14, 37,133,133,186, 31, 87,110,136,211, 11, 36, 26,159,224, 64,209,220,121,139, -236,191,250,114,230, 7, 52, 77,223,206,200,200, 72,177,244, 32,229,114,185,183, 68, 34,217, 59,107,214,172,150,145,145,145, 66, - 55, 55, 55,228,228,228, 32, 41, 41,169,229,197,139, 23, 95,223,191,127,255, 52,189, 94,255, 70,118,118,118,189,149, 9,142,227, - 2, 14,124,243,181,155,196,217, 5,172,209, 8,199, 86, 33, 85,219,178, 78, 29, 3,107, 52,130, 53, 26,225,213,255,245,170, 72, - 94,183,110,221, 26, 53, 37,185,135,135,135, 50, 32, 32,224,215, 25, 51,102,136,244,122, 61,110,220,184,129,203,151, 47,179,185, -185,185,245, 77,100, 43, 32, 8,226,248,188,121,243, 60, 35, 35, 35,109,243,243,243,193, 48,140,203,254,253,251, 39,134,134,134, -218,121,122,122,138,183,109,219,102, 94, 33,192,201,207,207,207,105,228,200,145,134, 95,126,249,101, 26,128,101,181, 69,174,138, - 31,176,115, 85,148, 95, 84,179,176,119,144, 45, 56, 22,245,105,111, 28,113,240, 35,171, 34, 89, 81,126,126,182, 37,153, 86,211, -109,236, 90, 58,149,100, 70, 79,143,242,243,219,124,244,225, 67, 75, 22, 77, 39, 61, 60, 60,190,239,215,175,223, 91, 27, 54,108, -144, 37, 38, 38,202,130,131,131,193,178, 44, 76, 38, 19, 24,134, 49,175,187,137,234, 19, 6,215, 6, 69, 82,158, 23,247, 38,184, - 89, 89, 89, 85,221,135,230,119,181, 90,141, 62, 99, 58, 62,151,135, 45,203,178, 98,243,117,109, 50,153,164, 0,132, 0, 44,157, -192,114,193,165, 75,151,134, 29, 57,114,100,212,162, 69,139, 2, 84, 42,213,100,150,101,231, 38, 38, 38,118, 1,128,224,224, 96, - 49,128,211, 10,133, 98,220,135, 31,126, 56, 97,210,164, 73, 24, 51,102,204,220,172,172,172,197,141,189,239,197, 98,241,151, 31, -126,248,161,149,209,104,132,149,149, 21,104,154,110,250, 44,199, 31, 28, 28, 44, 42, 44, 44,220,179, 96,193,130, 1,131, 6, 13, - 50, 47,225, 37, 63,119,238,220,146,207, 62,251, 44, 60, 52, 52,116,112,109, 38, 43, 52, 52, 52, 4,192, 87,190,190,190,125,198, -140, 25, 67, 69, 68, 68,160,188,188, 28,199,143, 31,159,189,119,239,222,217,161,161,161,151, 0,204,141,139,139, 59,243,178,155, - 44,202,198, 22, 73,111,116,131, 95, 98, 1, 0, 32,123,125,197,210,144,118, 95,126,203,135,248,254, 13, 6,171, 62, 52, 26, 77, -232,204, 41,163, 65,146, 21,181, 68,255, 38,222, 88, 50,107, 60,113,224,208,177,208,122,194,155, 43, 25,134, 9,112,114,114,250, -188,160,160, 64,186,106,213, 42,105,102,102,102,208,158, 61,123,184,248,248,120,136, 68, 34,216,219,219,163,123,247,238,146,168, -168,168,166,151, 46, 93,242,222,187,119,239,160,126,253,250,253,124,248,240,225, 63,107,211,117,110, 57, 48,192,197,213,245,236, -183,139,222,119,106,217,196, 15, 6,163, 17, 25,185,153,224, 32,134,220,205, 26,163, 94,111, 35,138, 8, 19,249,175, 88,119,242, - 12, 65,190,246,106,110,194,193,132,250,142, 49, 50, 84,118,173, 91,167, 87,218,190,214, 39,156,244, 15,110, 14,145, 68,246,159, - 90, 84,104, 40, 90,133,134, 18,227,199,151, 53,137,143,139,159,115,244,228,213, 89,246, 34, 83,236,133, 56, 77,251,218, 75, 90, - 72,204,107,167,189, 49,228, 77, 4, 6, 6, 62,241, 48, 55,255,157,154,154, 10,130, 32,144,159,159, 15,150,131,184, 17,121,131, - 43, 87,174,160, 77,155, 54,232,221,187, 55, 70,140, 24,161,216,191,127,255,111,107,215,174,237,146,153,153, 57,254, 89, 46, 22, -134, 97, 34, 66, 67, 67, 41,154,166, 65, 81, 20, 10, 10, 10,144,146,146, 2, 63, 63, 63,138, 97,152,174,245, 24, 13,132,135,135, - 99,217,178,101, 25,231,206,157, 11, 5,128,206,157, 59,199,117,232,208,193,117,229,202,149, 25, 23, 46, 92,104, 11, 0,225,225, -225,177, 97, 97, 97,174,150,166, 73, 38,147,189,251,201,167,159,185,150, 20, 22,105,141,101,101,180, 13,203,152,236,164, 66,162, - 52,175,160,248, 81,186,157,230,221, 9, 83, 4, 95,206,152,250, 46, 0,139,218,236,229,114,185,119, 80, 80,208,181,205,155, 55, -187, 57, 59, 59,163,184,184, 24, 5, 5, 5,184,118,237, 26, 88,150, 69, 84, 84,148, 36,180,117,235,208, 21, 43, 87, 94, 6,208, -201, 18,147, 37,113,118,193,158, 46, 21,183,198,176,135, 5, 85, 17,150,163, 35, 6, 86,237, 51, 50,173, 98,113,115,169, 84,218, -232,101,125, 56,142,235, 20, 17, 17, 33, 2,128,105,211,166,149,170,213,234, 37, 4, 65,252,166, 82,169, 50,235,249,215,105,115, -230,204,241,104,210,164,137,207,111,191,253,134,242,242,114, 0,112,107,210,164, 9, 2, 2, 2,152,179,103,207, 34, 48, 48, 16, -182,182,182, 56,123,246, 44,174, 92,185,130,144,144, 16, 91,145, 72,244, 38, 77,211, 53, 26,172, 87,251,117,153, 43, 17, 6,117, -110, 22,246, 14,108,236, 20,216,188, 99, 39,146,174,255,220, 89,111,188, 59,119, 38,206,190, 77,113,146,119,114, 31, 91,207,240, - 13,235,234,236,223, 98, 16, 94,105,123,195, 69,207,156, 75,153,211,171,201, 82,129, 84,183,109,254, 10, 85, 65,109,230, 74, 46, -151, 47,239,219,183,239,176, 13, 27, 54, 56, 0,192,173, 91,183,144,157,157, 13, 87, 87, 87, 72,165, 82, 8,133, 66, 8, 4,130, - 6, 45,149,101,101,101, 5,149, 74, 5,115,197,129, 97, 24,148,149,149, 85, 45, 26, 62,127, 62,200,249,243, 45,139, 54,201,229, -242,200,208,208,208,237,158,158,158, 94,213,191,215,235,245, 24, 63,126, 60,212,106, 53, 66, 66, 66, 34,220,221,221,245, 4, 65, -128,101, 89,228,228,228,148,223,186,117,171, 87, 86, 86,214,213, 90,106,239,218,236,236,108, 76,152, 48, 1,143, 31, 63,158,244, -235,175,191,166, 17, 4, 33, 21,139,197,230,237, 98,133, 66, 17, 24, 24, 24,248,253,251,239,191,143,212,212, 84, 36, 39, 39, 95, -123,150, 74,149, 68, 34, 81, 51, 12,227,102, 50,153,160,213,106, 17, 21, 21, 37,101, 89, 54, 71, 40, 20,222, 45, 46, 46, 30,149, -145,145,161,178,180,156, 81, 40, 20,114,181, 90,189, 97,202,148, 41,253,186,116,233,130,187,119,239,226,232,209,163,120,237,181, -215,208,181,107, 87,204,158, 61,187,255,220,185,115,167, 1,168,173, 50,240,199,158, 61,123,124, 61, 61, 61,171,150, 68,178,179, -179,195,187,239,190,139,209,163, 71,227,240,225,195,225, 95,127,253,245,158, 46, 93,186,184,157,125,134,150,138,127, 3,146,176, -112,248, 37, 22,224, 97,176,115, 69,235, 64,165,209, 50,127,134, 71, 40,239,108,254,155, 13,150, 65,171,161, 5, 36,119,215, 85, - 17,178,235,218,209, 41, 85, 77,132, 48,113,119, 13,180,134,174, 8,155,115, 40,213,152, 96, 37, 33,145,170, 42,195,237,135,249, - 53, 73,221,126,170,240,255,116,245,234,213,248,230,155,111,250,106,181,218,242,148,148, 20, 85,121,121,185,122,212,168, 81,132, - 80, 40,196,197,139, 23,241,232,209, 35,180,106,213, 10, 14, 14, 14,136,140,140, 20,245,238,221,219,107,220,184,113,111, 3,248, -179, 38, 77, 12, 29, 74,137,210,136,131,203, 23, 13,119, 34,168,100, 36, 63, 46, 70, 83,207,246,112,182,247, 66,102, 94, 57, 98, -239, 28, 70,242,131,191,208,212,211, 27,227,223,106,234,240,221, 15,121,135, 16, 58,190, 41,226,158,232,231,245,183, 33,161, 82, - 17,211,110,254,234,120, 48,234, 7,224,140,143,193,209,217,127, 47,220, 29,188, 16,212,198, 29, 50,177, 43,121, 43,241,187,118, -117, 29,187,222,196,125,177,120,225,130, 45,173, 67,218,162,164,164, 4,107,214,172,169, 50, 86, 28,199, 85,213,184, 59,118,236, - 8,163,209,136, 45, 91,182,192,200, 86,132,255,235, 74,231, 83,140,236,208,161,195, 78,142,227,196, 86, 86, 86,217,109,218,180, -241,153, 60,121,178, 96,248,240,225,208,106,181,239,111,222,188,249, 88,118,118,246,190, 6,106, 86, 52,163,188,242, 74,100,215, -174, 93,173, 40,138, 2, 77,211, 40, 41, 41, 65, 70, 70, 6, 82, 82, 82,224,226,226, 2,252,167, 47, 76,173,154, 79,175,133,200, -113, 28,103, 62,254,234, 70,204,124, 94, 44, 73, 39, 65, 16, 65,142, 14,142,214, 63,174,216,112,221, 85, 66, 17, 46, 94, 74, 66, -100,231, 32, 32,109,108, 37, 28, 69,105,125,188,148,182, 4, 65, 4,213,114, 88, 79,107, 18, 18,137,100,239,214,173, 91,221,132, - 66, 33, 24,134,129,171,171, 43, 82, 82, 82, 80, 92, 92,140,178,178, 50,164,220, 77,132,175,167, 39, 62, 30,255,158, 98,193,183, - 43,247, 2, 8,123,170, 16,251,251, 98,220, 70,227,211,105,174, 45, 4, 14, 11,211, 89, 91,132,228, 81, 86, 86, 22,100, 50, 25, -130,131,131,109, 98, 98, 98,206,103,101,101,101,214,167, 41,149, 74,223,140,136,136,176,221,177, 99, 7,218,182,109, 11,123,123, -123,156, 62,125, 26,183,110,221, 2, 77,211,100, 89, 89, 25,108,108,108,176,116,233, 82,120,123,123,163,164,164, 4,105,105,105, -206, 66,161,208,197,108, 72,158,214, 60,119,248,236,194,162,135,167,231,102, 83,199,162, 54,239,216,137,247, 71, 14,135,220,244, -240,188, 99, 83,114, 97,223,254,225, 95, 82, 66,175, 1,214,182, 45, 29, 3, 90, 14,130, 72,108,131,201, 95,124,133,228,219, 7, - 29, 53,101,183, 38, 49,198,116,175,249, 43,118,127, 92,195,177, 19, 0, 72,165, 82,249,222,198,141, 27,109,171, 28, 23, 73, 66, - 40, 20, 62, 97,172,204,139,177,215,114, 78,111,215, 80,121, 0, 77,211,160,105, 26, 44,203, 34, 47, 47, 15,101,101,101,112,116, -116,172,216, 97, 30,128,121, 32, 64,212,106, 88,110, 87, 75,207,168,157, 59,119,122,201,100,178,191,237,148,158,158,142,146,146, - 18, 88, 91, 91,195,193,193, 1, 70,163, 17, 38,147, 9,122,189,222,166,107,215,174, 19, 1, 92,173, 73,147,162,168,169, 19, 38, - 76,136, 56,116,232,144,223,162, 69,139, 64,211,244,242,188,188, 60,188,255,254,251, 96, 89, 22,145,145,145, 29, 57,142, 75,154, - 50,101, 74, 69,184,107,193, 2, 99,121,121,249,135,141,189,150,220,220,220,154,183,110,221,218,241,196,137, 19,136,140,140,132, - 94,175,199,196,137, 19,237,222,123,239, 61,187, 75,151, 46,185,174, 90,181,106, 91, 70, 70, 70,207,186, 52, 67, 67, 67,133, 57, - 57, 57,211,187,118,237, 58,173,103,207,158,246,249,249,249,144, 72, 36,216,181,107, 23,126,252,241,199, 35, 52, 77,207,217,179, -103,207,226, 77,155, 54, 69, 13, 26, 52, 8,155, 54,109,154,162, 82,169,190, 65, 69,179,233,211,154, 74, 47, 47, 47,220,188,121, - 19,142,142,142,112,113,113, 65, 73, 73, 9,174, 92,185,130,107,215,174, 33, 40, 40, 8, 4, 65, 56, 86,150,105,166,103,185,143, - 26,200, 11,215,172, 90, 99,181,218,181, 11, 0, 76,221,110,218,162, 89,241,149, 74,229, 32, 7, 7,135, 73, 28,199, 9,138,138, -138, 54,202,100,178, 63,234, 88, 38,136, 95,232,217, 66,131,101,206,151,174, 0,206,122, 36,162, 52, 63,204, 49,217,217,189,249, - 78,103,143, 22, 21, 39,209,196,221,165, 36,142,201,238,215, 53,165, 0, 64, 27, 57, 92,186, 91,132,155,247,115,112,243, 94, 54, -108,164,245,215,186,157,157,157, 17, 30, 30,142, 3, 7, 14, 32, 61, 61,221,102,233,210,165, 1, 52, 77,211, 3, 7, 14,204,122, -229,149, 87,138, 34, 35, 35, 33, 20, 10,113,245,234, 85,148,150,150,130,162, 40,136,197, 98,176, 44, 91,107,164,205,237, 30,243, -206,152,241,161,126, 46, 14, 36,254,188,120, 12, 29,131, 6, 67, 38, 17, 34,175, 72, 11,146, 32,240,224,209, 9, 48,140, 53,226, -239, 62, 70,167,150,214,232,220,193,222,179,252,100,225,248,124, 96,157, 37, 39,136,206, 60, 3,241, 43,111, 0,210, 22,224, 12, - 15,192, 26, 50,193, 9,221,160,214, 72,145,159,154,134,187, 87,254, 0,103,210,212,171,147,145,161,250,105,203,214,109,145,103, - 70,191,243, 14,203,178, 88,182,108,217,153,251,247,239,119,171,190,143,159,159,223,233,217,179,103,119, 45, 42, 42,194,177, 99, -199,126,174,111,161,210,167, 81,169, 84, 39, 0, 56, 85, 51,180,222,113,113,113, 59,126,253,245,215, 78,111,191,253, 54,118,239, -222,253,121, 13, 6,171, 78,166, 76,153, 34, 60,112,224, 64, 31, 43, 43,171, 53,115,231,206,181, 49, 24, 12, 80,169, 84,200,206, -206,174,138,182, 37, 36, 36, 48, 2,129,224, 82, 61,133,127,141,139, 77, 63,109,176,170,125,103,105,205,187,220, 96, 52,234,173, -189,148,198,129,131,250,180,186,117,237, 70,178,149,147, 19,217,170, 93, 72,243,187,247, 83, 99,137,138, 38, 24,139,154, 97, 60, - 61, 61,135,207,155, 55,175,149,157,157, 29, 88,150,133,189,189, 61,242,242,242,170, 12,165,161,172, 20,116,105, 9,110,166,165, - 32,178,107,119,244,238,212, 49,248, 47,163,113,120, 70, 70,198,239,117,233, 58,181, 14,173,138, 92,237,246,115,174,250,126, 68, -106,113,149, 1, 56,220,222, 31, 18, 27,107,180,252,100,102,163,111,230,236,236,236,184, 19, 39, 78, 28,142,138,138,234, 55,126, -252,120, 50, 59, 59,251,168,201,100,138,200,205,205,189, 83,215,255,217,216,216, 52,205,207,207, 71, 89, 89, 25,236,237,237,177, -106,213, 42,184,185,185, 65,163,209, 32, 38, 38,134,243,244,244, 36, 78,159, 62, 13, 15, 15, 15, 20, 20, 20,128,166,105,104, 52, -154,108,131,193, 80,107, 31,201,202,102,192,190,159,246,194,145,164,235, 63,119,246, 64, 74,204,208,207, 59,223,139,191,150,156, -126,234,228,197,133, 38,157, 52,189, 56, 35,122,122,147,118,241, 46,147, 62, 95,128,181,203,231, 33,233,234,217, 66,119,239,178, -117, 12,161,255,185,158, 40,173, 46, 49, 49,209, 54, 62, 62, 30, 36, 73,194,206,206, 14,214,214,214, 85, 11,155,155,205,149, 64, - 96,121,128,222, 92,193, 49,155,171,188,188, 60, 60, 72, 75,198,158, 83,219, 96, 52, 25, 93,182,118,176,203,246, 19,137,110,150, -180,200,159, 85,144,128,184,122, 10,192,141, 35, 70,140, 24,238,225,225, 97, 91,253,251, 54,109,218,224,173,183,222,194,209,163, - 71,113,253,250,245, 39, 42, 88,121,121,121, 42,134, 97,106, 61,238,244,244,244, 98,150,101,163,222,123,239,189,216,125,251,246, -217,125,251,237,183, 85, 93, 10,204,205,162,230,247, 29, 59,118, 32, 54, 54,118,110, 78, 78,206,221,198, 92, 71,238,238,238, 65, - 3, 6, 12, 56,183,110,221, 58,135,156,156, 28,228,231,231, 67,173, 86, 67, 40, 20,194,100, 50,193,223,223,159, 96, 24,198,183, -190,230, 64,154,166, 15,158, 58,117,170, 79, 64, 64, 0, 0,192,104, 52,226,226,197,139, 24, 63,126,124,129, 76, 38,123, 51, 45, - 45, 77,173, 80, 40,102, 31, 58,116, 40,170, 77,155, 54,104,213,170,149, 60, 55, 55,215, 54, 45,173, 50,156, 91,195,179,130, 97, -152,170,252,217,178,101, 75,213, 54,157,174, 98,201, 73,131,193, 64,132,133,133,249, 94,191,126,253,165, 29,220,146,246,235,102, -164,206,250, 8, 62,231,147, 0, 0,177,205, 43,186, 92,249,156, 77,172,216, 97,244,232, 6,233, 41, 20, 10,103,142,227,222,111, -222,188,249, 39, 81, 81, 81,174, 10,133, 2,206,206,206,184,117,235, 86,196,177, 99,199,214,232,245,250, 31, 24,134,249,193,146, -104,253,115,224, 9, 47,242, 50, 69,176,136,202,131, 35,136, 97,195, 24,110,247,238,252,204, 96, 49, 45, 22,200,146, 1,192, 64, -107,104,247,235,154, 82, 98,216, 48,198,181,197, 32,112,224,192,176,149,209, 6,142, 3, 99,225, 56, 16,221,221, 33, 96,139, 15, -194,205,113, 16, 54,109,218,135,220,220, 92,209,170, 85,171, 94,217,183,111,159,231,168, 81,163, 30,251,251,251,151,116,239,222, - 29,219,182,109,131, 92, 46,135,193, 96, 0,203,178,181,186, 55, 91, 39,102,104,135, 86,254, 84,114,218, 45,132, 5, 12,129,175, - 34, 18, 15, 50, 75, 80, 84,166, 71, 65,137, 22,129,129,159, 35,167, 80,131, 82,181, 14,183,146,126,131,167,162, 9, 73, 9, 31, - 68,193, 66,131,165,127,176, 29,250,148,157, 16, 41,186, 65,220,100, 56,132, 46,157,144,158,116, 6, 55, 78,172, 68,198,189, 11, -224, 88, 6,238, 94, 65,150, 54,225,204, 95,189,122,245,168, 37, 75,150, 8, 62,250,232,163,174, 75,151, 46,237,154,149,149,117, - 6, 0,148, 74,101,215,119,222,121,167,171,173,173, 45, 22, 47, 94,108,228, 56,110,254,179,102,110,118,118,246, 99,165, 82, 57, -233,196,137, 19,241,227,198,141, 67, 80, 80, 80,104,114,114, 50, 9, 11, 58,214,250,251,251,143, 23,139,197, 99, 77, 38, 83,192, -200,145, 35,201,247,223,127,223,198,205,205, 13,169,169,169,208,235,245, 32, 73, 18, 34,145, 8, 9, 9, 9,236,193,131, 7, 75, - 68, 34,209, 20, 11, 34, 44,112,113,113,241,136,140,140,140, 5, 0, 39, 39, 39, 79,150,101,225,236,236,236,217,169, 83,167, 88, - 0,112,116,116,244,168,201,136,213,106,128,105, 58,230,113, 90, 90, 96, 68,231, 8,197,185,235,119,226,222,120,125, 64, 55, 82, - 64,146,143,210, 84, 49,174,206, 78,214, 23, 47, 93, 40,165,105, 58,198, 18, 45,161, 80, 56, 32, 50, 50, 82, 80, 84, 84, 4,165, - 82,137,188,188, 60,100,102,102,194,104, 52, 66, 87, 82, 4,186,180, 20,116, 73, 49, 56, 77, 57, 30,198, 92, 69,176,151,135,228, -120, 69, 39,248,223,235,171,113,214, 20,161, 34, 8,162,234, 59,137,173, 13,172,108,109,171,154, 63, 26,240,112, 28,100,103,103, - 55,189,172,172,236,112, 86, 86,214, 34,131,193, 48,121,201,146, 37,237,190,250,234, 43,151,233,211,167,219, 77,159, 62,125,183, - 84, 42, 13, 73, 75, 75,211,215,234, 80,203,203, 31, 24,141, 70,103, 0,238, 39, 79,158,132,171,171, 43, 74, 75, 75, 97, 52, 26, -161,213,106, 13,142,142,142,210,130,130, 2,232,116, 58, 24, 12, 6,216,217,217, 33, 54, 54,182,208,100, 50,253, 89, 95,250, 28, -154,146, 11,245,198,187,115,157,154, 91,103, 50,156,115,151, 50, 45, 91, 52,127,133,106, 33,128, 21, 81,126,126,155, 13,236,217, -148,228,219, 7, 28, 83, 98, 78, 23,102,221,211,248,253,120, 56,165,172,158,135, 47, 75, 16, 4,215,172, 89, 51,228,229,229,129, -162, 40, 88, 91, 91,195,198,198, 6, 65, 65, 65, 72, 79, 79,111,180,193,170,110,174, 78, 92, 62,132,252,114, 21, 54, 47,223, 1, - 15,185, 23, 9,192, 53, 51, 59,189,215,184,105,195, 58, 60,182,123,180,228,209,197,226,165,117, 84,116,110,168, 84, 42,187, 39, -194, 47, 74,101, 55, 71, 71,199, 83, 52, 77, 35, 53, 53, 21,199,143, 31,239,154,153,153,217,160, 2, 36, 51, 51,243, 33,199,113, - 81,175,191,254,250,182, 86,173, 90, 53,229, 56, 14, 65, 65, 65, 24, 52,104, 16,246,236,217,131, 59,119,238,160,180,180,148, 61, -127,254,252, 86,149, 74,213,168, 14, 57,114,185,188, 89,191,126,253, 46,172, 93,187,214, 49, 63, 63, 31, 58,157, 14,229,229,229, -248,227,143, 63, 16, 17, 17, 1,169, 84,138,213,171, 87,151,154, 76,166,181,117,153, 43,142,227, 14,236,219,183,175,143,159,159, - 31,238,222,189,139,243,231,207,195,213,213, 21, 86, 86, 86, 24, 56,112,160,243,206,157, 59, 39, 7, 7, 7,175, 84,171,213, 11, -251,245,235, 7,134, 97,112,253,250,117, 85,229,168,194, 90,243,168,214,114, 69,167, 3,199,113, 48, 26,141,171, 72,146,124, 51, - 52, 52,180,119, 92, 92,220, 53,188, 36,120,120,120,180, 16, 10,133, 31, 3, 64, 94, 94, 30,138, 89,192,166,176, 98,208,109, 73, -229,227,178,176,176,176,234, 89,227,239,239,255,151, 86,171,157,149,153,153, 89,107,148, 73,169, 84,182,150,201,100,159,116,235, -214,109, 84,255,254,253, 41,154,166,113,232,208, 33,172, 93,187, 22, 81, 81, 81,240,247,247,199,231,159,127,110,175,215,235,103, - 28, 61,122,116,250,185,115,231,142,150,149,149,205,172, 75,243, 57, 81,229, 69, 94, 38,131,197, 85,186,198,138, 35,172,152,138, -161,168,178, 70,227,226,228,228,180,150, 97,152,110,129,129,129, 48,113, 57, 72,125,112, 15,101, 69, 44,140, 6, 61, 88,150, 3, -199, 90,118, 46,216,226,131,176,123,149, 67,233, 57, 2, 52, 77,195,205,205, 13, 75,151, 46, 69, 73, 73,137, 96,220,184,113,190, - 11, 22, 44,184,161,211,233,160, 86,171,161,213,106,161,213,106,235, 52, 88, 34,169,190,149,143,123, 0,202,180,237, 33, 19,139, - 81, 80,170, 71, 81,153, 30,249,197, 58,236, 61, 48, 18,122,173, 6, 38,131, 1, 12,109,130,141,251, 96,248, 59,117, 3,112,223, -162, 9,210,170,130, 40,172, 9,116,102, 52,232,204,104,200,218,204,198,129,213,111, 63,177,159,201,100, 89,147,127,118,118,246, -227,253,251,247,175, 31, 59,118,236,148,215, 95,127, 29, 63,252,240,195, 55, 89, 89, 89, 97,149, 81,132,111, 6, 15, 30,140,132, -132, 4,156, 59,119,110,195,243,170, 45,112, 28,231,236,228,228, 4,146, 36,161,209,104,244,245,153,171, 63,254,248,131, 88,176, - 96,193,209,129, 3, 7,118,154, 60,121,178, 76, 46,151,131,227, 56, 24, 12, 6,100,100,100,128, 36, 73, 20, 23, 23, 99,203,150, - 45,234,235,215,175,115, 98,177,248,146, 80, 40,252, 32, 33, 33, 33,171,190,190, 67,142,142,142, 24, 57,114,164,107,251,246,237, - 93,171,143, 24,124,243,205, 55, 93,195,194,194,170,190,243,244,244,180,248,248,116, 58,221,150,197, 11,231,118,251,117,251,174, -160,102, 65,254,142,135,143,159,142,115,118,182,179,242,245,245,147,148, 20, 23,235,215,174, 90, 46, 80,171,213, 63, 89, 40, 23, -236,226,226,130,236,236,108,220,191,127, 31,122,189,190,162, 9, 71, 83, 14, 67,113, 49,232,146, 34, 64,167,133,152, 97,160,207, -207,129,175,159, 47,240,159, 17,134,117, 63, 49,170,153,169,167,155, 4, 9,130,128,149,189, 29,196,214,214,160,132, 2,139,251, - 96,201,229,242,182, 33, 33, 33,187, 54,109,218, 36,154, 58,117,106,135,171, 87,175,174, 77, 75, 75, 75, 19, 8, 4, 61,150, 47, - 95,126,109,209,162, 69,146, 81,163, 70, 53,219,184,113,227, 24, 0, 27,235, 56,135,187, 14, 31, 62,252,150,183,183,183,251,237, -219,183,161,211,233,192,178, 44,250,246,237, 11, 0, 82,243,126, 73, 73, 73, 90,173, 86,155,147,144,144, 80,150,150,150, 70,195, -130, 81,127, 95,174,203,186,242,105,222,185, 55, 20, 10,229,101,177,196,167, 9,169,137, 29,252,233, 80,143,111,191,251, 35, 83, -119,244,225,195,178, 57,189,154, 44,213,148,221,158,228,232,169, 94,183,254, 80,138, 37, 29,220,171, 70, 11,186,184,184, 84, 53, - 9,138, 68, 34,115,244, 5, 37, 37, 37,245, 53, 17,214, 88,120,151,148,148,160,164,164, 4,247, 30,221, 69, 94,153, 10,209,191, - 95, 6,195, 48, 85,209, 17,165,187, 39, 78,252,126,205,182,235,208,118,179, 74, 91, 21,159, 46,188,133, 24, 75,175, 83,146, 36, - 63, 25, 50,100, 8,104,154,198,160, 65,131,176, 99,199,142, 79, 26, 83, 67,207,202,202,186,146,149,149, 21,112,255,254,125, 59, -163,209,248,218,192,129, 3,127,238,215,175, 31, 46, 95,190,140,147, 39, 79,118, 53, 24, 12,201, 12,195,104, 21, 10,197, 18,142, -227,220, 8,130, 88,162, 82,169,234, 28,237, 28, 16, 16, 48,202,214,214,118,177,149,149, 85, 89,211,166, 77,149,230,200,149, 90, -173,134,201,100, 66, 70, 70, 6,142, 28, 57,162, 58,124,248,176,138,227, 56, 89,121,121,249,188,244,244,244, 63,106,107, 22, 44, - 47, 47,223,127,240,224,193, 40, 63, 63, 63,156, 61,123, 22,203,150, 45, 67,211,166, 77,177,117,235, 86,132,135,135,195,215,215, - 23, 78, 78, 78, 31,151,150,150,118, 90,182,108, 89,191,208,208, 80,236,219,183, 15,185,185,185,107,234,122, 62,213,245,156,213, -106,181,224, 56, 14,221,187,119, 31, 63,117,234, 84, 12, 28, 56,240,120,219,182,109,219,199,198,198,222,251,183, 23,210, 10,133, - 98,105,247,238,221,167,183,110,221, 26,219,183,111,135, 62, 44, 18,214, 91,255,196,237, 1, 17,224, 0, 40,183, 30,168,104,175, -123,173, 98, 64,135,111,143,161,152, 62,125,122,191,193,131, 7,123, 3,104, 81,139,230,183,163, 70,141,154,246,246,219,111, 35, - 46, 46, 14, 27, 55,110,196,141, 27, 55,170,202, 60,163,209,136,196,196, 68, 36, 38, 38, 66,161, 80, 96,192,128, 1,196, 7, 31, -124,208,183,111,223,190,174,168,232, 22,241,255, 29,197,234,250, 50, 53, 17,214,234, 26,221,221,221, 93, 28, 29, 29, 19,214,174, - 93,235,220,161, 67, 7,202,100, 50,225,228,169, 83,248,236,163,113,136, 26, 48, 9, 58,189, 24, 38, 29, 1, 70,100, 99,217, 47, -218, 13, 64,233, 57, 2,172, 77, 63, 24, 12, 6,140,223, 33,130, 3,145,131, 85,239,184, 3, 0,161,213,106,161,215,235,161,213, -106,161, 86,171,161, 86,171,193, 48, 76,173, 79,201,178, 98,107,154, 54,178,200,204, 77, 67,134,234, 54,236,109,188,193,145, 94, -200, 41,212,128,128, 27,140,186, 36,176,149, 55,166, 94,155, 1,181,254,217, 76, 49, 83,150, 82, 67,100,198,242, 62,149, 12,195, - 44, 94,190,124,249,248,181,107,215, 74, 38, 77,154,212,118,209,162, 69,175, 1,192,251,239,191,223, 86, 42,149, 98,221,186,117, -122,134, 97, 22, 63,167,252,165, 72,146,252,228,213, 87, 95, 69,105,105, 41, 18, 18, 18, 14,213,247, 15,179,103,207,158, 56,100, -200,144, 78, 11, 22, 44,144,233,116, 58,104, 52, 21,205,159, 37, 37, 37, 80,171,213,200,201,201,193,180,105,211,138,104,154,158, -240,232,209,163, 61, 13, 48,122, 56,120,240, 32,126,253,245,215, 39, 70, 12,190,249,230,155,174, 59,118,236,200, 93,189,122,117, - 38,199,113,156,147,147,147,231,208,161, 67,221, 44,109, 33, 84,169, 84, 90, 0, 83, 22, 45, 94,244,219,183,203,151,187, 21, 22, - 20, 37,139,196, 86, 58,153,149,196,105,250,103, 11,185,156,156,156,105,185,185,185, 26, 75,211, 89, 84, 84,132,148,148, 20, 88, - 89, 89, 65, 36, 18,129,209,148,131, 85,171,161, 47, 42, 0,105,208, 67,194, 48,112,146, 73,224,229,238, 14,111, 55,203,250,226, -171, 78, 31,199,145,225, 3,158,104, 22, 36, 8, 2, 71,195,155, 65,108, 99, 13,169,141, 13, 34,247,159,175,168, 48,136, 68,192, -170, 77,150, 52,227,184, 40, 20,138,131,107,214,172, 17,229,231,231, 35, 33, 33, 33, 62, 45, 45,173,196,209,209,209,214,104, 52, -178,247,238,221, 59,145,148,148, 52,192,215,215, 23, 28,199,213, 55,250,107,197,222,189,123,123, 69, 68, 68,152,124,125,125,173, -243,242,242,188,139,138,138, 8,149,234,201, 62,204, 49, 49, 49,210,199,143, 31,107, 88,150,221, 87,105,174,234,189,240, 63, 29, -234, 33,189, 20,135, 41, 93, 92,124, 91,219,187,182, 70,190,241, 70,235, 43,241,217, 83, 62, 29,234,177,250,187, 63, 50,117, 12, -161,255,153, 49,166,123, 9,164,186,109, 13,105, 66,224, 56, 14, 49, 49, 49, 56,127,254, 60,206,159, 63,143,212,212,212,170, 29, -236,237,237, 17, 29, 29,141,110,221,186, 89,124,163,104, 52, 26, 40, 20, 10, 56, 56, 56, 96,223,153, 95,240,227,183, 59,170, 58, -186,155,201,207,207,135, 76, 38,195,226,207, 86,218,140,251, 98,232,194, 66,228,247,182, 68,219,211,211,179, 73, 68, 68, 68,127, -119,119,119, 20, 21, 21,193,213,213, 21,237,218,181, 27, 72,211,180,111,110,110,110,163,154,178, 12, 6,195,196,110,221,186, 45, -154, 54,109, 26,140, 70, 35,134, 15, 31,142,148,148,148, 93, 15, 31, 62, 92,229,227,227, 51,101,210,164, 73,238, 46, 46, 46,152, - 56,113,162, 53,128, 55,106,211,105,214,172,217,167, 95,124,241,197,215,163, 71,143,150, 24,141, 70,156, 60,121,178, 42, 74,109, - 50,153,144,150,150,134,121,243,230,169, 74, 75, 75,187,100,102,102, 62,176,160, 18, 57,109,255,254,253,125, 3, 3, 3,113,244, -232, 81, 76,152, 48,225, 47, 27, 27,155, 22,253,251,247,247,182,182,182, 70,124,124, 60,104,154,134, 66,161,112,159, 49, 99,198, -128, 62,125,250,224,196,137, 19, 88,184,112,225, 33,185, 92,190,226,233,107,238,105, 19, 44, 16, 8, 96,124,170, 79, 35, 69, 81, -184,113,227, 6,186,119,239,142,233,211,167, 3, 0, 78,156, 56, 97,215,187,119,239,219, 93,186,116,177, 59,123,246,172,254,223, - 92, 72, 91, 91, 91,143,221,186,117, 43,238,223,191,143, 11, 23, 46,160,160,160, 0, 6,131, 1, 37,108,197,205, 32,169,140, 92, -113, 30, 62, 8,159, 54, 11, 35, 6,188, 1,149, 74, 5,146, 36, 93,234,168,240,141,154, 53,107, 22,142, 28, 57,130,165, 75,151, -162,180,180,180,198,253,172,172,172,208,174, 93, 59,132,132,132, 32, 37, 37, 5, 0, 92, 94,192, 33,191,148, 17,172,218,162, 14, -171,214,175, 95,239, 28, 17, 17, 65,169,213,106,176, 44,139, 78, 29, 59, 98,204, 59, 99,112,108,223, 31, 80, 52,233, 6, 74,103, - 5,147,173,204, 50,131,225,245, 51, 10, 11, 11, 33,145, 72, 32,173,236, 80,122, 51,163, 42,188, 11,157, 78, 87,101,174,204,239, -117, 97, 50,136, 99, 19, 31, 50, 94,165,229, 55,112, 53,246, 87, 24, 13, 6,248, 6,204,132,222,228, 2,107,183,119,161,165, 15, -130, 46,174, 24,185, 43,182,235,138,156,156,124, 0,132, 69, 33,206,154, 10,121, 86,251,247,206,238, 44, 99,185,193,202,205,205, -205, 59,127,254,252,138, 27, 55,110,204,238,219,183, 47,126,252,241,199,165, 28,199,161, 95,191,126,136,137,137, 65,124,124,252, -138,220,220,220,188,231,145,183,114,185,124,203,186,117,235,250,185,187,187, 99,239,222,189,224, 56,174, 94, 67, 36, 22,139,223, -159, 50,101,138,204, 28,197, 16,139,197,208,106,181,200,206,206, 6, 77,211,216,183,111,159,222, 96, 48, 76, 77, 77, 77,221,211, -144,196,112, 28,199,181,111,223, 30, 43, 87,174,204,184,120,241, 98, 91, 0,232,212,169, 83,108, 88, 88,152,235,234,213,171, 51, -175, 94,189,218, 22, 0,218,183,111,127, 61, 36, 36,164, 65,243,184,168, 84,170,140, 27,215,175, 60,208,234,116, 66, 71,103, 39, -141,173,181,152, 43, 45, 43, 35,111,222,140, 83,229,230,230,166, 54, 64, 42, 49, 33, 33,161,101,102,102, 38,210,210,210,192,104, -202, 65,234,245, 32,244, 90,244,232,212, 17, 86,224, 32, 1, 11, 17,107,132,144, 18,160,172,172, 28, 0, 18,235,141,218, 86, 43, - 16,204,230,138, 32, 8, 72,109,108, 32,182,181,129,196,198,230,137,136,150, 37,230,210,202,202,234,183,141, 27, 55, 42, 20, 10, - 5,190,251,238, 59, 40, 20,138, 32,185, 92,174,177,181,181,181,114,113,113, 65, 96, 96, 32,194,194,194,112,250,244,105, 16, 4, - 81, 95,193,104,226, 56,174,247,133, 11, 23,166, 93,186,116,105,152, 82,169, 36, 70,143, 30,141,168,168, 40, 72, 36, 18,104,181, - 90, 20, 21, 21,225,175,191,254, 34, 88,150, 13,173, 52,120, 62, 18,137,100, 7, 65, 16, 25,169,169,169,111, 62, 45,184, 97, 81, - 43,101,153,150, 29, 71,170,173,222,232,210,199,183, 85,247, 62, 61,209, 36,160, 7,186,247, 73, 7,128,165, 46,194, 71,195,151, -205,114,216,231,104, 71,108,189,180,255,196,151,145,125,187,205,153, 79,159, 89, 56,127, 77, 81,189, 81, 44,130, 32,170, 10, 91, -146, 36,107,140, 82, 81, 20, 5,146, 36, 45,123, 38,177, 76, 70,212, 59,157,170, 62, 27, 77,180,139,135,220,139, 52, 71,174, 0, -160,180,180, 20,143, 31, 63,134,209,104,132,179,179, 51,140, 70,186,117, 3, 42, 85, 83,134, 15, 31, 78,232,116, 58, 76,155, 54, - 13,203,151, 47,199,160, 65,131,136,171, 87,175, 78, 1,240, 73, 67,111,108,165, 82,185,124,226,196,137,211,198,142, 29,139,226, -226, 98,156, 58,117, 10,221,186,117,195,250,245,235, 93, 79,157, 58,245,117,120,120, 56, 40,138, 66,116,116, 52,104,154, 78,170, -231,126,255,104,244,232,209,146,244,244,116,136, 68, 34,132,133,133, 33, 35, 35, 3,106,181, 26,185,185,185,248,234,171,175,178, - 75, 74, 74,186,102,101,101, 61,176, 32,105,164,159,159,223,199,254,254,254, 56,121,242, 36, 38, 78,156,120,196,218,218,250,141, -162,162,162, 15,244,122,253,234, 1, 3, 6, 32, 60, 60, 28, 73, 73, 73, 24, 56,112, 32,218,181,107,135, 83,167, 78, 97,250,244, -233,127,201,100,178, 33,245,204,131,117,239,204,153, 51, 45,195,194,194,160, 86,171, 81, 86, 86, 6,161, 80, 8, 7, 7, 7, 36, - 38, 38, 34, 32, 32, 0,211,167, 79,199,202,149, 43, 49,117,234, 84,182,119,239,222, 38,154,166, 69,230, 81,150,255,102,212,106, - 53,167, 82,169, 96,103,103,135,221,187,119,227,214,137,255, 99,239,187,195,163,168,254,175,207,204,236,206,150,236,166,144,190, - 73,168,161, 38, 1, 66, 66,232, 18, 66, 17, 69, 4, 81,145, 34, 69, 4, 20, 41, 74, 83,154, 18,106, 16,164,131, 52,165, 41, 32, - 4, 16,233, 69, 8, 29, 66, 42,164, 16, 90, 72,217,221, 52, 82, 73,182,206,206,188,127, 36, 27,147,144,178, 65,120,191,234,111, -206,243,236,179, 59,101,207,220, 50,229,204,185,247,126,238, 89,156,154,250, 41, 36, 11, 86,129,227, 56,164, 47,157,131,222, 95, - 47, 64,151,152,199, 80,171,213,216,179,103, 15, 72,146, 68,149, 1, 40, 47, 60,219, 10, 10, 10,208,161, 67, 7,220,185,115, 7, -123,246,236,193,218,181,107,203,221, 90,161, 80,136, 94,189,122,161, 95,191,126,120,240,224, 1,182,109,219, 6, 27, 27, 27,240, -120, 57,129, 69, 84,249,174,224,206,176,189, 3, 2, 2,168,231,207,159, 67,171,213, 34, 51, 51, 19,201,201,201,144, 74,165, 80, -102,165,162, 83,243,231,200, 32,244,136,139, 78, 50, 17,148, 48,186, 46, 27,222, 96, 48, 64,175,215, 35, 54, 54,182,116,232,123, -203,144,242,206,207,101,125, 62,160,213,106, 17, 22, 22,198, 73,165, 82,200,100, 50,162,182,182,119,150,209,157,190,116, 61,102, -192,168, 33,189, 69,231,195,126,130, 81,199,224,185,206, 14,197, 90, 61,138, 52, 66,232,197,253, 65, 16, 87, 65, 82, 98,116,235, -208, 28, 23,175, 61,208,154,140,134, 51,150,169, 2, 19, 40,251,246, 48,229,198, 86, 16, 88,149,223,176,104,177, 28, 38,166,126, -163,130, 37, 18,201,170,213,171, 87, 79,253,249,231,159,173, 63,251,236,179, 86,230,135,197,230,205,155,139, 36, 18,201,170,191, - 91,167, 10,133, 98, 84,211,166, 77, 23, 47, 92,184,208,189, 67,135, 14,136,140,140, 68, 72, 72,200,201,140,140,140, 99, 22,188, - 25,123, 56, 56, 56,224,249,243,231, 16,137, 68, 48,153, 76,200,202,202, 66,106,106, 42,196, 98, 49,194,195,195,245,141, 27, 55, - 62,242, 50, 9,179,164, 67,123,197, 17,149,245,129,148,102,253, 23,124, 61,177,133, 86,171,241, 46, 42, 42, 98, 4, 2,129, 64, - 44, 52, 61,169, 15,135, 7,243, 62,169, 0, 0, 32, 0, 73, 68, 65, 84,209,104, 60,113,245,234,213,247,122,244,232, 33, 78,138, -141,134,161,160, 0,198,194,124,208, 38, 6,246,254, 29, 64,234,181, 32,244, 70,184,123,113,208,228,203,112, 61,234,177,209,104, - 52,214,233, 10,154, 5, 22, 73, 81,149,251, 93,217, 88, 67, 36, 47, 21, 88, 21,215, 19,117,180,107, 57, 59, 59, 91,245,236,217, -179,143,159,159, 31, 56,142,195,170, 85,171,160,215,235, 69, 70,163, 17, 70,163, 17, 6,131, 1, 69, 69, 69, 56,124,248, 48,246, -238,221,123,221,214,214,118,151, 74,165,170, 43,153,140,187,187,251, 20,150,101,157, 25,134, 49, 56, 57, 57,209, 7, 15, 30,132, - 68, 34, 1, 73,146,232,208,161, 3, 36, 18,137, 78,161, 80, 24, 0,192,201,201,201,184,122,245,106,193,248,241,227,233,234,200, -124, 59,181,154,101,226, 28, 2, 69,226,198, 77,109,157,218,163, 89,203, 62, 0,128,126, 3,199,161, 89,139,134, 40,200,142,109, -166,215,165, 12,161,136,103, 13,126,185,169, 76,120,195,170,237, 39,207,210,195,146, 0,252,108,233,185,212,167, 79, 31,188,249, -230,155,229,205,129,206,206,206,208,235,245, 96, 24,198, 98,113, 5, 0,230, 32,162,193,193, 32,177, 16,216,213,217, 58, 3, 64, -185, 61, 89, 80, 80,128,180,180, 52,164,164,164,148,223,167, 88,206,178,183,107,133, 66, 33,109,214,172,217, 88, 31, 31, 31, 92, -188,120, 17,177,177,177,202,203,151, 47,187,119,234,212, 9, 30, 30, 30,159,112, 28, 55,175,204,133,181, 8,142,142,142,178,206, -157, 59, 79,253,228,147, 79,112,255,254,125,124,243,205, 55,207, 50, 50, 50,142,158, 56,113, 98,252,244,233,211,201,192,192, 64, -100,101,101, 97,235,214,173,166,240,240,240, 31, 26, 52,104,176, 56, 35, 35,163,182,114,124,162, 82,169,154,104,181, 90, 60,123, -246, 12,230,144, 12,103,206,156,193,217,179,103, 51,243,243,243,123,169,213,234,135,150,164,173,113,227,198,214,254,254,254, 46, - 73, 73, 73, 56,112,224, 0, 12, 6,195,130,148,148, 20,131,141,141,205,175,155, 55,111, 94,232,233,233,105,223,179,103, 79,116, -235,214, 13, 28,199,225,248,241,227, 8, 14, 14, 62, 41,149, 74,223, 79, 72, 72, 48,212, 65, 63,100,201,146, 37, 75, 28, 29, 29, - 63, 26, 57,114, 36,233,239,239,143,136,136, 8,152, 76, 38,244,233,211,167, 92, 92,157, 57,115,102,223,153, 51,103, 62, 4, 64, -203,229,114,201,191,221,189, 50, 67,171,213, 34, 41, 41, 9, 46, 46, 46,104,209,169, 43,190,185,151,140,171, 55,110,130,227, 56, -244,136, 75,198,243,231,197,216,181,107, 23, 34, 35, 35, 65, 81, 20, 60, 61, 61,235,228, 52, 24, 12,120,248,240, 33,178,179,179, - 49,120,240, 96,124,252,241,199, 88,185,114, 37, 12, 6, 3,230,207,159,143,220,220, 92,108,223,190, 29, 15, 31, 62,132, 64, 32, -128, 92, 46,255,255,145,213, 26,181,200,127,210,193, 2, 74,219,190, 89,150,133, 74,165,194,157, 59,119,144,156,156, 12,153, 76, - 6, 13,195,178, 27,111,197,176, 36, 33, 84,154, 56, 92,227, 24,124, 93,151, 18, 55, 26,141,132, 64, 32,192,141, 27, 55,240,232, -209, 35,216,180,224,202,221, 43,163,209, 8,157, 78,135,146,146, 18, 8,133,194,231, 55,111,222,124, 26, 17, 17,209, 76, 32, 16, -212, 56, 10, 44,171, 37,181,251,252,133, 63,103,249,119,240,110,213, 55, 48, 24, 39, 78,124,135,252,194, 66, 20,235, 4,120,174, - 49,160, 88,203,193,205,186, 57, 58,183,247, 67,246, 51, 61, 30,196, 69,166,231,208,246,117,182,193, 24, 77,100,193,190, 77,159, -217, 14,250,240, 11, 72, 92,123, 66,159,124, 16,172, 38,179, 92, 96,209, 18,107,216, 56, 54, 66,225,115, 13,174, 39, 60,129,209, - 68, 22, 88, 90,232,201,201,201,133, 58,157,110,217,245,235,215,191, 55,143,252,185,114,229, 10, 30, 63,126,188, 76,173, 86, 23, -214,167, 2, 21, 10, 69, 95, 0,251, 1, 72,156,157,157, 51, 3, 2, 2, 20,111,190,249,166, 36, 48, 48, 16, 20, 69, 33, 42, 42, - 10,159,125,246,217, 57,185, 92,254, 62, 44,136,137, 35, 18,137, 50, 11, 10, 10,108,197, 98, 49,140, 70, 35, 50, 50, 50,112,255, -254,125,104, 52, 26,100,102,102,130, 32, 8, 85, 88, 88,152,166,190, 39,154,121,132, 86,213,135,100,117,226,185,158,163, 8,225, -238,238, 30, 24,208,185, 83,219, 31,214,108,128,166,228, 57,194,111,158, 64, 94,110, 14,182,237, 56,210,206,221,221, 61,208,210, -206,196,233,233,233,191, 29, 57,114,100,166,175,143,143,159,103,195,134,184,155,146, 12,154, 53, 65,100, 50,129,210,107, 65,154, -116,240,104,203,129, 36,229,200,204, 40,194,150,115, 23,239,149, 69,117,175, 61,125,111, 15,194,136,148, 2, 16, 4,129,115,111, -120, 67, 34,151,131,150,203,208,237,112, 88,185,168,122,186, 98, 54,104,153, 28, 13, 2,234, 14,140,153,149,149, 85,114,253,250, -245,136,196,196,196,128,214,173, 91, 99,209,162, 69, 72, 75, 75, 3,199,113,200,202,202,210,102,103,103, 43,159, 61,123,246,148, - 32,136,163, 42,149,106, 7, 44,140, 22,206,178,172,243,241,227,199, 1,128, 6,128, 63,255,252, 19,110,110,110,176,181,181, 69, - 97, 97, 33, 70,143, 30, 45,254,246,219,111, 1, 0, 81, 81, 81, 66,137, 68, 82, 35, 87, 92,244,253,213,121,133, 92, 30, 89, 28, -249,126, 14, 19,221,174,119,255,116,244, 27,248, 9,206,159,216,133,139,103, 47,192, 81,152,252,196, 36,125,126, 58,251, 73, 78, -145,186,184,229, 86,239,142,227, 41,213,243,179,219,190, 24,148, 36,240, 80,176,135,230,110,169, 61,112, 47,199,113,160, 40,234, -133, 14,237,245, 21, 87, 21, 17, 28, 12, 22, 11, 65, 52, 19, 10,162,149, 25,105,253,221, 92, 60,202, 95, 46, 82, 83, 83,145,150, -150,134, 22, 45, 90, 32, 57,229, 49, 68, 34, 58,218,194,243,126,228,192,129, 3,173,245,122, 61,126,255,253,119,134, 32,136,129, -199,143, 31,143,240,245,245, 21, 4, 5, 5, 89,239,218,181,107, 36,128, 29,245,105, 49,146,203,229,180,209,104,196,238,221,187, -161, 84, 42, 3, 51, 51, 51, 19, 56,142,219,250,249,231,159,255,232,229,229,213, 34, 33, 33,225,129, 70,163,249, 66,173, 86,199, -214,214,228, 6, 0,249,249,249, 99,222,122,235,173, 67, 44,203, 54,238,222,189,187,108,196,136, 17, 54, 28,199,193,203,203, 11, -167, 78,157, 82,169,213,106,139,251, 48,165,164,164, 20, 93,189,122, 53,211,219,219,219, 69,161, 80,128,166,233, 21,174,174,174, - 75, 41,138,250,225,221,119,223,181, 63,120,240, 32, 66, 67, 67, 33,147,201,240,228,201, 19, 85, 98, 98,226, 58, 87, 87,215,245, -150, 68,112,143,138,138,122, 2, 96, 68, 64, 64, 64,240,218,181,107, 23,144, 36, 57,234,220,185,115,229,177,206,204,226,170,105, -211,166, 99, 66, 67, 67, 63,254,143, 25, 33, 70,189, 94, 15, 7, 7, 7,100,103,103, 35, 43, 43, 11,141, 26, 53, 66,215,174, 93, - 97, 52, 26,113,236,196, 73, 92,189,122, 21, 28,199,193,209,209, 17, 54, 54, 54,136,137,137, 1,128,218, 70, 15, 27, 13, 6, 3, -236,237,237,145,159,159,143,152,152, 24, 56, 59, 59, 99,198,140, 25,208,235,245, 56,120,240, 32,162,163,163, 65,146, 36,156,156, -156, 96,109,109,141,232,232,232,186, 56,121,212, 87, 96, 81, 20,117,233,210,165, 75, 31,182,111,223, 94,240,224,193, 3, 60,120, - 80,122,189,105, 52, 26, 70, 64, 33, 52,235,238,177, 17,181,252,189, 45, 42,196,202, 16,137, 68, 91, 62,252,240,195, 47,198,141, - 27,135,201,147, 39,131, 36, 73,252, 28,165, 67,106, 42, 11,131,193,128,204,204, 76,220,189,123,151, 11, 8, 8, 32, 88,150, 53, -244,234,213,107, 66,100,100,100, 39,138,162, 10,107,226, 68,104,168,137,105,251,238,224,205, 91,118,220, 24, 59,118,172,253,160, -193,155, 17, 21, 31,135,252,226,210, 86, 38, 55, 71, 25, 58,183,158,141,172,103, 58,156, 61,125, 34,143,101,180, 31, 32,238, 55, - 99,109,233, 4,128,236, 18,141,243,214, 61, 71, 86, 29, 56,124,116,194,196, 49, 35, 36,189,122,141,129,176,232, 46, 76,207, 34, -225,214,178, 59, 8,202, 10,183, 99,162, 16,251, 48, 77, 91,162,165,118, 20, 26, 52,179,235,226,172,228,165,147,228,198,237, 91, - 54, 44, 63,115, 62,140, 50, 24, 12, 24,240, 86, 31, 19, 73,146, 27,235,168,142, 23, 56,173,172,172, 14,196,196,196,216,235,116, - 58,164,167,167, 55,107,213,170, 21, 56,142, 67, 74, 74, 10,214,173, 91,199,156, 58,117,106,179, 68, 34,249,166,150, 55,196, 74, -156, 70,163,113,255,238,221,187,231, 78,153, 50, 69,146,149,149,133,196,196, 68, 20, 23, 23,195, 96, 48, 32, 50, 50, 82,107, 52, - 26, 15, 88,112, 94,189,144, 78,179,192,178,183,183,119,239,220,185,179,121, 20,161, 59,203,178,104,208,160,129, 71, 64, 64, 64, - 4, 0,216,218,218,214, 52,138,176,198,242, 84, 42,149,151,195,194,174, 98,247,142, 53, 48, 24,116, 80, 43, 75,157,134,156,103, - 5,168, 67, 92, 85,229,228,180, 90,237,251,107,215,173,187, 53,105,204, 40,215, 55,122,247, 65, 90,108, 12,244,185,217, 32, 77, - 12,132,156, 0, 37, 89, 82,100,102, 62,199,242, 83, 23,178, 52, 90,109,117,162,181,218,116,150, 55, 11,218, 88, 67, 44,151, 67, - 84,230, 90,153,183,137,228,214, 16,202,228,160,104,186,186, 38,175, 23, 56, 75, 74, 74, 62,152, 56,113, 98,236,169, 83,167, 26, -140, 24, 49, 2,131, 6, 13,138,202,207,207, 15,202,203,203, 43,178,240,218,127,129,147, 36,201,172, 1, 3, 6, 56,235,245,122, -102,216,176, 97,130,156,156, 28,152,135,216, 23, 21, 21,225,244,233,211,104,221,186,116,214,153,184,184, 56,120,123,123,215,200, - 57,225,155,123, 74, 0, 75,166,127,232,254,195,173,152,140,105, 0, 86, 52,107,225,129,139,103, 47,224,234,197, 27,115,186,180, -101, 55,188, 51,178,211, 98, 73,239,143,102,123,251,143,167,228, 54, 10,236, 57,114,152,138,143,252,105,153,182,248,158, 39,182, - 28,153, 93, 83, 58, 9,130, 0,199,113,149,196,149, 64, 32, 64, 73, 73,137,165,226,170,230,107,147, 0, 87,232,147,183, 96,236, -140,161, 93,255, 60,112,219, 90, 38,147,149,247,249,105,222,188, 57, 4, 66, 1,126, 62,186,177, 56, 63, 63,231, 91, 75, 56,101, - 50,217,148,160,160, 32, 60,126,252, 24,177,177,177,135,213,106,117, 44,199,113,135,159, 60,121, 50,172, 83,167, 78,248,237,183, -223,166,212, 34,176,170,229, 52, 71,172, 47,115,123,115, 1, 64,173, 86,199, 0,232,242,232,209,163,122,229,189, 44, 88,104,247, -178,114, 77, 27, 50,100,136, 13,195, 48, 40, 19,207, 14,245, 60,151, 88,181, 90,189, 62, 60, 60, 60,164, 67,135, 14, 24, 62,124, -120,191,136,136,136,126,190,190,190,240,244,244, 68, 94, 94, 30,194,194,194,126, 97, 89,246,115,181, 90,173, 5,192,213, 34, 0, -171,205,251,157, 59,119, 30, 2, 24,237,231,231,247,145, 64, 32,128,141,141, 13,165, 84, 42,169,115,231,206, 1,192,196,208,208, - 80,211, 75,213,251,203,227,181,115, 18, 4, 49,127,204,152, 49, 91, 63,251,236, 51, 73,167, 78,157, 80, 80, 80, 80, 46,250, 79, -157, 58,133,178,145,216,112,112,112,192,195,135, 15,113,244,232, 81,125, 65, 65,193, 58,154,166, 87,212,198, 57,122,244,232, 74, -156,102,241,118,226,196, 9,152, 7,145, 56, 56, 56,224,193,131, 7, 56,114,228,136,182,160,160, 96,141, 94,175, 95,249,154,243, -254,127, 75, 96,229,230,230,126, 57,119,238,220,160, 79, 63,253,212, 65,163,209, 80,142,142,142, 80,169, 84,204,217,179,103,115, -139,138,138,190,172,207,193,110,222,188, 57,249,157,119,222, 89,183,115,231,206,237,219,183,111, 15, 28, 62,124, 56, 70, 15, 24, -128, 47,186,202,160,211,233, 64, 16, 4,206,158, 61,123,255,210,165, 75,205,104,154,214, 5, 7, 7,179, 0,110,213,197,251,236, -222,241, 7, 84,219,247, 2, 55,108,252, 49,212,175, 99,151,198, 77,154, 54, 17,119,111,104, 11,131,209,132,204,172,103,184,124, - 35, 94,247, 32, 62, 38,141, 53,232,135,102, 39,212, 29,197, 29, 0, 18, 18, 96, 0,138,190,244,242,178, 94,180,114,203,190, 45, -123, 15, 29, 30, 50, 97,248,251, 2,255,118, 65, 72,206, 56,134, 43, 17,151,152,188, 34,238,104,145,158,154,148,144, 80,148, 87, -223,130, 87, 42,149, 90,137,144, 43,208,106,181,246,201,201,201,200, 84,171, 10,149, 74,149,246,101,154,221,116, 58, 29, 30, 63, -126,140, 11, 23, 46, 32, 42, 42, 10,215,175, 95, 55,156, 59,119,110, 39, 73,146,203,106, 9, 52, 89,253,149,221,182,237,247, 63, -253,244,211,135, 38,147,201,179, 87,175, 94, 18,123,123,123,228,228,228, 32, 60, 60, 92, 31, 29, 29,253,184,109,219,182, 43, 95, -246,100,115,117,117,197,208,161, 67,157,253,253,253,157,205, 35, 6, 27, 54,108,136, 15, 62,248,192,217,215,215,183,124, 93,163, - 70,141, 80,159, 80, 13,238,238,238,129,189,122,189,129,177,227,167, 67,163,121,142, 91, 55, 78, 32, 63, 55, 7, 55,239, 36, 65, -103, 64, 96,125,134,195,151,141,222,236,178,116,221,134, 35,111,117, 14,240,106,229,230, 42,118,104,218, 4, 50, 39, 87,228, 62, -123,134, 91, 49,143,140,155,206, 95,190,167,209,106,223,183,116,164, 39,203,178,229,163,220,188,167,205, 1, 73,146,229,179, 32, -152,183,219,116,236, 1, 82, 32,132,137, 3, 12, 6, 67,157,238,157, 90,173, 78, 39, 8,226,131,169, 83,167,254,185,123,247,110, -178, 87,175, 94, 29,254,248,227,143,191, 53,105,174, 82,169,244, 40,115, 69, 11,109,108,108, 4,159,124,242, 9,140, 70, 35, 74, - 74, 74, 80, 88, 88,136,103,207,158,233,190,250,234, 43, 49, 0,208, 52,109,124,235,173,183,234,188,127,172, 13, 85,106,167,127, -232,190,193, 81,152, 60,172, 32, 59,182,153,163, 48,249, 73,151,182,236,134,181,161, 74,173,179, 93,201, 82,101,118, 88,146,234, -249,217,109,123,142, 28,166,198, 12,249,192,164,144, 63,152,227,216, 16,135, 44,186,121, 85, 17, 88, 47,235, 92,189,112, 63,137, - 67, 84,186,236,113, 72,208,208, 78,243,150,206, 92, 45,119,116,114, 4,195, 48,120,146,250, 24, 59,143,108, 42, 46,210,229, 45, -203, 77, 64,132, 37, 92,205,154, 53,107, 74, 81, 20,142, 29, 59, 6, 0,230,208, 6,155, 78,159, 62, 61,108,228,200,145,104,212, -168,145, 55,203,178,226,218,194,104, 84,231,222, 25,141,198,122, 55,163,215,217, 54, 67, 16,143, 99, 98, 98,220,221,221,221,137, - 3, 7, 14, 60, 55, 24, 12,193, 47,113,141,175, 62,121,242,228, 27, 28,199,189,229,231,231,135,198,141, 27, 3, 0,226,227,227, -113,245,234,213,253, 74,165,114, 44, 94,205,228,206, 28, 65, 16, 40, 44, 44, 52,199, 53, 49,200,229,242,255,228,164,209, 42,149, -106, 47,195, 48,103,131,131,131,191,107,222,188,249,231, 19, 39, 78,164, 90,181,106,133,130,130, 2,216,216,216, 64,161, 80, 64, -169, 84, 98,239,222,189,166,172,172,172,157, 36, 73, 46, 82,171,213,170,151,229,108,208,160, 1, 20, 10, 5,210,211,211,205,156, -219,141, 70,227,226,156,156,156, 76,240,168,223, 53,101,201, 78,101, 97, 26,214,155, 76,166, 32,179,171,149,155,155,251,101,102, -105,143,241,151, 82,247,239,188,243, 78,243,156,156,156,237, 6,131, 33,112,208,160, 65, 24, 62,124, 56,222,125,247, 93, 12, 31, - 62,156, 50,187, 86,127,252,241, 71, 98,189,222, 24,202, 38,123, 38, 41,122, 32,199,113,237, 1, 16, 4, 73, 90, 50,217,115,157, - 74,188,131,151,181,167, 84,204,238,144,138,216, 30, 26, 61,121, 77,163, 35, 39, 68, 39, 20, 61,254, 59,111, 54,101, 19, 59,255, - 10, 0, 58, 35, 55, 42, 61, 93,125,190,190,229, 89,214, 68,120,128, 32, 8,138,227,184,141, 28,199, 29, 80, 40, 20,143, 45,177, -221,171,114,114, 28, 71, 2,165,193, 69, 47, 92,184,240, 29, 65, 16,163,116, 58,157,147, 88, 44,206,230, 56,238,151,190,125,251, - 46,222,176, 97,131,177,150, 27, 52, 91, 83, 58, 61, 60, 60,246,185,185,185,181, 44, 59, 78,165, 62, 87,230,111,243,250,178,120, - 68,143,148, 74,229, 72, 75,203,211,179,153,251, 89,207,166,238,111,122, 54,117, 3, 0, 60, 78, 86,225,113,178,242,220,227, 39, -202,254, 47, 89, 71,229,147, 61, 19,101,161, 24, 56,203, 38,123,174,196,233,237,237, 29, 65, 81,148, 71,125, 46, 74,150,101, 85, -113,113,113,126,150,164, 83,161, 80,140,104,216,176,225, 10,149, 74,117, 36, 61, 61,125,250,171,120,243, 86, 40, 20,221, 72,146, - 60,197,178,172,180,170,195,101, 22, 97, 53,116,114,175,145,243,251,121, 62,223,118, 15,124, 99,200,245,203, 87,143,126,179, 60, -110, 73,197,109,147,223,107, 48,110,228,228, 47, 87,238,219,188,254,235,205,191,231,237,172, 43,157,237,218,181, 11, 3,208,210, -236,102,213, 6,147,201,164,138,139,139,235,248, 50,174,131,125, 59, 4,216,201, 28,151,232, 13, 6, 95,146, 0, 39,164,233,152, -252,252,156,111,107, 16, 87,213,114,186,187,187,175,104,209,162,197,151,143, 30, 61,218,159,158,158,254,105,133, 50,254,161, 73, -147, 38,147,211,210,210, 54,165,167,167,207,182,180,142,154, 54,109,106,227,235,235,155,183,104,209, 34,114,225,194,133, 8, 15, - 15,183, 87, 42,149,121,175,162,222, 27, 53,106,228, 42,145, 72,246,176, 44,235,105, 50,153, 54, 63,121,242,100,245,203,112,122, -121,121,209,249,249,249, 95, 54,108,216,112,134,139,139,139, 75,102,102,102, 74,106,106,106, 72, 70, 70,198, 79,245, 16, 87,117, -214,145,159,159,159, 14, 40,157, 78,204,194,254, 86,255, 74, 7,171,202,249,228,201,178,236, 50, 95, 95,223, 15,199,141, 27, 71, - 36, 36, 36,224,252,249,243,120,250,244,233,209,178,254,124, 15, 94, 5,231,217,179,103,185,148,148,148, 67, 36, 73, 46, 80, 42, -149,143,255, 63,230,157, 71, 61, 79,148, 90,241,206, 59,239, 52,239,212,169, 83, 88,187,118,237,216,118,237,218, 21,189, 10,206, -215,145,206,191, 52,156,163,236, 85,115,190,142,116,190, 12, 39,199,113,228,223,249,252, 19,242,222,162, 69, 11, 14,150,207,191, -246,175,171,163,127, 43,231,150,165,237,220,110, 95,248,104,237,142,239,219,190, 48,121,121,240,212, 6,214,127, 30,123,127,101, -240,212, 6,214,255,209,242, 36, 95,242, 5,183,109,245, 47,102, 13,183,190,247,222,123,166,134, 13, 27,110,255,135,231,157,104, -220,184,177,152,191,142, 94, 61,167,139,139, 75, 71,133, 66,113, 92,161, 80, 28,119,119,119,239,244,138, 57,127,119,117,117,245, -251, 31,229,157,199,235, 56,249,222,125,247, 93,231,247,222,123,207,158,191,240,120, 78,158,147,231,228, 57,107,231, 84, 40, 20, - 82,190, 60,121,206,255, 32,231,127, 10,130,127, 74, 66,142, 31, 63,158,197, 87, 7, 15, 30, 60,120,212,141,250,132,118,224,193, -131,199,255, 6, 68, 45, 42,180, 62,109,171, 47,163,100,239,241,156, 60, 39,207,201,115,242,156, 60, 39,207,249,127,142,179, 46, -110,190,111,215,107, 18, 94, 60, 39,207,201,115,242,156, 60, 39,207,201,115,254,223,227,252, 79,129,228,139,128,199,235,198,134, -241,112,223, 48, 30,238,175,107,127, 30, 60,120,240,224,193,227,159, 6,193,127, 45, 67,254,254,254,222, 28,199,141, 36, 8,226, - 67, 0,224, 56, 46,148, 32,136,125,145,145,145, 22, 69,160,149, 72, 36, 25, 90,173,214,185,236,119,150, 86,171, 85, 84,216, 76, - 84,248, 0,165,163,213, 42,126,170, 69,211,166, 77, 51,116, 58,157, 37,243,235, 69, 19, 4, 17,197,178,108,164, 92, 46,191,246, -240,225,195, 36, 75,243,221,183,111,223,207,101, 50,217,183, 26,141,102,229,185,115,231,214,255,127, 40,234,206, 13,221, 92,119, - 25, 25, 3,155,145,149, 59, 31, 64,181,211,240,108, 30,135, 16,130,195,236,178,223,171, 38,239,196,220,218, 72,235,187,127, 45, -232, 40, 20, 10,167,184,184,184,188,157,158,158, 30, 1,224,107,240, 81,136,121,240,224,193,131,199, 63, 81, 96,117,241,179,111, - 69,176,134,217, 66,138,123,195,104, 34,174,114, 36,189,234, 86, 84,110,210,223, 73,128, 66,161,104, 72, 16, 68, 47,142,227,188, - 72,146,188,203,178,236, 57,181, 90,253,172, 62, 28,126,126,126, 13, 1, 12, 7, 48,162,115,231,206,109, 39, 77,154,132, 22, 45, - 90, 64,171,213, 34, 60, 60,124,206,175,191,254, 58,135,227,184,123, 40,157, 82,230, 64, 84, 84, 84, 90, 77, 92, 90,173,214,217, - 28,155,137, 32, 8,231, 15, 63,252, 48,188,194, 36,188,132,121,114, 89,142,227,110, 1,184, 73, 16,196,141,223,126,251, 45,189, -149,147,164, 75,147,134, 78,239,156,137, 76,157, 95,149, 83,167,211, 57, 71, 31, 63, 10,142, 49,225,185, 50, 21,205,223, 31, 94, -190,237,252,251,125,192, 21, 23, 66, 40,166,163,131,254,184, 17, 5, 32, 50, 53, 53, 53,170,113,227,198, 73,181,113, 86, 69,135, - 14, 29, 22, 7, 7, 7, 59, 14, 26, 52,104, 10,128, 26, 5, 86,125, 56,107,129,184, 75,199,246,151,142, 31, 62, 32, 1, 65,226, -189, 33, 31,238,191, 30,121,111, 52,128, 74, 19, 64,111, 30, 11, 23,130,192,236, 73, 95, 77,162, 0,224,199,117, 91,190, 94,251, - 49, 54, 76,255, 21, 25,110,110,110, 65, 28,199,125, 93, 86,206, 43, 85, 42,213,165,205, 99,225, 2,224,155, 73, 95, 77, 34, 0, - 96,203,186, 45,179, 55,143,197,250,201,187, 81,223, 0,119, 95,140, 29, 59,118,195,178,101,203,168,178, 32,124,111,121,123,123, -183, 42, 44, 44,244, 6,192,119, 14,230,193,131, 7, 15, 30,255,123,129,229,227, 99, 99, 39, 37,185, 25, 82, 17, 55,188, 87,183, - 22, 77,223,125,187, 27,209,172,121, 51, 36, 37, 36,121, 94,186,124,231, 19, 49, 21,159,172,209, 19, 7, 52, 44,177, 38, 46,174, -246,249,195, 22,140,135,145, 97, 74,143, 41, 16,192,180,231,156,199,209,160,160,160,166,227,198,141,131,159,159, 31, 34, 34, 34, -130, 14, 29, 58,244,229,201,147, 39,239, 24,141,198, 83, 98,177, 56,172,174, 8,199,126,126,126, 43,220,221,221,191,158, 57,115, - 38,209,177, 99, 71,136,197,127,133, 93,145,203,229,232,211,167, 15,250,244,233,131,140,140,140,182, 97, 97, 97,109,247,237,219, - 23,226,231,231,183, 50, 42, 42,106,142, 37, 5,244,237,183,223,250, 87,179,250, 44, 65, 16,143, 72,146,140,244,242,242, 74,111, -238, 42,107,237,104,111,119,226,251,101,139,112,230,205,177, 53, 10,151,223,251,119, 3,128, 74, 2,203,144,147, 9,137,181, 60, -154,150, 74,163, 0, 68, 2,136,106,220,184,113,180,165,156, 0, 16, 24, 24, 40,190,127,255, 62,193,113, 28, 58,117,234,100, 79, - 16, 68, 18, 73,146,235,207,156, 57,179,165,226,126,245,225,172,203,189, 10,158, 61,153,206,121, 28,141,196, 27,231, 48,216,223, - 93, 18, 21,119,127,169, 86,111, 60, 92,219,159, 8,130, 36,119, 71, 56,206, 1,178,190,100, 89,246,219,132,132,132, 64, 0,240, -242,242, 18, 1,184,180, 39,188,193,128,177,221, 10,254,206, 36,159, 52, 69, 81,155,119,238,220, 57,126,244,232,209, 72, 73, 73, -193,181,107,215, 32,151,203,177,120,241,226, 38, 51,103,206, 12, 97, 24,230, 75,254,178,231,193,131, 7, 15, 30,255, 83,129,213, -195,207, 42, 60,168,107, 19,255, 65,253,187,145, 45,188,188, 65,139,173,202,183,181,243,243, 67, 59, 63, 63, 98,226,196,162,102, - 49, 81, 49, 11,206,252,121,123,158, 45,205, 68, 94,139, 42,169, 49,232, 25,195, 64, 16,178,108, 31, 0, 96,207,142,145, 84, 82, - 82, 82, 83,169, 84, 90, 81, 40, 32, 48, 48,144, 12, 9, 9,233,124,233,210,165,206, 7, 14, 28, 48, 24,141,198,117, 42,149,170, -182,169, 51,190, 62,116,232, 16, 65, 81, 20, 40,138,170,113, 39, 87, 87, 87,244,235,215, 15,174,174,174,196,236,217,179,191, 6, - 80,173,192,146, 72, 36, 89, 4, 65, 56, 3, 64,131, 6, 13, 76,193,193,193, 49, 92, 25, 0,128,101,217, 91, 20, 69,221, 36, 8, -226,214,209,163, 71,149,158,110, 18,119, 57, 45, 62,183,125,235, 70, 24, 11, 51,107,140,227, 85,162, 74, 55,171,140, 74,235, 69, - 50,171,104,145, 76, 22, 37,146,203, 35, 1, 68, 17, 4, 17,109, 41,167, 89, 92, 73,165,210, 43, 91,183,110,109, 0, 0, 83,167, - 78,181, 43, 41, 41,177,155, 48, 97,194, 28, 0,229, 2,171, 62,156,181,192,238,141,174, 29,159,126,240,238, 91, 54,126,157,123, -224, 86,232,143,200,207, 47, 70,113, 81, 9, 88,150,125, 97,230,223,201,187,145,185,121, 28, 86,253,184,118,203, 55, 4, 73, 18, -190,253,191, 70,127,123,110, 90,206, 47,191,196, 1, 16,138, 68,162,178, 34, 33, 4,238,238,238,110,214,110,173, 86,181,232,209, - 26, 91,214,111, 6,199,178, 28,128, 85,245,112,175,156,173,173,173,143,157, 59,119,174,115, 64, 64, 0,110,221,186,133,199,143, - 31, 99,242,228,201,250,201,147, 39,211, 99,198,140, 33,102,204,152, 49,117,229,202,149,161, 0,174,243,151, 62, 15, 30, 60,120, -240,248,159, 9, 44, 9,109, 10, 8,222, 16, 3, 83,241, 35,112,198, 84,112,134,140, 23,246,177,178,107,136, 54,190, 46,176, 18, - 57,145,119, 19,214, 6, 84,217, 92,235, 80, 75,179,184, 10, 93,237,230,163, 41, 86,211, 0, 32,149, 41, 12, 31,204, 80,198, 5, - 4, 4,192,201,201,137,190,113,227,198, 12,160,210,220,100, 85, 57, 9,125,108, 4, 18,223,237,142,230,137,185,176,178,178,130, -249,193,109, 70, 82, 82, 18,174, 92,185,130,148,148, 20,120,122,122, 2, 47, 70, 80, 46,231,212,106,181,174,253,251,247, 15, 91, -185,114,101,207, 21, 43, 86,220,221,191,127,127, 47, 0, 37,213,186,123, 13,109,236, 88,134, 59,183, 99,203, 90, 33,244,197,246, -247,239, 92,175, 49,239, 77,223,253, 0,147,242, 75,155, 30, 15,122,187, 65, 98, 35,135, 88,110, 29,221,239,236,157,114,231,138, - 32,136,104, 75, 57,131,130,130, 62, 17, 8, 4,243, 13, 6,131,237,182,109,219,236,236,236,236,200, 99,199,142, 25,182,110,221, - 90, 68,211,180,158, 32,136,229, 47,147,206,218, 32,164,168, 37, 63, 4,207,182,177, 34, 25, 68,157,250, 5,233, 41,169,136,125, -168, 52,254,118, 53,222,164, 55,154,198, 85,199, 57,121, 39,230,206,120, 79,180, 43, 66,237,121,124,224,194,201, 45,151, 14,114, -129,193, 96,216,145,157,157,141, 9, 19, 38,128,101, 89,244,232,209,163, 59,199,113,202,105,211,166,193,211,211, 19, 59,254,120, - 80, 34, 40,188,221,107,223,197,162, 8, 11,211,217,182,113,227,198,231, 46, 93,186,228,226,238,238,142,176,176, 48,100,100,100, - 64,161, 80, 96,242,228,201,162, 21, 43, 86,236, 41, 44, 44, 28,186,108,217, 50,201,189,123,247, 14,156, 61,123,182, 33, 74,251, -204,189,142,161,192, 60, 39,207,201,115,242,156, 60,231, 43, 6,199,113, 1, 0,156, 0,100, 19, 4,113,167,226,114,217, 46, 78, -101,223, 85,151,115,202,158,249, 21, 39, 47,207, 41,123, 6, 56, 1, 48, 1, 8, 39, 8, 34,239, 85,167,217, 44,176, 2, 1,132, - 1, 88, 4, 32,184,234, 78, 6,101, 24, 68, 77,222, 7, 36, 62,224,244,143,192,234,149,224,132,206, 40, 46,145, 32,231,105, 10, - 18,111,133,130, 99, 74,234, 62,152, 0,204,198,117, 35, 5,214, 86, 0, 45,118, 50, 20, 21, 21, 65, 38,147, 65, 83,172,166,199, - 76, 40,119,182,232, 75,151, 46, 33, 50, 50, 18,110,110,110,117,138, 64, 0,224,244,165,173,136,122,189, 30,122,189, 30, 25, 3, - 58, 65,214,165, 39,242, 70, 77,198,133, 11, 23,144,157,157, 13,154,166, 65,211, 52, 24,134,169, 51,157,100,217, 76,188,102,211, -170,186,125,220,221, 33, 49, 25,141, 39, 54,174, 89,110, 99, 35,183,114,137, 56,247, 59, 82, 82, 50, 44, 42,116,145,204, 10, 34, -169, 85,180, 72, 38,173, 36,174,234,195, 73, 81,212,226,195,135, 15,187,235,116, 58,208, 52,141,208,208, 80,195,238,221,187,227, -138,139,139,223,136,138,138,210,188,138,116, 86,133,131,147,211,201,247, 63,254,108,242,210, 79,251, 65, 83,172,197,209,171,241, -248,243,110,242, 32, 0,215, 0, 20,215,244,191, 53,191,235, 31,186,185, 21,244,153, 48, 97, 66,244,145, 35, 71, 28,127,248,225, - 7,152, 76, 38, 48, 12, 3,134, 97,202,127,155, 76, 38,236,223,191, 31,215,110,199, 79, 83,171,139, 34, 44, 76,150, 91,211,166, - 77, 47,220,190,125,219,201,202,202, 10,231,207,159, 71,126,126, 62,190,248,226,139,114,231, 42, 63, 63,127,248,150, 45, 91, 62, -120,250,244,233, 15, 87,175, 94,125, 6,128, 2,192,128, 7, 15, 30, 60,120,252,147, 80,155, 22,113, 34, 8,226, 4,199,113, 3, - 57,142,235, 11, 64,100, 94, 6, 0,130, 32, 78,148, 61,183, 43, 45,207,153, 51,103, 94, 72, 72, 72,156,121,217,188,207,220,185, -115,125, 86,172, 88,177,188,107,215,174, 7,110,220,184,241, 4,192,107, 19, 88, 97,168,101, 94, 44,221,163, 95,161,123,242, 27, -104, 69, 16, 68,205,134, 65,232,216, 21,105,247,195, 16,125, 97, 13,210, 31, 92, 3,199,154,224,210,176, 77,157, 7, 91,250, 19, -132, 10,133, 34, 82,165, 82, 33, 42, 42, 10,143, 30, 61,130, 68,242, 66,203, 18,254,252,243, 79, 0,128,139,139,139,101,130, 37, -160, 59, 26,198,168,145,230, 91, 58,224,175, 97,140, 26, 0,176,124,238, 92,136, 68, 34,208, 52, 93,190,175,201,100,170,147,143, - 40,235,213, 94,214, 44, 88,221,232, 64, 66,194, 88, 31, 90, 56,103, 74,227,166,158, 45,220,110,159, 60,136, 39, 79,148,200,204, -180,172,126,196,114, 89,180,216, 90, 22, 37,146,254,213, 44,248, 18,156, 7,135, 14, 29,250,201,144, 33, 67,164, 93,186,116, 17, -255,252,243,207,249, 85,197,213,223, 77,103, 69,184,186,186,246,127,231,157,119, 78, 78,156, 56, 17,131,223,234,139,145, 61,188, -184,244,172, 2, 13,128,243,101,111, 0,181, 66,165, 82, 41, 1,244,123,255,253,247,127,245,241,241,241,226, 56, 14,109,218,180, -193,224,193,131,113,248,240, 97,196,199,199,163,168,168,200,112,245,234,213,117,106,181,122,167,133,201,178,106,208,160,193,153, -139, 23, 47, 58, 89, 89, 89,225,220,185,115, 40, 41, 41,121,193,185, 90,190,124,185, 36, 57, 57,121,211,217,179,103,155,160, 52, - 52, 9, 47,174,120,240,224,193,227,159,135, 90,181,136, 89, 56,113, 28, 55,176,162, 96,170, 42,180,204,191,205,251,133,132,132, - 12,172, 40,190, 0, 96,197,138, 21,203, 43, 44,151,188,142,204,152, 5, 86,175, 50, 33,209, 11,192,229, 42,182, 92,233, 15,150, -129, 65,121, 30, 6,229,121, 88,249,206,199,177, 13,163, 42, 17, 89,226, 12, 85, 7,173, 86, 11,161,200,193,176,103,199, 72, 26, - 0, 76,156,204,240,194,177,235,182, 14, 45, 62,158, 37,233, 36, 8,130,172,192,251,130,120,240,240,240, 88,221,181,123,231, 30, - 45,218,117,178,186,125,230, 8, 30, 62, 72, 65, 78, 78, 1,192, 65, 91, 19,231,249, 97,111,163,248,113, 18,164, 54, 54,209,253, - 47,198, 84,114,174, 94,134,243,194,133, 11,179,186,116,233,242,109,104,104,168,202,211,211, 83, 44, 16, 8, 12, 85,196,213, 75, -165,179, 34, 20, 10, 69,119,129, 64,112,142, 36, 73,105, 80, 80, 16,166, 77,155,134,245,235,215, 51,172, 80, 50,112,203,153,136, -161,207,117,134,249,150,136,171, 10, 34, 43, 86,165, 82,121, 39, 37, 37,137, 25,134, 9,122,247,221,119, 79, 13, 24, 48, 0, 55, -111,222,196,133, 11, 23, 90, 26, 12, 6,117,217,113, 23, 3,112, 33, 73,114,101, 45, 51,185,147, 52, 77, 31,184,112,225,130,143, -155,155, 27,206,159, 63,143,146,146,146,114,231,106,236,216,177,149,156,171, 27, 55,110, 60,227,197, 21, 15, 30, 60,120,252,163, - 81,163, 22,169,232, 62, 85, 39,178, 44, 65, 5,241,165,153, 51,103,206, 60,130, 32, 78,148, 57, 92, 26, 0,170,215, 37,176, 46, -151,169, 70, 14,117,207,240, 14, 83,209,147, 23,214,177,236,203, 63,183, 90,246, 61, 27, 39,149, 74,177,101,203, 22, 88, 89, 89, -213, 91, 56, 21,159, 58,130,180,201, 31,151, 59, 87,102, 39, 11,253,199,188,172,192, 50, 59, 88,183, 80,165,137,208,221,221,125, - 74,187,118,237, 62,221,190,251, 87,235, 21,223,126, 93, 80,152, 24, 39,208,150,232,100, 58, 35, 99,120,148,153, 83, 99,120, 4, -166, 48, 31, 98,153, 44, 90,104, 37,125, 65, 92,189, 44,231,173, 91,183,180,189,123,247,222,181,124,249,242, 46, 44,203,238,126, - 21,233,172, 40,174, 28, 28, 28,206,110,218,180, 73, 42,149, 74,161,211,233,176,114,229, 74,252,249,231,159, 3, 51, 50, 50,206, - 2, 56,251,178,245,109, 48, 24,198,247,237,219,119,237,172, 89,179, 96, 52, 26, 49,108,216, 48, 60,125,250,244,220,195,135, 15, -215,123,120,120,204,250,226,139, 47,220, 28, 29, 29, 49,105,210, 36, 26,192,216, 26,104,190,223,183,111,223, 64, 95, 95, 95, 92, -190,124, 25, 5, 5, 5, 80, 40, 20,152, 50,101,138, 40, 36, 36,100, 79, 81, 81,209,208,144,144, 16,222,185,226,193,131, 7,143, -127, 15, 44,210, 34, 21,157,168,250,160,194,255,132, 33, 33, 33,113, 33, 33, 33,149, 28,174,215, 37,176,184, 10,234,177, 78,119, -136,213,188,216,135,135, 53, 49,245,201,164, 69,251, 89,210,156, 7,252,213, 7,171, 26,161,244,194,114, 61,250, 96,157,229, 56, -238, 70, 69,129,229,238,238,254,158,171,171,235,247,251,246,237,147,170, 84, 42,120,180,106,107,123,242,240,111, 58, 23,153, 88, -155,158,155, 59, 38, 86, 85, 28, 90, 19, 39,171, 45,142,150,200,228, 81, 18, 43,121, 85,113,245,210,156, 0,112,241,226,197,153, - 85,215,253, 93, 78,133, 66,209,221,209,209,241,236,166, 77,155,172, 84, 42, 21,104,154,134, 92, 46,199,197,139, 23, 81, 38,174, - 94, 26,238,238,238,193,147, 39, 79, 94, 56,118,236, 88,228,229,229,225,194,133, 11, 8, 10, 10,194,166, 77,155, 26, 95,188,120, -113,109,183,110,221, 64, 81, 20,206,159, 63, 15,163,209,248,160, 6,154, 33, 19, 39, 78,156,245,193, 7, 31, 32, 60, 60, 28,106, -181, 26,147, 38, 77,210, 79,153, 50,165,188,207,213,143, 63,254,248, 65,114,114, 50,239, 92,241,224,193,131,199,191, 7, 53,106, -145, 42,207,242,147, 28,199,189, 83,213,213,170, 42,190,204, 14, 85,197,229,170,251,151,109,215,190,142,204,152, 5, 86,205,174, - 21,103, 2,101,223, 30,166,220,216, 10, 2, 75, 93,105, 23, 90, 44,135,201, 2,225,178, 96, 60,140, 78,118,106,193,222,197, 36, -132, 34, 7, 67,203,190,103,227,106,218, 87, 46,151,131,101, 89,139,116, 24, 61,224, 3,170,121,255,247,240,184,157, 43, 56,163, -161,220,201,194,188,121,149,196, 21, 77,211,208,235,245, 64,221,205, 90,225, 4, 65, 60,165, 40,234, 38, 0, 46, 48, 48,112,135, -209,104,124, 47, 47, 47,175,193,132, 9, 19, 12, 57, 57, 57, 56,122,244, 40,118,237,218,165,121,110, 16, 68,228, 61, 51,142,122, -162, 46, 78,175,133, 47,250,157,203,113,149,156,171, 87,192,249, 2, 94, 5,167, 66,161,232,238,236,236, 92, 46,174,196, 98, 49, -228,114, 57,148, 74, 37, 4, 2,193,223, 10,210,217,184,113, 99,177,191,191,255, 55, 99,198,140, 65, 98, 98, 34,230,204,153,163, - 86,169, 84, 71,142, 29, 59, 54,105,198,140, 25,130,192,192, 64,100,101,101, 97,235,214,173,198,240,240,240,229, 25, 25, 25,171, -170, 61,105, 5,130,241, 75,150, 44,225, 84, 42, 21,241,248,241,227, 74,206, 85, 97, 97,225,208,144,144, 16,201,147, 39, 79,120, -231,138, 7, 15, 30, 60,254, 93,168,173, 5, 45,167, 76, 60,101, 86,179, 76, 85, 16, 86, 85,151,179,170, 44, 3,128,190,202,246, -152,215, 41,176,170,133,209, 68, 22,236,219,244,153,237,160, 15,191,128,196,181, 39,244,201, 7,193,106, 50,203, 5, 22, 45,177, -134,141, 99, 35, 20, 62,215,224,122,194, 19, 24, 77,100, 65,109,124, 12, 3,193,212,175,254, 26, 45,104,103,103,135,130,130,130, - 74,142,150,149,149, 21,220,220,220, 80, 88, 88,136,208,208, 80,112, 28,119,189, 14, 55,108,201,152, 49, 99,190,251,226,139, 47, -200,230, 35,198,225,249,173,171, 47,184, 86, 18,137, 4, 82,169, 20, 74,165, 18,247,239,223,103, 57,142, 91, 82,135, 58,190, 77, -146,100,244,111,191,253,150, 30, 24, 24, 56,182, 65,131, 6, 35,198,141, 27, 39, 13, 15, 15,199,146, 37, 75, 4,231,207,159, 55, -220,185,115,135, 49,153, 76, 51, 85, 42,213,214, 58,207, 24,130,168, 42,174,254, 54,103, 53,226,234,111,115, 42, 20,138,110,110, -110,110,103,215,175, 95,111,149,145,145, 1,177, 88, 12,107,107,107,164,166,166, 98,201,146, 37,197, 12,195,188,245, 55,207, 55, -177, 76, 38, 19, 27,141, 70,236,222,189, 27, 74,165,178,107, 70, 70, 70, 42,203,178, 91, 63,255,252,243, 13, 94, 94, 94,109,238, -223,191,255,224,249,243,231,147, 51, 51, 51, 19,107, 34,177,179,179,235,234,228,228, 68,220,188,121, 19,147, 38, 77,210, 79,157, - 58,181,188,207, 21,239, 92,241,224,193,131,199,127, 80,121, 17, 68,120,109,203,255, 68,212, 58,217,115,118,137,198,121,235,158, - 35, 27,134,125,212, 71,123,246,226, 69,160,241, 24, 8,221,251, 3,148, 4,110, 45,187,195,169, 73, 23,196, 60,204,192,209,171, -113,218, 36,165,126, 67,118,137,166,234,124,123,181,206,182, 93, 80, 80, 35, 29,184,229, 0, 0, 32, 0, 73, 68, 65, 84,128, 38, - 77,154,224,209,197, 1, 62,119, 14,181,241,243,179,223,232,215, 16,171,125, 46, 94,188,136,213,171, 87, 63, 79, 74, 74, 90,211, -178,101,203, 89,181,113, 70, 71, 71, 47, 74, 75, 75,235, 48,119,238,220, 51,243,211, 11,145,183,120, 51, 10,191, 26,131,140, 62, -237, 96,101,101, 5, 71, 71, 71, 20, 23, 23,227,202,149, 43,136,137,137, 57,163,213,106, 59, 68, 71, 71, 47,170,141,147,227,184, - 91, 94, 94, 94,143, 59,117,234,100, 93, 80, 80,176,126,204,152, 49,210,226,226, 98,228,228,228,224,217,179,103,184,125,251,246, -121,189, 94,239, 83,135,104, 41,231,100, 89,182, 92, 92,189, 42,206,138,120, 85,156, 50,153,108,246,209,163, 71,173, 72,146,132, - 88, 44,134,173,173, 45,210,210,210,176,120,241,226, 98,141, 70,243,150, 90,173,182, 52, 64,103,141,245,206,178, 44, 24,134, 1, -199,113, 16,137, 68,133, 0,144,153,153,153,248,228,201,147, 62,199,143, 31, 87, 60,122,244,168, 87, 13,226,170,156, 51, 39, 39, - 39,236,233,211,167,144,201,100,152, 58,117,170,104,249,242,229,123,215,175, 95,175, 13, 9, 9,161,251,246,237,187,233,236,217, -179,173, 53, 26, 77, 79, 11,196,213,255,229, 89,235,121, 78,158,147,231,228, 57,255,105,156,255, 41,212,234, 96, 37, 36,192, 0, - 20,125,233,229,101,189,104,229,150,125, 91,246, 30, 58, 60,100,194,240,247, 5,254,237,130,144,156,113, 12, 87, 34, 46, 49,121, - 69,220,209, 34, 61, 53, 41, 33,161,168,206,177,255, 2, 1,152,185,243, 71, 10, 0, 64, 40, 4, 51,111,224,192, 48, 31, 31,159, - 30,131,124,179,232, 73, 83, 75,157,173, 45, 27, 71,210, 97, 97, 97,135,196, 98,241,182,228,228,228, 66,165, 82, 89,103, 38, 98, - 98, 98,238, 2,120,155,162,168,158,179,102,205,250,126, 64, 83,143, 78, 67,186,246,130, 80, 40,196,157, 59,119,144,155,155, 27, - 78,146,228, 55,209,209,209, 87, 44, 41,148, 63,254,248, 35, 29, 0, 74, 74, 74,150,180,108,217, 82,148,144,144,128, 71,143, 30, - 33, 41, 41, 9, 38,147,233,161, 82,169,172, 87,135, 56,137, 68,114,155, 32,136,184, 87,201, 89, 17,175,138, 83,163,209, 44, 95, -186,116,233,155,139, 22, 45, 18, 91, 91, 91, 35, 58, 58, 26,139, 22, 45, 42,214,106,181,245, 17, 87,181,130,227, 56, 24,141,198, -122,141,252,172, 6,223,248,250,250,182, 94,186,116,105,203,178,190, 92,188,115,197,131, 7, 15, 30, 60,254, 61, 2,235, 47,161, - 85,148, 7,224,163, 14, 94,214,158,203, 55,255,186, 67, 42, 98,123,104,244,228, 53,141,142,156, 16,157, 80,244,216,210,131, 45, -253, 9,194,202,107,212,176,179,179,147,165,185,226,185,121, 77, 90, 38,160, 86,171, 87,190, 76,102, 34, 34, 34,174, 0,232,204, -113,220,144, 83, 4, 49, 15,120, 2,142,227,150, 71, 71, 71, 31,173, 15, 79, 64, 64, 64,147,226,226,226,189, 58,157,174, 3,203, -178,162,203,151, 47, 67,171,213, 34, 33, 33, 65,195,178,108,104,125,211,149,156,156, 28,247,170, 57, 95, 71, 58,149, 74,229,157, - 19, 39, 78,244, 37, 8,226,194, 55,223,124, 35, 94,188,120,241, 43, 21, 87,246,246,246, 37, 25, 25, 25,207,180, 90,173, 67,102, -102,166,222,222,222,190, 36, 37, 37,229,101,168, 30, 22, 22, 22,182,155, 62,125,250,226, 89,179,102,205,254,254,251,239,105,190, -207, 21, 15, 30, 60,120,240,248,215, 35, 48,208, 81,102,225,174, 22, 89,136, 11,198,195, 56,103, 44,184, 57, 99,193, 45, 24, 15, -227,171,224,172, 39, 42,113,182,106,213,234,128,163,163, 35, 67,211,180,142, 36,201, 18,138,162, 10, 5, 2, 65, 6, 73,146,147, - 96, 65, 24,139,127, 51, 39, 0,184,184,184,116,244,246,246, 62,160, 80, 40,186,189,138,242,172, 8, 87, 87,215, 55, 61, 60, 60, - 14,186,185,185,245,122, 69,156, 1,111,189,245,214, 83,169, 84,122,195,210, 23,134,255,159,231, 18,207,201,115,242,156, 60, 39, -207,201, 3,252,137,194,115,254, 75, 57,137,151, 16, 87,124,121,242,156, 60, 39,207,201,115,242, 2,235,181,129,228,139,128,199, -127, 0, 28,248,102, 65, 30, 60,120,240,224,241, 15, 2, 81,139, 10,173,207, 76,217, 47,163,100,239,241,156, 60, 39,207,201,115, -242,156, 60, 39,207,249,127,142,179, 46,238,123,224,241, 90,132, 23,207,201,115,242,156, 60, 39,207,201,115,242,156,255,247, 56, -255, 83,224,155, 8,121,240,224,193,131, 7, 15, 30, 60, 94, 49,234,221, 49, 56, 32, 32,160, 5, 0,220,185,115,231,225,107, 76, -215, 20,133, 66, 49,161,125,251,246, 94, 52, 77,147, 5, 5, 5,139, 46, 95,190,188,168,186, 29,219,183,111, 31,241,230,155,111, -122, 94,186,116, 73, 15,252, 53,255,160,249,219,100, 50,165, 71, 70, 70,118,228,171,250,127, 3, 87, 87,215,179, 18,137,164,113, -105,128, 81, 14, 12,107,130,137,229, 96, 50,177, 48,154, 56, 24,244,218, 20,125, 73, 97,255,151,226,246, 29,210,200,100, 98, 67, - 56,112, 91, 8,142,152,196, 17,220, 22,130, 35, 62,231, 72, 98, 11,193,114,159, 65,192,252, 0, 70, 48, 75,192, 10,231,171, 19, - 66,211,254, 11,229, 25, 28, 28, 76,254,205,255, 87, 59,255, 84,135, 14, 29, 78, 72, 36,146,230, 53,253,175,164,164, 68, 29, 27, - 27, 27,244, 95, 62, 87, 93, 92, 92,122,146, 36,185, 17,128, 79,149, 77,137, 0,190, 84,171,213,127,254,211,210,236,228,228,116, -133,162,168,150,197, 37, 37,197,207,139,138, 60,229,114,249, 99,169,149, 76,102, 98, 76, 15,158, 61,203,238,201,223,129,120,240, -248, 7, 11, 44, 63, 63,191, 86, 0, 2, 9,130, 8,228, 56,174,103,203,150, 45, 93, 74, 74, 74, 96, 50,153, 50, 9,130,184,194, -113,220,101, 0,151,163,162,162,146, 94, 69,130, 72,146, 92,181,118,237,218,153, 83,167, 78, 45, 23, 73,247,238,221, 67,187,118, -237,170,221,159,162, 40,143, 21, 43, 86,216,166,166,166,130,166,105,136, 68,162,242, 15, 69, 81,232,210,165, 75,189,142,223,160, - 65, 3,107,103,103,231, 69, 4, 65, 12, 37, 73,146,170,107,127,150,101, 77, 28,199, 29,202,202,202, 90,152,151,151, 87, 84,159, - 99,117,244,111,103, 4,136, 26,142,193,153, 34, 34,239, 10,107,251,127,171, 86,173, 34, 4, 2,129, 71, 69, 65,105, 70,197,229, -138,191, 77, 38, 83,122,124,124,124, 71, 75,203, 66, 98,101, 53,155, 32, 5,125,193,177,109, 74,201,200, 68,142,101, 46,104, 75, - 74, 86, 89,146, 95,177, 88,220, 56, 50, 42,170,101,252,253, 39,240,108,214, 8,122, 3, 3,157,222,136, 99, 23,238,192,215,171, - 41, 6, 13,232,247,210,231, 10,195, 18,193,243,167,140,234,189,124,227,254,128,121, 83, 71,200,151,111,220,223,113,222,212, 17, -214,203, 55,237,239, 56,127,218, 72,235,165, 27,247,117,156, 63,109,164,237,178,141,251,244, 0,198,191,204, 49,198,181,109, 84, - 76,154, 24,113,181,117, 79, 9,116, 59,239,165,202,254, 23, 23,238,242,229,203, 91, 25, 12,134,132,177,195, 58, 46,105,211,194, - 57,171,186,125, 10, 10,178,156, 31, 37, 70,124, 11, 33,237,229,213,105, 94,173,215, 39, 77,211,205,174, 92,185,210,210, 28,105, -223,100, 50,193,100, 50,129, 97, 24,232,245,122,124,240,193, 7,130, 87,145,110,127,127,255,113, 28,199, 45, 43, 61, 45,137,165, -145,145,145,155,254, 6,157, 92, 32, 16, 76, 23,137, 68,129, 12,195,120, 1,128, 80, 40, 76,208,233,116,151, 25,134, 89, 11,252, - 21, 95,207,194,123,207,186,240,240,112,111,107,107,107, 24, 12,134,242,137,225, 41,138,106,211,185,115,231,205, 0, 90, 90,202, -229,238,238, 30, 65, 16,132, 71,125,142,207,113, 92,186, 82,169,172,215,203, 32, 69, 81, 45,159,166,170,156,155, 52,114,195,243, -162, 34, 88, 89,201,100,119,238, 37, 59,251,251, 52,225,159,110, 60,120,252, 83, 5,150,159,159,223, 41, 0,129,109,218,180,145, -246,235,215, 15,126,126,126,104,220,184, 49, 36, 18, 9, 0, 32, 55, 55,215, 37, 62, 62,254,163,232,232,232,143,110,222,188, 9, - 0, 26, 0,215,162,162,162,170,117, 35,250, 12,236, 49, 85, 34, 23,175, 7,128,108,229, 51,117,250,227,172,141,106,181,122, 21, -128,138,111,212,158,163, 71,143,158, 49,109,218, 52,156, 56,113, 2,251,247,239,135, 78,167, 67, 65, 65,205, 83, 28,154, 76,166, -244,209,163, 71, 11,146,146,146,152,154, 28,172,250, 20,136,179,179,243,162, 97,195,134,125,229,237,237, 93, 62,173,139,209,104, - 44,255,206,203,203,195,140, 25, 51,204, 55, 68,176, 44,139,139, 23, 47, 78,253,250,235,175,145,151,151, 55,189, 58,206,190, 61, - 61, 35, 4, 4,225,193,254, 37,202,210, 47, 92,125,210, 17, 32,168, 59, 17, 49, 68,149,155, 44, 0,160, 83, 64,135, 58,197,157, - 64, 32,240,136,138,138,114,166,105,218,162,188,177, 44, 11, 63, 63, 63,139,246,117,115,115, 11,162, 4,244,254, 33,195, 63,109, -208,193,207, 79,232,225,166,128,145, 97,240, 36, 57,181, 83, 76,116,100,135,115,199,127,155, 32,145, 72, 70,168, 84,170, 75,181, -241, 24, 77, 44, 98,226, 30,226,252,181, 40,188, 75, 75, 80,162,213,163,168, 68,143,189,127, 92, 71,122, 86,193, 75,159,184,157, - 58,117,114,207,102,244,157,167,141,127, 79,246,195,143,123,100,211,198,191,135,213, 91,246,150,127, 79,253,116, 48, 86,253,184, - 71, 62,237,211,193,216,184,117, 87,215,166,157, 58,185,135,135,135,215, 56, 45, 64, 77,117, 68,154, 24,241,142,120, 37, 5, 0, -217, 91,183,194,144,153, 9,183,133, 11, 1, 0, 19,125, 60,196,245, 73,179,143,143, 79,185, 32,174, 85, 56, 50, 76,122, 92, 92, - 92,199,186,196, 21,195, 48,156, 64, 32,248,246,234,233, 69,161,221, 58,181,170, 84,152, 73, 15,146,108,131,191, 91,248,225,193, - 51, 69,220, 71,111, 89, 39, 36,132, 47,175, 85,100,177, 44, 75,234,116, 58, 60,120,240,160,218, 40,251, 36, 73,154, 94,166,158, - 2, 3, 3,197,197,197,197,251,228,114,121,251,226,226,226,113, 44,203,126, 23, 22, 22,230, 66,146, 36,250,246,237,251,157,191, -191,127,178, 88, 44,254, 81,171,213, 70,203,229,242, 17,151, 47, 95,214, 89, 72,221,211,218,218,122,239,239,191,255,222,192,207, -207,143,204,201,201, 65,211,166, 77,145,155,155,219,233,202,149, 43,254,159,126,250,233,167, 69, 69, 69,163, 1, 92,169, 71,114, - 91,203,100, 50,110,204,152, 49,132,201,244, 87,118,127,254,249,103,248, 55,207,108,222,175,131,164, 68,107,224, 10,174,198, 74, - 62,231, 72,238, 90, 74, 74,205, 55, 38,130, 32, 60, 22,237,248,210, 89, 36, 18,193,104, 52,150,127, 56, 22, 0, 7,112, 44,192, -177, 28, 56, 14, 0, 71,128, 53,177, 88, 61,119,199, 75, 95, 15, 86, 50,153,149,139,139,107,166,212,202,202,138,227,159,107, 60, -120,252,227, 29,172,183,195,194,194,192, 48, 12,172,173,173, 65, 81,149,159,247,246,246,246,232,217,179, 39, 58,119,238,140,190, -125,251,226,254,253,251,210,239,191,255,190, 70, 59, 98,228,204,129,104,216,210,197, 44, 34, 20, 87, 79, 68,133,252,180,232,176, -163, 90,173,174, 56,215,224,184,137, 19, 39, 18,207,158, 61,195,208,161, 67,175,232,116,186,193, 0, 10,107,203, 64,108,108,108, -199,216,216,216, 87, 86, 32, 4, 65, 12, 85, 40, 20, 56,112,224, 0,244,122,253, 11,219,109,108,108, 16, 23, 23, 87,241, 13, 18, - 29, 58,116,160, 8,130, 24, 10,160, 90,129, 69, 18,132,199,233,176,135,229,243, 52, 14, 27,212,129,238,215,211, 51,243,185,214, -200, 1, 32,230,207,159, 95, 46,174, 56,142,195,226,197,139, 45, 78, 47, 77,211, 72, 76, 76, 4, 69, 81,120,220,163, 21, 0,160, -109, 84, 26, 40,138, 66, 76,123, 55, 0, 64,215, 7,121, 16, 8, 4,144,203,229,150,138,171, 94, 46, 10,143,223,231, 46, 12,177, -214, 26, 57,156,188, 24,142, 84,213,121,112, 28, 7,133,179, 61,186,249,251, 9,189,218,181,119,222,185,121,213,239, 0, 6,171, - 84,170,176,154,197,130, 9, 94,173,154, 97,247,239, 87,176,236,199, 80, 60, 43,212,162,168,164,180, 92,251,118,245,198,207,171, - 95,174,158, 40,138, 90,213,166, 89,179,134,187, 15,158, 69,183, 46,157,176,251,224, 25,116,237,210, 9,187, 15,149, 46,239, 57, -116, 22,111,116,237,140, 61,135,206,162,173, 87,203, 70,207,158, 22,172, 2, 48,188, 70,247,162,106, 29, 13, 46,173, 35, 65,190, -137, 48,215,205,211, 73,147, 74,203,167, 76, 96,213,251, 98, 43, 19,196, 22,184,198,117, 58, 87, 12,195, 32, 43, 43,139,200,207, -207,231,236,236,236, 62,172, 40,178,204,226,234,183,211,133,208, 36,109, 36,126,253,245, 50,251,241,199,129, 9, 9,225,203,189, - 80,218,220,245, 2, 12, 6, 67,242,155,111,190,201, 1,128, 94,175,119, 23,137, 68,116, 21, 1,230,214,173, 91,183, 23, 4, 90, - 93, 77,135,197,197,197,251, 14, 29, 58, 52,196,197,197, 5,131, 7, 15, 62,231,237,237, 45,178,178,178,194,233,211,167,225,225, -225,225,104, 99, 99,115, 42, 36, 36, 4,107,214,172,105,116,238,220,185,253, 0,134, 88, 80,148,125,131,130,130, 14,156, 56,113, - 66, 66,211, 52, 52, 26, 13,226,226,226, 96,107,107, 11,145, 72,132,193,131, 7, 83,221,186,117,115, 8, 10, 10, 58,156,148,148, - 52, 2,192, 5, 75,235, 72,163,209,112,115,231,206,133,149,149, 21,100, 50, 89,249, 71, 42, 50, 17, 91,130,155, 73,191, 90,145, - 33,157,255,245,199, 43,182,239, 60,126,137,101,185,239,210,210, 10,243,107,226,242,160,218, 97,206,172, 57,102,129, 10,145, 72, - 84,201,101, 55,255,166,105, 26, 29, 58,116,168, 51,109,109,218,180,217, 74, 81,148, 83,197,117,121,121,121,212,183, 11,230, 49, -119,227,238,203,140, 12,100, 90,189, 17, 75, 23,127,199, 80, 36, 69,249,248,248, 28,229, 56, 46, 59, 62, 62,254,115,254, 81,199, -131,199, 63, 75, 96, 65, 46,151,227,206,157, 59, 32, 8, 2,214,214,214,176,177,177,129,173,173, 45, 10, 11, 11, 17, 31, 31,143, -196,196, 68, 36, 39, 39,131, 36, 73,120,122,122, 2, 47, 70, 15, 47, 31,106,185,111,245, 9, 72,228, 98, 16, 4, 16,208,175, 61, - 58,246,246,197,189,219,143,191,188,115, 14, 59,212,106,245, 3, 0,130,182,109,219,126,218,165, 75, 23,172, 89,179, 6, 58,157, -110,109, 13,226,234,133,225,155,159,189, 39,184, 74, 11,200,134, 6,134, 77,219,246, 59,243,134,175,175,111,132,159,159, 95,211, -187,119,239, 26,205,110, 86,213,102,178, 42,253,178, 42,113,230,228,228,128,101, 89,139, 93,161,252,252,106,239,177,247,170,186, - 82,102, 44, 13, 89, 99, 87, 84,144,133, 37, 43,127,129,209,104,196,204,153, 51,193,178, 44, 88,150,133,201,100, 66, 94, 94, 94, -105,100,167, 58,242,110,206, 19, 69, 81,149, 4,112, 93,203,181,113, 58, 58, 58,202, 72, 74,184,127,214,252, 37,214,177, 73,233, - 56,113, 49, 28, 28,199,225,216,246,239, 0, 0,131, 39, 46,134, 82,157,141,110,254,109, 48,246,179,233,214,235, 66,230,239,119, -116,116,108,158,147,147, 83, 92, 29,167,145, 97, 17,122,230, 38,212,207,158, 99,244,144,222,208,233,141,200,202, 84, 99,215,143, - 63,224,139, 79,142,160,129, 92,234, 42,117,106,150, 84,177,140,172,173,173, 41,173, 86,123,229,193,131, 7,227,107, 74,167,209, -104,124,123,238, 87, 19,176,110, 71, 40,124, 60, 93,112,226,252, 45, 4,180,109,140, 83, 23,195,209,181, 93, 83,156,185, 28,129, -110,190,158,184,116,243, 30,190,252,252, 99,204,254,242,202,219,245,170,163,229,107,236,138, 10,179,112,114,249, 30,100,109,218, -132,148,169, 83, 17, 80,118, 78,220, 33, 73,208,238,238,128, 77,221,229, 89, 29, 18, 19, 19,161,211,189,104,212,136,197, 98,180, -105,211,166, 86, 78,179,115,149,153,153, 73,100,102,102, 66, 38,147, 17, 9,113,247, 76, 94, 62,109, 63, 52,229, 30,220, 1, 0, -165,206, 85, 33, 74,238,111,128,230,193, 70,208,249,119,201,237,139, 63,211, 79,252,110, 91, 66,133,107,244, 94,149, 23,149,242, -242,233,220,185,115,226,181,107,215, 90, 87,112,129,193, 48, 12,205, 48, 76, 75,115,179, 33,195, 48,208,233,116, 24, 49, 98, 4, - 85, 91,222,165, 82,105,123, 23, 23, 23,220,190,125, 27,193,193,193, 34, 31, 31, 31, 60,120,240, 0, 36, 73, 98,220,184,113,240, -246,246, 70,118,118, 54, 2, 2, 2,112,245,234,213, 14, 22,148,167,181, 76, 38,219,121,252,248,113, 9, 73,146, 40, 42, 42, 2, -203,178,232,222,189, 59, 8,130,192,221,187,119,177, 96,193, 2, 28, 57,114, 4,191,255,254,187,212,223,223,127,103, 73, 73,137, - 23,128, 34, 11,234,136,211,233,116,156, 68, 34,129, 68, 34,129, 88, 44,134, 88, 44, 6, 77,211,208,232, 41,124,182, 48, 89, 39, - 20,203,217,246,237, 60,155,127, 49,113, 8,185,100,197,174,139, 0,142,213,196,169,226,226, 96,239, 67,224,220,174, 8, 12,158, -212, 19,180, 80, 4, 90, 72, 67, 68,139, 32, 44,251, 77, 11,105,136,132, 98, 80,142,218, 58,207, 37,161, 80,232, 24, 21, 21,101, - 87,241, 90,102, 24, 38, 97,234,212,169,158, 67, 6, 13,116, 57,120,228, 4, 53,106,216, 96,147,171,139,115, 78, 90, 90,202, 67, - 0,118,254,254,254, 92,125,207,207,151, 0,207,201,115,190,118,112, 28, 23, 0,160,226, 11,134, 30,128,200,252,216, 46,187,183, - 57, 84, 89, 15, 0,217,101,223, 78, 53, 44,231, 0,136, 7,224, 85,182,206, 4, 32,156, 32,136,188,191,155,102,179,192,170,120, - 17, 18,213,100, 12,133,133,133, 40, 44, 44, 68, 90, 90, 26,182,108,217, 2,161, 80, 8,129, 64, 0,129, 64, 0,146, 36,203,251, - 43,212,132, 63, 79, 92,219, 8, 96,163,159,159,159,240,167,155,161,167,230,239,254,178, 79,231,126,254, 84,196,249,187, 31, 2, - 88, 10,224,237, 49, 99,198, 56, 2,192,158, 61,123,114, 0,156,182,216,197, 17,144, 13, 55,172,255,165,209,180, 47, 71,153, 5, -133,199,142, 29, 59, 26,164,167,167, 87,122, 75,164,105,186,206,126, 89, 28,199, 29,122,248,240,225, 87, 10,133,162,252, 65, 82, -177,153,144, 97, 24, 72, 36,146,114, 49,164,211,233,176,111,223, 62,134,227,184, 67,181,112, 34, 41,238, 79, 60,136,187, 4,147, -137,173, 36,166,180, 90, 45,130,131,131,203,221, 43, 0,152, 84,230,148, 88,138,218,156, 43,138,162,112,205,179, 84, 9, 12,200, -230, 94,232,171, 85, 21, 66,145,100,230,128,247, 63,182,103, 56,170, 92, 92,149,230,161, 84, 92,136,132, 2, 72,197, 66, 60,120, -156,134,166,238,254,232,243,214,123, 13, 46,156, 58, 60, 19, 64,181,131, 16,140, 38, 22, 3,122,249,227,199, 3,151, 80,248, 92, -139,194,252, 92,228,164, 37, 34, 33, 54, 28, 34,145, 8,183,110,221,178,182,181,181,179,110,214,172, 41, 76, 38, 22,215,110, 69, -192,202, 74,138, 3,251,127,109,170, 51, 24,145,250, 52,121,124, 13,194, 86,208,173,163, 23, 10,115, 82, 33, 16, 8,208,205,175, - 57, 4, 2, 1,186,251,183, 4, 69, 81,232, 17,208, 26, 20, 69, 33,176,179, 55,154, 55,111, 14,150,101, 5,117, 92,188, 72,186, -247, 39,146,226, 47,129, 99, 89,152,216,210,230, 95, 14,128, 65,173,126, 49, 95, 25, 25,224,108,156, 95,230, 38,129,111,190,249, - 38, 95,165, 82, 25,170,113, 14,233, 35, 71,142,216,213, 54, 17, 54, 77,211, 94, 2,129, 32, 33, 55, 55,151,181,178,178, 34, 77, - 38,134,245,242,105, 75, 93, 61,189,168,124,238,201,224,197,139, 66, 63,122,203,230,195, 95,118, 29,231,104,167,238, 4, 65,137, -153, 9,223,109, 19, 65, 72,123, 1, 6, 75, 94, 26, 72,157, 78,135,251,247,239,215, 57, 41, 55,199,113,181,158, 80,197,197,197, - 99, 7, 15, 30,124,238,243,207, 63,151,152, 95, 94, 4, 2, 65,185,232,127,244,232, 17, 72,146,196,246,237,219,161,211,233,234, - 60,241, 5, 2,193, 87,135, 15, 31,182, 21,137, 68,229,226,138,227, 56, 80, 20,133,196,196, 68,172, 94,189, 26, 99,198,140, 65, -106,106, 42, 20, 10, 5,102,206,156, 41, 95,177, 98,197, 87, 6,131,193, 18, 91, 56, 86,175,215,119,148, 74,165, 16,139,197, 48, - 11, 45, 0,136,124,228,114, 47, 57, 57,185, 93,163, 70, 50,215,166,222,119,255,232,213,163,189,175,131,131, 93,215, 39, 41, 5, -199,106,124, 65,125,222, 8, 69, 73, 2, 4, 6, 6,226,242,229, 43, 24, 56,112, 32, 76, 52, 13, 86, 36, 2, 43, 18,129,163,105, - 64, 36, 2, 33, 18,129,179,178,178,232,244,161, 40, 10, 25, 25, 25,149,214, 77,156, 56, 49,229,227,143, 63,118, 6, 56,168, 84, - 74,110,250, 87,211,148, 57, 57, 57,156,139,139, 11,111, 33,240,248,183,161, 54, 45,226, 68, 16,196,137, 10,247,158,129,230,229, - 57,115,230,204, 11, 9, 9,137, 35, 8,226, 68,197,245,230,253,202, 12,137, 19,213, 45,151,253,215, 97,238,220,185,109, 87,172, - 88,177,188,107,215,174, 7,110,220,184,241, 4,192, 43, 19, 88, 68, 89,198, 44,154,191,174,186,135,116, 93, 2,203,140,168,168, - 40,163,155,155,219, 79,137, 17, 79,250,180,238,216, 18, 82,153,184, 31,128,141, 98,177,120,250,232,209,163,113,235,214, 45,220, -187,119,239,103,212, 35, 50,183,129, 97,211,166,125, 57, 10, 6,134, 77, 51, 59, 84, 51,103,206,164,175, 93,187,102,168,201,193, -170,137, 43, 43, 43,107, 97,120,120, 56,106,235,228,254,209, 71, 31, 85,124, 24,149,119,114,175,241,140, 97, 57, 24, 12, 70, 20, - 23,107, 74,133, 85,217,195,219,100, 50,161,184,184, 24,195,134, 13, 43, 23, 93, 44,203, 34, 43, 43,235,165, 42,147, 36,201,250, - 56, 87,213,115, 80, 84,255,246,190,126,194,139, 55, 98, 43, 61, 92,223,251,108, 41, 68,116,169,184,146, 74,104, 72,197, 66,164, -169, 50,209,198,203,135,190,124,254, 68,255, 26, 5, 22, 99,194,198, 95,207, 3, 4,129,208, 19, 23,209,177,169, 21, 22, 45,248, - 6, 67,135, 14,133, 72, 36,193,225,195,135,176,106,243,110, 76,106,220, 24, 28,128,206, 29, 59, 96,229,214, 3, 88,178,120, 49, -121,232, 96,104,143,186,210, 43, 20, 10, 65, 81, 84,249, 67,187,234, 55, 69, 81,117,138,132,242, 58, 50, 26, 81, 82,172,129,137, -101,193,178, 28, 56,150, 5, 56, 14,238,203,150,193,125,217, 50,220, 33, 75, 7,240,121, 23, 23, 67,163,209, 0,189,218,215, 91, - 92,233,245,122,168, 84, 42, 67,108,108,108,117, 79,191, 76,189, 94, 95,107,122,231,205,155,151,180,124,249,114, 47,123,123,251, -132,216,216, 24, 99,251,246,190,194,170,125,176, 90,181,108, 85, 16,188,120, 81,232,168, 79,222,253,112,235,130,225,204,231, 11, -247, 10,204, 29,221, 67,207, 4,215,125, 61, 25, 12,201,125,251,246,181,168, 43,143, 70,163,201,168,105,155,185, 67,123,171, 86, -173,196,189,123,247,198,149, 43, 87,176,108,217, 50,150, 97,152, 28, 0,232,214,173,155,211,146, 37, 75,136,248,248,120,216,217, -217, 33, 43, 43,107,183,191,191,255,146,218, 58,190,139, 68,162, 94, 1, 1, 1,164, 78,167, 43,127, 41, 33, 73, 18,137,137,137, - 88,177, 98, 5, 70,140, 24,129, 86,173, 90,149, 95, 91, 65, 65, 65,194, 13, 27, 54,244,178, 68, 96,145, 36,249,101,159, 62,125, -126, 64,233, 40,194,138, 55,185, 4, 0,179, 1, 32, 53,245, 89, 70,100,100, 82, 92,159, 64,191,142,205,155,186, 43,194, 35,159, -214,200,247, 76,248, 8, 10, 63, 41,104, 33,141, 49, 95, 15,194,137, 19, 39, 48, 57,248,227, 50, 39,171,212,193, 18, 10,105,208, - 66, 17, 68, 78, 47, 55, 17, 65,217,125,132,176,177,177, 5, 0,216,218,218,154,239,113, 4, 0,142, 36, 73,190, 75, 22,143,127, - 19,234,212, 34,102,129, 84, 85,104,133,132,132, 12,172,186,174,162,152,170,238,119,197,255,174, 88,177, 98,121, 5,238,146, 87, -145, 25,193,171, 42, 21,163,177,246, 57,154,131,130,130,166, 90, 91, 91,175, 55, 47, 63,189,174,196,211,235, 74,120,181,246,233, -238,231,219, 49,127,196,136, 17,112,112,112,192,236,217,179, 57, 0, 59,235,115,236,109,191, 51,111, 84, 92,142,137,137,233, 24, - 19, 19,243, 82,249,200,203,203, 43, 42,235,172, 62,253, 21, 90,155, 48, 26,140, 40, 46,209,194, 96, 48,192,104, 52,129, 97, 76, -240,247,182,198,222,109,223, 64,175, 55,192,104, 42, 93, 87,234,148,153, 32,166,117,232,217,217,195, 8,130,212, 92,185,149,106, - 83, 27,191, 79,100, 42, 40,138, 66,172,175,123,181,206, 85, 63,149,193, 98,161,197,177,166,214, 46, 46,206, 72, 61,115,187,244, - 45,220, 74,130,179,123,150, 64,102, 85,250, 38,255,246,152,121,165, 34, 75, 76,195, 96,208,195,217,165, 9, 24,147,177,117, 77, -124,140,209,160,111,223,210, 29,118,214, 82,196,220,185,137,233, 83,198, 99,220,184, 79, 65, 75,172,113,249,242, 37,164,170,178, -240, 40, 61, 15, 83, 22,254, 8,163,209, 4, 3, 99,130,145, 97,177,110,215, 9, 24, 76,117, 43, 35,154,166, 49,115,230, 76,105, - 77,219, 15, 28, 56,160,177, 72, 96,113,101, 34,184, 68, 3,157, 86, 7,189,161,180, 46, 76,205,132, 88,186,224, 99, 24,141, 70, -104,134,119,133,193,104,132,233,203, 33, 48, 24, 12, 72,179, 18,144,221,253, 21, 70, 16,164,230,122,132,210,198, 82,129, 85, 83, -122, 56,142,171,182,233,176, 38,145,213,190,189,111,194,152, 97, 29, 67,174,223,184,147,125,253,198,157, 23,246,107,214,170,227, -227,207,151, 30,152,107,201, 40,194, 74, 54, 78,133,230,194,191,121,222,127, 23, 22, 22,230, 34,151,203,145,148,148, 4,138,162, - 64, 16,196,179,168,168, 40, 23, 0,120,231,157,119,114,132, 66,161, 3, 69, 81,248,234,171,175, 64, 81,148,211,228,201,147,191, - 5, 80,163,192, 98, 24,198,203,218,218, 26, 69, 69, 69,229,229, 40, 18,137, 48,103,206, 28,140, 26, 53,170, 92, 92,137, 68, 34, -236,222,189, 27,254,254,254,208,235,245, 94,150,164, 87,169, 84,222, 1,240,134, 5,162,166,180, 95, 30,203,214,122, 98,201,139, - 27, 66,155, 44,130,137,166,113,224,216, 49,140, 26, 53, 10, 34,145,184,220,185, 2, 77,131, 16,137, 64,210, 52, 76,148,184,222, -229,203,178, 44, 10, 11, 11,169,221,187,119, 55,243,241,241, 33, 56, 0,109,218,120, 19, 39, 78,158,108, 36,151,203,159,216,219, -219, 27,192,131,199,127, 77,129, 85, 16, 72,175,130,107,206,156, 57,243, 0,112,115,230,204,153,103, 94, 14, 9, 9,209, 0, 80, -253, 99, 4, 86, 93, 14,214,154, 53,107,106, 12,181, 96,126,184,108,216,176, 1,123,247,238, 93, 3,224,113,125,142, 61,113,176, -224,182,149,148, 86,148,104, 12,234,237,199,152,206,237,219,183,143,232,218,181,107,179,136,136,136, 26, 29,172,154, 98, 99,189, -142, 48, 13, 28,199, 65,111, 48,162,164, 68, 3,173, 94,143, 25,223,108,182,168,238, 13,250, 34,193, 59,111,245,148,214,229, 36, - 90,210, 7,171,174,166,193,202, 98,153,129, 89, 3, 60, 47,209, 34,104,196, 28,220,249,163, 84, 27,155,197,149, 84, 44,132, 68, - 36, 4, 73, 0, 68, 45,198,167, 81, 83, 56,232,235,169,227,175,110,249,121,175,199,123, 61, 39, 96,218,180,105, 16,136,172,208, -192,193, 9,140,137, 67, 35, 55,103, 60, 74,207,195,225, 77,223,148,121,195, 28,122,142, 12,198,154, 5, 19,176, 42,184,238,183, -122,138,162,176,105,211, 38, 77, 85,215,170,162,147,101,169, 8, 54,187,140, 26,157, 30,179,230,254,104,121, 29,245,127, 67,106, -105,217, 86, 55,112,194, 82, 1, 86, 85,100, 1,160,128,154, 27,253,196, 14,128, 87,247, 1, 11,254,151, 55, 67,150,101,113,242, -228,201, 23,220,213,170,117,104,169,219,202,178, 44, 82, 82, 82,112,239,222, 61,116,237,218, 21, 5, 5, 5, 16, 0,152,121,247, - 46,188, 71,143,134,174,172,235,130, 72, 36,194,196,137, 19, 95,215, 59,118,169,192, 34,106,175,168, 98,171,116,184,180, 21, 99, -231,138,163,152,186,120, 12,156,218, 72,176,122,238,246,242,237,171,126, 10, 46,235,135, 37,130, 68, 94,255,100, 20, 22, 22, 10, -126, 88,189,186,125,231, 78, 93,164,163,198,140, 35,245, 12,139,165,223,175,167, 14,238,223,227,176,103,207, 47, 82,137, 68,146, -192, 63,142,121,252,215,240,170,196, 85, 85, 7, 43, 36, 36, 36, 46, 36, 36,228, 5, 55,236,181, 10, 44,138,162, 80,113,200,114, -117, 15,121, 75,250, 96,205,152, 49, 3,214,214,214,213,110, 51, 24, 12, 92,108,108,108,188, 90,173,222, 81,219,219,107, 77, 16, - 9, 73,151, 53, 63,236,242,152,246,229, 40, 22, 40, 29,173,181,121,243,102, 59,115, 31,172,138,253,176,234,234,131,229,236,236, -188,104,229,202,149,211,222,126,251,109,146, 36,201, 74, 15, 63,115, 88,134,138, 31,163,209,136,227,199,143, 79, 11, 9, 9,169, - 49, 76, 3,199,149, 54, 63, 21,151,104,160,213,149, 62, 96, 31,221, 11,181,244, 12,168,219,113, 40,115,174,186, 36,229, 86,235, - 92,157,113, 41,125,112, 13,200,174,155,139, 32,169,164,228,148,180, 78,174,142,118,200, 43,120, 14,113, 89,179,160, 25,102,113, - 37, 21,211,104, 96, 43, 71,238,179, 44, 8,133,194,218,220,145,148, 44,117,202, 27,195,134, 12, 56, 71, 82, 2, 73,197, 13, 66, -169,141,213,249,235,119, 27,100,230,149,128,173,144, 79,150,227, 48,117,137,101, 38,166, 80, 40,196,228,201,147,107, 20, 56,199, -142, 29,211,212, 95, 96,233,234, 87, 71,245,112, 50,235,114,176, 44, 21, 88, 85, 97, 30, 93, 72,211,180, 87,153,248,178, 24,237, -219,183, 63,109,101,101,213,212,210,253, 45, 13, 58, 74, 16,196,226,222,189,123, 47,243,240,240,112,254,252,243,207, 9,129, 64, -128,142, 29, 59, 58,246,237,219,183, 0, 0, 90,183,110,109,109,190,199,172, 91,183, 14, 9, 9, 9,217, 4, 65, 44,169,245, 90, - 23,137, 18,109,109,109, 59,246,238,221, 27, 5, 5, 5, 72, 77, 77,133, 92, 46,135,247,234,213,184,251,197, 23,240,221,186, 21, -100,239,222,165, 2, 83, 44,198,221,187,119, 33, 22,139, 19,181,218,106, 59,145,195,205,205,173, 51,199,113, 43, 1,116,199, 95, -205, 18, 28,128,235, 4, 65,124,173, 82,169,110,191,240, 39,146, 32, 75, 95,212,106,175, 40, 81,129, 11,116,105, 98,140, 29, 59, - 22, 52, 45, 2, 68, 34,204,154, 53,171,194,253, 72, 4,170,172, 63, 22,107, 18, 89,242,182,205, 85, 17,235,132, 88, 36, 18,143, -249,228, 83,242,235, 89,211, 89, 35,195,176, 2,129,144,156, 57,127, 57,249,224,254, 61,113,113,113, 49, 73,212,231,205,138, 7, -143,127,137,131, 85, 81,104, 85,112,161,106, 66,118,197,126, 89, 53, 9,180,138,125,178, 0,232, 94, 69, 90, 5,149,222,203, 42, -227, 65, 76, 76, 76, 75, 31, 31, 31,164,166,166,214, 52, 82,174,116, 8,179, 84,138,135, 15, 31, 2,192,131,154, 14,116,233,210, -165,141, 0, 54,154,151, 21, 10, 69,215, 94, 67,123, 93,247,237,237,135,208,181, 7, 11,212,106,181, 47,254,138,137, 69,184,185, -185,141, 18,138, 4, 31, 53,111,219, 40,208,196,178, 43, 47, 29,191,190,168, 38,238,170,125,176, 24,134,121,233, 62, 88, 4, 65, - 12,125,251,237,183,201,248,248,120, 12, 27, 54, 12,191,252,242, 75,141,133, 55,106,212, 40, 28, 56,112, 0,253,251,247, 39, 87, -172, 88, 81, 99,152, 6,142, 3,140, 6, 6,197, 37, 90,104,181,186,215,118,226,253, 93,231, 10, 0, 56,150,185,112, 55, 58,178, - 67, 59,255,174,194,228,180, 12, 72, 68,194, 74, 2,203, 74, 76, 67, 34, 46, 93,231,234,212, 0,225, 55, 46, 27, 24,198, 88,215, - 48,248, 20,131,246,249, 11, 65, 26, 57,130, 74,234,215,189, 93,131,106, 29,207,185, 99,208,238,183, 53, 22, 9,172,159,127,254, - 89, 83,147,123,101,105, 25,112, 28,202,155, 8, 75, 52,175,182,142,156,157,157,157,156,157,157,183,216,217,217, 73,204,125,135, -170,219,110,107,107, 43,169,205,225,170, 75, 92,149,197,197, 74, 88,190,124,121,189, 68,150, 72, 36,106,122,253,250,245,150,230, -126,129,181,125,235,245,122,124,244,209, 71, 22,217,130,145,145,145, 59, 59,116,232,240,200,201,201,233,124,183,110,221,196,241, -241,241, 88,186,116, 41, 33, 20, 10,109,204,215,101, 81, 81, 17, 4, 2, 1,242,242,242, 64, 16,196,216,200,200,200, 51,181,113, -234,116,186,176,176,176,176, 14,131, 6, 13,162, 18, 18, 18, 32, 16, 8,192,178, 44,116, 93,186,192,119,235, 86,220,155, 62, 29, - 61,147,147,161, 51, 26, 33,145, 72,112,230,204, 25, 67, 73, 73, 73, 88, 45,121,223,126,243,230, 77, 31,137, 68, 2,131,193, 0, -150,101, 65,146, 36, 65, 81, 84, 15, 31, 31,159, 13, 0, 2, 42,238,223,164,137,147,115, 71,223, 86,173, 77, 44,107, 82,170,178, -179,107,117, 43,173,179,225,228, 37, 46,239,111, 69, 11,105,208,130, 82, 97,101,118,174,104, 33, 13,154, 22, 65, 44,178,168, 9, -159,171,122,238,152,251, 94,201,100, 86,108,139, 22, 45,226, 31, 60,124,228, 13,128,180,181,181,179,184, 95, 44, 15, 30,255, 52, - 13, 85,155, 80,170,120,137, 85, 88,206, 6, 64,148, 45,103, 87, 16, 82,217, 4, 65,220,225, 56, 46,160,202,190,230,237,250, 42, -223,230,237, 49,175, 34, 35,181,221, 40, 7,140, 31, 63,126,235,155,111,190,217,103,230,204,153,144,203,229, 80,171,213,229, 23, -173, 72, 36, 66,195,134, 13,161,209,104,112,229,202, 21,228,231,231, 95, 4,240,153,165, 7, 86,171,213,183, 30, 70, 63,120,214, - 99, 80,103, 7,175,206,173,237,210,147,210,187,168,213,234, 27, 0, 8,119,119,247,159,134, 79,127,251,147,160,247, 59,129, 22, - 9,145,246, 48, 3,151,142, 95,175,145,171,106, 31,172,191, 19, 27,139, 36, 73,138, 32, 8, 12, 27, 54,204,162,253,135, 15, 31, -142,203,151, 47,163,182,230,196,210, 38, 66, 3, 74,138, 53, 40,121,133, 2,139, 32, 8,152, 76,166,114,231,202,252,233,167, 50, -128, 36,201,114, 97,241,118, 22,107, 49,167,182,164,100,213,213, 11,199, 38,182,246,110,239,212,213,175, 21, 30, 60, 73,195,170, -121,127, 53,181,204,154, 52, 28,187, 15, 28,135,155,171, 3,116,154,231, 56,123,234,120, 65, 97, 97,225,170,151,205,195,238,163, -151, 1, 0,111,140,172, 60, 70, 96,216, 87,235, 44, 59,129, 5, 2,140, 27, 55,174, 70, 7,235,252,249,243,154,138, 78,100, 93, -117, 84, 92,172, 69,137, 70,243,202,234, 72,161, 80,248, 6, 4, 4,156,223,182,109,155,131,163,163, 35, 84, 42, 85, 37,129,165, - 80, 40,124, 59,118,236,120,126,219,182,109, 14, 78, 78, 78, 72, 77, 77,181, 56, 68, 72, 21,113,133,236,236,108, 34, 47, 47,143, -109,208,160, 65,189, 68, 22, 73,146,208,233,116, 72, 72, 72,176,244, 26,177, 56,232,104,211,166, 77,127, 89,191,126,189,248,233, -211,167, 48, 26,141,136,143,143,127, 97, 16, 2, 69, 81,152, 51,103, 14,230,207,159,191, 5, 64,227,218,248, 24,134, 89, 59,122, -244,232,241, 74,165,178,129,139,139, 11,212,106, 53,104,154, 6,199,113, 32,130,130,240,198,147, 39, 48,152, 76,144, 74,165,184, -127,255, 62,118,236,216, 81,108, 48, 24,214, 86,199,229,233,233, 41, 2,208,146,166,105,124,252,241,199,149,182,237,217,179, 7, - 93,189,242, 58,218,117,162,159,155, 56, 90,247, 28, 94,167, 73,146, 36, 58,250,181,106,213,163,107,187,182,113,241,201,143, 84, - 89,185,215,107, 21,255, 5, 14, 48,168,196, 0, 77,255,213,223,170,172,207, 21, 37, 18,149,143, 40,228, 68, 34,176, 34,203,130, - 5, 87, 20, 77, 4, 65,192,193,193, 65,183,110,237, 42,177, 76, 38, 51, 1,128,181, 92,102, 58,184,103, 51, 28,236,237,117,220, -203, 88,161, 60,120,252,115,157,171, 59,255,139,255,190, 22,129, 21, 21, 21,245, 4, 64, 95, 0, 35,175, 92,185,178,102,198,140, - 25, 78, 61,122,244, 64,110,110, 46, 26, 55,110, 12,133, 66,129,136,136, 8,196,196,196,228,112, 28, 55, 51, 50, 50,178, 58,171, -167, 45,106,137, 57,163,122,172, 62,100, 40, 41,249,194,183, 71,107, 92, 14,189, 26,226,234,234,250,153, 64, 32,248,114,204,220, - 65,159,244,122, 47, 0, 73, 81,201,184,117,238, 46,212,169, 57,181,114, 90,210, 7,171,226,119, 53,125,176,202, 57, 89,150, 53, -233,245,122,252,246,219,111, 22,137,172,253,251,247, 67,171,213,130,101, 89, 83, 77,121, 55,177, 38,194,218,198, 9,238,141,188, - 96,208, 23,131,101, 45,127,179,228,234, 40, 79,134, 97,176,104,209, 34,204,158, 61, 27, 75,150, 44,169, 85,136,108,222, 92,109, -223,175, 74,156,121,121,121, 69, 98,177,120,212,129,159,215,135,142,156, 48,205,218,163,155, 47,118, 30, 60, 5,163,193, 8,137, - 88,128, 6, 54,114,180,104,234, 14,189,182, 4, 63,110, 92, 83,168,213,106, 70, 85,211,247,172,182,122,175,132,177, 67, 2,241, -253,142, 63,112,117,223, 95, 6,229, 27, 35, 23,226,215, 31,166,194,207,111, 87,173,156, 38,147, 9, 66,161, 16,251,246,237,211, -212, 52,154,144,162, 40,212, 34,176, 42,213,145,141,141, 19, 60,154,120, 67,175,125,254,202,234,200,193,193, 97,246, 79, 63,253, -228,160,209,104,144,152,152,136,196,196, 68, 16, 4,145, 80,117,123,113,113, 49,238,221,187,103, 22, 57, 9,150,150,167,217,185, -202,206,206, 38,212,106, 53,172,172,172,200,216,216, 88,109,251,246,237, 19, 80,214, 71,171,174,188,235,116,186,167,125,236, 87, -186, 77, 0, 0, 32, 0, 73, 68, 65, 84,250,244,169,201, 49,114, 23,139,197,149,166,108, 50, 7, 29,173,166,169,240,133,116,166, -165,165, 69,175, 95,191,190, 81,171, 86,173,176,125,251,118,157,181,181,181,104,198,140, 25,160, 40,138, 88,183,110, 29,151,155, -155,107,152, 51,103,142,232,218,181,107, 40, 46, 46,142,182,224, 30, 82,164,213,106, 39,118,235,214,109,239,233,211,167,165, 45, - 91,182, 44,159,233, 97,247,238,221,152, 50,101, 10,164, 82, 41,146,146,146, 48,120,240,224,146,146,146,146,137,168, 28, 3,171, -156,147, 97, 24, 66, 40, 20,114, 44,203, 98,193,130, 5,149, 2,139, 90, 89, 89, 65, 42, 50, 97,219, 98, 79,217,244,239, 51,100, -211,190, 24, 61,186,244, 60, 97, 77,113,241,201,143,182,237,252,227, 18, 42, 71,137,127, 33,239,172,109, 1, 28, 91,150, 58, 88, - 66,115,204, 43, 90, 92,105,244, 96,105, 28,172,210,184, 88,117,229,189,106, 87, 12,123,123,123,198,223,223, 47, 94,163,209, 80, -102, 45,229,232,232,120,175,108, 95,174, 97,195,134,250, 23, 79, 79,203,175,205,122,128,231,228, 57,121,212,211,193, 2, 0, 68, - 71, 71,239,243,241,241, 57,189, 98,197,138, 21, 71,143, 30,157, 48,109,218, 52,194,198,198, 6,135, 14, 29,226,114,115,115,119, -137, 68,162,217,183,110,221,122,169,120, 17, 28,199,237,190,118,252,214,164, 17,211,223, 37,166,253, 48,182,123,116,216,189,132, -246,221, 91,162, 93,183,150,136,184, 24,143,205,243, 14,252,194, 24,153,239, 50, 50, 50, 82,107,227,177,164, 15,150,249, 35, 16, - 8,234,140,131,117,244,232,209,105, 3, 6, 12, 32,195,195,195, 95,232,115, 85,177, 31,214,249,243,231, 97, 48, 24,112,232,208, - 33,182,182, 56, 88, 44,112,108,237, 15,223,141,249,121,207, 73, 17, 73, 24,112,243,202, 97, 20,228,101,212, 90, 54, 52, 45,196, -175,251,143, 25, 4, 2,234,126, 45,105, 77,137,140,140,116,248,254,251,239, 41,146, 36,177,121,243,230, 74,206, 85, 85,220,189, -123,151, 53, 26,141,117,214,149, 90,173, 62,207,178,236,240,173,107, 23,239, 14,234, 63,200,174, 77, 27, 31,129,179,115, 35, 8, - 72, 18,249,185,217,184,115,235, 26,115,230,228,239,249,122,189,126,172, 90,173, 62,255,119, 78,192,144,109,191, 87,187,254,131, -105,107,234,114, 81, 24,163,209, 40,144,201,100, 96, 24,166, 90,113,213,167, 79, 31,233,245,235,215, 53, 6,131, 1, 20, 69,213, -170,152, 74,235,104,225,152,159,247,190,218, 58, 50,153, 76, 94,121,121,121, 40, 46, 46, 70, 68, 68, 4,183,121,243,230,236,252, -252,252,121, 21,183,231,230,230,162,168,168, 8,119,238,220,225,182,111,223,158, 93, 88, 88, 56,207,210,242, 51,199,197,202,203, -203, 99,173,172,172, 72,163,209,104,108,223,190,189,132,166,105, 47, 75, 57, 98, 98, 98,222,170,105, 91,183,110,221, 30, 92,191, -126,189, 69,197,185, 9, 25,134,161,117, 58, 93,203,193,131, 7,215,121,255,144, 74,165, 35, 14, 31, 62,188, 79, 34,145,180,211, -106,181,227,179,178,178,118, 3,104, 68, 81, 20, 30, 62,124,152,195, 48,204,208, 5, 11, 22,252, 92, 92, 92,124, 87, 46,151,143, -180, 48,201,255,143,189,239, 14,143,162,218,223,127,103,102,123, 73,111,187, 73, 72, 32, 13,210, 8, 9, 1, 2,132, 42,157, 32, - 40, 32,136, 74, 81, 81, 80,138,128, 20,175,210, 53, 8, 40,136, 10, 2, 34,196, 6,132,166,180, 32, 72, 9, 37,148, 20, 74, 42, -144, 0,105,155,108,122,219,190, 51,243,251,131, 36, 23, 48,101, 19,245,119,239,247, 58,239,243,236,179, 59, 59, 51,239,156, 57, -115,230,204, 59,239, 57,231,115,226,178,178,178,166, 4, 6, 6,126,183,114,229, 74,217,192,129, 3,249,174,174,174,232,222,189, - 59,178,178,178,112,252,248,113,227,214,173, 91, 53, 26,141,102, 6,128,211, 45,188,116,176, 0, 8,179,217,252,212, 28,166, 66, -161, 16,124, 62, 31, 26, 61,137, 55, 63,204,214, 50,224,107, 63,217,240,195,113,150, 5, 81,168, 42, 45, 45, 42,174,188,198, 51, -153,226, 31,169,106, 91,156,235,137, 46,149,162,163,117,112,227,203, 29, 65, 16, 32, 25, 18,132,145, 0, 69, 83,160, 76, 20, 8, - 30,239,177,187,101,217,116, 87,172,217,108, 70, 84, 84, 20,142, 29, 59,134,113,227,198,177,104,161,175,200,177, 99,199, 96,137, -123,203,129, 3,135,255,144,192, 2,128,212,212,212, 74, 0,111, 17, 4, 17, 51,103,206,156, 99, 12,195,240, 25,134, 25,125,243, -230,205,139,127,230,224, 69, 69, 69, 73, 87,142, 39,126,224,228,102, 27, 61, 98, 74, 95, 4,245,240, 4,109,166,113,249, 68, 10, -118,127,114,100,111,126, 94,254,116, 60, 61, 87, 97,147,176,164, 15,214,179, 14, 86,115, 92,106,181,122,197,218,181,107,241,241, -199, 31,183,121, 20, 97,115,219, 36, 36, 22,190, 21,209,157,113, 31,255,124,223,225, 36, 65,176,250, 22,250,217, 16, 4,216,134, -158, 22, 60, 30,149, 25,127, 45, 63,164,133,252,123,110,246,236,217,191,147, 36,233,249,132, 21,138, 22, 30,246,170,178,178,178, - 97,150, 92,155,226,226,226,147,110,110,110,157, 47,196,253,186,236,210,153,147, 3,105,218,232, 67,128,128, 64, 32,184,111,162, -205,231, 77, 6, 67,116, 65, 65,193,159, 14,196,182,236,173,113,120, 84, 88, 10, 30,143,122, 28,123,170, 62,160,233,193, 45, 11, - 16, 22,246, 99,179,251,137, 68,162,147,223,125,247, 93,212,107,175,189, 70,240,120,188,198,102,183,134,243, 39, 73, 18, 87,175, - 94,213, 26, 12, 6,236,222,189,155,149, 72, 36, 45, 6,174,253,187,174, 81,109,109,237,140,177, 99,199,238, 1, 32, 2,112,175, -170,170,234,109,149, 74,149,255,228,250,113,227,198,237, 1, 32, 34, 8,226, 15,235, 91, 67, 67,200, 6, 59, 59,187,244,122,231, - 74,220,158,142,238, 45,148,111,170,185,230, 67, 75,154, 10,235,231, 22,124,177, 97,185,123,247,238,171,103,205,154,245,228,100, -207,241, 0,188,219,145,180,211, 90,173, 54,232,195, 15, 63,156, 39,145, 72, 6,105,181, 90,127, 0,144, 74,165, 25, 26,141,230, -156,209,104,252, 2, 64,101, 75, 4,217,217,217,134, 78,157, 58,101,153,205,230, 96,103,103,231,198,209,135, 66,225, 99, 55,233, -106,134,125, 98, 97, 97, 97,143,199,227, 52,175,181,245,229, 49,191, 37, 71,185,185,125, 90, 90,111, 48, 24, 74,174, 92,185, 98, -127,230,204, 25,138,166,105,196,197,197, 53,190,244, 53,213, 26,152,157,157, 13,131,193,160,227, 30,115, 28, 56,252,103,240,119, -143, 48,177,200, 66, 84, 42,149,147,196, 50,209,108,207,206,202,144,194, 28,117, 90, 77,165,230, 71,149, 74,181, 29,143, 67,214, -115,246,233,255, 40,167, 64, 98,117,138,160, 4,158,205, 62,112,104,227, 35,163,182,102,120, 83,156, 61,123,246,116, 19, 8, 4, - 27,244,122,253,200,150,162,180, 83, 20,101,150, 72, 36, 39,117, 58,221,251, 77, 76,246,252,127, 46, 63, 87,174, 92,217,164, 37, - 97,233, 40,194,149, 43, 87, 50,109, 73,103, 72, 72,200, 57,169, 84,170,108,106,157, 70,163,201,189,117,235,214,176,255,146,252, -124,114, 4,160,197,156,237, 26, 69,248, 31,186,143,220,220,220,196,214,214,214, 27, 72,146, 84, 90, 40,142, 13,106,181,122, 65, - 89, 89, 89, 17, 87, 47,113,156,224,154, 8,255,231, 16,204,113,114,156, 28, 39,199,201,113,114,156, 28, 39,199,249, 79, 3,215, - 64,207,129, 3, 7, 14, 28, 56,112,224,240, 23,131,104, 65,133,182,197,250,107,143,146,189,195,113,114,156, 28, 39,199,201,113, -114,156, 28,231, 63,142,179, 53,110,174,233,241,111, 18, 94, 28, 39,199,201,113,114,156, 28, 39,199,201,113,254,243, 56,255,167, -192, 53, 17,114,224,192,129, 3, 7, 14, 28, 56,252,167, 4,150,204,197, 63,192,209, 51,100,143,157,123,215, 91,118,238, 93,111, - 57,122,134,236,145,185,248, 7,252, 19, 51, 77,169, 84, 74, 20, 10,197,148, 14, 29, 58,156,238,214,173, 91,181,171,171,235,123, - 92, 81,106, 59, 6, 0,188, 73,192, 59,175, 1,185,175, 1,185,147,128,119, 6,252,133, 19,144,255,183, 96,245, 59,174, 17,241, - 39,167,156, 92,253,142,107,147, 1,216, 86, 46, 84, 58, 92,138,155,248,197,178,119, 92,237,255,162, 67, 90, 57, 59, 59,239,112, -113,113,121,232,236,236,252,200,217,217,249, 59, 0, 54, 92,137,227,192,129, 3,135,255,127,176,232, 97,102,231, 17,252,134,143, -151,207,251,171, 87, 44, 35,220, 20, 78, 82,147,153, 54, 62,120,152, 31,184, 98,237,186, 3,133, 66,222,231, 21,185,119,190,109, -199,177, 9,119,119,247, 73,124, 62, 63, 10, 64,131, 80, 75, 55,153, 76,199,242,243,243,247,193,178,225,214,232,218,181,235, 37, -138,162, 60,218,114, 96,134, 97, 30,222,186,117,171,127,123, 50,204,213,213,117,162,171,171,235,119, 17, 17, 17,210,208,208, 80, - 8, 4, 2,172, 95,191,126, 97, 97, 97,225, 38,203,149,197, 0,158,115,165,253,107, 20,143, 55, 6, 64, 8,203, 2, 32,168, 91, -140,201,120, 92,109, 87,182, 7, 23, 46, 88, 20, 70, 92,161, 80,124, 64, 16,196,180,250,188,250, 86,165, 82,109,248, 59, 10,137, - 82,169,236, 64, 16,196, 32,150,101,253, 73,146,188,205, 48,204,111, 42,149,170,236,207,242,186, 0,111,245,137,140,252, 98,234, -194,133,148, 54, 62, 30, 95,124,247,221,102, 84, 87, 3,192,215,109, 45, 75,189,122,133, 78,176,178, 66, 20, 1,132,129, 0, 65, -130, 77, 41,175, 36, 79,220,184,145,188, 15, 22,196, 82,107, 14, 97, 97, 97,199, 1,140,170, 95, 60,145,156,156, 60,186,173, 28, - 21,217,204, 71, 34,190,127,191,138,251,231, 62, 2, 48,242,217,245,102,157,120, 42,197,239, 16, 69,177,201,121, 0, 62,251,147, -217, 42,117,114,114,186,117,228,200, 17,247, 94,189,122,241, 0, 32, 49, 49,241,181,168,168,168,193, 37, 37, 37,193, 0,170,255, - 19, 21, 77, 68, 68,132,157,217,108,142,161, 8, 34,130, 97, 24, 91, 0, 32, 73,178,146,102,217,171, 60, 30,111,106,123,131, 21, -115,224,192,129,195,255, 89,129, 37,115,238, 18,232,231,227,187, 48,238,112, 76,135,202,242, 74,221,215, 27,246, 36,107,121, 66, - 77,167, 64, 63,193,150,207, 63,181,125,119,254,162,249, 70,189,233, 90,157, 58, 51,205,210,131, 42, 20, 10, 15,145, 72,116,232, -131, 15, 62, 8,142,140,140,228, 59, 59, 59,163,184,184, 24,153,153,153,193,151, 47, 95, 30,119,228,200,145,133,122,189,254,197, -214, 34,184, 3,128, 76, 40,240,218,247,233, 39, 10,161,173, 29, 88,218, 12,219,160,110, 0, 0,150, 97,160, 58,127, 26,140,201, - 4,150,161,225, 62,226,249,199,255,179, 44,122,246,236, 41,104, 79,102,185,185,185,185,250,249,249,253,176,116,233, 82,129, 94, -175, 71, 74, 74, 10, 18, 18, 18, 24,181, 90,189,206, 82, 14,231,224,113,129,100,141,232,192,216,113, 35, 59,142, 30,234, 44,244, - 84, 56,129, 97,196,200,204, 49,122,156,190,152, 60,226, 68,220,111,239,211, 1,227, 38,150,164, 31,185,221, 18, 79, 80, 80, 80, - 68, 69, 69,197,199, 5, 5, 5, 13,194,111,125,207,158, 61,151, 63,185,205,179,193, 7, 25,134, 1,143,199, 43,214,104, 52,147, - 82, 83, 83,147,155,226,253,240, 13,152,204,230,199,229,130,199, 3, 29,243,155,251,225, 65,131, 6,117,154, 49, 99, 6,194,194, -194,144,152,152, 56, 40, 54, 54,118,222,241,227,199,111,152, 76,166, 19, 34,145,232,252,163, 71,143,218, 53,193,162, 0, 88, 60, -117,225, 66, 74,254,240, 33,228, 41, 41,120,165,186,154,247, 41,176,184, 45, 2, 43, 44, 44,204,203,193, 14, 7,198,189, 56, 32, - 64,161, 8, 20,240,249,142, 96, 89, 22, 38, 83,121,231,146,146,244, 9, 54, 54, 88, 90, 85, 69,141,191,113,227,198, 61, 75,248, -194,195,195, 93, 24,134,249,134,101, 89, 1, 65, 16,115, 0,140,138,139,139, 3, 77,211, 24, 61,122,244,168,176,176, 48, 47,150, -101,191,148,203,229,172, 86,171,125, 61, 49, 49,177,184, 37,231,170,242, 62,243,145,138,242, 30,209, 37,124, 26,138,120,167, 70, -188, 55, 12, 39,109,189,201, 53,203,191, 46,188, 10, 0, 35,188,189,173,170, 10, 36, 75,228,214,193,246, 85, 5,167,151,140,240, -246,222, 25,151,157, 93,211,222, 27,218,213,213,117, 67, 76, 76, 76,135,136,136,136,198, 32,185,161,161,161,212,250,245,235,221, - 22, 44, 88,176,185,162,162, 98,186,133,162,186,179,131,131,195, 41,134, 97,244,105,105,105,157, 27,254,119, 10,121,161,143,131, -149,236,185,146,138,154,248,178,180, 95, 46, 88,194,213,189,123,247, 25, 4, 77,239,248,252,195,119,169,128,144, 16, 72, 29,157, - 97, 44, 44, 68,157,217,100,127,245,102,234,232, 79, 55,237, 40,233,222,189,251,204,164,164,164,239,184, 42,153, 3, 7, 14,255, - 24,129, 37, 18, 9,151,174,248,215, 18,162,162,172, 82,107,172,169, 54, 74, 89,131,217, 90, 42, 38,170,213, 37,149, 15,172,165, -154, 5,243,231,138,151, 44,253,215,210, 58,224, 21, 75,197,149,191,191,255,245,157, 59,119, 58,219,219,219,163,170,170, 10,101, -101,101,184,126,253, 58, 88,150,197,200,145, 35, 69,221,186,118, 13,251,124,211,166, 4, 0,189, 91, 19, 89, 60, 62,143,224,203, -100, 56, 56, 32, 12,164, 64,128,241, 25,170,199,226,194,100, 68,220,228, 49, 0, 0, 74, 40,196, 75,119,213, 0, 0,177, 88,220, -238,204, 98, 89,182,119,223,190,125, 5, 0,176,112,225,194,234,186,186,186,104,130, 32,126, 82,169, 84, 5,150,236,239, 16, 60, -198,207,209,201,233,194,198,181,111,218, 7,123,121,195, 96, 50, 33, 95, 93, 0, 22, 66, 40,156,101,120,101, 92, 55, 65,223,112, -129,239,103, 95,255,126,158, 32,159,239,175, 78,253, 53,181, 89, 97, 41,147,197,108,222,188, 25,251,247,239, 7, 0,156, 59,119, - 14,126,126,126,178,214,210,144,153,153,233, 61,109,218,180,189, 0,124,155, 90,111, 54,131, 23,253,241, 79, 0,128,152,157, 83, -168,172,172,172, 78, 18,137,228, 9,243,109, 0, 6, 12, 24, 64, 70, 71, 71,247, 58,119,238, 92,175,189,123,247, 26, 77, 38,211, -230,194,194,194,216,246,228,169, 54, 62, 30,242,148, 20, 32, 62,190,205,251,118,235,214,205, 35, 32,192, 33,225,179,141,203,157, -142, 30, 75,197,198,141,223,225,254,253,251, 0, 0,111,111,111, 76,121,121, 34,255,167, 31,191, 9, 90,186,116,229, 21,154, 14, -139, 76, 78, 78,110, 53,186, 57,195, 48,223, 68, 71, 71, 63, 47,151,203,177,116,233,210, 44, 47, 47, 47, 88, 91, 91, 99,251,246, -237,176,179,179,131,201,100,202, 90,191,126, 61,175,176,176, 16, 91,182,108,217,245,132,187,245, 7,244, 31, 53,224, 35, 17,223, -191, 95,151,240,105,144, 91, 43,177,243,231,125,200, 76,220,211, 79,111,202,248,104, 25, 46,188, 74,177,162,105,234, 92,217,210, - 78,225, 3, 29,124,131,198,162, 99,247, 20, 71, 61, 29,159,243,225, 80,175,117, 60,177, 46,102,229,103, 77,184,132, 19, 98,169, -224,234, 27,246,119, 78,203,202,128,198,160,161, 68,253, 7, 12,139, 49, 3, 6, 12,160, 26, 4,246,195,135, 15, 97, 48, 24, 16, - 24, 24, 72, 26, 12,134, 65,150,138,171,254,253,251, 95,250,225,135, 31, 28,250,245,235, 87,242,212,253,235, 96, 59,252,194,161, -205,115, 63,254,226, 71,255,239, 89,162,178,181, 23,129,238,221,187,207,232,218,217,251,219,205,235, 87, 16, 84, 93, 62,120,182, -101, 0, 83, 6,213,222, 93,128,212, 30,163,223, 94,128, 30,189,122, 81,115,231,127,240, 45, 17, 30,206, 38, 38, 38,238,230,170, -101, 14, 28, 56,252, 35, 4, 22,195, 50, 33, 78, 78,246,226, 45, 27,246, 36, 42,197, 36,161,112,119, 37,132,214,182, 60,200,101, - 34,146,226,107,189,189,221, 5, 12,203, 52, 55, 85,200,179, 67, 45, 9,145, 72,116,104,247,238,221,206,124, 62, 31, 12,195,192, -201,201, 9, 57, 57, 57,168,168,168, 64,109,109, 45,238,167,167,163, 99, 7,119,204,157,249,166,114,205,198,207, 14, 1, 8,199, -211,205,133, 79,113,178, 12, 11,198,252,116,139, 26, 65, 16, 77,182, 47,182, 48,141,140, 69, 67, 66, 25,134,121, 80, 88, 88, 8, -169, 84,138,128,128, 0,249,141, 27, 55, 46, 22, 22, 22, 22, 88,196, 57, 97, 2, 37,120, 68,252,186, 97,237, 36,123,130,202, 66, - 86,110, 37,124,220,123,194,193,166, 3, 10, 74,106,145,148,118, 2, 89,247,143,195,199,221, 3, 51,167,248,216,110,250,166,228, - 24,194,102,250, 32,121,135,169, 41,206,154,154, 26,185,135,135, 7,220,220,220,192, 48, 12,104,154, 70,106,106,106,227,239,134, -249, 18, 27,126,111,254,233, 50,236,168, 82, 76,122, 97, 20,202,203,203,229,150,158,123,131,184, 58,240,153,107,144,182, 78, 37, - 0, 0,137, 76,105, 28,191,160, 32,181, 71,143, 30,112,114,114, 18, 92,185,114,101, 1,128,216,182,230,167, 17, 88,255,197,238, -221, 91, 94,169,170, 34, 1,224, 91,130, 96,140,143,163,106, 91, 84,150,156, 28,137,195,155, 54,125,228, 68,176,105,176,183,249, - 20,215,175, 63,130,209,248,248,202,151,149,169, 49,231,157,106,240,120, 86,248,236,179, 21, 14, 47, 77,154,117, 16,143, 71,189, - 48, 45,165,147,101, 89, 65, 70, 70, 6,130,130,130,176,119,239, 94, 30, 69, 81,184,118,237, 26, 36, 18, 9,166, 77,155,134,224, -224, 96,158, 68, 34,193,197,139, 23, 81, 93, 93, 77,180,148,206,248, 19, 23,214, 84,100,159,251,168,136, 58, 53, 98,231,207,251, -240,230,203,147,160, 48,103, 95,180,243, 33,215,140, 28,221,103, 57,197,239, 16, 37,179, 10,182,243, 11, 30, 11,129, 80,142,119, - 23,175, 70,214,157, 95,237, 52, 53,183,223,161, 77,121, 29, 86,126, 22, 59,239, 15,233, 60, 48,145,158,186, 59,190,251, 25,143, -100,207, 59, 41, 51,175,169,146,119,220,250,247,161, 3,120, 32,181,182, 13,226,234,222,189,123,184,127,255, 62, 40,138,130, 86, -171,125,106,162,224, 39, 57, 67, 67, 67,223,162,105,122, 57, 0, 24, 12,134, 61, 18,137,100,198,151, 95,126,233, 64, 81,255,158, - 41,170,193,185, 42, 86,151, 85, 92,185,145,154,185,224,173, 9, 3,227,175,222,201, 51,242,199,230, 86,221,250,165,170,169,252, -140,136,136,176, 35, 25,102,199, 23, 27, 87, 17,116,246,239, 16, 5, 12, 4, 79,238, 7,218, 84, 0, 93, 69, 45,180, 57, 69, 48, -110,255, 10,222,111,207,199,134,245, 31, 19, 47,191,250,250, 14,111,111,239, 67,217, 79, 59,120,127,199,112,109,142,147,227,228, - 56,255, 59, 57,255, 89, 2,139, 32,200,106,163,209,196,183,238,224,102, 26,255, 98,255,174,201,215,238,100,201,237,109,200,110, - 61,187, 6,222,201,202, 79,130,153, 54, 18, 4,105, 81,191, 14,119,119,247, 73, 43, 86,172,232,106,109,109, 13,134, 97, 96, 99, - 99,131,146,146, 18, 24,141, 70, 84, 87, 87, 67, 95, 91, 3, 99, 77, 53,110,230, 62, 68,228,192,129, 24,218,187,119,192, 9,147, -105, 82,126,126,254,222,230, 56,105,146, 98, 29,194,122, 98, 98,118, 25, 24,163, 1,177,222, 14,141,174,213,228,135,149, 32, 8, - 2,180, 65,143, 19, 61,125, 33,146,203, 16,242,254,138,118,103, 86, 81, 81, 81,242,153, 51,103, 78,142, 24, 49, 98,228,204,153, - 51,201,162,162,162, 56,179,217,220, 87,173, 86,183,218, 60,234,124,151,158, 54,117,102,152,183,163, 45,137,163,151, 79, 33,194, -255, 5, 72, 69,124,148, 84,104, 65, 18, 4,238, 63, 56, 3,154,150,225,102, 70, 46,122, 7,203,208,175,151,141,123,237,239,229, - 51, 75,155,111, 46, 35, 42, 42, 42,160, 86,171, 97, 50,153, 96, 54,155, 49, 97,226, 68,196,236,217,131,186,186, 58,232,116, 58, - 24, 12, 6, 48,204, 99, 61, 81, 84, 82,139,235, 55,227, 16,222,181,115,131,227,209,116,129,224,193,252,229,230, 41, 60, 43, 41, - 32, 16, 57, 25,107,106,106, 32,147,201,160,173, 83, 9,166,190,217,232,108, 9,206,157, 59,135,164,164, 36,184,186,186, 90, 84, -142,154,194,125, 96,199, 3,154,254,112,228,225,195,206,151, 15, 31,102,174, 30, 61,154, 47,170,169,217,110,201,190,189,122,133, - 78,120,247,221,209, 1, 18,177, 4,249,185,155,225,239, 47,192,194,247, 28, 16,253,105, 41, 0, 96,238,187,238, 8, 15,119, 64, -117,229, 1, 56, 58,127,128,133, 11,198,249,212,214,178,175, 37, 36,164,236,105,185,188, 19,115,126,252,241,199,172, 97,195,134, -241,146,147,147, 33, 18,137, 32,145, 72, 32, 22,139, 33,145, 72, 80, 84, 84, 4,131,193,128,216,216, 88,115,125, 19, 98,179,168, -111, 6, 28,249,222, 80,156,204, 76,220,211,207,141,204,185, 57,110, 65,159, 7,201,215,110,214,158,253,253,242, 26,179, 78,156, - 87,153,127,122,137, 87,143,155,142,239,188,191, 10, 95,109, 88,129,204,107, 23,202, 93, 60,106,190,166, 9,125,147,233, 28, 48, - 96, 37,207,221, 93, 97,154, 61, 99,188,205, 49,229,149, 55,143,241, 80, 90, 92,126,123, 35,178,175,107, 69,126, 65,175,118,246, - 34, 12,103,207,158,149,244,239,223, 31, 90,173,246,241,189, 64, 81,248,241,199, 31, 25,179,217,124,174, 41, 78,147,201,180, 60, - 41, 41, 73,169,209,104,240,242,203, 47,207, 93,185,114,165,140,207,231, 63,190,191,104,250, 41,231,106,237,166,239, 79,205, 95, -254,245,185, 83,123, 63,117, 93,187,116,198,192, 87,222,253,248, 28,128,184,166,221, 80,115,204,166, 79,151, 81, 34, 91, 35,136, - 30,195, 96, 84,107,241,232,219,153, 48, 84,105,209,121,205,106, 0, 2, 24,140, 20,142,141,155, 8,202,222, 21,111,244,239,203, -219,126,225, 82, 12,128,113, 92,213,204,129, 3,135,103, 94,126,123, 0,112,170, 95, 44,173,127,142, 57, 0,104,112,217,157, 0, - 24, 0, 8,159,216,237,217,229, 39,183,125,118,249,201,223,165,245,198,142, 19, 30, 79,217,119,157, 32,136, 54,247, 19,109, 24, - 69,248,164,225,195, 62,227,218,196,223,207,126,168, 29, 56, 32, 92,121,238,250,221,228, 17, 47, 12,237,217,127,112,175,136,226, -178,234,108,133,147,181,236,202,181,171, 34,134, 97, 44,106,223,225,243,249, 81,145,145,145,188,138,138, 10, 72,165, 82,148,148, -148,160,160,160, 0, 70,163, 17,218,170, 74,232, 43, 43,160,173, 40,135,169,166, 18,247,111, 92, 67, 23, 15, 55, 81,125, 39,120, -139,240,172, 67,213, 48,131, 61, 65,146, 16, 91, 91, 65, 98,109, 13,138,106, 91,100, 10,165, 82, 57,182, 75,151, 46, 87, 93, 93, - 93, 63,172,127,195,127, 39, 58, 58,186,148,101, 89, 44, 89,178,196,218,218,218, 58,214,211,211, 83,212, 26,143,149, 61, 61,161, - 87, 87, 95, 42,235,209,109,132,251,141, 71, 39,101,127,220, 47,168, 66, 73,149, 14, 69,229,117,232,220,249,125, 56,185,190, 9, - 27,197,219,184,157,153, 7,165,162, 19, 73,241, 5, 35, 90, 17,124, 79, 45,255,252,211, 79,208,104, 52,240,245,245,197,228,201, -147,177,120,241, 98, 76,154, 52, 9,174,174,174,232,231,203,195,140, 87, 39, 64,173, 86,183,152,206,181,223,130,191,238, 39,101, -242,212, 21,108,178,239,115, 39, 83,239,223,191,143,172,172, 63,182,172,253,254,251,239,168,170,170,106,124, 0, 91, 2,103,103, -231,101, 10,133,226,150, 66,161, 72, 85, 40, 20, 39,138, 93, 93, 51, 76,222,222, 46,125,199,141, 35, 2, 95,122,137,202,147,201, -136, 7, 29, 58,200, 45,225,178,182,198,232,240,240, 72, 97,101,197,119,141,166,212,140,233, 78,184,116, 33, 8,151, 47,118,199, -156,119,189, 65, 18, 98, 16,164, 0,154,186,223, 17, 24, 20, 44,176,178, 98, 91, 44, 75,245, 29,218,179,131,130,130,120,179,102, -205,130, 72, 36, 66, 76, 76, 12,182,109,219,134,207, 63,255, 28, 89, 89, 89,240,244,244,132, 82,169,132,139,139, 11, 15, 64,118, -253, 62, 45,194,214,135, 92,163, 55,101, 92,180,243,147,101, 19,164,115, 31,189, 89, 60,126,229,103,170,178,181, 91,115, 62,123, -144,169,245,206,184,118,161, 44,235,206, 47, 76,206,141,115,165,133,119,107,189,215,110,205,249, 44,250,235,194,242,166,184, 46, - 92, 88, 65, 31, 57,113,193, 88, 87,171,225,141, 29,249,156,246,237,233,147, 59,219, 75,187,252, 8,183, 97,161, 29, 59, 40, 95, - 93,241,201, 22,195, 27,179,230, 27,191,221,245, 29, 91, 83, 83,131,234,234,106,124,241,197, 23,230,163, 71,143, 22,208, 52, 61, -191,153, 36, 82,245,130, 8, 19, 39, 78,148, 73, 36, 18,228,229,229, 53,186,160, 0,160, 42, 41,187,125,249,198,157,140, 5,111, - 79, 28, 80,167,215,235, 79,157, 79, 76, 15,244,243,116, 39, 8,182, 99,115,231, 77, 17, 68, 68, 80, 72, 8, 88,182, 18, 36,207, - 3,249,223,111,132,182,168, 28,154,146,114,144,124, 25, 76, 16,195,200, 10, 33, 14,233,137, 71, 73, 41,112,145, 91,131, 71, 16, -125,185, 71, 9, 7, 14,255, 92, 29,213,156, 22, 1,224, 68, 16,196, 49,130, 32,142, 45, 91,182,108, 16, 0, 7,130, 32,142,213, -139, 32,167,250,223,194,134,109,154, 89,118,122,146,231,153,125,159,252,237,184,108,217,178,193, 4, 65, 28,235,211,167,207,171, -245, 66,174,205,104, 85,109, 80, 58, 67,244,178, 15, 87,144,214,114,161, 85, 96, 64, 39,187,163,191,197, 39, 95,190,154,146,110, - 37, 21,139,106,235,234,132,159,127,185,205,131,208,104, 45,237,228, 29,224,232,232, 8,163,209,136,123,247,238, 33, 63, 63, 31, - 70,163, 17,102, 77, 29,244,149,149,208, 85, 84,128,209,212, 66, 64, 51,208,150,150,192, 78, 44, 4,254, 61,194,176, 37,101,219, - 40,166,154, 18, 92, 4, 65, 64,108,109, 5,161,149, 28, 36,143,178, 56,115, 20, 10, 69,247,208,208,208,253,103,207,158,237, 21, - 25, 25,185,198,211,211,211,166,184,184,248, 81,113,113,241,115, 27, 54,108,208, 59, 57, 57,225,149, 87, 94,233, 98, 50,153,166, -182,198, 37, 16,235,187,122,186,248,193,195,101, 44, 92, 29, 34, 80, 86,173, 71, 73,165, 22, 69,101, 26,236, 59, 56, 25,167, 79, - 78, 70,202,197, 87,113,239,218, 12,148,213, 89, 67,108, 63, 8, 0,219, 98, 32,183,171, 87,175,226,155,111,190,105,252,124,245, -213, 87, 40, 47, 47, 71, 80, 80, 16,242,242,242, 16, 23, 23,135,162,162, 34, 56, 57, 57, 33, 37, 37, 5,219,183,111,199,181,107, -215,218, 92, 72,116, 58, 29,248, 66, 7, 99,204,206, 41,136,217, 57, 5, 52, 43, 51, 62,153,247, 22, 23, 54,146,156,166, 26, 55, -174,171,202,214, 54, 48, 36, 36,100,228, 75, 47,189,228,221,171, 87,175,198,245, 62, 62, 62, 30, 60, 30,175, 72,169, 84,126,171, - 84, 42, 67, 91, 36, 99,216, 48, 59,251, 0, 24,244, 25,245,215,152, 7,130, 16, 97,240,208,116,244,237,151, 4,163, 73, 8,130, - 20,129, 36,196, 48,155,203, 96,109,229, 2,150, 37, 90, 11,140, 55, 42, 46, 46, 14,223,124,243, 13,114,114,114, 26,155, 71,163, -162,162,230,188,252,242,203,135,104,154,198,177, 99,199,112,228,200, 17,120,121,121, 33, 52, 52, 20, 70,163,113, 84,107,231,189, -252,235,194,171, 63,125,126,114, 50,223,108, 27, 42, 20,121,122,145, 53,210,177,179, 7, 56,202, 0, 32, 46, 59,187,198,197,163, -102,157,166,230, 78,174,157,123,221,167,173,119,112, 39,216,196,172,212,107,123, 15,254, 86, 85, 92, 90,198, 15,235, 22,172,253, -120,213,251,130,142,157,124,215,175, 88, 50,219,165,160, 90, 92, 53,116,238,201,140, 67,113,215,107, 95,155, 49,211,252,250,204, -119,117,167,126,251,253, 48,195, 48, 33,104,102, 4, 33,195, 48, 80,169, 84,184,115,231, 14,114,114,114, 80, 90, 90,138,146,146, - 18,212,212,212, 52, 54, 43, 74,107,170,143,127,181,251,232, 77,153, 68, 34,237,213,213,207,227, 90,114,154, 90, 38,145, 72,253, - 58,121,116, 6,154,158,128,154, 97, 24,219,199,121, 72,160,230, 78, 60,116,229, 53,208, 86,214, 66, 91, 94, 11,189,145,130, 78, - 79, 66,103, 36,225,216,111, 24,106,235,180,208,149, 87,130, 97, 89, 59,238, 25,195,129, 3,135, 22,158,247, 81,235,214,173,251, -164,165,245, 79,124, 27,158, 89, 6, 65, 16,199, 88,150,141, 98, 89, 54,170, 94, 76, 53,232,132, 99, 79,242,172, 91,183,238, 19, -150,101,163,174, 92,185,242, 51, 0, 77,123,210,218,106,211, 78, 89,217,221, 90, 43, 34,224,197,249, 75,150,159,248,113,231, 22, -231,242,242,138, 44,129, 88,162, 19,139,133,246,139,151,172,178,173,211, 84,189, 88, 87, 97,249,168,167,138,138,138,198,135,151, - 64, 32, 0,173,169, 3,173,213, 64, 87, 81, 6,194,168,135,128,166, 97, 47,149,194,195,213, 5, 29, 93, 20,173,242, 81, 12, 77, - 20,158, 62,129, 83,175,190,240, 84,179, 32, 99, 52, 32,174, 79, 23, 8,229, 50, 72,108,237, 16,121,228,226, 99,161, 35, 16, 0, - 43, 62,109,149,215,197,197,197, 81,169, 84,254,250,229,151, 95, 10, 74, 75, 75,145,154,154,122,243,209,163, 71, 85,118,118,118, - 86, 38,147,137,185,123,247,238,153,204,204,204,168, 78,157, 58,129,101, 89,159,214,248,106, 42,101, 70,163,137, 65,129,250, 17, -242, 85,119, 96, 35,247, 0, 75,118, 64,113,185, 6, 4,156, 97,210,101, 54,246, 37,211,107,243, 81,167, 39, 44,202, 79,163,209, - 8,147,201, 4,147,201, 4,131,193,128,215, 94,123, 13, 87, 18, 18,240,211,145,243,200,203,203,131,151, 66,138,201,147, 38,162, - 91,183,110, 72, 76, 76,108,119,161,246, 27,114, 42, 85, 34,145, 96,219,182,109,144, 74,165,104,171,192, 82, 40, 20,159,249,251, -251,251,102,214,213, 33, 45, 35, 3, 61, 39, 78, 4, 0, 92,186,116,169,113, 27,173, 86,139, 41, 83,166, 8,115,114,114, 94,207, -200,200,120,157,101,217,207,139,138,138, 22, 54,199,121,252,120, 2,222,126, 59, 13, 37, 37,143,157,221,125, 63, 7, 54,174,123, -144, 99,196,136,209,143, 91,174,108,109,109,241,217,103,150, 5, 29,166,105, 26,219,183,111,135, 68, 34,105, 20, 88, 2,129,160, -239,130, 5, 11, 94,108,106,251,192,192,192, 86, 57,223,155,224, 38,190,116,147,125,199,198,183, 83,176,141, 83, 8, 74,205, 41, - 93,147, 11,138,230,188, 55,193,109,243,166, 3, 5, 58,154,208,239,161, 77,121, 29,120, 98, 93,140, 37,105,204,142,251,210, 80, -222,105,102, 76,145,186,234, 95,239,206,124,197,193,214,206,165,246,219, 47,163,109, 73,146,196,209, 36, 67, 69,144,183,131,221, -216,136, 47,106,223,126,239,163,100,131,249,209, 28,228, 29,203, 68, 11, 97, 79, 24,134, 65, 65, 65, 1, 74, 75, 75,145,155,155, -139,146,146, 18, 16, 4,129,146,146,146, 54, 57,148, 77, 57,202,134,252, 2, 20, 29,222, 5,197,148, 87,208,121,245,106, 48, 12, - 31, 90,141, 25, 7,250, 61,135,234, 42, 45, 12, 12, 1,219,238,125, 48,244,216, 69,144,140, 25, 72,184,194, 61, 65, 56,112,224, -208, 82,189,114,108,233,210,165, 31, 88,184,237, 25,150,101, 45, 10,173,243,172,224, 90,186,116,233, 7, 13,199,138,142,142,214, - 2, 40,252,203, 5, 22, 0,212,148,166,103,167,165,241, 84,181, 26,173,216,206,222, 78, 99, 37, 23,178, 85,149, 85, 84,198,189, - 44, 93, 93,209,253,204, 54, 28, 47, 61, 53, 53, 53,184,160,160, 0,185,143, 30,193,164,169, 3, 97,208, 3, 58, 45,134,244,235, - 11, 49, 0, 49, 1, 8, 24, 35, 40, 74,136,218,218,106, 0, 72,111,141,148, 49,153,158,170,212, 27,155, 5,173,172, 32,148,203, - 32,178,182,122,202,209,178, 4, 18,137,228,167,237,219,183, 43,149, 74, 37, 54,109,218, 4,165, 82,233,175, 80, 40, 52, 86, 86, - 86, 18, 71, 71, 71,116,238,220, 25,225,225,225, 56,119,238, 28, 8,130,184,223, 26,159,217, 32, 76, 74,207,166, 59, 84,215,166, -224, 90,210, 15, 48, 25, 12,232,228,183, 12,122,179, 35,100,206,175, 67,107,252, 21,198,202,243, 0, 0,161,245, 64, 20, 23,151, - 2, 32,238,180,230,220, 61,187,124,235,214, 45,236, 57,124, 9, 30, 1, 3, 81, 84, 30,135, 59,119, 18,225, 98,247, 27,252, 2, -131, 96, 50,153,218,242,150, 96,177, 32,177,176,160, 79, 89,182,108, 25,170, 36, 18, 96,244,104, 8,178,179, 97, 52, 26, 17, 17, - 17,129, 30, 61,122, 0, 0, 34, 34, 34, 64, 81, 20,124,125,125, 97,111,111,143, 67,135, 14, 77, 1,208,164,192, 98, 9, 34,133, -161,203,252,189,189,189, 27, 5, 86,204,247, 37, 72, 78, 28, 2, 2, 66,108,249,234,223,151,196,195,195, 3, 69, 69, 57, 32, 8, -182,181, 78,153, 39, 70,143, 30, 61,202,206,206, 14,211,167, 79,135, 68, 34,193, 11, 47,188, 0,173, 86,251, 82,253, 27, 13,150, - 45, 91, 6, 0, 88,177, 98, 5, 86,174, 92, 9,141, 70,211,108,136,138,109,107,187,186,214,104,153, 25,164, 70,242,194, 32,199, - 78, 33,131,135, 15,129,151,223,115, 24, 60, 60, 15, 0, 62,113,228, 63,152,248,233, 7,182,135,237,172,137,221, 87,142,156, 89, - 30, 57,114,208,135, 43,141,231,215,172,252,178,162,213, 23,150,202, 7, 59,106, 50,248, 99, 54,111,249,198,188,105,197, 7, 11, - 68,143, 74,141,229,133, 21, 76,173, 76,196,179,242,113,129,124,206,226, 53, 57,133,133,247, 22, 33,239,183, 44, 75,174, 97, 78, - 78, 14,244,122, 61,104,154,134, 94,175, 71,109,109, 45,242,243,243, 27,175,175, 86,102, 61,226,221,233, 99,186,213,105,181,154, -107,183,239,230,126, 56,247,149,222,117, 90,173,230,238,131,220, 44, 96, 11,211,204, 53,175,212,212,212,218, 27,106, 76,168,188, -153, 5,199,193,158, 48,152, 9,232,205, 20,202, 75,107, 96,164, 1, 19,201,135,251,132,215, 96, 38,120,168, 46, 41, 2,217,142, -126, 14, 28, 56,112,248,103, 57, 88, 4, 65, 28,139,142,142,142,250,187,184, 1, 32, 58, 58, 58, 53, 58, 58,250, 79, 29,171, 65, - 96, 13,124,226, 13,119, 96, 83,117,165,135,109,149,219, 39, 31,188,232,106, 50, 25,252,107,107,107,105, 30, 79,200,235, 96,163, - 45, 42,207,181,252, 96, 38,147,233,216,197,139, 23,199,245,235,215, 79,116,247,246, 77,232,171,170,160,175,170,132,128, 49,195, - 94, 28, 14,210,100, 0, 97,208,195,173, 11, 3,109,181, 24, 9, 55, 50, 77, 38,147,233, 88,139, 25, 2,150,101,204,143,133, 3, - 73, 82, 79, 53, 21,138,172,228, 16,202,229, 16,201,173,154,108, 66,108, 14,206,206,206,210,254,253,251, 63, 23, 22, 22, 6,150, -101,177, 97,195, 6, 24, 12, 6, 97,131, 83,100, 52, 26, 81, 83, 83,131,131, 7, 15,226,251,239,191,191,108, 99, 99,179,187,176, -176,101,113,203,152,245, 39,207, 93,190, 57,234,213, 23, 6, 11, 79,159,255, 22, 38,189, 25,181,122, 91,212,233, 12,168,209,242, - 97, 16, 13, 7, 65, 92, 4, 73,137,208, 39,212, 7,103, 47,221,213,209, 38, 99, 92, 91,196, 16, 65, 16,208,235,245, 80,171, 75, - 80, 94,115, 14,168, 41,128,163,177, 6,181, 15,238, 35,244,181,169, 48, 24, 12,173,114,125,248, 6, 76, 78,182, 42,222,247,171, - 73,240,133, 14, 70,191, 33,167,154, 13, 21, 33,151,203, 27,251,232, 88,130,234,234,106,252,240,195, 15,136,136,136,192,128, 1, - 3, 80, 80, 80,128,236,236,108,140, 26,245,239, 86,182,155, 55,111, 34, 57, 57, 25, 62, 62, 62,173,112,177, 39,202,203,239, 77, - 28, 59,118,172,224,234,213,171, 96, 89, 22,126,126, 54,176,182,146,131, 32, 69, 8, 8,112, 2,144, 9,130, 32, 48,112,224, 64, - 24,141,133,230,186, 58,156,104,137, 51, 57, 57,121,116, 88, 88,152,151,201,100,202, 10, 14, 14,230, 21, 21, 21, 97,194,132, 9, -216,183,111, 95,195, 27, 13,150, 46, 93,250,212, 62,181,181,181,186,230,248,186,245,236,188,136,102, 29, 6, 8, 69,158, 94, 54, - 78, 33,240,242,123, 14, 0, 48, 52,106, 6,188,124, 59,160,170,228,150,151, 65,255,232, 5,138, 40,179,251,241,106, 65, 90, 63, -105,240,244,210,188,243,119, 1, 88, 18,184,151,213,222, 61, 90,156,203,183,222,127,224,151, 99,111,141, 25,243, 60,207, 68, 51, -230, 96, 15,158,205,190, 67,199,213, 5,143,114,191, 64,238,111,169, 79,221, 42,205, 11, 44,186,178,178, 18,114,185, 28,217,217, -217,250, 49, 99,198,136,180, 90, 45,238,222,189,219, 40,176,156, 29,237, 3,251,246, 8,246, 95,187,233,251, 83, 50,145, 72, 52, -124, 96,120, 64,218,221, 71,249, 44, 75, 60,108,150,151,101,175,222, 77, 79, 31,237,228,232, 1,213,249, 43,144, 69,142,132, 94, - 79, 64,103,100, 96,160, 1, 51, 37,128, 77,183,158,144,120, 7,128, 97,129,244,219, 55, 97,102,217,203,220, 35,132, 3,135,127, - 44, 90,211, 34, 32, 8,226, 88,239,222,189,247, 62,233, 50, 53,252, 6,160, 7,208, 82,159,232,146, 39, 69, 84, 67,179, 97,115, -199,121,134,183,221, 2,235, 2, 90, 24, 89,230,232,232,232, 28,208, 37,200,123,231,174,111, 97,212, 87, 33, 59,109, 55,234,106, -138,241,209, 39, 9, 62,110,110,110, 3, 10, 10, 10, 46, 88,114,176,252,252,252,125,135, 14, 29, 90,216, 45, 40, 40,172,163,187, - 59,110, 61,124, 0, 1, 75, 67, 64,211, 32,141,122,240,104, 3,220, 3, 25,144,164, 12, 69, 69, 53,216, 30,247,251,157,250,168, -238,205,191,125, 19, 20, 58,140, 25,143,151,135,142, 6,107, 50,226,183,126,129, 16,203,229, 16,217,218,162,207,193,243,143, 67, - 54,152, 77,120,184,238,125, 8,100,114,216, 71, 12,108, 53,157,106,181, 90,115,249,242,229,196,140,140,140, 30, 93,186,116,193, -170, 85,171,144,151,151, 7,150,101,161,182,100, 14,165, 0, 0, 32, 0, 73, 68, 65, 84, 86,171,117, 37, 37, 37, 5,101,101,101, - 15, 9,130, 56, 92, 88, 88,184, 19, 22, 68, 10, 87,251, 81,123, 78,159,249,125, 81,247,208,192,206, 67, 6,172,196,177, 99,203, - 81, 89, 93,141, 58, 61, 15,181, 90, 35,234,116, 44, 92,173,124,208, 43, 36, 12, 37,101, 6,220, 77, 77,202, 47, 21,216,239,104, -163,117,138,155, 55,111,194,211,158, 64, 90, 86, 50, 28,117,229,232, 98, 43, 71, 88,100, 63,228,228,228, 88,228, 76,153,205,224, -205,153,255,239,209,130,182,182,182,168,170,170,122,106, 63,169, 84, 10, 87, 87, 87, 84, 87, 87,227,192,129, 3, 96, 45,123, 40, -154, 12, 6, 3,252,253,253,113,227,198, 13,156, 57,115, 6,131, 7, 15, 70,255,254,253,113,254,252,121, 36, 38, 38, 34, 57, 57, - 25, 4, 65,192,193,193,161,193,109,107,214,114,187,126,253,102,172, 92, 78, 44,155, 62,125, 86,240, 43,175,188,130,131, 7,247, - 98,198,244, 46, 32, 72, 17, 8, 66,132,231,199,248, 99,245,154, 68,244,234, 53, 16,142,142, 2,156, 57,147,154,195,227,217,124, -111,129, 88,253,114,253,250,245, 60,177, 88, 12,131,193,128,218,218, 90,148,149, 61, 14, 71,213,148,131,165,213,106,155, 13,172, -150,154,146,249, 89, 69, 53, 91, 65,106,146, 94, 40, 53,165,132, 12, 30,158,143,161, 81,211,113,250,216,110,156, 61,117, 6,142, -252, 7, 57,180,164,246,100, 73, 78,105, 77, 97,173,223,246,192,240, 55, 40, 85,221,169,111,102, 63,159, 69,185, 43,153,216,101, -219,170, 43, 91, 75,111,121,218, 15,191,254,202,226,249,200,136,158, 62, 93, 61, 92,133,229,101,106, 28,250,229,100,170,241,193, -193, 99,245, 21,149, 37, 86,228,234, 45, 91,182, 44, 7, 0,134, 97,246,108,218,180,233,141, 69,139, 22, 57, 21, 20, 20, 52, 10, - 44,117,105,249,217, 62,163,231,208,101,149, 85,134,239, 54, 45,158, 32, 17,139,132, 31,174,251,238,188,137,194,213,102, 43, 23, - 30,111,234, 7, 91,127, 44, 57, 16,187,155,114, 18, 11,112,105,201, 10,100,255,126, 14, 70, 66,128,225,191, 93,131,193, 72,163, - 90, 93,134,179,211,103,195, 78,105,143, 19,101,119,233,170,154,234,169,220, 51,134, 3,135,127, 44, 90,210, 34, 37, 79, 8,162, -114, 0, 15,163,163,163, 75,159,112,151, 74, 0,220, 4,208,173,126,187,146,103,246, 43, 33, 8,226, 6,203,178, 61,158,224, 41, -121, 66,104, 61,249,219,240,204, 54, 55,255,140,192,106, 17,165,165,165,234,235,137,119,112,249,244, 54,152, 77,122, 84,213,219, - 86,133,197, 58, 88, 91, 91, 39, 52, 68, 19,111, 2,193,120, 58, 86, 6,171,211,233, 94,220,180,121,243,213,183,166,190,170,232, -255,220,115,120,116,251, 22,244,229,165,160,104, 26, 20,193, 71,109,169, 24,197, 69,213,136,254,245,164, 90,171,211,189,216,196, - 3,226, 89,206,198, 78,238, 44, 65, 64,108, 99, 13,145, 76, 6,145,141,245,191, 29, 43,130,128, 80,110, 5,190, 76, 14, 74, 32, -180, 36,157,208,104, 52,227,103,206,156,121,235,196,137, 19,118, 47,191,252, 50,158,127,254,249,228,202,202,202, 65, 21, 21, 21, -150,246, 55,123,154,243,192, 1,218, 28, 60,102,236,215,219,118, 94,153, 54,109,154,253,243, 99,191, 70,114, 90, 42, 42,235,156, - 1, 0,174,142, 50,244,234,242, 62,212,101,122,156, 58,121,172,130, 49,235,198, 35,117,159,169, 57, 78,150,101, 89, 71, 71,199, -167, 92, 57,138,162,112,254,252,121,204,155, 55, 15,142, 86,231, 81,243, 48, 27, 93,251, 13,192,208, 87,166, 98,198,140, 25,160, - 40, 10, 14, 14, 14,207,186, 25,127, 56,247, 39, 81, 85, 85,133,142, 29, 59,226,183,157, 93,130, 12, 58,181, 32,204, 30, 32, 96, - 99, 60,125,118, 84,106,124,124,124, 45,128,157,126,126,126,177,207,140,104,252, 3, 39, 65, 16,255,250,228,147, 79,182,245,237, -219, 87, 34,151,203,225,231,231,135,203,151, 47,227,242,229,203,184,120,241,113,255, 56, 7, 7, 7,216,219,219,163,178,178, 18, -121,121,121, 90,130, 32,254,213, 2, 39, 83, 93, 77,141, 59,125,250,240,181, 49, 99, 94,116, 28, 49,162, 55, 20,138, 26,152,205, -165, 32, 72, 1, 68, 98,103,236,220,185, 14,234,226,114, 92, 73, 72, 40,175,173,229,141, 79, 74,250,195, 20, 68, 77,165,211, 24, - 23, 23, 7,177, 88,140,131, 7, 15,154, 93, 92, 92,120,182,182,182,205, 58, 88, 58,157, 78,212, 28,231,155, 75,238, 20, 0, 88, -243,222, 4,183,141, 87, 82,139,199, 1,248,201,203,215, 29,103, 79,157,193,197,179, 87,150, 70, 4, 51, 91, 70, 79,233,185, 90, - 60,248,165,247, 3,187,191, 65,201,173,149,136, 57,116,144, 74, 75,250,246, 99, 93,221, 29,111,108, 59,244,126, 43,215,136, 5, -128, 90,117,241,178,232,207,191,218, 19,189,106,185,100,195, 23, 91, 11,181,165, 69, 31,212,139,126,182, 5,247,170,145, 51, 39, - 39,103, 59,128,237, 79, 56,205, 63,172, 91,183, 46,254,213, 87, 95,117,106,112, 40, 75,210,126, 77, 40, 1, 18,130, 6,206,248, -168, 79,143,160, 46, 31,127,241,227,169,220,188,226, 31,171,210, 27, 99, 96,253, 33,157, 87,175, 94,173,232,222,189,251,204,247, -151,172,252,118,213,234, 21,132,255,252,165,200,186,124, 3,122,173, 17, 70,150,130, 9, 4,146,214,126, 14, 43, 39,107, 92, 98, -203, 89, 61, 69,190,153,253,199, 78,254, 45,150,207,118,130,227,228, 56, 57,206,255, 78,206,150, 12,132, 27, 77,252,221,212, 76, - 26, 55, 90,218,175, 25,158,191, 5, 22, 9, 44, 55, 55,183,254, 67,159,139, 64,223,161,179, 96,212, 87, 34, 59,245, 59,212,214, - 20,195, 77, 33, 66,118,110,117,239,122,213,105, 17,234, 35,179, 71,124,188,121,203,161,225, 61,123, 4,248,185, 41, 69,182, 29, - 61, 33,115,118, 65,105, 73, 9,174, 37,101,153,182,158, 58,123, 71,171,211, 89, 52, 85, 14,195, 48, 44,203,178, 16, 8, 4, 96, - 41, 10,129,115,150,128, 36,201,103, 70, 11, 18,176, 14,143, 4,201,227,195,100, 97,159, 33,149, 74,149, 79, 16,196,248, 57,115, -230,252,190,103,207, 30,114,224,192,129,161,191,254,250, 43,243,103, 50,187,236,206,209,187, 84,240,184, 1, 91,190,220,122, 32, - 44, 60,194,179, 99,167,142,162,190, 29,108, 96, 52,209, 40, 86,151,225,194,149, 52,253,221,180,155,121,140,209, 48,177, 36,189, -249, 40,238,245, 15,193, 92, 87, 87, 87,151,149, 43, 87,194,108, 54,131,166,105,152,205,102,148,150,150, 34, 57, 57, 25,221, 35, -122,195,255,245, 55, 80, 94, 94,142, 93,187,118,193,221,221, 29,163, 70,141, 66, 77, 77, 13,226,227,227,115,155,119, 29, 96, 94, -246,175, 41, 60, 0,224,243, 97,254, 32, 42,234,124, 80, 80, 80,228,243,221,212,130, 89,115, 30, 59, 91,159,174,155, 34, 56,127, -254,124,172, 72, 36,218,254,224,193,131,234, 22, 4, 54,188,189,189,133, 58,157, 46,148,101, 89, 94,117,117,245,102,189, 94, 63, -109,193,130, 5,202,245,235,215, 35, 36, 36, 4,165,165,165,176,183,183,135, 82,169, 68,109,109, 45,114,114,114,104,163,209,248, - 13, 77,211,171,213,106,117, 73, 75,121,144,152,152,248,128,166, 67,123, 23, 23,109, 59, 52,235,237, 97,126, 38, 83,184,208,218, -166, 31, 88,214,140,202,138, 60, 16,236, 45,227,225, 35,191,223,175,172,164, 94, 76, 74, 74,186,107,201, 53, 34, 73,242,237,163, - 71,143,162, 97,170,156,194,194,194,108,146, 36,155,117,176, 44,193,166, 3, 5, 58, 0, 63, 79, 24,174,156, 95, 85,114,171,179, - 35,255, 65, 78, 68, 48,179,101,211,129, 2,157,179,173,102,109, 65,201,249,172,194,218, 83,219, 99, 14, 29,164,166,190, 48,158, - 86,202,239, 46,117,236, 0, 75, 34,227,179, 33, 33, 33, 30, 36, 89,222, 73, 93,150,153, 56,227,205,183, 94,178, 17,104, 79,132, -184,149,250,154, 93, 2,197,105,105,105, 15,219,224, 98, 61, 89,246,179, 0,244,255,236,179,207, 78, 61,107,141,171, 75,203,207, -246,142,122,151,173,172,172, 74, 41, 73,255,245,118,107, 92, 13,211,223,188,246,234,140, 29,111,190, 62,147, 10,158,187, 24,249, -231,126, 7,204, 38,168, 46, 94,128,212,138,198,177,210,135,180,134, 34,103, 38, 37, 37,113, 81,220, 57,112,224,240, 63, 3,139, -123,125,123,123,185,157,242,238,228, 54,204,187,147, 43, 0, 32,251, 65, 33,178, 31, 20,252,150,157, 83, 48,188,157, 10,183,113, -178,103,162, 62, 20, 3,107,217,100,207, 79,113, 6, 5, 5, 37,147, 36,233,218,150,147,166,105, 58, 63, 45, 45, 45,220,146,116, - 42,149,202,151, 59,116,232,176,174,176,176,240, 80,126,126,254,123,127,137,186,175,159,236,153,164, 4, 81, 44,203,134, 0, 32, - 8,146,180,100,178,231, 70, 78, 87, 87,215,174, 18,137,100, 59,143,199,243,104,184,142, 13,205,120, 70,163,145,170,170,170, 18, - 27, 12, 6, 10, 0, 33, 16, 8,204,114,185, 92,199,231,243,205, 52, 77,231,154, 76,166,183, 10, 11, 11,111, 91,250, 22, 18, 16, - 16, 32,139, 10, 79,175,109,152, 66,103,217,191,166, 96,221,158, 22,203, 78, 35,231,221,187,119, 59,219,217,217, 77, 34, 8, 98, - 2,203,178, 93,106,106,106,244,203,151, 47, 79,185,112,225, 66,181,135,135,199,136,126,253,250, 17,183,110,221,194,195,135, 15, -217,218,218,218, 3, 36, 73,254,171,160,160, 32,187,141,101,137,236,211, 39,116,178,149, 28,163, 25, 22,221, 0,150, 32, 8,226, -118,109, 45,113, 66,169,236,244,227,129, 3, 7,232,246,190,129,133,133,133, 29,175,173,173, 29,117,247,238,221,230,222,170,158, -189,143,154,229,220,240, 65,240,191,122, 15,136, 28,127,249,194,197,195, 75, 62, 73, 93,243,228,186,119,198,217,205,152,242,206, -188,245, 63,125,253,197,226,175,143, 84,124,103, 73, 58,195,194,194,188, 0, 76,102, 89, 54,136, 32, 8, 63,134,129,152, 32,216, -114,130, 32,210, 24,134,185,201, 48,204,209,219,183,111, 23,254, 55,188,209, 62, 57,217, 51, 65,211,182, 52, 65, 88, 58,217, 51, -231, 16,112,156, 28, 39,231, 96,253,159,132,197, 17,184,179,115, 10,134,103,231, 20,192,215,215,151,189,119,239, 94,155,196, 89, -115,111,223,245, 17,218,247,254, 25,146,212,212,212,176,191, 51,131, 84, 42,213,207, 42,149,234,231,191,148,244,194, 5,179, 26, -248, 14,143, 63,237, 66,189, 64,234,101,201,182, 26,141, 6,149,149,149,237, 78,110,122,122,122,221,184,136,127, 59, 91, 60, 30, -204,150,238, 59,108,216,176, 71, 70,163,241, 12,128,124, 0,182, 0,202, 77, 38, 83, 92,105,105,105, 49, 77,211,225,143, 30, 61, -250,168,222,137, 92, 83, 92, 92,220,222, 56, 18,204,149, 43, 41, 63, 1,248,233,143,171,146,255,212,165, 74, 78, 78, 30,173, 84, - 42,147, 29, 28, 28,124,116, 58,157, 80,167,211,241, 89,150,109, 44,251, 18,137,164,164, 33, 98,122,107,176,177, 70, 12, 69,148, - 57,216, 89, 19,127,112,106, 28,221,112, 80, 91,119,167,179,163, 27, 14,182, 33,109, 57,221,186,117,251,129, 36,201, 78, 12,195, -184, 0,176,102, 89,148,178, 44, 91, 74,211,116,254,157, 59,119, 10,255, 91, 42,154,122, 1, 21, 5, 14, 28, 56,112,224,240,151, - 41, 92,142,147,227,228, 56, 57, 78,142,147,227,228, 56, 57,206,127, 20, 72, 46, 11, 56,112,224,192,129, 3, 7, 14, 28,254, 90, - 16, 45,168,208,182,180,173,182, 71,201,222,225, 56, 57, 78,142,147,227,228, 56, 57, 78,142,243, 31,199,217, 26, 55,215,183,235, -111, 18, 94, 28, 39,199,201,113,114,156, 28, 39,199,201,113,254,243, 56,255,167,192, 53, 17,114,224,192,129, 3, 7, 14, 28, 56, -252,197,104,118, 20,161,151,151,123, 32, 73, 51,125, 89,150,164, 88,146, 53, 17,213,218,125,217,207, 4,217,236,208,161,131, 45, -159,196, 24,130,101,101, 4,193,208, 12, 69, 94,206,201,201, 79,179,228,192, 1, 1, 1, 2, 0,211,248,124,126,164,209,104, 84, -242,249,124,149, 78,167,187,196,231,243,247,164,167,167, 27,255,155, 50,169,111,223,190,147, 15, 28, 56, 96, 27, 21, 21,165, 55, - 26,141,102,129, 64,192,219,187,119,175,104,250,244,233,149,151, 47, 95,110,215, 40,200,208,208,208, 65,159,126,250,169,215,115, -207, 61,135,200,200,200,186,145, 35, 71, 10,194,195,195, 5, 75,150, 44,201, 73, 73, 73, 57,215, 22, 46,103,103,231, 64, 30,143, -247, 61, 65, 16, 20,203,178,175, 61, 17,130,225,239,192,203, 0, 38, 2, 80, 2, 40, 2,176, 31, 64,123, 71, 89,142, 0, 48, 6, - 64, 72,253,242, 45, 0, 71, 1,196,253,137,244,141, 0, 48,134, 32,136,110, 0,192,178,236,205,191,144, 51,164,158,243, 47, 75, -231,159, 61,247,176,176,176,229, 66,161,240, 77, 0, 48, 24, 12,223,201,229,242,232,166,182,187,112,225,130, 1,205,132, 62, 9, -232, 4, 54,237,168, 63, 0, 32,112, 76, 6, 0,160,181,229,244, 7,237, 27, 69,204,166,249,179, 77,241, 18,129, 25,237, 30,149, -172, 84, 42,103,143, 26, 53,106, 73, 92, 92,220,199, 5, 5, 5, 59,192,129, 3, 7, 14,255,173, 2,203,203,203, 61,112,194,184, - 23, 63,121,251,173, 89, 4, 69,145, 72,207,200,224,189, 51,247,189, 97,254, 46, 46,110, 50,157, 46,128, 5, 24,173, 68,114, 71, -171,213, 20,108,251,250, 75,171, 46,157, 59,211, 52,205,224,155,237,219, 70, 30, 56,114,232,131,214, 68,150,147,147,147, 23,159, -207,223, 60,119,238, 92,231, 97,195,134,145, 46, 46, 46,200,207,207,183, 62,124,248,176,239,174, 93,187,162,156,156,156,230,151, -148,148,228,180,231,132, 20, 10, 69, 63,165, 29, 70, 72, 68,236, 32, 84, 19,208,154,137,115, 42, 3, 27, 87, 84, 84,116,177,189, -153,100, 48, 24,230,104, 52,154,136,192,192, 64,102,219,182,109,196,204,153, 51, 89,130, 32, 72,173, 86,187, 27,237, 12, 51, 33, -145, 72,190,126,238,185,231,252, 34, 35, 35,179, 47, 95,190, 60, 26,192,241,137, 19, 39,122, 75, 36,146,187, 0,186,180,133,139, -162,168,221,105,105,105,221,180, 90, 45,194,195,195,119, 1,232,254, 55,149,151, 93,118,118,118,166,173, 91,183,110, 15, 13, 13, -245,169,168,168,168,123,235,173,183,134,220,190,125,123, 48,128,215,219,192, 35, 3,176, 69, 42,149, 82,243,231,207, 63,249,194, - 11, 47,220,148,201,100,242,204,204, 76,254,188,121,243, 94,203,205,205,157, 0, 96, 46,128,186,182,114, 58, 56, 56, 72,214,174, - 93,155,212,167, 79, 31,181, 88, 44,150,228,228,228, 16,243,231,207,159,153,153,153,249,103, 56, 5,171, 87,175,190, 60,112,224, -192,108,145, 72, 36,205,205,205,165, 22, 45, 90, 52, 35, 41, 41,169,221,156,182,182,182,194,229,203,151, 39, 12, 24, 48,224,161, - 88, 44,150,101,103,103,147, 11, 22, 44,120,227,222,189,123, 22,115,246,239,223,127,178, 86,171, 93, 21, 31, 31, 15, 0,232,221, -187,247,114,131,193,240,225, 31, 68, 13,203, 34, 50, 50, 82, 71,146,228,155,241,241,241, 77,150,215, 61,137,239, 79, 6,128, 69, - 31, 53, 44, 63,254,110,106,121, 90,248,134,189, 68, 96, 70,155, 10, 78, 64,167,199,226,110,219,197,119, 95, 5,128,119, 22, 61, -254,127,219,197,134,245,179,217,182,136, 54, 87, 87,215,183,122,246,236,185,236,218,181,107, 49,225,225,225,243,118,236,216,193, -143,138,138, 90,203, 48,140,207,136, 17, 35, 38, 36, 36, 36,108,200,204,204,252,154,171,226, 57,112,224,240, 95, 37,176, 72,154, -233,251,246, 91,179,136, 73, 47, 79, 46, 82, 21,171, 25,185,149,205,203,251, 99, 99,165,157, 59,119, 38,117, 91,182,192, 92, 90, - 10,122,225,194, 62, 23, 46, 92, 48,189, 59,127,161, 86,175,211,236, 86,186, 56, 75,247,253,188, 87,113,232,224,129,190, 0,210, - 90,114,174,248,124,254,230,131, 7, 15, 42,188,188,188, 96, 48, 24, 80, 82, 82, 2,163,209,136, 23, 94,120,129,138,136,136, 80, -204,152, 49, 99,179,163,163,227,139,109,113,178, 28, 29, 29, 93,186,120,240, 79, 76,153, 56,188,243,160,254,225, 18,133, 91, 39, - 32,159, 65, 65,246,221, 30,191, 95, 77,154, 27,123,250,124, 86,102,149,113, 84,105,105,105,113, 91, 51,169,172,172,108,201, 91, -111,189,117, 32, 36, 36,196, 73, 36, 18,193,197,197,133,120,227,141, 55,138, 85, 42,213,234,246,102,124, 67,116,112,146, 36,233, -103,190,219, 67,231,110, 99, 99, 3,107,107,107, 0,112,251, 51, 5, 98,194,132, 9, 84,110,110,238,155, 12,195, 4, 60,249,191, - 74,165,242, 54,155,205,165, 15, 30, 60,236,166, 51, 24,123,205, 94,180,106,237,164, 49,131,172, 19, 18, 18,200,209,163, 71,243, -207,159, 63,255,114, 27,156,172, 45, 93,186,116,185,189,126,253,122, 67,250,221,156,224,223,206, 39,144,206,246, 50,198,171, 99, - 71,121,106,106,170, 32, 58, 58,186, 36, 58, 58,122, 11,128, 25,109, 72,250,150,161, 67,135,230, 45, 91,182,140, 74,207,186,239, -125, 49, 33, 5,214,114, 33,237,225,238, 42, 78, 72, 72,224,109,219,182, 13, 31,124,240, 65,155, 57, 7, 13, 26,116,119,205,154, - 53,108,145,186,220, 55,231,129, 10, 86,114,161,217,193,193, 65,114,254,252,121, 98,207,158, 61,134,121,243,230,109, 97, 24,166, - 77,156,125,250,244,185,191, 98,197, 10, 34,227, 94,142,239,165,132, 20,200,101, 2,115, 71, 15,119,241,245,235,215,137, 47,191, -252,210,180,124,249,114,139,210,201,178,236, 55, 27, 54,108,192, 47,191,252, 2, 0,248,249,231,159,225,237,237,253, 84, 1,210, -234,116, 32, 8, 2, 15, 31, 60,144,190,253,246,219,223, 52,245, 66,144,118,212, 31,123, 18,129,105,211,166, 21, 89,116, 6,233, - 27,218,236, 90, 53, 8,171, 89,179,102,229, 55,179,217,171, 95,111,180, 92,100,245,237,219,119,201,190,125,251, 28, 99, 99, 99, - 23, 29, 62,124, 24, 0, 32,149, 74,165, 95,125,245,213,236,177, 99,199,226,245,215, 95, 95,194, 9, 44, 14, 28, 56,252,215, 9, - 44,150, 37, 41,138, 34,161, 46, 46, 53, 13, 29, 50,108,198, 87, 91,183,138,132, 66, 33, 12, 6, 3,234,206,158, 5,171,215,195, - 70, 34,193,168, 81,163,248,193,193,193,214, 51,103,204,120, 67, 93, 92,180,157,162, 72, 5,203,146, 84, 43,199,156, 54,119,238, - 92,103, 47, 47,175,167, 38, 16,166,105, 26,197,197,197,176,178,178,194, 75, 47,189,228,248,195, 15, 63, 76, 3, 96,145,221,239, -236,236,220,209,175,147,227,149,216,111, 23, 41,156,109, 9,160,228, 32,240,232, 46,240,147, 24,126,206,158,240, 27,220, 95, 50, -166, 87,112,183,201,235,247,164,144, 36,217, 71,173, 86, 63,108, 75, 38, 61,124,248,240,146,193, 96,120, 83,167,211, 29, 1, 64, - 94,190,124,153,205,205,205,125,187,184,184,248, 81,123, 51,158,166,105, 84, 86, 86,130, 97, 24, 10, 64,227, 55,109,225, 84, 62, -127, 7, 38, 76,152, 64,229,229,229,189, 21, 16, 16,224,187,115,231, 78,168,213,106,136,197, 98, 48, 12,131,222,189,123,123, 12, - 25, 50,228,126, 73,121,149,157,217, 76, 27,243, 31, 61, 8, 95,183, 33,165,164, 91, 96,151, 75,177,177,177,161,142,142,142, 47, - 89, 40,176, 70, 88, 89, 89,241, 62,254,248, 99,173,194,221,123,146,210,195,143,127,229,198,237, 44,129, 84,200,150, 85,213,212, -164,164,164,100,173, 90,181,170,255,137, 19, 39,212,119,238,220, 25, 1,203,154,204, 70, 56, 56, 56, 72,150, 46, 93, 74,216, 56, -184, 14,141,236,239,193, 79,186,149,118, 95, 40, 21, 50,145,145,145, 99,174, 92,185,178,107,193,130, 5,161,199,143, 31,175, 78, - 72, 72,176,152,211,222,222,158,191,122,245,106,218,197,213,115,172, 71, 39, 95,190,155,194, 49, 16, 0, 50,179,238,125, 91, 92, - 92,124,255,237,183,223,238,117,242,228,201,154,184,184, 56,139, 57,109,108,108, 4,203,151, 47,103, 3,130, 67,103, 4,133,116, - 39,143,254, 22,159, 32,145, 9,233,234, 58,109,109, 90, 90,218,253,197,139, 23,247, 60,126,252,120,205,141, 27, 55, 90,229,212, -104, 52, 86,238,238,238, 80, 40, 20, 96,180, 90, 84, 87, 87,227,208,161, 67,168,169,169, 1, 77,211,144, 72, 36,248, 34,174, 28, -186,123, 71,177,125,243,106,104,181, 90,171,191,162,156, 52, 52,239,181, 69, 92,181, 32,172,240,132,240,122,117, 86,191,175,216, -150,154, 11, 27,156,171, 75,151, 46,229,199,198,198, 58,251,248,248, 96,224,192,199, 19,184,207,152, 49, 3, 67,134, 12,193, 47, -191,252,130,223,126,251, 45,119,220,184,113, 57, 73, 73, 73, 27,242,243,243,191,225,170,122, 14, 28, 56,252,255, 70,147,118, 9, - 75, 16,117,169,233,233,124,185,173,237,171, 95,109,221, 42,226,243,249,120,248,240, 33,210,210,210,160, 57,123, 22,218, 43, 87, -160, 86,171, 81, 83, 83, 3, 39, 39, 39, 68,111,216, 32, 19, 72,100, 51,238,222,187, 71,177, 36,251,228, 4,197,127, 24,106, 41, - 20, 10, 35, 71,141, 26, 69, 62, 41,174,158, 68, 81, 81, 17,134, 13, 27,198,227,241,120,145,205,164,249, 89, 78,194,213,137, 56, -186,127,199,124,133, 51,239, 54,112,111, 30, 80,121, 17, 48, 87, 2,218, 90,224,193,109,224,240,103,112, 47,191, 71,252, 52,119, -162,139,155, 68,112, 20,127,140, 66,223,226,144, 80, 55, 55, 55,111, 31, 31,159,157,227,199,143, 39, 1, 32, 50, 50,146,240,241, -241,217,238,230,230,230,221,194,110, 45,114,234,116,186,171, 21, 21, 21,196,232,209,163, 29,250,244,233,115,122,244,232,209, 14, - 0, 8,157, 78,119,181,189,156,245,112, 24, 52,104, 80,153,151,151,215,207,158,158,158, 34, 11,182,111,228,204,205,205,125,211, -223,223,223,119,231,206,157, 20, 69, 81,216,177, 99, 7,246,239,223,143,248,248,120,148,148,148, 72, 23, 44, 88, 96,251,235,217, -228, 51,167, 47,222, 60, 54,127,214, 91,204,208,238,161, 74, 81,105, 81,153,131,131,195, 72, 0, 10, 11,211, 57,102,206,156, 57, - 39,146,211, 30, 40, 8, 74, 36, 18, 8, 4, 98,133,139,163,179,210,217,165,163,210,217,165,179,149, 84,106, 87, 87, 87,151,123, -228,200, 17, 22,143,251, 40, 89,196,185,106,213,170,235,105,119,115,157, 89, 82, 32, 20, 8,248, 2, 71, 59, 91,251, 9,207, 15, - 27, 3, 0, 82,145, 72, 90, 87, 87,167,250,225,135, 31,218,196,185, 98,197,138,139, 5,197,149, 10, 30, 95, 32, 18,139, 68,141, -179,132,219,219,217,184,201,101, 50,169,193, 96,200,219,185,115,167,185, 45,156, 31,126,248,225,229,244,123,185, 46, 36, 73, 81, - 36, 73,240,156, 28,236, 28, 29, 28, 28,148, 14,118,246,110, 18,161, 80, 86, 91, 91,155,255,243,207, 63,211,150,114, 22, 23, 23, - 35, 35, 35, 3, 29,122,244,192,153, 51,103,208,161, 67, 7, 76,156, 56, 17,147, 38, 77,130, 68, 34, 65, 79,219,251,120, 97, 68, - 31,220,191,127,191,217,235,110,137, 96,114,117,117,189,208,150,178, 4, 60,110, 22,108, 73, 92, 61,203,217,204,118,119,158,117, -174, 14, 29, 58,228,184,105,211,166,208,247,222,123, 47,251,208,161, 67, 8, 9, 9, 65,122,122, 58,220,220,220,176,119,239, 94, -188,251,238,187,217, 43, 87,174, 12,221,191,127,191, 75,112,112,240,210,118,222, 71,109, 5,199,201,113,114,156, 28, 90, 23, 88, - 38, 6, 71,231,204, 91,160,137,137,137,145, 10,133, 66, 60,122,244, 8, 69, 69, 69, 56,124,240, 32, 61,165,107,215,154,215, 66, - 67,171, 15, 31, 60,200, 26,141, 70,176, 44, 11, 95, 95, 95,140, 26, 53, 74,242,198,204, 89,106,162, 90,187,175,197, 55, 90,150, -117,118,114,114,106,156, 52,247, 41,107,107,218, 52,152,205,102, 88, 89, 89,129, 32, 8,103, 75, 78, 64,169, 84, 78,156,177,232, -185, 14,214,158,214,197,108,209,238,114,128, 4,120, 86, 0,207, 26,144, 90, 3, 18, 43, 64, 36,131, 62,241, 74, 57, 75, 68, 62, - 28, 30,246,146,155, 82,169,156,216,150, 76,114,116,116,252, 48, 54, 54,214,233,246,237,219,108, 77, 77, 13,212,106, 53,187,120, -241, 98, 39, 71, 71,199, 15,219,155,241,133,133,133,107,103,204,152, 81, 52,126,252,120,219,152,152, 24,143,241,227,199,219,206, -152, 49,163,168,176,176,112,237,159,185,160,124, 62,159, 58,123,246,172,253,162, 69,139, 38,155, 76,166,196,193,131, 7,151,133, -134,134, 38,186,184,184,120,182,182, 47,195, 48, 1, 13,226, 10, 0, 40,138,130, 80, 40,132, 88, 44,134,141,141, 77,101, 78, 78, -142,185,163,131,128, 71,215, 85,104, 60,109,132,226,200,110,129,174,206,238, 30, 47,214,213,213, 37, 1, 80, 89,152,196,144, 17, - 35, 70,240,140, 16, 97,246,235, 67, 58,191, 61, 53,210,119,251,198,215, 7,109,249,248,181,222,159,175,122,117,192,218,101, 83, - 38, 19,140,217,228,233,233,233,221,208, 81,189, 53, 16, 4,209,173, 95,191,126, 18, 51, 37, 34,175,165,220,205,206,188,151,167, - 30, 51, 60, 50,162,241,128, 97, 97,147, 28, 28, 28, 70,121,121,121, 13, 36, 8, 98,184,165,233, 28, 56,112,160,136, 47,145,145, - 30,174,142, 93,236,109,229, 62, 13, 43,156,156,156,134,187, 40, 20,175, 19, 44, 93,167, 84, 42,221, 69, 34, 81, 55, 75, 57, 7, - 15, 30, 44, 50, 83, 34, 82,225,100,235,236,236, 96,235, 48,110, 68,255,200,193,145, 61,250,244,233,221,115,104, 88,143, 30,211, - 64,155, 52,158,158,158,110,150,158,251,145, 35, 71,240,229,151, 95,162,111, 96, 32, 60, 61, 61,225,228,228,132,179,103,207,226, -236,217,179,144,201,100,168,172,172,196, 55,223,124,131,184,184,184, 63, 93, 89, 52, 8,162,134,142,233,127, 5,158, 21, 89,173, -137,189, 75,151, 46, 29,138,141,141,133,143,143, 15,166, 79,159,238,189,123,247,238,236,236,236,108,200,229,114,220,188,121, 19, -239,191,255,126,246,202,149, 43,189,167, 77,155,134, 61,123,246,224,230,205,155, 49, 92, 53,207,129, 3,135,255, 4, 26,154, 8, -217,122, 87,135, 5, 64,228,229,229, 85,250,251,251,187,249,248,248,144, 6,131, 1, 85, 85, 85, 56,117,242, 36,189,119,255,254, -227, 6,131, 97, 46, 73,146,130, 61,223,127,255,141,179,139,203,160, 9, 19, 39, 18, 38,147, 9,207, 61,247,156,240,236,217,179, - 14,183,243,242,106, 90, 58, 32, 69, 81,141,238,209,236,217,179,177,121,243,102, 0,192,212,169, 83,255, 45,240, 76,166,134, 73, -116, 91,133,212,134,142, 26, 48, 36,200, 42, 79,246,165,149,174, 79,117,141, 87,150,219, 21,121,141,172, 39,120, 98, 30,164,114, - 48,102,152,239,214, 70, 36,101, 63,234, 20, 32, 62,161,238,212,183, 75, 79,236, 79, 56, 28,133,199,163,223, 44,130, 68, 34,233, - 41,147,201,144,158,158, 94, 30, 30, 30, 94,105,109,109,109,227,231,231,231, 40,145, 72,122,182, 55,227,213,106,245, 3, 30,143, - 55,224,197, 23, 95,124,135, 36,201, 33, 12,195,156, 41, 43, 43,251, 90,173, 86, 63,176,240,193, 52,139,101,217, 21, 0, 14, 52, -252,103, 52, 26, 65,146, 36, 88,150,197,152, 49, 99,176,110,221,186,192, 51,103,206, 32, 62, 62,222,126,202,148, 41, 87,149, 74, -101, 37, 65, 16,175, 23, 22, 22, 54,235,146,149,149,149, 97,219,182,109,160, 40, 10,182,182,182,176,178,178,130, 88, 44,198,192, -129, 3,139,215,175, 95,239, 23, 27, 27,107, 42,243, 85,179,194,218,170, 58, 7,137,159, 43,233,232,228,245,206,204,183,174, 1, -136,181,244,220,229,114,185,149, 21,165,173,165, 88, 29,181,105,203,118,158,148, 71, 66,198, 23, 64, 76,214, 18,203,150,175, 97, -197, 4, 37, 69, 27,230,201, 4, 0,129, 64, 32,181, 17,194, 32,144,242,105,185, 84, 72,252, 21, 55,135, 68, 34,145,201, 5, 48, - 52,183, 94, 72,242,132, 0,196, 4, 65,104, 44,229, 20,139,197,114,107, 33,171,111,110,189, 21, 95, 32, 32, 8, 66,140,102, 58, -185, 79,120, 14,108,236,230,199, 2,167,251,191,111, 25,208, 52,141, 30, 61,122, 96,255, 47,103,112,234, 98, 42,202,243,211,240, -234,196,145,232,216,177, 35, 24,134,105, 49, 77, 13,125,176, 44,120, 41,128,171,171,235,133,194,211, 54,173,110,107,105,211,224, -147,156,129, 99, 50, 90, 28,157,232,230,230, 54, 51, 36, 36,100,234,225,195,135, 49,104,208, 32, 68, 69, 69,161, 75,151, 46,222, - 83,166, 76, 1, 0,244,239,223, 31,209,209,209,222,147, 39, 79,198,145, 35, 71,112,226,196, 9,132,135,135,207, 75, 76, 76, 84, -171, 84,170,173, 92,117,207,129,195,127, 61,158,210, 34,255, 43, 2,235, 15, 16, 25,141, 93,116,219,182, 65,115,230, 12,132,167, - 79,227,120,183,110,181,102,179,121,161, 74,165,202, 3, 0,103,103,231,249,177, 7, 14, 92, 30,118,238,156,181, 33, 61, 29, 29, -238,220, 1,175,115,231, 80, 75, 15, 28, 29, 29,221, 40, 10, 0, 32, 38, 38, 6,213,213,213,168,170,170,130,217,108,241, 92,194, -224,243,137,190,206,142, 30, 80,225, 46, 24, 30,207,234, 65,160,161,143, 76,107, 93,208,225,129, 99,109, 21,191, 27,145,165,238, -102,165,171, 49,245, 34, 5, 6, 24, 42,117,112,117,112, 3,143,228,245,109, 75, 38, 53, 56, 58, 18,137,164, 60, 41, 41,233,249, -126,253,250,253, 10,192,177,225,255, 63,225, 98,221, 43, 44, 44,156,215, 46,235,145, 36, 87,156, 63,127,222, 57, 54, 54,246,221, -175,190,250,138, 5, 0,131,193,208,216, 73,222, 96, 48,128,199,227,129, 97, 24,200,100, 50,240,120, 60,151,195,135, 15,187,140, - 29, 59,246,107, 0,205, 94, 39,169, 84, 10, 23, 23, 23,240,249,124,216,216,216,160,174,186, 66,182,237,147, 15, 7, 74,237, 92, -236,231,205, 91, 72, 78,155, 54, 45,245,171,175,190,114,119,245,241, 13,202,200,200,200,125,121,250,140,203,123,247,238,173,133, -229, 29,220,111,101,103,103, 11,131, 2,124,197,199, 15,212, 50, 82, 30, 11,105,233,199,144, 74,148, 16, 10,221, 33, 21,137, 32, - 16, 10, 29, 85, 69, 69,197, 44,203,222,183,232,142,100,217,155, 57, 57, 57, 84, 39, 15,133,176, 70, 99,174,145, 82,180,213,189, -228, 91, 89,190, 97, 33,157, 1, 64,151,126,235,188,168,147,143, 80, 85, 81, 37,114,117,117, 77,107, 67, 58, 5, 46, 46, 46,194, -212,244,123, 59, 29,237,173, 61, 92, 92,156,135, 2,128, 73,171, 73, 37, 12,186, 66,138,199, 83,150, 87, 84,148,232,116,186,123, -150,114,102,101,101,241,124, 58,186,139, 14, 29, 59,253,157,179,181,188,131,163, 68,228, 98, 45, 19,200,133, 52, 93, 39,100,232, - 66,129, 72,164, 40, 44, 42, 42,101, 89, 54,171, 57,146,134, 14,227,192,174, 31,234,207,191,193,221,193,149,108, 22,118, 78,174, - 40,203,203,196,217,163, 71, 48,117,246,187, 22,221, 79, 27,215, 76,223,187,113,205,244,102,195, 51, 60, 35,136,254,124,205,147, - 30,112,225, 89, 78,149,170,229, 10,117,196,136, 17,255,218,177, 99,135,180,145, 34, 61, 29,145,145,143,123, 18,172, 90,181, 10, -195,135, 15,135,159,159, 31,210,210,210,224,233,233,137, 67,135, 14,129,162, 40,254,204,153, 51,151,236,220,185,147, 19, 88, 28, - 56,112,248,255,138,102,135,172, 49, 44,203,208, 21, 21, 96, 13,134, 6,135,128,101, 89, 86,250,111, 97,195,151,218,218,218, 18, -124, 55, 55, 16, 98,241,227, 63, 9,226, 79,247,208,230,241,120,109, 18, 88, 52, 13, 10,132, 9, 44, 88, 0, 36, 8,144,208, 72, -132, 88,233, 18, 69, 44, 83, 46,161, 74,164,118, 4, 65,145, 32, 72, 2, 32, 0,214,196,128,102,233,182, 42, 35,182,182,182, 22, -122,189,222,206,199,199,231,184, 78,167,179,171,127,176,177,255,169, 11, 71,211,116, 54, 73,146,120,237,181,215,208,160,244, 13, - 6, 3,178,178,178,160,211,233, 96, 48, 24,144,150,150,134,234,234,106, 24, 12, 6, 36, 38, 38,194,211,211, 19, 60, 30, 79,217, - 18,175,217,108,134,147,147, 19,148, 74, 37,244,117,213,178,131, 59, 54,143, 94,191,106,153,227,203, 62, 44,185,107,203,103, 76, -231,206,157, 43,131,130,130, 28, 37, 18, 73, 69, 72, 72, 72,217,222,189,123, 15,163,109, 33, 26,142, 46, 91,182,172,215,192,129, - 3,253,108,173, 36, 38,153, 24,144, 82,117, 16,178, 90,240,205,197,240,243,242,101, 8,169,180,203,228,201,147,245,120, 28, 23, -202, 34,206, 5, 11, 22,248, 4, 7, 7, 43,237,172, 69,117, 18, 1, 81, 36,166,104, 85,101,218,173,171, 0, 32,178,181,215, 66, - 36, 9,158, 58,117,170,182, 45,156,139, 23, 47, 14,232,212,169,147, 66,192, 99, 53, 4,109, 46,108, 92,163,215, 21, 83,124,129, - 6, 2, 65,216,188,121,243,140,109,225, 92,180,104,145,127,183,110,221, 92,156,108,196,117, 18, 62, 10, 37, 20, 93,200, 55,232, -243, 4,102, 67,177,216,206, 78, 3,137, 52,244,213, 87, 95, 53, 52,199,217,224, 94, 61,235, 12,241,120, 60, 20, 22, 22,162,252, -193, 21,148, 63,184,141,206,100, 13,122,185, 56, 65, 46,151,183,122, 63, 17,129, 25, 68,250, 3, 16,233, 15, 64, 16,129, 25, 68, - 83,203,207,138, 44,165, 82,217, 98,217,111,177,169, 47, 61,224, 66,123, 56, 79,156, 56,241,233,216,177, 99, 77,147, 38, 77,194, -233,211,167, 65, 16, 4, 46, 93,186,132,130,130, 2, 12, 31, 62, 28, 44,203, 34, 37, 37, 5, 70,163, 17,233,233,233,152, 48, 97, - 2,162,162,162, 52,113,113,113, 31,115, 85, 61, 7, 14, 28,254, 83, 2,107, 96,189, 37, 55,176, 97,133, 73, 36, 74,101,230,204, -129,205, 47,191,128,127,247, 46, 38,188,248,162,181, 72, 36,218,162, 80, 40,186, 43,149,202,190, 18,137,228,235, 5, 11, 22, 88, - 57, 68, 71,195, 53, 62, 30,170,211,167, 97,226,243,111,180,229,224, 90,173,182,193,141,129,161, 94,200,217,218,218,130, 97, 24, - 88,170, 93, 88, 26, 9,170,146,187, 16,162, 35, 88,160,230,100,205,224,132,151,179, 87,187,156,169,233,220,249,110, 53,223,103, -189,115, 47,199,157,157,250,220,208, 18,252, 90,129,181, 16,133,133,133, 96,193, 36,180, 37,157, 58,157,174,170,174,174,142,240, -241,241,113, 76, 74, 74,242,241,245,245,117, 0, 64,232,245,250,235,127, 38,243,149, 74,101,239,208,208,208,253, 97, 97, 97, 57, -161,161,161,251,149, 74,101,239, 54,236,190, 43, 57, 57, 25, 20, 69, 97,230,204,153,168,169,169,129,193, 96, 64, 94, 94, 30,114, -115,115, 97, 48, 24,144,154,154,138,140,140, 12, 24, 12, 6,164,164,164, 64,175,215, 91, 34,220, 96,101,101,133,202, 50,181,108, -223,182,207, 70,127,188,234, 35, 73,213,189, 36,228, 23, 22,131,161,181,133, 31,125,244, 81,182,143,143,207, 37,131,193,224, 79, -211,244, 40, 0,251,218, 88,222, 82,186,116,233, 50,112,227,198,141,125, 87,127,250,189,208, 70, 94, 13,145,173, 61,132,118, 82, - 8, 61,195, 49,245,253,207,121,219,183,111,189,117,233,210,165, 18, 88, 54, 50,143, 4,144,210,163, 71,143,190, 69, 69, 69, 3, -194,194,194,194,221, 58,117,146,201, 20,202, 10,145,194,181,148,209,235,174, 66,225,214, 63, 38, 38,230,250,185,115,231, 84,109, -225,244,244,244,236,191,117,235,214, 94, 29, 59,118,236, 37,181,182,150,235,106,106,126, 48,107, 52,177,148, 92, 46,132, 68, 54, - 44, 46, 46,238,210,222,189,123,139,218,194, 25, 16, 16,208, 47, 58, 58,186, 71,247,238,221,123,185,123,123,203, 37,206,138, 50, -153,171,187, 90,226, 23, 40,128,194,125, 72, 76, 76,204,149,243,231,207, 91,154, 78,144, 36, 9, 30,143, 7,185, 92,142, 11, 23, - 46, 32,170, 95, 23, 40,201,114,132,116, 84, 98,228,244,215,241,219,111,191,129,207,231,227,207,186,173, 77,184,175,173, 10,162, -182,138,175,214, 56, 85, 42,213,214,196,196,196, 47, 94,122,233, 37, 12, 25, 50, 4, 55,111,222,196,226,197,139,179,207,159, 63, - 15, 0,184,121,243, 38,214,174, 93,155,157,144,144,128,233,211,167, 35, 50, 50, 18, 41, 41, 41, 49, 92,240, 81, 14, 28,254,207, -224, 15, 90,228,255, 50, 26,154, 8, 47, 60,249,237,109,103,103,165,211,105,242, 47, 92,184, 96, 28, 53,106,148, 64, 34,145, 96, -226,164, 73,100, 7, 15,143,126, 23, 98, 98,206,202,164, 82, 98,210,178,101,242,224,224,224,198, 74,254,215, 95,127,213, 86, 85, - 85,150,117,232,208,193, 54, 47, 47,175,210,146,131,151,150,150, 66,161, 80,128,162, 40,212,213,213,129,162, 40,200,229,114,104, - 52, 26,139,251, 96,213, 85,147,167, 47, 93, 72, 29, 50,104,226,236,154, 97,217, 70,153,153,117,232,109, 69,178,160, 97,130, 78, -195,194,204,176,188,107,172,109,143,179,126, 81, 21,107,125, 75, 51,243,207,108,117,210,178,134,211,109,201,164,138,138,138, 15, -103,207,158,189, 47, 40, 40,200,209,202,202, 10, 46, 46, 46,228,155,111,190, 89,146,151,151,183,166,189, 25, 31, 16, 16, 48,217, -223,223,127, 75,108,108,172,125, 78, 78, 14, 0,116, 90,182,108,217,160,140,140,140,185,233,233,233,150, 4, 47,221,191,113,227, -198, 45,131, 7, 15,150, 69, 68, 68, 52, 10, 44,163,209,216,248,253,236,239,134,230,216,150,192, 48, 12,196, 98, 49, 98,191,221, - 60,236,227, 85, 31, 73,202,210, 19,112,235,210,105,196, 61,208,107, 54,124,183,231,170,184,193,173,108,235,249, 58, 73,187, 90, -217, 90,237, 31, 52,116,132,235,184,169,179,201, 85,171, 86,177,191,159,138,101,191,251,106, 14,188,253,191, 0, 65,144,200,200, -188,137, 89,147,250,179,169,183, 83,123, 0,112,111, 43,231,167,159,126, 90,151,145,145, 81,181,127,255,126,113,135, 14, 29,124, - 72,146, 20, 21, 21, 23,151, 77,158, 60,249,230,229,203,151,203, 25,134,153,211,174,116,224, 23, 88,155, 0, 0, 32, 0, 73, 68, - 65, 84,254,254,123, 93, 76, 76,140,212,201,201,201,159, 36, 73, 81, 85, 85, 85,233,236,217,179,147, 99, 99, 99,107, 24,134,153, -219, 30,206,200,200,200,218,125,251,246, 73, 61, 60, 60,186,144, 36, 41, 42, 44, 42, 42,157, 52,105, 82, 74, 66, 66, 66, 53, 30, - 7, 26,109, 18, 19,231,103, 96,224, 11,143,127, 75, 36,146,178,128,128, 0,135, 81,163, 70,129,166,105,228,228,228,224,246,237, -219, 24, 49,229, 21,216,219,219,227,220,157, 59, 80,169, 84,248,224,131, 15,160,213,106,113,239,222, 61,213, 95, 89,121,212, 55, -237,177, 42,149,234, 15, 55,107,218, 81,255,198, 32,162, 79,137, 43, 47,226, 66, 75,253,172, 90,226, 4,128, 97,195,134, 77, 31, - 59,118, 44,126,249,229, 23, 44, 94,188, 56,123,229,202,149,222,147, 38, 77, 66, 90, 90, 26, 66, 67, 67,177,112,225, 66,239,141, - 27, 55,102,179, 44,235,221,167, 79, 31,184,187,187, 63,175, 82,169,222,231,158, 91, 28, 56,252,159,192,133,103,190,255, 39, 4, - 22,240, 68,135, 50,214, 90, 50,105,199,214,175,109,222,157,191,176, 46, 48, 48,208,206,197,197, 5, 36, 73, 98,196,200,145, 68, -239, 83,167,172,248, 74, 37, 28,186,118, 5,203,178, 96, 24, 6, 23,227,227,113,246,236,217,186, 31,190,219,229, 54,227,141, 55, -198, 0,104,118,228, 78, 67,179, 26, 65, 16, 40, 41, 41,105, 20, 88, 98,177, 24,133,133,133, 80, 40, 20, 16, 8, 4,160, 40,138, - 7,128, 2,208, 98,179,163, 66,161,248, 62,122,109,218,210,188,144, 69, 94,145, 82,146, 56, 89, 87, 4, 18, 4,204, 44, 3, 82, -203,130, 97, 88,232, 77, 64,144, 27,101,119, 70, 15,219,235,169,167,115, 20, 10,197,247, 42,149,229,207,154,156,156,156,115, 90, -173,246,237,186,186,186, 3, 0,200,171, 87,175, 50, 15, 30, 60,120,199,210, 14,233, 77, 65, 34,145,188, 31, 27, 27,107,191,102, -205,154,138,179,103,207, 86, 13, 30, 60,216, 38, 58, 58,218, 97,242,228,201,239,195,130,232,240, 42,149, 74, 11, 32,166,184,184, -248,157, 30, 61,122,160,188,188, 28, 6,131, 1,201,201,201,240,245,245, 69, 98, 98, 34,186,116,233,130,235,215,175,195,223,223, - 31, 52, 77, 67,167,211,129,182, 32,208, 86, 97,222, 35,185, 84, 95, 97, 93,120,237, 4, 50,111, 37,226, 68,182, 94,179,225,187, -125, 39,186,134,134,215, 89, 42,124,159, 68,103,103,105,144,139,163,195,169,207, 55,174,179, 42,184,118, 18,251,183,127,206,254, -126,236, 88,119,145, 53, 94,235, 61,244,221,137, 38, 35, 58, 48, 44, 4,145,145,125, 48,166,123, 42,193,215,163,226,108, 82,203, -145,204,155,226, 60,240,253,207, 97, 58, 32,200,203,203,107, 12, 69, 81, 78, 0,140, 52, 77,167,193,194, 41,104,154, 75,167, 14, - 8, 82, 42,149, 99,196, 98,177, 27, 65, 16, 90,173, 86,123,247,175,224,244,246,246, 30, 67, 81,148, 43, 0, 13, 77,211, 89,104, -227, 84, 57, 67,134, 12,217,176,107,215,174, 5,122,189,222,225, 9,183,149, 56,121,242, 36, 12, 6, 3,132, 66, 33, 43,147,201, -144,151,151,199, 2, 80,177, 44,251,246, 95, 85,113,140, 31, 63, 30, 87,175, 94, 93, 5, 96, 69, 75,219,149,151,151,243,236,237, -237,205, 79, 10,175,230,162,192, 91,194,121,237,218,181, 79,223,124,243,205,247,227,226,226,242, 87,174, 92, 25, 58,109,218, 52, - 28, 57,114, 4, 30, 30, 30,200,204,204,196,130, 5, 11, 64, 16,132,247,198,141, 27, 83,246,238,221,171, 44, 42, 42,250,140,123, -102,113,224,240,127, 10,196,255,202,137, 52,217, 7,139, 96, 8,190,159,175, 47,109,208,212,238,126, 99,250,116, 77,106,106, 42, -104,154,134,217,108,134,238,250,117,212,157, 58, 5,179,217, 12,150,101,113,237,234, 85,204,157, 51,167, 86,167,169,253,182, 83, -167,142, 44,193,178,178, 39,168,254, 48,219,182,161,161, 45, 16,143,155, 8,181, 90, 45,248,124, 62,228,114, 57, 74, 74, 74, 32, - 20, 10, 33,145, 72,208,173, 91, 55,210,221,221, 61,170,137,228, 61,197,153,156,156,108, 66,181,126,194, 47, 83,231, 21,185,107, -204,236, 76,219, 78,232,192,151, 60,238,111, 5,192,201,138,196,144, 64, 30,236,121,165,236,237, 61, 47,171, 8,115,213,132,228, -228,100, 83, 75,156,207, 66,169, 84,118, 14, 10, 10,250,186, 33, 14, 86,191,126,253,200,224,224,224, 47,149, 74,101,231, 22,118, -107,145, 83, 44, 22,139, 0,224,244,233,211,229,241,241,241, 35, 79,159, 62, 93, 14,128,109,248,223, 18, 78,146, 36,119,108,223, -190, 29, 82,169, 20,102,179, 25, 6,131, 1,122,189, 30, 6,131,225, 15, 31, 71, 71, 71,156, 57,115, 6, 12,195, 28,111, 45,157, - 1,193, 33,181, 85, 60,219,226, 61,191,254,142,147, 15,141,181,237, 16, 87,141,156,129, 10, 89, 23, 55,167,199, 2,163, 44, 61, - 1,247,110, 39,226,196,241,163, 41, 58,160,160,178, 26,159, 84, 86, 35,164, 78, 7,187,158, 1, 40, 61,117, 96, 41,177,240, 21, - 16, 32,154,156, 51,207, 34,206,122,129, 50,139,166,233,158, 52, 77,247, 4, 48,171, 5,209,210, 38, 78,157, 78,215, 75,171,213, -254,165,156,109, 77,103, 67, 31, 44, 0,248,232,163,143,174,199,199,199,191,116,253,250,245,193, 13,159, 59,119,238, 12,202,201, -201, 25, 84, 80, 80, 48, 40,231,168,136,186,115,231, 14, 47, 49, 49,145,159,152,152,232,145,148,148, 20,103,105,249,108, 14, 79, -118,112, 87,169, 84, 43,159,113,154, 26, 57,137,192, 12,226,235,141,179,127,136,141,141, 85,252, 85,156, 0,144,153,153,249,245, -174, 93,187, 60,187,117,235,230,222, 16,138,225,219,111,191, 5,240, 56,146,253,231,159,127,142,222,189,123,195,221,221,221, 57, - 41, 41,201,171,176,176,112,123, 91,239,205,118,130,227,228, 56, 57, 78, 14, 22, 8, 44,130,161,105,154,129,179,139,179, 85,137, - 90,253,213,236,217,179,202, 86,175, 94,173,251,127,237, 93,121, 92, 84,213,251,126,238,157,125,103, 21, 24, 65, 81, 65, 4,113, - 65, 92, 48,181, 12,197,157,178, 92, 75,203,221,220,181,197,204,212,159,184,164,169,165,102,230,146, 90,238, 75,102,101,185,100, -148, 95,200, 21, 17,220, 80,217, 20, 20, 24,246, 29,134, 89,238,242,251, 3,102, 26, 8, 97, 6, 53,177,238,243,249,220,207,157, - 59,119,230,153,115,206,189,115,206,115,223,247, 61,239,137,136,136,128,254,206, 29, 84,196,196, 32, 60, 60, 28,115,231,206, 45, -127,103,218, 52, 77, 69,121,233, 70, 55, 87, 23,103,154,102, 64, 16, 76,157, 22, 18,146, 36,147, 19, 18, 18, 0, 0, 58,157, 14, - 95,126,249,165,209, 96, 48, 64,165, 82,129,101, 89,236,216,177,131, 1,128,190,125,251,202, 5, 2,129, 85, 75,144,100,100,100, - 92, 47,126,152,209,255,251, 55,166, 39,223, 62,244,115,113,135, 60, 61, 70, 73,212,120,173, 3,139, 86,146, 84, 60,184,248, 77, -209,197,109,195,146,203, 11, 30, 14,200,200,200,184,110,107, 35,185,185,185,253,223,129, 3, 7, 92,174, 94,189,202,234,116, 58, -164,167,167,179,243,231,207,119,113,115,115,251,191,199, 81,233,133,133,133, 32, 73,146,169,106, 23,198, 86,245,158,158,158,126, -243,232,209,163, 63,157, 61,123, 22, 30, 30, 30,160,105,218, 44,176, 44,247,124, 62, 31, 4, 65, 96,219,182,109,133, 4, 65, 44, -172,143, 87, 36, 18, 97,251,145,147,167, 62,216,122,236,200,145,240,168, 99, 13,181, 92, 1,128, 76,169, 90,241,249,186, 79,237, - 76,174,198, 3, 87, 51,138, 9,154,173,221, 85,103, 72,175,188, 71,106, 23, 88, 13,227,124, 26,229,124,134,156,207, 18,149, 51, -253, 52, 68,211,166, 77,241,253,247,223,219, 28,131,229,223,138,248, 91,112,123, 67, 57,111,222,188,249,233,168, 81,163,178,194, -194,194,182, 84, 84, 84,148, 85, 61,188, 25, 62,255,252,243,207,102,205,154,149,149,158,158,206, 89,174, 56,112,224,240, 76, 81, -107,154, 6,134, 71,158,223,182,125,235,160,195, 7, 15,185,241,120,164,219,189,123,247,175,188, 61,105, 82,122,100,100,164,163, -160,117,235,110, 36, 73, 50,250,143, 62,186, 88, 90, 92,148,191,247,219,111, 60, 91,182,108, 17, 80,181,216, 51,203,240,200,243, -117,253, 96,126,126,254,238,121,243,230,117,219,179,103,143,112,221,186,117,101,233,233,233,103, 46, 95,190, 60,104,203,150, 45, -146, 29, 59,118,148, 23, 21, 21, 29, 63,121,242,228,208,224,224, 96, 74,175,215, 91,157, 95, 40, 59, 59, 59, 14,217,217,126,228, -250, 29, 99,226,183,239,235,207,242,200, 30,168, 16,130, 96,233, 11, 36, 85,122, 38, 59, 35,227, 0, 0,170, 33,141, 36,145, 72, - 2,164, 82, 41, 18, 19, 19, 11,186,117,235,166, 23,137, 68,130, 22, 45, 90, 56, 73, 36,146,128,134, 54, 60,203,178,108, 65, 65, - 1, 88,150,229, 3, 32,104,154,230, 3, 0, 83, 95,210,162, 26, 16, 10,133,111, 76,156, 56,241,167, 45, 91,182,244,239,219,183, - 47,188,188,188, 96, 52, 26,225,235,235, 11,189, 94, 15, 31, 31, 31, 84, 84, 84,224,139, 47,190, 64,105,105,233,123, 25, 25, 25, - 5,117,241, 49, 12, 3,177, 88, 12,145, 72, 4,223,182,237,203, 37, 18, 9, 26, 42,174, 0, 64, 46, 66,171,135,151, 78, 32,241, -198, 85, 28,142,209, 20,150, 25,152,129,241, 57,229,183,106,126,174, 92,143,178,224,129,211, 43,133,183, 17,165, 79,130,243,105, -148,243, 89,115, 90,198, 96, 89,243,217, 39,133, 71,197, 68,213,133,219,247, 65, 76,127,113, 51,139,219,155,107,205,113,213, 16, - 78, 19,210,210,210,182,153,150,192, 33, 73, 50,105,206,156, 57,243,211,211,211, 55,104, 52,154, 45, 26,141,102, 41,215,181,115, -224,192,161, 81, 10,172,123,247,210,226,142,254,120,236,227, 99,223, 31,237,201,178, 36,143, 37,136, 50,128,252, 57, 46, 46,174, - 90,240,186,151,131,131,114,226,148,137,163, 9,134, 16, 16, 4, 67, 51, 60,242,252,189,123,105,113,245, 88,155,110,244,233,211, -103,115,112,112,240, 36,154,166,215, 38, 38, 38,158, 33, 73, 50,118,224,192,129, 31, 80, 20,245, 89,114,114,242, 25, 95, 95,223, -223, 14, 31, 62,252, 33, 77,211,182, 90,136,168,140,140,140, 61,168, 35, 6,172,129, 88, 14,192, 78, 44, 22, 23, 93,189,122,245, - 80,207,158, 61,223, 32, 8,194, 14, 64, 81, 67, 9,117, 58,221,156,146,146, 18,231,209,163, 71, 27, 1,248,190,254,250,235, 11, - 19, 18, 18, 4,101,101,101,201,182,240,164,166,166,234, 60, 61, 61,135,206,152, 49, 99,167, 80, 40,236,139,191,146,180,153,132, - 28, 88,150, 5, 77,211,199,171,218,230,145, 16, 8, 4,165, 67,134, 12, 81, 88, 97,225, 42,181,182,124,153,185, 37,115, 86,238, - 62,185, 90,103,100, 24,138, 97,167,197,103,151,215, 58,234, 95,137, 67,187, 39,205,105, 11,158, 23, 78, 0,152,254,226,230,125, -184,189,217, 44,160, 76,110,195,154,199, 79, 11, 85, 22, 39, 22,192,178,250, 62, 91,215,186,130, 13,229,172,137,244,244,244,175, -185,153,130, 28, 56,112,248,175,129,243, 79,115,156, 28, 39,199,201,113,114,156, 28, 39,199,249,159, 3,201, 53, 1, 7, 14, 28, - 56,112,224,192,129,195,147, 5, 81,135, 10,181,101,165,236,134, 40,217,155, 28, 39,199,201,113,114,156, 28, 39,199,201,113,254, -231, 56,235,227,190, 9, 14, 79, 69,120,113,156, 28, 39,199,201,113,114,156, 28, 39,199,249,223,227,252, 87,129,115, 17,114,224, -192,129, 3, 7, 14, 28, 56,112, 2,171, 81,224,109, 84, 38,133,188, 9,224,215,170,227,134, 66, 10,224, 35, 11,190, 83, 0, 62, - 4, 32,230,154,185, 81,131,199, 53, 1,135,134, 66,173, 86,183,105,219,182,237,213,122,146, 21,115,224,192,225, 57, 6,255, 81, - 39,188,188,188, 46,144, 36,217,138, 36, 43, 53,152,101, 46, 36,211,235,154,123,150,101,239,221,190,125,187,199,163, 56, 91,182, -108,105,230, 36, 73, 18, 4, 65,128, 36, 73, 24,141, 70, 37,143,199, 43,169,141,147,166,233,180,248,248,248, 46,141,168,205,246, - 57, 56, 56, 24,183,108,217,242, 85, 96, 96, 96,235,252,252,252,178,169, 83,167, 14,184,121,243,102, 8,128,183,108,228,106, 79, - 16,196,222,174, 93,187, 30,155, 53,107,214,119,254,254,254,202,178,178, 50,241,225,195,135,221,182,109,219,246, 39, 77,211, 19, - 1,196,113,183,105,227,129,155,155, 91, 32, 65, 16,155, 21, 10, 69,151,210,210,210, 43, 0,102,106, 52,154,107, 92,203,252,163, -152, 44, 18,137, 6,250,248,248,116,211,233,116, 5,247,238,221,139,170, 74,233,146,249,132,248,237, 0,252,159, 88, 44, 14,242, -246,246,110,150,144,144,240,208, 96, 48, 92, 70,101,186,150,162,199, 37, 87,171,213,109,130,130,130,206,173, 90,181,202,105,225, -194,133,231,162,162,162,122,105, 52,154,120,238,178,114,120, 22,104,214,172,153,125, 89, 89,217, 78,146, 36, 3, 37, 18,137,155, - 82,169,132, 66,161,200, 20,139,197,177, 50,153,108,210,201,147, 39, 11,185, 86,122,194, 2,139,199,227,121, 68, 69, 69,185, 40, -149, 74,208, 52, 13,134, 97,192, 48,140,121,253,193,170, 37, 5, 77,194, 10, 52, 77, 35, 56, 56,184,206,213,132,249,124,126,179, -171, 87,175,186, 40, 20,127,165, 90, 50, 24, 12,232,216,177, 35, 19, 19, 19,227, 82,115, 33, 97,189, 94,143,206,157, 59,179,141, -168,189,198, 58, 57, 57,233, 83, 83, 31,188, 80,161, 51,244,152, 49,127,197,255,141,126,181,183,221,197,139, 23,201, 87, 94,121, - 69,112,246,236,217,183, 1,236,181,146, 75, 74, 16,196,174,197,139, 23,127,202, 23,202, 92,142,158,188,192,255,114,251,129,135, -237,219,182, 36,230,205,158, 33,155, 51,103, 78,148,159,159,223, 55, 52, 77,191, 8, 64,199,221,170,141,227,255, 34, 16, 8,126, - 90,189,122,181,123,166, 70,131,245, 27, 54,116, 7,176, 5, 64,119,174,105,254, 49,124,180,108,217,178,213, 99,198,140, 1, 69, - 81,208,106,181, 77,147,146,146,218, 45, 94,188,248,245,164,164,164,110, 0,146, 31,147,191,137,143,143,207,157,121,243,230, 57, -118,235,214, 13, 36, 73,162,176,176,176,233,185,115,231,186,239,218,181,235,237, 7, 15, 30,248, 1,200,121,156, 31,112,112,112, -216,255,217,103,159, 57,137,197, 98,124,251,237,183, 78,163, 70,141,250, 19,192,139,143, 33,178, 72, 39, 39,167, 57, 0,130, 25, -134, 17, 3,184, 92, 80, 80,176, 18,128,129,187, 93, 56,212, 5, 39, 39,167,201, 89, 89, 89, 95,201,100, 50,161,189,189, 61,164, - 82, 41,132, 66, 33, 68, 34, 81,115, 7, 7,135,230, 10,133, 98,240, 27,111,188, 49,243,208,161, 67, 59,185,214,122,130, 2,139, - 36, 73, 72,165, 82, 28, 62,124, 24, 60, 30, 15, 66,161, 16, 2,129, 0, 2,129,160,218,107,211,113,179,102,205,234,253, 49,147, - 85,234,248,241,227,176,179,179,131, 74,165, 66,219,182,109, 65, 16, 4,196, 98, 49,194,195,195,171,241,118,233,210,229,177,178, -136, 55, 4, 35,250, 86, 38,233,172, 45,121, 99,232,204, 52,188, 50,102,213,240,114,157,241, 37,150, 37,180,153, 5,198,252,229, -235,190,138,235,212,174, 45,113,228,200,145,206,206,206,206,111,218, 32,176,230,118,235,214,237, 56, 5,145,235,196,241, 19,198, - 79, 32, 9,106,216,132,247,151,157,139, 73, 42,216,233, 31,120, 32, 39, 39,109,218,151, 95,126, 25, 63, 99,198,140, 57, 0,214, - 90, 91,254, 46, 93,186, 60, 96, 24,166, 89,149, 72,206,149, 74,165,234,136,136, 8,170, 17,220,107, 77, 1,172, 3, 96, 4,176, - 6,128,101,210,205, 54, 66,161,112,173,193, 96,200, 71,229, 66,191, 15, 27,227,159,197,221,221,221,239,173,183,222,114,206,203, -201,193,250, 13, 27,204, 77, 14, 43, 22, 37,127,210, 8, 12, 12,108, 37,145, 72,214, 1, 8,212,233,116,238, 0, 32,149, 74,211, - 89,150,253, 65,171,213, 46,138,137,137,209, 54,244,129, 22, 64, 59, 60,122,201, 38,118,237,218,181,241, 31,126,248,225,189,103, -192,217,194,213,213,117,213,200,145, 35,113,226,196, 9,156, 60,121,210, 40,145, 72,248,227,199,143, 39,102,206,156,233, 48,111, -222,188,193, 0,190,120,204,166, 29,188,108,217, 50,199,182,109,219,226,232,209,163,184,118,237,154,182, 77,155, 54,210,222,189, -123,131,199,227, 57, 46, 90,180,104, 16,128,221,143,243, 3, 5, 5, 5, 43, 87,172, 88,177,103,243,230,205,202,228,228,100, 44, - 91,182,204,121,214,172, 89, 17, 0,122,219, 32,178,196, 0,230, 0, 8,230,241,120, 47,142, 31, 63,158,154, 61,123,182,128, 36, - 73,227,198,141, 27,155,236,220,185,115,180, 64, 32, 8,204,203,203, 43, 5, 7,212, 49,206, 25, 24,134, 17, 0,144, 0,208,213, -119,252,111,170,187,163,163,227,244,252,252,252, 45, 77,155, 54, 69,147, 38, 77,204, 99, 45,195, 48, 40, 43, 43,131, 86,171, 69, -171, 86,173,132,109,219,182,221, 49,115,230, 76,193, 87, 95,125,181,149,187, 99,108, 23, 88,189, 1, 68, 88,188,215, 27, 64, 4, - 65, 16, 96, 24, 6, 2,129, 0, 60, 30, 15,124, 62,223, 44,124, 44, 95,155,182, 71, 8,161,155, 53,110,102,162,164,164,196, 44, -174,236,236,236,204,150, 48,163,209,248, 55, 78,154,166, 65,146, 36, 91, 23,231, 19,130,153,243,187,141,126,216, 29, 61,255,141, -221,209,149,199,131,198, 84,238,119, 71, 3,225,151,167,173, 91,187,181,103,179,185, 43,191, 93,157,151, 87,152,237,239,209,132, -122,115, 76,111, 79, 81,110, 86,174, 83,203,150,161, 0,178,109, 40,103,175,105,211,166, 29, 61,122, 54, 81, 46, 22,139, 68, 60, - 18,188, 54, 94,173, 4,238,170,214,142, 77, 6,116, 19,165, 36, 39,255,249,246,219,111, 79,155, 49, 99,134,147,133,192,170,183, -238, 44,203,170,207,156, 57, 3, 62,159,143,144,144, 16,135,170,107, 76, 89, 83,247,167,209,158, 22, 88,156,149,149,245, 70, 69, - 69, 5,186,116,233,242,106, 94, 94, 94, 48,128, 88, 0, 29,134, 14, 29,250,231,119,223,125,167,140,137,137, 65,247,238,221,165, - 0, 70, 61,195,114,254, 13,106,181,250, 12,128,126, 4, 65, 64, 95, 81,161, 95,247,121,181,101,238,162,107,136,171,167, 94,206, -128,128, 0, 63,137, 68,114,225,243,207, 63, 87,249,251,251, 19, 2,129, 0, 20, 69, 33, 33, 33,161,217,190,125,251,222,185,114, -229,202,160,192,192, 64,255, 90, 22, 53,183,166,238,237,254,252,243,207, 50, 47, 47,175, 90, 5, 99,121,121, 57,207,203,203,235, -229, 71,136,161,167,205,153,150,149,149,245, 90,191,126,253,166,101,102,102,222,161, 40,106, 1,128,246,206,206,206, 49,195,135, - 15,135, 84, 42, 13,214,106,181, 95, 60,206,117,119,113,113, 25,218,163, 71, 15,108,222,188, 25,107,214,172, 9, 1,240,251, 47, -191,252,210,183,184,184, 56,252,213, 87, 95,133,189,189,253,107,133,133,133,187, 31,227, 94,106,211,173, 91,183, 29,239,189,247, -158,242,151, 95,126,129,143,143, 15,138,139,139, 49,113,226, 68,151, 77,155, 54,253, 15,192,203, 22, 34,235, 81,156,254, 98,177, -120,247,193,131, 7, 21, 94, 94, 94, 94, 66,161,144,244,242,242, 66,126,126, 62, 42, 42, 42,196, 43, 87,174,236, 32,145, 72,174, -125,241,197, 23,187, 1, 12,123,198,255,163, 34, 0, 42, 0,246,176,205,189,122,179, 14, 62,115,124,170, 64, 32,128, 88, 44,134, - 68, 34,129, 68, 34,193,189,123,247,190,231,241,120, 19, 8,130, 48, 90,195, 73,252, 53,112, 5, 0,136,170,239, 24, 0,211, 8, -250, 37, 15,130, 32, 54, 2, 8, 70,101, 28,117,132,139,139,203,220,172,172,172, 84,107, 57,213,106,181, 83, 94, 94,222, 23, 77, -155, 54,133,139,139, 11,170, 30,200,209,165, 75, 23, 84, 84, 84,224,214,173, 91, 96, 24, 6, 73, 73, 73, 80,169, 84,232,208,161, -195, 23, 97, 97, 97, 71,195,194,194,242,158, 98,221,107,213, 34,207,187,192,250, 95,213,147,165,169, 50,166, 99,208, 52,109, 22, - 88, 53,197, 79, 77,193, 69, 16, 4, 88,150, 37,234,177, 96,145,122,189,222, 44,174, 84, 42,149, 89,156, 81, 20, 85,171,192,106, - 40,236,237,237,127, 45, 44, 44,220, 0,224, 76, 67,190, 63,126,252,248,191,197,115,124,244,209, 71, 15,115,114,114,232,161,189, -218,136,247,238, 61,145,247,118,232,203,110,254,222, 30,190,114, 39,151,128,242,242,242, 43, 0, 4,182, 24, 68,252,253,253,149, - 91, 15, 70,100,143,153,179,110,185,135,171,130,238,234,227,170,242,118,148,139,156, 36,124,202,158,165, 10,101, 50, 89, 59, 0, -121,182,150,221,206,206, 14,199,143, 31,111,108,247,154,131, 86,171, 69, 65, 65, 1,182,109,219,166,154, 54,109,218,217,188,188, -188,185, 67,135, 14,221,124,244,232, 81,121, 97, 97, 33, 12, 6, 3, 0,104, 27,225,255,100,133,131,131,195, 75,193,193,193,162, - 67, 71,142,136, 88,150, 45, 67,229,114, 68,165, 44,203,206,250,167, 11, 35,145, 72, 62, 88,185,114,165,202,223,223,159,200,205, -205, 5,203,178, 32, 73, 18,206,206,206,152, 63,127,190,100,209,162, 69,238,241,241,241, 31,163, 1,203,206, 0, 32, 30, 37,132, - 0, 64, 38,147,209,176,125,114, 76,173,156, 20, 69, 17, 61,123,246,156,159,155,155,219, 65,171,213,126, 98, 5, 15, 5,224,120, - 90, 90,154,229,205,125,237,206,157, 59, 90, 62,159, 47,109,217,178,101, 80, 92,220,227,133, 44,182,105,211,230, 5,129, 64,128, -203,151, 47,235, 44, 58,247,136,235,215,175,235,134, 13, 27, 38,110,214,172,217, 11,133,133,214,133,164,168,213,234, 54,222,222, -222,191, 57, 59, 59, 75, 77, 75, 86, 57, 57, 57, 9,214,174, 93,171, 76, 75, 75, 3, 69, 81, 88,184,112, 33, 66, 67, 67,225,224, -224,128, 9, 19, 38,184,238,216,177, 99, 63,128,206,117, 89,174,196, 98,241,238,196,196, 68, 95,181, 90, 45,189,116,233, 18, 58, -118,236,136,220,220, 92,100,102,102,162,180,180, 20,153,153,153,152, 52,105,146,203,250,245,235,213,141,232, 63, 84,200,231,243, - 33,151,203,237,139,138,138, 30, 39,142, 77, 12, 64, 4, 0,124, 62,223, 44,174,196, 98, 49,196,226,255,196,188, 32,119,130, 32, -226, 4, 2,129, 88, 46,151, 11, 73,146,132, 92, 46, 31,224,225,225,113, 43, 36, 36,164,253,190,125,251, 82,172, 33,169,168,168, -216, 43,149, 74, 5, 77,154, 52, 1, 0,244,239,223, 31,227,199,143, 71, 78, 78, 14,147,145,145, 1, 95, 95, 95, 50, 34, 34, 2, - 89, 89, 89,184,118,237, 26,186,118,237, 42,112,116,116,220, 11, 96,208, 83,172,219, 35,181,200,243, 44,176,106, 86,206, 12,134, - 97,170,137,171,218, 44, 87,150, 22,172,250,220,121, 4, 65,128,166,105,184,185,185, 65, 38,147, 65, 38,147,153,207,153,196,156, -229,198,178,108,131, 93,132,173, 91,183,238, 35,147,201, 94, 60,123,246,236,171, 0,194,173,253,222,200,121,119,204, 86,171,154, - 8, 8, 8,184,176,112,225,194,129,127,252,241, 71,193, 11, 29, 91, 49,226,140,135,121, 50, 7,231,142, 68, 19,151,144, 25, 83, -166, 94, 4,112,208,134, 34,102, 84, 84, 84,136, 91,184,145,218,140,162, 98,125, 43,149,157,125, 43, 59,133,172,133,179,157,147, -131, 68, 68,202, 93, 93,154, 26,141,198, 66, 0, 25,245, 17, 89,186, 5,197, 98,177,158, 32, 8,190,189,189, 61,236,236,236, 12, - 5, 5, 5, 21,129,129,129, 16,137, 68,185, 66,161,208,106,119, 97,215,174, 93,179,104,154,118,169,235, 51, 66,161, 48,251,210, -165, 75,174, 86,214,119, 81, 64, 64, 64,239, 45, 91,182, 52,241,241,241,193,182,109,219, 84, 71,143, 30,221,189,127,255,126, 20, - 22, 22,226,254,253,251,152, 56,113, 98, 49, 42,221,136,141,205,148,126,110,196,136, 17,216,185,115, 39, 91,245, 16, 33, 39, 8, -162,163,157,157,221,221,219,183,111,255,227,113, 46, 36, 73, 14,240,245,245, 37,138,138,138,192,178, 44,120, 60, 94,181,109,254, -252,249,210, 73,147, 38, 45,238,222,189,251,124,129, 64, 80, 76, 81,212,161,210,210,210, 79,110,221,186,213,168,130, 85, 95,124, -241,197,119, 31, 62,124, 24,234,233,233,249,243, 99,208,176, 20, 69,233, 89,150,149,242,120, 60,193,227,150,137, 32, 8, 94, 85, -127, 84, 97, 97,249,165,170,142,197,176, 97,246,168,163,163,227,254,125,251,246,121,120,120,120,192,104, 52,194,104, 52,162,172, -172, 12, 17, 17, 17,208,233,116,230, 69,217, 63,253,244,211,138,153, 51,103, 74,142, 28, 57,146,173,213,106,199,214, 67, 59,231, -187,239,190, 83,170,213,106,169, 86,171, 69,114,114, 50, 58,119,238,140,146,146, 18,148,149,149,161,188,188, 28, 6,131, 1, 69, - 69, 69,246, 52, 77,235, 27,203,181,230,241,120, 16,139,197, 16, 8, 4,133,205,154, 53, 3, 73,146,146,212,212,212,134,184,220, - 84, 0,138,249,124,190,200, 82, 88, 73, 36, 18,220,188,121,243,112, 29,214,171,218,111, 30,203, 96, 98, 43,142,159, 53, 8,130, -216, 40, 16, 8,196, 78, 78, 78, 66,211,123, 6,131, 65,232,224,224, 0, 79, 79,207,205, 0, 6, 91,201,211,201,201,201, 9, 4, - 65, 64, 40, 20, 98,202,148, 41,136,138,138,250, 33, 45, 45,237,237,236,236,108,148,150,150,238, 85,169, 84,175,103,103,103,131, -166,105,164,164,164, 32, 32, 32,160,211, 63, 84,205,231, 94, 88,213, 20, 88,189,107,236, 77, 22,169,122, 45, 87,245,184, 8,171, -193, 96, 48, 40, 66, 67, 67, 25,147, 24, 51,205, 34, 4, 64,208, 52, 13,161, 80, 88,141,179, 74, 96, 53,232, 6, 23,139,197, 24, - 60,120,176, 68, 38,147,253,248,203, 47,191,188, 10,224,143,134, 54,210,241,163, 7, 92,215, 46, 93,184,212,177,105, 75,239,143, - 63,254,152, 63,104,208,160,240, 67,135, 14,117,117,238,213,103, 96,228,239,135, 93,183, 45, 56,254,243,225,195,135, 75, 96,125, -252, 21, 0,156,255,225,135, 31,212, 31,204,158, 33,236,221,187,247,247,227, 58,188,199, 87,139, 24,165,163, 88,200,147,241,248, -164,184, 89,139,129,191, 71, 68,106, 0, 68, 90,209, 73,168,195,195,195, 97,111,111, 15, 0, 34,189, 94, 15,123,123,123,108,219, -182, 77,162, 82,169,160, 82,169,208,163, 71, 15, 7,161, 80, 88,159,187,208, 82,240,186,252,239,127,255,131, 66,161, 64, 89, 89, - 25,116, 58, 29, 40,138, 2,203,178,230, 39,199,151, 95,126,217,197,134,250, 38, 23, 23, 23,191, 52, 99,198,140,200, 45, 91,182, - 52,241,246,246,198,242,229,203,145,151,151,135, 7, 15, 30, 96,236,216,177,197,247,238,221, 11, 70,245,216,172,103,142,246,237, -219,179,231,206,157,195,169, 83,167,240,202, 43,175, 16,199,143, 31, 55,208, 52, 45,204,200,200,184,145,145,145,241, 76,202, 68, - 81,148, 82, 36, 18,193,104, 52,130,207,231,155, 93,248, 38,129,229,238,238,142,223,126,251,141, 95, 94, 94,206,207,203,203,147, -237,218,181,107,118,116,116,180, 26,192,155,207,178, 45,183,110,221,234, 57,101,202,148, 7,124, 62,159, 29, 56,112,224, 91,169, -169,169,175,169,213,234,223,207,158, 61,251, 57, 0,155,211, 21,180,107,215, 46,154,199,227,121, 24,141, 70,225,143, 63,254,104, -164,105, 90,216,190,125,251, 44,147,181,200, 52, 54, 82, 20,149,150,144,144,208,197, 26, 62,173, 86, 43,252,250,235,175,141, 21, - 21, 21,194, 14, 29, 58,152,185, 12, 6,131,240,167,159,126, 50, 26,141, 70, 97,155, 54,109,162,173,153,217,156,159,159, 63,118, -222,188,121,127, 30, 62,124,216,153,199,227, 33, 53, 53, 21,249,249,249,176,183,183,199,190,125,251,208,162, 69, 11,132,135,135, -231,211, 52, 61,121,231,206,157,139,181, 90,237, 88, 43, 98,176, 94, 14, 10, 10,242, 44, 44, 44,132,157,157, 29, 74, 75, 75, 17, - 29, 29, 13,127,127,127,100,100,100,128, 36, 73,216,219,219, 99,235,214,173,229, 4, 65,228, 55,134,255, 16, 73,146,102, 33,100, - 33,136, 42,130,130,130,112,254,252,249, 3, 54,138, 34,189,169,255,177,116, 13,138,197, 98,240,120, 60,155, 93, 30, 12,195, 8, - 1,116, 50, 13,232,245, 29, 55, 2,244,150,203,229,194,154,111, 22, 20, 20, 8,125,125,125, 95,180, 97,124,116,146, 74,165,149, -132,189,123, 35, 59, 59,155,246,242,242, 26, 61,122,244,104, 35, 0, 76,157, 58,117,116, 78, 78, 78,133,209,104,228,241,249,124, -228,228,228,160, 85,171, 86, 78,255, 68,253,106,106,145,231, 93, 96, 17,168,116,119, 88,238,205, 22,172,250, 44, 87,166,115, 38, -161, 84,207, 31,173,240,234,213,171,114,185, 92,110,126,207,104, 52,162, 83,167, 78, 12,195, 48, 68,205,223,122, 28, 11,150, 88, - 44,134,189,189, 61,222,124,243, 77, 89,122,122,250,238,107,215,174,121, 88,243,189,202, 24,172,234,226,106,251,154,229,155,191, - 92,187,210, 41,233,212,183,216,185,233, 51, 90, 46, 87,196, 4, 4, 4,188, 84, 84, 84,164,179,151,235,144,153,135,163, 0,246, -219,210,231, 0, 56,124,241,226,197,216,254,253,251, 95,188,127,255,190, 67,106, 98,226, 57,149,190,180, 84,209,172, 37, 37,116, -113, 29,170, 53, 24,249, 35, 70,140,112, 5,176,201,138,167, 17, 48, 12,131, 19, 39, 78, 64,169, 84, 66,165, 82,193,222,222, 30, - 38,113,213, 80,220,187,119, 15,105,105,105,144,203,229,144,203,229, 80, 40, 20, 80, 40, 20, 16,137, 68,213,172,143, 54, 32,190, -184,184,120,238,177, 99,199, 14,173, 94,189, 26, 5, 5, 5, 40, 43, 43,195,210,165, 75,145,156,156, 60, 15,149, 49, 89,141, 6, - 29, 58,116, 96, 47, 92,184,128,115,231,206,161,172,172, 12,155, 55,111,134, 90,173,238, 3, 96,201,179, 44, 23,195, 48, 66, 83, -170, 19,146, 36,255,102,193, 50,137, 45,169, 84, 10,103,103,103, 44, 92,184, 80, 56,116,232,208,208,103, 89,230,181,107,215,182, -222,184,113,227,174, 61,123,246,156, 26, 59,118,236,145,155, 55,111, 78,176,179,179,187,241,199, 31,127,172, 20,139,197, 76,131, - 58, 47, 62,223, 35, 54, 54,214, 82,228, 11,104,154,150,209, 52, 13,138,162, 96, 52, 26, 81, 94, 94,142,144,144, 16,171,249,162, -162,162,100, 0,176,100,201, 18, 1, 0, 25,195, 48,176,228,211,106,181,130,190,125,251, 90,213,151,104, 52,154,248,203,151, 47, -191, 56,122,244,232, 11,135, 14, 29,114,240,244,244, 68, 90, 90, 26, 50, 50, 50,224,237,237,141, 77,155, 54,149,177, 44,219,179, - 74, 84,253,100,101,181,155, 58, 56, 56, 8, 30, 60,120, 0,138,162, 16, 24, 24,136,173, 91,183, 98,212,168, 81,104,215,174, 29, - 74, 74, 74, 16, 23, 23,135,221,187,119, 59, 8,133,194,225,141, 65, 92,153, 68, 80,109, 91, 3, 31, 48, 84, 18,137,164, 88, 34, -145,136, 76, 66,235,202,149, 43, 54, 91,175, 44, 16,107,227,241, 51,131,169, 15, 54, 26,171, 87, 83, 46,151,195,199,199,199,106, - 30,185, 92, 78,152,198, 88,163,209, 8,141, 70, 67,223,188,121,211, 44, 80,213,106, 53,125,233,210, 37, 90,167,211,241,148, 74, - 37, 0,192,222,222,254,105,139,204, 71,106,145,231,221,130, 21, 89, 99,111,182, 96,153, 4, 79, 93, 65,238,124, 62,223, 90,129, - 5, 30,143,135,211,167, 79, 67,161, 80, 64,169, 84,194,207,207,207,100,133,169,213, 42,214, 80,129, 37, 18,137, 96,103,103,135, - 51,103,206, 84, 92,187,118,109, 74, 67, 45, 87,219,215, 44,223,252,233, 39,203,156,242,110, 95, 68, 90,134, 6,121, 89,134,232, -243, 55, 83,126, 69,101,130, 81,224,118,219, 8,194,255,142,213,226,202,207, 89, 26,160,114, 80,253, 20,220,111,160,251,107,227, -102,144, 51,103,206,124, 97,252,248,241,249,111,189,245,214, 28,169, 84,218,142,162,168,130,240,136,136,148,145, 35, 71, 58, 21, - 21, 21,141,135, 21, 49, 73, 60, 30, 79,211,191,127,255,102, 0,160, 84, 42,245,223,124,243,141,200,222,222, 30, 99,198,140,169, -200,204,204,148, 84,181, 71,129,181,214,171,170,193, 38,123,242,228,201, 46,245,180,113,182,141, 77,218, 41, 52, 52,116,199,225, -195,135,145,151,151,135,178,178, 50, 8,133, 66,172, 91,183, 14, 15, 30, 60,248, 34, 62, 62,254,102, 99,233,204, 58,118,236,200, - 94,186,116, 9, 55,110,220,128, 78,167,195,148, 41, 83, 0,128,208,104, 52, 0,208,255, 89,123, 10,210,211,211,177,111,223, 62, -208, 52,141,177, 99,199,162, 69,139, 22,102,129,149,153,153,137,111,190,249, 6, 52, 77, 99,242,228,201,104,222,188, 57,140, 70, -163,164,119,239,222,252,103, 53,163,244,189,247,222, 75,250,225,135, 31, 78, 61,124,248,112,208,154, 53,107,122, 19, 4,193,204, -159, 63,255, 83,149, 74,245, 88,179, 47, 11,138, 74,112, 55, 49, 21, 20, 69,213,186, 53,113,118,180,153, 47, 33,249, 1, 40,138, - 54,115,208,244, 95,124, 78,142,182,241,105, 52,154,242,188,188,188,178,201,147, 39,219,239,216,177,131,240,241,241,193,253,251, -247, 33, 16, 8,160, 84, 42,203,239,222,189,107,107,106,134,244,252,252,124, 31, 30,143, 39, 76, 76, 76,132,167,167, 39,186,117, -235,134, 85,171, 86, 33, 39, 39, 7, 20, 69,193,197,197,133, 49, 26,141, 49, 6,131, 33,242, 89,255,143,106, 90,174, 76, 91,149, -229,138, 4,240, 51,254, 30, 56, 94,175, 21,203,210,130,213, 80,235,213, 83, 20,149, 79,109,102,162,143,143, 79,132, 74,165, 10, -189,115,231, 78, 53, 43,214,155,111,190,105,240,246,246,254,211, 90, 30,149, 74, 85, 32, 18,137,156, 42, 42, 42,112,241,226, 69, -248,249,249, 9,139,138,138, 86,163, 50,233, 53,126,250,233,167,213, 89, 89, 89, 66,119,119,119, 0,128,175,175, 47,138,138,138, - 10,254,129,230,251,155, 22,249, 55, 8,172, 90,205,114, 53, 93,132,117,137, 44, 83, 66,210,250, 44, 45, 90,173,214,108, 17,145, -203,229, 96, 24,166,154, 59,178,166,192,170,101, 22,161,213,127,236,179,103,207, 86,108,223,190,125,132, 89, 12, 89, 1,203, 24, -172,175,215,175, 92,107, 18, 87,215,207,253,134,159,238, 20,229,206, 95,181,126, 99, 67, 27,187,173,179,172,163,171,171,211,255, -214,175,251, 84,149,126,249, 20,142,108, 95,207, 94,143,138,234, 58, 61, 42,106,248,244,233,211, 29, 81, 25,111,149, 14,224, 28, - 42,167,155, 91, 21,240,125,249,242,229,230,166,215, 93,187,118, 53,170, 84, 42, 40, 20, 10,228,228,228, 8, 21, 10,133, 36, 34, - 34,194,230, 88,135,168,168, 40,215, 39,124,175,181,121,229,149, 87, 34,191,255,254,123,121, 97, 97, 33, 82, 82, 82,240,225,135, - 31,226,171,175,190,130, 74,165,194,137, 19, 39,148,161,161,161,255,187,123,247,110, 15, 60,227,228,170, 1, 1, 1,108, 84, 84, - 20, 82, 82, 82, 64, 81, 20, 94,123,237,181,122, 31, 30,254, 97, 11, 22, 59,111,222, 60,236,216,177, 3, 36, 73, 98,220,184,113, - 40, 46, 46, 54,159,119,116,116,172,237, 28, 15,245,207, 40,125,122, 29, 13,159,207, 70, 68, 68,172,233,221,187, 55, 30, 62,124, - 56,168,115,231,206, 95, 78,152, 48, 33,253,113,121, 29,236,148, 8,240,247,130, 78,167,131, 78,167, 67,211,166, 77, 81, 82, 82, -130,164,164, 36,232,116, 58,184,186,216,219,204,215,169, 93,107,232,245,122,232,116, 58,184,184,184,160,172,172, 12,247,239,223, -135, 78,167, 67,147, 38, 14,182,208, 53, 27, 48, 96,192,217, 3, 7, 14, 56,237,223,191, 95, 63,108,216, 48,209,242,229,203, 9, -149, 74,133,172,172, 44, 52, 48,188, 39,226,220,185,115,158, 33, 33, 33,190,113,113,113,136,140,140,132, 94,175, 71,167, 78,157, -144,144,144,128, 23, 94,120, 1,197,197,197,151,175, 92,185,210, 40,102,185,212, 20, 86,209,209,209,135,133, 66, 33, 11,160,161, -214, 38, 0, 64, 90, 90,154,184,125,251,246, 58,177, 88, 44,186,112,225,194,129,199,176, 94, 61,249,167,159,199,159,153,248, 72, -180,110,221,122,158,135,135, 71, 72, 96, 96, 32,226,226,226,132, 98,177, 24,111,189,245,150, 97,240,224,193, 6, 62,159,111,245, -132, 27,137, 68,114, 91,169, 84,190,164,211,233,160,215,235, 17, 30, 30, 14, 71, 71,199, 15, 67, 67, 67,231,106, 52, 26,100,100, -100,136,196, 98,177,217, 74, 30, 28, 28,140,252,252,252,219,255, 64,243,213,170, 69,158,119,129, 85,171, 24,178,180, 96,213,229, - 30,180, 86, 96,145, 36, 9,189, 94, 15,153, 76,102, 22, 88,150,153,226, 27,194,249, 72,155,111,108,236,133,228,228,228,207, 1, -156,108,200,247,191,219,191, 71,109,199,148, 55,203,184,124, 18,119,175, 71,227,135,184,194,220,249,171,214,207,126,117,196,152, -172,154,130,204,170, 39,143, 38,178,246,174, 46,149,226, 42,239,246, 69, 36,222,136,198,201,203,105, 87,245, 64, 2,128, 79,158, -228, 69, 53,249,214, 27, 19,196, 98,241, 60,211,108,193,228,228,100,140, 29, 59,182, 48, 37, 37,101,198,107,175,189,246,213,175, -191,254,234,224,224,224,128, 51,103,206, 40,155, 53,107,182, 26,192,179,116,103,177, 87,175, 94, 69, 94, 94,229,228,205,158, 61, -123, 54, 42,113, 5, 0, 87,175, 94, 21,134,134,134,254, 14,160,207,237,219,183,193, 48,204,133,152,152,152,158,166,243,117,157, -179, 70,191,149,148,148, 8,148, 74,101,173,131,149, 80, 40, 20, 54,192,226, 96,230, 60,127,254,252,167,159,127,254,249, 15,239, -191,255,126,226, 99,114,214,106,193, 10, 13, 13, 69,133,206,136,180,172, 34, 80, 20,133,114,125,214, 99, 89,176, 66, 67, 67,161, -173,208,227,129, 38, 31, 20, 69,161,180,194,106, 67,137,172, 95,191,126,191, 30, 58,116,200,237,194,133, 11,208,235,245, 76,116, -116,244, 3,215, 14,207, 0, 0, 32, 0, 73, 68, 65, 84,253,169, 83,167,170, 38, 77,154,228, 84, 89,229, 6, 97,211,155,111,190, - 57,226,252,249,243,249,190,190,190,142, 87,174, 92, 65,118,118, 54,140, 70, 35,250,244,233, 3,177, 88,156,186,122,245,106, 33, -172, 8, 45,248, 39, 5,214,237,219,183, 77,194,106,220,147, 18, 66, 38, 11,214,127, 9, 7, 14, 28, 72,255,230,155,111,252,213, -106,245,198,183,222,122, 43,184,105,211,166,164, 72, 36,138,224,243,249,115, 9,130, 72,181,161,237, 38, 56, 56, 56, 36,241,120, - 60, 94,122,122, 58, 18, 19, 19,193,227,241,192,178,172, 72,171,213,194,213,213, 21, 60, 30,207,100, 29,131,135,135, 7,157,144, -144, 48, 1, 28,158,140,192, 50, 97,197,138, 21,216,190,125, 59,222,121,231,157, 58, 63, 87,149, 22,160,230, 64,212, 30, 22,185, - 50, 76,179, 8,195,194,194,170,125,207,228, 10,156, 49, 99, 70,181, 47,255,248,227,143,181,185, 8,171,113, 62, 10,201,201,201, -182, 40, 96, 51,167, 41, 6,107,228,216,113,154,205,159, 46,189,177,251,248,239, 29, 52, 90, 86, 51,127,213,250,247,106,138, 43, -107, 57,253, 92,229,109,213,206,142, 17,159,175,251,212,206,100, 13, 59, 20,147, 89, 4,138,125,199,198,235, 85,111,221, 5, 2, -129,166, 71,143, 30,205, 0,171,221,130, 86,181,231,227,150, 83,167,211,225,210,165, 75, 0,128,137, 19, 39, 22,166,164,164,188, - 4,224, 86, 74, 74,202,237,129, 3, 7, 70,156, 62,125,218,161,234,137, 62,239, 89,150, 19,168,156,209,202,231,243, 77, 49, 13, -196,147,190, 70, 79,162,156, 26,141,230,157,105,211,166,109,215,233,116,252,178,178,178,119,172, 61, 87, 95, 57,191,251,238,187, - 68, 31, 31,159,222,120,116, 42, 6, 6,192,197,199,225,220,184,113, 35, 0,248, 62, 14,231,163, 44, 88,135, 15, 31, 6, 77,211, -240,112,181,131, 78,167,131,101,188,167, 53,156, 53, 45, 88, 71,142, 28, 1,195, 48,104,174,118,132, 78,167,171, 43,246,176, 26, -167,147,147,211,250, 61,123,246,120,220,190,125, 27,233,233,233,216,176, 97, 67,106, 78, 78,206, 96, 62,159, 47,254,242,203, 47, -255, 55,100,200, 16, 87,138,162,116, 13,184,151,116, 6,131, 97, 66,143, 30, 61,246,174, 92,185,242,158,159,159, 95,179, 30, 61, -122, 56,228,231,231,103,199,198,198,166,108,223,190, 93, 65, 81,212, 4, 60,218,245,244,143,253,143, 0, 32, 35, 35,227, 56, 42, -211,215,216, 42,172,234, 45,103, 84, 84,212,145, 42,238,147, 86,114,255, 35,117,127, 2, 51, 19,235, 44,231,196,137, 19,211,240, -247,252,102, 54,149,243,183,223,126, 75, 25, 61,122,244,138,246,237,219,135, 41, 20, 10,196,199,199,155,211, 34,153, 30,208, 9, -130,192,200,145, 35, 49,125,250,116,156, 57,115,102,197,200,145, 35, 83,254,129,246,252,111, 8, 44,154,166, 31,166,164,164,168, -247,236,217,195, 35, 8, 2,251,246,237, 67,205,192, 90,211, 30, 0, 46, 93,186, 68,177, 44,155, 84,215,143,209, 52,253, 48, 58, - 58,218,245,219,111,191, 21, 72,165, 82,136,197, 98,100,100,100,128, 97, 24, 38, 43, 43,139, 60,112,224, 64,181, 96,221,139, 23, - 47, 82, 6,131,225,193,179,106,156, 63,227, 82,231,158, 62,241,131,243, 11,221, 95, 42, 84, 57, 58,214, 42, 84,190,219,232, 7, -194,191,110, 43,150, 92,169,250,244,243,117,159,218,155,196,213,225,152,204,194, 10, 29, 29,124, 39, 87,123,253, 73,151,249,194, -133, 11,205, 27,233,189,182,180,119,239,222, 12, 0,103, 0,139, 81,105,185, 3,128, 91,247,239,223,239,238,227,227,243, 62, 42, - 23,190, 94,250, 44,173, 87, 12,195, 88, 90, 78, 27,109,144,101, 76, 76,204, 61, 0,125,109, 61, 87, 31, 70,142, 28,153,140,199, - 95,110,230,169,115,154,144, 95, 88,140,164,251,233, 85, 75,121,209,160, 83, 51, 45,226,167,140,200, 47,182, 45,141, 92, 65, 81, - 9,146,238,167,129, 97,216, 74, 62, 58,221, 28,228, 78, 81, 20,114, 11,235,247,218,243,249,252, 94, 97, 97, 97,131, 73,146, 36, - 47, 93,186,164, 91,183,110,221,195,156,156,156,161, 0, 30, 84,197,240,189,252,227,143, 63,238,183, 34, 37,131, 37, 39, 65, 81, -148,105, 96,142, 51, 26,141, 47, 44, 88,176, 96, 14,128, 94, 0,154, 3,120,128,202,208,130, 77,104, 68, 25,199, 9,130, 24,247, - 60,114, 63, 14,158,151,153,137,135, 15, 31, 94, 54,125,250,116,126, 80, 80,208,199, 93,187,118, 37,239,223,191,143,236,236,108, -243,195,229,128, 1, 3,224,233,233,201,156, 60,121,114,213,176, 97,195,150,129,195,147, 19, 88,185,185,185, 3,198,141, 27,247, - 27, 73,146, 45, 31,181,184,179,165,117,137, 97,152,148,172,172,172, 58,147,144,229,230,230, 14, 88,186,116,233,111,124, 62,191, -165,197, 98,206,186,188,188,188, 25, 35, 71,142,220, 34, 16, 8,196,150,214, 46,134, 97, 82, 53, 26,205, 63, 26, 80, 92, 51, 15, -214,192, 33,175,231, 62, 46,167, 92, 4,175,135,151, 78, 32,241,198, 85, 28,142,201, 44, 40,209,211, 47, 39,228,150,255,215,148, -127, 54,128, 25,143, 56,151, 8,224,157, 70, 80, 70,162, 42,230,143,224,186,134,198, 15,138,162,210, 66,250,188,140,154,105, 25, -106, 30,211, 52,157,102, 45, 95,223,224,222,143,228, 49,189,174,143,143,199,227,189, 31, 20, 20,196,123,255,253,247,179, 78,157, - 58,245,123, 65, 65,193,123, 0,202, 45, 44,140,241,168, 59,153,104,109,156,206, 20, 69, 89,174,129,168, 67,229, 10, 15,107,185, - 59,161, 81,226,185,152,153,184,117,235,214, 37,243,231,207,223,221,180,105,211,125,189,122,245,242,245,246,246, 86, 41,149, 74, - 20, 23, 23,151,228,231,231,223, 61,113,226,196,216,241,227,199,223,227, 46,103,227, 68,251,231,141,115, 68, 95,176,108,156, 31, -203,198,249,177, 35,250,130,181,230,184, 62,206, 54,174,242,222,221,154,171,174,118,104,170,188,226,235, 34,247,255, 47,181, 39, -199,201,113,254, 7, 57,155,139, 68,162,159,248,124,126,175, 39,200,233, 44, 18,137,154,112,215,136,227,124,154,156, 35, 70,140, -224,141, 24, 49,130,247, 12,203,249, 72,176, 44,219,149,101,217, 33, 85,123,211,235, 16,211,123,141, 81, 0,241,193,161, 26,142, -254, 14,162,166,203,175,190,227,250, 16,159, 85, 22, 97,235, 19, 43, 7, 14, 28,158, 91, 60,208,235,245, 67,159, 48,103,174, 94, -175,231, 90,150,195,211, 29,255,142, 30,165, 27,113,241,154, 16, 4,241, 11,203,178,161, 0, 96,122,109,249, 94, 99, 3,201,221, - 82, 28, 56,112,224,192,129, 3, 7, 14, 79, 22, 4, 30,109,230,179, 37, 70,168, 33,166,194,155, 28, 39,199,201,113,114,156, 28, - 39,199,201,113,254,231, 56,235,227,254,219,247, 89,150, 29, 82,151, 5,139, 32,136, 19,255, 53, 1,199,249,188, 57, 78,142,147, -227,228, 56, 57, 78,142,147,227,124, 44,176, 44, 59,164,114,199, 14,177,124,109,177,111,116,224, 98,176, 56,112,224,192,129, 3, - 7, 14,141, 29,218,143, 62,250,232, 99,130, 32,126, 1,128,143, 62,250,232,227,198, 94, 96, 78, 96,113,224,192,129,131, 5,212, -106,245, 43, 0,150,161, 50,132, 98,181, 70,163, 57,194,181, 10,135,127, 19,156,157,157,229, 78, 78, 78,191,147, 36,233, 9, 84, - 79,185, 84,219,250,191, 12,195,104,242,243,243,251,103,101,101,229,254,147,156, 53,112, 97,245,234,213,229,171, 87,175, 54, 5, -180,231, 0, 32,170, 92,134, 57,255, 10,129,181,160, 95,139, 23,155,186,187, 31, 40,204,203,139,209,149,151, 76, 90,253, 71, 70, -126, 3,127,219, 73, 36, 18,141,150,203,229, 33, 44,203,122,241,120,188, 59, 69, 69, 69,225, 70,163,241, 16,128, 82,238, 47,192, -225, 89, 35, 32, 32,160,131, 72, 36,250,144, 32,136,238, 20, 69,121, 8, 4,130, 12, 0,151,117, 58,221,186,216,216,216, 24,174, -133,254, 53, 32,213,106,245, 23,246,246,246, 65,133,133,133, 99, 1,124, 28, 31, 31,223,145, 36, 73,248,251,251,127,172, 86,171, -147,148, 74,229,206,146,146,146, 11, 26,141,102, 46, 26,184,172, 15,135,198, 5, 47, 47,175,104,146, 36, 61, 44,151,107,171, 41, - 8,106,238, 89,150,189,119,251,246,237, 30,143,226,116,119,119,247, 82,169, 84, 91, 0,116,173, 77, 84, 88,162, 42,191,218,149, -226,226,226, 25,233,233,233,181, 38,226,117,112,112, 80,186,184,184, 44, 35, 8, 98, 36, 73,146,245,166, 79, 96, 24,134,102, 89, -246,187,236,236,236,165, 5, 5, 5, 37,143, 28,124,157,156,194, 35, 35, 35,187, 58, 59, 59,215,155,243,143,162, 40,164,165,165, - 53, 9, 13, 13,141,204,202,202,242,251, 39, 57, 45, 65, 16,132, 30,149,107, 55, 62, 55,176, 89, 96, 17, 52,222,154, 52,101,156, -123,225,195,120,247, 61,135, 78,183,249,184, 63,255,229, 85,103, 30,100,218,194, 33,145, 72, 70,123,123,123,111,218,180,105,147, - 83,203,150, 45, 9,169, 84, 10,141, 70,227,119,237,218,181,215,195,194,194,150,166,165,165, 77,160, 40,234,183,199,172,155,189, -163,130,255, 97,126, 41,181,144,235, 74, 56,216,130, 17, 35, 70,240, 30, 62,124, 24,166, 82,169, 62, 88,176, 96,129,184, 85,171, - 86, 80, 40, 20,200,206,206,110,158,144,144,208,108,203,150, 45,175,188,240,194, 11, 95, 10,133,194, 69, 17, 17, 17, 20,215, 98, -207, 55,212,106,245, 23,145,145,145,179,154, 54,109,138,158, 61,123, 94,232,212,169,147, 74, 38,147,225,212,169, 83,240,242,242, -106,103,103,103,119,121,219,182,109,130,101,203,150, 5, 28, 59,118, 12, 26,141,102, 54,215,106,255, 2, 85, 77,146, 30, 49, 49, - 49, 46, 50,153, 12, 52, 77, 87,173, 6,192,128,101, 89,243,222, 82, 12,209, 52,141,224,224, 96, 67, 61, 99,219, 87, 55,110,220, - 8, 49,173,112, 98, 33,164,106, 69, 70, 70, 70, 72,112,112,240, 87, 0,106, 77,168,237,226,226,178,108,212,168, 81,243,218,181, -107,103, 94,106,142, 97, 24,243, 62, 55, 55, 23, 51,103,206, 52,255, 6,195, 48,136,140,140,156,243,238,187,239,162,160,160,224, -221, 58,234,238,233,236,236, 76,212,183, 4, 94, 88, 88, 24,194,194,194,176,105,211, 38,130,207,231,219,215,211,158, 79,156,243, -121,135,237, 2, 11,236,201,147, 71,143, 76, 10,237,237, 75,140, 31, 26,232,179,255,120,244,197, 5,125, 91,190,180,230,247,251, - 15,173, 20, 87,115,166, 77,155,246,233,242,229,203, 37,119,239,222, 69, 92, 92, 28, 40,138,130, 66,161, 64,135, 14, 29,200,147, - 39, 79,170,231,204,153,115,244,207, 63,255,156,104, 48, 24,142, 53,180, 98,110, 14,188,117,114, 41,111, 76,169,150,189,108,160, -233,227,141,177,241,187,117,235,118,198,104, 52,174,137,141,141, 61,251,188,220, 48,129,129,129, 61,133, 66,225, 82,145, 72, 52, -240,223, 42, 46, 82, 83, 83,151,190,248,226,139, 31,132,133,133,137,239,223,191,143,248,248,120,104, 52, 26,180,108,217, 18, 45, - 91,182, 36, 54,109,218, 36,249,242,203, 47,103, 95,187,118,141, 4, 48,223,150, 62,221,205,205,109,114,223,190,125,135, 59, 59, - 59,219,165,167,167, 23,157, 63,127,254, 39,141, 70,243, 53,234, 95, 51,242,145,156,206,206,206,227, 67, 67, 67,135, 59, 58, 58, - 58,106, 52,154,252,223,127,255,253,167,236,236,236,157,143,105,105, 81, 3,232, 8,192,169,234, 88,211,162, 69,139, 91, 41, 41, - 41,217, 79,144, 51,163, 69,139, 22,113, 13,225,116,118,118,150,243,249,252, 35, 4, 65, 52,173,195, 66,144, 65, 81,212,168,220, -220,220,178,186,184, 84, 42, 85,119,181, 90,141,203,151, 47, 99,241,226,197,142,193,193,193, 72, 72, 72, 0, 73,146,248,224,131, - 15, 8,127,127,127, 65,102,102, 38,186,116,233,130,240,240,240, 30, 85,203,221,112,176, 14,223, 1,176, 7,240, 38, 0, 75, 87, -144, 51,128, 31, 81,185,194,195,176,103, 85, 56,169, 84,138,131, 7, 15, 66, 32, 16, 64, 40, 20,162,160,160, 0,238,238,238, 16, - 10,133, 16, 8, 4,230, 77, 40, 20,162, 89,179,102,245,242, 49, 12,211,141,199,227,161,180,180, 20, 52, 77,155,151, 89, 42, 42, - 42, 2,203,178, 16,137, 68,230,247, 77,231, 24,134,233, 86,135,213,102,100,211,166, 77,113,232,208, 33,212,150, 7, 77,165, 82, -225,230,205,191, 38,220,241,120, 60, 4, 4, 4,144, 4, 65,140, 4,240,110, 29,188, 44, 0, 76,153, 50,165,218,242,116, 53, 55, -211,218,193, 44,203, 90, 46, 33,246,143,113,254,171, 5,214, 71,125, 90,206,104, 23, 24,176, 78, 36, 18, 72, 25,218, 8,134, 50, -130, 49,234,193, 48, 20,238,165,106,224,229, 34,194,196, 65,222,158,123,207, 36,220, 92,216,175,117,208,234,223, 18,227,107, 80, -212,156,106,217,162, 93,187,118,203, 86,174, 92, 41,249,253,247,223,113,247,238, 93,172, 90,181, 10, 0, 32,151,203,113,234,212, - 41,208, 52,141,245,235,215, 43, 7, 14, 28,184, 37, 35, 35, 35, 2, 64,126, 61,156,181,193,179,117, 43,245,208, 99,159,189, 36, -110,247,250,209,141,153,249,244, 9, 0,117, 37, 80,123, 26,203,214,212,203, 73, 81, 84, 63,129, 64,208,163, 83,167, 78,175, 88, - 41,178,158, 73, 57, 45,197,149, 64, 32, 56,109, 48, 24,100, 34,145,136, 95,135, 40,120,166,229,124, 28,206,128,128,128, 14, 42, -149,234,131,165, 75,151,138, 47, 93,186,132,130,130, 2,100,103,103, 99,238,220,185,216,186,117, 43,218,181,107, 7,185, 92,142, -217,179,103, 75,102,206,156, 57,163, 75,151, 46,223, 69, 71, 71, 71, 91, 81, 78,178,119,239,222, 7,247,237,219,215,146,162, 40, - 18, 0,140, 70,163, 67,106,106,234,184,133, 11, 23,246,142,137,137,121,179, 1,237, 73,246,232,209, 99,223,254,253,251,189, 69, - 34, 17, 89,213, 89, 55,121,251,237,183, 39, 45, 90,180, 40,248,234,213,171, 99,234,184,239,235,106,207, 78, 50,153,172,237,140, - 25, 51,114,135, 14, 29,154, 14, 0, 87,175, 94, 37, 98, 99, 99,123,142, 27, 55, 46, 37, 44, 44, 44,182, 1,156,157,101, 50,153, -239,172, 89,179,114, 6, 15, 30,156, 33, 20, 10,153, 75,151, 46,241,110,222,188,217,107,242,228,201,201,139, 22, 45,186,110, 11, -167, 64, 32, 56,124,236,216,177,222,238,238,238, 52, 80,185,154, 2, 65, 16, 44, 65, 16, 44, 73,146, 44, 73,146, 72, 78, 78,110, - 49, 98,196,136, 3, 0, 94,173,139,179,176,176,112, 92,175, 94,189, 34, 23, 47, 94,236, 8, 0,145,145,145,224,243,249,230, 1, -225,238,221,187,208,233,116,216,180,105,147,161,164,164,100,242,191,237,158,127,202,156,205, 0,116, 3,240, 7,128, 62, 85, 34, -203, 25,192, 89, 0,254, 0,206, 63,171,114,146, 36, 9,154,166,205, 34,234,183,223,126,195,214,173, 91,113,232,208, 33,184,187, -187, 87, 19, 88, 2,129, 0,143,112,249,221,172, 33, 50, 76,125, 59,104,154, 70, 84, 84, 20,118,238,220, 9, 23, 23, 23, 56, 59, - 57,193,185, 73, 19, 4, 5, 5,193,100, 53,163,105,186, 54,222,106,156,185,185,185, 96, 24,235,158,149, 88,150, 69,113,113,177, -213,237, 89,151, 16,178,220,108,185, 70,143,201,249,223, 17, 88,106, 55,231, 69, 35,134,247,147,130,166, 0, 67, 25, 96, 40, 7, -107, 40, 7,171, 47, 3, 33,146,130, 53, 86, 64,206,203,195, 59,125, 93, 85, 71, 47,102,221, 94, 16,220,124,200,154,179, 15, 78, -215,241,164,184,100,251,246,237,118, 55,110,220, 64,124,124, 60, 54,108,216,128,229,203,151,155,159, 28, 94,125,245, 85, 92,184, -112, 1,122,189, 30,139, 23, 47,118, 92,176, 96,193,172,146,146, 18,155, 23,153,116,115,226,111, 61,178,119,147,163,163, 52, 23, - 19,135, 94,113,250,234, 72,202,140,162, 50,227,151,141,241, 2, 44, 88,176, 64,182,118,237,218,159,109, 16, 89,207,204,114, 37, - 22,139, 79, 47, 89,178, 68,190,100,201, 18,250, 9,113,182,227,243,249,135,141, 70,227,251,177,177,177,191, 54,128,162,121,215, -174, 93, 87,197,199,199,159, 46, 41, 41,217, 95,243,164, 80, 40,124,181,115,231,206, 99, 47, 94,188,248, 49,128, 36,107, 8,197, - 98,241,156, 15, 62,248, 64,146,150,150,134,194,194, 66,136,197,226,106,157,155, 88, 44, 6, 73,146, 16,137, 68,120,251,237,183, - 37,187,118,237,122, 15,192, 27,245,222,147,110,110,147,247,238,221,219,210, 96, 48,144,101,101,101, 16, 10,133, 16, 10,133,232, -208,161, 3,111,254,252,249,205,230,205,155, 55, 45, 43, 43,107,179, 45,149,119,112,112, 24,183,111,223, 62,111,145, 72, 68,106, - 52, 26,244,236,217, 19,151, 47, 95, 70, 80, 80, 16,111,254,252,249,205,103,207,158, 61, 53, 39, 39,103,171,173, 86, 38,153, 76, -214, 46, 50, 50,242, 97,211,166,127, 25,135, 90,182,108,201, 14, 26, 52, 40, 63, 62, 62,222,247,234,213,171,121,157, 59,119,126, -104, 3,167,187, 76, 38,243,251,245,215, 95, 53,203,151, 47,239,187,117,235,214,161, 85, 22,220,227,171, 86,173,250, 61, 47, 47, -207,255,242,229,203,121, 65, 65, 65,233, 54,112, 58,185,185,185, 81, 51,102,204, 80,214, 60,177,116,233, 82, 44, 91,182, 12,187, -119,239,206, 3,224, 82,103,101,171, 2,218,219,181,107,167,234,211,167, 15, 34, 35, 35, 49,123,246,108,157,209,104, 76, 0,128, -144,144,144, 54, 97, 97, 97,162,152,152, 24, 56, 56, 56, 8, 52, 26,205, 55,106,181,154, 11,124,183, 30, 67, 1,252, 15, 64,187, - 42,145, 53, 10,192, 81, 0,109, 1,196, 3, 24,241, 44, 11,103, 18, 88,233,233,233,216,181,107, 23, 86,173, 90, 5, 31, 31, 31, - 24, 12, 6,240,249,124,179,184,226,243,249, 32, 8, 2, 44,203, 18,214,242, 94,185,114, 5,123,247,238,197,226, 69,139,160, 84, - 86,222,166, 6,131, 1,249, 5, 5,144, 72, 36,102, 17, 86,143, 96,250, 46, 49, 49,113,158,187,187,187,217, 77,105,233, 34, 4, - 0,133, 66, 1,134, 97, 64, 81, 20,116, 58, 29,118,236,216, 65,177, 44,251, 93, 61,214, 38,179, 24,122,247,221,119,161,211,253, -181, 62,120,199,142, 29, 43,173, 33, 45, 90, 32, 32, 32,192,124,108,178, 80, 89,195,185,179,103, 7,104, 45, 62,237, 27,246, 25, - 0,192,195,195, 3,190,190,190, 80,171,213, 86,113,254, 91, 4,150,105,129,219,106, 11,221,102,102,102,175,217,189,237,155,207, - 68, 2, 82, 16,210,195, 23, 14, 98, 10,132,204, 17,194,222, 31,129,176,247,172,252, 98,126, 50,244,191,126,132, 81, 1,185,228, - 94, 29,239,199,176,129, 94, 77,194, 78, 39,215, 26, 92, 71,146,100,247,230,205,155, 35, 50, 50, 18, 45, 91,182,196,146, 37, 75, -224,231,231, 7,153, 76,134,172,172, 44,148,149,149, 65, 46,151,131,166,105, 4, 6, 6,242,148, 74,101,112, 3, 4, 86,224,224, - 62,157,187,241, 85,126,232, 57,240, 5,156,217,210, 91,190,251,151,140,133, 69,101,198,111, 96,177,224,106, 99,193,107,175,189, -134,172,172, 44,217,190,125,251, 26, 44,178,186,117,235,118,134,162,168,126, 86,152,195,207,158, 59,119,174, 79, 67,197,213,174, - 93,187,228,246,246,246,168, 47,120,211, 6,113,117,110,220,184,113,170,125,251,246,253,208,169, 83,167,215,109, 20, 89,205, 71, -141, 26,117, 98,231,206,157,126, 67,134, 12, 81, 68, 70, 70,254, 77, 96,181,107,215,238,181, 51,103,206,188, 62,125,250,244,118, -251,247,239,127, 5,149,139, 74,215,103,230,238,209,170, 85, 43, 60,120,240, 0, 89, 89, 89,208,233,116,200,202,202, 2, 0,164, -165,165,193,195,195, 3, 14, 14, 14,240,240,240, 64,155, 54,109, 8,146, 36,131,172, 41,108,112,112,240, 80, 0,100,114,114, 50, -114,114,114, 96,103,103, 7,185, 92, 14,119,119,119,244,233,211,135,239,237,237, 61,216, 86,129, 53,104,208,160,225, 50,153,140, - 76, 77, 77, 69, 74, 74, 10,116, 58, 29, 18, 18, 18, 96,103,103,135,144,144, 16,129,183,183,119,104, 3, 4, 86,251,169, 83,167, -102, 91,138, 43, 19,228,114, 57,225,235,235,155,111,111,111,223, 5,128, 45, 2,171,253,236,217,179,179, 86,175, 94,253, 82,120, -120,248, 2,211,155,225,225,225, 31, 2,192,230,205,155, 35, 29, 29, 29,187, 0,176, 69, 96,129,101, 89,102,210,164, 73,137, 34, -145, 8,166,205, 36, 92, 63,251,236, 51,144, 36,105,103, 5,205,199,241,241,241, 29, 21, 10, 5,226,227,227,193,227,241, 64, 16, - 68,162, 70,163,233, 8, 0, 46, 46, 46, 73, 21, 21, 21, 94, 21, 21, 21, 24, 49, 98, 4, 49,100,200,144, 14, 27, 54,108, 88, 4, -160,177, 8,172,174, 0,214, 3,208, 3, 88, 4,224,114, 35,235,226,178, 0,188,108, 33,178, 98, 1,136,171,196,213,203, 85,231, -159, 9, 8,130, 0,195, 48,224,243,249,248,236,179,207, 96, 48, 24,176,127,255,126, 28, 61,122, 20, 36, 73,130, 32, 8, 16, 4, - 1,149, 74,133, 47,190,248,194,124,108, 13, 40,138,194,183,223,126,139,143, 22, 44, 48,139,171,170,135, 62,184,185,186,194,201, -217, 25,201,201,201,245, 10,172,236,236,236,165, 81, 81, 81,168, 43,200,125,216,176,191, 60,172,150, 65,238,214,148,147,199,227, - 65,167,211,161, 95,191,191,134,143, 89,179,102,153, 95, 23, 20, 20,152,254, 19, 32,172,172, 60,143,199,131,150, 5, 94,147,252, -245,222,224,247,223,175,102,145,171,131,179, 86, 45,242,175,180, 96,137,122,165,110,190,127,129, 12, 24, 25,250,194,120, 71,149, - 20, 76, 73, 6,132,125,195,112, 35, 95,134,141,219, 42,199,194,121, 35, 2,209,190,223, 74,232,190,233,143, 62, 45,244,162,111, - 98,164,243, 1, 44,169,141,207,217,217,217,153,162, 40,144, 36, 9,185, 92, 14, 71, 71, 71, 72,165, 82,228,230,230, 98,206,156, - 57, 56,125,250, 52,244,122, 61,132, 66, 33, 90,181,106, 5,131,193,224,101,179,245,202,129,191,115,195,103,171,236,243,146, 15, -224,234,221, 66,200,236, 60,176,104,106, 23,135,176, 45,209, 75,115, 10,202, 63,108,140, 23,193,223,223, 31,115,231,206,149,125, -249,229,151, 13, 18, 89, 20, 69,173,224,243,249, 61,223,127,255,125,233,136, 17,127,127, 32,140,139,139,195,180,105,211,180,229, -229,229,159, 52, 68, 92,137, 68,162,211, 59,119,238,148,219,217,217,225,193,131, 7, 79, 76, 92,109,218,180, 73,229,229,229, 5, -129, 64, 32,249,246,219,111,109, 17, 89,109,134, 13, 27,118,114,231,206,157,158, 83,167, 78, 77,139,140,140, 76, 65,229,180,250, -106,136,137,137, 41, 24, 63,126,124,234,238,221,187,189, 25,134,249,245,224,193,131,161, 0,110,215,211,150,205,101, 50, 25,114, -115,115, 49,111,222,188,106, 1,170, 38,119, 54, 0,196,199,199,195,195,195, 3, 21, 21, 21,238,214,212,217,209,209,209,129,101, - 89, 76,153, 50, 5, 15, 31,254,165, 77,220,221,221,241,240,225, 67, 80, 20,229,104,107, 59, 58, 56, 56, 56, 26,141, 70,244,238, -221, 27, 21, 21, 21, 0,128, 81,163, 70, 65, 32, 16, 32, 59, 59, 27, 6,131,193,169, 1,151,199,121,200,144, 33, 25,143, 58, 41, -151,203,141, 14, 14, 14, 45,108,228,116, 10, 13, 13, 77,223,190,125,123, 77, 87, 29,162,162,162, 94,181,179,179, 11,119,116,116, -244,109, 64, 89, 25,177, 88, 12,177, 88, 12,129, 64, 0,145, 72, 4,177, 88, 12,145, 72, 4,129, 64, 0, 30,143,103,149, 95,133, - 97, 24,156, 56,113, 2, 36, 73, 86,115, 93, 44, 94,188,248, 29,153, 76,230, 26, 17, 17, 97,126, 0, 44, 45, 45, 69,235,214,173, - 91,181,106,213,234, 90,102,102,102,202,237,219,183, 95,127,198,221,199, 58, 0,166, 89,109, 91, 1, 4, 52,194, 46, 46, 11,192, - 72, 0,209, 85,226, 74, 15, 96,248,179, 20, 87,150,215,158,207,231,155,255,231, 18,137, 4,129,129,129,102, 49, 69, 16, 4,202, -203,203,205, 46, 66,107, 45, 88, 69, 69, 69, 80,171,213, 80, 42,149,104,237,227,131,196,132, 4, 0, 48,191, 22,137, 68,102, 33, - 86, 23, 10, 10, 10, 74,170,130,213,223,125,194,226,146, 5, 0, 62,191,238, 48,108,181, 90, 13,134, 97, 76,194,146,125, 18,156, -206,206,206, 40, 45, 45,181,138,243,223, 34,176,254,166, 24,195,194, 64,234, 46,180,220, 53,114,112,183,241,109, 61,228,208,229, - 38, 67,164,112, 2, 97,223, 2, 27,183,253,138,219, 41,149,161, 81, 27,143,198, 96,247,194, 1, 32,100,142, 80,107,239, 66, 41, - 17,191,254, 40,129,149,151,151, 87,106, 48, 24, 28,165, 82, 41,248,124, 62,132, 66, 33,114,115,115,241,127,255,247,127, 56,114, -228, 8, 90,180,104, 1,138,162, 32, 18,137,144,147,147, 3,161, 80,104,211,236, 68, 30, 15, 67,102,140,239,215, 82,238,228,131, -188,152,229,149,111,170, 2, 49,117, 20, 79,244,249,222, 91,227,114, 10,202, 63, 71,101, 80,101,163,130, 66,161, 64, 64, 64, 0, -198,140, 25, 35,219,191,127,255, 30, 0, 30,182,124, 63, 38, 38,230,124, 96, 96, 96,255,245,235,215,159,209,104, 52,210, 78,157, - 58, 65,161, 80, 64,161, 80, 32, 57, 57, 25,203,151, 47,175,208,233,116,161, 13,177,142,241,249,252,111, 39, 77,154, 36, 87,169, - 84, 72, 78, 78,134,163,163,227, 99,213, 53, 48, 48,176,157, 64, 32, 56,183,105,211, 38,149,183,183, 55,238,220,185,131,206,157, - 59,195,205,205, 77,178,122,245,106,107, 69,214, 87, 7, 14, 28,104, 33, 18,137,136,131, 7, 15, 54, 63,120,240,224,156,250,126, -119,239,222,189, 45, 14, 30, 60,184, 9, 64, 8,234, 8,254, 22, 10,133,105, 57, 57, 57,222,205,154, 53,195,174, 93,187, 64,146, - 36, 50, 50, 50,176,104,209, 34,172, 94,189, 26, 65, 65, 65, 80, 42,149,104,214,172, 25, 18, 19, 19, 33,145, 72,172,138,120, 78, - 79, 79,207, 7,224,114,250,244,105,228,228,252,149,178,197,211,211, 19,249,249,249,208,233,116,121,182,182,101,122,122,122, 30, - 0,215,107,215,174, 33, 37, 37, 5, 3, 7, 14,196,143, 63,254,136, 46, 93,186,128,166,105, 24,141,198,188, 6, 92, 34,154,199, -227,177,117,116,162, 4, 0, 7, 27, 57,169,186, 56,171,250, 29, 91, 57,193,178, 44,251, 40,113, 37, 18,137, 80,207,111,154,117, -179,159,159,223,178, 86,173, 90,181, 93,180,104,145,128,207,231,163, 87,175, 94,109,134, 15, 31,158, 74,146,164,211, 71, 31,125, - 36,171,205, 24, 12,160, 99,219,182,109,229,141,160,251,176,180,210, 53,214, 73, 39, 46, 85, 22, 63, 17, 0, 67,213,254, 16,254, -138,201,122,166, 22, 44,161, 80,136,176,176, 48, 76,159, 62, 29,174,174,174, 88,176, 96, 1,248,124,190,121, 51, 89,101, 76, 86, - 45, 43,239, 77,184,186,184,212,253, 71,171, 10,114,175,231, 33,234,169,164,105, 48,137, 33,107, 98,161, 44,172, 77, 86,137,182, -199,228,252,215, 88,175, 44, 5, 86, 53,179,156, 89, 92, 13,236, 60,222,207, 67,138,216,152,155,104,239,102, 4, 43, 16,212,113, -183, 24, 65, 8,229,176,151,242, 61,234,184, 0, 49, 41, 41, 41,158,246,246,246, 48, 24, 12, 16,137, 68,104,223,190, 61, 46, 94, -188, 8,157, 78, 7,189, 94, 15,177, 88, 12,161, 80,136, 91,183,110,193, 96, 48, 68,218,162,175,156, 85,188, 77, 31,126,188, 92, -137,244, 93,176, 87,138, 16,220,221, 27,144,183, 5,175,236, 46,214, 47, 14,117,124,103,209,143, 27,179,114,139,223,104,108, 23, - 65,161, 80, 32, 53, 53, 21, 7, 15, 30, 44,215,233,116,227, 26,194, 97, 18, 89, 71,142, 28, 57, 99,111,111, 47, 13, 10, 10, 66, - 66, 66, 2, 62,249,228,147, 10,157, 78, 55,164,161,241, 93, 20, 69, 77,216,177, 99,199,105,138,162,228, 38,113,241,184,150,171, - 57,115,230, 40, 91,183,110,141,164,164, 36,216,217,217, 65,169, 84,162,101,203,150, 80,171,213,146, 57,115,230, 88, 35,178,102, -142, 25, 51,230,228,238,221,187, 61,167, 78,157,154,118,232,208,161,227, 0,138,106,107,218, 97,195,134,189,186,123,247,110,207, -119,222,121,231, 1,128, 57,168,103,102, 29,195, 48, 23,146,146,146,188,252,252,252,136, 54,109,218, 64, 36, 18,193,221,189,210, - 72,213,177, 99, 71,248,249,249, 65, 40, 20, 2, 0,146,146,146, 0, 43,243,178,252,249,231,159, 63,197,199,199, 79,238,210,165, - 11,207,205,205,173,218,236,164,213,171, 87, 27, 82, 83, 83,109, 94, 71,235,143, 63,254,248,241,230,205,155, 83,122,245,234,197, -119,112,112,128, 88, 44, 70,251,246,237,161, 86,171,241,201, 39,159, 24,238,223,191,223,144,181,185, 30, 92,187,118, 77,226,227, -227, 67, 63,226, 94, 85, 54,192,242,144,118,245,234, 85, 97,247,238,221,143,159, 58,117,170,157,229,137,110,221,186, 29, 87, 40, - 20,118, 0, 26, 50, 53,143,177,116, 13, 90,186, 10, 69, 34, 17,248,124,126,189, 22, 44,141, 70,243,179,171,171,235, 61, 87, 87, -215,243, 61,122,244,176,139,142,142,198,146, 37, 75,132, 58,157,174,121,120,120,184,121, 32,174,109, 0, 45, 43, 43,147, 52,130, -238, 99, 30,128, 13, 0,100, 0, 22, 52,194, 49,198, 21,149, 1,237,190,168,116, 11,142,170, 18, 91,166,152,172,103, 42,178, 24, -134,129, 64, 32,128,175,175, 47,222,125,247, 93,172, 89,179, 6, 51,102,204, 64,235,214,173,205,215,222, 20,131, 85, 53,227,205, -170,129, 95, 40, 20,194,213,205, 13, 70,163,209,108,189, 2,128,196,132, 4,240,249,124, 48, 12, 3,157, 78, 87,175,139,208,197, -197,101,217,218,181,107,231, 12, 26, 52,136,180,156,113,199,178,172, 57,157,132,229,102, 52, 26,241,243,207, 63,207, 89,189,122, -117,157,105, 26, 44,133, 78,199,142, 29,171,185, 5, 55,111,222,108,217,103, 35, 36, 36,196,166,217,126, 60, 30, 15,190, 97,159, - 85,115, 11,158,108,242, 87,179, 53,123,123, 42, 90,127,178,233, 81,156,255, 42, 23, 97,173, 53, 52, 92,244, 92, 57, 98, 64,192, -120, 63,119, 49,174,197,220,194, 47, 81,154,187,185,185,133, 96,178,110,130,201,185,131,121, 35, 2,209,182,133, 35,218,182,112, -196,188, 17,129, 96,178,111,129, 45, 72, 6, 43,113, 64,118, 25,241, 72,247, 66,126,126,254,186, 21, 43, 86, 20, 56, 56, 56, 64, - 34,145, 64, 36, 18, 33, 45, 45, 13,254,254,254,230,227,170, 39, 79, 44, 89,178, 36, 39, 39, 39,103,155,181, 21,145, 75,201,169, -107, 22,189,225, 42, 20, 43,129,252, 72,168, 84, 10,236,218,246, 25,160,203, 0, 72, 17, 94, 9, 9,224,169, 93,237,251, 0,104, -211,216, 46,194,131, 7, 15, 16, 22, 22, 86,174,213,106, 31, 43,208, 61, 38, 38,230,188,193, 96,232,191,109,219, 54,237, 47,191, -252,242,216,226,202,196,105, 52, 26, 7,238,217,179,167,236,193,131, 7, 80, 40, 20, 13,174,167, 80, 40,252,136,162, 40,213,134, - 13, 27,152,126,253,250,209, 51,103,206,164, 39, 76,152, 64, 15, 27, 54,140, 14, 9, 9,161,167, 77,155, 70,235,116, 58,177, 76, - 38, 91, 91, 15, 85,252,177, 99,199,130, 39, 79,158,124,231,235,175,191,246,120,233,165,151, 90, 0, 88, 90,115, 11, 12, 12,116, -216,189,123,183,231,244,233,211,147, 14, 30, 60, 56, 0,245,184, 7, 1, 64,167,211,109,222,186,117,107, 5, 73,146, 80, 40, 20, - 16,137, 68,104,210,164,137, 89, 8,155, 6,114,131,193,128, 45, 91,182,104,181, 90,237, 70,107,234,158,151,151,183,107,254,252, -249,247,207,156, 57, 99, 52,205,242,201,200,200,192, 39,159,124, 98,216,182,109, 91,122, 97, 97,225,215,182,182,103,113,113,241, -183, 31,126,248, 97,202,137, 19, 39,140, 36, 73,162,160,160, 0,246,246,246,248,228,147, 79, 12, 95,127,253,117,122, 73, 73,137, -205,156, 47,188,240, 66, 82,122,122,186, 82,167,211,253,205,250, 35, 16, 8, 8,137, 68, 98,154, 17,102, 53,186,116,233,146,148, -146,146,162, 90,185,114,101, 68, 72, 72,200, 26,165, 82,153,160, 84, 42, 19, 66, 66, 66,214,110,217,178,229,108, 21,103,184,205, -157, 23, 73,154, 5,150,201, 85,104,178, 98, 85, 89,178,172,114, 17,250,249,249, 29,216,187,119,175, 93, 66, 66, 2,138,139,139, - 17, 27, 27,139,152,152, 24,179, 43,215, 52,152, 89,110, 0, 80, 94, 94, 46,109, 4,221,199,255, 80,153,250,194,187, 74,200, 52, - 54, 28,181, 16, 87, 47,163,114,230,217,203, 85,199,237, 0,252,244, 44, 45, 88, 44,203,154, 31,118,222,120,227, 13,132,135,135, -163,117,235,214,102, 81,101, 57,139,208, 22,145, 65,211, 52,218,183,111, 15,157, 94, 95, 77,160,243,249,124, 52,105,210, 4, 73, - 73, 73,160, 40,170, 94, 11, 22, 65, 16, 35, 7, 13, 26, 68,198,197,197,193,207,207, 15, 49, 49, 49,136,137,137, 65,108,108, 44, -174, 93,187,134, 27, 55,110,224,214,173, 91,184,125,251, 54, 58,119,238,140,212,212, 84, 12, 24, 48,192,148,166,161, 78, 35,155, - 45,214, 38, 43,173,119, 79,131,243, 95, 97,193, 34, 44,247,174, 14,242, 9,109,213,124, 92,187,118, 27,199,175,230,239, 38, 8, -242, 88,204,125,221, 47, 3, 90,149,192,112,228, 77,180, 31,185, 15,187, 23, 14,168,124, 2,200,190, 5,195,119,111,129,144, 57, - 35,177, 88, 14,173,190,176,174,167,230,168,232,232,232,195,123,247,238,157, 52,126,252,120, 17,195, 48,144, 74,165,120,239,189, -247,204, 57, 66,120, 60, 30,102,204,152, 81,154,157,157,189, 1, 86,206,252, 2, 32,181,147, 11, 22,143,157,178, 68,130,135,219, - 1, 82,136, 92,116, 66,199,151, 38, 33, 59,229, 34, 80,118, 27, 32,132,216,246,233,100,231, 87, 39,124,254,117,102, 78,225,139, -141,229, 2,220,185,115, 7, 75,151, 46,125,108,113, 85,211,146,117,252,248,241, 61, 58,157,110,202, 19,228, 28,184,102,205,154, -211, 46, 46, 46, 13,118,139,184,187,187,191,157,155,155, 59,201, 26,195,153, 53,186,244,200,145, 35, 67, 82, 82, 82, 86,197,199, -199,215, 58,115,245,214,173, 91, 63,246,239,223, 95,102,203, 44,194,216,216,216,152,160,160,160,173, 27, 54,108,152, 49,119,238, - 92,137, 84, 42,133, 74,165, 66,124,124, 60,154, 55,111, 14, 0,208,106,181, 88,184,112,161,214,104, 52,238,142,142,142,190,104, -237,195,242,205,155, 55,199, 78,155, 54,109,114,155, 54,109, 94,101, 24,198, 73,175,215,231,165,166,166,158,168, 18, 66, 13,113, -239, 48,113,113,113, 99,166, 79,159, 62,222,199,199,103,184,193, 96,112,162, 40, 42,239,225,195,135,199,139,139,139,119, 53,132, -243,226,197,139, 57, 19, 38, 76, 72,206,204,204,244, 87,171,213, 69,118,118,118,122,189, 94,207, 83, 40, 20, 74,145, 72,212, 25, -192, 69,130, 32,110,219,194, 25, 29, 29,157, 53,113,226,196, 20,157, 78,215,102,199,142, 29,145,114,185,252,119,130, 32, 8,161, - 80,232, 32,151,203,131, 1, 68, 16, 4,145,104,107, 89, 73,146,100, 44, 5,149,165, 21, 75, 40, 20,130, 32, 8,171, 4, 86, 82, - 82,210,249, 21, 43, 86,116,104,213,170, 21,182,109,219,150,175, 80, 40,148,195,135, 15,231, 23, 21, 21, 17,117, 89,176,180, 90, -173, 4, 28,234,125,182,168,178,242, 14,181,176,124,154, 2,223,143, 2, 40,124,150,133, 99, 89,182,154,144,106,222,188,121, 53, - 81,101,121,206, 22,129, 69, 81, 20,132, 66, 33,248,124, 62,220,212,106,179,152, 99, 89, 22, 9,137,137, 40, 40, 40, 48,167,105, -168,231, 30,231, 17, 4,129,209,163, 71, 91,245,187,111,188,241, 6, 34, 34, 34, 80,159, 59,209,114,198, 95,139, 22, 45,234, 21, - 67, 85,101,177,122, 22,161,135,135, 71, 67, 57,137, 26,251,127,133,192,170,134,140,252,242,149, 59,127,136, 93,152, 81, 76, 29, - 19,247, 72,125, 55, 44, 12,236,194,190, 45,206,120,200, 69,253,219,146,233,208,125,221, 11,132,170,114,176, 97, 75, 51, 64,200, -221, 80, 32,104,142,159, 99, 50, 51, 73, 1,175, 78,235, 67, 97, 97,225,188, 47,190,248,130,119,250,244,233,145,171, 86,173,178, -247,245,245,197,216,177, 99,161,215,235,113,227,198, 13, 76,155, 54, 45, 63, 39, 39,103,123, 97, 97,225, 26,107, 43,225,172,226, -255,223,198,143,251, 59,145, 76, 41, 80,124, 21,224,219,193,217, 81,137,235,209,145, 64, 81, 52, 64, 10, 1, 82,132, 46,157,252, -208,177,157,183, 95,230, 31, 87,122, 1, 56,215, 24, 46,192, 59,239,188,243,196,196,149,165, 32, 2,208,234, 73,150,211, 36,178, -222,127,255,253,211, 12,195,200, 26,244, 40,123,244, 40,141,186,243,145,217,108,252,187,114,229,202,152, 71,157, 52, 24, 12,199, - 47, 94,188,104,115,146, 89,163,209,184, 48, 46, 46, 14,179,102,205,154,254,214, 91,111, 73,125,125,125,225,233,233,137,132,132, - 4,196,199,199, 99,235,214,173, 21, 12,195,236, 42, 44, 44,252,192, 70,106,186,184,184,120,123, 84, 84,212,246, 39,216, 6, 76, - 81, 81,209, 55, 81, 81, 81,223, 60, 41,194, 41, 83,166,220, 76, 72, 72,200,119,119,119, 15,226,241,120, 29, 80,153, 40, 82, 3, -224,155,134, 8, 33, 0,152, 62,125,250,181,164,164,164, 92, 55, 55,183, 32,161, 80,232, 93,197,153, 14, 96, 87, 3, 57,243,174, - 95,191,238,221,173, 91, 55,134,199,227,177, 2,129,128,173, 26, 12, 89, 62,159,207, 18, 4,193,254,250,235,175, 18, 88, 17,115, -153,150,150, 54,103,247,238,221,172, 66,161, 8, 42, 45, 45, 29, 11, 96,143, 86,171,237, 86, 88, 88,104, 30,132,107, 67, 69, 69, -133,152,211, 79,245,226,181, 71,188,159, 5,160, 87, 99, 40,224,138, 21, 43,176,125,251,118,212,151,129,252,248,241,227,245, 14, -252,166,123,197, 20, 95,165,215,235, 17, 23, 23, 7,130, 32,204,199,150, 73, 70,105,154,174, 51,211, 59,195, 48,180, 94,175,199, -225,195,135,173, 18, 89, 7, 15, 30, 68, 69, 69, 5, 24,190,144,179, 28, 0, 0, 2,246, 73, 68, 65, 84,134,177,170,159,173, 74, - 76,138,130,130, 2,115,234,132,192,192, 64,203, 62,212,230,246,228,241,120,240,245,245, 69,110,110, 46,156,157,157, 1, 84,186, - 5,205,226,179,172,236, 63,115,243, 91,173, 18,195,122,123,218, 85,240,201, 31, 2,220,153,151,187,120,138,225,108, 47, 1, 79, - 32, 70,113, 5,129,184,140, 10,156,187, 93,252,144,166,216,208, 85,127,164, 88,155, 32,174,187, 90,173,254,152,166,233,118, 36, - 73,202, 88,150, 45,229,241,120,177, 25, 25, 25,203, 0,220,178,165, 18,118, 10, 50,209, 65,206,179, 19,136, 68, 44, 77, 49, 0, - 72,128, 36, 1,130, 4,192,171,218, 87, 30,107,181, 6, 33,205, 16,199,178,115,243, 38, 63,235,198,127,241,197, 23,207,148,149, -149, 61,119,153,220,165, 82,233, 82, 30,143, 55,240,223,190, 76, 76,151, 46, 93,186, 72,165,210,143, 25,134,233, 90, 81, 81,225, - 38,149, 74,179, 8,130,136, 46, 41, 41,249,244,218,181,107,151,184,177,243,217,225, 73,102,114,175, 9, 83,110, 44,103,103,103, -159,235,215,175, 75, 44, 45, 88,150,131, 97,213,251, 4,119, 53,158, 79,248,249,249, 93, 62,112,224, 64,151,230,205,155,147,166, -128,107,146, 36,205,155,201,141,101,178,182, 92,186,116,137,154, 57,115,230,197,235,215,175,191,244, 40, 78,111,111,239, 51,225, -225,225,253, 44, 45, 84, 38, 33, 85,243, 53, 77,211, 40, 47, 47,199,210,165, 75,127, 75, 74, 74,170,117,169, 28, 95, 95,223, 13, -139, 23, 47,158, 51,120,240, 96,146, 36,201,191,197, 92,213,140,195, 50, 24, 12, 56,118,236, 24,243,237,183,223,110,186,123,247, -238, 35, 99,176, 2, 2, 2, 30,198,198,198,122,152, 82, 38,212,220,106,206,168, 5,128,238,221,187,107,162,162,162,154,254,147, -156,255, 25,129,101,250,252,130, 62,158,163, 8,144, 35, 73,130,105, 15,130, 16, 49, 44,226, 9,224,140, 72,162,223, 18,246,139, - 70, 91,227,243,237,241,228, 51,242,114,156, 28,231,179,224, 36, 97,221,210, 51, 92,123,254, 75, 56,189,189,189, 19, 19, 19, 19, -189, 31,217, 25, 86, 23, 88, 92,123, 62,103,156,206,206,206,242, 38, 77,154,252, 78,146,164,231,163, 22,119,182, 20,215, 12,195, -164,100,101,101,245,205,206,206, 46,127, 20,167,187,187,187,151, 68, 34,249,138, 97,152,110,214, 44,246, 76,146,100, 84, 69, 69, -197,204, 26,139, 61,155, 57,159,224, 44,194,106,229,244,247,247, 79,138,138,138,242,146, 74,165,213,226, 10,107,214,217,132,251, -247,239, 99,248,240,225,169,215,175, 95,111,241,148, 57,255, 85,176,117, 45, 66,118,205, 31,169,135, 1, 28,230,158,127, 56,252, -199,192,112, 77,240,223,130, 86,171, 45,104,210,164, 73,105, 69, 69,133, 64,167,211, 9, 40,138,170, 54,192, 73,165,210, 28,173, - 86,203, 53,212,115,138,220,220,220,178,220,220,220,160, 39,201, 89, 37,148,250, 63, 41,190,167,149, 7,171,160,160, 32,180,107, -215,174,191,242,249,124,113, 77,241, 83,155, 24,162,105,186, 34, 47, 47,111,224, 63,205,249, 95, 19, 88, 28, 56,112,224,240,159, - 64, 70, 70, 70, 80, 61, 2,140,107, 36, 14,207, 37, 52, 26, 77,188, 70,163,241,108,236,156,207, 59, 72,174, 9, 56,112,224,192, -129, 3, 7, 14, 28, 56,129,197,129, 3, 7, 14, 28, 56,112,224,192, 9, 44, 14, 28, 56,112,224,192,129, 3, 7, 78, 96,113,224, -192,129, 3, 7, 14, 28, 56,112,104, 48,254, 31,162, 69, 35,218,144, 32, 45,122, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, +137, 80, 78, 71, 13, 10, 26, 10, 0, 0, + 0, 13, 73, 72, 68, 82, 0, 0, 2, 88, 0, 0, 2,128, 8, 6, 0, 0, 0, 64, 11, 6,158, 0, 0, 0, 9,112, 72, 89,115, 0, + 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, + 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, + 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142, +142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,247,230,205,254,181, +215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64, +129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, + 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, + 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, + 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, + 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96, +200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, + 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, + 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207, +171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102, +178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87, +125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, + 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154, +140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, + 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71, +160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, + 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134, +205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188, +129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, + 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134, +188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, + 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9, +147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, + 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, + 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, + 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43, +200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, + 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, + 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, + 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, + 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84, +169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80, +235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95, +227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, + 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138, +222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167, +157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, + 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, + 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, + 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109, +198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53, +155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188, +110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195, +176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125, +186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150, +233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75, +130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, + 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, + 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, + 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167, +128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, + 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, + 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68, +222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73, +108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194, +244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, + 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229, +185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77, +147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, + 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156, +239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43, +134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107, +235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, + 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14, +150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, + 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, + 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150, +251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14, +199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140, +123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222, +122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249, +220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242, +178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122, +189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, + 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216, +239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, + 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206, +209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251, +237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3, +152,243,252, 99, 51, 45,219, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,142,124,251, 81,147, 0, 0, 0, 32, 99, 72, 82, 77, 0, + 0,122, 37, 0, 0,128,131, 0, 0,249,255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96, 0, 0, 58,152, 0, 0, 23,111,146, + 95,197, 70, 0, 2,177,101, 73, 68, 65, 84,120,218,236,157,119,120, 20,197, 31,198,223,217,221,235,119,233, 33, 29, 82,168,129, +208,123, 9,189,137, 52, 5,233, 42, 88, 0, 5, 20,165,217, 16, 68,176,162,128, 74, 87, 17, 16, 17,164, 42,210,165, 55, 9,189, +183, 0,105,164,215,235,101,231,247, 71,114,247,187,132, 36,119, 1, 68,132,249, 60,207, 62, 87,118,239,189,153,221,217,217,119, +191, 83,150, 80, 74,193, 96, 48, 24, 12, 6,131,193,120,112,112,108, 23, 48, 24, 12, 6,131,193, 96,252,135, 12, 22, 33,164, 51, +211,100,154, 76,147,105, 50, 77,166,201, 52,153, 38, 51, 88, 12, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48, +152,193, 98, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, + 6,131,193, 96, 48, 24,143, 7,132, 77, 52,202, 96, 48, 24, 12, 6,131,241, 96, 17,202, 90,209,168, 81,163,223, 21, 10, 69,181, +178,214,235,116,186,148, 83,167, 78,117, 96,187,144,193, 96,184,188,147, 35,132,195,255, 35,230, 34, 0, 74,217,221, 29,131,193, +120, 18, 13,150, 84, 42,141,218,183,111, 95, 13, 81, 20, 97,179,217, 96,181, 90, 29,175, 38,147, 9,253,250,245, 19, 42,250,103, + 13, 26, 52,216,199,113, 92, 68, 69,126, 99,179,217,110,159, 62,125,186, 77, 89,235, 3, 3, 3, 15, 1,136, 34,132,216, 43,242, + 82, 95, 1,128,227, 28, 45,162,201, 9, 9, 9,141,202,211, 36,132, 68, 57, 93, 28,238,210,178,191,119, 87,179, 86,173, 90,199, + 5, 65, 8, 43,249,251,210, 62,219,223,139,162,120,227,236,217,179,173, 88, 49,125, 56, 52,104,208, 96, 31,207,243, 21, 46,159, +167, 78,157, 42,179,124,214,173, 91,247, 36,199,113, 33,165, 29,227,210,142, 57, 0,222,102,179, 93, 62,125,250,116,155,178, 12, + 72,112,112,240, 33, 0, 81,229,149,157, 18,101, 19, 0, 18, 19, 18, 18,154,184, 58,143,202, 59,135, 74, 41,243,229,106, 58,155, +171,208,208,208, 79, 43, 85,170, 52, 90,167,211, 25, 0, 80,158,231,105,237,218,181,139,237, 7,155,205,150,126,241,226,197,186, +172, 36, 50, 24,140,199,218, 96,137,162,200, 25,141, 70, 92,185,114, 5,165,213,243, 28,199,217, 42,250,103,148,210, 26,187, 86, +173, 8, 80, 86, 10,132,205, 98,134,220,175,146, 67, 59,231,226, 57,136,102, 51,108,102, 19,252,155,180,176, 87,184,232,208,161, + 3,239, 66, 54,236,173,183,222, 10,240,240,240,128,193, 96,128,193, 96,128,209,104,132,193, 96,128,201,100,130,201,100,130,217, +108,134,217,108,134,213,106,133,209,104,196,153, 51,103,108, 46, 46, 8, 97,227,198,141, 11,240,244,244,116,232,217, 23,187,166, + 93,215, 98,177,192, 96, 48,224,220,185,115,229,106, 10,130, 16,118,226,196,137, 0,169, 84, 10, 74, 41, 68, 81, 4,165,180,216, + 82,146, 86,173, 90,153, 89, 17,125,168,212,216,240,249,172, 0,185,175, 31, 68,139, 5,126, 13, 26,219,203, 45,146,119,111,131, +205,108,134,104,177, 32,188,215,179,142,239,219,181,107,231,170,124,134,255, 54,245, 29,111,169,135, 7,172, 6, 3, 34,123, 62, +227, 88,113,126,225, 28,136, 22, 51,168,197,140,122,111,189, 15, 0,200,200,200,208, 71, 71, 71, 39, 3, 32, 0,202,138,240,132, +221,184,113, 35,192,158,134,210, 76,191,243,114,240,224, 65, 12, 29, 58,212, 85,222,195,222,123,239,189, 0,251, 57, 82,178,156, + 91,173, 86,199,171,213,106,133,193, 96,192,201,147, 39,221,138, 92, 5, 7, 7,127, 22, 27, 27, 59, 98,229,202,149,234, 13, 27, + 54,168, 35, 34, 34, 32,149, 74,193,243, 60,120,158, 7,199,113, 16, 4, 1,189,123,247, 38,172, 8, 50, 24,140,199,222, 96,153, +205,230,248,174, 93,187, 82, 0, 48,153, 76,161, 50,153, 76, 90,194,128,133,180,110,221,250,114,201,223,185,106, 58, 84, 86, 10, +196, 15,145,190, 0,128,231,174,103, 58, 46, 12,107, 99, 27, 56,182, 25,124, 43,183,112, 91,165, 18, 28,199, 17, 23, 21, 56,212, +106, 53,186,116,233, 2,153, 76,134, 38, 77,154, 64, 34,145,148,186, 72,165, 82, 72, 36,146,187,162, 71,165,161,209,104, 48,125, +250,116,187, 57,130, 90, 33,199,216, 86, 77,160, 0,197,226,115, 87, 97, 18, 41, 4, 65,112, 44,238,104, 74,165, 82,156, 61,123, + 22,130, 32,128,231,121,199,171,253,253,166, 77,155,208,191,127,127, 8,130, 0,165, 82,137,162,139, 44,227, 33,162,240,243,199, +218,182, 13, 1, 0, 67, 19,242, 29,101,236,207,129, 61, 29,219, 60,159,164, 5, 33, 4, 82,169,212,189,227,238,225,129, 45,253, +159, 2, 0, 60,123, 37, 13, 18,137, 4,130, 32,224,204, 87, 31, 67, 34,147, 65,144, 74, 81,239,173,247,145,145,145,161,127,230, +153,103, 14, 40, 20,138,109,110,220,172, 32, 33, 33, 1,130, 32,148, 89,222, 57,142,195,178,101,203,112,235,214, 45,183,242,174, +215,235,241,201, 39,159,128, 16, 82,236,124, 41,235,189,171,188, 19, 66,184,160,160,160,143, 99, 99, 99,135,173, 92,185,210,135, + 16,130,111,191,253, 22, 82,169, 20, 61,122,244,128,159,159, 31,182,111,223, 14,169, 84,138, 73,147, 38,177,194,199, 96, 48,158, + 12,131,117,234,212,169,167,236,239, 91,180,104,113,241,192,129, 3,181,156, 66,249,176, 90,173, 82,171,213, 90,195,222,108,104, +191,243, 29, 60,120,112,185,119,244, 54,139,249, 46,131, 84, 90, 69,237,206,133,203,201, 12, 98,192,128, 1, 0, 80,230,197,198, +121,113,227,174, 27, 38,147, 9,130, 32,160,102,229, 74,248,160, 91, 67, 52,163, 22,104, 11, 8,172,185, 90,244,209, 88,112,177, +118, 35, 44,186,157,142, 91,121, 5, 16, 4,247, 90, 75, 69, 81, 44,211, 92,241, 60,143, 5, 11, 22, 96,208,160, 65,224,121,190, +204,253,194,248,103,177,153,205, 46,203, 97, 69,143,141,213, 96, 40,140, 44, 9,188,195, 92, 73, 36, 18, 72,228,114, 8, 82, 41, + 4,153, 20, 25, 25, 25,250,206,157, 59, 31,145,201,100, 63, 5, 6, 6, 38, 39, 38, 38,150, 91, 62, 41,165,197,181, 74,185,153, +248,241,199, 31,177,124,249,114, 52,111,222,220, 29, 51, 4,147,201, 4,169, 84,138,143, 63,254,248,174,245, 11, 23, 46,188,203, + 96,185,208, 35, 0,184,192,192,192,215, 86,173, 90,229,105,255,127,127,127,127, 72, 36, 18,212,173, 91, 23, 30, 30, 30, 56,112, +224, 0,108, 54,155,219, 55, 62, 12, 6,131,241,159, 55, 88, 37,140, 1,103, 52, 26,113,233,210, 37,184,234,151, 74, 41, 45,183, +150,148,251, 85,114, 68,174,214, 84,245,115,124, 63,232,102,142,227,194,181,165, 89, 53,200, 52,106, 52,249,240, 11,183,205, 80, + 90, 90,154,227,206,219,213,226, 78, 69,110, 50,153,160, 82, 42,176,115,124, 93, 36,100,202, 48,237,112, 22,254, 56,117, 13, 18, +137, 4,221,107,215,197, 83, 82, 15,188, 31, 46,195,248,171, 55, 97,161,212,173, 11, 24,165,180, 84, 99,101,127,111,111, 42,177, + 27, 44,198,195,199,175, 65, 99, 71,228,106,101,101,143,187,162, 86, 0,176,169, 81, 4,228, 30, 26,212,125, 99,138, 91,229, 51, +178,231, 51,142,200,213, 31,141, 35,193, 75, 36,144,200,100,120,238,108, 18,128,194,102,193, 14,117,163,247,230,240,178,101,195, +134, 13,139,255,235,175,191,148,238,164,181, 52,131,101, 55, 63, 63,254,248, 35, 86,172, 88, 1, 65, 16, 96, 54,155,221, 74,167, +209,104, 44,211, 56,221, 75, 4, 11, 0,116, 58,157,105,227,198,141,248,230,155,111,224,231,231,135,174, 93,187, 34, 56, 56, 24, +107,214,172, 1,165, 20, 99,198,140,129, 82,169,132, 82,169,100,101,158,193, 96, 60,121, 6,203,108, 54,199,119,238,220,217,173, + 17, 63,122,189,254,142, 11, 3, 86,106,100,192, 57, 42, 32,247,208, 64,174,209,128,115,115,150, 46,139,197,226, 48, 40, 59,118, +236,128, 82,169, 68,143, 30, 61,238, 43,130,101, 54,155, 33,147, 74,192,249, 7,226,133,175,255, 66,102,190,222,113, 65,219,115, + 35, 30, 39, 82,211, 48,190,101, 39,168,149,105, 40, 48,153,220,142, 96,149, 52, 87,130, 32, 96,192,128, 1, 48, 26,141, 32,132, + 20,235,151,226,202,172, 50,254, 57,202, 26,132, 64, 8,129,194,211, 3, 50,181, 26, 60,207,187,165,229, 28,109, 18,100, 50, 72, +228, 50, 8, 69,229,208, 30,185,202,225,101,203,146,146,146,142, 0, 80, 52,107,214, 76,233, 78,218,156, 13,150,179, 1,114, 54, + 87, 60,207,195, 98,177,184,101, 94,140, 70, 35,164,210,255,247, 4,184,125,251,118,185, 6,203, 69,158, 41, 33, 68, 36,132,136, + 81, 81, 81,142,223, 6, 5, 5,193,219,219, 27,162, 40, 66, 20, 69, 40, 20, 10, 40,149,202, 98,255,203, 96, 48, 24, 79,140,193, +114,110, 46,124, 80, 23,175,242, 46, 96, 74, 79, 79, 72,213,106,251,104, 37,234,142, 25,178,247, 57, 25, 61,122,116,185,253, 82, +236, 70,204, 13, 83, 9, 78,224,145, 18, 20, 9, 27,183,255,255, 23,200,162,133, 19, 36,184, 21, 84, 11,252,165,147,144,136,162, + 91, 23,176,146, 17,172, 49, 99,198, 96,201,146, 37,224, 56,206,177, 79, 4, 65, 64,245,234,213, 17, 31, 31,207, 74,231,191, 0, + 45, 39, 26,105,255, 94,225,225, 1,153, 70, 3,222,141,190,119, 37,205,144, 84, 46,135, 32,147, 66,144, 22, 54, 11,246,234,213, +107,111, 78, 78,206,178, 58,117,234, 92, 69,225, 52, 6,156,187,231,144, 32, 8,197,140, 79,105,230, 74, 16, 4, 88,173, 86,183, +111, 42, 74, 26,157,153, 51,103,222,181,109,191,126,253,220,141, 96, 81, 66, 8,149, 74,165,232,210,165, 11,234,213,171,135, 13, + 27, 54, 64, 20, 69,188,254,250,235, 80, 42,149,152, 51,103, 14,172, 86, 43, 62,251,236, 51, 22,193, 98, 48, 24, 79,158,193,122, +144,228, 92, 56,235,232, 68,236,220, 44,184,181, 85, 45,200, 53,106,200, 53, 26,180,222,176,223,113,215,140,143,103,187, 21,193, +178, 27,172,204,204,204,114,205,149, 59, 17, 44,135,193,146, 9, 88, 27,150, 13, 42,147, 64, 48, 89,138, 25, 44, 94,144, 32,193, + 47, 18,156, 68, 10,193,102,117, 75,147, 82,122, 87,147,224,139, 47,190, 8, 66,136, 99,196, 87,253,250,245,157, 47, 52,236,138, +243,144, 73,222,189,205,209,161,221,185, 89,240,247,102,213,160,240,208, 64,166, 86,163,237,230, 67,142,104, 35,230, 44,118,169, +121,249,251,239,112,118,206, 44, 72,100, 50, 60,123,242,150, 35,114,213,170,102,181, 35, 38,181,231,178,219,183,111, 31, 1,192, + 13, 28, 56,208,187,126,253,250,110,157,147,246, 78,246,101,153, 43,103,131,101,177, 88,220, 46,243,238,156, 31,246, 40,150, 27, +229,157, 70, 71, 71,131,227, 56,120,122,122, 66,163,209, 56, 70,208, 42, 20, 10,168, 84, 42, 71,255, 77,119,207, 75, 6,131,193, +248, 79, 27,172, 6, 13, 26,252,169, 82,169, 34,221, 21,169,200,164,163,206,157,136,237,230,138, 16, 2,133, 70, 3,153, 70, 13, +185,135,166,204, 40, 87, 89, 23, 26,123, 19, 33,207,243,142,139,205, 79, 63,253, 4,141, 70,131,225,195,135, 87,184, 15,150,253, +110,158,147,114,216, 46,223, 13, 94, 38, 20, 51, 87,130, 32,128,151, 72,112, 71, 19, 12, 78, 34,129, 96,117, 29, 21, 35,132, 32, + 55, 55, 23,130, 32,224,131, 15, 62,112,220,177, 59,155, 43,214,177,253,223, 71,116, 50, 35,197,162,170, 30, 30,142,242,233,252, +189,171, 62,137,132, 16, 80,171, 5, 18,185, 28,146,162,129,184,246,200,149, 73,237,185,172, 86,173, 90,142,200,149, 74,165,178, +143, 30,117,169,201,113, 92,177, 50,189,108,217,178, 98,230,170,100, 4,203,221, 50, 47,149, 74,177,100,201,146,114, 77,148, 84, + 42,117,123, 4, 37, 80, 56,109,196,222,189,123,113,226,196, 9,140, 30, 61, 26, 74,165, 18,243,230,205,131,213,106,197,140, 25, + 51,160, 84, 42, 33,147,201, 88,225, 99, 48, 24,143,191,193,146,201,100,145, 7, 15, 30,116, 76, 50, 90,222,171,201,100,194,128, + 1, 3,220,142,132,137, 69,163, 8,185, 18, 35,229,228,158, 26,200,139,154, 94,156,191, 39,110,212,226,246, 59, 96,103,131,245, +225,135, 31, 66, 16, 4, 44, 89,178, 4, 0, 48, 97,194, 4,183,251, 96,217, 53, 97, 35, 72,164,215,209,240,235,254, 48,173,180, + 32,245,224,105, 8,130,128,128, 22, 79, 65,108,214, 31, 58,165, 6,130,205,234,246, 40,194,172,172, 44,196,199,199,131,231,121, +188,245,214, 91,197,230, 42, 42,145,103,236,216,177,131,245,193,250, 23, 13, 22, 87,212,191,170,180,242, 89,194,124,185,110, 39, +179, 89, 11,251, 93, 73,255, 63, 90, 48, 39, 39,103,217,237,219,183,143, 2,224,134, 13, 27,230,173, 82,169,240,253,247,223,235, + 0,200,214,172, 89,227,210,101,217,203, 77, 89,230,234, 94,154, 8,237,145, 96,231,126, 93,247,107,176,236,102,144, 16, 2,155, +205, 6,165, 82, 89, 44,114,165, 80, 40, 32,151,203, 89,193, 99, 48, 24, 79,134,193,226, 56, 14, 70,163, 17, 23, 46, 92,112,247, + 14,213,237, 73, 71,253, 26, 55,199,224, 91,185, 32,132, 96,123,108, 29, 71,179, 75,171,223,246, 58, 42,236, 91,159, 76,128, 68, +173,129, 95,108,215, 10, 93, 24,156, 13, 86, 78, 78, 14, 36, 18, 9, 62,254,248, 99,112, 28,135,207, 62,251, 12,161,161,161, 72, + 73, 73, 65,187,118,237,220,186,155,231,109, 60,130,159,143,134,234, 69, 47,120, 62,223, 22, 62, 93, 62, 68,146, 73,192, 33,131, + 10,109, 13,231, 33,219, 62, 23, 38,209,230,150,193, 34,132,192,106,181, 98,239,222,189,197, 58,178, 3,133, 77,135,246,233, 46, + 44, 22, 11,204,102, 51, 62,251,236, 51, 86, 58,255, 5, 42, 63,221, 23, 47, 36,235, 0, 0,127, 58, 53, 91,183, 89,191,223, 81, + 62,227,103,190, 5,137, 90, 3,159,166,177,110,105,214,126,125, 34,106,191, 62, 17, 25, 25, 25,250, 78, 13,234,236, 43,144,170, +126,172, 91,183,110,177,200,149, 66,161, 32, 69,159,137, 59,101,137,227, 56,240, 60,239, 48, 87,118, 51, 85,154,193,114,247, 6, +192, 98,177, 64, 42,149,186,109,176,220,133,227, 56,188,244,210, 75, 8, 14, 14,118, 68,174, 62,250,232, 35, 40,149, 74,188,243, +206, 59,176, 88, 44,152, 59,119, 46, 43,124, 12, 6,227,241, 55, 88, 70,163,241,102,167, 78,157, 80,198,186, 80,185, 92, 94, 44, + 12,100,159,116,180,100, 83, 33, 33,164, 51,165,116,103,105, 23, 8,231,209, 88,242, 18, 81, 43,169,135, 39, 36,106, 13,184, 82, +162, 77, 37, 53,237,119,198, 37, 13,150,125,201,205,205,133, 68, 34,193, 55,223,124, 3, 79, 79, 79,199,104,189,242, 52,237, 17, + 44,158,231,161, 75,200,199,197, 89, 59, 33, 83, 28, 66,181,174,131, 16, 44, 81, 66,122, 96, 29,244, 54, 75,185, 19,141,150,166, + 89,163, 70, 13, 76,157, 58,245,174,233, 25,202,162, 81,163, 70, 46, 53,239, 23,166, 89,186,166, 59,229,147,151,203, 93, 30,119, +251,122,123,228,170, 64,170,250, 49, 62, 62,222, 30,185,242, 82,169, 84, 88,184,112,161, 14, 0, 55, 99,198, 12, 85,120,120, 56, +239, 78, 58,121,158,199, 79, 63,253,116, 87,135,246,210,204, 85,105,211,126,148,150, 78,171,213,122,151,193, 26, 48, 96,192, 93, +163, 7,203,138, 96,149,150, 78,123, 95, 53, 63, 63, 63, 71,228,202,102,179, 57, 70, 15, 90, 44, 22, 88,173,214, 50,155, 90, 89, +249,100,154, 76,243,201,209,124, 34, 12,214,201,147, 39,187,151,245,131,214,173, 91, 95, 57,120,240, 96,117,155,205,230,252,140, + 66,169,193, 96,168,209,167, 79, 31,151,183,202,162, 40, 66, 46,151,131, 82,138,134,239,127, 10, 66,238,238,111,229,221,170, 19, +136, 32,192,102,179,193, 98,177,184,156, 30, 66,175,215, 59, 46, 38,101,117,112, 47, 40, 40, 40,119,158,159,146, 23, 5,131,193, + 80,236, 66, 69,168,136, 91,187,126,189,107, 52, 97, 69, 34, 4, 0,160, 80, 40,138,245,187,114,149, 20, 86, 68, 31, 46,246, 41, + 21, 40,165,168, 51,118,114,225,113, 42,106, 46,180,155, 0,175, 38,177, 32, 18, 1, 34, 0,179,217,236,170,124, 18,123,159, 43, + 74,233, 15,125,250,244,185, 12,192, 8,128,106, 52, 26,185, 68, 34, 17, 1,100, 1,160,217,217,217, 94, 73, 73, 73,162,193, 96, +168,226, 42,157,123,247,238,197,181,107,215,208,184,113, 99,199, 35,155,236,205,110,118, 19,227,108,176,220,141, 96,149, 54,167, + 86, 89,179,185,187, 11,207,243,240,242,242,114, 76, 98, 42,149, 74,161, 82,169, 0, 0,115,231,206,117,236,115, 6,131,193,120, +236, 13,150, 11,131,196,151,213,124,232,170,169,208,102,179, 37, 54,107,214,172,162,255,151,234,226,130,152,184,111,223, 62,105, +121, 15,121, 46,229, 59,151,154, 71,143, 30,149,150,243,251,210,222,167,186,202,123,243,230,205, 75,253,125, 89, 88,173,214, 36, + 86, 68, 31, 30, 86,171,181,236,242,249,225,167,101, 29,215, 84, 23,166,229,106,245,234,213,147, 53, 26,205, 31,129,129,129,153, + 7, 15, 30,244,107,218,180,169,159,243, 54, 77,155, 54, 13, 46,241, 51, 19,202,153,158,132, 16,146,248,194, 11, 47, 72, 93,148, +241,146,159, 19, 93,220, 84, 36,158, 59,119, 78, 90,154, 86, 89,175,148,210, 68, 55,118,235,173,238,221,187,115,206,191, 45,171, +236, 91,173,214,116, 86, 10, 25, 12,198, 19,107,176, 12, 6, 67, 66,167, 78,157, 74,237, 53,171,211,233,110,151,247,219,115,231, +206, 53,121,208, 25, 72, 76, 76,108,245, 95,208,252, 39,242,206,120,244,143,209,185,115,231,154, 61,104,205,219,183,111,183,250, + 47,104, 2,192,249,243,231, 91,178,146,197, 96, 48,152,193,114, 3,119,167, 99, 96, 48, 24, 12, 6,131,193,120, 82,225,216, 46, + 96, 48, 24, 12, 6,131,193,120,176, 16, 0,157, 75, 91, 81,145,209, 1,132,144,206, 21,253, 99, 87,250, 76,147,105, 50, 77,166, +201, 52,153, 38,211,124,252, 52, 93,105, 63, 54,163, 19, 41,165,255,216, 2,160, 51,211,100,154, 76,147,105, 50, 77,166,201, 52, +153,230,147,182,176, 38, 66, 6,131,193, 96, 48, 24,140, 7,140,192,118,193,191, 3, 33,132,167,148,218, 30,160,164, 15,128,178, + 30,232,102, 2,144,125, 47,201, 4, 32, 45, 90,236, 19, 21, 89, 0,152,139, 22,234, 90, 98, 58,151,156,236, 19, 67,109,146,166, +148, 16,137, 40,226, 84,149, 42,149, 79, 2,221, 77, 0,160, 9,170, 93, 91,163, 86,118, 54,154, 77,145,114,137,236, 66,142,182, + 96,135, 33,245,242, 77, 86, 66, 24,140,135, 79,147, 38, 77, 70, 80, 74,103, 22, 86, 81,228,227,227,199,143,127,203,246, 10,131, +241,128, 13, 86,181,106,213,142,115, 28, 23,102,159, 12,179,188, 57,119,236,175, 54,155, 45,241,226,197,139,110, 13,117, 39,132, + 8,193,193,193,207,169,213,234, 14, 60,207,183, 46,250,253, 65,173, 86,251, 87, 74, 74,202, 26, 74,169,245, 94, 50, 20, 21, 21, +229,105, 48, 24, 6, 16, 66,134, 0, 0,165,244,103,133, 66,241,235,141, 27, 55,242,238,209, 8, 85, 11, 10, 10,250, 89, 34,145, +240, 9, 9, 9, 29, 0,160,114,229,202,127,153, 76, 38, 91, 90, 90,218, 16, 74,233,181, 10,234,113, 82,169,244,211,216,216,216, + 54,132,144,229,148,210, 5, 15,232, 88,202, 57,142, 43,213,152,136,162, 24,113, 15,122, 82, 0, 94,223,124,243,141,223,138, 21, + 43, 26, 38, 38, 38,214, 5,128,176,176,176,179,195,134, 13, 59, 57,118,236,216, 76, 0,185, 69, 70,171, 76,146,147,125, 98,210, +238,220, 24,157,154,118, 97, 0, 0, 4, 5,215,253,149,231, 57,105,104,232,137,195, 42,255, 33,254, 53,107, 85, 29,245,203,247, +223, 72, 35, 34, 43, 99,247,161, 19, 13,198,190,241,110,140, 34,176,230,108,102,178, 30, 30, 53,106,212, 56,206,113, 92, 88, 69, +230,146, 43,122,130, 66,226,249,243,231,155,148,165,201,243,124,152,171,185,186, 74,126, 39,138,226,141,115,231,206,149, 58,101, + 68,205,154, 53, 15,243, 60, 31,233,110,125,228,156,206,178,166,224,168, 89,179,230,113,158,231,195, 92,105,150,252, 78, 20,197, + 27,103,207,158,109,229,174,166,139, 57,244,238, 41,157,238,104,150,151, 78, 0,104,223,190,189, 92,171,213,254,172,209,104,234, +107,181,218, 17,148,210,169,123,246,236, 9,228, 56, 14,157, 59,119,158,218,164, 73,147,120,133, 66, 49, 95,175,215,159,212,104, + 52,131,247,236,217, 99,100,103, 12,131,113,159, 6,139,227,184,176, 19, 39, 78, 4,168,213,106, 20, 25, 21,216,103,111, 23, 69, + 17,162, 40,130, 82,234,120,181, 90,173,104,223,190,189, 91,127, 26, 22, 22, 86,183,102,205,154,107,199,140, 25, 83,165, 87,175, + 94,178,192,192, 64, 16, 66,112,231,206,157, 26,127,252,241,199,208,121,243,230,125, 24, 22, 22,214, 63, 49, 49,241,172,187,166, + 37, 56, 56,184, 19,128, 23,235,214,173,251,236,132, 9, 19,164,173, 91,183,134,205,102,195,238,221,187, 99,231,204,153,243, 77, + 72, 72,200, 58, 0,203, 82, 82, 82,118, 81, 74, 69, 55,117, 27, 70, 70, 70,254,186,127,255,254,200,155, 55,111,218,250,246,237, +187, 28, 0, 14, 29, 58, 84, 95, 20, 69,210,186,117,235, 63, 9, 33, 3, 40,165, 39, 43,176,207,251,140, 29, 59,182,255,152, 49, + 99, 42, 13, 31, 62,252,121, 0, 11,138,254,139, 20,237,103, 90,193, 99,232,136, 92, 81, 74,203,155, 94, 59,168, 2,145, 44,117, +124,124,188, 79,171, 86,173, 94, 75, 75, 75, 27,239,172,155,154,154,138,184,184, 56,243,172, 89,179,190, 62,116,232,208,252,200, +200,200,108, 0,218,178,132,168, 77,210, 52, 53,237,194,128,182, 45,191,241, 2,128, 53,155, 94, 27,116,236,100,186,199,239, 91, + 23, 13,149, 41,164,198, 21,139,191,150, 86,175, 22,129, 61,199,175,226,232,133, 44, 82,183, 77, 79, 33,247,247,229, 93, 0, 44, + 98,167,231,195,129,231,249,208,227,199,143, 7,168, 84,170, 82, 31,232, 94,162,223, 5, 8, 33,160,148, 34, 54, 54,182, 60,205, +176, 19, 39, 78, 4, 40, 20, 10, 71,221, 81,178,206,176,215, 43,142,178, 66, 41,218,182,109,107, 46,167, 78, 10,255,251,239,191, + 3, 84, 42,149, 67,167,180,244,149, 52, 26,109,219,182, 45, 55,157,113,113,113,142,116,186,163, 73, 41, 69,235,214,173,109,174, +242,110,127, 98,133,171,124,219, 53, 91,182,108, 73, 43,162,233,102, 58,203,189, 1,210,106,181, 63,175, 89,179,230,153,192,192, + 64,244,233,211,103,123,157, 58,117,100, 42,149, 10, 91,183,110, 69,229,202,149,253, 61, 60, 60,182,124,242,201, 39,152, 61,123, +118,149, 29, 59,118,172, 2,240, 12, 59, 99, 24,140,251, 55, 88, 80,171,213, 88,189,122,181,227,241, 48,246,199,100,148,246,190, + 74,149, 42,110,253, 97, 80, 80, 80,147,136,136,136,189, 27, 54,108, 80, 6, 4, 4, 56,190, 55,153, 76,240,244,244,196,139, 47, +190, 40,235,210,165, 75,245, 33, 67,134, 28, 9, 10, 10,106,119,231,206,157,227,229,233, 5, 7, 7, 63, 27, 19, 19,243,237,248, +241,227, 3,123,247,238, 13, 31, 31,159, 98,235,123,246,236,137, 30, 61,122, 72,111,220,184, 49,104,205,154, 53,131,150, 47, 95, +126, 39, 56, 56,120,108, 74, 74,202,186,114, 29,134, 90,221,185, 65,131, 6,223,239,222,189, 59,204,219,219, 27, 33, 33, 33,220, + 7, 31,124, 80,183,106,213,170,202,160,160, 32, 46, 37, 37, 5,235,214,173,171, 58,108,216,176,141, 10,133, 98,132,193, 96,216, +229,134, 97,147,249,250,250, 78, 28, 57,114,164, 95, 94, 94,158,245,196,137, 19, 87,237,223,203,229,242,169, 45, 90,180,104, 68, + 8, 89, 77, 41, 93,118, 47,145, 43, 74,105, 30,254,223,148,103,199, 98, 95,239,102, 36, 75,118,234,212, 41,223,150, 45, 91,174, + 51, 26,141,141, 70,143, 30,125,123,214,172, 89, 74, 79, 79, 79, 79, 0, 36, 47, 47, 47,123,250,244,233,166, 57,115,230, 76,174, + 93,187,118,167,195,135, 15, 63,219,160, 65, 3, 75,145,121,187,219, 96, 17,226, 72, 79, 66, 82, 58,246, 30, 18,101, 83,223,153, + 16,246,249,204,200, 91,127,159, 79, 16, 5,165, 39, 54,239, 59,135,212,204, 2,252,121,248, 60,130,252, 60,136, 84, 46,137,241, + 14,139,105,151,155,116,126,223, 61, 24, 78,198, 61,160, 82,169,176,121,243,230,187, 30, 49, 85,218,227,167, 4, 65,128,183,183, +119,185, 79, 35, 32,132, 64,161, 80, 96,199,142, 29,197, 30, 47, 85,218,123,251,171,151,151, 23, 40,165,229, 62,226, 64,161, 80, +224,224,193,131,224, 56,238,174,223,151, 76,179, 32, 8, 80,171,213, 32,132,112,174, 52,247,237,219,231, 82,203,254,170,209,104, + 0,160,220,231, 15,201,229,114, 28, 56,112,160,204, 60,151,124,175, 41,122,222,165, 43,205,131, 7, 15, 22,123, 68, 87,201, 71, +119, 57,127, 46,186, 57, 46, 87, 84,169, 84,214, 15, 12, 12,196,177, 99,199, 48,109,218, 52, 89, 76, 76, 12,174, 94,189, 10, 66, + 8,134, 15, 31,142, 58,117,234, 32, 37, 37, 5,117,234,212,193,129, 3, 7, 26,178, 51,133,193,120, 0, 6,203,142, 59,230,202, +254, 28,177,146, 21, 68,201,161,150, 17, 17, 17,114,141, 70,243,219,230,205,155,149,126,126,255,127, 90,136,209,104, 68,126,126, + 62, 10, 10, 10,144,159,159, 15, 15, 15, 15,204,159, 63, 95, 57,120,240,224,223, 34, 34, 34,106,220,188,121,211, 88,150, 38, 33, +228,235, 83,167, 78, 5, 90,173, 86,200,100,178, 50,205, 98,181,106,213, 48,118,236, 88,196,198,198, 6, 13, 28, 56,240,107, 0, +235,202,210, 44, 50,110,223, 29, 58,116, 40, 76, 42,149,226,202,149, 43, 72, 76, 76,196,168, 81,163,194, 69, 81, 68, 66, 66, 2, +174, 94,189,138,164,164, 36, 44, 89,178, 36,108,240,224,193,243, 1, 84, 47, 47,239, 69,188,242,214, 91,111,213,240,245,245,229, +190,248,226,139,220,130,130,130,197, 69,223,191, 51,119,238,220,193,109,219,182,173,244,242,203, 47,131, 16,242, 11,165,244, 46, +195, 82, 66,179,180,200,149, 13,192,197, 18, 63,139, 46, 17,217, 10, 66,225,179,240,114, 74,209, 36, 0,188,186,118,237,250,150, +209,104,108,116,224,192,129,107,173, 91,183, 14, 7,144, 2, 32, 29, 0,188,188,188,212, 95,127,253,117, 96,207,158, 61, 47,119, +236,216,177, 81,215,174, 93,223, 74, 79, 79,159, 85,180,158,150,212, 20, 69,156, 10, 10,174,251,235,190,195, 99, 7,236, 57,104, +146, 78,120,227,195,219, 85, 42, 71,228,158,186,146,101, 59,127, 35, 29,249,122, 43,158,233, 88, 15, 0,208,162,110, 21,124,187, +250, 0, 94,127,243, 61,201,186, 95,151,247,187, 70,161, 6,240, 71, 57,251,243,190, 96,154,255, 55, 67,162, 40, 66, 34,145,224, +169,167,158, 2, 33,228,174,103,109, 74, 36, 18, 28, 62,124, 24, 29, 59,118,132, 68, 34,193, 75, 47,189,228, 50,157,162, 40, 66, + 16, 4,116,237,218, 21, 86,171,245, 46,189,146,102,193,254,140,206,242, 52, 41,165, 16, 4, 1, 28,199,149,106,126, 74, 46,165, +153,150,210,242,238, 74,203,121, 93,105,143,251, 41,169,105, 79,167, 59,230,202,174,233,110, 58, 5, 65, 64,171, 86,173,112,242, +228,201,114,205, 22,199,113, 46,235,100,173, 86,251, 98,159, 62,125,182,143, 30, 61, 90, 1, 0,153,153,153,142, 7,209,243, 60, +143, 75,151, 46,193,100, 50, 97,229,202,149, 48, 26,141,163,217,121,196, 52,255, 73,205, 39,198, 96,217, 43, 9,119, 13,150, 59, +207,214,163,148,142,121,231,157,119, 2,203, 51, 87, 5, 5, 5, 72, 78, 78, 70,120,120, 56,158,123,238,185,192,229,203,151,143, + 1,240,101, 57,178, 82,158,231,113,236,216, 49,164,165,165,161, 94,189,122,136,140,140, 44,182,193,245,235,215,177,101,203, 22, +228,228,228,160,113,227,198, 64, 97,255,162, 82,105,208,160,193,180,232,232,232,174,237,219,183,151, 75, 36, 18,156, 58,117, 10, +141, 26, 53,194,234,213,171, 81,165, 74, 21,168, 84, 42, 92,190,124, 25,245,234,213,195,222,189,123, 81,169, 82, 37,196,196,196, +200, 27, 55,110,188, 63, 43, 43,235,175,155, 55,111, 78, 43, 99,127, 74, 67, 67, 67,223, 29, 57,114,164, 44, 57, 57, 89,252,233, +167,159, 14, 81, 74, 15, 17, 66, 70,189,247,222,123,207,119,235,214,173,210,137, 19, 39,242,254,254,251,239,191, 75, 51, 87,110, + 70,174,172, 37, 47, 70, 54,155,205,168,215,235, 77, 70,163,209,194,113,220, 77, 66,136,201,102,179,213, 40,235,102,254,197, 23, + 95,172,154,145,145,241,250,155,111,190, 25, 95,100,174, 46,161,176, 99, 59, 0,192,106,181, 26, 11, 10, 10,242, 90,182,108, 25, + 62,120,240,224,107,171, 86,173,122,253,197, 23, 95, 92,179,108,217,178, 2, 0,250,146,130, 85,170, 84, 62,201,243,156, 84,155, +239,123, 99,237,154,165,227,183,108, 26, 83, 57, 33, 33,169,186,159,127, 37,173, 84, 83, 41,121,205,207, 63, 30, 7, 96, 74, 78, +207,195,153,235,119, 32,145,240,184,144,144,139,182,221,159,147, 92,187, 50,179,141,221, 96, 49,254, 81,168,253,225,208,123,246, +236, 41, 55,130,117,248,240, 97, 72, 36, 18, 40,149, 74,172, 94,189,186, 92, 81,187, 33,176, 71,135, 92,153, 24, 87, 15, 63,183, +155, 12,251, 3,216, 75, 46,223,125,247, 29,222,124,243,205, 98,255, 81,164, 73,220, 73,103,105,233, 11,143,136, 64, 90,106,106, +177,239,220,120, 72, 59,108, 54, 27, 36, 18, 9,150, 44, 89,130,158, 61,123,226,247,223,127, 47,247,181,200,216, 82,119,210,217, +170, 85, 43,152,205,102, 71,154, 47, 93,186, 84,170,238,130, 5,229,119,239,108,210,164,201, 8, 66,200,204,154, 53,107,202, 59, +116,232,128,125,251,246, 97,230,204,153,162,213,106,205, 0,128, 86,173, 90, 85, 26, 63,126, 60,137,139,139,131, 70,163, 65,122, +122,250,178, 38, 77,154,204, 96, 29,223, 25,140, 7, 16,193,178, 87,186,174,204,149,253, 78,209,149,201,210,104, 52, 61,186,119, +239,238, 48, 55, 6,131,193, 97,172,236,230,202,254,249,242,229,203,136,137,137,145,106, 52,154, 30, 46, 12, 86, 97, 70, 4, 1, + 33, 33, 33,200,200,200,192,217,179,103, 17, 30, 30, 14,139,197,130,109,219,182, 33, 55, 55, 23, 18,137, 4, 82,169, 20,102,115, +185, 93, 18, 16, 29, 29,253,212,138, 21, 43,154, 44, 95,190, 60,219,126, 7,247,243,207, 63,131, 82,138, 74,149, 42, 65,167,211, + 33, 53, 53, 21,127,253,245, 23,172, 86, 43, 52, 26, 13, 66, 67, 67, 21, 99,198,140,105, 51,125,250,116, 9,128,105,101, 72, 55, +239,215,175,159,167,167,167, 39,222,120,227, 13,106, 54,155,191, 36,132,180,120,246,217,103,223, 29, 59,118,172,239,205,155, 55, + 77,175,188,242,202,113,179,217,252,117,209,197, 68, 66, 41,181,184, 48,172,101, 70,174, 44, 22,139,125,159,198, 23, 20, 20,192, +223,223, 63,220, 69, 31, 45, 0,144, 30, 60,120,176, 21, 0,126,198,140, 25, 10, 20, 62,192,218,145, 6,147,201,132,130,130, 2, +104,181, 90, 75,110,110,110,218,196,137, 19,173,171, 86,173,226,139,126,115,161, 52,131, 5,116, 55,213,169,163,150, 81,202,191, +183,104,209, 34, 77,183,110,221, 56,141, 70,131,252,252,124,207, 63,183,110,213,116,234,208, 38,106,214,167,159,111,247, 12,171, +151,122,240,212, 13, 36,221,201,133,201, 98, 65, 84,176, 87, 97,252,139,241,143, 83,212,193,218, 17,193,114, 54, 19,251,246,237, + 67,247,238,221, 29,231,186, 84, 42,117,108,231,142,166, 32, 8,232,222,189,251, 93, 17,157, 61,123,246,148, 26,109,114, 85,135, + 56,155,161,146,166,168, 52,227,197,113, 28, 92,181, 50,219,163,119,165,153, 44,231, 40,126, 9,211,230,234,102, 18,130, 32, 96, +236,216,177,144, 72, 36,152, 52,105, 18, 4, 65, 64,195,134, 13, 33, 8, 2, 90,182,108, 9,137, 68,130,142, 29, 59,150, 25,105, + 43,205, 92, 10,130,128, 35, 71,142,160, 81,163, 70,142, 52, 53,108,216, 16, 77,155, 54,133, 32, 8,136,141,141,133, 68, 34, 65, +215,174, 93, 93,106,218, 59,180,107, 52, 26, 92,190,124, 25, 60,207,131, 16,146, 25, 23, 23, 23, 8, 0,211,166, 77,203,208,235, +245,126, 6,131, 1,157, 58,117, 66,155, 54,109, 42,253,252,243,207, 31, 0, 96, 6,139,193,184,223, 8,150,189,210,117,215, 96, +185,194, 96, 48, 52,176, 71,175, 74, 51, 87,206,175, 38,147, 9, 85,171, 86,133,193, 96,104, 80,209,139, 69,112,112, 48,204,102, + 51,150, 46, 93, 10,169, 84, 10,169,244,255,190,194,100, 42, 63, 56,116,254,252,249,248, 35, 71,142, 52,106,220,184,177,207,250, +245,235,211,187,116,233, 82,169, 91,183,110, 80, 42,149,208,235,245,176, 88, 44,104,209,162, 5,162,163,163,145,150,150,134, 63, +255,252, 51,163, 70,141, 26,254, 71,143, 30, 21,239,220,185,115,171, 28,233, 78,157, 58,117, 2, 33, 4,127,254,249,103, 38,165, + 52, 78,169, 84,174,159, 53,107,150,183,201,100, 18,159,127,254,249,132,172,172,172,137, 0, 44,114,185,252,203,110,221,186, 53, +231,121,126,181,205,102,171,112,101, 86,114,223,106,181, 90, 40, 20, 10,119,166,132,144,100,101,101,213, 5, 0,181, 90,237, 11, +192, 49, 66, 82,175,215, 23, 51,193, 38,147,201,224,235,235,171, 6,128,162,223, 72,202, 56, 30,149, 84, 42,213,218, 91,183,110, +120, 56, 71, 46,189,189,189, 49,100,240, 96,174,117,171, 86,178,250, 13, 26,116,125,127,246,242,213, 33,126,158,166,168, 16, 63, + 88,108, 22,236,220,190, 77,164,162,101, 59, 59, 69, 31, 14,118,147, 81, 50,130, 37,145, 72,176,119,239,222,187,190,147, 74,165, +216,188,121,179, 91,102,200,110,166,202,106, 34, 43, 97,134,136, 59, 81,117,158,231,177,100,201, 18,136,162,136,241,227,199, 23, +107, 54,116,214,183,155, 29, 87,154,246,223, 68,127, 40, 2, 48, 33,241, 43,185,227,247, 37,211, 91,164, 73,220, 49, 67,223,124, +243,141, 91, 17,172,167,159,126,218, 45,211,230,156, 47,123,186, 78,158, 60, 89,170,238,162, 69,139, 92,246,105, 19, 69, 17,127, +252,241,135,195,156,218,249,224,131, 15, 70,122,122,122,106,246,237,219,135, 59,119,238, 64,171,213,162,160,160, 0, 62, 62, 62, +222,157, 59,119, 62,117,231,206,157,155,231,207,159,103, 29,222, 25,140,123,141, 96,217, 43, 93,119,154, 9, 75,107,239, 47, 69, + 79, 32,132,192, 96, 48,148,106,172,156, 77,129,217,108, 70,102,102, 38, 68, 81,188,231,185,186, 74,171, 88, 93, 25,172,179,103, +207, 14, 31, 49, 98, 68,178,151,151, 87,253,204,204,204, 20,185, 92, 30,187,111,223,190,202,102,179, 25,158,158,158,240,244,244, +196,150, 45, 91,224,237,237,141, 55,223,124,243,182, 94,175, 63,164, 86,171, 3,245,122,253,233, 59,119,238,188, 95,166,115,145, + 72, 58,181,109,219, 22,113,113,113,200,201,201,217, 77, 8,169,255,242,203, 47,119,169, 92,185, 50,153, 57,115,166,225,218,181, +107,223, 1, 72, 87,171,213, 75, 87,172, 88,209,174,113,227,198,154, 97,195,134,129, 16,242, 61,165,212,224,110,158,181, 90,109, + 49, 99,149,151,151,135,252,252,124,168,213,106,171,155,251, 76,130,194,190, 84,246,254, 84,142, 99, 83, 20,189,178, 31, 31, 42, + 8, 2, 45,220,132, 74,202,210, 83,171,213, 51,150, 47, 95, 94,172,207,157, 61, 58,154,154,154, 10, 79, 79, 79,124,240,254,251, +210,143,222,126,185, 17,175, 9, 60,204,113, 4, 38, 51,205,161,162,105,155, 54,117,224,126,118,138, 62,156, 8,150,221, 16,244, +238,221,251,174,102, 65,169, 84,138, 29, 59,118,160,111,223,190,142, 27,150,162,166,118,183, 12, 65,175, 94,189, 28,145,160,109, +219,182,149,218,188,103,143, 64,185, 99, 4,237,219,142, 27, 55, 14,130, 32,224,219,111,191,197, 91,111,189, 5,142,227,240,213, + 87, 95,129,227, 56, 76,157, 58,181, 66,245,132,189, 46,187,249,121,225,107,216, 91,121,200, 92, 16, 8, 0,240,240,244,180,111, + 88, 33, 77, 65, 16, 28,145,171, 6, 13, 26, 64, 34,145,160,101,203,150, 16, 4,193, 17,185,234,209,163,135,243,180, 10,212, 29, + 77, 65, 16,112,229,202, 21, 71,154, 91,182,108, 89, 44,114, 37, 8,130, 91,134,141, 16,242, 81,199,142, 29,103,134,133,133, 5, +140, 30, 61,154,240, 60,143, 38, 77,154,248, 79,157, 58, 53, 87, 34,145, 40, 39, 76,152, 80,218,121, 45, 1, 80,191,118,237,218, +106,118,230, 48, 24,247, 17,193,170,136,193,114,167,114, 84,169, 84,103, 50, 50, 50, 90,202,229,242, 98,230,170, 52,163,197,243, + 60,210,210,210,160, 82,169,206, 60,200, 12,187,106, 34, 44, 50, 51,111, 59,237,135,166,207, 61,247,220,170,213,171, 87, 71,237, +220,185, 19, 71,143, 30, 69,165, 74,149, 48,107,214,172, 27, 55,111,222, 28, 76, 41,253,219,157,255,173, 90,181,106, 29,181, 90, +141, 67,135, 14, 1,192,126, 0, 47,190,254,250,235,196,106,181, 98,254,252,249, 58, 0, 59,188,188,188,214,253,246,219,111, 13, +234,213,171, 39,219,185,115,103,254,209,163, 71,247,184,105,174,108,162, 40,222,101,172,156,247,169,135,135,135, 59, 17, 44,139, +151,151,215,217,188,188,188,231,244,122,125,158, 92, 46,247,200,203,203, 51, 58, 27, 43,187,190, 32, 8,146, 43, 87,174, 36, 3, +136,242,242,242, 58, 11,167,166,196, 98, 5, 76, 16, 58,117,234,212, 73, 40,121, 12, 82, 83, 83,113,231,206, 29,152,205,102, 52, +110,220,152,240,196,194,103,221, 62, 61,146,157,146, 15, 31,142,227,168,253, 92,183,143,250, 43,109,228,224,182,109,219, 28,159, + 57,142,195,159,127,254,233,150,105,219,177, 99, 71,185, 29,209, 75,116, 72,119, 25, 10,183,111, 63,127,254,252,194,199, 81, 20, + 69,174, 56,142,195,148, 41, 83, 32,151,203, 49,115,230, 76, 76,153, 50,165, 88, 84,198, 85, 4, 75, 16, 4, 68, 76,210, 57,223, + 20, 21,158, 20, 69,253,157, 8, 33,206, 38,203,173, 72,155,171, 14,238,238, 68,254, 75, 75,167, 66,161, 40,179,131,123, 9,205, + 50,255,224,248,241,227, 63, 52,106,212,232, 90,165, 74,149,118,180,108,217, 82,126,252,248,113,140, 25, 51,134, 24,141, 70,207, +157, 59,119, 58,254,183, 52,163,167,213,106,149,236,204, 97, 48,238, 35,130, 85,145, 78,238,238,244, 75,208,235,245,187,246,236, +217,211,180, 79,159, 62, 66,121,205,131, 90,173, 22,129,129,129,184,126,253,186, 85,175,215,187,156,254,192,102,115,127, 66,116, + 87, 6,171,148,125,240,119, 76, 76,140,213, 98,177,160,122,245,234, 8, 13, 13,133,193, 96,192,156, 57,115,172,238,154, 43, 66, +136,180, 73,147, 38, 60, 0,100,103,103, 3, 64, 38,128, 26, 53,106,212, 64, 92, 92, 28,178,179,179, 55, 2,232,252,209, 71, 31, + 53,108,222,188,185,116,245,234,213,186,209,163, 71,111,180, 88, 44, 51,221,209, 23, 69,209,100,181, 90, 35, 57,142, 51,231,228, +228, 36, 57,239,207,192,192, 64, 95,181, 90, 77, 82, 83, 83, 45,238, 24,172,250,245,235, 31,187,125,251, 54,102,204,152,145, 62, +107,214,172, 26,249,249,249,217,185,185,185, 86,103,147,101, 48, 24, 56,127,127,127,249,130, 5, 11,148, 0, 80,191,126,253, 99, +101, 25, 44,173, 86, 91, 89,165, 82, 57, 62, 27,141, 70,220,185,115, 7,119,238,220, 65,106,106, 42,242,243,243, 17, 21, 21, 5, +157, 78, 23,206, 78,199,127, 15,231,102, 50,231,243,219,249, 2, 94,145,115,221, 89,179,119,239,222,142,190, 91,246,136,152,125, + 89,187,118,109,177,142,227,174,154,222,236, 6,107,254,252,249, 24, 55,110, 28, 20, 10, 5,190,254,250,235, 98, 77,132,165,152, + 2,226, 78, 58, 35, 39,235,113,103,158, 47, 36, 18, 9,252, 70,167, 22,107,138, 43,101, 52,158, 91, 70,112,214,172, 89, 15,172, +137,208,174, 25, 30, 94,120,170, 44, 89,178, 4,207, 61,247, 28,246,239,223,127,207, 77,132,145,145,145, 43,230,206,157, 43, 63, +127,254, 60,242,242,242,144,158,158, 14,163,209,136,196,196, 68,199,190, 41, 13,157, 78,167, 96,103, 13,131,113, 31, 6,203,185, +243,167, 43,131, 85,212, 65,210,149, 17,248,250,195, 15, 63,124,189, 77,155, 54,190, 30, 30, 30, 72, 78, 78,190,203, 92, 21, 20, + 20, 64,163,209,192,100, 50, 97,207,158, 61,121,162, 40,126,237,202, 20, 88, 44, 22, 4, 4, 4, 32, 35, 35, 3, 98, 25,253,162, + 57,142,131, 82,169,132, 86,171, 69, 89,102,160,188, 10,216,108, 54,195, 98,177,192, 98,177, 84,216,164, 1, 80,218, 39,108, 45, +250,127,109, 72, 72, 72, 85,133, 66,129,248,248,120, 0,184, 2,160, 67,183,110,221, 36,153,153,153,244,149, 87, 94, 57, 76, 41, + 29,235, 98, 54,123,211,190,125,251, 34, 1, 64,169, 84, 94, 6,128,196,196, 68, 75, 78, 78, 78,177,200,160, 74,165,162,125,251, +246, 13,166,148, 98,223,190,125,145, 82,169,148,162,140, 57,171, 0, 24, 54,110,220,120,222,203,203,107,213,167,159,126, 58,184, +103,207,158,231,234,214,173, 27,169,213,106,211,244,122,189,222, 96, 48, 80,158,231,165, 62, 62, 62,138,237,219,183, 95, 59,124, +248,112,103, 79, 79,207, 85, 27, 55,110, 60, 15,160,212, 72,155, 90,173, 78,212,233,116, 17, 26,141, 6,122,189,190,152,185,186, +115,231, 14, 40,165,184,113,227, 6, 84, 42,213,109,118, 58,254, 59, 56, 71, 92, 74, 70, 90, 74,126,231,174,185,114, 54, 67,219, +183,111, 47,119, 14, 44,119, 53,157,205,208, 91,111,189,133,121,243,230,221, 21,193,154, 57,179,240,158,228,253,247,223,119, 25, +189,114, 70, 34,145,224,206, 60, 95, 4,141,203, 42,102,102, 0,128,216,211, 87,193, 41,217, 4, 65,192,140, 25, 51,238,234,124, +238,220,132,231,174,177,114, 78,103, 90, 90, 26, 4, 65,128,175,175, 47,134, 12, 25,130,174, 93,187, 58,154, 26, 43,170,155,144, +144,112,114,246,236,217, 85, 66, 67, 67,177,122,245,106,147, 90,173,150,117,236,216,145,230,228,228,144,242, 34, 88,204, 96, 49, + 24,174,225,220,169, 32,221,105, 38, 44,173,146, 36,132,116,118,254,124,243,230,205, 92,173, 86, 59,100,208,160, 65,122,163,209, +136,170, 85,171, 66, 46,151,195, 98,177,192,100, 50, 65, 42,149, 34, 56, 56, 24,148, 82,172, 91,183, 78,175,211,233,134,220,188, +121, 51,183, 60, 77, 66,200,123, 79, 61,245,148, 33, 62, 62, 30, 85,170, 84,129,135,135,199, 93,143,141,240,244,244,132,183,183, + 55, 46, 94,188,136,165, 75,151,234, 9, 33,239,149,167, 89,154,209,180, 27, 43,187,209,114, 53, 50,169,132,166,218, 30,197,209, +233,116, 0, 96,173, 82,165, 74, 32, 0,220,184,113, 3, 0,110, 69, 69, 69,181,171, 86,173, 26,217,191,127, 63, 40,165, 59, 75, + 51, 87, 37, 52,179, 98, 99, 99,111,197,198,198,154, 76, 38,147,212,100, 50, 73,115,115,115,205,254,254,254, 1,254,254,254,254, +129,129,129,190, 1, 1, 1,222,201,201,201, 86,171,213, 42,181,217,108,210,216,216, 88, 83,243,230,205,111,195,105, 54,247, 18, +154, 34,128,188, 69,139, 22, 77,151, 72, 36,183, 90,181,106, 21, 51,121,242,228,155, 22,139,197, 24, 26, 26,234, 19, 20, 20,164, +212,233,116,249,159,124,242, 73,218,188,121,243, 58, 75, 36,146, 91,139, 22, 45,154, 14, 32,175,232,183,119,105, 90,173,214, 93, + 59,119,238,180, 90, 44, 22, 36, 37, 37, 33, 57, 57, 25, 41, 41, 41,142, 87,111,111,111, 28, 59,118,204,102, 54,155,119, 86, 96, +127, 62, 40, 99,193, 52,241,255,190, 63,229, 25, 43,119,186, 1,148, 76,167,221, 12, 61,247,220,115, 24, 56,112, 32, 6, 13, 26, +132, 33, 67,134, 96,216,176, 97, 21,153,154,161,228,249,238,248,237,228,201,147,241,254,251,239,227,195, 15, 63,132, 92, 46,199, + 7, 31,124,128,105,211,166, 97,218,180,105, 37,205, 21, 41, 39,239,197,234,185,220, 37,161,208, 45,139,128,105,101,181,194, 38, + 66, 74,255,191,184,191, 63, 29,102,232,131, 15, 62,192,225,195,135, 49,113,226, 68,236,222,189, 27, 99,198,140,193,150, 45, 91, + 48,114,228, 72,252,241,199, 31,142,215,162,155, 64,234, 78, 58, 5, 65, 64,187,118,237,160,211,233, 28, 6,118,212,168, 81,197, +244, 70,142, 28,233,214,254, 84, 42,149,131, 55,110,220,184,126,233,210,165, 55,178,178,178,186,222,188,121,243,182, 86,171, 37, +185,185,185,142, 99, 88,114, 41,138, 68,203,217,121,196, 52,153,133,186,143, 8,150,213,106, 69,229,202,149,139, 61,219,138,227, +184, 98, 75, 69,250, 17, 0, 64, 74, 74,202,246,224,224,224,103,159,121,230,153,149, 47,190,248,162, 71,116,116,180, 36, 34, 34, + 2, 58,157, 14,183,110,221,194,205,155, 55,173,187,119,239,206,211,233,116, 67, 83, 82, 82, 92,142, 34, 75, 74, 74, 90, 30, 24, + 24,184,109,232,208,161, 83, 27, 54,108, 56,106,252,248,241,124, 84, 84, 20,114,115,115,225,227,227,131,128,128, 0,196,199,199, + 99,239,222,189,182,156,156,156,133, 54,155,237,163,212,212,212,244,138,236, 36,171,213,202,155,205,102, 12, 26, 52, 8,162, 40, + 98,206,156, 57,176, 90,173,124, 5, 36,204,102,179,153, 2, 32, 25, 25, 25, 0,160,179, 27,174,171, 87,175, 2,192,237,136,136, + 8, 13, 0,236,220,185,147, 0, 56,228,238, 13,189,115, 36, 43, 58, 58, 58,222, 94, 41, 58, 95,228,236,235,139, 34, 87,174,110, +195, 13, 3, 6, 12, 72,211,233,116,221,222,122,235,173,169,243,231,207, 31, 60,127,254,252,187, 54,242,244,244, 92,245,213, 87, + 95,125, 52, 96,192,128,180,178,162, 87, 69, 17,187,247, 95,120,225,133, 1,103,206,156,241, 80, 40, 20,208,106,181,200,204,204, +132,217,108, 70, 84, 84, 20,210,210,210,176,124,249,242,124,189, 94, 63,141,157,142,255, 46,101, 25, 43,119,251, 88,150, 21,197, +217,188,121,115,169,115, 76, 85, 84,179,164,201,112,119,110, 42, 55,110,134, 74,157,250,161, 34,245, 90, 89,154, 95,124,241,133, + 99,178,213,210, 34, 87, 21,137, 96,217, 53,125,125,125, 1, 20,206,190, 47,138, 34,158,126,250,233,123,214, 45,122,182,224,179, +246,207, 77,154, 52,249,104,245,234,213, 51, 41,165,126, 0, 4,231,125,192, 30,170,192, 96, 60, 32,131,101,179,217, 18,219,181, +107, 87,172, 98, 43,239,161,170, 69, 70, 36,209, 77,147,181, 45, 42, 42, 42,106,201,146, 37,111,168,213,234,206, 6,131,161, 30, + 0, 40, 20,138, 51, 90,173,118, 39,199,113,115, 83, 82, 82,220,126, 56,115,145, 97, 26, 19, 22, 22, 54,103,216,176, 97, 51, 91, +181,106,213,255,149, 87, 94, 33,130, 32, 96,205,154, 53, 52, 49, 49,113, 45,199,113,239, 37, 39, 39, 95,191,151,157,164, 82,169, + 46,175, 93,187,182,234,230,205,155, 97,177, 88,176, 96,193, 2, 40, 20,138,203,238,254,158, 82,154, 46, 8,194,202, 86,173, 90, + 13, 62,124,248,240, 42, 74,233, 89,185, 92,254,115,108,108,236,144, 67,135, 14,253, 74, 41,189, 32, 8,194,207, 45, 91,182, 28, +114,236,216,177,117,148,210,211, 21, 72, 94, 86,108,108,108, 54,128, 32,171,181,244, 22,197,216,216, 88, 19,128, 59,110,152, 43, + 59,121, 35, 70,140, 48,143, 24, 49,226,237, 1, 3, 6, 44,253,251,239,191,155,229,228,228,212, 3, 0,111,111,239, 51, 77,155, + 54, 61,246,235,175,191, 94, 42,138, 92, 25, 92,229,157, 16,210,183, 94,189,122,235, 62,254,248, 99,117, 76, 76,140, 80,189,122, +117,220,188,121, 19,103,207,158,181,254,240,195, 15, 5,122,189,190, 55,165, 52,155,157,142,255, 14,246, 38, 66,111,111,239, 98, + 55, 79,246,161,251, 21,105,194, 43, 77,179,228,141, 25,207,243,229,105,186,116, 53, 26,141,198, 49,106,217,157,174, 9,229, 61, +123,212,158, 78,187,166,125,113,195, 92, 81, 87,154, 69,143,233,169,136, 38,220,209,180, 88, 44, 14, 93, 55, 52, 43,244,167,199, +143, 31,255, 1,192, 15,213,171, 87,191, 10,160, 26, 51, 85, 12,198, 63, 96,176, 46, 94,188,216,228,159,252,227, 27, 55,110,228, + 1,248,168,104,121, 32, 36, 38, 38, 94, 7, 48, 32, 40, 40,232,203, 67,135, 14,125, 0, 0,162, 40,206,112,245, 60, 67, 87,156, + 62,125,186,175, 68, 34,153,191,108,217,178, 86,148, 82,120,121,121, 29,186,122,245,234,107, 21,140,130,141, 34,132,140,183,143, + 10, 52, 26,141,163, 8, 33, 19, 40,165, 90,167,245,142,207, 21,132, 2, 48, 82, 74, 67,202, 88,111,172,128,185,114, 68,178, 0, +152,126,253,245,215, 2, 0,167,240,255,121,174, 44, 69,139, 1, 78,205,130, 46, 46,112,127, 17, 66,170,127,240,193, 7,179,120, +158,239,164,213,106, 67,213,106,117,130,213,106,221,165,211,233,222,163,148,102,178, 83,241,223,195,106,181, 38,181,107,215, 78, + 40,237,198,169,188, 11,120,121, 55, 84, 54,155, 45, 49, 54, 54, 22,247,160,153, 84, 78, 82,111,181,108,217,146,115, 87,203,142, +197, 98, 73, 43, 47,157, 45, 91,182, 44,243,166,241, 94,243,222,178,101,203, 10,165,177,168,174, 74,122,208,154, 46,246,103,153, +232,245,250,236, 74,149, 42, 21, 24, 12, 6,137,209,104,148,148,140,216, 43,149,202,116,118,230, 48, 24,247,104,176,254,203, 20, + 25,170, 94, 15, 74,175,168, 63,212,171, 15, 64,199, 80,226,179,182,188,207, 21,228,159,136, 0,137, 0,116, 15,104, 31,102, 0, +120,133,157,114,143, 30,103,207,158,109,254,160, 53,207,159, 63,223,228, 31, 72,103,203, 7,173,121,238,220,185, 38, 79,170,102, +121, 36, 37, 37, 53,103,103, 6,131,113,127,112,108, 23, 48, 24, 12, 6,131,193, 96, 60, 88, 8,128, 82, 71, 2, 84,228, 73,217, +247, 50,154,192,149, 62,211,100,154, 76,147,105, 50, 77,166,201, 52, 31, 63, 77, 87,218, 21,241, 31,143, 52,165, 13,195,125, 80, + 11,128,206, 76,147,105, 50, 77,166,201, 52,153, 38,211,100,154, 79,218,194,154, 8, 25, 12, 6,131,193, 96, 48, 30, 48,204, 96, + 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24,140, 39, 8, 66, 8, 9, 11, 11, +107, 23, 18, 18,210,242, 73,221, 7, 2, 43, 6, 12, 6,131,193, 96, 48, 30, 4, 85,170, 84,241,182,217,108, 47,134,132,132,188, + 86,181,106,213,170, 0, 16, 26, 26,122,150, 82, 58, 87,169, 84,254,124,237,218, 53,211, 19, 99, 50,217,163, 16, 24, 12, 6,131, +193, 96,220, 15, 33, 33, 33, 13, 1,188,166, 84, 42,135, 54,111,222, 92,214,177, 99, 71,248,248,248,192,106,181, 34, 37, 37, 5, +127,253,245, 23, 78,158, 60,153,101,177, 88,230, 91, 44,150,249,233,233,233,169,204, 96, 49, 24, 12, 6,131,193, 96,148, 65,112, +112,240,236,238,221,187,191,229,227,227,131,234,213,171, 35, 40, 40, 8, 70,163, 17,122,189, 30,148, 82, 8,130, 0, 74, 41,242, +243,243,113,252,248,113, 28, 61,122,212,154,151,151,183,138, 16, 50, 55, 57, 57,249, 36, 51, 88, 12, 6,131,193, 96, 48, 24, 37, + 8, 9, 9, 73,221,189,123,119,128,213,106, 69, 70, 70, 6,140, 70, 35,116, 58,157,195, 96,241, 60, 15, 74, 41,172, 86, 43, 0, + 64, 20, 69, 92,184,112, 1,135, 15, 31, 70, 66, 66,194, 87, 41, 41, 41,111, 63,142,251,133,117,114,103, 48, 24, 12, 6,131,113, + 95, 24,141, 70,172, 88,177, 2, 25, 25, 25,168, 92,185, 50, 66, 67, 67,225,237,237, 13,165, 82, 9, 0, 14,115, 5, 0, 28,199, + 33, 38, 38, 6, 67,135, 14, 5, 33,100,200,227,186, 79, 88, 39,119, 6,131,193, 96, 48, 24,247,131,197,100, 50,161, 73,147, 38, +136,143,143, 71, 92, 92, 28, 26, 53,106,132,218,181,107, 35, 35, 35, 3,201,201,201,197, 54, 62,118,236, 24, 78,156, 56,129,182, +109,219, 62,214, 59,133, 53, 17, 50, 24, 12, 6,131,193,184,103, 66, 67, 67,159,175, 84,169,210,130, 97,195,134, 41, 27, 52,104, +128,196,196, 68, 36, 37, 37, 33, 59, 59, 27, 13, 27, 54, 68, 76, 76, 12,174, 95,191,142,109,219,182,225,196,137, 19,144,203,229, + 8, 11, 11,131,102,213, 47,248, 35, 36, 56, 41, 57, 57, 57,140, 25, 44, 6,131,193, 96, 48, 24,140, 18,132,132,132,248, 17, 66, +222, 11, 13, 13,125,125,200,144, 33,146,234,213,171, 35, 49, 49, 17,233,233,233,200,206,206,198,145, 35, 71,236,102, 12, 97, 97, + 97,184,121,243, 38,206,156, 57,163, 55, 26,141,163,147,146,146,150, 51,131,197, 96, 48, 24, 12, 6,131, 81,182,209,170, 12, 96, +122,181,106,213,158,127,238,185,231,184,144,144, 16, 36, 37, 37, 97,247,238,221,168, 86,173, 26, 82, 83, 83,113,252,248,113, 91, + 94, 94,222, 66,155,205,246, 81,106,106,106,250,227,186, 47,254,209, 78,238,132,144,206, 76,147,105, 50, 77,166,201, 52,153, 38, +211,124, 50, 52,147,147,147, 19,146,147,147,135, 95,185,114, 37,102,230,204,153, 27, 23, 44, 88, 0,158,231, 17, 26, 26,138,221, +187,119,211, 93,187,118,173, 45, 40, 40,168,153,156,156, 60,230,113, 54, 87, 0,235,228,206, 96, 48, 24, 12, 6,227, 1,115,231, +206,157,139, 0,250,134,134,134, 54, 63,119,238,220,187, 0, 32,138,226,140, 59,119,238, 28,127, 82,246, 1, 51, 88, 12, 6,131, +193, 96, 48,254, 17,146,146,146,142, 2,232,245, 36,230,157,205,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, + 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24, 79, 20, 4, 64,169, 35, 1, 40,165, 59,221, 22,185,135, 17, 10,174,244,153, 38,211, +100,154, 76,147,105, 50, 77,166,249,248,105,186,210,174,136,255,120,164,161,148,186, 92, 80, 52, 95, 86, 69, 23, 0,157,239,229, +119, 76,147,105, 50, 77,166,201, 52, 31,190,230,189,212,245,165,105, 22,221,188, 19, 20,182,146,112,246,207,143, 90, 58,255, 43, +121,127, 82, 52, 31,183, 69,112,225, 46, 29, 59,137, 16, 34, 2, 16,233, 3,152,153,148, 16, 98, 63, 0, 15, 68,143,241, 15,132, + 54, 11,143, 17,249,191, 15,103,199,137,193,120,140,207,247, 7, 86,215, 59,213, 29,188,211, 69,214, 6,192, 70, 8,193,253,212, + 37,255,196, 53,233, 81,207,251,147,172,249, 95, 71, 40,111, 71, 85,170, 84,105,123, 64, 64, 64,135,140,140, 12,177,232,123,132, +134,134,130,227, 56, 8,130,160,143,143,143,247,172,232, 31, 6, 6, 6,126, 31, 19, 19,243, 98,102,102,166,200,113, 28, 42, 87, +174, 12, 66, 8,120,158, 7,207,243,250,107,215,174,121,254,219, 59,165,113,227,198,217, 38,147, 73, 83,242,123,153, 76,102,136, +139,139,243,120, 18,204,149,191,191,255,179,129,129,129,222, 89, 89, 89, 20, 0,194,194,194,192,243,124, 97,161, 17, 4,235,245, +235,215,151,185,171, 23, 25, 25,121, 76,169, 84,122, 11,130, 0,158,231, 33, 8, 2,180, 90,109,206,133, 11, 23,154, 21,173, 63, +168, 84, 42,253,120,158,183,151, 45, 24, 12,134,204,243,231,207,183,102,151,190,255, 38,107,215,174,229,187,133,190, 84, 77,160, +250,250, 28, 71,189, 68,145,228, 90,137,242,244,182,164,239,175,185,243,251,254,253,251,219,254,229,115,160, 10, 0, 43,165, 52, +249, 30,126,204,149, 82,209,118,183, 1, 3,139, 62, 26, 56, 32,147, 0, 87,106, 2,235,206, 3,250, 18,205, 10,226,195,190,145, +170, 82,165,202,220, 74,149, 42, 13, 47, 40, 40,208,113, 28, 7, 66, 8,141,137,137,177,111, 83,236, 85, 20,197,196,115,231,206, + 53,113,113,145,149, 84,169, 82,229,171, 74,149, 42,189,160,211,233,116,132, 16, 16, 66, 40, 33, 4,245,234,213,187, 75,211,102, +179, 37,158, 61,123,182,201,195, 74,231,191,149,247,186,117,235,150,170, 89, 86,222, 75,211,116, 78, 39, 33, 4, 49, 49, 49,247, +157,206, 71, 81,243,177, 53, 88, 0,184,128,128,128,141,205,154, 53,107,191,105,211, 38,238,226,197,139, 92,116,116, 52,108, 54, + 27, 68,177,240,220,111,212,168,145,170,162,127, 22, 20, 20,244, 83,179,102,205, 6,109,218,180,137,219,184,113, 35,215,180,105, + 83, 16, 66, 96,179,217, 96,179,217,208,169, 83, 39,229,125, 86, 22, 26, 65, 16,198,203,100,178,118, 86,171,181, 54, 0, 72, 36, +146, 11, 70,163,113,175,213,106,253,154, 82, 90,224,142,142,197, 98, 81,157, 59,119,238,174,125,211,172, 89, 51,217,189,166,173, + 70,141, 26,135, 56,142,139, 42,237,164, 45,235,149, 82,122,227,220,185,115,173,202,210,172, 85,171,214, 33,142,227,162,236,219, +151,166, 81,242, 59, 81, 20,111,156, 61,123,182, 85,121,149, 78, 96, 96, 96,191, 86,173, 90,121,253,246,219,111, 36, 33, 33,129, + 40,149, 74,136,162, 8,155,205, 6,139,197,130,142, 29, 59, 86,104,254, 52,149, 74,229,185,107,215,174,106, 1, 1, 1, 72, 75, + 75, 67,102,102, 38, 70,142, 28,121,197,190, 94,169, 84,250,253,245,215, 95, 53,124,125,125,161,211,233,144,155,155,139, 33, 67, +134,252,231, 79,174,174,109,171,126, 76, 0, 95,251,103,155,136,172,157, 7,174,191,127,191,186,181,106,213, 58, 33,147,201, 2, +203, 58,230,165, 29,123,147,201,148,122,238,220,185, 70, 46,206,159, 8, 0,189,120,158,175, 46, 8, 66, 45, 0, 17, 86,171, 53, + 16, 0,164, 82,105, 42,207,243, 55, 45, 22,203, 37,147,201,116, 21,192,102, 74,233,205,178,180,186,133,190, 84,141, 88,117,253, +243,141, 98, 15, 85,213, 79,107,234,174, 79,185,172,146,235,182,116, 11,125,105,173,187, 38,235, 95, 52, 87,145, 33, 33, 33, 95, + 20,189,159, 72, 41,141,191, 95, 77, 27, 48,144, 82,234, 5, 0,185,185,185, 94, 9, 9, 9, 65,155, 55,111,142,153, 53,107, 86, + 71,153,193,240,185, 9,184, 88,222,239,187,180,171,118, 92,224, 72, 24,138, 98, 0, 86, 42, 38,238,216,123,253, 65, 92,152,184, +208,208,208,185,221,186,117, 27,182,112,225, 66,213,209,163, 71, 85,117,235,214, 5,207,243,246,250, 2, 37, 3, 15, 45, 90,180, + 40,119,247, 1, 16, 66, 66, 66,230, 60,245,212, 83,131,231,207,159,175,186,116,233,146, 42, 50, 50, 18, 69, 23,219, 98,101,211, +254, 93,195,134, 13, 31,118, 58,255,209,188,119,239,222,125,240,130, 5, 11, 84,103,206,156, 81, 85,175, 94, 29, 28,199,129,227, +184,187,244, 56,142, 67,147, 38, 77,220,210,236,218,181,235,224, 69,139, 22,169, 78,156, 56,161,170, 85,171,150, 99,223, 57, 53, +207, 85, 56,157,143,184,230,227,103,176, 8, 33, 92,165, 74,149, 86, 52,105,210,164,219,166, 77,155,120, 0, 56,113,226, 4,178, +178,178, 16, 26, 26, 10,141, 70, 3,185, 92, 14,131,193, 80,161,112, 95, 96, 96,224,247, 69,230, 74, 2, 0,235,134,246,197, 13, + 9, 48, 54,205, 4,169, 84,138,235,215,175,131,231,249,251, 9, 29,183,245,244,244, 92,190,126,253,122,159, 70,141, 26,113, 25, + 25, 25,136,140,140, 68, 86, 86, 86,179,125,251,246, 53,126,233,165,151, 94, 34,132, 60, 79, 41,221,231,174,230,150, 45, 91,160, + 86,171,161, 82,169,160, 86,171, 97, 54,155,201,189,166,143,231,249,176,163, 71,143, 6,104, 52, 26,136,162,232, 88, 74,180, 95, + 59, 16, 69, 17,109,219,182, 53,151,123,240, 4, 33,236,232,209,163, 1, 74,165, 18,148,210, 98,122, 54,155, 13,114,185,220,249, + 14, 17, 54,155, 13, 45, 91,182, 52,187,138, 92,217,205, 21, 0,172, 90,181, 10, 65, 65, 65, 8, 8, 8,128, 90,173,134, 82,169, +188,151,188,195,207,207, 15,175,191,254, 58, 6, 14, 28,136,149, 43, 87, 66, 34,145, 56,231, 3,190,190,190,216,186,117, 43, 60, + 61, 61, 17, 30, 30, 94,108,253,127, 54, 18, 8,248,110,219,119,221, 17,145,237,223,179,129,208, 57, 54,106,190,163,114, 45,220, +136,138,133,219, 82,209,102,203,222,117,240,214, 84,151, 87, 5,142, 11, 57,122,244,104,128, 92, 46,119,239,226,110,179,161, 81, +163, 70,188,139,243,167, 71, 76, 76,204,186,215, 94,123, 77, 90,189,122,117, 34,149, 74, 33, 8, 2, 4, 65,176,151,199,112, 74, +105,184, 40,138,237, 83, 83, 83,233, 55,223,124,243, 57, 33,228, 25, 74,233,150, 82,203, 38,213,215,207, 55,138, 61,246,159, 68, +179,254,157, 39, 99,235,154, 41,205, 98, 27,138,240, 80,233,175, 1,120,100, 13, 22, 33,196, 83,169, 84,126,176,102,205, 26, 41, + 0,116,238,220,249, 3, 66,200,155,148,210,188, 7,245, 31, 94, 94, 94,240,242,242, 66,221,186,117,241,236,179,207,122, 55,108, +216,112, 66,123,163,113,212, 30,160,204,115, 83,224,184,176, 63,255,186, 18, 96,255, 60,184,111, 99,105,183,246,213, 82, 11,111, +196, 74,110, 77, 33,218,104,226,206, 3, 55,154,184,200, 43, 23, 20, 20,244,101,247,238,221, 7, 44, 92,184,208, 3, 0,190,255, +254,123, 60,253,244,211, 8, 12, 12,132, 82,169,132, 76, 38,131, 68, 34,129, 84, 42,117,188,186,136, 8,241, 65, 65, 65,159, 63, +253,244,211,253,231,207,159,239, 1, 0, 63,253,244, 19,122,246,236, 9, 63, 63, 63,120,122,122, 66, 46,151, 67, 38,147, 65, 42, +149, 22, 51, 92, 21, 73,231,203, 93, 59,162,170, 82,142,158, 31,127, 14, 31, 31, 31,236,122,251, 53, 72, 56, 14, 99,182,237,131, +135,135, 71,185,233, 44, 75, 51, 46, 46, 14,105,105,105,165,230,157, 16, 82,110,221,231,156,247, 30, 61,122,244, 95,176, 96,129, + 35,239,221,186,117,131,159,159, 31, 60, 60, 60, 32,151,203, 33,149, 74,139, 45,101,237, 3,103,205,238,221,187,247, 95,180,104, +145, 7, 0, 44, 91,182, 12,157, 59,119,134,143,143, 15, 60, 60, 60, 28,251,178,162,199,232, 81,214,124, 44, 13,150,189,111, 84, + 64, 64,192,128,223,127,255,157,115,190, 0,202,229,114,199,137, 33,147,201,192,113, 92, 69, 42, 45, 18, 19, 19,243,226,166, 77, +155, 28, 63, 50,149,168, 20,228,114,121,133, 52, 75,232,119,238,208,161,195, 47,191,255,254,187, 66, 42,149, 66,175,215,227,220, +185,115,240,242,242,130, 76, 38, 67,159, 62,125,248,214,173, 91,251,181,111,223,254, 55, 66,200, 96,119, 70, 40, 80, 74,161,209, +104,138, 25,172,251,105, 66,182,159,160,155, 54,109, 2,207,243,197, 10,153,253,213,249,125, 64, 64,128, 91,186,114,185, 28,135, + 14, 29, 2,207,243,144, 72, 36, 16, 4, 1, 18,137, 4,127,252,241, 7,222,126,251,109,100,100,100,128, 16, 2,137, 68, 2, 15, + 15,151,173,155, 36, 48, 48,208,219,110,174,138, 34,128, 80, 42,149,144, 72, 36, 68, 16, 4, 98,111,198, 35,132, 16,119,219,212, + 5, 65,192,205,155, 55, 49,116,232, 80, 44, 91,182, 12, 51,102,204,192,224,193,131,139,173,207,203,203,131,143,143, 15,124,124, +124,160, 80, 40,238,185, 44, 60, 74,136, 37,246,206, 71, 51,191, 80, 65,164, 40,236,228, 33, 2, 34, 64, 65, 33, 82, 17,169, 73, +215, 48,251,203,121,188,187,101, 73, 46,151,227,224,193,131, 14, 19, 36, 8, 2, 8, 33,112, 54, 70,246, 37, 40, 40,200,165,166, + 84, 42,157,190, 97,195, 6,217,202,149, 43,177,122,245,106,199,127,168,213,106,120,123,123,195,207,207,207,177,132,133,133,145, + 31,126,248, 65, 90,191,126,253,233, 0,182,148,110, 2,169,151,170,234,167, 53,251,119,158, 92,104, 46, 39, 83,100, 95,153,217, +128,203,153,234,245, 8,155, 43, 1,192, 59,223,126,251,173, 95,227,198,141, 1, 0,223,126,251,173,223,136, 17, 35,222, 33,132, +188, 79, 41,181,222,243, 13, 22,176,154, 16, 50,176, 40, 98,171,232,210,165,139,236,187,239,190, 67,173, 90,181, 48,110,220, 56, +223,217,159,127,222, 11,192,111,101,151,165,226,133,233,211, 47,230,122, 83, 90, 88,126,168, 72,139,189,102,165,221,196, 7, 31, +124,236,178, 78, 6,192,133,132,132,188,180,120,241, 98, 71,119, 8, 31, 31,159, 82,235, 38,137, 68,226, 88,202, 49, 69,164, 40, + 42, 52, 98,225,194,133, 14, 77,127,127,127, 72,165,210, 98, 23,216, 91, 23, 79, 97,203,210, 79,160,246, 13,194,208,137,159, 85, + 56,157, 97,114, 25,194,148, 50, 52,104,208, 0, 42,149, 10,113,146,194, 75,153,135,135,135,203,116,150,165,233, 92, 47, 3,128, + 78,167,115, 68,237, 77, 38, 19,154, 52,105,226, 86,222, 23, 45, 90,228,208,244,243,243,115,228,221,158, 46,231,186,222,126, 3, + 83,158,102, 72, 72,200,136, 37, 75,150, 56, 52,125,125,125,139,105, 72, 36, 18, 44, 95,190,252,174, 58,226,126, 53, 43,122,220, + 75,106,222,188,121, 19,179,102,205,114,212, 73,246, 40,158,189,171,209,188,121,243,220, 50,216,143, 85, 4, 11, 0,201,200,200, + 16, 47, 94,188,200,197,197,197, 65, 34,145, 32, 32, 32, 0, 77,155, 54, 5, 0,152,205,102,251, 69,151,212,170, 85, 43,149,227, + 56,216, 47,186, 28,199,193,106,181, 58,218,147,157,140, 12,151,149,149, 37,238,216,177,131, 91,241, 76, 87,152, 40,208,240,131, + 79,208,173,103, 79,108, 11,149,129, 7,208,236, 98, 6,100, 50,153, 16, 28, 28,108,177, 31, 4,187,182,115,223,172,146,230,136, + 16,226,161, 86,171,127,216,188,121,179,130,227, 56,228,231,231, 67, 20, 69,180,110,221, 26, 28,199,225,236,217,179,120,239,189, +247,176,110,221, 58,108,216,176, 65,217,168, 81,163, 31, 8, 33,181, 41,165,249, 78,102,106,103,105,133,211,195,195, 3, 42,149, +202, 97,176,236,121, 46,106, 83, 47,217, 36,147,116,238,220,185,198,101,105,218, 35, 9,125,251,246,117,244, 57,179,155,161,146, +175, 82,169, 20,103,207,158, 45,205,244,221,165, 41,138, 34,218,180,105, 99,111,138,131, 70,163,193,158, 61,123, 28,235, 27, 54, +108, 8,147,201, 4,127,127,127, 92,184,112,193,165,102,122,122, 58, 77, 78, 78, 38, 43, 86,172,128, 68, 34,129,159,159, 31, 84, + 42, 21,249,237,183,223,222, 81, 40, 20, 97, 70,163, 81,180, 88, 44, 8, 11, 11,155, 23, 30, 30,110, 63, 70,218,107,215,174,249, +149,165,201,243, 60, 20, 10, 5,126,250,233, 39,204,154, 53, 11,239,190,251,110,177, 19,139,231,121, 24, 12, 6,248,251,251, 59, + 76, 86,201, 19,239,159, 24,182,251, 79,107, 82, 80,156, 59,177, 13,231,207,236,132,104, 19, 97, 19, 41, 40,181, 65,180, 2,113, + 59,142,212, 72,185,145, 28, 74, 65,129,162, 30, 55,150, 2,173,181,189,191,188, 22,128,141,123, 50,140,115, 92,165, 83, 16, 4, + 88, 44, 22,108,222,188, 25,215,174, 93,195,246,237,219,161,215,235, 29,251,177,101,203,150, 24, 49, 98, 4,130,130,130, 92,238, + 79, 74,233, 79, 9, 9, 9, 13,219,180,105, 67,114,114,114,144,147,147, 3,189, 94, 15,155,205, 6,171,213, 10, 65, 16,160, 80, + 40,160, 84, 42, 17, 24, 24, 8,131,193, 64,141, 70,227, 79,101,105,138, 34,201,213, 93,159,114,121,235,154, 41,205,250, 79,166, + 88,251, 25, 65,141, 8,185,110,239, 41,239, 17, 91,142,190,211,133, 80,142, 2,133, 89,231, 8,168,205,102,203,120,117,236,167, + 99, 30,246, 49, 42,193,168,241,227,199,215,118,110,158, 30, 50,100, 8,206,157, 59, 87,251,235,175,191, 30, 5,224,219,138,106, +250, 0,161, 0, 96, 5,182,162,112,193, 90,189,158, 12,218,184,177, 47,128, 23, 54,108,216,128,193,131, 7,227,203,207, 63,175, + 91,210, 96, 21, 43, 75,148,226,230,149,253,184,121,245, 0, 68,145, 58, 69,193, 75,127, 79,221, 75, 39, 41, 40, 40, 48, 28, 61, +122, 84,179,108,217, 50,120,123,123, 35, 42, 42,202,209, 74, 81,242, 2,107,255,236,170, 44,233,116, 58,195,197,139, 23, 53,191, +252,242, 11,124,125,125, 17, 30, 30, 14,149, 74,229,208,148,201,100, 56,178,109, 61, 70, 13,237,129,140,155,231, 49,247,205, 1, +110,167,243,229, 46, 29, 81, 89, 33, 67,223, 25,159, 34, 58, 58, 26,107, 7,246, 6, 71,128,209,187,143, 64, 42,149, 98, 89,143, +182,144,201,101, 24,189,251,111, 87,233,116,104, 30, 63,126, 28,162, 40, 34, 34, 34, 2, 58,157, 14,158,158,158, 80, 40, 20,144, + 72, 36,216,177, 99, 7,250,244,233,131,149, 43, 87,162,101,203,150, 46,243, 94, 80, 80, 96, 56,115,230,140,230,231,159,127,134, +175,175, 47, 42, 87,174, 12,149, 74,229, 8, 76,216,141, 22,207,243,136,138,138, 66,110,110, 46,170, 86,173, 90,174,166, 86,171, + 53,196,197,197,105,126,254,249,103,248,248,248, 32, 44, 44,204, 17, 97,179,155,162,105,211,166, 21,211,104,208,160,193,125,107, + 86,244,184,151,212,236,219,183, 47,170, 85,171, 6, 79, 79, 79,168,213,106,135,118,121,154,143,181,193,162,148,210,162, 81, 20, +136,142,142, 70, 86, 86, 22,228,114, 57,154, 54,109,138,140,140, 12,104, 52, 26, 72,165, 82, 80, 74, 49,112,224, 64,126,226,196, +137, 1, 69,166,202, 81,225,151,209,150, 46,114, 28,135, 86,173, 90,225, 92, 81,203, 79,183,158, 61, 17, 22, 22, 6,123, 39, 14, +133, 66,129,193,131, 7,147,183,223,126, 91,176, 71, 47, 40,165,208,235,245,168, 95,191,190,178,156,232,200,155,191,253,246,155, +151, 76, 38, 67,126,126,190,163,137,140,231,121, 92,188,120, 17, 95,126,249, 37, 94,120,225, 5,220,190,125, 27, 33, 33, 33,152, + 48, 97,130,230,211, 79, 63,125, 19,192, 71,174,118,142, 70,163,113,152, 43,149, 74,133, 97,195,134, 9,173, 91,183, 14,208,104, + 52,240,240,240,128,189,185,207,102,179,161, 85,171, 86,196, 85,212, 65, 20, 69,108,219,182, 13,130, 32,184,140, 96, 21,181, 89, +187,165,121,244,232, 81,135, 57,115,190, 43, 34,132,224,220,185,115, 14, 51, 87, 84,152,203,211,164, 60,207, 67,173, 86, 35, 40, + 40, 8, 74,165, 18, 42,149,138,108,218,180,233,253,136,136,136,224,215, 94,123,141,203,203,203,227,154, 52,105,130, 30, 61,122, + 8,162, 40,194,108, 54,163, 99,199,142,229,238, 71,137, 68,130, 99,199,142,225,211, 79, 63,197,228,201,147,177,104,209, 34,116, +238,220,185,152, 81, 32,132,160, 82,165, 74,240,244,244,124,124,206, 46, 17, 48, 91, 45,208, 21,232, 29, 77,184, 54,155, 13,103, +246,156,170,113,227,212,149,152,223,127, 89, 41, 1, 0,195,158,245,206,191, 10,126,118,254,175, 53,219,251, 74,143,238,201, 50, + 31,117,209, 84,136,113,227,198, 97,234,212,169, 24, 56,112, 32,118,236,216,129,247,222,123, 15, 47,189,244, 82,177, 8,150, 59, + 88, 44,150,197,207, 63,255,252,200,181,107,215,214,154, 60,121, 50,103,143, 96,169, 84, 42, 16, 66, 96, 48, 24, 96, 52, 26,161, +215,235,113,233,210, 37,241,149, 87, 94,185,108, 50,153, 22,151,165,103, 37,202,211, 42,185,110, 75,245, 42,124, 53,109,252, 23, + 30,109,154, 71,232,137,178,113,238,211,213, 59,211,206,131, 35,124, 64, 41,168, 88, 24,229, 51, 26,181,120,103,210, 4,254,223, + 60, 84,132,144, 30, 93,186,116,233, 58,115,230,204,187,214,205,156, 57, 19, 23, 46, 92,232, 74, 8,185, 89, 86,147,104,105,120, + 3, 97,138,160,160,175, 0,192,251,206,157,183,114,128, 68, 0, 24, 4,116,179, 1,189,119,236,216, 1, 0,168, 82,165, 10, 68, +160, 14, 1,126,226,129,213,214,210,162,130,148,194, 98,177, 66,175, 55,150,107,172,236,159, 93, 5,151,237,117, 61,207,243,168, + 91,183, 46,186,117,235, 6,169, 84, 10, 15, 15, 15, 71,115, 78,105, 81, 12, 23, 77,247, 20,128, 72, 8, 65, 84, 84, 20,186,118, +237, 10,169, 84, 10,181, 90,237, 48, 45, 50,153, 12, 60,207,163, 94,235, 78, 88,185,124, 38, 94,236,217, 8, 47,196, 6, 98,221, +153, 76,183,210, 25,161,148, 33, 92, 37, 71,116,116, 52, 60, 60, 60, 64, 8, 32,240,255,175, 79, 85, 42, 37,100,114, 89,185,233, + 44,169,153,154,154,138,248,248,120,196,199,199,131,227, 56,180,105,211,198, 17,117,185,122,245, 42, 62,250,232, 35, 24,141, 70, +183,242,206,113, 28,170, 87,175,142,142, 29, 59, 66, 38,147, 65,165, 82, 21,107, 26,180,239,211,252,252,124, 84,171, 86, 13, 27, + 55,110, 68,219,182,109, 93,106, 70, 71, 71,163, 93,187,118,144, 74,165,142, 27,105,165, 82,233,184,110, 20,153, 59,199,127, 52, +106,212,168, 66,154,219,143,221,198,210, 29,127,193,104, 18,145,167,179, 20,251, 65,176,191, 39, 14,252, 60,217,173,188,219, 53, +151, 44, 89,130,156,156, 28, 71, 29,100, 15,192,216,131, 39,149, 43, 87,198,130, 5, 11,158,172, 38, 66,251,101,193,238, 42, 67, + 67, 67, 97,239,231,161,209,104, 32,147,253,191,143,183,213,106,197,186,117,235, 16, 16, 16,224, 88,188,188,188,202, 44,208, 85, +170, 84, 1,165, 20,227,210, 11,187, 25,108, 13,145,226, 38,128,167,211,169, 35,186, 99,179,217,240,219,111,191,193,217,192,120, +120,120,148,219, 92, 36,147,201,218, 55,109,218,148, 51, 26,141,119,153,171, 79, 63,253, 20,131, 7, 15, 70,205,154, 53, 33,138, + 34, 10, 10, 10,208,161, 67, 7,201,188,121,243,218, 87,196, 96,169, 84,133,253,249, 77, 38, 19,246,236,217, 3, 31, 31, 31,248, +249,249,193,215,215, 23, 30, 30, 30, 80, 40, 20, 32,132,184,108, 46,163,148,162,111,223,190,142, 66,231, 28,181, 42,105,182, 14, + 29, 58,228, 86, 51, 25,165, 20,205,155, 55,135, 90,173,134, 70,163,129, 70,163,193,182,109,219, 28,235,155, 53,107, 6, 81, 20, + 17, 16, 16,128,195,135, 15,187,172,116,195,194,194, 28,219, 75, 36, 18,242,219,111,191,189, 19, 25, 25, 25, 60,122,244,104,142, +231,121,156, 56,113, 2,231,207,159, 71, 80, 80,144,163, 79,150,171,116,106,181,218,148,121,243,230,217,190,251,238, 59, 0, 64, +199,142, 29,145,155,155,155,230,180, 62,115,232,208,161,142, 81,138, 0,144,149,149,149,249, 24,248, 43, 88,205, 86,232, 12, 6, + 20,228,235, 28,209,160,180,228, 84,239,201,111,143,151,124, 57,102, 56, 0,224,237, 57,223, 34,127,209,255, 43,176,245,111, 15, + 10,120,102,246,234, 41, 0,250,148,167,175,211,233, 96, 52, 26, 17, 30, 30,142, 99,199,142, 33, 63, 63, 31,157, 59,119, 46, 22, + 33,117,222,167, 46,142,189,137, 16,210,186,103,207,158,127,127,253,245,215, 85,107,215,174, 77,180, 90, 45,116, 58, 29,156, 95, +207,156, 57, 67, 87,173, 90,117, 67,167,211,181,162,148,154,202,210,219,150,244,253,181,110,161, 47,173,221,119, 90,214,211, 63, +234,178,103, 82,118, 85,107,102,146, 92,155,167,191,100,176,209,243,160, 54,192, 6, 17,212, 42,194, 6,138,127,115,252, 54, 33, + 36,172, 70,141, 26,175,174, 92,185,178,212,253,197,243, 60, 86,174, 92,137, 54,109,218,188, 74, 8,185, 88, 94,231,126, 59, 45, + 1,153, 65, 34,153,188,249,215, 95, 11,251,114,117,236, 56,185,165,197,242,246, 97,192, 84,167, 94,189,126,135, 14, 29,242,178, +215, 43, 94, 94, 94,160,148,242, 58,157,206,171, 85,171, 86,253, 74,107,118,165, 34, 96,177, 88,160,215, 27,145,155,155, 15,147, +217, 82, 84,103,138,176,217,172, 69,175, 34,172, 69,245,168, 68,224, 61,218,183,172, 82, 80,104,180, 72,206,222, 35,183, 43,151, + 81,215, 83, 66, 8, 2, 3, 3, 33,149, 74,139, 69,153,220,137, 94,149,130,205, 94, 23,250,249,249, 65, 38,147,225,244,158,223, +145,118,225, 0,164,132, 66,180, 89, 32, 90,205,176, 89,205,224, 57, 30,151,174, 39, 35, 58,216,229,216, 33, 71, 58,187,125, 48, + 3, 45, 90,180,192,218,129,189, 65, 8,240,218,238, 35,144, 72, 36,248,185,111, 39,200,101, 82,188,178,227,136,187,233, 44,150, +247,227,199,143, 99,220,184,113,248,236,179,207,160, 84, 42,237, 45, 39,184,120,241, 34,126,253,245, 87,116,233,210,197,237,188, + 19, 66, 28,121, 23, 4, 1, 83,166, 76, 65,114,114, 50,230,204,153,131,198,141, 27, 67, 34,145, 32, 39, 39, 7,173, 90,181, 66, +106,106,170,219,251,211,222,140, 39,147,201,138, 69,155,236,198,239, 94,142,145, 93,115,120,223, 96,108, 58,184, 10, 4, 4, 71, +126, 30, 95,236, 90,180, 96,245,254, 10,107, 78,157, 58,181, 88, 58,159,196,232, 85,169, 6,139, 82, 74, 67, 67, 67, 33,138, 98, + 49, 83, 85,178, 67,173, 61,228,231, 28, 82, 44,183, 15, 2,207, 67, 20, 69, 71, 97,224, 75, 89,127,248,240,225,187, 76,192,210, +165, 75,203,189,128, 91,173,214,218, 30, 30, 30,197,162, 87, 82,169, 20, 83,166, 76,193,176, 97,195, 28,230, 74, 42,149, 98,217, +178,101,104,210,164, 9, 76, 38, 83,237,242,210, 42,149, 74,117,245,234,213,227,236, 81, 32,165, 82, 73, 6, 15, 30,204, 91,173, + 86,199, 62,177, 47,246,190,105,174, 76,134, 61,218,180,125,251,118,183, 34, 88,238,246, 65,162,148,226,212,169, 83,197, 76,155, +125, 20, 12, 0,156, 58,117,202,209, 63,203, 93, 77,155,205, 6,165, 82, 73,164, 82, 41, 81, 40, 20, 97,118,115,197,243,188,227, +120, 59,247,201,115,117,162,156, 62,125,186, 67,121,235,207,156, 57,243, 88, 78,199, 32, 66,132,217, 98,129, 94,103, 66,126,129, + 30,211, 63,249,177,112,197,116, 28, 5,112,180,245,168,113,120,173, 91,151,142, 0, 42, 85,208, 16,192,126, 1,251,237,183,223, + 32,145, 72,176,113,227, 70,120,122,122,162,119,239,222,240,244,244,196,228,201,147, 49,112,224, 64,183, 35, 88, 69,101, 41,151, + 16,210,250,205, 55,223,252,251,139, 47,190,168, 82,185,114,101,152, 76, 38,152,205,102,152, 76, 38, 92,187,118, 13,171, 86,173, + 74,208,233,116,173, 41,165,185,174,244,182, 37,125,127,237,247,195,239, 36,199, 62,251,172,254, 98,234, 86,220,185,147, 9,171, + 53, 9,162,205, 10,179,181,112, 68,178,205,106,133,213,106,131,192,115,158, 11,190,158,184,163,176,195, 63, 49,245,239,223,255, +169,135,120,168,232,149, 43, 87, 50, 43, 85,170,100,175,196, 60, 77, 38, 19, 41,186,129,163, 0,236, 29,220,181, 40,167, 35,186, + 51,199,128,145, 95,126,246, 89,152,189,249,254,147,207, 62, 11,155,240,214, 91, 35, 1,204,187,112,230,204,202,225,195,135,191, +185,102,205,154, 98,191, 25, 62,124, 56, 46,156, 57,179,178,244, 16, 65, 81, 4,203, 96, 64,122,102, 54, 94, 30,245,190, 35,116, + 0, 80, 56, 59, 84, 90,248, 89, 1, 0, 25,169,215, 48,118,220,219,242,178,110,168,234,212,169, 3, 81, 20,139, 69, 67,238,161, +239,149,115,100,200,177,157,167,167, 39,164, 82, 41,174, 29,250, 29,111,141, 26, 0,216,204,160, 22, 61, 96,214, 1,230, 2,136, + 38, 29,136, 84, 9, 88,244, 46,117,237,233,244,244,244, 44,236, 19, 42,240,144, 73,255,111,254,156, 35, 87,238, 92,184, 75,230, +253,230,205,155,120,237,181,215, 96, 54,155,209,183,111, 95,152, 76, 38, 24, 12, 6,232,245,122, 68, 69, 69, 65,167,211,185,157, +119,251,181, 83, 42,149, 98,252,248,241,104,210,164, 9, 62,250,232, 35, 76,154, 52, 9, 81, 81, 81, 24, 61,122, 52, 86,173, 90, +133,152,152,152,114,117,237,154,133, 77,238,133,154,246,252,150,108,202,179,183, 20,184,123,140, 74,211,180,207, 46, 82,242,184, +191,241,124,167, 10,107,126,250,233,167, 72, 79, 79,191, 43,114,101,127, 31, 26, 26,138,249,243,231, 63,145, 17, 44,199,112, 82, +251, 5,212,126, 33,119,174,220, 85, 42, 21,214,173, 91, 87,172,115, 93,121, 97,105,142,227, 32,138, 34,182, 84, 42,252,125,143, +162,200,149,243,231, 94,189,122, 33, 50, 50,178, 88,244, 74,169, 84,150, 91,104, 68, 81,196,173, 91,183,112,238,220, 57,180,104, +209, 2,185,185,185,144,112, 28,222, 62,115, 6,117,158,127, 30, 38,169, 20,162, 40, 66, 38,147, 97,228,200,145,110,117, 84,255, +251,239,191,125,156, 63,215,169, 83, 39, 49, 54, 54, 54,244,216,177, 99,142,142,239, 69,205,103, 14,163,225,230, 73,141,126,253, +250, 21,139, 90, 57,155, 43,231,101,235,214,173,110, 53, 17, 82, 74, 17, 27, 27,235,136, 94,121,120,120, 96,195,134, 13,142,245, +246,240,115, 96, 96,160, 91,154,246, 59,248,162,142,237, 48, 26,141, 98,126,126, 62, 23, 23, 23, 7,153, 76,230, 56, 38, 74,165, + 18, 10,133,226,190, 6, 39, 60,246,216, 68,152, 44, 22,232,245,122, 20, 20, 20,206, 16,114,237,108,241,126,204,102,227,189, 15, + 78,179, 71,169,242,243,243,177,107,215, 46,172, 95,191, 30,141, 27, 55,190,171,147,187,243,121,235, 70, 25, 77, 39,132,180,153, + 56,113,226,145,143, 63,254, 56,196,215,215, 23,102,179, 25,183,111,223,198, 15, 63,252,144,172,211,233,218, 80, 74,211, 43,224, +218, 96,177, 88, 97,208, 25,145,155,151,143,105, 51,151,149, 89, 69, 0, 64, 86,218, 37, 12, 30, 60, 68,246, 48, 15, 19,165, 52, + 9,192, 75, 78,231,213, 10, 0,246,112,124, 30,165,116, 88, 69,244, 36, 64,251,103,251,247,239, 56,126,252,120,199,119,227,199, +143,199,145, 35, 71, 58, 74,214,174, 61,103, 1,246,240,107,215,198,124,253,245,215,142,109,190,254,250,107,172, 91,187,118,183, + 13,216, 83, 86,221, 97,111, 34, 44, 40,208,195,211, 59, 24, 73,241,123, 93,166, 69,202, 27, 64, 69,209,229,141, 95,201,126, 55, + 37,235,167, 10,148, 31, 90,175, 94, 61,123,235, 2,164, 82, 41,234,118,236,143,217,115, 23, 67,206, 81, 60,219,185, 46, 42, 41, +108,128,210, 23,210,182,147, 65,188,195,139,110, 58, 26,186,117,131,186,239,253, 9,184,161, 86,224,149,237, 7, 32,149, 74,241, +219,192, 30,144,203,165,120,225,247,125,144, 74,165,248,125,196, 51,144,202,164,232,182,240, 87,183,110, 84,236,121,191,118,237, + 26, 14, 29, 58,132,232,232,104, 92,189,122, 21,206,253,108, 41,165,110,155,182,186,117,235, 58, 2, 18, 18,137, 4,119,238,220, + 65,207,158, 61, 29, 55,248,123,247,238,197,196,137, 19, 49, 98,196, 8,180,111,223,190,212,126,177, 37, 53, 99, 98, 98, 28,129, +131,146, 38,216,185,217,182, 34,199,168, 52, 77, 71,249,189,199,227,238,172,249,241,199, 31,151,106,214, 43,162,249, 88, 27, 44, +251, 9, 82, 86,187,179, 90,173,198,235,175,191,142,169, 83,167,194,223,223,223,101,223, 25,187,115, 45,143,205,155, 55,223,245, +221,198,141, 27, 93, 53, 17, 94,244,242,242,106,210,161, 67, 7,228,230,230, 34, 33, 33, 1,106,181, 26,117,102,207,198,153,215, + 94, 67,131,133, 11,193,117,236, 8, 66, 8,100, 50, 25,206,156, 57, 3,165, 82,121,177,162, 17, 3, 15, 15, 15,248,248,248, 56, +218,212,237, 70,203,201, 96, 81,119,204,208,150, 45, 91, 74, 29,161,115, 47,125,176,236, 21,239,145, 35, 71,138,245,191,114,110, +230, 56,114,228,136, 35,130, 85,180, 61,113,117,156,138,238,234,168, 93, 79,165, 82,193,215,215, 23,114,185,220, 97,172,236,230, +202, 29,115,233,106, 34,209,136,136,136, 98, 19,145, 74, 36,146, 98, 19,145,254,215,155, 8,245,122, 3, 10,242,245, 15,178, 73, +171,208,156, 21, 13, 56, 89,183,110, 29,154, 55,111,126,151,185,178, 71, 29,239,193,112, 36, 18, 66,218,207,157, 59,247,232, 87, + 95,125,229, 83, 80, 80,128, 31,127,252, 49,183,160,160,160, 61,165, 52,177, 66, 90, 0, 44,102, 51,116, 6, 35,180, 5,133,251, +224,250,185,223, 92,154,178,255, 50,181,235,213, 27,250,227,143, 63,222,245,253,143, 63,254,136,171, 87,175, 14,197,153, 51,123, +154, 1,139,222,153, 60,185,122,227,198,141,195, 0,224,157,201,147, 19,155, 1,139,202, 59,207,205, 69, 77,132, 5, 5,133, 81, + 15,131, 54,227,193,148,211, 34,147, 81, 86,159,171,123,185, 32,218,235, 91,169, 84,138,174, 3, 95, 70,242,141, 75,136, 86,103, +160,146,183, 10, 52, 47, 9,210,142, 31,226, 76,150, 10,115, 22,110,171, 80, 58,213,114, 25, 20, 10,185, 83,159, 43, 5,100, 10, +185, 35,157, 10,165, 18, 18,185,172,194,121,191,124,249, 50,148, 74, 37,108, 54,219, 93,215,155,138,230,223,217,184,124,253,245, +215,152, 56,113, 34,150, 45, 91,134, 51,103,206,160, 65,131, 6,232,220,185, 51,210,210,210,112,250,244,105, 24,141, 70,183,211, +233,220, 47,238,252,249,243,248,243,207, 63, 17, 31, 31,143,132,132,132,123, 62,238,206,154, 37, 13,214,186,157, 39,209,175, 75, +163,123,210,156, 54,109, 26,210,210,210,138, 69,174,156,163,155, 79,116, 4,203,222,196,228,116, 81,190, 43, 74,165, 86,171, 29, + 29, 34, 61, 61, 61, 93, 70,134,236, 6, 43,246, 70,126,177,190, 92,246, 72, 22, 0,140, 24, 49,226,174, 8, 86,201,201,233, 74, + 98, 52, 26,247,238,221,187,183, 97,175, 94,189,248,139, 23, 47, 58,154, 34, 77, 45, 91,162,193,194,133, 56, 59,126, 60,218,221, +188, 9,131,217, 12,133, 66,129,109,219,182,153,117, 58,221,222, 10, 86, 22,196,217, 96,169,213,106,120,121,121, 57, 12, 70, 69, + 92,121, 89,119,136,206,159, 43, 18, 17,178,247, 57,179, 47,246, 11, 43, 33, 4,122,189,222,209, 89,179, 34, 81, 17,155,205,230, + 56,241,236, 29, 20,189,189,189, 29,149,134,125, 52,153,187,205,163,174, 38, 18, 85, 40, 20,158,251,247,239,175,102,159, 70, 34, + 35, 35, 3, 3, 7, 14,188,242, 95, 63,185, 40, 40,204, 86, 27, 10,244, 6, 20,232,117, 15, 92,127,229,202,149,184,118,237, 26, +204,102, 51, 62,249,228,147,187,140, 85, 69, 58,185,151, 82,174,174, 53,106,212, 72,236,222,189, 59,142, 28, 57, 2,185, 92,110, +161,148, 86,120,254, 42, 42,138, 48, 91,173, 48,232,245, 40,208,106,159,136,187,214,243,103,206,252,166, 86,171, 7, 2,208,228, +228,228,240, 94, 94, 94, 80,169, 84,208,235,245,185,124,209, 72,193,195,128,201,219, 98,249,108,192,128, 1, 95, 1,128,194, 98, +249,236, 48, 96, 42,239, 60,183, 88,139,204,250, 3,220,143,246,122,171,172, 58,233, 94,162,211,246, 11,169, 84, 42,133,192,243, +248,113,214, 4, 68,171,211,209, 40,210, 3,198,212,171,144,121,248,131,120, 71, 96,206,194,109,184,112, 51,171, 66,233, 28,180, +124, 45, 42, 87,174,140, 77,207,247,134, 66,174,192,160,117,187, 32,145, 72,176,125,244, 64, 72,101, 50,116,254,238,231,123,202, +187, 86,171, 45, 51, 82,229,110, 4,171,100,222, 37, 18, 9, 26, 54,108,136, 26, 53,106, 96,207,158, 61,104,212,168, 17,174, 94, +189,138,171, 87,175,226,230,205,155, 56,115,230, 12,178,179,179, 43,124,140, 86,175, 94,141,172,172, 44,200,100, 50,100,100,100, + 32, 62, 62,222,173,169, 88, 92, 29,119, 59,181,158,158, 6, 0, 8,169,228, 85, 33,131,229,172,249,249,231,159,223,101,218,159, +196,150, 14,161, 12, 19,160,175, 85,171,150,210,185,253,148,227, 56,120,120,120,144,137, 19, 39,242, 69,239,225,229,229,133, 74, +149, 42,185,213,236, 38,145, 72,244,205,154, 53, 83,218, 11,160,221, 56,169,213,106,126,210,164, 73,100,233,210,165,101, 70,181, + 92,244,193,250,106,216,176, 97, 47, 37, 38, 38,250, 4, 4, 4, 32, 37, 37, 5, 50,153,172,240,164,232,208, 1,177, 55,110,192, + 92,216,167, 8,151, 47, 95,198,226,197,139,181, 70,163,241,171,138,238, 40,141, 70, 3, 63, 63, 63, 71,211,160, 61,130,227,100, + 22,233,189, 84,100, 37,151,138, 68, 28,236,154,206, 6,203,126, 97, 29, 53,106, 84, 49,179,229,118,129, 16, 4,107,187,118,237, + 4,123, 58, 44, 22, 11,234,213,171,135,180,180, 52, 72, 36, 18,200,100,178, 98,145, 59,119, 12,150,171,137, 68, 5, 65,128,201, +100, 66,219,182,109, 65, 8,193,183,223,126,123, 79,145,151, 71,206, 96, 89, 69,162,209,248, 33, 36,164, 38, 42, 5, 24, 32,138, + 15,238,233, 47, 86,171, 21,163, 71,143, 46, 22,177,178,143, 84,180, 55,241, 23, 54, 43, 89,238,121,210, 86,251,121,125, 63,243, +191,137, 20,142,166, 45,173,214,240,159, 59,134,225,225,225,158, 69, 77,134, 37,249,133, 82,250,103,169,199,166,104, 74, 6, 30, +152,113,251,246,237,186, 94, 94, 94,232,218,181, 43, 54,111,216,176,233, 23,192, 17,178,201, 1, 18,125,238,220, 25, 95,244, 62, +201, 85, 80,175,176, 15,150, 17, 90,173,254,129,231,243,126,111,244, 74,187,161,230,121, 30,235, 22,126,138,104, 85, 42, 26, 86, +145,227,208,145,147,104, 94, 25,128,233,222, 91,128,237,125,155, 84, 42, 37,164, 50,185, 35,157, 10,149, 10, 18,169,236,158,243, +238, 92,159,150,172, 47,239, 37,130,231,188, 63, 95,126,249,101, 76,158, 60, 25, 93,187,118,197,213,171, 87,177,111,223, 62, 92, +189,122, 21,227,198,141, 67, 76, 76, 12,186,117,235, 86, 33,205,181,107,215, 34, 55, 55, 23, 28,199, 33, 51, 51, 19,122,189, 30, + 83,167, 78,189,239,227,110, 39,126,231, 39, 0,128,223,118,156,184,103,205,247,222,123, 15,119,238,220, 41, 22,185,122, 82,162, + 86, 46, 13,214,229,203,151, 75,109,239,139,137,137, 73,237,210,165, 75, 64, 74, 74, 10, 52, 26,141, 75,115, 69, 8,233,108,159, + 43,227,220,185,115,165,106, 86,173, 90,213,220,165, 75, 23, 73,112,112,112,177,209,131,106,181,186,216,201, 90,154,102, 81,229, +159, 79, 8,121,181,117,235,214, 63,109,221,186, 85, 85,163, 70, 13,228,229,229,129, 82,138,101,203,150, 97,204,152, 49, 80, 40, + 20,184,124,249, 50,122,247,238,173,211,233,116,175, 58,207,129, 85,154,102,105, 70,134,227, 56,199,252, 48,165,152,171,114,243, +238,204,220,185,115, 29,115, 65,149,199,162, 69,139,128, 18, 83, 42,148,166, 73, 41,197,151, 95,126,249,192, 52, 47, 93,186,180, +204,121,125,100,100,228,183, 79, 61,245,148,144,144,144, 80,204, 84, 57, 47,165, 84, 72,197, 52, 93, 77, 36,202,243, 60, 2, 3, + 3,241,241,199, 31,195,207,207, 15, 65, 65, 65,119, 69, 94, 92, 29,163,123,188,123,255, 71, 53, 41, 71,227,230,126, 53,173,205, +162,239,215, 75,228, 50,224,240,190,223,144,151,125,167,120, 4,214,252,255, 33,209,178, 70,157, 96, 58,177,203,173,116, 26,141, + 70,124,254,249,231,152, 54,109,218, 93,115,224,148,113,220,239, 43,239,238,152,172,210, 52, 69, 81, 36, 42,181, 15, 20,234, 16, +212,137,241,129,232,198, 92,157,226,191,127,220,117, 9, 9, 9, 94,149, 43, 87,198,149, 43, 87, 8,254,223, 31,235,255,199, 74, + 38, 27, 4,224,207,242, 52, 9,112,102,213,170, 85,117,235,213,171,135,111,191,253, 22, 0, 94,120,113,251,246,129,207,233,245, + 6,160,112,242,209, 34, 51,230, 50,157, 54, 74,137, 82,229, 13,133, 58, 24,117,234,122, 67, 20,221,159,243,148,150,147,119,251, +197,175,100,244,170,130, 19, 73,223,165,105,191, 65,186,126,248, 15,244,236, 17,134,131, 71,207, 98, 87,130, 10, 97,178, 20,132, +232,210, 33,166, 95,196,155,253, 27, 97,206,218,194,139,248,217, 56,215,154,132, 16, 28,124,251, 21,168, 85, 10, 60,187,234, 79, + 72,165, 82,252,245,230,243,144, 74,229,104,247, 85, 97,147,236,153,207,166, 64, 34,151, 35,250,141,105,110,165,179,100, 75,141, +189, 43,135,243, 54,229, 69,176,202,203,123,126,126, 62,114,114,114,240,211, 79, 63, 97,248,240,225, 72, 75, 75,195,205,155, 55, +113,229,202, 21,252,242,203, 47,142,209,233, 21, 73,167,221,188,188,245,214, 91,160,148,162, 78,157, 58,152, 54,109, 26, 90,182, +108, 89,225, 99, 84,242,184,151,196, 85,244,170, 60,205, 57,115,230,220, 83, 89,122, 34, 12, 86,121,119, 37, 28,199,193,223,223, +223, 81, 56,156, 11,222,189,220,233,242, 60, 15,171,213,234,232, 56,109, 95, 0,160, 87,175, 94,216,188,121,179, 59, 35, 35,182, + 18, 66,134,214,174, 93,251,135,233,211,167,107,218,181,107, 39,132,132,132,160,105,211,166,184,124,249, 50,254,248,227, 15,203, +252,249,243,181, 58,157,110, 4,165,116,199,189,212,201,246, 71,207, 56, 47, 21,193,102,179, 37,196,199,199, 7,127,249,229,151, + 60,199,113,152, 51,103,142,243, 67,174,239, 42,132, 71,142, 28,177,186,106,146,177, 90,173, 9,241,241,241,193,179,103,207,230, + 9, 33, 14, 77,231,201, 95,157,247,157, 59,154,165,153, 75,251,128,135,210,150,210,210, 94,218, 49, 46,111, 34, 81, 65, 16,112, +249,242,101, 76,157, 58, 21,132, 16,252,246,219,111,143,197,201,117,240, 88,242,210, 86, 77, 66,124, 6,245,111, 95,143,128,131, +201,124,247, 0, 52, 62, 51,199, 97,174,158,153,189, 26,235,223, 30,232,142,217,185,118,236,216, 49,223,207, 63,255, 92,224,121, + 30, 95,127,253,117,177,201,126, 75, 30,247,163, 71,143, 90,239,169,121,175,232,124, 54,155,205,208,235,239, 45,106, 66, 57,114, +104,206,231, 31,118, 89,244,227,102, 9, 33, 38, 28,222,251, 27,114,115, 74, 31,154, 46,147, 8, 88,177,106,147, 85,224,185,132, +127,249,208, 45,234,220,185,243,212,157, 59,119, 10,149, 43, 87,190,103,145, 54,192,230,121,243,230, 61,245,252,243,207,251,214, +174, 93, 27,235,215,175, 7, 0, 89,209,130,162,153,221,183,186,103,146,196,141, 95,127,241,225, 11,139,127,220, 44,227,136, 25, +135,247,253,134,220, 18,102,189, 36, 82,169, 4, 43, 87,109, 52, 11, 2,127,201, 85,189,238, 28,189,186,223, 11,162,115,217,107, +212,243, 37,124,251,199, 98, 4,212,235,142, 1,189, 98,113,224,219,231, 49, 32,218, 0,243,154, 33,168,219,127, 57,150,189, 83, + 24,189,105,184,246, 93,183,174, 63, 30, 30,106, 71, 7,114,142,227, 32, 87,168, 32,145,255,191,255,144, 76,165,130, 80,129, 72, +150, 61,239,229, 69,170, 42, 26,193,226, 56, 14,145,145,145,168, 90,181, 42, 90,183,110,141, 70,141, 26,161, 67,135, 14, 56,125, +250, 52, 78,159, 62,141,113,227,198,149,105,174,220, 57, 70, 93,186,116,193,165, 75,151,238,187,144,151, 60,238, 15, 2,119,202, +210,107,175,189, 6, 0, 79,110, 31, 44, 87, 59,207, 94, 32,233, 3,232,140, 74, 8,129,201,100,114, 52,189, 57,207,171,100,239, +244,238,230,124, 80, 59, 8, 33, 49, 31,124,240,193,120,133, 66,209, 65,167,211,213, 4, 0,181, 90,125,217,104, 52,254,165,215, +235,191,166,148,230,220, 79, 90,157,167,101, 40, 37, 31,229,238,140,244,244,244,110,195,134, 13,219,193,113, 92,100,121, 15,231, +117,186,243,191,153,154,154,250,148, 43,205,161, 67,135,150,170, 89,154,174, 59,154,165, 29,115, 81, 20,203, 52, 87,238, 84, 64, +174, 38, 18,149, 72, 36, 80,171,213,216,176, 97, 3,252,253,253, 31,171, 19,236,208,241,228,207,203, 91,223,222, 95,190, 23, 64, +165,103,102,175,190,189, 39,195, 20,222,222, 95,118,107,253,219, 3,171,148,247,155,236,236,236,174,111,189,245,214,159,130, 32, + 68,150,119,188,157,140,120,124,122,122,122,133,167, 61,160,148,226,210,165, 75,226,203, 47,191,156,145,158,158,254,220,189,228, +127,236,248, 47,190,154,247,229,155,126,253,251,180,105, 10, 66, 96, 50,149,209,169,151,128, 82, 74,169,192,115, 9,175,191, 53, +251,149,127,243,152, 81, 74, 79, 17, 66, 62,170, 86,173,218, 72, 0,101, 93, 9,127,113,165,179, 7, 48,203,140,198, 47,155, 52, +105, 50,233,221,119,223,245,238,213,171, 23, 42, 87,174, 92,230,124,129,229,113,224,104,226,200,150, 77,130,195,250,245,110,211, +141, 35,132, 26, 77, 70, 23,245,106,209,254, 20,248, 75,123,143, 36,212,119, 21,157,231, 56,174,194, 93, 20,220,161, 83,255,225, +232,212,127,184,163, 60,237, 92,211, 30,113,201, 59,208,152, 75,132,113,113, 27, 16, 79,123, 81,231, 93, 94, 39, 56,142, 67,239, +101, 27,139,165,179,245,103,197,163,179, 53,199,124, 80,161,107,143,243,224,171, 7,213, 7,139,231,121,100,100,100,224,242,229, +203, 72, 77, 77,133, 78,167,195,133, 11, 23, 96, 54,155,145,157,157, 13,251, 72,195,123, 73,231,131, 58, 70,255,166,230,147,212, + 76, 88, 33,131,101,179,217, 18, 93, 61,245,220,106,181, 86,104,148,145, 32, 8,134, 54,109,218,144,210, 70, 27,216,223, 43,149, + 74,189,155, 21, 99, 14,128,169, 0,166, 22, 61,111, 10, 89, 89, 89,247,237, 2,109, 54, 91,114,179,102,205,248,242, 12,145,205, +102, 75,117, 97,134,180, 0, 90, 62,200,131,247, 79,104,150,114,124,180,237,218,181,187,107, 30, 19,231,227,163, 80, 40,202,237, +117,235,106, 34, 81,157, 78,151, 50,108,216, 48,155,115,179,160,243, 68,164,143, 53,132,222,234, 49,232,165,240, 61, 25,166,112, + 0,176,155, 44, 80,122,171,172,159, 36, 39, 39,235, 1,180,251,167,147,118,227,198, 13, 83,243,230,205, 87,230,231,231,191, 70, + 41,189,231, 94,250,227, 38,204,121,247,191,118, 88, 40,165,167, 0,140,186, 95, 29, 19,112,177,142,193,240,218,180, 15, 62,120, +246,195, 15, 62,168, 33, 2,126, 64,225, 28, 85, 60,176,186, 34, 90,135,143,167, 60,240,185,193,108, 54, 91, 98,171, 86,173, 42, + 20,169,113, 85,199, 91,173,214,114,175, 19,171, 80, 25, 56, 94, 49,205,127, 34,157,206,154, 13, 26, 52, 64,195,134, 13, 29,175, +118, 74,126,239,142,102,227,198,141, 81,167, 78,157, 50,103,104, 47,217,231,234,223,206,187, 93,211,110,251, 27, 54,220,254,192, + 52,239, 55,157, 79,148,193,178, 63, 99,240, 65,114,254,252,249,127,228,217, 40,148, 62,184,177,222,231,207,159,111,138, 39,148, + 75,151, 46,249,221,175,134,171,137, 68,207,156, 57,211,225, 73,221,191,123,210, 77, 47,222,245, 93,145,217,250,183,209,106,181, + 85, 40,165,247,212, 51,191,127,255,254,182, 39,245,152,130,210, 98, 19, 79,157, 47,156,160,244,167, 71, 49,169,231,206,157,123, +224,117,250, 63,113,157,248, 39,210,201,242,254,232,107,254,215, 97, 51, 68, 50, 24,140,178,110, 82,108,108, 47, 48, 24, 12,198, +189, 65, 0,116, 46,163,114,117,123,228, 14, 33,164,243, 61, 84,222, 59,153, 38,211,100,154, 76,147,105, 50, 77,166,249,100,105, +186,210,126,208, 35,135,255,205,187,212,127,108, 1,208,153,105, 50, 77,166,201, 52,153, 38,211,100,154, 76,243, 73, 91, 88, 19, + 33,131,193, 96, 48, 24, 12,198, 3,134, 25, 44, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, + 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131,113,239,144, 7, 56, 31, 39,131,193, 96, 48, 24, 12, 6, 3, 44,130, +197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6, +131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24, 12, +198,163, 96,176, 8, 33,157,153, 38,211,100,154, 76,147,105, 50, 77,166,201, 52,153,193, 98, 48, 24, 12, 6,131,193, 96, 48,131, +197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6, +131,193, 96, 48,254, 37, 8,128, 82, 71, 2, 80, 74,119,186, 45,114, 15,163, 9, 92,233, 51, 77,166,201, 52,153, 38,211,100,154, + 76,243,241,211,116,165, 93, 17,255,241, 72, 67, 41,253,199, 22, 0,157,153, 38,211,100,154, 76,147,105, 50, 77,166,201, 52,159, +180,133, 53, 17, 50, 92,221, 97, 8,132, 16,225, 94,215, 63, 44, 77, 6,131,193, 96, 48, 30, 37,216, 69,140, 81,158, 17,106, 9, +160,103,209,251,223, 41,165,135, 43,178,254, 97,105, 62, 44, 26, 55,110,172, 84, 40, 20, 93,119,239,222, 45,187,112,225, 2,254, +254,251,111,186,114,229, 74,179,193, 96,216, 30, 23, 23,167,103, 37,230,191, 79,163, 70,141,186, 1,152, 82,244,241,211, 19, 39, + 78,108,187,207,115,136, 84,171, 86,109,156, 76, 38,235, 33,149, 74, 67,172, 86, 43, 49, 26,141,201,122,189,126, 71, 82, 82,210, +108, 74,169,120, 15,154, 77,253,253,253, 71,197,196,196,212,184,113,227, 70,194,237,219,183, 87, 0,216, 6,160, 91,149, 42, 85, +134, 69, 69, 69, 85, 62,119,238,220,149,140,140,140,133,148,210,191,255,173,116, 50, 24,204, 96,185,119,242,113, 62, 62, 62, 93, +148, 74,229, 27, 5, 5, 5, 13, 61, 61, 61,207, 91,173,214,121, 41, 41, 41,191,179, 19,239,177, 53, 87, 2,128,158,148, 82, 9, + 0,240, 60,223,167,101,203,150,225,132, 16,145, 16, 66, 41,165,132,227,184,134, 54,155,141, 43,218,190, 39, 33,228,111, 74,169, +181, 34,154,205,155, 55,175, 44, 8, 2,165,148, 18, 74, 41,199,113, 92,253,138,104, 62, 40, 98, 98, 98,102, 81, 74, 67,202,219, + 70,173, 86, 55,217,189,123,119,173,141, 27, 55,218, 86,172, 88,145, 51,104,208, 32,205,240,225,195,133, 31,127,252,241, 59, 0, +111,148,220,190, 78,157, 58, 95,113, 28,231,239,206,255,139,162,152,113,254,252,249,183, 88,201,251,215,153,242,242,103,123,219, + 82, 10,124, 63,165, 29, 87,100, 92,238,153,134, 13, 27,254,212,183,111,223, 65, 53,107,214, 20, 68, 81,132,197, 98,129,201,100, +170,117,226,196,137,246,219,183,111,111, 2,224,185, 10,158,151, 61,167, 76,153,178,228,163,143, 62,170, 36,145, 72,136,197, 98, +105,241,235,175,191,118, 31, 53,106,212,169,133, 11, 23, 54, 24, 48, 96,128,135,253,251, 15, 63,252,240, 41, 66,200,120, 74,233, + 47, 15, 59,157, 12, 6,195,133,193,242,240,240,168, 94,169, 82,165,183,253,252,252,158,106,210,164, 73,238,171,175,190,122,253, +218,181,107,103, 35, 35, 35,117, 63,254,248,227, 76,139,197, 50,191,102,205,154,219,243,242,242,102,223,185,115,231, 66, 5, 43, +138,234, 0, 94, 5,240, 20,128, 48, 0,201, 0,254, 4,176,132, 82,122,233, 94, 50, 19, 26, 26, 90, 79,173, 86, 79, 34,132,180, +208,106,181, 97,106,181, 58,153, 82,122, 52, 63, 63,255,139,148,148,148, 19,247,162, 25, 22, 22, 86, 21,192, 88, 65, 16, 98,109, + 54, 91, 36,207,243,183,108, 54,219,126,155,205,246,109,114,114,242,149,123,209,108, 93,217,163,151,168,241,156,109,225,149,149, + 11, 12, 86,169, 70, 46, 88, 36,162, 33, 65,212,230, 76, 57,122,187,224,183, 71,177,160,200,100, 50,110,197,138, 21, 13,100, 50, + 25, 0,192,100, 50, 33, 38, 38,134,220,143,166, 68, 34,225,102,207,158,221, 72, 16, 4,152,205,102, 49, 63, 63,159, 62,251,236, +179,255, 74,179, 53, 33, 36, 44, 46, 46,206, 75, 42,149,150,186,222,102,179,161,119,239,222,145, 82,169, 20, 11, 22, 44,176,100, +102,102, 54, 92,186,116,233,137,249,243,231,251, 47, 91,182,172,127,105, 6,139,227, 56,255,178, 52,109, 54, 27,204,102, 51,172, + 86, 43, 76, 38, 19, 58,116,232,192,106,163, 71,131,112, 0,216,114,218, 0, 0,190,247, 43,166, 84, 42,163,159,121,230, 25, 33, + 61, 61, 29, 18,137, 4,102,179, 25,119,238,220, 65,181,106,213,248,141, 27, 55,214,172,168, 94,173, 90,181, 70,125,242,201, 39, + 1, 91,182,108, 49,175, 92,185,210,216,185,115,103,233,136, 17, 35, 60,219,182,109, 27, 27, 22, 22,198,253,240,195, 15,198,157, + 59,119,154,135, 14, 29, 42,159, 53,107, 86,192,159,127,254, 57, 8,192, 47, 15, 59,157, 12, 6,163, 28,131,229,225,225,177, 87, +163,209, 84,123,229,149, 87, 46,189,246,218,107,219, 53, 26,141, 13, 0,126,254,249,103,161, 79,159, 62,233,207, 62,251,108,154, + 78,167,227,231,207,159, 95,229,155,111,190,217,225,225,225,145,148,159,159,223,204,141, 11, 25, 1,240, 6,199,113, 99,187,118, +237,186,215, 98,177,164,111,218,180,105,205, 51,207, 60, 19, 75, 41, 85,239,222,189,251, 15, 66,200, 34, 0, 95,186, 27, 29, 35, +132,240, 81, 81, 81,211,194,194,194, 38, 44, 88,176, 64, 30, 21, 21, 5,165, 82,137,252,252,252, 42, 87,174, 92,169,252,198, 27, +111,244,174, 90,181,234, 60, 47, 47,175,247,227,226,226, 44,110,106,146,144,144,144, 55, 61, 61, 61, 63,158, 53,107,150,162,118, +237,218, 68,173, 86, 35, 62, 62,190,238,145, 35, 71, 98,150, 46, 93, 58, 34, 44, 44,108,122, 82, 82,146,219,233,108, 79,136, 96, +168, 90,105,187, 79,173,102,237, 23, 46,249,158,248,171, 85, 16, 8,129,197,108,150,164,234,244, 81, 99, 70,143, 92,211,178, 70, +208,193,124, 73,106,167,243,231,169,249, 95, 50, 26,114, 0,160,148, 26, 9, 33,191,243, 60,223, 71, 38,147,113,125,250,244,193, +206,157, 59,137,193, 96, 16, 0, 64,161, 80, 88,251,244,233, 3,165, 82, 9,147,201, 36, 2,248,189,172, 72, 83,105,154, 18,137, +132,235,208,161,131,238,216,177, 99, 89,118, 77,149, 74,101,233,208,161,131,159, 76, 38, 83, 90,173, 86, 90,158,230, 63,100, 34, +113,237,218,181, 98,223,229,231,231, 35, 61, 61, 29,153,153,153, 48,153, 76,200,201,201,129, 40,138,196,104, 52,166,139,162, 8, +142, 43, 12,182,149,165, 41,149, 74,113,249,242,229, 98,223, 89,173, 86,104,181, 90, 24,141, 70,152,205,102,232,245,122,165, 66, +161,168, 30, 27, 27,155, 8, 96, 99, 65, 65,193,236, 83,167, 78,221, 98,213,211,191,194,237,223, 79, 26,170, 0, 48, 1,136,127, + 0,231,147, 8, 0,251,247,239, 71,106,106, 42, 50, 50, 50,144,158,158,142,176,176, 48,220, 75,244,255,210,165, 75,115, 27, 54, +108, 72, 78,157, 58,181, 25,192,146,213,171, 87, 63,147,149,149,181, 96,226,196,137,190, 95,124,241, 69,214,164, 73,147, 70, 3, + 88,191,122,245,234,225,245,234,213,235,117,230,204,153, 57,255, 70, 58, 25, 12, 70, 57,243, 96, 81, 74, 67,170, 87,175,158,245, +245,215, 95,215,154, 50,101,138, 95, 65, 65, 1, 95, 20, 37, 50, 16, 66,168, 78,167,227, 39, 79,158, 92,233,211, 79, 63,173, 37, +151,203,179,173, 86,107,165, 82, 52, 74, 27,106, 57,214,211,211,179,119,124,124,252,234, 90,181,106,249,126,242,201, 39, 39,149, + 74, 37,157, 59,119,110, 92,213,170, 85,131,111,221,186,181,220,211,211,179, 35,128, 9,101,164,235, 46,205,200,200,200,143,251, +247,239, 63,225,224,193,131,242,250,245,235, 67,163,209,128,231,121,120,123,123,163,121,243,230,100,223,190,125,242, 30, 61,122, +140,203,205,205,253,194, 93,205,144,144,144,119,187,119,239, 62, 51, 46, 46, 78,217,169, 83, 39, 34,147,201,144,157,157, 13,185, + 92,142, 22, 45, 90,144,133,243,191, 83,214,173, 83,251,195,176,176,176,143,220,213, 52, 87,247,223, 49,232,245,201, 29,126,255, +115, 27, 9, 12, 12,196,245, 47, 63,194,254,182, 49,184, 58, 99, 10,130,131,131,177,121,203, 86,210,235,133,215,219,120, 90, 2, +119,187,171,121,191, 56,107, 18, 66, 94, 3,144, 5, 32,139, 16,242, 26,165,244,112, 76, 76, 76,220,133, 11, 23, 16, 27, 27,139, + 53,107,214,212,159, 56,113,226,107, 19, 39, 78,124,109,205,154, 53,245, 99, 99, 99,113,225,194, 5,196,196,196,196, 57,247,149, +114, 71,115,239,222,189,232,216,177, 99,246,154, 53,107,162,166, 78,157, 58,107,234,212,169,179, 86,175, 94, 93,181, 99,199,142, +217,115,230,204, 49,150,167,249, 79,228,221, 57,178,228,188,136,226,255,175, 45, 1, 1, 1,105,191,255,254, 59,122,245,234,197, + 5, 6, 6,166,244,233,211, 71,126,236,216, 49, 10,224,247,138,164,211, 96, 48, 64,175,215, 67,171,213,226,246,237,219,202,249, +243,231,183,153, 48, 97, 66,181, 53,107,214,132,142, 27, 55,110,180,167,167,231,137, 6, 13, 26,132, 63,236,188, 51, 77,128,227, +184, 59, 0,204, 0,180, 28,199,221,186, 31,205,126,253,250,213,141,136,136, 8,252,245,156, 15,178,165,181, 32, 74,189, 33, 74, +189, 97,243,107,138,107,178,167, 16, 26, 26, 26, 24, 30, 30,222,178, 34,154,148,210, 29, 39, 79,158,124,138, 82,186,144, 82,106, +163,148,174,157, 52,105,210,203,132,144,223, 38, 77,154, 52,146, 82,186,182,232,251,165,167, 79,159,238, 69, 41,253,235,223, 72, + 39, 43, 75, 76,147, 81,142,193, 34,132, 88, 62,255,252,243, 35,223,127,255,253,206,148,148,148,224,168,168,168,167,159,121,230, +153,240,220,220, 92,242,204, 51,207, 68, 6, 7, 7,247,220,187,119,111, 80,255,254,253,119,247,239,223,255, 48, 33,196,101,164, +129, 16, 82,149,231,249,241,167, 78,157, 58, 80,165, 74, 21,115,114,114,178, 71,195,134, 13,243, 1,160, 70,141, 26,186,204,204, + 76,165,151,151, 23,182,110,221,122,140, 16,242, 42, 33,164,150, 43,205,224,224,224, 70,126,126,126,111,124,252,241,199,114,158, +231, 75,221, 70, 46,151,227,227,143, 63,150,123,122,122,190, 18, 26, 26,218,194,149,102, 80, 80, 80,109, 15, 15,143,247,190,249, +230, 27,133,209,104,132,201,100, 66, 96, 96, 32, 52, 26, 13, 82,146,147,145,124, 51, 30,169,241, 55, 48,238,229,151,148,106,165, +114,124, 72, 72, 72, 3, 87,154,177, 17, 30,125,212, 97,117,218,143, 25,251, 6,206,141, 27,142,157,161, 50, 4,141,157,140,250, +123,206, 34,108,250,108,252, 21,229,137,184,231,186,224,205, 55,223,130, 52, 32,170, 85,171,202,154,129,255, 66,228,234, 11, 74, +169,146, 82,170, 36,132,204,109,213,170,213, 74,165, 82,249,218, 39,159,124,210,109,251,246,237,221,247,237,219,215,222,106,181, + 74,172, 86,171,100,255,254,253,177, 6,131, 65,144,203,229, 16, 4,129,186,171,217,178,101,203,159,148, 74,229,232, 5, 11, 22, +116,251,235,175,191,134, 29, 63,126,252,117,155,205, 38,179,217,108,178,227,199,143,143,212,235,245, 18, 74,169,173, 44,205,135, +141, 68, 34,129, 84, 42,133, 82,169, 68,195,134, 13,175,175, 90,181,202, 18, 28, 28, 44, 89,178,100,137, 79, 96, 96,160,122,217, +178,101, 57, 57, 57, 57,159,185,171,103, 54,155, 97, 52, 26,161,215,235, 97, 48, 24,112,232,208,161,200, 17, 35, 70, 8, 38,147, +201, 54,108,216,176, 44,139,197, 98, 28, 51,102,140,167, 70,163,121,155, 85, 79, 15,159,162,136,105, 1, 0, 45,165,212,104,255, + 62, 34, 34, 66, 30, 26, 26, 90, 47, 34, 34, 66,238,174, 86, 65, 65,193,162,175,190,250, 42,140,147,123,227,128,169, 7,126, 17, +167, 99,187,215,183, 72, 11,159,128,128,176,106,232,222,189,123, 0, 33,228,219, 7,144,230,141,148,210,254,148,210,117,247,242, +251,127, 58,157, 77,155, 54,141,109,210,164,201,241,198,141, 27,167, 52,105,210,228,120,211,166, 77, 99,239, 55,207,207,197,144, +206,195, 26,240,137,253,235, 16, 58,172, 1,159,248, 92, 76,197,231,106, 98, 48,254,105, 92,118,114,175, 84,169,146,233,221,119, +223, 61,101, 48, 24,206,254,244,211, 79,213,134, 14, 29,218, 48, 60, 60,252,242,179,207, 62,251,135, 70,163,177,218,251,228,184, +201, 75, 61,122,244,216,226,239,239,143,220,220, 92,193, 98,177,240, 90,173,150, 7, 0, 81, 20, 97, 48, 24,248, 27, 55,110, 8, + 70,163,145,182,104,209, 98,211,225,195,135, 95, 5, 48,190, 60, 65,181, 90,253,218,226,197,139, 21,101,153, 43,155,205,134,252, +252,124, 88,173, 86, 76,159, 62, 93, 49, 97,194,132, 55, 0, 28,113,113, 81, 29, 59,119,238, 92,185,213,106, 5,199,113,160,148, +226,196,137, 19,200, 76, 75,131, 33, 63, 15,198,188, 92,152,243,114,193,107,243, 49,236,169,110,138,133,235, 54,188, 5, 96, 88, +121,154, 38,185,230,211,159, 22, 47,133,205,102, 67,202,198, 95, 75,221, 38,235,224, 30,216,172, 22,124,242,217, 23,228,205,151, + 6,124, 2, 96,245,191, 85, 48,228,114,185,176, 98,197,138,193, 50,153, 12,148, 82, 98, 50,153,176,125,251,246,251,214, 92,190, +124,249, 48,187,166,217,108,166,117,235,214,189,171,121,205,104, 52,210, 71,229, 4,145,201,100, 80, 40, 20, 48,155,205,168, 82, +165,138,190,119,239,222,135,230,206,157, 91,133,231,121,181, 32, 8, 91,115,115,115,103,157, 59,119,238,134,187,122, 69,157,135, + 97, 50,153,160,215,235,113,251,246,237,160,208,208, 80,242,222,123,239,217,116, 58, 93,212,210,165, 75,175,253,250,235,175,170, +111,190,249,230, 89, 0, 99, 89, 21,245,240,168, 86,173,154,204,211,211,211,171,138,159,160,149,240, 40, 72,163,212, 35, 34, 34, + 34,220, 98,177, 60, 75, 8,105, 81,163, 70, 13,159,171, 87,175,102,135,134,134, 30,225, 56,238,151,132,132,132, 20, 23,198,135, + 88,173, 86,140,108,150,131,215, 90,242,176, 88,114,145,155,155,139, 91,183,110,225,252,249,243, 56,122,244,220, 61,165, 51, 50, + 50,242, 37,133, 66,209, 85, 38,147, 69,216,108, 54, 78,167,211,221, 50, 26,141, 59,147,147,147, 23,209,162, 9,138, 42,104,208, +254,145,116, 58,233,207,126,230,153,103, 66,188,188,188,112,242,228,201,144,211,167, 79,207, 6,208,228,190,206, 75,129,251, 97, +198,151,223,134, 6,251,123,227,220,193,205,161,115,150,252,250, 3, 10,251,242, 50, 24,255, 29,131,101, 71,161, 80,216, 70,141, + 26,117,121,211,166, 77, 17, 77,154, 52,185, 88, 86,103, 96, 23,180,142,142,142,190,117,232,208, 33,248,250,250,154, 45, 22, 11, +111, 48, 24, 56,169, 84, 74,179,178,178,136, 94,175,231, 78,159, 62,173, 72, 76, 76,148,250,248,248, 72, 0, 52,114, 35,194,208, + 50, 50, 50,178,116, 83, 99, 50,161,160,160, 0,249,249,249, 48, 26,141, 8, 12, 12, 36, 28,199, 53,119, 25,214,227,184, 54, 53, +107,214, 36,217,217,217, 8, 9, 9,193,193,131, 7, 81,144,147, 3, 67,126, 30, 76,121,185, 48,231,230,192,146,155,131,156,180, +100, 68, 4,135,145,162,169, 5,202,197,202, 43,195, 3, 52,106, 92,157, 49, 25, 77, 79,220, 2,145, 72,113,172,110, 48,168,165, +176,171, 85,179, 51,201, 32, 82, 25, 46,142,123, 17,129, 67, 95,129,133,147,135, 62,228, 59,119, 35, 33,100, 34,199,113,115,229, +114,185, 48,122,244,104,164,164,164, 20, 51, 63,163, 71,143,118,244,185,106,219,182,237,126,133, 66, 97, 77, 79, 79,135,209,104, +148,184,163, 25, 17, 17,113,235,253,247,223, 63,102, 50,153,194, 66, 66, 66,188,141, 70,163,190,102,205,154, 33, 74,165, 50,208, +100, 50,217,154, 52,105,178, 72,169, 84, 90, 10, 10, 10,168,213,106, 37,143,194, 9, 66, 8, 1, 33, 4, 86,171, 21, 86,171, 21, +222,222,222,218,204,204,204,163,215,175, 95, 31,124, 47,122, 22,139, 5, 22,139,197, 17,197, 18, 69, 17,103,206,156,129, 66,161, +144,136,162,120,206,102,179,169, 36, 18, 9,120,158,103,115,212, 61, 68, 26, 55,110,220,190,126,160,231, 87,163, 67,140,222, 85, +123,169,181, 42, 25,175,253, 34, 83, 25,241,199, 79,218,213, 61,123, 12,244,152, 48, 97, 66,184,175,175,175,226,198,141, 27,134, + 57,115,230, 68,174, 95,191,158, 0,248,178, 60,205,228,228,228,223, 62,253,244, 83,223,246,237,219, 71, 73, 36, 18,146,147,147, +131,244,244,116,164,165,165,225,246,237,219,244,230,205,155,215,173, 86,235,154,138,164,179,126,253,250, 75,135, 14, 29,250,124, +157, 58,117, 36,148, 82,152,205,102,232,116,186,134, 71,143, 30,237,125,224,192,129, 88, 0, 21, 46,151, 41, 41, 41,107, 62,251, +236, 51,117,187,118,237,106, 73, 36, 18,238, 65,164,179, 68, 61, 16,162,209,104,176,115,231, 78,120,123,123,195,213,104, 93,119, + 48, 90,196,208,160, 0, 63, 24, 14,126,133,234,190,225, 48, 90,196, 80, 86,138, 25,255, 89,131,149,158,158, 46,211,106,181,130, + 40,138,124,110,110,174, 74,165, 82, 89,101, 50,153,169,130,255, 87,167,119,239,222,199,154, 55,111, 94, 80, 20,209,176, 4, 4, + 4,152,115,115,115, 33,138, 34, 68, 81,180,122,122,122, 22, 88, 44, 22, 68, 69, 69,113, 0, 92, 54, 17,234,245,250, 42, 74,165, +242,174,239,117, 58,157,195, 92, 21, 20, 20, 64,167,211,193,203,203, 11, 90,173,214,229,201,109,179,217, 34, 84, 42, 21,146,147, +147, 1, 0,249,217, 89, 48,230,229,193,148,255,127,115,101,203,201,134,168,215,194, 59,172, 50,172, 86,107,101, 87,154, 90,163, + 77,198,131, 34,109,243,111, 8,124,109, 98,153,219,101, 31,216, 3,143,234,209,208,235,205, 15,125,142, 50, 74,233,252,134, 13, + 27, 54, 90,191,126,253,136,164,164,164,187,214,247,237,219, 23, 99,199,142,197,152, 49, 99, 46, 62,253,244,211,167, 55,111,222, +140,215, 95,127, 29,162, 40, 54, 32,132,228, 82, 74,255, 44, 79,115,202,148, 41,199, 19, 18, 18,246, 92,185,114,101,116, 64, 64, +128,188, 94,189,122, 87,235,213,171,199,175, 95,191, 62,240,149, 87, 94,137,235,222,189,251,205, 93,187,118,249,238,220,185, 83, + 33,138, 98, 99, 66, 72,210,191, 61, 15,150,189,137,216,100, 50,193, 96, 48,192,108, 54,195,102,179,145, 10,236,211, 98,159, 69, + 81,116,152, 53,163,209, 8,139,197, 66,118,236,216,142,205,155, 55,115, 23, 46,156, 15,155, 50,229, 29,228,230,230,194,102,179, +177,218,233, 33,208,164, 73,147,167, 4, 42, 46, 30, 26,100, 85, 12, 14,180,106,165,132, 22, 92, 89,252,126, 65,124,184, 70,235, +233,207,155, 60,253, 36, 33,147,167, 76, 14,190,126,237,186,241,243,207, 63,191,208,179,103,207,128, 87, 94,121,165,246,150, 45, + 91, 98,171, 84,169,242,253,237,219,183,115,202, 48,230,210, 17, 35, 70, 28,245,246,246,174,186,114,229,202,180,164,164, 36, 31, +139,197,162,178, 88, 44,102,131,193,112,205,108, 54, 31, 48,153, 76, 59, 83, 82, 82,226, 42,146, 94,141, 70, 83,127,192,128, 1, +146,156,156, 28, 20,141,190, 69, 90, 90, 26, 26, 53,106,196,239,218,181,171,206,189,236,131,243,231,207,127, 21, 18, 18,178,103, +211,166, 77, 93,213,106,117, 99,153, 76, 22, 36,138,162, 77,175,215,167, 26, 12,134, 83,247,146,206, 18,251, 34,249,196,137, 19, + 33,158,158,158, 72, 72, 72, 0, 33, 36,249,126,143,155, 66,202, 37, 92, 56,176,169,114,117,223, 72, 28, 61,114, 4, 10, 41,151, +192, 74, 51,227, 63,101,176,242,243,243,133, 19, 39, 78,248, 36, 36, 36,104,252,253,253, 13,181,107,215,206, 37,132,136, 28,199, +209,148,148, 20,223,248,248,120,133,159,159,159,182,106,213,170, 89,110,254,223,149,113,227,198,197, 78,157, 58, 53,174, 75,151, + 46, 25, 0,144,157,157,141,204,204, 76,164,167,167,195,108, 54, 35, 57, 57,153, 59,126,252,184,239,214,173, 91, 27, 2,112,217, +244,162, 84, 42,111,231,231,231,215,244,246,246,118, 92,208,236,166,202,217, 96,217,163, 89,106,181,218,229,201,205,113, 92, 82, + 82, 82, 82, 53,131, 94,143,219, 87,175,194,152, 95,216, 36,232, 48, 87,185, 89, 64, 65, 62,212, 10, 5,242,179, 50,193,243,252, + 29, 87,154,106, 57,111,178, 88,109,178, 74,221,123, 3,164,236,235,179, 87,179,214, 16,107,213,131, 82,185,214,242,111, 20, 8, +142,227,108,229, 53,251,202,100, 50, 4, 6, 6,138, 45, 90,180,192,235,175,191,110, 55, 2,132, 16,210,158, 16,114,128, 82, 90, + 80,150,166, 40,138,220,133, 11, 23,158,185,118,237, 26, 47,145, 72,184,230,205,155,199,180,105,211,198, 36,147,201, 32,149, 74, +133,130,130, 2,143,157, 59,119, 42, 44, 22, 11, 41,210,124,104,243, 96, 1,133,163,251, 74, 49,240,208,106,181,208,235,245, 40, + 40, 40, 64, 78, 78,142,160, 84, 42,107,182,109,219,246,136,209,104, 92, 99,179,217,126,136,139,139,203, 43, 75,211,108, 54, 23, + 51, 91,162, 40,130, 82, 10,155,205, 6,139,197, 2,137, 68, 34,110,218,180, 25,223,204,159,139,181,171,215,209,206,157, 59,147, +173, 91,183, 66, 20,197, 68, 86, 61,253,243,136,162, 56,251,175,201,253, 20,176,218,180,198,189,171, 10,182,101, 9,218,239,207, +253,117, 92, 47,112,121, 85,106,163, 94, 68,229,170,188,151,167, 23,183,108,249,226,204,173, 91,118, 95, 75, 76, 76,204,155, 49, + 99, 70,203,168,168, 40,175,203,151, 47,135, 2,200, 41,195, 8, 69, 12, 31, 62,124,120,118,118,182,116,201,146, 37,203,146,146, +146,246, 82, 74,175,151, 48, 30,141, 8, 33, 95, 0,144, 0, 8, 4, 96, 5,176,131, 82,186,188, 28,179, 34, 18, 66,240,215, 95, +127,221, 53,218, 79,116, 30,145, 81,241, 40, 86,118,243,230,205,235, 95,185,114,101, 99,118,118,246,202,146,235, 85, 42, 85,239, +152,152,152, 65,199,142, 29,251,128, 82,122,173,130, 55,110,227, 47, 92,184,240,185, 40,138,225, 28,199,221,162,148, 78,122, 0, + 17,172,151,231, 44, 89,189,196, 96,182, 85, 81, 72,249,219, 70,139,248, 10, 43,205,140,255,140,193,178, 90,173,154,247,223,127, +191,101,131, 6, 13, 82,218,182,109,123, 39, 50, 50, 82,103, 95,231,225,225,161,247,243,243,211, 27, 12, 6,229,173, 91,183,130, + 55,108,216, 80,195,102,179,169,220,248,191,221,222,222,222,190,199,143, 31,247,251,229,151, 95,170,159, 56,113, 34,124,200,144, + 33,237, 76, 38, 19,140, 70, 35,110,220,184, 17,190,120,241, 98, 81, 42,149,230, 16, 66,254, 6,224,242, 54,222, 98,177, 28,190, +114,229, 74,141,230,205,155, 19,139,197,226, 48, 84,206, 38,171,160,160, 0, 82,169, 20,201,201,201, 84, 20,197,163,110,164,243, +200,241, 99,199,170,213,173, 29, 13, 99,110,118,145,185,202,133, 53, 55, 27, 98,110, 22, 56,109, 1,252,124, 5,168, 20, 26, 92, + 78, 78, 65, 81, 90,203, 69, 98,213,223, 76,202,205,171, 89,109,218,151,248, 43,202, 19,212, 98,118, 52, 11, 2,112, 52, 23,182, +186,152,142,253,135, 14, 67,176, 25,147, 30,213, 66,115,250,244,233,180, 33, 67,134,196,137,162,216, 8,229, 76, 81, 80,206, 93, +120,126, 65, 65, 1, 50, 50, 50,108,153,153,153, 6, 0, 72, 75, 75,203,222,180,105,211, 5, 81, 20,155,221,139,230,131,192, 98, +177,220, 21,125,178,217,108,176, 90,173, 48,155,205, 72, 79, 79,151, 29, 56,112,160,237,145, 35, 71,164,231,207,159,199,145, 35, + 71, 26,108,216,176,225,157,232,232,232,122, 23, 47, 94,188,227,202,180,145,210,141, 53, 15, 0,155,214,255,142, 65,131, 6,145, +140,140, 12,108,216,176,225,129, 52,163, 48,220, 66, 11,171, 77,105,218,187,170,224,237,171,242,252,115, 58,126, 70, 92, 92,220, + 54, 74, 41,237,209,163,199,233,154,181,162,252, 1, 64, 46,211, 4,213,173, 91,183,157,143,143,143, 12, 0, 66, 66, 66, 26, 91, + 44,150,249, 0,218,148, 38,218,183,111,223, 86, 1, 1, 1, 13,255,252,243,207, 83, 73, 73, 73,251, 74,154, 43, 0,168, 89,179, +230,244,179,103,207, 62, 37,145, 72,136, 83, 25,161, 0, 74, 53, 88,253,250,245,171, 25, 22, 22,230,183,229,138, 23,242,164,213, + 64,249, 92, 64, 80,192,230, 93, 31,183,164,181, 17, 20,116,201,175, 90,181,106, 13,174, 93,187,118,170,130, 17,166, 42, 3, 6, + 12,248, 99,233,210,165,209,221,187,119,151, 1,184,203, 96, 69, 71, 71, 63,187,107,215,174,254,163, 71,143,174, 79, 8,233, 69, + 41,189,234,174,126, 92, 92,220, 65, 0, 45, 31,228, 65, 91,115,142,238, 68,209,156,101, 12,198,127,206, 96,153,205,230, 29, 87, +175, 94,109,218,175, 95,191, 12,103,115, 69, 41,117, 84, 6, 94, 94, 94,122,127,127,255,172, 83,167, 78, 85, 18, 69,113,175, 27, +255,183,100,215,174, 93,127,205,155, 55,111,149,175,175,175,101,216,176, 97,220,228,201,147,247,103,102,102,210,204,204, 76,124, +251,237,183,109, 99, 99, 99,247,223,186,117,203, 22, 23, 23, 55, 28, 64,119,151,181,163, 86, 59,255,245,215, 95, 31,180,127,255, +126,133,125,158,162,146,209, 43,139,197, 2, 65, 16, 48,127,254,124,163, 86,171,157,235, 70, 36, 99,209,119,223,125,215,127,241, + 55,243, 20,188,217, 12, 75, 78, 22,172,185, 57,176,229,100,129,211,105,225,161, 32,168,222,168, 18,178,147,228, 88,177,237,160, +222,106,181,126,231,210, 96, 25, 10, 38,142, 30,249,234,239, 59,118,255, 5,223, 54, 29,145,249,215,214,187,163, 67,149, 2, 97, + 50,155,241,241, 71,211, 40,209,231, 76,254,151,238,232,121,147,169,236,150, 95,147,201, 4, 81, 20, 19,207,159, 63,191,154, 16, +146, 79, 8,105, 95,180,106, 79,105,209, 43,103, 77,142,227,196,218,181,107,175, 15, 12, 12,124, 6,128,182,118,237,218,235,229, +114,121, 71,147,201,212, 92, 20,197,196,147, 39, 79,174, 35,132,220, 33,132,244, 44,250,233, 67,157, 7,203, 98,177, 96,234,212, +169,248,244,211, 79, 49,101,202, 20, 71,126,237,205,132,102,179, 57,114,251,246,237,210,131, 7, 15,210,159,126,250, 41,243,185, +231,158,243, 30, 50,100,136,247,138, 21, 43,198, 3,152, 84,150,230,164, 73,147,176,112,225, 66,140, 26, 53,234,110,119,197,243, + 98, 82, 82, 34, 76,102, 19, 93,190,124,121,178, 32, 8, 62, 95,127,253,181,114,194,132, 9,132, 85, 79,255, 60, 54,155,237,189, +214,179, 55,188, 73,136,210,108,181, 90,231,158, 62,125,114,143,211,141,128,114,246,151,179, 5, 0,248,242,139,217, 18, 74,169, +151,125, 98,216, 25, 51,102, 40, 70,142, 28, 25, 80,150,238,218,181,107,115,102,204,152,225,247,242,203, 47,119,223,179,103,143, +138, 16,178, 5,192,223, 0, 50,138,110, 28,253, 1, 28,172, 84,169, 82,240,234,213,171,171,117,237,218, 85,237, 70, 93,247,253, +130, 5, 11, 34,102,239,243,192, 22,237, 51, 72, 16,159, 3,245,166,240, 13,200, 71,109,205,109,116, 8, 77, 10, 89,185,114,229, + 18, 0,141, 43, 96,174,234,244,235,215,111,195,210,165, 75, 35, 95,125,245,213,196,131, 7, 15, 38, 16, 66,166,151,178,105,230, +139, 47,190,120,107,217,178,101,213, 68, 81,220, 70, 8,233, 78, 41,189,194, 74, 16,131,113,111, 17,172,151, 8, 33, 49, 83,166, + 76,249, 60, 36, 36,164,202,180,105,211,226,107,215,174,173,117,156,109,153,153,154,189,123,247, 70,229,229,229,229, 91,173,214, + 97,148,210,211,165,156,188,157,157,231,202,160,148,222, 34,132,124,222,160, 65,131, 65,191,254,250,235, 94, 15, 15,143,188, 35, + 71,142,120,122,122,122,230, 94,184,112, 65,205,243,188, 46, 62, 62, 30,219,183,111,111, 11,224,155,210,238,146, 74,106,166,164, +164,156,136,138,138,154, 59, 97,194,132, 55, 62,248,224, 3, 5,165, 20, 58,157, 14,121,121,121, 48, 26,141, 16, 4, 1,132, 16, +172, 90,181,202,104, 52, 26, 23, 39, 37, 37, 29,113,165,153,156,156,124,184,114,229,202, 63,204,157, 51,231,229, 87, 6, 13,148, + 33, 55, 19, 57, 41, 73, 32,186, 2,104,148,114,196,116, 10,131, 54,147, 96,233,222,191, 77, 89, 70,243,234,164,164,164, 61,174, + 52, 15,220,206,255,163,101,141,128, 93, 51,102, 76,235,244,206,143,235, 32,138, 34, 46,190,254, 60,178,247,237,128,170,118, 61, +180,186,152, 14,147,201,132, 41,147, 38,128,215,165,238, 63,114,187, 96,173, 43,205, 7,129,179, 38, 33,228, 53, 66,200,243,209, +209,209, 24, 61,122, 52,250,246,237, 91,108,219, 13, 27, 54, 96,193,130, 5, 48, 26,141,207, 19, 66, 78, 80, 74,231, 19, 66, 14, + 20, 29,219, 2, 87,154, 17, 17, 17, 77, 99, 98, 98, 16, 18, 18,162, 43, 50, 23, 93,206,159, 63,223, 56, 58, 58,186,164,230,223, + 69,154,214,135,149,119, 74,105,246,213,171, 87, 61,191,248,226, 11, 98, 54,155, 49,125,250,116,216,141,166,189,229,229,221,119, +223, 13,209,104, 52,248,242,203, 47, 77, 25, 25, 25, 29, 23, 44, 88,176,123,222,188,121,254,171, 86,173, 26,108, 55, 88, 37, 52, +211, 46, 92,184,224,177,112,225, 66,206,106,181,226,171,175,190,186,171, 25,114,252,248,241, 48,155, 45, 16,120,193,100,208, 27, +234, 40, 20,138,107, 62, 62, 62, 74, 81, 20,233,195,202,251,147,172,121,250,244,233, 29, 0,118,184,243, 59,131,193,128,244,244, +116,100,100,100,160,168, 75, 2, 41, 43,157, 6,131,225,228,164, 73,147,226, 22, 45, 90,212,253,224,193,131,253,247,237,219,215, +125,231,206,157,134, 91,183,110, 89, 45, 22, 11, 13, 14, 14, 22,218,180,105,163,232,209,163,135, 90, 46,151,115,239,189,247, 94, +198,204,153, 51,253, 1,100,150, 83,127,242,148, 82,188,221, 54, 31,147, 58,240, 48,153,204,200,201,201, 65, 82, 82, 34,206,159, + 63,143,195,135, 47,130, 82,202, 85,112,127,206, 93,185,114,101,148, 76, 38, 35,171, 86,173,170,178,106,213,170,113,174,246,195, +242,229,203, 35, 86,173, 90, 53,191, 72, 75,100,101,137,105, 50, 42,104,176,138, 78,232,115, 0,186, 19, 66,218,188,250,234,171, +159, 69, 71, 71, 27,173, 86,171,100,219,182,109,181, 50, 50, 50,100, 86,171,117, 18,165,116, 95, 69,254,144, 82,186,144, 16,130, + 62,125,250, 76,170, 90,181,234,174, 19, 39, 78,212,239,221,187,247,182,245,235,215,183,177, 90,173,215,207,158, 61,251, 60,128, +185, 0,190,113, 87, 51, 62, 62,254,253,157, 59,119, 90,143, 28, 57,242,246,228,201,147,229, 1, 1, 1,196,199,199, 7,201,201, +201, 72, 76, 76,164, 63,254,248,163,209,104, 52,126,227,229,229,245,190,187,154, 50,153,236,237,125,199,227,200,229,107,215,134, +191,244, 84, 87, 69,229, 26, 53,161, 33, 53,145,159,153,129,125,123, 82,177,236,239, 83,134, 84,131,233,103,158,231,221, 30, 74, + 31,122, 53,189,219,142, 95,150,254,185,103,215,238,206,179, 62,253,156,132, 12,125, 25,234,136, 72,136, 17,213,177,119,207, 30, +204,156, 49,157,242, 5,169,251, 44,215, 82,187, 60,236,130, 96,159,179, 74, 20, 69, 1, 0,148, 74, 37,198,142, 29, 11,231, 71, +227, 44, 88,176, 0,122,189, 30, 0, 4, 66,200, 23,132,144, 31,202,138, 90,149,161, 89,101,203,150, 45, 85,156, 53,163,163,163, + 75,211, 52, 62,236,252,167,166,166,190,255,226,139, 47,126, 34,145, 72,188,203,218, 70,173, 86, 35, 63, 63, 31, 54,155,205,230, +235,235,123,201, 30, 25, 45,235, 60,210,106,181,239,143, 26, 53,234, 99, 66, 72,153,145, 14,165, 82,121,235,192,129, 3,213,135, + 12, 25,194,173, 94,189,250,198,224,193,131,229, 7, 14, 28,176, 1, 88,199,170,167, 71, 11,231, 1, 11, 90,173, 22, 0,104, 57, +219,222, 38,132, 76,138,139,139, 83,140, 26, 53,170,241,208,161, 67, 61, 59,116,232,160,113,222, 70,175,215,139,155, 55,111,214, + 46, 92,184, 48,115,223,190,125,127,143, 24, 49,226, 25, 20,206, 32, 95, 42,201,201,201,127,124,243,205, 55, 94,237,219,183,175, + 97,179,217, 28,253,175,210,211,211,145,152,152,136,155, 55,111,222, 18, 69,113, 83, 5,179,245,250,144, 33, 67,182, 44, 91,182, + 44,252,213, 87, 95, 77,252,229,151, 95, 54, 1,200, 45,101, 59,205,179,207, 62,219,123,217,178,101,225, 35, 71,142,188, 13, 96, + 28,155,225,157,193,184, 15,131,229, 84, 89, 28, 0,208,146, 16,210,135,231,249,137, 5, 5, 5, 95, 81, 74, 55,222, 71, 69,181, +144, 16,178,237,234,213,171, 47, 3,104,242,213, 87, 95,189, 3, 32, 1,133, 33,244,174,165,245, 87,112,161,103, 3,240, 65,104, +104,232,111,211,167, 79,127, 32,207, 34,188,118,237,154, 9,192,235, 33, 33, 33,191,124,242,203,218,247, 41,165,141,120, 42,250, +217, 8,151,205,113,220, 73,155,205, 54, 51, 49, 49,113,111, 69, 52,215, 20,166,179,107,139, 42, 30, 61, 39,141, 28,242,185, 85, +162,140, 40, 48, 88,101,106,185, 96,146,218,140,183, 56,125,246,123, 71,110, 21, 60, 18, 23, 86,163,209,104,125,230,153,103,190, +231, 56, 78, 4, 0,155,205, 38, 24,141,198,225,168,192,200,211,210, 52,251,246,237,251, 35,207,243,214,162,200, 16,103, 52, 26, + 95,186, 31,205, 7, 69, 70, 70, 70, 1,128, 49,229,109, 19, 27, 27,187,226,207, 63,255, 28,210,165, 75, 23,219, 31,127,252,145, +246,244,211, 79, 11, 39, 78,156,160,132,144, 82,239,226,110,222,188,105, 68, 25, 79, 36,176,211,160, 65,131,240, 31,126,248,225, +196,203, 47,191,236, 57,127,254,124,223, 99,199,142,217,150, 46, 93,154, 87, 80, 80, 48,155, 85, 79,143, 22, 18,137, 4, 42,149, + 10, 38,147, 9,233,233,233,112,213,167,156, 82,122,141, 16,242,244,196,137, 19, 99, 39, 78,156,248,116, 88, 88, 88,157, 42, 85, +170, 84,225, 56,142, 75, 73, 73, 73, 79, 72, 72,184,105, 54,155,119, 1,248, 3,128,180,106,213,170, 39, 1,172, 40, 75,239,252, +249,243, 31,135,132,132,252,181,126,253,250,167,229,114,121,109,153, 76,230,107,181, 90,185,130,130,130, 44,179,217,124,193,104, + 52,254,158,156,156,124,168,130,117,231,101, 66, 72, 7, 65, 16,254, 88,186,116,105,116, 74, 74, 74,196,222,189,123,123,149,220, +174,113,227,198,203,150, 45, 91, 22, 62,122,244,232,107,171, 86,173,170, 80, 31, 44, 6,131, 25, 44,247, 78,198,141, 0, 54, 62, +136, 63,166,148,222, 2,240,126,209,242, 64, 72, 74, 74, 58, 3, 96,200,131,220, 65,201,201,201, 7, 1,116, 3, 10,103,115, 78, + 40,188,104,222, 23, 71,110,231,255, 14,167,199,171, 60, 34,119,231, 70, 66,200,196,162, 81, 77, 0, 48,241,228,201,147,243, 75, + 68,164, 78, 59,175,119, 21,105, 42, 77,243,212,169, 83, 37, 53,207, 86, 68,243,223, 36, 59, 59,251,141,101,203,150, 29,123,253, +245,215,229, 3, 6, 12,192,197,139, 23,241,221,119,223, 25,179,179,179, 87,221,171,230,169, 83,167,110, 53,104,208,160,209,146, + 37, 75,222, 94,188,120,113, 31, 66, 8,123, 22,225, 35,130,193, 96,184, 62,104,208, 32,112, 28, 71, 40,165,212,106,181, 58, 6, + 61, 20,205,103,118,221,141,243,202, 10,224,175,162,197, 21, 95,184, 81, 31, 29, 6,112,248, 1,159,251,183, 9, 33, 79,223,188, +121,115,214,229,203,151,183,150,182,205,185,115,231, 54,116,237,218, 85,117,248,240,225,119, 43, 58,138,144,193, 96, 6,139,225, +146,155, 15,192, 92, 61,202, 20,245,127,250,193,110,142, 42,186,254, 97,105,254, 91,156, 63,127, 62, 27,128,227,145, 33, 81, 81, + 81,232,217,179,231,125,235, 22,153,169,177, 96, 51,183, 63, 82,108,218,180,233,169, 39, 37,175,148,210,219,229,221,156,154, 76, +166, 77, 0, 54,177, 82,193, 96, 48,131,197,184,247,138,214,120, 63,235, 31,150, 38,131,193, 96, 48, 24,143, 50, 4, 64,231, 50, + 46,122,110,143, 14, 32,164,226, 15,218,116,165,207, 52,153, 38,211,100,154, 76,147,105, 50,205,199, 79,211,149,246, 99, 51, 58, +145, 82,250,143, 45, 0, 58, 51, 77,166,201, 52,153, 38,211,100,154, 76,147,105, 62,105, 11,123,160, 44,131,193, 96, 48, 24, 12, +198, 3,134,245,193, 98,252,231,120,238,185,231,248,138,108, 31,239,237,205,229, 38, 86,153,173, 81,201,123,233, 12,198,217, 87, +255,120,247,155,199, 97, 63, 4, 7, 7,215,242,244,244, 28, 6,160,142, 78,167, 11, 80,169, 84,105, 0,206,231,229,229,173, 72, + 73, 73,185,196, 74, 10,131,193, 96, 60,226, 6, 75, 38,147,197, 80, 74, 71, 16, 66,130, 8, 33,119, 40,165, 63,152, 76,166,115, + 79,218,206,146,201,100, 49,132,144, 17,148,210, 32, 74,233, 29, 66,200,191,188, 31, 8, 89,251, 92, 97, 20,178,255, 26,136, 0, +165,172, 72,151, 98,174,146,170, 44, 30,222,167,233,139,147, 71,116, 64,163, 1, 95, 77, 66, 5, 38,177,125, 20, 33,132,240, 81, + 81, 81,175,135,135,135, 15, 92,180,104,145, 52, 42, 42, 10, 10,133, 2,122,189, 62,248,250,245,235,193,163, 71,143,110, 87,181, +106,213,213, 55,110,220,248,174,104,142, 56, 6,131,193, 96, 60, 42, 6, 43,162,114,229, 1, 28, 79,230,153, 45, 54, 31,111,111, +111,238,219,111,191,229,122,245,234,133,223, 55,111,198,216,177, 99,199,133,134,134,136, 82, 65,200,166,162,117,220,205,132,228, + 95,221,249,179,103,159,125, 54,213, 98,177,148, 57,171, 53,207,243,105, 27, 54,108, 8,188,223, 76,133, 54, 30,144,106, 49,155, +203,252, 31, 65,144,164, 37,159, 92,227,214,255, 84,174, 28, 50,128, 39,220, 60,139, 77,244,241,241,241,225,190,249,230, 27,174, + 87,175, 94,216,188,121, 51,198,140, 25, 51, 46, 44, 52, 84,148, 74,248,108,209, 70,199,221, 76, 72,248,245,225, 29, 58, 66,214, +174, 5,135,254,133,159,214,174, 5,215,191, 63,121,162, 77, 86, 70, 70, 6, 1, 0,127,127,127, 90,204, 92,245,110,250,226,123, +175,118,194,204,197,187,160, 55,154, 86,254,215,243, 25, 21, 21,245,250,115,207, 61, 55,240,227,143, 63,150,114, 92, 97, 43,191, + 86,171,133, 94,175, 71,104,104, 40,246,236,217, 35,125,255,253,247, 7,110,216,176, 1, 0,230,177,106,142,193, 96, 48, 30, 33, +131, 69, 56,204, 95,181,232, 11,159,204,172,108,252,178, 97, 27,162,163,163,113,254,252,121,212,138,142, 70,108,179, 6, 92,215, + 86,245, 57,129,144, 74, 31,124,179,124, 62, 0,183,140,133,197, 98, 9, 88,191,126, 61, 8, 33,176,217,108,176,217,108,246, 9, +251, 80, 80, 80,128,113,227,198, 5, 60,136, 76, 89,204,230,128,235,127,175,131,132, 39,176,218, 40, 44, 54, 10,179, 85,132,217, + 74,145,167,179,162,227,211, 67,220,254, 31, 14,220,252, 31,191,249,210, 39, 59, 39, 7,235,255,220,233,216, 15,209,209,209,232, +216,186, 25,247,220,211,237, 56,181, 66, 94,233,149,201,159,184,189, 31, 30, 4,107,159,251,191,185,114,254,174,255, 26, 60, 81, + 17,139,139, 23, 47,242, 70,163,113,144,167,167,103, 11,137, 68, 18,168,242, 14, 22,115,164, 85, 51,181, 36,232,134, 89, 43,107, + 59,162,111,181,238,239,190,220, 30, 51, 23,239,194,143,155,254, 94,230, 21,154, 48,245,191,156,223,224,224,224, 90,225,225,225, +197,204,149,253,161,230,121,121,121,200,207,207, 7,199,113,152, 52,105,146,116,239,222,189, 3,131,131,131,119,178,230, 66, 6, +131,193,120,132, 12,150,201, 98,243, 9,242,243,198,143, 63,252,136, 73,239,204, 64,173, 90,181, 64, 41, 5, 33, 4,239, 76,157, +142,175, 63,154,130,129, 79,181,131,197, 42,250,148,165, 81,218, 80, 75, 66, 8,226,227,227, 97, 48, 24,160,215,235, 29, 75, 76, + 76,140, 91, 9,118,119,248,166,132, 39,248,227, 68,126,161,177,178,136, 48, 91, 69, 88,172, 34, 58,196,120, 84, 72,211, 98, 19, +125,188, 60,212, 88,188,112, 62, 38,125,244, 69,177,253, 48,249,221,247,241,221,103, 31, 96,252,168, 23, 96,178,216,124,238, 37, +157, 21,129,105, 22,231,208,161, 67,193, 42,149,234,171, 33, 67,134,132,140, 27, 55, 78, 70, 5,181,176,237,232, 45,175, 47,127, +216, 21, 98, 48,153,249,167,219, 84,197, 75,125,155, 96,230,146,191,138,204,213,237, 87, 35,115,114,196,255,114,222, 61, 61, 61, +135, 45, 90,180,232, 46,115,149,154,154,202, 21, 20, 20,192,108, 54,139, 69,207, 75,196,148, 41, 83, 36,239,191,255,254, 48, 66, +200, 71, 69, 58, 70, 86,150,152, 38,211,100,154,143,170,230, 19, 99,176, 0,192,108,212, 35,166,138, 47, 22,206,254, 24, 34,229, + 64, 65, 65, 69, 10, 74,109,136,244, 87,195,168,211, 86,248, 15, 69, 81,132,197, 98,129,217,108,198,162, 69,139, 80, 80, 80, 0, + 81, 20, 81,187,118,109, 0, 64,227,198,141,157,155,184,110,199,197,197,133,187,210, 12,168,215,247, 22, 40,170, 56,127,247,225, + 23,223,227,208,201,235, 16, 69, 64,174, 84,161,255,176,145,176,218, 40, 76,150,138, 63,159,212,168,215, 33, 68, 35,193,156, 89, + 83, 65, 4, 9,120, 66, 64, 8, 1, 71, 68,212, 10,245,134,201,160,123,232, 7,174,255, 26,136,107,215, 22, 31, 5, 90,216, 15, +235,201,137, 92,169, 84,170,175, 86,172, 88, 17,222,180,105, 83, 14, 0,142, 93,201,150,127,249,195,174,144,239,167, 61, 67, 26, +213, 10, 66,102,174, 30, 51,151,238,197,238, 19,201, 91, 75,154,171,255, 48,117,162,162,162,138,153,171, 47,191,252,210,127,254, +252,249,161, 0,208,175, 95,191,164, 78,157, 58,101, 92,190,124, 25,193,193,193, 36, 35, 35,227,105, 0,111, 20,221,220, 76,164, +148,206,103,213, 30,131,193, 96,252,203, 6,203,100,212, 35,204, 91,134, 32,141, 0,139,197,138,243,150, 16,228,235, 12, 48,155, + 45,184,109, 54,227,198,169, 59,104,221,186, 53,158,121,230, 25,155,217,108,134, 84, 42,205, 93,191,126,189,175, 43,131,101, 54, +155, 97, 54,155,161,213,106,177,114,229, 74, 8,130,224,120,112,170,243, 19,235, 91,181,106, 85,197, 61, 43,141, 42,215,142,253, + 6, 15, 5, 15,171, 72, 97,181, 82, 88, 69,192,106,163,208,155, 41,158, 25,241, 30,108, 54, 10,155, 72, 97,178,186,238,162, 84, +204,176,249, 54, 69,239, 41,191, 0,208, 56,214,123,202, 41, 38,181,230, 33,147, 73, 32,147, 9, 48,232,244,255,194,161,163,180, +127,127, 34, 62,169,157,220,141, 70,227,224, 33, 67,134,132,216,205, 21, 0,100,231, 25, 5,131,201,204, 55,170, 21,132, 46, 3, + 39, 96,199,234, 47,241,231,193, 43,240,209, 8,251,194, 30, 15,115, 5,157, 78, 23,160, 80, 40,160,213,106, 29,145,171,249,243, +231,135,154, 76, 38, 14, 0, 4, 65, 18,150, 46,134, 42,108, 34,224,229,153,130,236,236, 92, 63, 74, 41, 41, 50, 88, 95, 16, 66, +126, 96, 51,231, 51, 24, 12,198,191,108,176,204,122, 61, 44, 22, 43,172, 86, 27, 44, 86, 27,114, 11,244,248,236,179,207, 32,151, +203, 65, 8,129, 40,138, 40,122, 0, 42,103,177, 88,240,244,211, 79,251,184,250, 67,231,126, 87,148, 82,240, 60,143,230,205,155, +223,181,221,145, 35, 71, 42,148, 17, 15, 5,143,200,206,239,220,245,253,209,223, 62, 6,165,128, 77, 44, 50, 88,102, 55,174,179, + 46, 12, 91,131,182,253, 97, 50,153, 11, 35,122,148,222, 83, 36,239,129,153,172, 39,172,207,149, 29,153, 76,214,121,220,184,113, + 50,231,239,124, 60,229, 86,133, 76,106, 59,113, 49,133,236, 88,253, 37,119,252, 66,178, 40,147, 8, 84, 77,239, 68, 61, 46,249, + 86,169, 84,105, 58,157, 46, 88,175,215, 35, 47, 47, 15,121,121,121,197, 79,104,137,132,188, 58,106,140,191, 68, 42,131,197,108, +194,159, 43,102,178, 90,142,193, 96, 48, 30, 53,131,101, 52,232, 96,177,218, 96,181, 20, 62, 65,222,100, 50, 65,169, 84,162,109, +219,182, 69,151,119,234,120,221,190,125, 59, 76, 38,147,203, 63,180, 90,173,142, 8,150, 40,138,160,148,226,151, 95,126,129, 68, + 34,129, 84, 42,133, 68, 34,129, 68, 34, 1, 33,164, 66, 25,177,218, 40,222,157,252, 54, 36, 2, 7,169,192, 65, 34, 16, 72, 5, + 14, 54, 74, 65, 65, 97,181, 21, 46, 38,171,123,129,140,242, 12, 27, 0, 24, 77, 22,208, 66, 51, 6,157, 78,199, 74,210, 67, 36, + 35, 35,131,232,245,250, 8,111,111,111, 39,171, 73, 81, 73,101, 51, 14,239,213, 32,121,248,135,235, 66, 76, 22, 43,164, 2, 79, + 7,119,141, 78,222,181,126,143, 95,134, 49,135,216, 71, 23,254,199, 57,127,237,218,181,224,202,149, 43, 35, 47, 47, 15, 86,171, + 85,236,215,175, 95,146, 32, 72,194, 4,137,132,244, 28, 52, 70,188,115, 39,217,194,113, 60, 40,181,225,169,231, 70, 19,185, 66, + 41, 53,155, 76, 86, 0, 19, 89,244,138,193, 96, 48, 30, 5,131,165,215,195,106,177, 58, 76,150,217,108, 6, 0,204,158, 61,251, + 46, 67, 68, 41,117,172, 47, 87,211,104, 68, 84, 84, 20, 76, 38, 19,162,163,163, 65, 41,197,160, 65,131,238,218,238,216,177, 99, + 21,202,136,197, 70, 49,235,179,217,119,125,127, 96,205,199,168, 31, 29,137,230,213, 85, 48, 88, 68,228,106,173,247,109,216, 0, +192,100, 50, 3, 69,211,225,235,181, 90, 86,146,254, 69, 44, 22, 11,178,179,179, 97, 44,200,182,214, 12,162,185, 47,247,172,106, + 76,207,210, 9, 28, 53, 88,195, 60,116,198,130,172, 36, 94,165, 82, 61, 22,121,205,203,203, 91, 49,122,244,232,118,251,246,237, +147,114, 28,135,188,188, 60,116,232,208, 33, 35, 93, 12, 85,188, 58,106,140,127,114,114,146,213, 83, 41, 24,165, 82, 9,210,210, +210,196,118, 61,134,232, 7,141,120, 51,228,205,247, 62, 89,148,124,112, 62,235,127,197, 96, 48, 24,143,132,193,210,105, 97,177, +216,138,154, 8,173,142,168,211,216,177, 99,239,218,118,215,174, 93, 46, 13,150, 32, 8,105, 47,191,252,114,177, 41, 18, 40,165, + 88,183,110, 29,100, 50, 89, 49,211,118, 47, 17,172,105,239, 79,128, 76,194, 23, 25,162, 66, 99, 36, 82,138, 77,127,108,199,166, + 63,182, 59,182,229,121, 73,218,253, 24,182, 66,163,104, 1,165, 0, 5,160, 47, 96, 6,235, 97,226,239,239, 79,211,211,211,111, +230,228,228,212, 84,171,213,200,204,204, 68, 86, 86, 22,114,114,114,160,207,203,182,170,173, 57, 90,147, 53, 11,130, 32,224, 78, + 66, 42,108, 54,219,157,199, 36,122,133,148,148,148, 75, 85,171, 86, 93,253,238,187,239, 14,154, 50,101,138, 68, 20, 69, 92,190, +124, 25, 32,132, 74,164, 50,112, 28, 7,137, 68, 64,110,110,158,168,210,120,167,152, 41,175,146, 72,101,224,120, 41,155,112,148, +193, 96, 48, 30, 41,131,101,181,194,106, 41,236,131,101, 54,155, 97,181, 90,177,120,241,226, 98,102, 72, 42,149,130,227, 56,151, + 6,107,253,250,245,197, 38,247,108,220,184, 49,165,148,162, 95,191,126,142,230,198,225,195,135, 99,228,200,145,176, 15, 67,119, + 59,138, 97, 3,166,207,156,237,208,233,209, 37, 22,125,158,106, 7, 42, 22, 26,181,180,179, 27, 42,228,216,202, 51,108, 64, 81, + 4, 11, 20,160, 20, 5,249,249,172, 36, 61,100, 76, 38,211,206,121,243,230, 69,188,255,254,251,178,172,172, 44,100,100,100, 32, + 59, 59,219,177, 20, 20, 20, 32, 40, 40, 8, 91,183,110, 53,231,229,229, 29,121,156,242,126,227,198,141,239, 54,109,218,132,189, +123,247, 14,156, 50,101,138, 36, 40, 40,136,120,121,165, 18,139,217, 4,128,210,244,244,116, 81,165,241, 78,241, 15, 12,187,157, +124, 39, 45,218, 98, 54, 65,180,153,121, 86,106, 24, 12, 6,227, 17, 48, 88, 18,129,203,189,114, 43,197,171,146, 90, 9,171,104, +132,205, 84, 56,181,130,205,102,195,171,175,190,234,216,110,240,224,193,120,225,133, 23,192,113,220, 93,125,176, 8, 33,157, 93, +205,149, 33,138, 34, 14, 28, 56, 80, 56,237, 1,199, 57,150,178, 40, 75, 83,107,180,225,224,175, 31, 65,164,128, 88,232,123, 64, + 65,220, 26, 53, 88,154,166, 43,195,166,240,240, 1, 7, 10,240,192,245,164, 52, 8, 60,151, 91,209,188, 87, 20,166,249,127, 77, +185, 92,190,234,151, 95,126,233, 17, 27, 27, 27, 94,191,126,125, 46, 43, 43, 11, 5, 5, 5, 40, 40, 40, 0, 0,248,251,251,227, +194,133, 11,226,173, 91,183,146,228,114,249, 47,143, 83,222,139, 30,127, 51, 47, 56, 56,120,231,212,169, 83,135,101,100,100, 60, +157,157,157,227,247,251,143, 51,208,253,185,209,164, 93,143,193, 90, 19, 21, 20,137, 41,169,181,246,108,249,217,247,207,213,223, +193,108, 50,141, 36,100,193, 69,251, 52, 13,172, 44, 49, 77,166,201, 52, 31, 53,205, 39,198, 96, 81, 27, 29,183,240,247, 35,243, + 44, 54,209,203,254, 93,157, 58,117, 96, 54,155,177,117,235, 86,135,241, 16, 4, 1,130, 32,184, 21,193, 42,133,219,109,219,182, + 45,111, 42,134,219,238, 29,105,220,110,210, 97, 64,149,242,214, 87, 52, 97,174, 12,219,146, 61,103,255,191, 19, 57, 46, 23,148, +142, 99,197,233,225, 17, 29, 29,109, 59,116,232,208, 91,163, 71,143,254,170, 83,167, 78,161,125,250,244,145, 86,174, 92, 25,114, +185, 28,215,175, 95,199,254,253,251,205, 55,110,220, 72,210,233,116,111,213,175, 95,255,177,108, 30, 75, 73, 73,185, 84, 52,137, +232, 27,246,169, 24,228, 10,165,116,240,136, 55,195, 28,163, 8, 87,127, 7,163, 65, 15, 0, 2,155,166,129,193, 96, 48, 30, 1, +131,117, 59, 41,105, 5,128, 21,206,223, 61,253,244,211, 5,189,123,247, 86,218, 71, 20,218, 71, 3,154, 76, 38,152, 76, 38, 40, + 20,138, 10, 77, 8,229,206, 36,162,238,144,118,102, 67,248, 3,221, 43,110, 24,182,228,228,228,112, 86,124,254, 93, 90,181,106, +149,114,241,226,197, 33, 59,118,236, 24,188,111,223,190,206, 58,157, 46,130, 16, 2,165, 82,121,211,100, 50,237,148,203,229,171, + 30, 87,115, 85, 22,102,179,217, 58,101,250,151, 63,241,130,212, 42,138,102, 98, 54,155, 71,192,205,135,186, 51, 24, 12, 6,227, + 33, 24,172,210,208,233,116,222,132, 16, 33, 57, 57,249,174,117, 82,169, 20,183,110,221,178, 62, 14, 59,229,129, 27, 54,198, 63, + 70,116,116,180,173,232, 70, 96, 69,201,135, 61, 63, 9, 80, 74,141,132,144,137,132,144, 47,138,190,154,120,227,175,185,142,209, +130,132,204, 59,227,188,142, 69,175, 24, 12, 6,227, 17, 52, 88,123,246,236,177, 2,168,136,137, 74,251, 7,210,156,198, 14,219, +147,205,154, 53,107,216,136,184,226, 38,107, 62, 33,228, 7,187,225,114,119, 29,131,193, 96, 48, 30, 17,131,197, 96, 48, 30, 89, +147,101,188,151,117, 12, 6,131,193,248,103, 32, 0,234,150, 81, 41,159,117, 91,132,144,186,247,112, 65, 56,251, 8,105, 6,148, +163,185,211,133,102,231,123, 72, 39,211,100,154, 76,147,105, 50, 77,166,249, 68,106,186,210,126,108, 70, 39,210,162,217,200,255, +137, 5, 64,221,255,136,102,103,166,201, 52,153, 38,211,100,154, 76,147,105,254,123,154,143,219,194,129,193, 96, 48, 24, 12, 6, +131,241, 64, 41,181, 15, 86,165,152,190,224, 74,204,123, 46, 82, 32,253,220,134,123,218, 14, 0,166, 79,159,126, 95,102,238,195, + 15, 63,116,235, 41,205,149,234,246, 5,231,198, 24, 50,145, 0,233,103, 55,184,253,255, 36,188,239,251, 16,241,110,225, 7,124, + 78,111,111,152,198,138,207,189,209, 80, 67,252, 45, 68,210,211, 67, 33,233, 29,225, 33,105,121, 61,199,120, 72,103, 22, 55, 83, + 98,217,120, 62,143,102,179, 61,196, 96,252,243,248, 68,181, 30,226,231, 31, 52, 82,164, 84, 9, 0, 38,147,193,146,148,112,123, + 46,205, 62,191,186, 88,221,231, 91,187,127, 80, 72,216, 88,165, 66,173, 44,172,254,136, 41, 43,243,206,252,236, 27, 7,127,126, + 88,105, 37, 69,207, 78, 11, 13, 13,245, 62,120,240, 96,120,235,214,173,111, 37, 37, 37,229, 56,111, 83,218, 58,106,159,176,177, + 12,205,192,168, 70,207,123,104,212,175, 25,140,198, 72, 47, 79,207,180,172,204,204,133, 41, 55, 78,126,103,223, 38, 60, 60,220, +115,245,234,213,193,131, 7, 15, 78,142,143,143,207,119,165,201, 96,184, 52, 88, 28, 1,214,172, 89, 13, 74,105,209, 36,155, 20, +131, 7, 13, 46,117,187,202,242,228, 72, 81, 20, 95, 0, 48,148, 82,122, 42,217, 82,185,223,189, 36,100,215,174, 93,161, 22,139, +165,169,213,106,109, 4,160,145, 82,165,105, 96, 52, 26,210, 8,232,139, 79, 61,245,212, 73,119,117, 56, 10, 44,249,113, 57,166, +143,106,255, 7,128, 30,101,156, 88,211, 19,141,161, 21, 51, 72, 34,125,239,239,125,235,228,222, 42,130,106,141,159,157, 4,224, +145, 52, 88, 33, 33, 33, 74, 0, 47,114, 28,215, 73, 46,151,215, 48, 24, 12, 55, 1,156, 33,132,204, 79, 76, 76, 76,190,199,202, +141,139,209, 72, 94, 82, 41, 85,221,131,213,178, 70, 41, 57,121, 73, 58,139,184, 95, 36,230, 47, 42,106,136,170, 17, 34,171, 90, +217,123,239,219,125, 98,163,235, 71, 87,133,237,220, 62,152,204,230,222,199, 83,116,189, 23,157, 76,125,171, 26, 33,141,174, 81, +106,114, 51, 93,193, 0, 4, 74,105, 2, 0,132,133,133,249,136,162, 24, 11,160, 1,128, 83, 28,199,237, 79, 76, 76,188, 47,195, +246, 31,210, 12, 17, 69,241,229,192,192,192,167, 83, 83, 83,255,224, 56,110,233,189, 30,111,198,147,129,175, 95,208,107,223,254, +176, 86,102,255, 76, 69, 81, 50,168, 79,251, 97, 0,138, 25, 44,111,111,191, 23,127, 92,245,167,146,252,255, 9, 27,178, 49, 35, +250,143, 4,240, 80, 12, 22, 33,132, 80, 74, 49,125,250,116,178,100,201,146,225, 85,170, 84,169, 78, 41,189, 60,109,218,180,185, +206,219,149, 92,247,225,135, 31,210,162,223,210,210, 52,163, 98,218,108,124,233,133,129,237,199,141,126, 81,163, 82, 42,161,215, + 27,252, 22, 44, 89,254,229,119, 75, 87,244,124,161, 95,231,238, 0,176,120,241,226,190,149, 43, 87,142, 48,153, 76,241,211,166, + 77, 91, 94,158, 38,131,225,150,193, 42,114,233,184,122,241, 20,254,248,125, 11,142,157,186, 0,209,169, 56,213,169, 83, 71, 45, +147,201,250,135,201,184, 23,235, 53,106,217,166,247,115, 47, 18, 11, 81, 97,230,132,193, 21,158, 7,235,196,137, 19,242,148,148, +148, 25,145,181, 26,191,217,190,107, 31,174,118,116, 45,248,251,249, 64,228,100, 88,182,245,138,223,158, 69,195,191, 5,208,210, +109, 31, 68,128, 87,134, 63,143, 80, 25,122,252,186,229, 40, 82,114,108, 32, 4, 32,164,208, 16, 22, 24, 68,188, 59,162,205,135, + 21, 55, 72,132,243, 86, 17,140, 95,101, 0,128, 71,242,185,110,193,193,193,141,252,252,252,190, 27, 62,124,184, 79,141, 26, 53, +130,101, 50,153,202, 96, 48, 84,191,125,251,118,228, 87, 95,125,213, 37, 56, 56,248,211,148,148,148,117, 21,209,140,246, 86, 84, +121,170, 86,248,175,147, 71,189,216,172,102, 68,101, 8,198, 2,136, 70,109,229, 91, 55,174,181,156,245,227,186, 87, 98,188, 36, +131,206,229, 90,220,238,144,168,240,144,190,247,238, 75,131,163,171,169, 41, 76,103, 15, 66,194,243, 80,120,250,160, 57,207,131, + 35,180,246,135,251,147,222, 5,240,161, 27,149,238, 71, 0,222, 5, 64,164, 82,233,186,192,192,192,203,173, 90,181,170, 63,112, +224, 64, 82,183,110, 93,156, 58,117,170,225,239,191,255, 62,162,114,229,202,167, 45, 22,203, 95,106,181,250,200,181,107,215,220, + 50,110,213,170, 85,147,105,181,218, 22, 18,137,164,195,163,172, 25, 18, 18,162, 52,153, 76, 47,132,133,133,189,218,187,119,239, +122,189,122,245, 34, 53,107,214,196,165, 75,151, 26,255,249,231,159, 31, 54,104,208,224, 76, 98, 98,226, 98,153, 76,246, 83,114, +114,178, 91,147, 0, 15,172, 75, 46,173, 62, 75,107,221,235,250, 18,199,200, 27,128,146, 82,154,236,198,182,129, 0,212,148,210, +235, 15, 91,243, 31,186,209,185, 0,192,215,254,208,122,142,227, 28, 15,176,119,126,181,191,183,217,108,218,219,183,111, 87,117, +161, 89, 83, 20, 69,183, 91, 2, 8, 33, 52, 37, 37,229, 82,153,117, 60,168, 12, 0,102,125, 56, 1, 73, 9,183,160, 55,104,245, + 57, 57,153,203, 74,110,151,147,157,181,226,229,161, 61,223,144,201, 20,146,208,202,225,120,119,250,151,176, 71,189, 30, 22,211, +167, 79, 39, 31,126,248, 33, 22, 47, 94,220, 11, 64, 44,165,116,127,116,116,244,188, 18,215, 44,199,186, 15, 63,252,112,238,244, +233,211, 9,128, 82,141, 80,165,168, 6,195,134, 13,234,219,254,157,183, 95,211,216,191, 83, 42, 21,120,251,141,145, 50,189,209, +212,114,193,247,203, 95,157, 59,115,242, 18, 0, 29, 1, 52,161,148, 30, 7,176,188, 60, 77, 6,195,109,131, 37, 82,224,143,223, +183,224,237, 41, 31,224,135,101, 63,225,167,207, 70,146, 38, 77,154,180,165,148,190, 24, 17, 85,173,255,179, 67, 70, 42, 35,170, +215, 69,129,232,137,248, 12, 17, 39,254, 90,133,146,119, 62,174,216,182,109, 91, 19, 74,241,227,232, 41, 95,213,170,223,176, 41, +206, 38, 89,113, 48,193, 6,237, 53, 27, 4, 94, 15, 81,172,248, 16,115,123,179, 95,227,198,141,145,152,109,197,254, 75, 38,240, + 28,192,113, 0,207, 17,240,228, 30,247,148,104,186, 50,227,199, 19, 49, 25,169, 34, 32,154,174, 60,106, 7, 50, 52, 52,180, 99, + 84, 84,212,156, 55,222,120, 35, 40, 37, 37,197,247,216,177, 99,144,203,229,240,241,241, 17,252,252,252,106, 77,153, 50, 37,119, +214,172, 89, 19, 3, 3, 3, 79,166,166,166,222,116, 71,179,142, 70, 22,221,174, 81,204,161,169,211, 62,244, 50, 29,253, 19,217, +171,214,128,231, 40,164,106, 13, 66,148, 74,204,235, 26,225, 59,121,119,194,186,122, 74,101,244, 25,189, 62,201, 29,205,202, 1, +190, 93,171,215,172,133,236,245,223,226,106,158, 17,135,211,141,232,211,174, 25,170,249, 42,209,192,106,131,159, 66,232,232,202, + 96, 17, 66,124, 0, 76, 54,153, 76,156, 84, 42, 37, 10,133,162,255,178,101,203,118,215,172, 89,211, 96,223,166, 69,139, 22,104, +209,162, 5,209,106,181, 13, 14, 30, 60,216, 96,253,250,245,230,224,224,224, 3, 41, 41, 41,115,202,210, 85, 42, 85,183, 13, 6, +125,101,149, 90,109, 90,186,100,201,174, 22, 45, 90, 80,137, 68,130,251,209, 4,128,160,160,160,117, 17, 17, 17,254, 51,103,206, +204,111,214,172,217, 3,209,140,140,140,220, 30, 27, 27,219,161,107,215,174, 66,235,214,173, 17, 18, 18,226, 88,231,239,239,143, +216,216, 88,146,144,144, 80,127,255,254,253,243,183,111,223, 62, 47, 50, 50,242,175,248,248,248,174,174,142, 15, 5,106,222,207, +250, 18,240, 0,102, 17, 66,150, 80, 74, 15,150,115, 60, 27, 1, 24, 2,224,179,127, 73,179, 92,148, 74,101,170,193, 96, 8, 0, + 0,133, 66,145,166,215,235, 3,221, 48, 55,154,207, 63,255, 60, 64, 42,149,130,231,121,216,108, 54,199, 66, 41,133, 40,138,197, + 58,195,126,246,217,103,110,205,237,118,231,206, 29, 45, 10, 71,127, 83,167, 69, 44,237, 53, 34, 34,194,223, 29,205,164,132, 91, +240,176,196,103, 6,122, 40,195, 35, 61,188,103,180,110,221,122,134,243,250, 86,209, 94, 0,242,160,215,223,185,149,148, 0,191, +127,161,110,243, 94,178,100,201, 11,139, 23, 47,238, 67, 8,209, 22,237,223,122,111,190,249,230, 95, 37,246,121,189,162, 87,109, + 72, 72,200, 30, 66,200,230,208,208,208, 31, 1,220, 21, 29,246,210,120,140,124,107,204, 43, 26, 0,152,190, 54, 3,211,214,166, +227,131,103,124, 49,233,105, 53,134, 15,237,167,254, 97,249,175, 35, 1, 44,113,210,190, 20, 29, 29, 77, 46, 94,188,200,204, 21, +227,193, 68,176,142,157,186,128, 31,150,253,132,161, 67,135,225,220,206, 69, 91,158,122,230,249,238, 45,218,118,133, 85, 26,128, + 75,105, 4, 9,241, 20, 2,111, 5, 7, 17, 55,254,222, 72, 57,142,251,169,132, 70,153,211, 38,108,217,178,229,173, 42,213, 26, +124,250,238,180, 79,248,179,169, 50,252,184, 95, 15,155, 49, 23,250,140,107,208,166, 93, 65,254,157, 11,200, 73, 58,123,134,227, +184,105,238,106,222,157, 7, 64,164, 20,132,146,194, 42, 7, 20,119,117, 26,131,155, 67, 66,205,218,139, 81, 53, 99, 98,178,101, + 54,192,172,189,232,250,191, 31,252, 48,211,178, 52, 67, 66, 66,186, 68, 68, 68,124, 49,114,228,200,176, 51,103,206,120,234,116, + 58,237,209,163, 71,247,166,164,164, 4,250,251,251, 39, 12, 28, 56,176, 85, 96, 96, 96, 64,219,182,109, 85,219,182,109,123, 15, +192,203,174, 52,235,170,101, 49,177, 77,235, 30,254,248,243,217,234,140, 53,223,192,116,237, 52, 14,103,232,113, 38, 83, 79, 67, + 61,114,200,128,104, 95,168,100, 2, 70, 54, 14,212,188,177, 45,254,179,162,139,153,203,188, 71, 6, 7, 86,181,232,117, 48,232, + 45,216,114, 61, 87,127, 56, 47, 55,128, 59,125, 59,125, 82,175,166, 10, 62, 61, 25, 65, 26, 73,245,138,238, 79, 66, 8, 20, 10, + 69,169,235,188,189,189,209,178,101, 75, 68, 69, 69, 73, 7, 15, 30,220, 17,192,156,178, 52,205,102, 83,176, 40, 82,120,122,122, + 74, 59,117,234, 68, 8, 33,180,228, 3,204, 43,170, 9, 0,106,181,186, 91,131, 6, 13,248, 85,171, 86, 21,220,185,115,231,230, +211, 79, 63,157,161, 80, 40,196, 18,219, 32, 60, 60, 28,175,191,254,186,244,229,151, 95,118,169, 25, 24, 24,216,101,197,138, 21, + 32,132, 56, 46,220, 37, 9, 15, 15, 71, 80, 80, 16,122,244,232, 33,244,235,215,175, 75,121,251,115, 96, 93,114,201,110,158, 6, +212, 37,229, 94, 68, 6,212, 37,148, 0,151, 75, 70,178, 74,106, 82, 74, 51, 9, 33, 11, 1,172, 39,132,244, 47,205, 16, 17, 66, + 90, 3, 88, 11,224, 41, 74,105,154,171,227,238,172, 41,147,201,164,102,179,217,167,164,241,169,168,166,115,196, 39, 46, 46, 14, +141, 27, 55,134,243,171,193, 96,112, 60,123,149, 16, 18,224,110,249,228,121, 30, 95,125,245, 21,120,158,135, 84, 42,133, 76, 38, + 43,245,181,105,211,166, 21,173, 67, 18, 8, 33, 92,149, 42, 85, 38,243, 60,255,178,201,100, 10,147,203,229,201, 54,155,109,153, +175,175,239,204,184,184, 56, 11, 0,239,210,158, 13,235,172,169, 55,104,245, 84, 20,149, 38,147,193,162, 84, 43,195, 15, 30, 60, + 88,163,172, 99,110, 52, 26,209,169, 83, 39,164,230,107,211,237,191,121, 88,117,221,193,131, 7,195,171, 84,169, 82, 19, 64,108, +209, 87,251,146,146,146,218, 58,125,118,102, 95, 82, 82,210, 83, 69,239, 47,223,190,125, 59,220,110,176,156, 53, 77, 38,115,164, + 70,163, 6, 0, 76, 91,155, 14,227,138,170,144, 15,187,142, 17,205,141,240,240,240,128,205,102,173,249,230,155,111,254,132,194, +115,226,111, 74,105,223, 55,223,124,179, 22,128,221,225,225,225, 27, 0,228, 62,236,122,254, 73,208,124, 44, 13, 86, 81,147,178, +189,105,153,136, 20, 24, 60,104, 48, 68, 10,108,221,186, 21, 98, 97,221,237,153,168,247, 70, 65,188, 63, 4, 78,132,192, 19, 8, + 60, 0, 16,100, 38, 94,128, 73,155,121, 32,209, 20, 26, 47,186,225,239,183,110,221,218, 50,162,118,179,207,166,125,252, 37,247, +195, 62, 61,114,117, 6,100,156,223,132,148, 99,223,167,136, 86,243, 38,142,227,142,115, 28,119,162, 81,253,122,151,130,131,131, +239,121,214,110,145, 2, 54,103, 99, 37, 2,228, 49,139,238,134,133,133, 61, 85,173, 90,181, 79, 70,141, 26, 21, 30, 23, 23,231, +145,159,159,159,190,115,231,206, 75,102,179,249, 36,199,113,115,147,147,147,219,173, 88,177, 66, 53,105,210,164,174, 53,107,214, +172,185,125,251,118,157,203,200,149, 90, 90,255,249, 33, 3, 15,247, 25, 53, 78,113,254,215,239, 32,191, 16,135, 69, 87,178,109, +199,211,245,239, 25, 10,172,115,148, 42,161,117,182,209,186, 99, 66,243, 16, 46, 88, 45, 65,101, 79, 73,123,119,211, 43,147, 41, + 4, 42, 40, 96, 50, 89,161,181,136,166,243,233, 84,251, 86,187,122,102,170,246, 87, 0,128,192,113,130, 27, 39,118, 54, 33,228, + 51,153, 76,246, 62, 33,132,246,233,211,231,102,163, 70,141, 12, 0,160,215,235, 97, 52, 26, 33,145, 72, 96, 48, 24,112,227,198, + 13, 28, 57,114, 4, 62, 62, 62, 21,218,175,217,217,217, 8, 15, 15,135, 70,163,185,111, 77,155,205, 70,190,251,238, 59,217,185, +115,231,100,191,253,246,155,231,132, 9, 19,180,205,155, 55,191,245,244,211, 79,167,121,122,122, 90, 79,157, 58,133,195,135, 15, + 35, 39, 39, 7,205,154, 53,115, 75,211,100, 50, 65, 16, 4,232,245,122,200,229,114, 8,130, 0,171,213, 10, 81, 20, 29,166,171, +160,160, 0, 89, 89, 89,144, 74,165, 40,205, 40, 58, 99, 55, 75, 3,234, 18,250,235,150, 67,105,128, 72, 97,202,183,192,148,107, +129,209,190,100, 91, 6,140,159,221,224,215,179,148, 84,160, 18, 62, 66, 8,233, 15, 96,109, 73,147,229,100,132,250, 83, 74, 79, + 85, 84,211,108, 54, 31,176, 27, 31,133, 66, 17, 64, 72,161, 49,148,203,229, 22,163,209,216,161, 34,154, 0, 16, 23, 23,135, 70, +141, 26,241, 69,154,206,221,108,196,138,158,151,132, 16,240, 60, 15,185, 92, 14,142,227,208,188,121,115,244,235,215, 15,209,209, +209, 72, 72, 72,192,246,237,219,113,241,226, 69, 72,165,210, 98, 77,133,238,208,190,125,123, 62, 50, 50,242, 80,151, 46, 93, 98, +198,142, 29,171, 8, 15, 15,199,165, 75,151,170,204,255, 31,123,231, 29, 22,197,213,182,241,251,204,246,194,210,123, 17, 80, 64, +170,138,128,136, 21, 75,108,177,199, 26,163, 49,177, 39,118, 99, 73,140, 61,154, 24, 99,141, 45,177,247,104, 98,239,189, 87,176, +161,136,162,128,244,222,183,239,206,249,254, 0,124,213, 40, 44,232,251, 38, 95, 50,191,235,154, 11,157,157,185,231,204,204,153, + 51,247, 60,167,173, 90, 53,229,210,165, 75,221, 66, 66, 66, 66,163,162,162,170, 76,115, 70, 90,202,138,126,221, 34, 63, 45,200, +207,219, 90,203,207, 98,150, 70,163,193,195,135, 15, 77,222,231,127, 85,198, 53,109,218, 52,137, 82,250,132, 82,122,145, 16, 82, + 47, 53, 53,181,133,139,139,203, 81, 74,169,252,181,107, 94,154,154,154,218,209,197,197,165,136, 82,122,143, 16, 18, 71, 8, 73, + 74, 73, 73,249,243, 71,146,133,121,118, 73, 73,169,131,153,153, 28,223,116,179,132,248,147,167, 24,221,138, 7,189, 94,143,103, +207, 18,225,233,225, 70,118,110,216, 31, 10,224, 38,128,176,168,168, 40, 0, 8, 5,144,144,156,156,236, 84, 97,176, 56, 56,170, + 29,193,122,189, 23,160,125,189,238,168, 37,226,245,188,127,108,233, 53,111, 29,117,119, 8,252,176, 60, 18, 93, 22,169, 78,186, +115, 12, 44,203,110,202, 52,161, 87,222,213,171, 87, 37, 6, 22, 27, 38,127, 61,135, 89,123, 86,133,204,140, 52,164,157, 95, 8, + 85,214,195,141, 82,169,116, 98,155, 14,157,139,106,114, 34, 47,247,104,116, 17,166, 4, 90,218, 56, 66,163,163,229, 6,235, 85, +147,245, 79,193,217,217,185,139,151,151,215,156, 3, 7, 14,184,171, 84, 42,197,229,203,151, 11, 78,158, 60,249, 68,167,211,173, + 75, 79, 79,223, 86, 94,232, 28,224,243,249,115, 1, 64,161, 80,240,121, 60,158,180,178, 70,154, 65, 22,194,134,131, 63, 29,112, +105,194,178, 95, 37, 79,238,223,193,178, 61, 71, 32, 54,106,141, 15,242,181,221,239, 23,235, 15,149,111,118,166,147,179, 44,149, +130,186, 9, 24, 2,107,169,208, 49,130, 16,201, 85, 74,213, 85,165,217,214,205,157,209,215,242,196, 69,131, 26,102, 10,161, 8, + 0, 92,124,252,121,183, 85,122, 92,190,251, 16, 18,137,149,208,196,151,236, 12,123,123,251,198,231,207,159, 39, 37, 37, 37,234, +123,247,238,193,218,218, 26, 14, 14, 14,176,176,176,192,195,135, 15,113,250,244,105,196,197,197,129, 82,138,250,245,235, 87,235, +218,102,102,102,162,168,168, 8,221,187,247,104,157,150,150, 42,177,119,112,212,158, 57,125,234, 84, 77, 52, 89,150, 37, 0, 16, + 24, 24,136,192,192, 64, 65,106,106,170,229,161, 67,135,204, 22, 44, 88,224,108,103,103,119, 83,165, 82,189, 98,156, 76, 53, 88, + 0,160, 86,171,161,209,104, 32, 20, 10, 33,145, 72, 32, 20, 10, 81, 84, 84,132,204,204, 76, 20, 23, 23,191,136,184,153,170,251, +226,211,100, 75,179, 91,127,206, 28,159,218,215,240, 75,247,114,185,201, 58, 67, 8,169,184,191,153,229,127,123, 85, 86,213, 87, +133,230, 43, 17,150,151,162, 76,130,154,104,134,132,132, 84,104,188, 82, 74, 72, 36,146,172,138,200,149, 68, 34, 49,105,170, 46, + 66, 8, 88,150,133, 80, 40, 68,253,250,245,241,205, 55,223,224,193,131, 7, 56,123,246, 44,156,156,156,208,165, 75, 23, 8, 4, + 2, 36, 38, 38,190,210, 62,203,148,155,147,152,152, 56,165, 93,187,118,129,203,150, 45,147, 36, 37, 37, 33, 54, 54, 22,230,230, +230,152, 51,103,142,120,234,212,169, 94, 87,174, 92,153, 1,224,199, 42,175, 97,222,195, 61,229, 6, 23,193,193,193,159,182,105, +211,230,207,229,170,157,157,197,142, 29, 59,236, 43,140,215,203,251,252,175, 72, 77, 77, 45,152, 53,107,214, 18, 63, 63,191,165, +229,213,130,205, 41,165,242,180,180,180,200, 61,123,246, 16, 0,232,213,171, 23,117,118,118, 62, 87,158, 55,238, 45, 93,186,180, + 85,108,108, 44,157, 53,107,214, 27,203,185,244,172,244, 53, 63, 46, 95,187,100,214,180,241,162,175, 58,201,240, 89,184, 6, 44, +203,130,199,227, 97,217,234, 13,250,184, 7,247,238,134,134,134, 30,162,148,118, 47,143,102,150, 0,136, 35,132, 36,136, 68,162, +180,103,207,158,113,238,129,163, 74,152,151,195,227,111,219, 40,235,222, 62,176, 44,235,100,105,231, 98, 61,252,227,246, 96, 89, +192,192, 2, 6, 35,133, 74, 89,138,140, 71,103,149, 90,173,214,164,135, 46, 55, 55,119,238,224,113,223,123,221,122,206, 71,122, +190, 22, 41,167,231, 80, 77,206,163,143,186,116,233, 50,164, 77,155, 54, 69, 53, 62,145,242,158,143, 46,194,148, 64, 43, 91,231, +115,223, 46, 92,143,155,207,180, 96,233,127, 34, 89, 70, 22, 96,255, 33, 1, 44, 23, 23, 23,111, 43, 43,171, 69, 7, 14, 28,240, + 16,137, 68,138,248,248,120,227,185,115,231,210,244,122,253,170, 10,115, 85,110,194, 6, 4, 5, 5,233,101, 50, 25,148, 74,165, + 90,175,215,151,188,205, 92, 5, 74,165,174, 33, 65, 65, 23, 38, 44,251, 85,162,214,106, 81,168,210,192,206,201,209,120, 47, 95, +217,253, 94,177,230,208,139, 8,151, 66,208, 36,180,142,139, 11,145, 40, 64, 1,164, 22,107,211, 76, 49, 87, 0, 32, 87, 88, 48, +174,161,145, 8, 29,187, 2, 42,158, 5, 5, 0, 43,123,103,166,213,168,239,208, 97,217,121,104,248, 10,147, 45, 48,159,207,215, +120,123,123,171,203, 11, 85,228,230,230,226,193,131, 7,200,203,203,195,138, 21, 43,240,232,209,163, 23, 47,221,234, 25,140, 23, + 47,113,100,103,103,137, 41,165,200,202,204, 16,213, 84,179,194, 96,189,116,239, 48,114,228, 72,126,105,105,169,228,101,115, 85, + 93,131, 85,145, 14, 74, 41,180, 90, 45, 10, 11, 11,161,213,106,241,228,201,147, 23,230,170, 60,130, 86,189,243,215, 22,235,223, +184, 94,157,167,127,135,234,132,203, 0,132, 47, 13, 82,232, 80, 83,115,245,154,241,169, 86,244,167,170, 8, 22,222,208,128, 89, +165, 82, 57, 80, 74, 73, 84, 84, 20, 76,105,127,245,178,193, 18,137, 68,232,221,187, 55, 98, 98, 98,144,156,156, 12, 62,159, 15, +181, 90, 13,181, 90,141, 70,141, 26, 65, 36, 18, 85, 55,130, 69, 5, 2,193,128,209,163, 71, 75, 18, 18, 18,144,147,147, 3,134, + 97, 96, 48, 24, 96, 52, 26, 49,100,200, 16,169, 72, 36, 26,128,106, 54,196,190,125,251,118,251,203,151, 47,215,125,125,201,206, +206, 46, 20,139,197,127,203, 50,112,207,158, 61,164, 87,175, 94,180, 87,175, 94,180,194,104,153, 74,118,194,253, 53,219,118,238, + 59,249,205,172,133, 37, 57,185,121,144,203,229,200,206,201,197,183,115, 23,233,207, 94,186,113,110,228,144,143, 35,150, 44, 89, +242, 61,128,184,242, 93,226,150, 46, 93, 58,104,232,208,161, 91, 42,134,107,224,224, 48, 57,130, 85, 81, 69,248,150, 47,187, 96, + 75, 91,151,179,211,230,255,106,182,247, 46, 15,249,233,113, 80,103,197,193,173, 97, 55,100,198, 93, 6, 53,234,255,120,240,224, + 65,105, 85, 7, 59,126,252,184,143, 91,221,208,177, 13, 66,194,177,240,112, 9, 74, 30,236,132, 54, 63, 97,117,231,206,157,247, +189,235,137,176, 20,152, 48,160, 73,160,149,141,211,185,175,191,255,213,250, 96,140, 0,185,105,113,120,180,127, 10,140,186, 63, +213,138, 29,169,174,190,148,213,138, 74, 10, 50,161, 45, 54, 66,194, 40, 37,127,245,141, 75, 77, 77,125, 18, 24, 24,184,249,151, + 95,126, 25, 81,191,126,125,217,216,177, 99, 31, 23, 21, 21,205, 75, 75, 75,251,237,165, 23,121,235,218,181,107, 79,154, 51,103, +142,215,243,231,207,113,225,194,133, 39, 60, 30,239,230,219, 52, 99, 84,170,148,122, 22,226, 85,151,182,175,251,138,231, 94, 23, +187,102, 77, 54, 92,185,255,176,235,131, 98,195,209, 23,230,202, 76,228, 23, 17,232,125,232,203,209, 35, 24, 99,244, 49, 60, 74, +206, 66,122,169,254,180,201,233, 46, 86,234, 5, 98, 41,204, 28, 61,144,164,102,133,174,174,174, 55,134,246,232, 34,100,120,124, + 48,124, 33,158, 21,104, 76,126,137, 27, 12, 6,241,195,135, 15, 9,128, 87,204,157, 90,173,126,107,196,231,125, 98,170,230,155, +218, 71, 1,128, 94,175,175,177,230,203, 17,155,170,142,197,178, 44, 52,154,106,244, 21,209, 20,188,249, 30,168,114,244,239,227, +178,149,255, 21,189,139,185,170, 48, 62, 21, 13,208,197, 98,241, 11,147, 98,106,148,169,146, 8, 86,141,126,127,147, 65, 23, 10, +133,240,245,245,197,133, 11, 23, 96,105,105, 9, 51, 51, 51,200,229,114, 72, 36, 18, 88, 90, 90, 66, 36, 18,129, 97,170, 53, 68, + 32,213,233,116,181, 92, 93, 93,241,228,201, 19, 72, 36,146, 23,139, 88, 44,134,175,175, 47,148, 74,165, 11,254, 81,177,250,255, + 14,131,122,181,237,182,102,251,222,129,187,246, 30, 26,165, 81,171,131,124,235,122,211,216,251,209,119, 71, 14, 25,208,129,187, + 58, 28,239,213, 96, 85, 82,168, 4, 91,218,186,156,157,242,221, 47,230,187,163, 25, 20,164, 63, 66,210,177,175,139,141, 58,101, + 62,203,234,221,243,159, 94, 2,128, 77, 38,126,201,135, 53,105,221,141, 57, 23,171,133,174, 56, 13, 69, 49,187, 18,197, 98,241, +212,247,113, 34,110,162,148, 64, 43, 27,167,115, 83, 23,252,106,189,247, 46, 31,121,105,113,120,122,100, 90,161, 81,167,108, 29, + 21, 21,245, 98, 28, 45,135,192,238,248,108,202, 18,108,248, 97,188,201,218,159,136, 68,221,250,250, 91,118, 30,210, 60, 13, 70, + 98,196,128,135,177, 29,157,155,147,110,105, 23,233,254,191,242,230,197,196,196,124,231,237,237,205, 24, 12,134,207,116, 58,221, +172,180,180,180, 61, 47, 69,174, 62,112,119,119, 95, 56,119,238, 92,215,164,164, 36,209,213,171, 87,243,110,223,190,205, 26,141, +198,239, 43,211,188, 87,168,153, 28,164, 16,242,188,221,156, 71, 63, 73, 73,233,122,191,200,112,172,226,183, 32,185, 40,176,121, + 3,191,203,115,103,125,173,208, 94,218,131,210,244,100,172,136,202, 40, 98,141,250,105, 38, 70,221,172,221,133,148, 76, 27,250, + 41, 91, 92, 92, 12,153, 72,200, 38, 63,122,202, 27,216,182,133,241,135, 41, 19,153,140,140, 12, 40, 75, 75,249, 46, 46, 46,214, +169,169,169,121, 85, 68, 8,230, 0,104, 93,191,126,125,180,107,215, 46,113,246,236,217,177, 47,155,143,191,153,193,122,227,215, +181, 78,167, 35, 53,213,124, 57,130, 85,149,193,170,118, 4, 75, 83,244,102, 35,165,204,126, 87,131,245,156, 16, 82,171,226,223, +239,227, 30,168,213,106,251,151,170, 6, 65, 41,173,113, 56,171, 60,130, 85,227,223, 95,134, 97, 24, 80, 74, 33, 18,137, 16, 23, + 23, 7, 71, 71, 71, 24, 12, 6,200,229,114,200,100, 50,148, 71,148, 33, 18,137,192,231,243,171,147, 76, 86, 36, 18, 61,143,139, +139,171,107,101,101, 5,163,209,248,138,201, 74, 72, 72,128, 92, 46, 79,173,110, 4, 43, 56, 56,248,184, 84, 42,117,127,125,189, +157,157,157,197,223,245,229,245,114,228,170, 87,175, 94,116,220,184,113,213,214, 88,254,221, 87, 91, 1,108, 29, 55,110,220,230, +237,235,142,132,134,134,134, 30,246,243,243, 35, 0,192,245, 24,228,120, 47, 6,171,162, 80,170,248, 91,209,158,201, 69,152, 18, +108,105,227,124,118,210,220,181,230,219,111, 49, 40, 76,143, 69,218,169,233,133,172, 78,217,154, 97,152,244,228, 43,191,236, 1, +160,140,142,142, 62,111, 23,216, 29,132,148,245,220,123,211, 72,238,229, 5,125, 67, 95, 31, 31,236,142, 49, 64,157,113, 23, 12, +161,155,218,182,109,171,124,215,147, 8, 9, 9, 9,180,178,113, 58, 55,121,254, 47,214,187,111,243,145, 95,102, 2, 11, 89,157, +178,117,170,206,245,149, 65, 74, 89, 2,108,248, 97, 60, 88, 19,138,225, 33,132, 88,241,228,146, 85, 3,219,133,245,113,175,227, + 10,150,234,193, 10, 41,122, 78,182,229,199, 69, 43,247,213,106,199,251,141, 45, 97, 71,165, 92,253,235, 70, 31,127,242,228,201, + 92, 71, 71,199,189, 25, 25, 25, 47, 90,167,186,186,186,118,244,240,240,152, 63,103,206, 28,143,148,148, 20,197,237,219,183,139, +246,236,217,147,192, 48,204,156,244,244,244, 42,191,238,239, 23,235, 38, 6,154,137,214,197,148, 24, 94,140,161, 19, 32, 23,214, +255,116, 96,255,171,109,251,127, 42,121,122,106, 43,172, 19, 30, 98, 89,116,166, 49,181, 88,221, 63, 86, 73, 51, 76, 49, 87, 98, +177,120,207,138, 61,123,158,212,171, 87,143,148,150,150, 66,175,215, 35, 39, 39, 7, 63,110,219,253,128, 82, 10, 43, 43, 43,156, + 58,117,138, 29, 59,118,236, 30, 23, 23,151, 94,111, 51, 89, 47, 13,211, 0,161, 80, 72,164, 82,169,103, 98, 98, 98,162,135,135, +135,250, 77, 38, 69, 44, 22, 87,219, 96, 73,165, 82,176,236,219,131, 0,213,209, 52, 24, 12,196,148,245,213,209,172, 72, 91, 69, +227,246,215,215, 87,192,227,241,192,178,108,165,231,242,103,247,246,150, 8,150, 50,235,157, 12, 22,165,212,189,162, 35,205,223, +173, 32, 44,143,132, 1, 0,251,182,161, 24,170, 19,193, 42, 55,123, 16,137, 68,184,112,225, 2,186,116,233, 2, 74, 41,196, 98, + 49,100, 50, 25, 36, 18, 9, 46, 95,190, 12,145, 72, 4, 30,143, 87,157, 40, 22, 53, 24, 12,219,126,254,249,231,175, 23, 44, 88, + 32,173, 56, 70,133,193,250,233,167,159, 84, 26,141,102,155, 41, 6,139, 88, 5,244,181,180,178,254,164,160, 32,119, 83, 19, 95, +203, 74,123, 17,190,105,159,242,246, 88,255,117, 42,134,105,160,148,118,123,125, 40,134,138,109,198,141, 27,135,215,135,112,168, +108,152, 6,103,103,103,171,117,235,214, 13,101, 89, 54,160,124,213,235,189, 5, 43,238, 99,197,251,169,162, 87,225, 43,189, 8, + 57, 56,170, 29,193, 98, 8,224,196,127,238,103,105,227,122,118,194,220,181,230,155,175,243, 80,152,254, 16, 57,103,191, 45,164, + 6, 85,235,168,168,168,219,246,245,186, 35,188,105,235,102,109, 63,236, 5,135,131,187,113,243,202, 25,252,184, 98, 3,190, 26, +253,121,165, 31, 74,246,246, 54,200,185,162,134, 62,255, 9, 8, 33,209,239,122, 2,141, 26, 53,242,182,180,118, 60, 55,105,222, + 47,214, 59,162,248, 40, 72,251,143, 9,156,182,242,236,237, 47,134, 14,122,101,123, 83,167,199,249, 68, 36,234, 22,232,227,186, +190, 95,199,166, 86, 22,196, 0, 67, 82, 44,214,125,218, 7, 81, 93,116,104,218,215, 2,141, 58, 41,224, 21, 44,233,115,228,215, +188, 54,206,205,201,144,191, 50,154,245,178,185,114,118,118,238,226,234,234, 58,251,240,225,195,238, 6,131, 65,113,225,194,133, +226, 61,123,246, 60, 53, 24, 12,203,211,211,211, 15,155, 28, 29, 43,209,190, 48, 87, 65, 22,194,134, 67, 62, 27,116,105,236,210, + 53,146, 7, 81, 55,177,112,219, 65,152,243,244,198, 91, 25,234,222, 49, 37,255,169, 62,172, 52,163,241,249,115,119,236,216, 33, +247,247,247, 39,185,185,185, 47, 34, 45, 58,157, 14,133,133,133, 40, 46, 46,134, 70,163, 65, 80, 80, 16, 51,107,214, 44,249,183, +223,126, 59, 23,192, 40, 83,211,107,103,103, 7,161, 80, 8,157, 78,247,194,164,136, 68, 34, 88, 90, 90,162,176,176, 16, 39, 79, +158, 68, 85,131, 83, 10,133,162,116,134, 33,110,102, 10,133, 94, 46,151, 83,185, 92,254,167,109,170,171, 89,110,114,178, 59,118, +236,104, 55,103,206, 28, 65, 72, 72,200,139,245, 21, 85,132, 53,209,164,148, 42,219,181,107, 39, 91,190,124, 57,220,221,221,161, +213,106, 95, 49, 82, 12,195, 64, 40, 20, 34, 57, 57, 25,243,230,205, 3,165,212,244, 15, 25,117,190, 30, 65,131,236,161,202,213, + 67,149,171,135, 58, 71,135,210, 44, 61,244, 74,227,223,173, 0,171, 73, 3,116, 19, 34, 97,246,239, 26,193,170,168,174, 20,139, +197, 72, 76, 76,196,241,227,199, 17, 17, 17, 1,115,115,115,148,150,150,226,226,197,139, 72, 77, 77,133, 88, 44, 6,143,199,171, + 86, 35,247, 90,181,106,253,112,227,198,141, 46, 99,198,140, 9, 24, 54,108,152,212,207,207, 15, 9, 9, 9, 88,178,100,137,250, +222,189,123,241, 86, 86, 86,115,128,170,231,153,117,113,171, 53,118,221,182, 67,130,193,253, 59,142, 6, 74, 97, 74, 47,194, 87, +247,249,223, 52,118,127,203, 48, 13, 29,223,178,249,203, 67, 56,188, 50, 76,195,203,236,219,183,207,211,197,197,197, 15,101, 61, + 3,129, 63,247, 22,124,153,155, 81, 81, 81, 97,224,122, 17,114,188, 15,131, 85, 94, 64,143, 15,255,232, 27,243, 77,215,248,200, + 79,141, 65,225,197,153, 47,204, 21, 80,214,240,221,190, 94,119, 24, 89,138,214, 29, 62,170, 24, 20,244,245, 66, 38,232,229,113, +171, 4, 18, 69,144,129, 10, 1,168, 97, 40,120, 10,145, 72,116,187,186, 9,126, 93,147,101,217,137,141, 63,250,198,122,203, 77, + 62, 10,211, 30, 34,251,220,140, 66, 86,167,108,157,172,117,189,253,197,208, 65, 38, 53,106, 39,132,180,173, 24,211,227, 19,145, +232, 91, 1,143, 76,255,176, 69, 67, 97,179, 96, 31,200,179, 18,145,145,146,134, 93, 15,179,243,226,243, 53, 67, 46, 19, 29,146, +158,106,214,117, 26,106,109,109,229, 40, 64,231, 17, 54,214,215, 14, 22,237,115,105,205,232,168,142, 46, 72,187, 68,103,189,174, +249,190,168, 74,211,197,197,197, 91,161, 80,252,120,236,216, 49, 59,145, 72,100,254,224,193, 3,227,222,189,123,147,141, 70,227, + 79,233,233,233, 59,107,162, 25, 40,149,186, 6,212,245, 60, 63,118,241,106, 73, 73,169, 18,165, 90, 29,156,221, 92,140,231,163, + 99, 63,138, 41,209,238, 55, 69,211,193,193,161, 85,255,254,253,235,135,132,132, 48, 47,155, 43,173, 86,139,162,162, 34, 20, 23, + 23,163,168,168, 8, 69, 69, 69, 72, 77, 77, 69,211,166, 77, 25, 63, 63,191, 32, 7, 7,135, 86,153,153,153,103, 95,215,124,105, +152,134,175, 1, 48, 50,153, 44,238,202,149, 43,234,143, 62,250, 8, 82,169, 20,165,165,165,112,117,117, 5,203,178,184,120,241, + 34,226,226,226, 10, 0,236,200,200,200, 56, 85, 89, 58, 85, 42,101, 45, 66, 8,207, 92,161,104,219,190,125,251,254, 67,134, 12, +177,124,121,251,154,104, 2, 64,118,118,182,199,133, 11, 23,190,237,214,173,219,232, 14, 29, 58,200,166, 77,155, 38,240,244,244, +132,193, 96, 32, 53,213,204,207,207,183,136,142,142, 94,212,172, 89,179, 47, 58,116,232,192,159, 63,127, 62, 44, 44, 44, 96, 52, + 26, 33,149, 74, 81, 84, 84,132, 57,115,230,224,210,165, 75, 6, 74,233,202,194,194,194, 73,149,105,190, 50, 14,214,132,197, 13, + 42,203,135,111, 27, 7,235,175,200,243, 42,149,202,161,186, 81, 49, 83,210, 25, 29, 29, 77, 95, 31, 15,171,178, 8,214,155, 52, + 43,162, 75,124, 62, 31, 25, 25, 25, 56,116,232,208, 43, 99, 96, 85, 44,111,171, 34,124, 75, 58,233,185,115,231,140,132,144, 8, +131,193, 48,101,220,184,113, 67,148, 74,165,171, 92, 46, 79,211,233,116,155, 44, 45, 45, 43,198,193, 18, 86,165, 41, 18, 73, 4, +132, 97, 32,149,200,165, 42, 85,118,210,155,122, 17,190,118,173,147, 68, 34, 7,155,138,125,254, 87,247,253,181, 97, 26, 94, 25, +138,225,181,125, 94, 25,194,225,245, 97, 26, 94,214,236,222,189,123, 2,128, 71,148, 82,134, 16,242,232,245,222,130, 47,201,214, +141,138,138, 10, 11, 13, 13, 61, 79, 41,149,189,222,139,240,175,200,243,255,100,205,127,141,193, 2, 32,185, 28,245, 24,140, 56, + 11,197,215,127,124,197, 92,189,120,210, 89,224,230,149, 51, 96, 89,160, 69,187, 30, 85,154, 25,131,166, 52,126,238,174,103,193, + 70,173, 10,134,162,164,184, 14, 31,118,202,122,151,196,219, 5,245,128,155,144,202, 47, 69,199,131, 47,201, 69,193,181, 31, 10, +136, 81,211, 58, 42, 42,234, 78,141, 51, 13, 48,109,245,209, 61, 66, 98, 97,141,187,227, 6, 35,173,160, 20, 71,159,229,255, 70, +149,154, 81, 91,105, 89, 85,160,107, 4,185,184,254,155,140, 85,205,123, 90,244,177,117, 17, 96,241, 87,155, 32,153,106, 35,108, +212,166,197, 95, 58, 71, 97, 69,195,247,117,235,214,141, 12, 9, 9, 49,251,242,203, 47, 31, 23, 22, 22,190,210,240,189,186,196, +168, 84, 41,129, 10,209,234,179,191, 44,254, 74, 26, 24,142, 61,243,166, 25, 47, 68, 63,234,126,191, 88,123,200, 84, 13,177, 88, + 28, 57,106,212, 40, 97,105,105,233,159,204,213,235, 6,171,168,168, 8,119,239,222, 69,175, 94,189,196,177,177,177,145, 0,206, +190, 37,130, 51,163,124,192, 73,190,173,173,109,246,234,213,171,187,109,217,178,165,231,144, 33, 67,196,145,145,145,120,240,224, + 1,110,220,184,161,209,106,181,127, 8,133,194,253,137,137,137, 38,181,242,166,148, 26, 1, 28,247,240,240, 56,191,122,245,234, +110, 44,203,190,152,207,242, 29, 52,245, 0,102, 88, 91, 91, 47,218,179,103,207,194, 51,103,206,244, 31, 56,112,160, 68,175,215, +147,119,208, 52, 0, 24,103,103,103, 55,253,200,145, 35,155, 78,156, 56,209,253,147, 79, 62, 97,198,140, 25,131, 21, 43, 86,224, +247,223,127,103,141, 70,227,126,129, 64, 48, 40, 59, 59,187,202, 14, 40,175,140,131, 85,201, 56, 87, 85,253,110, 2,183,254, 11, + 89,255,157, 53, 95,143,132, 53,108,216,208,225,229, 94,154, 47,255, 53, 53,130, 69, 8, 65,104,104,232, 43,255,175, 24,146,129, +199,227,189,178, 84,167,138, 16,128, 37,165,148, 5,176, 18,192, 10,188, 58,138, 59, 15,255, 25,233,221, 36, 92,220,220,145,154, + 12,155,156, 82,117, 65,229,147, 61, 59,216,184,184,185,255, 21,229, 90,193,172, 89,179,150,204,156, 57,115,201,235, 67, 49,188, +188,221,235, 67, 56,204,158, 61, 27,111, 27,166, 33, 45, 45, 45,127,214,172, 89, 63, 0,128,159,159, 31, 41,175, 22, 12, 69,121, +111,193,151, 52, 55,163,108,170, 28,217,176, 97,195, 6, 2,120,171, 38, 7, 71,117, 12,214,215, 37, 81,203,244, 0,108, 8, 33, +211, 82,117,174, 15,254, 92,136, 0, 63,174,216,240,202,164,208,149,193,227, 49,211,178, 14, 14, 94, 78,129,124, 30,193,180,119, + 77,188,149,165, 57,140,197,198,111, 74,163,151,179,148, 82, 75, 66,200,212, 91,183,110, 61,120,103,103,110, 97,141,226, 57, 35, +241,123, 76, 26,205, 40,213,247,216,170,125, 53, 82, 83,222,230,170,175,115,115,178,203,202, 89,176,119, 92,107, 27,114, 56,111, +224,223,226,134,198,196,196,204,247,246,246,230,173, 89,179,230, 51,173, 86,251, 74,195,247, 26,107, 22,107, 39, 7, 41,132, 60, + 63, 79,183,209,177,137, 73,221,238, 23,155, 86, 45,248, 18, 34, 23, 23,151,251, 74,165, 18,132, 16,104, 52,154, 23,198,170,184, +184, 24,133,133,133, 47,254,175,211,233,144,157,157, 13, 79, 79, 79,188, 52,102,210,219, 76, 70,250,203, 30,193,202,202,234,216, +242,229,203,251, 47, 95,190,188, 13,128,211, 42,149,106, 71,126,126,126,141,134,254, 40, 55, 58,187,164, 82,217,143,132, 16, 23, +177, 68,170,189,116,233,210,209,119,209,204,203,203, 43, 6, 48, 66, 42,149,206,253,249,231,159,151, 75, 36,146,176,172,172,172, +119,210, 44, 55, 79, 31,217,216,216, 56,111,222,188,121,247,250,245,235, 27,243,249,252,107,132,144,222, 5, 5, 5,213,158,236, +153,188,250,245, 94,237,223, 77,224,247,255, 66,182,127,103, 77, 83,135, 95, 48, 21,131,193, 80, 50,115,230,204,172, 55,205, 59, + 88, 97,166, 94, 94,167,211,233, 76, 26,230,196,209,209,209,228,177,200, 42, 27,122, 7, 0, 24, 66, 84, 0,164, 95,207, 94, 84, +254,193,108,242,100,207, 32, 32,218,255,101,185, 54,115,230, 76, 58,123,246,108, 66, 8,217,143,178,241,168,158,188,222, 8,253, +229,223,102,207,158,141,153, 51,103,210, 89,179,102, 85,169, 25, 27, 27, 75, 9, 33,167, 1, 36, 0, 72,124, 89,247,229,245, 21, +251, 84,166,201,193, 81,165,193, 98, 41,144,170,115, 77, 6, 48,248,229,117,127,126,193,225, 79,109,174, 42,243, 88, 29, 58,116, + 56, 13,192,239,125, 37,190, 32,191, 16,196,186, 97, 82,126,126,238, 39, 89,247,247,191, 23, 77, 22,248,113, 72,163,200,175, 0, + 16, 10, 44,126,221, 92,189,242, 21,116,145,238,119,106, 74, 22, 52,106,211, 98,124,249,203,103,254,223,225,166,190,169,225,251, +187,242,166,134,239,213,120,217,156, 16,139,197,164,184,184, 24, 42,149,234,149,104, 85, 81, 81, 17,148, 74, 37, 74, 74, 74, 80, + 49,181, 71, 73, 73, 9,204,204,204,160,215,235,171,245,165, 88,110, 82, 86,135,132,132,172, 43,175, 38,121,103, 84, 42,165, 43, + 0,132,132,132, 8,222,159,166, 42, 13, 64,207,247,169,153,155,155,155, 6,160,137,151,151,151,200,212,201,162, 43,139,100,213, +244,119, 19, 88,243, 95,200,242, 91,241, 55, 35, 41, 41,201,255,125,107,166,165,165,197,189, 79,189,220,156,140,181, 95, 12,238, + 53,170, 98,210,103, 83, 38,123,174, 48,102,121,185, 25,107,255, 87,215,178, 98,154, 17, 0,212,197,197,101,243,243,231,207,221, + 9, 33, 73,175, 71,146, 94,255,109,214,172, 89,120,219,152,127, 47,107, 2,128,167,167,231,190,228,228,100,103,161, 80,152,254, +178,238,235,235, 43,211,228,224,120, 83, 70,251,175, 45, 0,130,254,159,104,182,229, 52, 57, 77, 78,147,211,228, 52, 57, 77, 78, +243,175,211,252,167, 45, 12,103, 49, 57, 56, 56, 56, 56, 56, 56, 56,222, 47, 4, 64,208, 91, 34, 91,247, 77, 22, 33, 36,168, 6, +145,179,251,127, 35, 77,251, 74, 52, 79, 85,161,217,182, 6,233,228, 52, 57, 77, 78,147,211,228, 52, 57,205,127,165,102, 85,218, +255,152,222,137, 92, 21, 33, 23,230,229, 52, 57, 77, 78,147,211,228, 52, 57, 77,174,138,144,171, 34,228,224,224,224,224,224,224, +224,248, 91,243,214, 97, 26,122,214, 43,235, 62,252,199, 61,174,195, 4, 7,192,227,241, 22,180,104,209, 98,212,165, 75,151,126, +210,235,245,115,106,162, 65, 8,113,118,112,112,248,142, 82,218,132, 16, 34,230,243,249, 15, 51, 51, 51,231,235,245,250,139, 53, + 77, 23, 33,196,205,209,209,241, 59,150,101, 27, 3, 16,242,249,252,152,180,180,180,121,148,210,107,239,160,105,238,232,232,216, +138,101, 89,215,178, 83,231,101,165,167,167, 95,164,148,166,114, 57,129,131,131,131,131,163,198, 6,235,163, 0, 2, 6, 64, 64, + 36,156,102, 15, 39,252,153,107,105,114,197,139, 7,101,131,177,249, 1,136, 5,112,139, 82, 90,244, 46, 9,248,255,162,249,119, +135, 16,194, 88, 90, 90,182,147,201,100, 99, 75, 74, 74,130,205,205,205, 99,202,167,199, 57, 84, 62, 40,225,187,104,219,247,239, +223,127,234,186,117,235,208,167, 79,159,233,132,144, 37,148,210,146,234,104,216,216,216,116,245,244,244, 92,187,124,249, 10,187, +102,205,154, 17,169, 84,138,216,216, 88,151, 81,163, 70,134, 58, 59, 59,239, 74, 75, 75,251,162,186,233,178,179,179,235, 93,167, + 78,157,229, 43, 87,174,180,107,210,164, 9, 17, 8, 4,136,138,138,114, 29, 59,118,108,184,147,147,211,166,244,244,244,137,213, +213,180,182,182,246,175, 93,187,118,135, 85,171, 86,201,154, 54,109, 10,177, 88,140,187,119,239, 42,134, 15, 31,238,226,236,236, +124, 55, 45, 45,237,100,117,244, 66,134, 71, 11,132, 50, 29, 31, 0,116, 74,161, 33,106,109, 67,189,169,235,184,226,137,131,131, +131,227, 31,100,176,122, 7, 16, 16, 0,129,205, 48,135, 24,240, 53, 24,144,113,253,201,111, 43,126, 99,110,180,109,219,214,247, +243,207, 63, 39,229, 83, 71,248,239,220,185,243, 35, 30,143,247,136,101,217,235, 0,238,184,184,184,232, 42,166, 37,120,157,246, +222,228,197, 24, 89, 39,159, 66, 8,160, 1,195, 48,225, 85,105,126, 80, 7, 58, 66,128,227, 79,222, 28, 73,107,231, 69, 0, 10, +156,124, 86, 61,205, 19,241,255,140,200,156, 66,161,240,182,179,179,155,104, 99, 99,211, 49, 52, 52,180,104,196,136, 17,137, 15, + 30, 60,120,236,235,235,171, 94,191,126,253,124,189, 94,191,202,199,199,231,100,113,113,241,162,119, 24, 23,203, 67,175,215,227, +209,163, 71, 96, 24, 70, 0,192, 19,192,189,106, 24, 52, 39, 15, 15,143, 53,103, 47, 71,219, 23,105,121,120,146, 77, 1, 40,193, + 10, 29,177,122,195, 46,171, 25, 83, 70,247, 55, 55, 55,191, 84, 84, 84,180,171, 26,154,110,117,234,212, 89,126,255,254,125,123, +137, 68, 2,150,101, 81, 92, 92, 12,103,103,103,172, 95,191,222,234,171,175,190,250, 76, 38,147, 93, 80, 42,149, 7,171, 99,204, +107,215,174,221,225,193,131, 7, 50,177, 88, 76, 12, 6, 3,209,104, 52,112,115,115,163,219,183,111,151,140, 25, 51,166,129, 88, + 44,126,174,209,104, 30,155,100,174,126,137, 22, 20,229,156,141,160,201,170,233, 0, 64, 36,210,121,145,179,173,111, 20,229,156, +109, 84,213,186,144, 95,112, 53,106, 24,103,178, 56,254,183, 56, 57, 57,133, 88, 89, 89,237, 41, 40, 40, 56,159,158,158, 62,164, +124,102,131,119,253,248,115,230,243,249,158,148, 82,203,242,255, 23, 24, 12,134, 4, 83,230,220,124, 27,182, 94,173,186, 64, 44, + 27, 12,202, 54, 96, 0, 16,134,185, 99,212, 41, 55,230,196,157, 61,248, 78,154, 34,233,103, 0,109,192, 0, 44, 97,152,187,172, + 65,249,107,118,236,217,163, 92,206,224,120,111, 17,172,128,112, 88, 17, 96,202,180, 17,195, 24, 62,143, 71,230,175,253,165,223, +205, 43, 7,169, 83,173, 6, 47,166,220,104,222,188, 57,154, 55,111, 78, 22, 46, 92,232,119,230,204, 25,191,237,219,183,235,175, + 92,185, 18, 5, 96,211,155, 52, 41, 5, 90,118,144, 62, 55,232, 85,110, 77, 63,144,170, 61, 26,175,218,222,164, 73,115, 86, 44, + 22,163, 50,205,147, 87,174, 68,125, 80,231,205,154,101,194, 64,157, 96,254, 73,151,134,110, 36,178,243,140, 36, 83, 53,223,150, +206,255,103,230,234,188, 66,161,240, 26, 62,124,248,147,145, 35, 71, 94,144,203,229, 20, 0,148, 74,165,184, 75,151, 46,249,221, +187,119,207, 85, 42,149, 88,189,122,181,219,242,229,203, 79,154,155,155,167, 22, 21, 21, 53,170, 78, 84, 12,192,204,174, 93,187, + 78,255,242,203, 47, 81,171, 86, 45,140, 25, 51, 6,122,189, 62,138, 16, 50, 3,192,247,166, 12,186,103,111,111, 63,115,233,210, +165,246,165,122, 1,190,221, 18,143,188,146,178, 1, 69,101, 34, 6, 95,180,149, 96,244,232, 49, 22, 55,110,220, 88,136,215, 70, +144,174, 12, 71, 71,199,239, 86,174, 92,105, 39,145, 72, 64, 41, 69, 73, 73, 9,138,139,139, 81, 82, 82,130,210,210, 82,140, 28, + 57,210, 34, 38, 38,102, 41,128,131,213,208,108,181,106,213, 42,153, 88, 44,198,201,147, 39,235,106, 52, 26,158, 86,171,133,209, +104, 52,214,169, 83,231,209,151, 95,126, 41,190,127,255,126,123, 0, 38, 25, 44,167, 12, 8, 10, 85,170,149, 63,255,240,149, 29, + 0,124, 57,229,199,149,128, 42,156,154,176,206, 41, 3, 97, 0, 56,131, 85,121,254,228, 1,232, 33, 16, 8,122,122,121,121,133, + 62,121,242,228,182,193, 96,248, 3,192, 31,229,211, 19,189,139,118, 27,103,103,231,239,210,210,210,126,166,148,110,253,183, 92, + 83,123,123,251, 63,246,238,221,235,182,101,203,150, 79,127,253,245,215, 35,120,135, 81,242, 9, 33, 2, 0, 17,141, 26, 53,178, +237,217,179,167,192,209,209, 17, 74,165, 18,241,241,241,178, 83,167, 78,217, 73, 36,146, 92,141, 70,115,181, 58,247,202,182,110, + 83, 51,240,205,119, 70,180,106,219,172,207, 71, 61, 20, 14, 54, 22, 80,105,141,120,146,148, 94,235,216,145, 3, 45,157,131, 62, +188,162,211, 21,246,203,137,187, 92, 82, 93,205, 86, 29, 58, 55,107,219,166,141,194,194,210, 2,133,165, 58, 60, 77, 76,117, 63, +123,242, 96,115,167,160, 15, 47,176, 68,255, 73,230,189, 19, 74,238,169,227,168, 14,127,106,228,190,251, 1,125,211,131, 2,185, +153,252,141, 2, 22, 22, 22,136,140,140,196,252,249,243, 5, 0, 26,191,106,170,254, 51,108, 2, 3,192,104,212, 58, 77,255, 98, + 52, 68,124, 42,254,176, 99,123, 98,110,110,110,146, 38,239, 45,154, 0, 64, 25, 33, 28,172, 13,109,195,235,170, 90,102,222, 25, + 51,224,206,249,239,130,180,234, 2,193,235,154, 50,153, 12,222,222,222,248,230,155,111,222,148,206,247,222, 37,244,127,161, 73, + 41,117,246,247,247, 47, 94,186,116,105,221, 89,179,102, 89,169,213,106, 57, 0, 55,175,128, 70,174, 12,195,184,169,213,106,243, +153, 51,103,218, 45, 92,184,176,174,157,157, 93, 1,165,212,174,154,233,156,187,114,229,202, 25,251,247,239,103,154, 55,111, 14, + 43, 43, 43,180,106,213, 10, 71,142, 28,225,255,244,211, 79,243, 1, 76, 55, 37,157, 12,195, 52,111,214,172, 25, 97, 89,138,252, + 18, 61,206, 46, 8,193,229, 31,195,160,212,178,200, 47, 40,130, 90,173,134, 76, 38,147, 18, 66,204, 76, 61,119,150,101, 27, 55, +105,210,132, 0,101, 35,191,151, 45,165, 40, 46, 46,251,171,213,234, 32, 16, 8, 20,132, 16,113, 53, 52, 93,155, 54,109, 10, 0, + 80,169, 84,252, 54,109,218,144,214,173, 91,147,226,226, 98,126,197, 52, 62, 2,129, 64, 68, 8,225,155,162,169,149, 9, 8, 75, + 89, 7,185, 76,106, 43,151, 73,109, 89,202, 58, 0,128, 41,235,180, 50, 1,249, 43,243, 39, 33,196,142,199,227,109,240,242,242, +122,200,227,241, 54, 19, 66, 28,223, 69,147, 16, 18, 70, 8,153, 47,147,201, 78,249,251,251, 39,203,229,242, 51,132,144,239, 9, + 33, 17, 53,209, 36,132,136,100, 50,217,153,249,243,231,239,190,125,251,118,159,211,167, 79,123,222,187,119,239,163,133, 11, 23, +238, 52, 51, 51,187, 72, 8,145,189,203,179,233,233,233,185,254,250,245,235, 97, 77,154, 52, 89, 87, 89, 30,170,142, 38, 33,132, + 71, 8, 9, 38, 21,243,227,252, 13,202,144,151,113,117,117,117, 14, 12, 12,116, 19,139,197,104,214,172, 25, 40,165,145,239,168, + 25, 49, 98,196, 8,199, 9, 19, 38, 8,238,220,185,131,117,235,214, 97,255,254,253,200,202,202, 66,231,206,157,133,173, 91,183, +118, 20,139,197, 17,213,210,228,155,239, 28, 59,110,124,135,175,198, 12, 85,220,125,174,195,198, 83,207,177,239,106, 58,178,148, + 34,116,249,104,144, 69,251,110,125,219,139,196, 22, 59,171,171, 57,117,202,148, 14,195, 62,251, 88,241, 32,157,197,129,107, 25, +184,246,168, 16, 6,129, 37, 58,125, 52,196,170, 65,211, 14, 31,242, 33,216,244,119,184, 71,255,116,205,127, 69, 4,107,230, 58, +154, 63,103, 36,249, 97,254,234, 95,166, 51,132, 80, 87,159,246, 15, 60,189, 27,151,178, 44, 11,149, 74, 85,241,162,129, 74,165, + 66, 82, 82, 18,174, 95,191, 14, 11, 11,139, 74, 15,116, 44,158, 98,222, 23,255, 57, 92, 65, 97, 33, 92, 92, 61, 33,147,201,170, +212, 60, 90, 73,117, 30,159,150, 69, 67,134,246,234,206,127,158,158,206,191, 18,125, 54,100,215,178,237, 33,110,117, 62,136,109, + 16, 57,249,190,153, 69, 45,213,157, 59,119,112,245,234, 85,228,231,231,163, 81,163, 70,255,152,155, 71, 8,209, 47, 90,180, 40, + 58, 45, 45,141, 92,186,116,169,193,156,165,219, 61,239, 21,213,230,101,151, 80,129,157,217,115, 79,127,217, 99, 99, 97, 97, 97, +194,196,137, 19,207, 58, 58, 58,106, 70,143, 30,221,210, 68, 93, 9, 0,223, 94,189,122, 77, 29, 53,106, 20,226,227,227, 49,116, +232, 80,213,141, 27, 55,114,155, 52,105, 98,243,235,175,191, 74, 39, 76,152,128,243,231,207,207, 36,132,236, 5,144, 64, 41,125, +235, 92,106, 44,203,138,164, 82, 41, 80, 84,246,161,170, 51, 84,204, 77, 11,148,150,150,130,143, 2,136, 68, 34, 6,128, 29, 0, + 83,191, 60,133, 98,177,248,133,185, 74,201, 42, 70, 82, 86, 9,138, 75, 52, 80,169,244,208,170, 1,177,185, 3, 15, 72,182, 1, + 96,106,227,116,158, 88, 44,134,193, 96,128, 78,167,131, 90,173,134, 90,173,134, 70,163, 65, 97, 97, 33,138,139,139,193,231,243, +101, 0,204, 1,228, 85, 41, 38,146, 26,120,140,112,254,215,243, 86,206, 2, 0, 30, 35,156,111, 6, 53,107,202, 58,158, 72,106, +248, 11,243,149,216,206,206,238,236,238,221,187,253,189,189,189,145,144,144,224,215,187,119,239,112, 66, 72, 48,165, 84, 89, 77, + 45, 25,195, 48, 63, 12, 30, 60,120, 84,255,254,253,137,143,143, 15,248,124, 62, 12, 6,131,107,124,124,124,171,223,126,251,109, + 10,159,207,255,213,104, 52, 78, 52,181, 93, 31, 33,132, 17,137, 68,187,214,174, 93,219, 34, 60, 60, 28,155, 55,111,198,141, 27, + 55,216,176,176, 48,102,224,192,129,112,119,119, 15, 31, 56,112,224, 62, 66, 72,167,154, 68,178, 8, 33,238, 3, 6, 12,112,227, +241,120,104,210,164,137,240,202,149, 43, 13, 1, 92,121,199,107,106,230,234,234,122, 62, 50, 50, 50,248,212,169, 83,209,132,144, +200,234,180, 99,116,118,118,238,230,224,224,176, 80,161, 80, 88,153,186, 79, 73, 73,137, 50, 51, 51,115, 82,106,106,170, 73,243, +145, 82, 74, 27, 7, 5, 5, 33, 53, 53, 21, 94, 94, 94, 16, 10,133, 17, 46, 46, 46,195, 41,165, 29, 88,150,253,166, 58, 77, 12, + 8, 33,206, 17, 17, 17,182,145,145,145,228,251,239,191, 7, 0, 8, 4, 2, 24,141, 70, 48, 12, 3,129, 64, 0, 63, 63, 63,242, +236,217, 51,107, 66,136,179, 41,213,133,182, 94,173,186, 52,105,211,161, 89,139,240,250,204, 79,123,158,192,200, 26,193, 35, 6, +240, 9, 11, 86, 47,134, 88,200,131, 79, 96, 40,239, 81,204,221,112,219,186, 31,116,201,137, 59,121,208, 20,205, 14, 93,186, 54, +247,247,245, 97,150,237,123,138,130,212,135,198,212,216, 11, 57, 12,143,129,127, 72,107, 91,159,128, 96, 94,112,120,164, 32, 45, + 33,166,149,181,119,203,182,121, 79,206,115,166,130,163,250, 6,139, 16, 66, 41,165, 47,190,172,102,172,166, 51,108,173,136,199, +131,251,119,153,228, 12,109,233,221,187,119, 97, 99, 99, 3,123,123,123,152,155,155,227,209,163, 71, 56,117,234, 20,226,226,226, + 64, 41, 69,112,112,112,181, 14,156,153,145,129,220,188,226,119,214, 60, 26, 79, 49,119,100, 89,178,107, 57, 57,161,150,147, 19, + 63, 39,191, 0, 87,239,222,243, 63,248,107, 91,223, 76,102,248, 70,149, 74,245, 98,123,189,254,159, 87,235,226,224,224, 96,248, +226,139, 47,243,134,173, 74,168,211,175,181, 51,175, 91,132, 35,246, 93, 73,231,237, 60,199,163, 51, 62,175,159,253,228,201, 99, +147, 79, 90, 36, 18,125,215,177, 99,199,175, 40,165,130,177, 99,199, 2, 0, 6, 13, 26, 84,116,237,218, 53, 31, 74,105, 22, 33, +196,249,243,207, 63,127,124,246,236, 89,217,248,241,227,121, 6,131,225, 1,159,207,167,132,144, 57,148,210, 89,111,204,100,124, +254,237, 59,119,238,120,192,204, 29,182, 10, 30,218, 79,143, 6, 0,152,137,129,236,140, 20, 92,191,119, 14, 54, 54, 54, 22,205, +155, 55,143,245,246,246,214,164,167,167,143, 45, 45, 45,221, 84,105,198,229,243, 99,162,162,162, 92, 93, 93, 93,203, 12, 86,142, + 10, 27,175, 50, 80,106,164, 0,164, 32,172, 28,230,246, 30, 10, 31, 93,209, 29, 59, 59, 59,157, 86,171,157, 90, 84, 84, 84,105, + 85, 15,143,199,203,186,127,255,190,194,205,205, 13, 0,244,251,246,237,227,107,181, 90, 80, 74,141,135, 15, 31,238,144,156,156, + 28,236,233,233,201,184,186,186, 78,245,246,246, 86,165,166,166, 14, 85,169, 84,111,173, 66, 57, 54,198, 75,215,114,214,185, 85, + 5, 9,201,191, 1,128, 75,184,127,222,161, 89, 13,181, 45,103,149, 84,185,238,216, 24, 47, 29, 70,255,101,237, 4, 7,127,253, +245,215,254,214,214,214, 24, 49, 98, 4,102,207,158,141, 25, 51,102,120,143, 24, 49, 98, 24,128, 37,213,120,201, 74, 29, 29, 29, +111, 46, 91,182,204,175,105,211,166, 56,114,228, 8,118,236,216,129,103,207,158, 25, 60, 61, 61,249,225,225,225,152, 57,115, 38, +218,183,111, 63,116,244,232,209, 45, 9, 33, 13, 77, 52, 29,159,205,156, 57,179, 91,179,102,205,240,233,167,159,106,206,157, 59, +215, 7,192,137,147, 39, 79,182, 62,127,254,252,158,109,219,182, 73,231,207,159,223,118,194,132, 9, 35, 0,172,168,193,249,119, +111,209,162, 5, 0,160, 89,179,102, 88,184,112, 97,251,119, 49, 88,132, 16,145,141,141,205,225,205,155, 55, 7,215,173, 91, 23, +159,124,242, 73,195, 62,125,250, 28, 38,132,124, 64, 41, 53,105,222, 72, 39, 39,167, 31,214,174, 93,235, 37,149, 74, 77, 62,174, + 86,171,181, 30, 62,124,248,247, 0, 76, 50, 88, 44,203, 54, 14, 10, 10,194,190,125,251, 48,124,248,112,248,251,251,215, 15, 14, + 14, 94, 51, 96,192, 0,140, 24, 49,162,141,157,157,157, 67,249,228,226, 85,191, 88,248,124,207,206,157, 59, 11,254,248,227, 15, + 0, 64,139, 22, 45,208,182,109, 91,220,191,127, 31,151, 46, 93, 2,143,199,131, 92, 46, 71,211,166, 77, 69,105,105,105,158, 0, +170, 52, 88,140, 88, 54,184, 91,231, 78,138, 3,215,210, 97,100, 13, 8,245, 50, 71,184,159, 61, 30,165, 20, 33,234, 97, 10,140, + 90, 33,204,173,109, 16,209,178,157,117, 70,234,179,193, 48,165,121,128, 88, 54,184,103,183, 15,205, 14, 92, 77, 67, 65, 90, 44, +125,114, 99,239, 25,189,186,116, 40, 0,220, 58,189,115,141,163,141,244, 3,159,144, 80, 94,228, 7, 93,173,254,216,145, 49, 24, + 0,103,176, 56,222, 45,130, 85, 65,110, 1, 84, 54,142,254, 72,206,184, 93,246,255,220, 92,228,230,230,162,118,237,218, 88,190, +124,249, 43,219,170,213,234, 26, 37,224,191,161,105,107,101,137,174,173, 90,242,238, 63, 90,205, 83,177,170,247,162,249,119,165, +124,210, 82, 38, 41, 71,111,153, 93,168, 19,246,109,229, 70, 5, 60, 6,253, 90,213, 34, 63, 31, 76, 18,102,149, 10, 44, 25,134, + 73, 98,217,170, 59, 18, 18, 66, 4,221,186,117,251,106,215,174, 93,130,216,216, 88,212,169, 83, 7, 58,157, 14,215,174, 93, 75, +161,148,102,149, 31, 47,141,199,227,165,177, 44,235,221,160, 65, 3, 44, 88,176, 0,126,126,126,164, 83,167, 78, 83,202, 77,214, +159, 14,148,150,150, 54,255,203, 47,191,108,241,203,198,157, 54,159, 52, 38, 40, 46,214, 64,169, 84,226,209,253,155, 40,205, 44, +197,154, 53,107, 33,147,201, 8, 0, 97, 70, 70,134,112,194,132,241,235, 92, 93, 93, 59,167,164,164,244,124, 91, 90,211,210,210, +230,141, 30, 61, 58,124,203,150, 45, 86,101,237,174, 84, 40, 86,137,113,125,113, 89,132, 50,124,194, 13,252,250,203, 58,166,158, +135,220,166,184,184, 24, 67,135, 14, 93,230,228,228,212, 52, 61, 61,125,248,219, 52,211,211,211, 47, 14, 29, 58,212,229,183,223, +126,147,120,123,123,199, 21, 22, 22, 34, 47, 47,143,217,182,109,219,104, 39, 39, 39,139,125,251,246, 19,185, 92, 14, 0,188,196, +196, 68,225,151, 95,126,177,203,209,209,113, 91, 70, 70,198,167,111,187, 55, 0, 52,132, 32,221,217,185,182,151,242, 42, 51,203, +217, 89,125,233,220,204,212, 45,132, 32,189,108, 27, 80,167,181, 78, 3,158,111, 22, 55,211,104,216,165, 25, 25, 73,113,148,130, + 98,230, 95,215, 9,195,214,214,118,116,183,110,221,240,253,247,223,227,224,193,131, 19,172,173,173, 23,207,158, 61, 27,206,206, +206, 95, 18, 66,150, 86, 99,178,219, 31,151, 44, 89,226,231,231,231,135, 65,131, 6,105, 79,157, 58,245, 53,128,125, 0,146, 46, + 94,188, 88,107,211,166, 77, 93,118,237,218,245,253,178,101,203, 36, 43, 86,172,240,250,232,163,143,150, 2,248,220,132, 15,138, +241,253,251,247,199,162, 69,139,112,238,220,185,143, 40,165, 71, 42,190,183, 8, 33, 93,230,207,159,127,122,250,244,233, 88,178, +100,201,216,234, 26, 44, 66,136,153,191,191,255,183, 29, 58,116,192,197,139, 23,209,188,121,115, 68, 68, 68, 76, 32,132, 44,167, +148,230,212,192, 92, 49,102,102,102,187, 54,110,220,216,220,195,195, 3,243,230,205,195, 87, 95,125,133,245,235,215, 55,255,228, +147, 79,118, 17, 66,122,154,210,203,215,204,204,204, 76, 42,149,226,251,239,191,167,207,159, 63,207, 55,193,144, 89,125,251,237, +183,196,162,170,170,133,255, 68,200,164, 98,177,184,137,175,175, 47,126,250,233, 39, 92,188,120, 17, 99,198,140,129,175,175, 47, + 82, 82, 82,208,181,107, 87,217,227,199,143,123, 1,216,104, 98,185,100, 97, 99, 99,131,172,172, 44, 8, 4, 2, 52,109,218, 20, +251,246,237,131, 70,163,129,189,189, 61, 10, 10, 10, 94,212, 38,240,249,124, 11, 19, 75,187, 32, 91,107, 11,100,197,164,130, 15, + 3, 66,124,108,113,246,126, 46,116,122, 22,246, 54,150,200,200,202, 68,227, 32, 87,104,181,181, 64, 41,107,210, 76, 32, 34, 30, + 19, 34,150, 72,145, 87,156,131,212,135,231,114,117, 70,205,240,130,103,151,146, 1,192,186, 78,139,225,183, 46,157,188,213,251, +195, 22,246, 37,165,110, 32,148,109, 4, 14,142,106, 80,229, 64,163,111,122, 49,191, 28, 17,170, 64,167,211,189, 83, 66,254, 27, +154,111,226,191,161,249, 55, 48, 89,172,139, 21,191, 80, 46, 97, 12, 39,163,178,140,122,131, 17,199,111,101, 24,101, 98, 98,176, + 18,107,139, 88,150,165,132, 16,106,130,142,254,248,241,227,155,199,140, 25,131,197,139, 23,227,241,227,199, 16, 10,133, 8, 10, + 10,114,170,104, 31, 69, 8,177, 8, 9, 9,177,103, 24, 6,143, 30, 61,194, 79, 63,253,132,207, 62,251,140, 94,185,114,101,253, +219, 94, 20,148,210,219,233,233,233,107, 39,141, 29, 94,192, 40,147, 33,167, 57,208,229, 61, 6,171,202,198,215, 51,231, 35, 33, +151, 69,244,179, 98, 68, 63, 43, 70,142, 86,142,159,126,222,192, 11, 12, 12,236, 34, 16, 8,218, 87,146,214,107,233,233,233,155, +199,143, 31, 95,144,149,149,245,194, 56,235, 12, 44,116,134, 87,147,161, 80, 40,176,102,205, 26, 75, 55, 55,183, 94, 2,129,160, + 85, 37,154,169,105,105,105,247, 70,141, 26,165, 73, 79, 79, 71, 97, 97, 33, 78,156, 56,241,129,171,171,171,197,172,249, 75, 72, + 66, 46,125,145,206, 18, 98,131, 13,219,254,224,249,248,248,124, 44, 16, 8, 34, 42,127,121,185,120,249,251,215,217,125,237,218, +181, 79,189,188,188, 70, 85, 24, 43, 74, 65, 1,192,211,211,115, 68, 84, 84,212,103,193,193, 1,187, 29, 28, 28,125,255,202,188, + 68, 8,105,213,183,111, 95, 95,150,101,177,123,247,238,123,148,210, 37,123,247,238,189,169,209,104,208,175, 95, 63, 79, 0, 29, + 76,212, 9,251,248,227,143, 71, 53,111,222, 28,227,198,141,211,157, 58,117, 42,132, 82,186,152, 82,154, 72,203, 72,162,148, 46, + 63,127,254,124,131,209,163, 71,107, 26, 53,106,132, 79, 63,253,244, 51, 66, 72,243, 42,116,155,244,239,223,223,143,101, 89,236, +220,185,243,238, 75,230,170,226, 30,158,217,179,103,207, 53,173, 86,139, 1, 3, 6,212, 38,132,180,174,198,185, 11,197, 98,241, +238,185,115,231, 90,166,166,166, 98,224,192,129,154, 71,143, 30, 97,214,172, 89, 82, 11, 11,139, 35,149,181, 17,124,107,128, 68, + 44,254,101,245,234,213,221,234,213,171,135,145, 35, 71,106, 87,173, 90, 53,102,212,168, 81,218,144,144, 16,172, 92,185,178,155, + 72, 36,250,165, 90,145,255,204,204,130,115,231,206,217, 84,181,100,100,100,100,154, 24,253,150,121,123,123, 95,245,241,241, 41, +242,247,247, 15, 53, 24, 12,120,252,248,241,211,223,127,255,157,245,245,245,197,166, 77,155,176,102,205, 26,180,105,211, 6, 12, +195,244,170, 78, 90, 75, 75, 75, 33,145, 72, 32, 20, 10, 17, 21, 21, 5,141, 70, 3,153, 76, 6,137, 68, 2, 30,143, 7, 75, 75, + 75, 40, 20, 10, 0,160,166,221, 31,208, 34,165, 30, 2, 1, 3, 62,195, 34, 54,169, 16, 58, 61, 11,137,144, 7, 1,159, 0,148, +133,165, 92, 0,137,136, 7,134, 16,214, 68, 77, 20,150,234, 32, 18, 50, 16, 8, 69,132, 49, 24, 95,132, 8, 25,190, 81, 42,149, +138,136,173,185, 24, 18, 33, 55, 38, 55,199,123,142, 96, 1,128,209,248,231, 94,186,111,138, 2,105,181,218,119, 74,200,127, 67, +243, 45, 97,243,127,212, 13, 44, 42, 42,226, 95,189,122, 85, 33, 20, 10,197,221,130,195,115, 22,254,246,216,110,246,182, 56,136, +249, 32, 29, 3,105,230,209, 35, 7, 69,197,197,197,182,190,190,190,185, 38,222,135,161,132,144,121, 0, 2,248,124,254,161,141, + 27, 55,146,173, 91,183, 90,245,239,223, 63,158, 16,146, 26, 24, 24,232,190,113,227, 70,115, 0, 88,190,124, 57,221,181,107, 87, +123, 0, 49,148,210,140,202,116,211,211,211,167,139,197,226, 43,143, 30, 61, 90, 46, 16, 8, 44,205,205,205,173,206,159, 63, 79, + 50, 11,117,248,118,203,179, 23, 61, 11,229, 98, 30,166,245,180,199,224,193,159,241, 31, 60,120,240, 35,128,227,111,211, 76, 77, + 77,157, 32,147,201,206,223,187,119,111,137,194,165,190,181,109,196, 4,243,214,211,202,170, 31, 29,173, 68, 96,202,203,196,130, +130, 2,228,228,228, 96,194,132, 9,150, 19, 39, 78,156, 12,224,108, 37,233, 60, 33, 22,139,147, 98, 98, 98,218,241,249,124,177, +153,153, 89,240,213,171, 87,201,243, 2, 61,166,109,122,138, 98,117, 89,109,171, 66, 34,192,236,254,174, 24, 61,122, 52, 63, 62, + 62,254, 7, 0,205,222,164,231,226,226,226,237,239,239,191,123,251,246,237,254, 75,151, 46,205,123,242,228, 73,169,179,179,243, +236,215, 54,211, 44, 88,176, 32,119,203,150, 45,117, 7, 14, 28,184,219,209,209,177,207, 59, 12,169,241, 78,152,155,155,127, 63, +124,248,112,236,218,181, 11,249,249,249, 75,203,243,216,146,237,219,183,239, 28, 58,116, 40,182,108,217,242, 61, 33,228,152, 9, + 81,172,142,253,250,245,195,209,163, 71,113,250,244,233,111, 41,165, 15,222, 98,106, 31, 19, 66,166,236,223,191,127, 89,255,254, +253,177, 97,195,134, 14, 0, 42, 27,120,246,131,246,237,219,227,200,145, 35,200,205,205, 93,249,166, 13, 10, 10, 10, 86, 29, 56, +112,160,113,251,246,237,177, 96,193,130, 15, 0,156, 49,193, 92,249, 89, 88, 88,108, 92,182,108, 89, 88,189,122,245,240,241,199, + 31,171,117, 58, 93,135,175,190,250,234,224,142, 29, 59, 20,155, 55,111, 14, 29, 54,108,216,117, 66,200, 16, 83, 7,177,229,241, +120,243, 87,172, 88,241,121,100,100, 36, 38, 76,152, 96, 56,126,252,120, 87, 74,233, 9, 66, 72,252,228,201,147, 15,255,244,211, + 79,188, 69,139, 22,125,206,227,241,178,141, 70,227,215,127,201, 23, 54,195,204,157, 51,103, 78,227, 22, 45, 90, 32, 41, 41, 9, +209,209,209, 48, 24, 12, 91,110,221,186,117,161, 69,139, 22,115,117, 58,221, 65,137, 68, 50,200,204,204, 44, 48, 48, 48,176,181, +131,131,131, 44, 51, 51, 83,105,194,245, 44,136,143,143,151,219,219,219, 67, 32, 16,224,238,221,187,176,183, 47,155,242, 53, 43, + 43, 11, 65, 65, 65,224,241,120, 40, 40, 40, 0,128, 66,211,204, 16,115, 47, 62, 49,173,182,181, 66, 14, 24, 37,184,253, 40, 5, +118,182, 86, 48, 18, 6, 25, 25,233, 8,246,117, 5, 33, 4, 5,185, 25, 32,132,152, 52,151,174,145,178, 81,207,211,178, 92,108, + 20, 98,212,107,220,206,230,234,177,236,173, 22,117,154, 13,227,243, 8, 79, 44, 49, 95,251,249,167,159,218,178, 44, 69, 65,110, + 38,248, 12,115,131,179, 12, 28,239,213, 96,177, 44, 11,169, 84,250, 74,132,233,245, 40,144, 84, 42,133, 70,163,169,214,129,165, + 82, 41,116, 6,188, 87, 77, 83,142,249,190, 53,255, 74, 12, 6,131, 98,226,196,137,225,225,225,225,169,109,218,180, 73,168, 91, +215, 58,185,115, 99,169,237,178,245,123,131, 59,181,172, 23, 93,144,151,149,243,204,220, 92,147,152,152,104,255,235,175,191,134, +235,245,122,153,137, 17,177,231, 0,158, 19, 66, 86,117,232,208,225,139,222,189,123,227,193,131, 7,246, 74,165,210, 94, 38, 43, +147,216,186,117, 43,118,237,218,181,152, 82,106,242,192,155, 26,141,230, 24, 0, 47, 66,136,101,173, 90,181, 50,173,173,173,133, +233, 37,165, 47,122, 22, 10,249, 12,154,126,117, 19,249, 5, 69,176,181,181,133, 66,161,240,172, 74,179,124,156,171,131,222, 31, + 76,174,175,186,183,246,220,166,141, 27, 45, 0,128,199, 16,216, 89, 8, 81, 80, 80,128,236,236,108,228,228,228,128, 97, 24, 24, + 12, 6,127, 19,210,249, 24,192, 99, 66,136,115,235,214,173,231, 42, 20, 10,176,121,165,200, 47,209,189, 82, 5, 89, 82,162,132, +135,135, 7, 20, 10,197, 27,171, 35,172,173,173, 21, 98,177,120,211,186,117,235,252, 20, 10, 5,111,232,208,161,150, 67,135, 14, +109,246, 54, 51, 38,147,201,120, 27, 54,108,240, 9, 14, 14,222,232,225,225,241, 65, 98, 98, 98,225,255, 42, 47,149, 15,121, 48, + 98,210,164, 73,161, 18,137, 4, 63,255,252,243, 51, 0,219,202,127,222,189,106,213,170, 25,253,251,247,247, 29, 51,102, 76,224, +244,233,211, 39,148, 87, 21,190,117,140, 36,161, 80, 24,226,239,239,143,189,123,247, 2,192,222, 42, 14,191,231,202,149, 43,203, + 58,119,238, 12,137, 68, 18, 86,197,182,158,110,110,110,216,191,127, 63, 0,220,126,203, 54,183, 31, 61,122,132,158, 61,123,130, + 16,226,105,194,185,119,107,215,174,221,158, 5, 11, 22,240, 21, 10, 5, 62,255,252,115,237,245,235,215, 59, 81, 74, 47, 16, 66, + 90, 13, 24, 48,224,252,182,109,219,228,231,207,159,247,251,238,187,239,174,240,120,188,249, 70,163,113,122, 21,154,159,205,155, + 55,111, 90,247,238,221, 49,123,246,108,250,219,111,191,125, 76, 41, 61, 81,254,124, 29, 39,132, 12,180,178,178,218,246,205, 55, +223,144,194,194,194,105,132,144, 20, 74,233,234, 74,242,121,161,209,104,116, 84, 42,149, 38,125, 33,154,186,189,141,141, 77,199, + 22, 45, 90,224,199, 31,127,196,152, 49, 99,176,105,211, 38, 10,224, 80,122,122,250, 93, 0, 45,202, 34,176,206,138,168,168,168, +192,230,205,155, 11,239,221,187,247, 33,128,223, 76, 40,155, 18,207,158, 61,107,223,169, 83, 39,161, 76, 38,131,209,104, 68,110, +110, 46,212,106, 53,130,130,130,208,184,113, 99,100,101,101,225,208,161, 67,186,130,130,130, 68,147,202, 59,109,233,230,147,135, +255,104,213,165,223,112, 11,169,144, 7,163, 94,132,204,204,108, 20, 27, 13, 8,241,119, 71,243,224, 90, 72,202, 84,225,248,161, + 63,242,139,139,149,155, 77,209,212,107,148, 27, 79, 29, 59,216,178,121,199, 1, 22,114,223, 64,120, 58,141, 9,190,117,229,212, + 73,137, 72, 64, 6,244,239, 99,217,180,161, 55,238, 62, 43,194,209, 67,123,243, 11,139,138, 54,130,131,163, 38, 6,235,229, 6, +238, 47,145, 53, 97,194, 4,251,137, 19, 39,194,220,220, 28,185,185,185,208,235,245, 47,162, 77, 98,177, 24,150,150,150,200,205, +205,197,206,157, 59, 1, 32,171,242, 47, 58, 81,250,188,149, 43,220, 8, 79,174, 21, 75,101,212, 90,246,238,154, 0,160,213,243, +179, 86,239,252,221,186, 99,139, 8,126, 45, 39,167, 55,133,233,171,173,249,255, 1,157, 78,119, 34, 33, 33, 33,172, 95,191,126, +217,110,110,110, 42,181, 90, 13,149, 74, 85,124,104,199,178, 58, 46,230, 35,159, 49, 12, 67, 21, 10, 5,107,111,111, 95,120,250, +244,105,123,131,193,112,174,154,135,152,208,167, 79, 31,230,212,169, 83, 35, 70,141, 26, 69,188,189,189, 17, 21, 21,133,159,127, +254,153,110,222,188,121, 25,128,169, 53, 76,122,137, 70,163,121, 37, 2,242,114,207,194,146,146, 18,104, 85,153,208, 87,163, 71, + 66,252,169, 31, 31,213,174, 93, 91, 31,232,254,159,225, 68,242,243,243,145,157,147,243,194, 96,101,103,103, 3, 64,117, 66,152, + 69,127, 78,231,127,106, 30, 74, 75, 75,161, 86,102,192,104, 52,190, 81, 51, 47, 47,175,216,217,217,121,197,242,229,203,127,154, + 59,119,174,253,146, 37, 75,242, 98, 99, 99,139, 24,134, 81,191,246, 17, 35,241,242,242, 82, 44, 90,180,200, 97,249,242,229,121, + 44,203,174,248, 31,155,171,238,245,234,213,219,212,177, 99, 71,197,168, 81,163,176,124,249,114,164,167,167, 79,165,148, 26,202, +203, 6,150, 16, 50,121,229,202,149,135,166, 76,153, 2,157, 78,183,232,200,145, 35,179, 9, 33, 35, 40,165,219,222,164,105,103, +103,231,202,231,243, 17, 29, 29, 93, 68, 41,125, 90,133,161,207,168, 91,183,110, 38, 33,196,193,201,201,169, 78,101,219, 90, 91, + 91,123, 41, 20, 10,164,166,166, 2, 64,194, 91, 54, 75, 76, 75, 75,163, 34,145,136, 56, 59, 59,123, 87,117,254, 86, 86, 86,147, +215,173, 91,199, 63,123,246, 44,102,206,156,153,146,148,148, 52,128, 82,122,177, 60,109,209,132,144,230,173, 90,181,218, 49,101, +202,148,186, 63,252,240, 3,121,244,232,209, 72,188,101,136,146, 10,220,221,221, 71,124,246,217,103, 88,177, 98, 5,214,174, 93, + 59,146, 82,186,251,181,115,222, 65, 8,177,178,177,177, 89, 49,124,248,112,108,220,184,113, 0,128,213,149, 68,107,167,244,237, +219,119, 70, 94, 94,222,124, 83,238,169, 41,219,187,184,184,180,106,221,186,181,151, 90,173,198,238,221,187,159,238,217,179, 39, +223,104, 52,238, 44, 55, 87, 47,231,143,125,199,142, 29,155, 49,121,242,100,156, 61,123,118,163,179,179, 51, 47, 45, 45,109, 71, + 21,247, 52, 77, 34,145,228,220,189,123,215,209,207,207,143,113,114,114, 66,163, 70,141, 96,105,105, 9, 30,143,135,172,172, 44, + 92,184,112,129,141,143,143,207, 49,117,192,209,156,184,179, 7, 29,235,117,186, 28,125,253, 66,187,192,134, 77, 5, 46,182,214, +136, 8,116,129,165,153, 16, 4, 64, 82,150, 10,103,206,156,212, 39, 36, 60,189,106, 74, 15,194, 10, 77,231,250, 31, 94,177,180, +175,213, 46, 32,184, 41,191,142,175, 15,218,181,104, 96,101, 37, 23,130,165, 20,119,159, 21,226,228,137, 99,250,180,148,228,179, + 92, 15, 66,142,247, 29,193,154,181,118,237,218,166,235,215,175,239, 60, 97,194, 4,197,160, 65,131, 32,149, 74, 81, 90, 90, 10, + 55, 55, 55, 24, 12, 6, 28, 57,114, 4,209,209,209,197, 44,203, 30, 2,112,249,181, 7, 51,232,229,113,171,166, 45, 87,214, 42, + 27,188,178,180,233,236,181,245,223,139, 38, 0, 92,121,102,112,113, 78,207,153,149,155,127,100,188,187,139,147,176,125,179,198, +124, 91,171,178,222,204, 38,106,182,125,223, 99,122,252, 47, 52, 13, 6,195,231,132,144,192,201,147, 39, 47,116,113,113,113,158, + 61,123,246,243,128,128, 0, 85, 81, 81, 17,213,106,181,108, 78, 78,142,108,247,238,221,158,185,185,185,197,122,189,126, 32,165, +244,110,117,210, 73, 41,213, 1, 24, 69, 8, 57, 80, 88, 88,120,252,171,175,190,194,119,223,125,135,131, 7, 15, 54,167,148, 94, +174,233,185, 83, 74, 13,158,158,158, 5,183,111,223,118, 16,217,248,192,193, 82,136, 14,223,150, 5, 35, 20, 98, 2, 85,105, 49, + 98,239,223, 69, 81, 81,209,173,106,104,106, 93, 92, 92, 10, 51, 51, 51,109, 29, 28, 28,202,204, 85,118,246, 11,115,149,151,151, +135,220,220, 92,250,242,189, 55, 65,179,212,203,203, 75, 25, 27, 27, 43,226,201,220,224,104, 37, 70, 89, 21, 36,133,157,130,143, +210,210, 98, 60,188,118, 21,133,133,133,231,222,166,153,150,150,182,211,217,217, 25, 0,126,154, 49, 99,134,109,135, 14, 29,158, +220,184,113,163,229,203,199, 9, 9, 9,217, 55,123,246,236, 15,191,251,238,187,156, 77,155, 54, 77, 73, 79, 79,223,250,191,204, + 75, 54, 54, 54, 19, 15, 31, 62,172,208,233,116, 88,190,124, 57, 22, 47, 94,188,158, 82,250,251,107,215,226, 48,143,199, 91,201, + 48,204, 23, 95,126,249, 37,134, 15, 31, 46, 11, 13, 13,157,240, 82,148,235, 21,205,212,212,212,233, 33, 33, 33, 51,178,178,178, + 76, 50, 4,143, 31, 63, 30, 22, 18, 18, 50, 61, 43, 43,107, 97,101,231, 46,151,203,229, 70,163, 17, 9, 9, 9,249,148,210,194, +183,220, 55,181,143,143, 79,170,209,104,116,149,201,100,214, 85,229,207,252,252,252,249,161,161,161,179, 50, 51, 51, 79, 0,152, +247,250,144, 35,148,210, 59,132,144,192,177, 99,199,142,254,254,251,239,123,102,100,100,236,172, 74, 51, 41, 41,105,126,171, 86, +173,190,141,139,139,219, 68, 41, 93,251,150,116,254, 76, 8,209,109,221,186,117,100, 66, 66,194,130,202, 52,211,210,210, 14, 1, + 56,100,234,253,125,219,246, 47,107, 50, 12, 51,121,218,180,105,204,182,109,219, 0, 96, 81, 74, 74,202,218,183,152,181,187, 46, + 46, 46,155, 67, 67, 67, 7,173, 94,189, 90,210,166, 77,155,225, 0,118, 84,149, 63, 53, 26,205,181, 43, 87,174, 52, 78, 76, 76, +180,109,213,170,149, 16, 0,138,138,138, 80, 80, 80,128, 67,135, 14,233,226,227,227,115, 74, 75, 75,175, 85,167, 12, 49,104,139, +250, 95, 57,179,127, 71,226,227,251, 17,145, 29,186, 89,105,117,174, 16,231,242, 80,144,155,129, 99,135,254,200, 79, 72,120,122, + 85,169, 44,232, 95, 29, 77,157,166,176,223,213,179, 7,118,166, 36,196, 54,110,209,170,147,149, 90,235, 14,177,144, 65,110,102, + 42,142, 29,222,159,151,144,240,236,162, 90,175,249,244,175, 42,231,255, 77,154,255, 56,104, 69,107,219, 74, 22, 0, 34, 0, 31, + 42, 20,138,229, 51,103,206, 92,123,253,250,245,181,157, 59,119, 94, 43, 18,137,150, 3,248, 16,128,232, 45,251, 5,253, 47, 53, + 59, 52,130,226,179,174,204,134,185, 35,249,186,125, 75,124,245,115, 70,128,154,168,217,214,148,235, 80,157,229,127,173, 9,160, +153, 64, 32,184, 90,175, 94,189,179, 10,133, 34,219,195,195,227,162, 64, 32,184, 1,160,197,187,166, 19,128,109,223,190,125,217, +226,226, 98,218,167, 79, 31, 10,192,226, 93, 53,197, 98,113,235,200,200, 72,253,243,244,124,122,241, 78, 50, 61,116,254, 1,221, +126,240, 42, 93,187,227, 56, 93,178,114, 3,173, 95,191,190, 22,128,123,117, 52, 69, 34, 81,135,200,200,200,130,156,156, 28,250, +232,209, 35,122,225,194, 5,186,103,207, 30,186,118,237, 90,186,106,213, 42,234,236,236,156, 11,192,185, 58,154, 82,169,180, 91, +135, 14, 29, 12,169,217, 37,244,218,131, 12,122,234,250, 83,186,239,244, 93,186,243,208, 85,186,126,235,239,212,207,207, 79, 13, +192,161, 42, 77, 39, 39,167,190,125,250,244,121, 82,183,110,221, 53,175,255,230,237,237,189,178, 79,159, 62, 73,206,206,206, 3, +255,138,188, 4,160,131,139,139,203, 35,161, 80,120, 24,192,192, 42,246,235,199,231,243, 15, 58, 58, 58,222, 4,208,227,127,157, +231, 1,116,182,183,183,191, 6,160,107, 21,251, 85,108,215,253,159,248,188,191, 15, 77,103,103,231,214,110,110,110, 23,156,157, +157,191,169,106, 63,127,127,127,161,163,163,227, 92, 23, 23,151, 35, 78, 78, 78,109,170,147, 78, 0,206,102,102,102,205,204,204, +204,186,152,153,153,117,177,180,180,108,246,242,115, 88,147,115,183,241,105,219,165, 86,195,174,251,220, 26,124,152, 84, 43,184, +115,146,103, 72,183,125, 54, 62,109,187,188,171,166,123, 72,183,253,181,130, 59, 63,175, 21,220, 37,177,118, 88,183,125,182,190, +109, 59,254,211,238,251,223, 89,243,159,182,152,188, 97,175,178,150, 43,102, 0,250, 49, 12,243, 51,128,126, 0,204,170,184, 1, + 65, 38,220,164,247,174,217,161, 37, 92, 70,245,226, 29,153,250,169, 32,219, 68,205,127, 76,134, 6,208,141,207,231, 95, 1,208, +237,125,166,211,220,220,124, 93,239,222,189,141, 2,129, 96,197,251,210,180,177,177,249, 41, 34, 34, 66,183,108,217, 50,186,119, +239, 94,186,118,237, 90, 58,122,244,104, 26, 20, 20,164,177,182,182,254,180, 38,154,142,142,142,243,234,213,171,151,183,117,235, + 86,186,115,231, 78,186, 98,197, 10, 58,107,214, 44,182, 86,173, 90,217,214,214,214, 93,107,162,105,111,111,255, 75,179,102,205, +116,191,252,242, 11, 61,121,242, 36,221,190,125, 59,157, 56,113, 34,245,247,247, 87,203,229,242,143, 76,213,172, 83,167,142,232, +109,191, 53,108,216, 80,192, 21,184,156, 38,167,201,105,114, 6,235,159,179,240, 77,141,116,237,126, 64,241, 81, 0, 41, 33,192, +206,223, 31,178,123,122,250,195,240,251,131,119, 31,171,167,118,237,218, 37,132,144,157, 79,159, 62,221,227,238,238,110, 72, 76, + 76,124,103,205,163,231,104,106, 59, 79,210,233,100,162,145, 15,192, 96,250,176, 61,255,136,136,228,126, 0,251,223,183,110, 97, + 97,225, 16, 66,200, 24, 74,169,234,125,105,230,228,228, 76, 36,132,108,125,250,244,233, 34,185, 92, 30,108, 52, 26,245,106,181, +250, 82,118,118,246, 4, 74,105,114, 77, 52,211,211,211,167, 19, 66,246, 78,157, 58,117, 42,128,250,132, 16,173, 94,175,191,146, +149,149, 53,135, 82,154, 94, 19,205,204,204,204, 97, 66,161,112, 67,124,124,252, 2,169, 84, 90,159,101, 89,173, 82,169, 60,151, +147,147, 51,158, 82,154,105,170, 78,124,124,252, 91,219,127, 69, 69, 69,113,243, 14,114,112,112,112,252,139,218, 96,189,194,239, + 15, 40,122,214, 35,232, 17, 4,195,239,247,222,143,105,121,250,244, 69,251,215,247, 58, 53,200,137, 4,250,222, 53,185,234,228, +247,103,174, 94,210,188, 11,160,205,123,214,188, 13,160,247,251,212,212,233,116,215, 1, 68,114,185,128,131,131,131,131,227,189, + 27, 44, 0,248,227, 30,229,174, 26, 7, 7, 7, 7, 7, 7, 7, 71, 37, 16, 0, 65,111,137, 2,220, 55, 89,132,144,160,234, 30, +184, 42,253,255,177,166,125, 37,154,167,170,208,108, 91,131,116,114,154,156, 38,167,201,105,114,154,156,230,191, 82,179, 42,237, +127, 76,239,196,255,106, 11,122, 19, 26,164,255, 77, 52,185,134,138,156, 38,167,201,105,114,154,156, 38,167,201, 53,114,127,111, + 11, 55,193, 18, 7, 7, 7, 7, 7, 7, 7,199,123,134, 51, 88, 28, 28, 28, 28, 28, 28, 28, 28,156,193,226,224,224,224,224,224, +224,224,224, 12, 22, 7, 7, 7, 7, 7, 7, 7, 7,103,176,222, 35,246,255, 79, 52, 57, 56, 56, 56, 56, 56, 56, 56,222, 27,228, +223, 52,202, 57, 7, 7, 7, 7, 7, 7, 7,199,255, 2,174,138,144,131,131,131,131,131,131,131,131, 51, 88, 28, 28, 28, 28, 28, + 28, 28, 28,156,193,226,224,224,224,224,224,224,224,224, 12, 22, 7, 7, 7, 7, 7, 7, 7, 7, 7,103,176, 56, 56, 56, 56, 56, + 56, 56, 56, 56,131,197,193,193,193,193,193,193,193,193, 25, 44, 14, 14, 14, 14, 14, 14, 14, 14,142,191,222, 96, 17, 66,218,114, +154,156, 38,167,201,105,114,154,156, 38,167,201,105,114, 6,139,131,131,131,131,131,131,131,131,131, 51, 88, 28, 28, 28, 28, 28, + 28, 28, 28,156,193,226,224,224,224,224,224,224,224,224, 12, 22, 7, 7, 7, 7, 7, 7, 7, 7, 7,103,176, 56, 56, 56, 56, 56, + 56, 56, 56,254, 34, 8,128, 55,246, 4,160,148,158, 50, 89,164, 6,189, 9,170,210,231, 52, 57, 77, 78,147,211,228, 52, 57, 77, + 78,243,159,167, 89,149,118,117,252,199,223, 26, 74,233,127,109, 1,208,150,211,228, 52, 57, 77, 78,147,211,228, 52, 57, 77, 78, +243,223,182,240,185, 32, 30, 7,199,255,115,246, 16, 30,242,125, 61, 65,169, 51,120,162,116,164,223,123,138,153,148,125,103,205, +204, 0,119, 72,245, 14, 48, 72,178,145,121,247,217, 59,107,114,112,112,112,252,139,224, 12, 22, 7,199,255,119,178,253,234,130, +143, 5, 96,224, 4,170,139,135, 93,192, 2, 0,247,223, 89, 83,200,206,131,145,113, 5,213,197,193,222,247,123, 0, 15,184,139, +205,193,193,193, 97, 26,127, 73, 35,247,176,176,176,168,176,176,176,185,145,145,145, 98,238, 22,112,252,183,136,140,140, 20,135, +133,133,205, 13, 15, 15,143,250,199,158,228,214,122, 50, 48,198,142, 90, 61,235,114,236, 94,129,189, 82, 99,172, 11,198,208, 9, + 27,234,154,189,147, 38,159,180, 83,235,216, 90,219,110, 40, 29, 74,181, 6,127, 80,188,155,102, 57, 65, 65, 65,150,141, 26, 53, + 58, 22, 28, 28,108,203,229, 80, 14, 14, 14,206, 96,189,103, 88,150,109,104,111,111, 63, 65,165, 82, 37,133,134,134,118,253, 55, + 93,240,198,141, 27, 95,137,136,136,200,108,210,164, 73,102,147, 38, 77,162,171, 90,255, 79,196,217,217,185,110,189,122,245,146, + 2, 3, 3,227, 94, 94,111,223,160,103, 19,255, 22,131,102,218, 6,118,111,249,174,199, 8, 13, 13,237,170, 86,171,147,106,213, +170, 53,222, 96, 48, 52,252,199, 94, 76, 53,235, 0,134,215, 42, 38, 93, 41, 75, 47,210, 59, 68, 37, 42, 21, 0, 47, 18, 90, 56, +213, 88,179,144,117, 0,104,235, 59, 41, 42,249,149, 60, 59,135,139, 79, 53,230, 96,152, 86, 80, 19,199,119, 77,174, 72, 36, 26, + 73, 41,253, 64, 32, 16,140,227,138,223,127, 55,132,144, 32, 66, 72, 87, 66, 72,216,123,212,252,193,207,207, 47,149, 16, 50,150, +187,194, 28,255,111, 12, 86,239,218,164,233,199,117,200,249,190,181, 73,113,191, 58,164,100, 96, 29,114,169, 87,109,210,186,166, + 7,254,253,247,223,165, 91,182,108,177, 15, 8, 8,216, 25, 30, 30,126, 41, 52, 52,212,167, 38, 58, 97, 97, 97,199,194,194,194, +122,191,190, 46, 52, 52,180,239,203,235, 26, 53,106, 20,211,168, 81,163,194,176,176,176,167,166,232,134,132,132, 60, 9, 13, 13, + 45, 13, 11, 11,123,242,218,139,187,111,163, 70,141,142,189,118,188,222,175,175,123, 27, 60, 30,207,245,224,193,131,246,135, 15, + 31,182,231,243,249, 14, 47,110, 4,195,188,113,125, 13,174,199,208,176,176,176, 43,175,157,203,144,215,215, 85, 97, 78,174,132, +132,132, 12,121, 77,247, 74, 88, 88,216,208,247, 97,174, 90,180,104,113,233,246,237,219,181, 20, 10,133,229,203,191, 57,218, 88, +182,191,114,104,229,132, 79,123,183, 27,105, 31,208,163, 94, 13,141,149, 79,227,198,141, 47,121,121,121,237, 92,176, 96,129,253, +204,153, 51,101,255,216,167,119, 79,128, 16,132,109,193, 82,106,247, 48, 85,109,247, 97,215,222,252,219,201, 42, 59,189,209,104, + 13,240, 34,177,201, 67, 92, 35, 77,190,190, 57, 75,169,195,233, 68,129, 93,171, 62,163,121,103, 18,249,118,122,163,209, 6, 12, + 90,214, 72,243, 63,249, 80,192,227,241, 38, 12, 31, 62,156, 33,132,124,233,229,229, 37,250, 55, 21,182,225, 46,196,165,141, 55, +255, 70,136, 51,105,250, 30, 13, 69,160, 92, 46,191, 69, 8,169,251,255,204, 92, 53, 4, 32,163,148, 30, 0,224, 64, 8,225,191, + 7,205, 37,115,230,204,153, 28, 19, 19,227, 92,187,118,237,217,132, 16, 30,247,138,231,248,219, 27,172,126,181,201, 44, 7, 71, +151, 19,223, 44,217,222, 98,221,249,103,102,171, 14,221,150,143,159, 50,191,169,163,141,221,193, 1,117,200, 15,111,219,175,178, +174,150, 34,145, 8,207,158, 61,195,242,229,203, 37,179,102,205,106, 98, 97, 97,113, 55, 60, 60,124,105, 64, 64,128,188,178,180, +188,174, 73, 41,109, 42, 16, 8,214,133,135,135,111,172, 40,176, 9, 33, 77,197, 98,241, 47,225,225,225, 91, 43,170, 33, 67, 66, + 66,106,223,184,113,195,156, 16,226, 96, 74, 58, 27, 53,106,228,116,235,214, 45, 25, 80, 22, 9,136,140,140, 20, 55,106,212,104, +139,139,139,203, 90, 0, 77, 1,192,203,203, 75, 20, 30, 30,190,209,205,205,237, 87, 66, 94, 45, 52,223,118,238,132, 16, 88, 90, + 90, 98,251,246,237,224,241,120,127, 90,191,117,235, 86, 16, 66,170,125, 61, 3, 2, 2,228, 97, 97, 97,191, 59, 57, 57, 45,101, + 89, 54, 2, 0,234,213,171, 39,107,212,168,209, 30, 87, 87,215,101, 21,235, 76,209,164,148, 70, 8,133,194,165,141, 26, 53,218, + 83,175, 94, 61, 25, 0,176, 44, 27,193,231,243,151,132,133,133,253, 94,157,123,212,176, 97,195,225,245,235,215, 79,171, 95,191, +126,154,175,175,239,119, 14, 14, 14,231, 86,172, 88, 97,243,242,185, 87, 68,174, 50,179,114,243,175,220,140,121, 52, 97,120,175, +200, 90,110, 14, 3, 44, 27,116,183, 48,229,220, 43,206, 63, 60, 60,124,169,133,133,197,221,105,211,166, 69,204,155, 55, 79,162, +211,233, 32, 20, 10, 81,147,252, 89, 83,254,167,154, 57,196, 30,148,182,125,148,161,146,120,248,135,202,237, 67, 63,130,189,185, + 64,124,245,105,169, 2, 4,109,160,147,217,213, 72,147,240,219,196,164,170,164, 86,129,157,100, 97, 17, 45,192,216,248,136,207, +197,149,154,131, 97,106,166,249, 31,122, 69, 68, 68,136,218,182,109, 11,103,103,103,158,133,133,197,128,191,213,245,252, 47,106, +134,187, 16, 23,133,153,232,250, 79, 51,199,135, 58, 91,203,246,155, 98,178, 76,232, 62, 31,104,111,111,127,118,229,202,149, 33, + 10,133,226,130, 41, 38,235,239,112, 61,203,205,149,144, 82,122,173,124,213, 3, 0,205,223, 81,115,201,172, 89,179,198, 77,155, + 54, 13, 69, 69, 69, 24, 60,120,176, 57,128,159, 76,213, 84, 40, 20,222,245,235,215,223, 26, 24, 24,248, 60, 56, 56, 88, 27, 16, + 16,160,246,245,245, 77, 12, 10, 10,218, 36,145, 72, 60,255,233,249,243,239,162,249,175, 51, 88,125,234,144, 38,182,142, 46,147, +127,216,119, 83,106,124,112, 11,183, 62,109,137,216, 47, 58, 65, 26, 23,133,105, 99,190,150,154,155, 91,125,217,187, 14,105, 85, +147,131,199,197,197, 97,215,174, 93,176,181,181, 37, 27, 54,108, 16,247,238,221,123,164,185,185,121,114, 88, 88,216, 0, 83, 53, +120, 60,158,113,227,198,141,102,221,186,117,235,103,109,109, 29, 19, 18, 18, 82,155, 97, 24,227,230,205,155,205,250,246,237,219, + 91,171,213, 62, 12, 13, 13,245,137,142,142, 54,222,188,121, 19, 12, 99, 90,208, 46, 42, 42,202,112,244,232,209, 23, 81, 17, 74, +233,195,239,191,255,190,223,222,189,123, 21, 22, 22, 22,108, 72, 72, 72,109, 55, 55,183,152, 31,126,248, 97,192,158, 61,123, 20, +230,230,230,172,137, 5, 1,212,106, 53,164, 82,233, 43, 70,138, 16, 2,149, 74, 5,137, 68,242,138,241, 50, 49, 50, 16,104, 99, + 99, 19,187, 96,193,130,110,251,246,237,147, 42, 20, 10,132,133,133,249, 91, 90, 90, 62, 90,184,112, 97,247,138,117,166, 34, 20, + 10,177,125,251,118,217,199, 31,127,220, 85, 44, 22,199,134,133,133,249, 11,133, 66,236,216,177, 67, 54, 96,192,128,206, 50,153, +236, 97, 72, 72, 72,160, 41, 90,122,189,126,198,205,155, 55,157,206,159, 63,239,228,238,238, 62,102,213,170, 85, 14, 2,129, 0, + 0, 96, 52, 26, 95,137, 92, 13,232,249, 65,248,184, 25, 43,207,170,212, 26,237,188,169,159, 69, 10,140,104,108, 98,212,110,128, +185,185,121,242,231,159,127, 62,106,251,246,237, 98, 71, 71, 71, 38, 42, 42, 10,197,197,197,213,190,150,255,127,162, 87,132, 7, +190,177, 33, 0,175,168, 68,149,109,131,182,159,240, 17,127, 16,141, 60,205,248,103,227,138,237, 41, 67,221, 1,218, 8,179, 35, +249,213,210, 20,208, 6, 96, 88,159, 19,241,196,182, 73,167, 1,252,164,164, 36,120, 54,136,228, 29,142,131, 3, 37,212, 19, 44, + 66,171,165,249, 18, 2,129, 96,102,159, 62,125,228, 73, 73, 73,104,218,180,169, 76, 36, 18,205,120, 47, 81,188, 53,190,238, 88, +231,219, 18, 27,234, 58,225,124,228,223,174,227, 78,184, 11,113, 49, 55, 19, 93,219,177, 99,151,115,189, 14,195,200,218, 65, 30, +214,118,230,130,253,239, 18,201, 42, 55, 87,103,174, 95,191,110,211,174, 93, 59,204,154, 53,203,206,220,220,252,194,223, 61,146, +245,178,185, 34,132, 72,203,171, 7, 83, 1,184,190,131,230,178, 89,179,102,141,251,230,155,111,112,237,218, 53, 44, 92,184, 16, + 29, 58,116,128,149,149, 85,149,229,199,192,129, 3,101, 77,155, 54,141,234,218,181,235,157,241,227,199, 15, 56,116,232,144,219, +198,141, 27,133,159,126,250,169,184, 79,159, 62,238,227,199,143, 31,212,169, 83,167,251,141, 27, 55,190,222,187,119,111, 73, 53, +147,198, 7, 32, 42, 95, 4,101, 73, 37,132, 16,194, 39,132, 8,184, 8, 27,103,176,192,167,152, 51,108,226, 92, 73,194,166,197, +200,220,245, 51,120, 5,153, 16, 20,231, 66,115,233, 48,244,151, 14, 96, 96, 68,132, 84, 74,200,188,154, 28,220,204,204, 12, 66, +161, 16, 79,158, 60,193,131, 7, 15,208,169, 83, 39,225,138, 21, 43, 44, 3, 3, 3,127,105,218,180,233,157,176,176,176,250,166, + 24, 22,111,111,111,244,235,215, 79, 52,118,236,216, 58, 18,137, 36,154, 82, 42,240,244,244, 68,223,190,125,133, 83,166, 76,241, +144, 72, 36, 55, 89,150, 21,202,100,178,183, 70,135,222,164, 43,149, 74, 1, 64,224,227,227,115,107,231,206,157,158, 77,155, 54, +229,159, 60,121, 18, 69, 69, 69,252,186,117,235,222,217,177, 99,135, 87,147, 38, 77,248,151, 47, 95, 70,105,105, 41, 53, 85, 87, +169, 84, 66, 34,145,252,201, 96, 41,149, 74,136,197, 98,147,211, 88,110, 46,134,122,121,121,221,220,185,115,167,107,243,230,205, +121,231,206,157, 67,113,113, 49,220,221,221,111,237,220,185,211,181,105,211,166,188,171, 87,175,162,184,184,216,100, 77,145, 72, + 4, 15, 15, 15,244,233,211, 71, 48,105,210, 36, 87,129, 64,112, 83, 36, 18,193,221,221, 29,125,250,244, 17, 78,156, 56,209, 85, + 36, 18, 93, 55,177,202,144, 87,110,180,208,167, 79, 31,185, 76, 38, 67,114,114, 50, 88,150, 5,203,150,121,210,244,236,220,123, +151,111,222,143,157, 48,162,119,203, 82,141, 70,115,252,220,173,135, 1, 62,238,174,132, 80,143, 42,206,189,126,120,120,248,157, +200,200,200, 95, 15, 28, 56, 96,249,193, 7, 31, 8,110,222,188,137,231,207,159, 67, 44, 22,195,204,204, 12,124,254, 63,180,163, +108, 81,128, 13, 88,124,144,148,173, 21,139, 45, 93, 21,102, 78,117,129,231, 23, 80,219, 78, 12, 30,195,147,220,124,166,148, 3, +244, 3,212,202,177,169,158, 38,251,193,179, 44,173, 88,111, 29,100,230,236, 90, 11,185,185,185,112,171,227, 7,181,200, 78,116, +229, 73,169, 25, 72, 53, 53,203, 9, 14, 14,110,238,230,230,230,232,225,225,129,156,156, 28,120,123,123,195,204,204,204, 42, 36, + 36,228,131, 26, 95,131, 77, 30, 98, 20,161, 41,192, 44,130,145,204,134,158,191, 0, 79,178, 27,226,151, 16,193,223,206, 92,237, +220,229, 98, 83,203, 31, 56,252, 25, 28, 44,197, 88, 63,178,161,181,157,133,184, 70, 38,139, 16, 18,232,224,224,112,230,250,245, +235,182, 18,137, 4,209,209,209, 8, 8, 8,192,226,197,139,237,172,172,172,254,182, 38,235, 53,115,101, 77, 41, 85, 1, 96, 1, +244, 71, 13,122,189,150,155,149,159,231,206,157, 59,230,235,175,191,198,149, 43, 87,224,234,234,138,236,236,108, 52,111,222, 60, + 41, 63, 63,191,210,247, 82, 96, 96,160,235,227,199,143, 83, 39, 76,152,208,112,235,214,173, 82,153, 76,134,130,130, 2,252,250, +235,175,152, 54,109, 26, 8, 33,160,148, 98,195,134, 13,178,193,131, 7, 55,138,143,143, 79,245,240,240, 48,165,249, 6, 1, 32, + 1, 32, 43, 95,228, 0,100, 59,118,236,176,232,214,173,155,121,249, 58, 41, 0, 41, 33,132,235,232,245,111, 54, 88, 20,168,239, +232,233,139,194,147,187, 33,229, 19, 72,121,229, 11,159,128,121,122, 15,110, 18, 1,244,148, 6,214,228,224,102,102,102, 47, 22, +134, 97,144,158,158, 14,134, 97, 48, 99,198, 12,201,152, 49, 99,234,137, 68,162,171, 45, 90,180, 88, 80,233, 9,148, 71,164,110, +222,188, 9, 31, 31, 31,242,205, 55,223,152, 71, 70,150,125,197,222,187,119, 15, 94, 94, 94,100,254,252,249,138, 46, 93,186, 16, +185, 92,110,114, 4,139, 97, 24, 72,165, 82,180,106,213,138,108,220,184,209, 76, 44, 22,227,240,225,195,200,206,206, 70,187,118, +237,248, 27, 55,110, 52,147, 72, 36,184,112,225, 2, 10, 11, 11, 77,214,173, 42,130, 85,110,234, 76,162, 73,147, 38,235, 29, 29, + 29,151,110,217,178, 69, 44,149, 74,113,238,220, 57, 20, 20, 20,160, 95,191,126,134,109,219,182, 73,204,205,205,113,245,234, 85, + 20, 20, 20,212, 40,115,220,188,121, 19,222,222,222,100,250,244,233,210,136,136, 8, 61, 0,220,190,125,187,226, 58, 75,205,205, +205,151, 52,107,214,108,125,101, 26, 44,203, 34, 61, 61, 29, 49, 49, 49,120,250,244, 41,178,179,179,145,147,147,131,226,226, 98, + 24, 12, 6, 0,128,172,184,232,240,207, 27, 15,222,145, 75,165,178,240,122, 62,181,174, 71, 63,200,146, 75,165, 50, 31,207, 90, +117, 9,153,253,198, 11, 27, 17, 17,177,128,199,227, 93,157, 55,111, 94,253,233,211,167,139, 31, 61,122,132,232,232,232, 63,229, +171,127,164,193, 34,132,128,104,125, 64, 72,195,107, 79, 75,173,155,119,238, 47,196,179, 99, 0,171, 7, 24, 62, 34,235,187,242, +247,223, 43,117, 0, 69,125,104,224, 7,152,224,216, 9, 33,128,206, 27, 32,161, 39, 30, 27,108,154,246, 24, 41, 76, 77, 77,133, + 80, 40,132, 88, 44, 70,195,214, 31,241,119,220,209, 59,130,160, 1,116,240, 53, 73,243, 37,196, 98,241,183,159,125,246,153,252, +101,205,142, 29, 59,202,101, 50,217,204, 26,155,171, 82, 89, 4, 12,116,108, 76,170,210,227,187,195, 25,254,241, 89, 42, 95, 80, + 58, 1,208, 7,191,171,201,114,119,119,143,172, 91,183,238, 51, 79, 79,207,102,239,100,174, 20,162,171, 59,119,238,114,177,118, + 43, 51, 87, 48,168, 1,129, 20,142,118,150, 88, 63,190,149,181,157,165,180, 90, 38,171,220, 92,157,190,118,237,154,173, 68, 34, + 65, 84, 84, 20,132, 66, 33, 36, 18, 9,234,213,171,135,181,107,215,218, 89, 91, 91,255, 45, 76, 22, 33,196,138, 16,210,158, 16, +210,139, 16,242,209, 75,230,202, 19, 64,107, 66,200, 7, 0, 28, 1,156,167,148,222, 49, 81,179, 25,159,207, 63,220,160, 65,131, + 52, 62,159,255, 96,254,252,249, 95, 76,153, 50, 5,203,150, 45, 67,100,100,228,211, 41, 83,166, 32, 54, 54,214,160, 84, 42,187, + 82, 74, 15, 85,166, 85, 82, 82,114, 96,250,244,233, 22, 61,122,244,168,248, 63, 46, 93,186,132,205,155, 55, 67, 46,127,181, 21, + 68,215,174, 93, 49,116,232, 80, 43,173, 86,251,123,101,154, 14, 14, 14,109,174, 93,187, 22, 0, 64, 8, 64, 92, 97,176,238,223, +191,111, 89, 84, 84,100,105,102,102,102,233,228,228,164,168, 48, 89, 61,122,244,176, 20, 8, 4,205,192,241,239, 52, 88, 0,160, +203,203,132, 24, 70, 72,121, 4, 50,222, 75, 38, 11, 44,248,133, 89,213, 44,106,223,108,176, 20, 10,197, 11,163,165, 82,169, 76, +142,184, 84, 24, 27, 43, 43, 43, 20, 23, 23, 67,175,215,191,120, 56,172,172,172,160,209,104, 0, 0,114,185, 28, 53,140, 96,225, +202,149, 43,184,124,249, 50,248,124, 62,172,173,173, 1, 0,183,110,221,194,189,123,247, 32, 20, 10, 97,109,109, 93, 45, 93,157, + 78,247,198, 8,150, 78,167,131, 88, 44,174,150, 9, 84,171,213,244,214,173, 91,184,127,255, 62,196, 98, 49,236,236,236, 32, 18, +137,144,156,156,140,216,216, 88,136, 68, 34,216,217,217,213,232,254,152,155,155, 35, 63, 63, 31, 70,163,241,197,181,176,176,176, + 64,105,105, 41, 24,134, 49, 41,157, 44,203, 34, 45, 45, 13,217,217,217, 72, 78, 78, 70, 78, 78,206, 11,147, 85, 81, 69, 88,163, +140,203, 48, 32,132, 32, 58, 58,154,158, 57,115, 6,197,197,197,127,202, 75, 21, 17,210,127, 28,171, 2, 45,160, 23,180,203, 41, +209,139,179,117, 66, 11,135,192,182,192,179,163, 0,195, 7, 36, 86,104, 28, 84, 27, 73,249, 70,249,163, 76,173, 4, 4,237,177, +178,174,149, 73,154, 70,193, 7,217,197,122,113,162,206,206,220,191,126, 8, 50, 51, 51, 33, 22,139, 33, 22,139, 17,218,180, 45, +158,229, 26,101, 15, 82, 85, 50, 80,180, 51, 73,179,156,134, 13, 27,214,145, 74,165, 17, 13, 27, 54, 36, 47,107, 70, 68, 68,128, + 97,152,122,193,193,193,126,213, 58,255, 21, 94, 34,232,100,141,193,167, 99, 31,164, 43,157,247,223, 87,215,237,210,253, 35,235, +101,167,178,252, 31,102,104, 60, 65,245, 19, 65,117, 33, 53, 53, 89, 30, 30, 30, 45,205,204,204, 14,125,251,237,183,158, 98,177, +248,168,167,167,103,243, 26,149,111, 82,222,154,111,191,232,239, 98, 85, 97,174,244, 74,128, 47, 5, 4, 82,128, 47,133,163,189, + 45,230, 13,253,192, 90, 38, 17,252, 97,170,166, 84, 42,221,177,114,229, 74,187,215,205, 85,197,210,176, 97, 67,204,152, 49,195, +206,218,218,122,251, 95,108,174,172, 81,214,174,234, 46,128,223, 1,156,126,201, 92,121, 3,248,163, 60,106, 21, 77, 41, 77, 50, + 81,179, 73,135, 14, 29,206, 62,125,250,180,211,157, 59,119,156, 50, 50, 50,252, 38, 78,156,136,101,203,150, 97,202,148, 41,219, + 41,165,117,119,239,222, 29,124,227,198,141,122,148,210, 42, 35, 98, 25, 25, 25, 31, 79,153, 50, 37, 39, 39, 39, 7, 0, 80,175, + 94, 61, 20, 20, 20, 96,210,164, 73, 24, 55,110, 92, 69,228, 21,148, 82,100,102,102, 98,209,162, 69,153, 25, 25, 25,159, 86,166, +105, 52, 26,147,119,239,222,221, 72,167,211,185,162,172, 90, 80, 92, 80, 80, 96,158,151,151,167,208,233,116,114,150,101,229,150, +150,150,102, 0,100, 3, 7, 14,228, 63,120,240,192,223, 96, 48,164,114, 86,228, 95,106,176,120, 4,119,159,223,186, 0,235,192, +144, 87,162, 87, 50, 30,129,212,220, 2,207,146,147, 32, 4,137,169,238,129, 41,165,175, 24,172,138, 23, 99,122,122, 58,166, 78, +157,170,220,186,117,235, 61,173, 86, 27,113,225,194,133,105, 85,126,120, 3,176,179,179, 67, 82, 82, 18,253,241,199, 31,139,142, + 30, 61,106, 0, 0,123,123,123, 36, 39, 39,211,233,211,167, 23,239,218,181,139, 86,199, 96, 49, 12, 3,137, 68,130,115,231,206, +209,153, 51,103, 22,166,167,167, 83, 27, 27, 27,216,216,216,224,212,169, 83,134,105,211,166, 21,198,199,199,191, 88, 87, 29,131, + 85, 97, 88, 94, 54, 40,111, 51, 94,149,113,233,210,165,207, 11, 11, 11,199, 79,154, 52, 73,245,240,225, 67,106,103,103, 7, 59, + 59, 59,108,218,180,137, 63,104,208, 32,213,221,187,119, 95,172,171, 9, 54, 54, 54,136,139,139,163,243,231,207, 87,157, 62,125, + 90, 0, 0,182,182,182,136,141,141,165,115,230,204, 81, 21, 20, 20,140,191,116,233,210,231, 85, 20, 56,120,250,244,233,139,136, +149, 90,173, 70, 78, 78, 14,146,147,147, 95, 24, 44,149,220,188,195,151,131,187, 52, 40, 85,169,148,215,239, 61,126, 30,222, 48, +192,190, 84,165, 82, 62, 78,120, 30, 71,233,204, 55,182,109,187,124,249,242, 52,131,193, 16,113,240,224,193,123,107,215,174, 85, +230,229,229,189,209,176,255, 35, 13, 22,195, 58,130,208,102, 23, 31,151, 88,126,208,165,175,136,100,220, 0,116, 37,128,216, 10, + 16, 91,129, 47,183, 65,199,230,193,188, 77,215,138, 28, 65,217, 38, 16,138,171,110,223, 34,160, 14, 0,219,252,100,156,218,170, + 89,175,209,162,188,188, 60,240,120,188, 23,102, 72, 38,151,163, 77,247,129,204,134, 27, 26, 71,128, 54, 5,225,153,220,102, 70, + 40, 20, 78, 30, 60,120,176, 48, 63, 63, 31, 12,195,188,208,148, 74,165,232,209,163,135, 88,161, 80, 76, 55,249,220,247, 4, 8, + 33, 16, 55, 6,232,184, 71, 25,106,231, 3,247, 84,190, 19,191, 95, 47, 13, 12,110,132,225,145,246,210,239, 15,103, 5,222, 73, + 86,213, 6,140,227, 97,208,134, 86,215,100,121,122,122, 54,151,203,229,135,247,239,223, 47,107,213,170, 21, 38, 77,154, 36,151, + 72, 36, 71, 61, 60, 60, 90, 84,247, 54,149,150, 24,191,156,179,124, 75,230,221, 37,237, 1, 93,105,153,177,122,105,201, 42, 97, + 49, 99,253,153, 66,189,158,246, 55, 85, 83,165, 82, 13, 26, 50,100, 72,238, 31,127,252,241, 39,115, 37,145, 72,144,144,144,128, +239,190,251, 46, 47, 47, 47,239,211,191, 56,151, 6, 3,184, 13, 64, 13,160, 37, 0, 89,121, 79,193, 8, 0,167, 40,165, 70, 74, +105, 38,165, 52,221, 84, 65, 30,143, 55,101,213,170, 85,124,149, 74,133,161, 67,135, 34, 57, 57, 25,105,105,105,248,250,235,175, + 19, 88,150, 29, 84,174,121,135, 82, 26,107,138,158, 86,171,125,148,159,159,223,185,125,251,246, 5,249,249,249,168, 95,191, 62, +186,116,233, 2, 71, 71, 71, 56, 59, 59,163, 91,183,110,168, 91,183, 46,114,115,115,209,191,127,255,188,236,236,236,246,148,210, + 74,123,161,231,230,230,198,111,223,190, 61,110,244,232,209, 13, 83, 82, 82,252, 1,216, 20, 23, 23,203,139,139,139,197, 90,173, + 86,106,101,101,101, 21, 28, 28,108, 59,108,216, 48,179,219,183,111,251,167,164,164,148, 0, 72, 2,199,191,211, 96,233,128, 25, +155,119,111, 82,139,106,121,195,194,183, 1,100, 18, 9,164, 34, 17,164, 86, 54,208,176, 44,214, 37,100, 40, 75, 41,157, 94,221, + 3, 83, 74, 95,137, 52, 24,141, 70,172, 89,179, 70, 61,111,222,188,130,140,140,140, 17, 23, 46, 92,104,112,243,230,205,187,166, + 24,161,162,162, 34,236,222,189, 91,181,113,227,198,167, 42,149,170,161, 80, 40,212,107,181, 90,108,223,190, 93,189,116,233,210, + 68,165, 82, 25, 38, 16, 8,116,213, 49, 47, 21, 17, 44,129, 64,160, 87,171,213, 13,119,236,216, 17,127,232,208, 33,149,185,185, + 57, 4, 2,129, 94,169, 84,214,219,178,101,203,163, 29, 59,118,168, 20, 10, 69,181,140, 27,203,178,111,172, 34,100, 89,182, 90, + 6, 11, 0,110,222,188,249,171, 78,167, 11,223,190,125,123,202,250,245,235,213,230,230,230, 0, 0,189, 94, 31,182,121,243,230, +148,213,171, 87,107,170,211,192,189,188,224,129,209,104,196,150, 45, 91, 52, 59,118,236, 72, 49, 24, 12, 97, 21,235, 54,108,216, +160,222,178,101, 75,138, 78,167, 11,191,121,243,230,175, 85,105, 25,141, 70, 99, 81, 81, 17,248,124, 62,158, 62,125,170,169,136, +208, 61,121,242,228,133,193,178,183,181, 14,104, 26, 22,228,183,120,205,238,243,114,177, 88,220, 62, 50,212,255,193,227,164, 20, + 74, 73, 98, 21,231,126,247,202,149, 43, 13,242,242,242, 70,172, 93,187,182, 96,219,182,109,106,163,209,248,138,201, 18,137, 68, +255,196,167, 86, 6, 2,233,227, 44,141, 66,194, 24, 8,226,246,149,153, 43,137, 37, 32,177, 2, 36, 86,112,113,113,197,141, 4, +165, 2, 12, 68, 48,234,237, 77,120, 32,229, 32,144,221,207,132, 66, 32,146,146,140,140,140, 23, 70,168, 98,241,244,246, 71,116, + 82,137, 25, 8, 21,131, 7,135,106, 60,235,157, 21, 10, 5, 63, 61, 61,253,207,154,158,158, 60,189, 94,223,222,228,115, 79, 51, + 58, 1,236, 23,113, 25,106,167,189,119, 74,125,199, 47,216, 32,149, 26, 11,128, 91,203, 17, 88,199, 25,227,123, 5,139,190, 57, +144, 29,120, 51, 81, 89, 7, 60, 58, 28,108,137,201, 95, 23,158,158,158,205,100, 50,217,209,125,251,246,201,100, 50, 25,158, 62, +125,138,122,245,234, 97,206,156, 57, 50,153, 76,118,196,221,221, 61,178, 58,183,233, 90, 6, 77, 42, 41, 54, 70, 76,222,253, 60, +227,110,186,225, 21,115,149, 93, 74, 49,228,135, 3, 5,249, 69,234,143,174, 62,215,159,169,198,181,188, 93, 80, 80,208,110,250, +244,233,185,217,217,217,175,152,171,164,164,164, 10, 35, 16, 73, 41,141,249,139,115,169, 28,101,141,215,125, 1,120, 1,104, 64, + 41, 53, 0, 40,166,148,214, 40,116, 29, 16, 16,208,208,221,221, 29,171, 87,175,198,186,117,235,242, 23, 47, 94, 12, 74, 41,124, +124,124,204,107,170,153,153,153,121,227,209,163, 71,237,235,215,175,255,112,197,138, 21, 41, 78, 78, 78,236,176, 97,195, 48,100, +200, 16,216,217,217, 25,151, 46, 93,250,188,121,243,230,247,227,227,227,219,150,150,150,222, 51,225,254,208,156,156,156, 43,191, +252,242,203,181,214,173, 91,203, 6, 13, 26,100,183,127,255,126, 27,165, 82,233, 44, 22,139,237,181, 90,173,232,225,195,135,188, + 61,123,246, 56, 62,120,240, 32, 65,165, 82,221,160,229, 19,251,113,252, 11, 13,214,111, 79,233,149,210,226,130,133,115, 54,172, + 85, 61, 51, 16, 24,106, 7, 64,109,227,130,155, 5, 42, 76,122,152,162, 52,176,116,229,238,167,244,108, 77, 35, 88, 50,153, 12, +167, 79,159, 54,126,241,197, 23,234, 27, 55,110,252, 82, 88, 88,232,118,243,230,205,109,166,234,176, 44,203,251,236,179,207, 74, + 46, 95,190,188, 59, 61, 61, 61, 48, 42, 42,234, 25,203,178,188, 1, 3, 6,148,156, 60,121,242, 15, 66,136,255,173, 91,183, 30, +215, 32,196, 13,161, 80, 8, 66, 8,110,222,188,153,144,151,151, 23,120,237,218,181, 29,211,166, 77, 43,161,148,242,162,162,162, +146, 75, 75, 75,235, 95,185,114,101,235,151, 95,126, 89, 66, 41,229,153,170, 91, 97,222, 94, 54, 82, 21,209,172,234, 26, 44, 0, +136,138,138,138, 41, 40, 40,240,191,113,227,198,209, 97,195,134, 41,203,205,199,195,226,226, 98,191,107,215,174, 29, 30, 52,104, +144,178, 58,122, 58,157, 14,221,187,119, 87, 94,189,122,245,112,113,113,177,223,205,155, 55, 31, 86,172,187,124,249,242,209,130, +130, 2,255,168,168, 40, 83, 11,240, 57, 75,151, 46, 77,159, 55,111, 94,122,118,118,246,226, 37, 75,150,100,219,217,217, 65,167, +211,189, 48, 88, 89, 57,121,103,154,124, 56,250,135,173,191,159,186,185,116,206, 23,173,164, 18,177,104,250,247, 27,206,233,121, +184,102,162,201,220, 86, 84, 84,228,118,231,206,157, 95,198,143, 31,175, 62,113,226,132, 81, 42,149,194,204,204, 12, 98,241, 63, +177, 13,169,177, 8, 44, 73,235, 29,106,149,186,116,213,175,154,251,207, 50, 95, 24, 43,136, 45,113, 51,190, 0,223,174,216,205, +126,215,213,238, 25, 40,146,193,224, 81,213,154,252, 34,176, 36,107, 72, 35, 97,202,111, 63,141,211, 60,123,116,239, 21, 35, 20, +123,247, 38,150,204, 28,205,206,239, 98,253, 12, 44, 73, 3, 65,172,169,169, 53, 24, 12,189, 22, 44, 88, 80, 26, 31, 31,255,138, +102, 98, 98, 34,190,255,254,123,149, 70,163,249,200,228,135, 82,204,111, 96,164,212,126,219,213, 92,159, 17,195, 6, 75,165,134, + 60,224,250,143,128, 64, 6,136, 45, 16,236, 87, 7, 51,134,126, 40,152,184, 39, 35, 16, 96,221,193, 8,253, 77, 77, 39,159,207, + 63,188, 96,193, 2,153, 84, 42,197,147, 39, 79, 32,145, 72, 32,149, 74, 17, 26, 26,138,101,203,150,201, 68, 34,209,209,138,246, +157,213, 54, 89, 59,158,100,220, 77, 86, 3, 2, 9,114, 74,129, 33, 63, 28,204,207, 43, 84,245,170,142,185,122,221,100,141, 27, + 55, 46, 55, 51, 51, 19, 18,137, 4,201,201,201,232,215,175, 95,238,223,196, 92, 1, 64, 41, 0, 23, 0,113, 0,226, 1,220, 33, +132,136,240, 14,211,179, 61,120,240, 32, 58, 41, 41, 9,159,127,254, 57, 62,249,228, 19,171,143, 63,254, 24,207,158, 61, 67, 92, + 92,220,237,119, 73,168, 74,165,186,153,146,146, 82,111,220,184,113, 51, 92, 93, 93, 55,218,216,216,156,179,182,182, 62,235,234, +234,186, 97,218,180,105,223,166,167,167, 55,208,233,116,119,170,113,127, 40,165,244, 73,124,124,252,129, 45, 91,182, 68,141, 27, + 55, 46,225,227,143, 63, 78, 25, 59,118,108,250, 47,191,252,146,118,251,246,237,199, 5, 5, 5,199,171,138,134,113,252, 3, 48, +117, 86,232, 94,158,104, 58,184, 14, 57,255,113,109, 20,247,175,141,146,207,188,200,165,143, 60,209,186, 38,179,109, 55,108,216, +144, 26, 12, 6,122,226,196, 9,218,177, 99,199,210,102,205,154, 93, 10, 9, 9,241,169,201, 12,222,145,145,145,199, 66, 67, 67, +123,191,190,174, 81,163, 70,125, 95, 94,215,178,101,203,152,150, 45, 91, 22,182,104,209,226,169, 41,233,108,209,162, 69,108,211, +166, 77, 75, 91,180,104, 17,251,242,250,176,176,176,110,173, 91,183, 62,252,242,186, 70,141, 26,117,125,125,221,219,206,189,109, +219,182,201,113,113,113,244,249,243,231,180, 83,167, 78,105, 21,235,219,180,105,147,124,239,222, 61,250,248,241, 99,218,161, 67, +135,180,154,206, 94, 30, 26, 26, 58,180,121,243,230, 87, 94, 75,243,144,215,215, 85,166,217,188,121,243, 43, 97, 97, 97, 67, 94, + 95, 23, 26, 26, 58,244, 93,103, 89,119,114,114,170, 27, 28, 28,156,181,116,233, 82, 90,187,118,237,172,151,127, 11,140,252,236, +219,130,162,146,162, 73,115, 86,255,102,231,223,189, 94, 77,102,110, 15, 9, 9,241,105,209,162,197,165, 15, 63,252,176,244,198, +141, 27,148, 82, 74, 27, 54,108, 72,255, 81,179,214,239,246, 23,210,181,254, 77,233, 26,255,195,177, 51,221, 31,126, 26, 46,215, + 68,253,212,137,210, 51,147,233,181,213, 67,104,132,167,200,120,121,146, 91, 28, 93,235,119,148,110,168,219,130, 46,175, 35, 50, + 73,115,157, 87,115,186,214,239,232,131, 25,238, 15,123,132,216,105,119,108, 90, 75,159, 60,121, 66, 15,236,217, 78, 27,215,150, +149,105,174,241, 63, 65, 87,251,183, 50, 73,243,213,103,190,105, 68, 68, 68,201,111,191,253, 70,159, 60,121, 66, 79,158, 60, 73, +155, 54,109,170, 12, 14, 14,110,101,242,185, 3,132,174, 14,232,110, 88,229,123,113, 90, 91,179,130, 33,225, 18, 77,255, 96,145, +182, 91,160, 80,215,206, 91,104,104,226,206, 55, 54,112, 98, 88,127, 59,208,118,190, 82, 13, 93,227,123,129,174,241,111,111,106, + 58,125,124,124,158,123,120,120,208,183, 45,117,235,214,205,110,217,178, 37,191, 38,247, 61,220, 1,238,109,235,138,211, 79,207, +105, 77,187,212, 87,228, 54,118,227,183,126,215,188, 4, 32,216,214,214, 54,103,227,198,141,212,193,193, 33, 27, 64,224,223, 34, +127,150,173,179, 6,208, 13,128, 93,249,255,205, 0,180, 2, 80,251, 29, 52,155,180,107,215, 78, 31, 29, 29, 77,159, 62,125, 74, +143, 29, 59, 70,155, 54,109,106, 0, 16,249,183,121, 54, 57, 77,110,121,105, 33,255,205,232, 36, 33,164,237,155, 6, 35, 11, 9, + 9,161,237,219,183, 87,157, 63,127,190, 68,171,213, 14,191,117,235,214,129,119,213,252,111,164,243,191,161,217,186,117,235, 43, + 12,195,212, 46,239, 2,156,118,234,212,169,134, 0,208,170, 85,171, 43, 60, 30,175,118,185,233, 77, 59,125,250,116,195,127,218, +185, 87,224,236,236, 92,151, 97,152,227, 0, 52, 41, 41, 41, 47,122, 59,217, 7,118,139,176,182,178,104, 85, 80, 80,120, 59,227, +254,254,163,239,146,206,208,208,208,174, 98,177,120,109, 68, 68,132,252,204,153, 51,178,168,168, 40,242,143,186,158, 43,188, 68, + 16,137, 66, 65, 49,245,126,170,210,243,219,131, 57,117, 62,108,211, 84,176,105,223,121,118, 97, 79,251,248, 38, 94,242, 4, 8, +216, 31, 64, 52, 55,240,105,162,198,100, 77, 41,105, 4,163, 96,234,157,100,165,251,164, 63,242,189,219,126, 52,132,119,112,231, + 90,246,199,238, 54,241, 77,234,152, 61, 7,197, 15, 16, 43,175,154,172,249,234,115,223, 84, 44, 22, 31,237,223,191,191,217,142, + 29, 59, 84,106,181,186,115,116,116,244,217,106,157,251,122,191, 90, 48,146,121,160,212,173,234,175, 71, 60,129, 17,243,240, 69, +236,243,191,195,125,111,236, 72,220,229, 22,226, 67, 74,149, 97,156, 41,145, 43, 83, 52, 9, 33,193, 86, 86, 86, 91,243,243,243, +251,154, 18,185,250, 95,158, 59, 33,196, 14, 64, 88,121,212,138, 0,136, 49, 53,106, 83,137,102, 51, 30,143, 55,165, 78,157, 58, +245,159, 62,125,122,223,104, 52,254, 72, 41, 61,247,111,120,119,252, 27, 52,255,105,252, 37,125,216,165, 82,105,244,185,115,231, +142, 9,133,194,239, 46, 95,190,172,249, 55, 93,240, 51,103,206, 52,121,211,250,179,103,207, 54,249,183, 92,131,180,180,180, 56, + 0,238,175,175,207,138,217,127, 21,192,213,247,113,140, 91,183,110, 29,136,140,140, 60,113,249,242,229,111,228,114,121,135,127, +220, 69, 28, 29,175,197, 10,175, 91, 16,137,190, 15,114,145, 77,253,182, 19, 37, 11,142, 95,113, 95,216,211,254,121, 85,230,170, + 10,205, 27,144,234,191,111,224, 38,155, 58,191, 27,200, 15, 71, 55,185,255,216,221,230,121, 85,230,202, 20,162,162,162, 46,135, +132,132,116,220,185,115,231,102,181, 90, 61,180, 42,115,245, 70, 20, 76, 6, 74,245, 51,161,231, 5,129, 66, 84, 73,104, 94, 9, +134,119, 31, 89,200,252,187,220,178,107, 25, 52, 9, 64,224,251,212,164,148,222, 6,224,255,119,204,162,148,210,108, 0,135,223, +179,230, 37, 0,151,184, 87, 55, 7,103,176,222,194,197,139, 23, 67,184, 75,207,241,223,230,220,185,115, 26, 0,223,150, 47,255, + 60, 94, 50, 89, 33,181,164,163,255, 24, 33, 85,130,146, 20, 8,216,165,213, 54, 87,111, 48, 89,141,220,165,227,246, 14,151, 42, + 65,145, 1,138, 37,239, 98,174, 94, 54, 89, 0,106,215, 88,160,215, 3, 29,128, 4, 16,146,136, 89,120,123, 99,197, 89,120, 81, +143,193,193,193,193,241,175, 49, 88, 28, 28, 28,239,209,100,237, 9,184,137, 28,222, 36, 48,168, 13, 24,146, 80,106,200,192,232, + 68,237, 59,106, 94, 71, 14, 25, 11, 30,234, 66,100,136, 71,137, 54, 3, 35,222, 65,243,125, 83,102,158,222,110,160,102,114, 89, +131,131,131,131, 51, 88, 28, 28, 28,239, 66, 89, 84, 39,165,124,249,251,106,114,112,112,112,252,139, 32, 0,218,190,229, 3,209, +228,198,107,132,144,182, 53,248, 0, 61,197,105,114,154,156, 38,167,201,105,114,154,156,230,191, 75,179, 42,237,127, 76,227,249, +255,102, 23, 69,112, 93, 88, 57, 77, 78,147,211,228, 52, 57, 77, 78,147,211,252, 23, 46, 12, 56, 56, 56, 56, 56, 56, 56, 56, 56, +222, 43,127,105, 27, 44,153,109, 93, 39,240,153,250,132,165,126, 0, 64, 25, 18, 11, 3,123, 87,153, 19,151,254,174,218,196,161, +158,204, 76,192,219, 94,162, 55,126, 76, 51,239, 41,223, 71,122, 9, 33,205, 80, 54,188, 64, 82,121,119, 97, 14, 14, 14, 14, 14, + 14, 14, 14,211, 13, 86,221, 38, 61, 46,154,201,228,222, 0, 96,100, 41,140, 44, 80,148,159,117, 53,233,238,201, 30, 0,224, 28, +216,102,175, 88,110, 27, 97,100, 41, 88, 74, 97,100, 41,244, 26,213,147,236, 7,135, 77,154,121,222,204,222,183, 71,219,118,109, +123,118,238,252,161,111,189,160,122, 94, 0,112,239,254,189,248, 67,135, 14, 63, 50,179,247,253,163, 36,235,209,222,119, 57, 49, + 51,129,224,219,176, 70,225,237,111,222,188,254, 13,128,175,223,211,245, 18,210, 75,157,182,144,102, 71,218,112, 89,135,131,131, +131,131,131,131,163,218, 6,203, 76, 38,247, 62,189,111,189,253,222, 75,201, 0,128,182, 13, 29, 49,251,167,141,221, 9, 33,143, + 0,224,163, 47,127,170,251,237,248,193,184, 18,147, 5, 74, 41,130,189,109,208,237,227, 81, 38, 29, 84,234, 24, 16,214,183, 79, +159,143, 39, 77,154,216,245,201,147, 39,137, 59,118,236,184, 8, 0,205, 91,180,240,158, 63,127,126,159, 69, 86,214, 98,169, 99, + 64,170, 42,227,193,205, 26,153, 43, 71, 47, 91,255,192,176, 33, 59,214,253,200,111,213,177,223,231,102,142, 94, 75, 74, 50,226, +115,106,162, 37,118, 11,172,109, 33, 16,206, 38, 12,195,183,176,247,176, 7, 0,115, 39,255, 35,246, 94,205,140,102,150,246,119, + 74, 85,170,205, 89, 15,143,173,227, 38,236,228,224,224,224,224,224,224,168,210, 96, 1,128,153,148,143, 71,207, 50, 0, 0,150, + 82, 96,216,160, 94,200,204,204,168,171, 51,178, 24,216,183, 7,162, 99,211,241, 40, 33, 27,148, 82,212,117,149,153,124, 80, 30, +216,208,207, 62,255,172,229,241, 19, 39,110,124, 59,253,219, 45,132,148,141,222,189,246,151, 95, 35,102,204,156, 49,244,147, 65, +159,124,176,103,207,158, 24, 0, 53, 50, 88,140,192,114,233, 15,243,103,153,165,100,171,213,227, 38, 78,230, 77, 24, 63,102, 17, +128, 65, 53, 49, 87,254,110,174,223, 93, 60,177, 71, 38,147,201,176,110,221, 58, 49,176, 31,253,187,182, 16,117,250,240, 67,248, +248, 5, 53,249,113,229,142,250, 39, 68,162,207,109,235,126,208, 35, 39,238,100, 58,151,165, 56, 56, 56, 56, 56, 56, 56, 42,109, +228,110, 52, 82, 60, 74, 72,199,163,132,116,220,136,205,134,142,229,225,167,121, 83,241,195,172,201,200, 85, 2,123,175, 36, 35, + 46, 33, 3,113, 9, 25,200,201, 47,249,211,254,175,119,181,252,233,123, 89,195,165, 75, 45,126,108,215, 66, 30,105,109,101,101, +245, 56,102, 75,233,140, 9,153,254,179,199, 37, 11, 5, 18,135, 20, 43,135, 90, 77,118,239,217, 19,224, 96,103, 47, 55, 55,183, +152,108,237,215,110,189,165, 71,164, 69,101,154,127, 50,133,142,129, 45,187,116,233,212,201,209,193,158, 29,177, 52, 42, 54,192, +207,199,224, 83,215, 47,210,204,209,183,229,219,246,121,147,166,216, 45,176,182,151,147,195,119,231,143,237,145,169,213,106,220, +191,127, 31,185,185,185,229,219, 3, 14, 14, 78,112,119,117,198,207, 11, 38,201,102, 77, 29, 21, 34,150,200,246, 19, 66,136,169, +233,172, 9,156, 38,167,201,105,114,154,156, 38,167,249, 79,213,252, 87, 25,172,248,228, 60, 60,122,150,129, 16, 63, 23,120,121, + 56,225, 70, 92, 62,182,157, 73,198,250,227, 73, 56,115, 39, 27, 44, 95,129,140, 34,224,113, 98, 38, 30, 39,229,160,170, 74, 50, +158, 88,208,119,220,184,194, 73,245, 2,138, 26,159, 59, 58, 26, 46,118,143, 3,166, 76, 41, 24,205, 19, 11,250,218, 59, 90,238, +152, 52,118,196, 0,133, 76, 42,210,106,180,240,244,112,147,140, 28,250,217, 96,161,153,124,135,169, 39, 99,103, 23, 32, 23, 75, +229, 91,190,251,118,162,100,201,222,199,207, 75,181, 40,253,227, 74,230,211, 73, 83,103, 20,241, 4,210, 95,236,236, 2,228,166, +232,136,221, 2,107,187,219,216,124,119,233,248, 30,153, 78,167, 65,122,122, 58,180, 90, 45, 12, 6, 67,217,239, 18, 9,196, 18, + 9,138, 84, 6, 60,203, 80,162,101,243, 38,188,134,193,129,126,118,126, 29,135,115, 89,138,131,131,131,131,131,131,227,173, 6, +171, 68, 89,250,100,208,136,137, 89, 94,102,233,218,110,145,254,160,160,200, 78, 79,194,131,155,199,240, 36,250, 56,138,114,158, + 3,160,240,240,116,135, 80,245, 76,187,102,245,170, 44,214,160,126,242, 54,189,110,221,156, 93,159,196,202,153, 31, 23,214,186, + 22,247, 40,221,118,212,240,141,136,123,148,110,251,227,194, 90,215,158,196,202, 25,153,216,216,100, 80,191,110,164, 91,231, 14, +152, 50,101, 18,186,117,238,128, 73, 35,250, 16,137, 72,208,216,212,147,209,138, 36,223, 79,253,118,142, 34,163, 64,167,187, 17, + 87,162,145,201,165,210,203,143, 75,212, 90,200,244, 93,251,142,200,214, 8,249,115, 76, 49, 87, 78,230,230,223, 93, 57,245,187, +140, 82,138,212,212, 84,104,181, 90,232,245,250, 23, 6,203,210,210, 18, 5,165, 58, 60,207, 82, 34, 49, 83,137,152,196, 34,116, +236,208, 81,198, 23,136, 6,112, 89,138,131,131,131,131,131,131,227,173, 6, 43,238,202,222,230,183, 78,110,113,200,201,204, 40, + 52,147,240,193,103, 8, 50, 83,226,177,121,209, 88,236, 94, 49, 17, 5,233,241,160, 20,144, 10,121,208,148,230, 21,166,223,222, +237,144, 83, 73, 15, 66, 66,244, 31,172, 92,155,224,153,144, 64,205,183,111, 47, 17, 0,192,246,237, 37,130,132, 4,106,190,114, +109,130,167,136,228,128, 26,141,232,220,237, 35,108,217,180, 14, 17,173,187,225,247, 11,207,161, 84,233, 76,154,255, 76,226, 80, +215,195,214,209,241,163,177,159,180, 81, 52,170,107, 37,247,113,183,224,137, 4, 2,131,128, 39, 52, 30,188, 89,152,214,190, 75, +119,190, 76,110,222, 65,226, 80,215,163, 50, 29, 11,129,112,246,229, 19,191,203,120, 60, 30,158, 63,127, 14,173, 86, 11,173, 86, + 11,141, 70, 3,189, 94, 15, 0, 40, 86,233,145,158,171, 65,114,182, 10,201,217, 42, 60,120, 94, 12,145,220, 18,122,189, 62,136, +203, 82, 28, 28, 28, 28, 28, 28, 28, 38, 13, 52,154,154,153, 7, 27, 51, 62,236,156, 61, 49, 96,236, 79, 0, 0,163, 81, 15, 74, + 1,131,145,133, 41,253,231, 40, 21,156,252, 98,164,103,130,135, 39, 41, 28,240,177, 76, 5, 0, 3, 62,150,169, 60, 60, 73,225, + 23, 35, 61, 19,148, 58, 43,157,193,104,196,229,152, 44,252,184,235, 33,102,108,186,135, 99,183, 76,111, 51,206, 23, 72,199,253, +176, 96,190,140,207, 35, 36, 38,169,164, 36, 37,215, 80,194, 19, 8,116, 50,153,136,106, 41, 95,147,152,109,204,237,208,123,100, + 34,143, 39, 24, 85,117, 90, 89, 80, 74,161,209,104,160,213,106,161,211,233, 94, 68,177, 0,160,176, 84,143,244, 60, 53,146,179, + 85,120,158,173, 66, 74,182, 10,153,249,106,112, 29, 9, 57, 56, 56, 56, 56, 56, 56, 76, 50, 88, 44,128,199, 73, 57, 16,241, 89, +184,122,120,129,190, 52,129, 61, 5, 96, 48, 86, 62,169,125, 5,251,247,167,165,212,241, 46,101, 39, 79,126, 30, 17, 84,207,230, +238,200, 17,110,177, 65,245,108,238, 78,158,252, 60,162,142,119, 41,171, 55,138,140,148, 82,176, 20,229, 11,173,150, 97, 33,132, +215, 56,216,207,157, 63,123,251,227,231,163, 86,197, 61, 18, 10,133,122, 87, 91, 25,113,119,144,241,106,217, 73, 69, 26, 61,163, +241,173,215, 72, 71,128,134,149,233, 20,234,117, 51,155,181,239,173,212,233, 12,112,115,115,123,197, 92, 85, 84, 17, 22, 42,117, + 72,207, 87,227,121,182, 18,201,217, 74, 40, 53, 6,220,143, 75, 0, 97,120,247,185, 44,197,193,193,193,193,193,193, 97, 82, 4, +203,221,213, 1,215,239, 39,193,221, 78, 2, 11,115, 5, 98,227, 83,192, 99, 4, 96, 8,160, 55,152,110,130,168, 78,191,107,241, + 98,139, 69, 73, 9,198,235,171, 86, 63,125,146,148, 96,188,190,120,177,197, 34,170,211,239, 2,202,122,231,149,153,172, 50,163, +101,100, 77, 63, 17, 74, 89,123, 59, 75, 9,255,214,211,210, 92,134,225,105,108, 44, 36,172,141,133,152,113,178, 20, 11, 92,109, +132, 66,145,136,129,163,157,173, 1,148, 58, 84,166,163, 73,142,121,150, 94, 84,244, 77,243,118, 31, 41, 5, 2, 1, 60, 61, 61, + 95, 84, 19, 86, 24,172,172,236,252, 23, 17,172,244, 60, 13,164, 34, 6,183, 47,159, 86, 26,141,250,205, 92,150,226,224,224,224, +224,224,224,168,218, 96, 81,192, 76, 38, 1,229, 73,112, 49, 42, 30,190, 1,245,177,233,192, 13,120,215,107, 12,150, 53,192,192, + 26, 77, 62,216,196,169,202,232, 9, 19, 10,191, 74,207,164, 75,123,244,112, 57,156,158, 73,151, 78,152, 80,248,213,196,169,202, +232,242, 67,129,101,105,153,209, 42, 31, 33,222, 84, 8,144,150,148, 89, 92,234,233, 40, 7, 79, 32,208,200,197, 66,131,149, 92, +196,218, 89,136, 4,118,230, 98,145,189,185,136,159,155,151,165, 2, 72, 90, 85, 90,154,228,152,103,207,243,243,191,105,209,177, +159,210,204, 76, 1, 47, 47, 47,104, 52,154, 23, 6,171,184,164, 20,121, 69, 42, 80, 10,212,117,149, 35, 54,250,146, 49, 55, 43, +245, 65,126,220,177,117, 92,150,226,224,224,224,224,224,224, 48, 41,130,101,100, 41,108,109,172, 33,145,155, 35, 33, 83,135, 98, + 98,143,124, 37,133,209, 88,121, 4,139, 16,210,246, 77,235,247,239, 79, 75,217,183, 47,123,253,254,253,105, 41, 47, 59, 57,246, + 69, 21, 97,249, 95,150,154,172, 73,169,241,232,193,147, 87,242,186,134,219, 89, 49, 60,158, 74, 40, 96, 52,124, 33, 79, 39,228, + 51,122, 33,159,209, 58,152, 11,120,103, 14,108, 99, 8,161,103, 76,209,212, 36,199, 60, 75,200,202,250,166,117,231,254, 74,123, + 7, 7,124,242,201, 39,112,115,115, 3, 0,152, 73, 8,108, 69, 74,240,212,105, 56,127, 96, 67,105,108,212,217, 40, 24, 53, 61, + 94, 30,205,253,109,233,124, 23, 56, 77, 78,147,211,228, 52, 57, 77, 78,243,159,170,249, 79,195,132,201,158, 41,234, 56,201,225, +237, 34,135, 90,103, 15,181,214,136, 82,181, 17, 69, 74, 29,138,148,122, 36,100, 40,241,248,236,187, 39,132, 2,160, 44, 64, 80, + 86, 85, 8, 82,102,236, 40, 49,109,255, 82, 65,209,162, 31,231,207,234,183,115,247, 31, 24,243,161,147,219,221, 4,109, 26, 33, +140,138,225,241,245,214, 10,190,224,105,252,163,244,243, 39,246,132,150,138,148, 67, 76, 77,147, 38, 57,230,153,216, 45,240, 27, +223,134,173,103,131,130,175, 85, 21,202,167, 54, 13,192,157, 59,119,213,177,241, 25, 6,158,196,242, 46,107,212,109,205,143,227, +166,202,225,224,224,224,224,224,224,168,134,193, 82,170,148, 79, 62,232, 57,228,197,132,206, 70, 35, 5,203, 82, 24,203, 35, 76, + 44,165, 48,232, 84, 79,222, 53, 33, 70,150,189,177,122,211,206, 78, 13,130, 27,243, 2,106,153,161, 40, 63, 27, 55,175, 95, 53, + 80,150,189,106,146, 65, 75, 76,212,152, 57,248,245,233,243, 81,143,157,159,143, 24, 83,212,162, 69, 43,177,141,173,185, 46, 51, + 59,171,104,219,186, 29,198, 67,127,236, 12, 5,203, 14,164,137,137,154,234,164, 75,147, 28,243, 12,192,128,114,199,222, 26, 8, +104,169,202,126,220, 89,153, 21,119,134,203, 62, 28, 28, 28, 28, 28, 28, 28, 53, 50, 88,143,175,238,109,254,191, 72, 72, 94, 94, +230, 39, 91,119,252, 49,111,219,174, 3, 77, 53, 58,157, 11, 11, 94,178, 81,175, 63, 47, 46,206,157, 97,170, 70, 73,102,236, 3, +226,225, 17,250,235,207,139,198,255,178,114,113, 27,176, 70, 95, 16,146, 64, 8, 61, 83, 34, 84, 14,171,174,185,122, 3, 57,164, +217,145,118, 0,114,184,172,195,193,193,193,193,193,193, 81, 99,131,245,191, 34, 47,254,122, 49,128, 49,239,170, 83,110,162, 22, +148, 47,239, 21, 74,233,125, 0,220, 80, 12, 28, 28, 28, 28, 28, 28, 28,149,194,112,151,128,131,131,131,131,131,131,131,227,253, + 66, 0,188,165, 87,158,233, 51,101,215,164, 55, 65, 85,250,156, 38,167,201,105,114,154,156, 38,167,201,105,254,243, 52,171,210, +174,142,255,248, 91, 67,203, 71, 76,255,111, 44, 0,218,114,154,156, 38,167,201,105,114,154,156, 38,167,201,105,254,219, 22,174, +138,144,131,131,131,131,227, 95,135,109,221,174,102,182,117,187,154,153,186,189, 93, 64,111, 7,187,128,222, 14,220,149,227, 48, + 21, 62,119, 9,222, 29, 66,136, 24, 0, 75, 41,213,253, 85,105,176,178,170,109,110, 80,216,238,101, 88,205, 15,133,201,119, 79, +190,239,243, 11, 8, 8, 8, 6,128, 7, 15, 30,220,166,148,190,107,111, 76,200, 29,124,251, 91,153, 91, 14,215,177, 90,163,178, + 84,185,186, 36, 35,110,207,251, 76,179,157, 93,128, 92, 43,150, 46, 4,161, 29, 65,193, 80, 66,206,240,138,245,227, 11, 10,238, + 20, 86,182, 95,173,110, 11,252, 62,239,243,225,244,245,191, 29,158,247,124,255,180,216,215,127,183,238,184, 66, 49,122, 96,187, + 41, 43,119,238,255, 62,231,192,228, 18, 46,247, 87,159, 90,205, 62,182, 52,240, 29,121,105,231, 22,229, 86,103, 63, 87,223,136, + 24,129, 64, 96,167,211,233,178, 82,227,174, 5,153,178,143,155, 95,147,104, 30,143,113, 54, 26,216,148,228, 71, 87, 66,185,171, + 95, 53, 82,251, 58, 17, 48, 24,190,166, 0, 1,225,255,164,206,125,250, 78, 35, 29, 58, 59, 59, 75, 45, 44, 44, 90,152,155,155, +187,201,100, 50, 73,126,126,190, 42, 63, 63,255,121, 82, 82,210, 25, 74,169,225,175, 56, 71,187,192,238,211,248, 34,102,102,249, +191,103,103,199,236, 91, 80,249,246,221,230, 17,134, 76, 43,255,247,130,236,152,253,211,255, 14,247,202,161, 94,207,112, 80,118, + 60,195,240,154, 24,169, 97,126,214,189,253,171,170,179,127, 68, 68, 68,119,189, 94, 47,174,248,191, 64, 32,208, 92,189,122,117, + 31,247, 20,252, 69, 6,203, 53,160,183,149,158, 79,103,241,121,204, 71, 44,165,138,244,219,187,229,127,231, 19,116, 15, 31,120, +139, 97, 24,215,151,215,177, 44,155,146,116,125,203,123, 41,108, 9, 33,174, 63,141, 11,153,146,153,171, 42, 34,132,204,125,155, +249,112, 8,238,127,133, 48,164, 54, 33, 4, 12, 67,192, 43, 27, 64, 53,237,249,245,173, 13,223,160,233,100, 46,231,215, 45, 42, + 53,220,167,148, 86,249, 18,146,218,248, 56,203,108, 92,206, 71,118, 31,237,121,235,196, 70,127, 51, 7,191, 54, 37,153,177, 15, +222,195,185,217,121,121,121,133,213,173, 91,215,102,244,232,209, 66, 0, 88,178,100,137,183,183,183,119,110,124,124,252, 77, 74, +105,118,141,204,149,189,223, 39,203, 22,205,217,210,177, 99, 39,164,229,148, 98,225,226,149,145,102,142,117,123,191, 47,147, 69, +156, 67,164,150,114,121,204,151,227,103,184,116,106, 21,198,207, 47,213,225,200,153, 27, 3,246,172,255,161,181,165,101,131,160, +202, 76, 22,171, 44,156,238, 96, 70, 59,176,202, 66, 0,232,255,250,239, 46,102,250,182,118, 82, 99, 7, 39, 49,255, 54,128, 63, +170,124,185,132, 13, 58, 46, 16, 10,221, 9, 97,192, 16,128,199, 35, 96, 8, 1, 67, 0,131, 94,155,244,228,226,134,246,127,139, +130, 58,228,147, 12, 66,136, 13,195,148,165,143, 16,128, 97, 24,240,203, 70,254, 45,122,122,101,163,205,123,200, 79, 22, 65,222, +150,129, 31, 54,109,182,225,252,179, 60,121,173,150,227, 15, 19,202,172, 74,186,240,211, 29, 83,246,151, 72, 36, 86, 7, 15, 30, +180,235,208,161,131,133, 67, 80,247,243,166,236, 99, 38,146, 4, 28, 58,116, 64,216,161, 67,251,106,228, 79,223, 15,192, 48, 91, + 9, 32, 96, 89,186,132,199,210,223, 74,114,227,226,171, 59,152,176,125, 80,247, 57, 32,240, 55,121, 7,138,135, 89,247,247,205, +168,225,181,229, 73,237,125, 63,149, 74, 36,147,124,124,253,235, 38, 60,139,143, 43, 42, 42, 92,172,202,138, 91, 79, 41,101,171, + 37,166, 55,124,117,234, 98, 84, 71,190, 64, 64, 58,180, 9,231, 1,120, 39,131,229,224,224,208,125,197,138, 21,117, 34, 34, 34, + 0, 0, 6,131,193,124,247,238,221,142,115,231,206,149,155,242, 12,189, 9, 23, 23, 23, 23, 11, 11,139, 90, 82,169,212, 5, 0, + 84, 42, 85,106, 97, 97,225,243,212,212,212,212,170,246,117, 12,238,109,203, 48,152,115,236,143, 95,248, 0,208,190,231,240,121, +158,145, 95, 89, 17,158, 64,245,166,237,141, 6,173,156, 33,100,252,233,131, 27, 9, 0,180,233, 58,120,170, 93, 64,239,159,179, + 31,236,206,252, 75, 62,232,123,247,230,217, 62,214,117, 39,148, 76, 8, 9, 13,107,252, 81,183,142,240,247,114, 70,247,126, 35, + 39, 1,168,150,193,210,235,245,226, 61,123,246,184, 50, 12,195, 51, 24, 12,234, 62,125,250,100,189, 75,218,124,154, 13,186, 2, + 66,220,116, 6,195,175, 73,215,188,230, 81, 58,147,125, 61,237, 78, 9,252,111, 64,152,161,148,101,147,211,163,119, 52,225, 12, + 86, 57,182,117,187,154,241,196,194,251,173,154, 55,182,153, 58,178,135,104,205,111, 23,225, 28,220, 39, 53,237,246,111, 46,127, +215, 19,100, 24,198,117,223,246, 21,246, 50, 17, 15, 0, 80,162, 54,160,231, 39, 85,143, 6,225, 18, 54,224, 28, 8,124, 43,234, + 80,141, 70,131,132,207, 23,168, 9, 0,144,178,222, 1, 82,169,232,218,250,111, 34, 10, 7,119,169, 61,112,202,207,209,155, 0, + 88, 2,200,120,227, 67,193, 48,174, 59, 55, 44,177,119,177,145,128,207, 35, 40, 81, 25,208, 99,224, 4,227,155, 12,219,250,111, + 34,230,124,210,209,163,175,125,135,223,123, 2, 56, 90,233, 11,196, 49,192, 79, 97,235,124,242,163,225,115,156,149, 48,199,183, +243,150,216, 95, 62,177,251, 98,219,238, 67,116,207, 83, 82,148, 6,157,254, 81,110, 94,250,196,226,180,184,199,166, 22,212,102, +102,102,117,204,204,204, 26,116,236,216, 81, 50,105,210, 36, 65,100,100,228,139,223,135, 13, 27, 38, 60,119,238,156,211,162, 69, +139, 58, 57, 59, 59,171, 75, 74, 74,238,148,148,148, 60,165,148,154, 60, 41,165,163,163,221,151, 31,245,232,130,214, 61,191,128, +145, 37, 24, 54,106, 60,142, 31,253, 99, 4,128,247, 98,176,204,120,204,236,161,163,191,118,105, 17,209,144,191, 96,247, 99, 88, +202,132,104, 23,222,144, 47, 17,124,229,184,227,215, 69,139, 1,124,246,166,200, 21,171, 44,156, 30,100,171,237,215, 53,162, 54, + 14,236,208,246,115,109, 59, 5,140,204,226, 69, 36,203,171,227, 24,133,149, 84,186,194,217,146,103, 47, 54,102,175,240,234, 56, +230, 84,252,209,229,197,149,165, 69, 32, 20,186,175, 95,241,157,143,149, 66, 8, 62, 67,192,227, 17,240,121, 12,212, 90, 35, 6, +142,156,246,190, 34,140, 60,169,189, 79, 39, 6, 24, 12, 0, 44,176, 81,149,245,248, 72,117,238, 9, 97,120, 54,187, 55, 44,226, +219, 91,136,193,227, 17,240, 24,128,199, 16, 36,102,170, 48,122,210, 44,139,119, 53,234, 29,155,218,135,157,251,185,101,251,198, + 65,214,245,119, 93, 37, 22,141, 59,246,181,201, 81,203, 62,221,185,255,108,191, 90, 45, 38, 92,167,148,253, 49,249,226,210, 19, +149,233,104, 52,154,204,246, 29, 58,154, 19,190, 92,118,106,223,166, 22,124,134, 64,111,164, 48, 24,203, 6, 65,102, 41, 69,217, +119, 75,217, 71, 12,101, 41,134, 14,253, 28,237, 59,116, 84,178, 6, 54,165, 26,133,198,214, 99,167, 46,219,105,244, 44, 22,173, + 88, 63,167,180, 48,123,206,179, 88,155, 68,153, 67,221,241,202,204,184, 3,166,159, 56,252,227,174,236,238,177,253,208, 53, 4, + 5,248,151, 13,212,204, 82,248,186,202,177,253,240, 53,248,249,250,149,165,155,165,168,235,102,134,150, 31, 14,172,225,245,141, +228,203, 29,252,118,116,237, 53,168, 87,207, 94,253, 97,109,101, 14,173, 78, 83,247,244,241, 35,191,172, 94,177,176, 41, 33,228, +211,106,153, 67,106,124,241, 94,160, 44,251,206,181, 28,206,206,206,118, 97, 97, 97, 47,254,111, 48, 24,224,233,233,137,212,212, + 84,223, 26,152, 53,153,179,179,243,135, 11, 23, 46,180,111,213,170,149,192,206,206, 14, 0,144,157,157,237,114,254,252,249,134, + 13, 27, 54,204, 74, 75, 75, 59,156,153,153,169,124,171,169, 96,213, 66, 30,229,243,196, 98,105,185,175, 5, 51,105,244,199,245, +237,236,236,222,248,113,156,155,155, 39,154, 57,115, 6,225,243, 5,101,219, 83,202, 80,214,248,214, 57, 70,154, 52,105,210, 85, +167,211, 73,222,244, 91,142,193,174,147,154, 21,245, 45,123,139, 0,124, 30, 47, 63,237,246, 30, 59,147, 77,123,253,110,237,156, + 24,193,234, 46,221,186,121,116,239, 20, 9, 39, 59, 11,156,185, 22,135,177,223,252, 4,189,193,184,180, 38,247,135,199,227,241, +179,178,178, 18,173,172,172, 28,223,195,251,182,246,254,237,203,237,207, 94,188, 53,245,103,241,206,145,117,154, 13,214,151,181, + 71, 42,155,153,197, 87, 98, 46,104,217,189,173,185,181,139,159,100,221,138, 5, 2, 46,130,245,242,141, 16,241,230, 54,107, 18, +102, 51,117,220,231,162,185,235,207,227,234,241,195,170,180,219,187,223,139,185, 82,216,251, 70, 16, 30,127, 56,225,241,228,132, + 33, 34,214,200, 38, 27,180,218,121,202,156,184,244,119,213,102, 89,138,223,175, 84,211,152, 83,234,253,203,207,139,236, 29, 44, +197, 80,235,140, 24,252,229,183, 88,187,116,142,194,206, 66, 4,141,206,136, 77, 7,110,229,212, 83, 46,161,131, 59,212, 30,248, +221,250,152, 63,126,220, 26,251, 71,217,179,250,214,140, 7,123, 11, 49,190,219, 25, 7,115,169, 0, 86, 10, 33, 24,230,205,230, +106,112,151, 50,205,130, 98,173,129, 16, 34,162,148,106,223,104, 36,156,130,154,155,219,185,238,233, 49,116,142, 93, 92, 38, 1, +133, 14,241,230, 18,124,244,201, 72,203, 58,142, 82,200, 37, 60, 36, 38,167,123,126, 53,121,114,168,196,201, 47, 76,157, 30,251, +188,170,211,246,240,240,232,217,185,115,103,217,196,137, 19, 5,110,110,110,216,186,251,184,251, 7,189,198,116, 73,205,200,117, + 99, 41,224, 96,111,157,252,121,223, 78, 7,143, 28, 57,146,148,156,156, 44, 88,184,112, 97,248,222,189,123, 3,170,243, 37,106, +164, 20,106,141, 17,198,242, 23, 99,118,161,166, 6, 47, 21,194,188,253,203,156,118,107, 31, 25,198, 95,178,239, 41,138,149, 6, +200, 68,124,196,167,151, 34, 34, 60,140,191,107, 29,105,245,166, 61, 62,239,243,225,116, 7, 51,218,161,107, 68,109,216, 91,201, +176,225,231,239,112,224,234,179, 14,153, 37, 4,182, 93, 23, 14,119, 18,243, 63,176,147, 9, 87, 68,134,122, 57,182, 14,113,199, +205, 80, 47,199, 11, 81,143,226,234,245, 89, 60, 58,181, 68,112, 42,239,232,232, 55, 26, 45,134, 48,176, 86, 8,177,254,120, 18, +100, 18, 62,228, 18, 62,228,226,178,191, 12, 67,222, 41, 95, 75,157, 3,220,120,172,241,115,115,231,128,207,251,245,233,237,252, +113,191,222, 20, 60, 6,187,127, 63,216,109,219,182,173,233,102,142,190,235,140, 12,111,189, 42,237, 65,114,213,215, 19,176,183, + 16,225,171,117,247, 97, 46, 21, 64, 33, 19,192, 92, 38, 64,235,250,118, 53, 78, 39, 33,196,106, 68,183, 58,157,238,110,105,219, +202,183,150,153,207,157,248,194, 7,159,207,187,181,244, 92, 65,171,113, 63, 47, 9,176, 41, 41,208,242,103, 76, 26,202, 79, 73, + 75,107,181,251,224,249,214,206,141, 62,127,100,208,149,126,157,117,231,183,253,111,210, 75,142,189,210,208, 53,162,183, 68, 87, +162,191,119,231, 81,138, 87,190, 70,140,152,196, 34,200, 37,124,152, 85, 92, 91, 9, 31,114,137, 0,102, 18, 62,210, 82, 18,144, + 87,202,187,148,106,195,180,162,231,174, 84,171, 42, 74,173, 51,226,246,179, 18,120,248, 6,195,201,201, 25,218, 78, 3, 60,174, +159,249,125,191,220,201,127, 65,105,250,195,175, 77,213,217,126,232, 26,230, 46, 88,242, 24, 4, 15,203,223,230,254, 19, 39,140, +246,249,105,241,138, 87,214,141,252, 98,148, 79, 77,205,181,204,193,119, 91,203, 15, 63,233, 85,175,113, 59, 60, 77, 72,192,209, +131,183,208,230,131,142,232,212,165, 39,180, 90,205,192,245,107,151,223, 4,176,242, 79,101,174,147,127,179,122, 65,254,219, 92, +156,157,221, 88,182,108, 14, 88, 74,129,102, 45, 91, 99,242,184,161, 96, 41, 69,131,134,141, 90,119,234, 55,154, 82, 90,102, 4, +115,114,115, 74, 31,197, 62,104,171,202,140,189,110,242,181, 84,171,245,217,217,217,184,125,251, 54,226,226,226, 16, 19, 19,131, +220,220, 92, 88, 88, 88, 84,171,138,221,202,202,202, 60, 52, 52,244,227,223,126,251, 77, 98, 97,241, 31,207,175,213,106, 33,147, +201,208,181,107, 87, 65,179,102,205, 92, 6, 13, 26, 52,200,202,202,106,123,126,126,126,209, 27, 13,211,221, 67,105,142,245,186, +175,233,212,107,216, 72, 0, 16,138,205,158, 45,251,245,143,152,202,142, 45,148,152,187,183,237,254,153, 23, 40, 5, 33,100, 89, + 78,236, 31, 25,111,219, 86,167,211, 73,119,237,218,229, 66, 8,121,229,253, 58,123,217,206,166,247,159,100,180, 89, 61,107, 10, +223,220, 76,130,236, 2, 13,134,143, 28,109,107,178,185,170,215,109, 84, 88,195,134, 43,191,157, 52, 20,114,153, 20, 39,174, 63, +197,248,105,223, 27,242,114, 50,183,128,144, 37,217, 49,123,223,181,214,226,189, 76,247,230,227, 98, 6, 69,251, 8,201,208, 62, +145, 18,173,222,136,130, 82, 61, 52, 58, 35,140, 44, 69, 97,169, 30, 15,158, 23,195,214, 92,132,117,248,231, 83, 45,131,197, 23, +136, 58,143,249,180,147,104,209,246,235,184,122,124,187, 42, 45,122,183,172,226, 55,183,208,126,207,146,111,237,172,253,170, 71, +169,186,171,165,212, 57,192,141, 79,120,139, 91, 70,182,104, 55,114,212, 40,248,214,113, 21, 26,141, 70,122, 63,238,153,126,211, +250, 13,159, 90,184,213, 91, 90,148,114,127,122,197,203,180,186,221, 55, 89,150, 77,121, 61, 98,197,178,175,126,205,190, 73,147, + 16,192,210, 76,132, 53, 71, 19, 64, 41, 64, 64, 97, 33, 23, 96,231,185, 20, 20,230,166,229,212, 87, 46,185,252,121, 7,219,174, +243,214, 63,216,191,234, 96,102, 20,128, 24, 74,105,230,219, 52, 9, 33,224,243, 8,204,101, 2, 88,200,132,176,148, 11,193, 16, +242, 86,115,245,237, 47,119, 55, 1,120,244,178,185,122, 89, 83,238,224, 27,104,110,235,190,175,231,136, 5, 86,119,159,235,192, +231, 17,212,118,148,194, 90, 33,132,214, 64,144,152,173, 43,223,199, 28, 95, 76,156,109, 55,101,194,200, 35,132, 68,214,167,244, +156,161,178,115, 87, 42,149,162, 79, 62,249, 68,160,215,235,117,131,199,206,107,151,145,149,219,109,233,252,201, 98, 59, 91, 27, +148,170,245,136,126,152,228,255,253,162,159,107, 31, 62,125,109,223,215, 95,244,216,223,161, 67, 7,139, 93,187,118,177,213,185, +239,217,153, 57, 63,111,216,182,103,203,146, 69,243,241, 40, 41, 31,235,215,174, 4, 53, 26,214, 84,238,119, 95,213, 92,177, 98, +133, 67,120,120, 56,115,227,198,141,156,215, 13, 40, 33,144,231, 22,105, 96, 41, 23, 66, 38,230,195,193, 74, 2, 27, 51, 17, 68, + 2, 6, 12,243,159, 66,228,101,205,245,191, 29,158,199, 42, 11,113, 96,135,182,223,134,159,191,195,103, 95,126,131,251, 57,162, + 99,140,204, 98,222, 23,253,122, 78,181,147, 26, 59, 56, 91, 50,246,173, 67, 60, 32,151, 8, 49,109,204, 39,104, 20,149,104,159, + 90,192,126,147,173,226, 5, 3,248,230, 77,233,100,202, 35, 86, 10,153, 0,231, 14,237,200, 42, 45, 46, 40, 36,188,178, 42, 66, +189, 86,151,100,154,215,255,243,245,148, 59,248, 78, 13, 9,174,255,221,200, 97,159, 51, 77, 35, 26, 81,134, 17, 32,167, 88, 75, + 40, 5,198,141, 30,129, 47, 70, 12,117, 76, 78,203,154,177,114,229,154,233,102,246,254,115, 75,178, 30,206,170, 76,147, 71, 24, + 48, 12,129,153,132, 15, 51,105,153, 97, 49,147,240,161,214, 26, 65, 8,120,174, 33,253, 10, 65, 0, 66, 72, 90,242,205, 29,254, +166,164,211,185, 94,199,211,231,179,132,126,202, 35,234,171, 79, 30, 71,207,187,113,247,249, 13, 74,105, 94,173,150, 19, 6,233, + 12, 20, 37,106, 3, 18, 50,149, 48,232, 40,249,172,163, 59, 60,123, 17,223,249, 27,162,183, 16, 66,204, 43, 34, 46,175,107,166, + 92,221,173,182,173,215,179,239,146,229,107,111, 46,250,238, 27, 94, 78,161, 22, 44,165,144,136,120,144,138,248,229, 11, 15,170, +210, 66,172, 92,253,107,134, 1,164, 39, 61, 87,121,158,255,115,161, 65, 7,244,232,212, 98, 39, 1, 68,132, 17,166, 56,187,123, +184,183,233,242,169,164, 77,215, 79, 96, 52,104,167,202, 29,252,206,150,102,198,158, 54, 69, 51, 40,192, 31, 32,120,152,117,111, + 95,207,178,151,100,247, 63,252,124,253,124, 94, 95,231,237,237,235, 99,202,125,175,248,184,144,218,249, 12,243,246,171, 55,121, +228,183,107, 61, 18,210,149,176,118,243, 65,204,189,219, 56,186,235,231,104, 85,113,254,162,163, 7,254,152, 60,247,135,101, 13, +186,116,239,131,253,123,119, 77, 36,132,172,162,101,156,122, 41, 58, 53, 96,211,186, 95,220, 4, 34, 49,244, 6, 22,122, 35, 45, +251,107, 48, 34, 47, 47, 31,122, 3, 11,137, 76, 1, 3, 75,160, 55,178,208, 27, 88,104,180, 6,249,136, 79, 62, 28, 5,224,250, +155,210,233, 25,254,201, 45, 48,196,181,108,125,217, 58, 17, 99,161,116,114,114,218, 2, 0, 98,177, 24, 98,177, 24, 44,203,226, + 94, 26, 25,231, 28, 54, 96, 26,104,249,155,157,101, 83,210,163,119,132,190,237,220,221,220,220,186,188,110,174,212,106, 53, 74, + 74, 74,112,249,230, 93,139,205,187, 79,117, 72, 76,206,168,195, 26,237, 53, 82,199, 6,237, 1,116,121,219,245,204,184,183,111, + 84,173,200,113,204,196,145,159,120, 47,251,117,207,141,199,199,230, 86, 26, 78,174,221,118,170,118,242,168,254,161, 63, 44,219, +240, 56,229,252,210,241, 85,221, 35,161, 80, 40,200,206,206,126,241,124,207, 89,241,123,199,231,153, 69,109, 22,125, 55, 93, 24, +253,172, 4,247, 18, 50, 48,168,109, 45,147,159,119,167,192, 30,190,238,158,110, 75,151,206, 29,139,184, 52, 21, 86,252,126, 3, +231, 15,111,137,210,169,139, 63,204,138, 57,144, 85,147, 50,228, 93, 13, 86,101,154,103,239,230,160, 68,109,128, 70,107,128,158, +165, 40, 82,234,145, 85,160, 69,145, 82,135, 18,149, 1,131, 62,168,133,127, 3,213, 50, 88, 70,131,222,213,217,217, 9, 44, 77, +169,136,112,150, 69, 61,194,251, 41,199, 15,235, 45,117, 14,238, 85,154,118,123,143,201,109,178, 20,246,117,155, 72,165,178,195, + 63,253,244, 19,250,117,105, 46,125,158,163, 47,185,251, 92,149, 89,170,133,193,222,174,174,104,222,252,239,205,190, 95,248,227, + 23,135, 14,176, 5, 0,126,124, 99,248, 57,172,255, 45, 30,121,169,141, 21, 33,160, 44,155,146,114,115,123, 40, 0,188, 75, 91, +171, 18,181, 30, 60,166,172,237, 12, 33,128, 82,109, 64,105,126, 70,238,203,230,234,122,170,227, 83, 30, 47, 91, 71, 41,173,180, + 10,130, 33, 64,145, 82, 15, 11,153, 0,150,102, 2, 88,200,255, 19,193,122,139,185,138,169, 76, 83,168,211, 37, 27, 13, 90, 53, + 53, 26,209, 57,204, 14,246,150, 34, 56, 89,137, 33, 22,241,161, 55, 0, 42, 45, 11,181,214,136,196, 44, 21,138, 85, 34,212,143, +236,235,157,230,116, 77,105,235, 17,182, 41, 39,241,230,240, 74,239,179,209,136,109,123,142,123,167,101,100,119,219,191,101,177, + 56,171, 72,135, 59,137, 37,200, 42,208, 0,196, 2, 83,191,153, 46,158, 49, 99,102,247,109,191,159, 72,106, 25,238,159, 84,221, +235, 90,154, 21,187,181,126,211, 15,127,238,220,185,187, 34,230,250, 17, 60,190,125,250,219,146,204,234,181,191,242,246,246, 54, +252,252,243,207,118,107,215,174,245,182,183,183,127,158,149,149,245,172,162, 58,202, 51, 32, 34,237,212,233,139, 54, 45,154, 54, +231,167,228,168, 97,163, 16,194,195, 65,142,168,171,103,181, 12, 33,199,222,164, 87, 94, 13,216,223,181,237, 20, 28,184,250,172, + 67, 76,174,228,220,208,207, 7, 37,157,184,240, 40,119,197,150, 19, 63,184,152,233,111, 75,216,236, 21,183, 66,189, 28,167,142, +254, 4, 11,150,111,197,249,168, 71, 89,165,140,211,119,233, 26,195,201, 89,125, 39,191, 57,234,203, 0,124, 30,129, 66, 42, 64, +105,105, 65,225,253, 83,171,234,190,167,103,119,208,137,125, 91,153,188, 98, 61,146,115,212, 36, 45,175, 24, 70,150,194, 82, 38, +132,129,165, 40,200,203, 33,219,182,110,193,205,155, 87, 25,240,152, 33, 0,102, 85, 17, 9, 1,143, 33, 48,147, 8,202, 34, 64, +210,178,191,122, 35, 11,159,218,110, 88, 54,103,140,185,173,189, 3,218,245, 28,110,122,132, 77,110,213, 96,243,234,121, 56,119, +245,118,228,217, 39, 59,194,236,131, 26, 44,119, 13,232,189,136,177,118, 81,107,116, 70, 20, 22,228, 67,164, 77, 70, 35,151,108, + 88,203,140, 72, 44,114,194,253,140,199,102, 85, 85,103,229,220,251,227,182, 93, 80,143,233,123, 14,158, 89,208,254,131, 72,220, + 79, 44,130, 84,196,135, 68,196,131, 68,196,131,128, 24,177,120,245, 26,125,126, 97,113,231,156,251,251,114,106,144, 63, 79, 1, +120,209,230,204,204,161,142,221,214,229,211, 55, 15,157,188,176,125,135, 30,159,146,251, 55,207,126, 13,224,180, 73,101, 38, 75, + 77, 90,199,178,166,189,219, 8, 33,140,189, 87,232,246,141,155,118,244, 13,240,113, 67,102,129, 30,105,249, 58, 92,140,142,199, +230,117,211, 11,242, 51,159, 14,128,174,164,132, 37,134,194,227,199, 14, 30,251,114,236,100, 4, 6, 53,240, 40, 74, 41, 50, 7, + 80,248,202, 49,121,100,237,192,207,135,247,117,112,112, 80,252, 39,130, 69, 81,215, 55, 0,157,186,126,132,227,251,247,226, 65, +204, 93,176,180,108, 56, 31,150,165, 40,200,207,205, 48,232,181,155,222,154, 62, 30,207,117,227,154, 69,246, 12, 67,160,211,179, +208, 26, 88, 76,157, 58, 93, 59,118,198,138,102,237,155,214,143,225,129, 45,122,158, 94, 96, 25,245, 40,163, 30, 17, 40,156, 6, +140,152, 34, 84,107,140, 40, 84,234,113,106,247,178,183, 87, 51,214,105, 16,225,233,223,236,243, 97,223,172, 17,139,121,140, 46, +176,174,219,179,150,141, 3,147,107, 57,219, 22,207, 95,182,173,209,149,232, 71,157,122,246,236, 41,233, 91,199,159, 56,219, 72, + 20, 35, 70,141,174,239,232,211,108, 96,198,227, 75, 91,222,250,242,227,139, 11,220, 92,221, 94, 84, 37,218, 7,117,191, 11,192, +253,181,205,146,178,238,239,171, 15, 0,246, 14,142,106, 34, 16, 23, 87,195,128, 80, 0,152,189,124, 79,167,148,236,146, 94, 21, +230,234,246,211, 66,136,133, 12,116,122,211,155,198, 25, 9, 29, 55,101,244,103,130,188, 82, 3,206,221,205, 70,204,173,179,212, +160, 43,250,148, 18,254, 96,187,160,238, 3, 9,224, 73,129, 4,134,224, 23, 45,131, 77, 5,119,246, 21, 86,191,166,167, 44, 61, +246, 1, 61,155, 16, 30, 58,241,248,194, 48,128,245, 51,232,245,246, 12,143,151,147,113,103, 79,149, 61, 40, 95, 62,163,210,204, + 56, 44,156, 63, 3,203,214,237, 69, 90,174, 26, 22,198,100,236, 95, 63, 15, 19, 23,108,135, 74, 99,196,191, 1,147, 13,150, 67, +189,110,141, 0,134,231,104,109, 6,239,218,110, 48,235, 61, 88,234, 26,210,183,148,199, 99,152, 77, 75,191,150,228,170,248,224, +243,120,165, 38, 23,190, 14,126,225, 10,133,226,200, 31,191,239, 69,157, 90,246,194,109, 23,243, 18,162,159,169, 94,132,116,139, +178,147, 68,158,230, 74,126,207, 30, 61,100,167,207,156, 29,247, 54,131,197, 35,140,235,178,197, 63,216, 43,164, 2, 16, 2, 20, +171, 12, 24, 59, 97,202, 59, 95, 24, 10,202,251,114,194, 76,144,114,115, 85, 92,152,135,239,150,109, 42,233,233,114,230, 82,133, +185, 58,241, 80,250,164, 71,143,214,133,137,137,137,249, 85, 22,140,212,152,210,107,208, 88, 33,195,148, 85, 27, 49,132,128,194, +152, 89, 19,115, 5, 0,249,249,207,138,164,142,245,123,108, 93, 50,122, 93, 45, 23, 23, 43,133, 76, 66,204,228, 98,226,239,235, + 37,105,220, 56, 66, 82,203, 43, 80,116,225, 65, 9,158,103,171,240, 44,173, 16, 34,219, 64, 65,223,150,109,177,117,217,148, 78, +166,156,255,153,171,247,187,172, 90, 52, 93,156, 81,160, 69,236,243, 18,100,228,171,145,158,175, 65, 70,158, 26,102, 82, 1, 34, +218,246, 20, 31, 61,185,187, 75,203,112,255,229, 53,185,190, 79,227,159,237, 77, 76, 77,255,180,126,195, 70,216,182,121, 99, 99, +226,234, 42,161, 41, 41,106, 83,247, 95,183,110, 93, 94, 88, 88,152,221,247,223,127, 95,234,235,235, 27,236,235,235, 91, 59, 46, + 46,238,156,183,183,119,215, 85,203,230,158, 31,251,205, 34,119, 30,209, 91, 52,105,218,140, 39, 17, 18, 92,189,112, 92,179,105, +221,154, 52, 93, 65,201,228, 74,141,176,204, 98, 94,102, 9,129,157,139, 75,140,153,200,248, 1,159, 41,136,203, 59, 58,122, 11, +128, 63,188, 58,142, 57,117,246,214,163,184,208,168, 68,251, 51, 81, 79,178,242,148,186,186,241, 71, 39, 84, 90,224,242, 8,129, +128,199, 64, 33,229,191,136, 88, 58, 52,232,253,132, 18, 98, 87, 17, 41, 37, 40,139,104,145,178,207,150,180,148,168, 93, 38, 52, +140, 38,148,165,192,163,148, 82,148,168,203, 66,240,174,182, 50,100,103,166, 96,213,242, 77,136,190,117, 19,237, 58,118,197,202, + 95,183, 97,232,192,222, 85, 94, 87,134, 65, 89, 4,235,165,232,149,153,148, 15,128,160,160, 84,143,223, 47, 37,195,171, 54, 3, + 82,141,218, 66,133,153, 20,133,197, 42, 48, 2, 51,196, 94,220, 34, 59,122,246,198,180, 89, 63,174,255,170,168, 36,227,121,252, +131,171,240,181,202, 69,109, 23, 29, 98, 50,204,113, 43,215, 19,190,222,117,192, 8,111,154,164,157, 19, 83,111,225,126,230,247, +206,161,193, 1, 17,238,246,150, 80,105,141,229, 81, 44, 30, 54,110,216,130,196,132,148,207,115, 98,246, 69,191,143, 66,178, 36, +243,105,182,196,193,231,139,123,215, 79, 63,235,241,241, 23,112,114,169,213,160, 58,205, 19, 76, 89,103, 52,193, 96, 17, 66, 24, +107,143,224,205,155,183,238,238, 91,187,150, 35, 78, 94, 79,192,141,184, 92,216,218,218,128, 39,115,132, 79,203,193,150,247,142, + 45,251, 72,149, 83,178, 89, 32,148, 13, 9,111,220, 20,148, 82, 60,122, 24,147, 87, 88,104,241,167,178, 89,153, 22,123, 27,128, +249,203,235,100,118,254, 13,204, 44,172,111,107,116, 70,164,166,166,224,242,149,115, 13,203,183, 51, 25,177,144,135, 19,209, 89, +208,233, 89,232, 12, 44,194, 67, 2,181, 2,145,180,249, 15,235, 14, 55,206,204,204,102,164,102,230,172,133,125, 29,161,181, 62, + 67,115,231,105,161, 80,167,103, 81,199,185,242,239,114,153,117,157,249, 19, 38,142,245,231, 9,165, 40, 46,213,104,211,211, 82, + 29,127,217,113,182,228,225,163, 7, 46,158, 30,181,204,231,205,157, 37, 44, 84, 1, 89,133, 26,228, 21,235, 72,159,143, 63,119, +222,178,126,229, 0, 0, 91,170,145,244,122,187,182,172,209, 91,153, 9, 73,177, 74, 79,179, 11, 53,198, 81, 95,140,173,247, 46, +121,167,194, 92,253,248,221, 55,194,232,103, 37,184,243,180, 16, 18, 33, 15, 34, 33, 3,173,137, 6,203, 46,160,183,220,206,206, +114, 64,120, 3, 31, 28,143,206, 6,143,199, 64, 89, 90,168,149,136,205,238,251,249,249, 48,193, 13,130, 16,217,172, 9,226,159, + 37,250, 30, 63,121,102,201,141,155,209,223,217, 5,245,152,156,125,127,239,202,234,164, 53, 57, 61, 87,150,105,112, 27,107,239, +104, 27,212,181, 91, 23,113, 45, 23, 7, 98,103,109, 9, 35, 17, 98,196,200, 47,237, 77,206,243,180, 44,122,249,253,220,105,208, +104,180,176,179, 20,129, 82, 96,195,242, 89,208,106,181,112,182, 17,163,176, 84,207, 25,172, 23, 55,184,126,143,166, 82,177,252, +196,202, 5,227,152,130, 82, 61, 36, 66, 30,234,212,169,141,209, 99,199,201,218, 52,176,131,138,152,227,247, 29,155,138, 12, 70, +253, 33, 83,244,100,142, 62,161, 10,185,249,241,205, 91,119,177,182, 54, 54,204,170, 19,217, 79,115,139, 13, 47,134, 56,136,187, +126,128,189,117,252, 23, 39, 10,114, 76, 34,145,120,107,181, 90,171,170,110,232,134, 19, 73,229,141,115,201,123,185, 48, 12,195, + 24,127, 89, 62, 23,182,230, 34,104,244, 44,230, 44,217, 82,220,217,238,216,153,151,205, 85, 72, 72, 72, 97,131, 6, 13, 10, 24, +166,234,225,196,158,223,216,214,228, 13, 5,102,141,204, 85, 5,170,140,187, 55, 1, 4,189,170, 25, 34,176,245,220, 61,177,223, +128,129,211, 28, 3, 63, 84, 36,164, 23, 66, 72,116, 8,243,119,194,185,227,127,176,201,207, 30,142, 48, 69, 59, 43,183,208,205, +214,214, 6,209, 79,139,145,154,171, 66, 70,185,185, 74,207,215,160, 88, 85,140, 6, 30,118, 40, 40, 44,113,171,177,129, 37,116, +223,241,227,199, 63,237,212,173, 47, 70,127, 53,187,227,186, 85,139,238, 74, 29,252, 7,170, 50, 31,222, 48,101,255,221,187,119, + 27, 61, 60, 60,158,102,103,103, 55,154, 52,105, 82, 81,157, 58,117, 28,231,206,157, 59,172, 78,157, 58,206,173, 91,181, 42,188, +113,182,241,230,177, 95,205,106, 53,117,204,186,218, 12,195,100, 82,150, 30, 72, 43,213,207,164,217, 15, 84,149,222,167,253,211, + 98, 73,192,236, 79, 63,104,110,119,192, 90,198, 4,138,169,182, 31, 9,152,189,139, 62,152,169,139, 63,186,188,184, 94,159,197, +163,211, 10,216,111,212,140,253,119, 85,153,171,178, 8, 22,129,214, 96,132, 66, 42,248, 79,222,164,112, 90,181, 98,177,204,206, + 66, 4, 1,143, 1,159, 71, 80,164,212, 35,167, 72,135,175, 38,127,101,234, 21,100, 13, 70, 10,149,214, 0,101,249,215, 96,113, + 81, 14,166,125, 53, 1, 29,187,244,192,144, 17, 19,144,175, 2,110, 61, 43,134, 78,175,175,242,161,224, 17, 2,165,198,128,207, +218,185, 35,175, 68,135, 82,149, 1, 90, 3, 11,153,136, 15, 62,159,129, 92,194,135,185, 76, 0, 66,168,208,201,201,105, 24, 0, + 8, 4, 2,245,243,231,207,183, 86,242, 5, 15, 79, 55, 7,168,244, 12, 26,245, 93,132,182, 17,117,113,231,212,122,254,249,107, +247,106,127, 53,107, 9, 70,245,143,192,158, 88, 47, 88,219,187,195, 76, 46,133,158, 50, 0, 76, 27, 2,132,210,153,172,147, 95, +207,254,107,126,221,240,104,206,140,169,146,130, 82, 2,177,144,135, 51,167, 79,225,234,245, 91,203,178, 99,246,109,125,159, 5, +165,128, 50, 14,230,230,230,144,136,120,208,234, 52, 90,147, 35, 15, 44, 5, 40,252,237,235,117,255,163,252,222,251, 27, 89,188, + 97, 29,173,202, 92, 17, 11,231,160,141,107,214,109, 27,224,236,104,143,189,167,239, 98,227,175, 43, 80, 59,184, 51, 46, 29,222, + 8, 11,207,198,144,215,106, 6,145, 98,247, 48,134,199,175,247,229,184,175,123,134,132, 69,224,242,197, 51,200,202, 72, 95, 67, +105,172, 73,109,208,120, 2, 50,166,245, 7, 93,160,214, 26,209,188, 77,103, 28, 59,184,119, 52,202, 59, 79,152,202,235, 38,156, +101, 97,248,114, 72, 63, 65, 86,129, 86,144, 93,164, 69, 74,182, 18, 9,153, 74,236,223,185,158,154,250,214,102,248,188,176, 22, +245, 93, 5,195, 22,158, 73,118,115,117,210, 8, 52, 42,105, 92,252, 83,191, 33,159, 14, 16,212,246,246, 99,178, 10, 53,200, 46, +212, 32,167, 80,131, 18,181, 1,222, 78,181, 24,141,129, 31, 81,221,251,108,103, 41, 17,172, 60,248, 12,230,114, 1,154,248,217, +212,184, 17, 54,203,178,175,152,171,219,207, 74,113,247, 89, 33,196, 66, 30,196, 66, 6, 98, 33, 15, 6, 35, 53,241, 93,100,232, + 55,124,112, 95,169, 86, 79,145, 91,168, 5,159, 71,224,104,107, 35,118,115,170,139, 13,139,190, 4, 0, 12,157,178, 10, 67, 62, +251, 4,190,117,189, 81, 88, 88, 44, 29, 50,114,236, 98,188,161,221,221,219,210,186,109,255,133,128, 91,247,147, 38,126, 58,120, +144,160, 79,151,230,204,237,167, 69, 72,207,211,224,105,188, 18, 58,125,245, 70,163, 49, 24, 89, 80, 80,108,218,117, 8, 82, 17, + 31,217,133, 58, 80, 74, 49,111,197,111, 80, 72, 5, 72,207, 47,171,214,231, 12, 86,133,185, 18, 73, 78,108, 89,241,181,244, 76, + 28,176,236,228, 45,124, 24,238, 4, 33,159,129,216,204, 17,119,158,229,227,212,233,253,197,151,174, 94, 87,131,209, 87,217, 45, + 74,230,228,219, 80, 46, 53, 63,181,242,151,205, 6, 91,123,123,108,189,152,151,146, 95,106,208,255,167,122, 74, 79,110, 29,255, +165,182,129,213,119, 80,101, 60,174,242,115,150,165, 84,184, 96,245,126, 0, 20, 44,203,130,178, 44,120, 66,177,220,189,241, 39, +153,101,122,172,132,207, 99,212, 47, 63,249,148, 53,166, 36, 93,223, 94,105,213, 33, 1, 96, 33, 19, 96,215,249, 84, 20,230,165, +229,116,182, 59,246,162, 90,240, 88,140,248, 73, 72, 72,112, 97, 88, 88, 88,129, 84, 42, 5,143,199,171,246,133,127, 87,115,245, +246, 23, 79,148, 30,192,247,206,126, 45,187,118,148, 5,134,139, 24, 62, 66,124,157,112,238,196, 94,246,234,209,245, 61,148,153, +113,135, 77, 12,111,163, 68,165, 71, 90,174, 26,169,185,106,100,228,171,145,145,167, 65, 70,190, 26,132, 16,168,181,239, 54,124, +141, 50, 51,238,160,153, 75,224, 26,141, 14, 35, 90,180,235,129,137,179, 86,122,111, 93,243,195, 69,185,189, 79, 88,105,214,227, +123,166,104, 36, 38, 38,106, 28, 28, 28,162, 10, 10, 10,218, 45, 89,178,164,196,223,223, 95,100,102,102,150, 11, 64,250, 36, 46, + 78,120,230,200,238,132,236,180,180,225, 58,157,238,166,169,233,242,136, 28, 44,246, 51,207, 27, 86, 75,222,164,125, 29, 71, 25, +106,201,139,219,251,153,221,249,209,190,205,184,249, 89,167,151,102,165,107, 12, 39,179, 85,188,224,212, 18,129, 73,109, 1, 13, + 58,109,210,199,195,167,129, 71, 8,116, 26,109, 82, 69,230,178,183, 16, 97,214,182, 88,152, 73, 4, 80, 72,249, 48,147, 10,208, + 44,192, 26,213,248, 60,160,122, 35, 11,165,198, 8,149,198, 0,181,214, 0, 91, 55, 43,252,186,117, 55,158,103,169,176,255,102, + 14, 30, 37, 21,195,199, 85, 14, 74,171,142, 59,177,212, 80,218,103,216, 55, 10, 30,195,128, 71,192,248,121,123, 32,175, 68, 11, + 33,159,129, 72, 36,130, 92,204,135,185, 84, 0, 1, 95,128, 27,119,239, 66,163,209, 32, 60, 60, 92, 82,185, 5, 44,139, 98,249, +212,118,134, 78,111,192,145, 11, 15,240,221,248,158,248,160, 69, 40,190,226,137, 16,171,105, 8,133,181, 2, 44,195, 64,103, 96, +161,213, 25, 1, 48,111,141,182,213,170, 85,171,181, 92, 46,151, 43,149,202,226,164,164,164,115,233,177,127, 60,183, 15,236, 62, +236,216,137, 51, 91, 59,119,252, 0,209,119, 99,176,103,239,129,139, 57, 54,133,147, 42,246, 9, 10, 10,106,108,107,107,107,150, +155,155, 91,116,239,222,189, 27, 53,201,171,132, 16, 34,119,240, 27, 23,209, 44, 18, 37, 5, 89,200, 76, 78, 56,100,234,190,254, +238, 10, 76, 24, 63,218,199,183,174,175,143,177,188, 39, 85, 64, 45, 5, 70,140, 28,229,227,229, 83,215,167,162,163,135,127,173, +202,199,187,148, 59,248,142,250,110,241,234,129,181,220,220,112,244,114, 44, 22,124, 51, 34, 90, 46, 83,120,186, 58, 88, 89, 10, + 3, 67,113,251,246, 21,216, 67, 4,115, 7, 31,215,126, 93,135,187,182,239,216, 21,247,238,220,194,210,133,115,175,150,242,164, +243, 77, 73,171,153, 67, 29,187,224,176, 22, 31, 43,172, 29, 80, 80, 88, 12,133,149, 61,252,235,135,125,108,230, 80,103, 74, 73, +230,211,236,154, 62,235, 44,165,208,232, 40,242, 75,116, 72,206, 86, 33, 49,163,204, 96,177,108, 53,218,252, 80, 16, 51, 9,159, +111,173,127, 82,235,222,169, 51,212,221,205,129, 44,156,251, 21, 79,135,178,198,226,217,133, 26,100, 23,105,145, 93,168, 69,137, + 90, 15,107, 57, 31, 44,101,171,253,181,157, 95,162,131,162,188,157,172,145,173,185, 9,152,181,100, 71,147,148,108,101,155, 31, +231,125, 35,188,147,240,146,185, 18,148, 69,175,196, 66, 30,140,172,105, 17, 44, 30,159, 25,253, 97,155, 70, 72,206, 81,149,245, + 66,102, 8,188, 3, 27,194, 86,202,162, 77,223,169, 0,128, 46,157,202,134, 33,121,150, 94,138,131,215,210, 1, 64,104,106, 90, +115,115,139,197,123, 79, 70,143,221,241,235,143, 34, 13, 43,192,218,163, 73, 80,106, 12,144, 8,121, 16, 11,121,144, 10,171,247, +126, 51, 24,203, 58, 75, 60,207,209, 67,169, 86,163, 72,165, 7, 5,112,227, 73, 9, 84, 90, 3, 10, 75,245,104,236,103,197, 25, +172, 10,115,181,121,249,215,210,211,113, 20,103,239,228,162, 87,115, 87,228,102,165,224,215, 85,203, 88, 74, 1,177, 68,148, 97, + 52,176, 71, 85,172, 97,114,193,157,131,133,149, 22, 18,118, 1,245,165, 50,217,153, 31,150,174,213,217, 59,184,176,127, 92, 43, +200, 42, 84, 26, 95,137, 21, 26, 53, 26,134,178, 84,104,138,185, 42,143, 52,233,102,142,238, 1,150, 82,204, 90,186, 27,243, 39, +245,133,153,148, 47, 35,132,200, 74,213, 6,140,159,189, 14, 63,125,251,185, 66, 38,230,131, 16, 64,173, 53, 98,196,104,211,162, + 4, 74,141, 17,165, 5, 25,185,245, 74, 22,191,102,174, 66, 10,195,195,195, 11,172,172,172, 80, 19,131,245, 38,115,229,232,232, +232, 44,147,201,172,125,124,202,218,186,242,120, 60, 24,141,198,210,199,143, 31,215,104,208,183,162,130,236,125,233, 9,247,194, +155, 68,126,136,243, 39,246,177, 87,143,172,235, 81,157, 46,230,150, 22,230,201,209, 15,146,252, 9,204,202, 34, 88,229,230, 74, +171,103,225,238, 32, 67, 74,242,115, 88, 90,152, 37,155,170, 39,115,244,233,192, 80,222,112,150,224, 87,101, 70,236, 17, 0, 40, + 73,141, 25, 41,179,175,123, 47, 38,230,206,210,206,253, 71,139,218,245, 26, 41, 92,179,224,139,169, 0,250,153,170,155,153,153, +169,180,179,179,187,234,228,228,212,121,246,236,217, 26, 0, 98,141, 70,195, 12, 30, 60, 88,150,148,148, 52,158, 82,106, 82, 26, +155,127,182,199,150,136,139, 59,122,249,132,245,119, 87, 20,127,208,170,121, 4, 34, 2,221,144,220, 60, 2, 0,198, 36,149,152, +249, 54, 27,185,126, 87,109, 59,215, 35,107, 54, 30,156, 63,180,111,219,241,206, 93,102, 47, 78, 59, 56,179,210,136,216,163, 11, +235,219,191,201,190,243,121, 12, 20, 82, 1,204,164,124, 40,164, 2, 40, 36, 2,232, 13,180, 58, 85,112, 84,111, 96,203, 34, 88, + 90, 3, 74, 84, 6,156,185,157,137,140, 66, 45, 10,138,117, 80,233,140,160,160,208,233,217,138, 81, 69, 42, 55,171, 87, 54, 89, + 86,252,219, 53,164, 95,225,178, 57,163,205,127,191,148,242,162,135,158,133, 76, 4,133, 76, 0,128,226,194,133, 11,176,177,169, +122, 88, 44,150,101,177,231,216, 13, 44,222,116, 6,199, 54, 76,134, 68,200, 67,253,110,179,241,105,247,112,176, 44, 69,252,163, +152, 76,159,128, 6, 14, 12, 35, 5, 67, 8, 52,122, 22, 0,125,235,245,212,106,181, 54,207,159, 63, 47,242,246,246,118,116,113, +113,233,197,227,241,168, 24,208,236,219,153,167, 60,125,104,187,172, 84,165, 49,202, 12,133, 27,188,211, 85, 31,250,248,248,128, + 16, 66,109,109,109,133,103,206,156, 41,169, 87,175,158, 93, 77,158, 35, 66, 8, 35,181,175,187,108,200,200,113,189,188,234,212, +193,238,237, 27, 64, 41,249,221,212,253,183, 29,188,138,197, 75, 94,237, 49, 56, 98,228, 40,159, 53,171, 87,189,178,110,224,231, +195,124, 42, 51,120,174, 65,173, 39,251,249, 5,224,106, 76, 10, 22, 78, 31, 25,173,206,122,214, 95,107,102, 51, 92, 87,146, 62, + 33,184, 97, 40, 28,109,204,145,150,167, 65,215, 1,221,209,180, 89,115,220,187,115, 11,115,191,253,234, 42,148,218,118, 85, 69, +109,255, 99,132, 4, 35, 90,181,239, 46, 80,105,116, 88,190,112, 6,134, 79,250, 14,141, 91,119, 17,220,191,125,109, 4,128, 57, +166,158,179, 70,103, 68,171,122,182,101,166, 89,207,226,192, 51, 30,255, 77, 57,144,207, 35, 76,112, 29, 75,168,180, 6, 20, 41, +245, 85, 68,176, 72, 70, 65,113,169,199,207,243,199,241, 74,213, 6,100, 23,106,145, 85,168, 65, 78,193,127,140, 85, 78,161, 6, +217,133, 90, 8,248, 4,113, 9,105,224,241, 72,181,219,223,229,151,232,209,168,174, 85,217, 51, 90,195,218,144, 28,131, 93,199, + 59,113,105,109, 22,206,157, 38,188,147, 88,138,187,207,138,202, 35, 87, 60,136, 5, 12, 68,229,255, 54,154,224,175,236, 3,186, + 54, 25,216,175, 91,160,185, 92,130,180,184, 98,240,121,101, 67,189, 88,216,187,193, 66,172,198,151, 35,135,193,214,198, 18,207, +115, 52, 88,182, 55, 14,119, 31, 60, 1,171,170,222,105,255,188,253, 88,143, 65,159,244, 21,243,132, 98,108, 57,148, 0,177,144, + 7, 62,213, 34,230,218, 5, 77,102, 74,130,174,184,168, 64,206,231, 11, 76, 18, 37, 0,173,136,204,205,159, 53, 21, 59, 55,173, +194,241,168,172, 23,205,231, 47,253,254, 19,198, 77,155,135,156, 34, 45, 0,242,143, 15, 99,241, 43, 51, 87, 18,145,232,196,166, +101,211,164,167,227,128,115,119,203,204,149,170, 36, 7, 91,214,175, 45,161, 96,219,102,222,223,111,242, 23,161,220,190,110,144, + 88, 46, 63, 63,125,222, 50,141,131,139,135,225,200,237,162,220, 98,181,241, 79, 97, 16,161, 76,110,148, 91,216,169, 45,221, 27, + 46, 22,168,180, 51,178,179, 31,148, 86, 21,105, 98, 41,197,161,235, 25,160,180,236,147,232,183, 11,169,224, 49,101,213,133, 70, +182,172,250,228,228,237, 44,240, 25, 98,114,151,115, 66,128,223, 78,220,206, 9,122,131,185, 10, 11, 11, 43, 48, 55, 55,135,165, +165, 37,204,204,204,170, 91, 96,191, 49,114, 37,147,201,172,143, 31, 63, 46, 49, 55, 55, 7,143,199,131, 70,163,193, 7, 31,124, + 80,163,155, 42,119,240,237,215,184, 77,207, 5, 77, 91,125,136,179,199,255, 96,175, 30,217,216, 83,153, 85,141,241,123, 0,116, +108, 81,255,224, 15, 63,173,168,253,213,212,233, 98,133,132,143,135, 37, 90, 48,132,192,221, 65, 6, 27, 51, 30,174,158, 57,164, +238,245, 65,189,131,166,234,213,114,245,216,178,104,249, 26,155,197,223,207,110,103,101, 85,219, 33, 63,255, 89, 17, 0, 40,179, +226,214,152, 57,250, 62,114,173,117,226,124,131,150, 61,224,224,226,221,169,186,231,155,157,157,157, 25, 24, 24,248, 48, 32, 32, + 32,180, 87,175, 94,116,193,130, 5, 86, 41, 41, 41,187, 77, 53, 87,192,255,177,119,214,225, 81, 92,251, 27,127,207,250,102,227, +196, 29, 72, 8, 9, 17,220, 10, 65,131, 59,148, 2, 69, 74,105,145,150, 10, 82,161,180, 72,169, 64, 75,129, 42,180,208,226,238, +165,184,187, 75,132, 4,136,187,103, 37,155,213,217, 57,191, 63, 32,185,129, 27,217, 0,253,221,123,233,249, 60,207, 60,217, 36, +179,239,156, 51,115,102,206, 59,223, 99, 64,207, 94,225, 51,236,164,150, 14, 13, 20,130,240, 64, 79, 5, 58,134, 63,108,253, 28, + 53,160, 51,252,252,253,145,156, 87,222,178,164,156, 23,151, 25,133,129, 63,255,122,231, 90, 35, 87,225,155,156,206, 24, 15, 96, + 95,189, 43,109,252,171,227,123, 69,244,202,222, 70, 12,254, 97,249,168,151,193, 50,152, 44,208, 25, 44,208, 25, 57,104,141, 22, +148, 27, 45,224,233,195,123,130, 16, 2, 19,199, 87, 28,178, 94, 9,116,104,224,138,192, 70, 15, 71,189,218,219, 60,156,178,225, + 97, 19, 33,224,226,226, 2,119,247,186, 27,119, 40,165, 48,154, 30,222,226, 70, 51, 95,217, 68,106, 52,113,160,148,226,222,189, +196, 15,211, 82, 82,134, 52, 9,110,210, 37,172,121,139, 6, 10,153, 0, 0,106, 52, 3,229,229,229, 22,123,123,123,247, 6, 13, + 26, 8,178,179,179, 43,251, 61, 54,105,217,157,219,179,123, 23,134, 15, 31, 86,118,247,234,237,202, 17, 85, 58,157,142,116,234, +212,201,193,207,207, 79, 96, 48, 24,212,245,142, 90,185, 53, 29,234, 23,250,210,151,227, 39, 78,105,218, 61,186, 47, 78,157, 56, +138,125,187,183,172,215, 22, 36, 30,181, 86, 39, 36, 36,244,223, 70, 17, 6, 5, 55,253,183, 81,132, 13, 27, 7,215,104,176, 28, + 29,155, 59, 52,111,219,205, 47,173,200,132, 67,135, 14, 66,171,202,251,204,104, 44, 43,135,152,174, 57,176,229,231, 73,111,188, +191,208,161, 91,215, 40, 56, 59, 40, 32, 18, 9,113,227,218, 37, 44,254,252,147, 75, 40, 55,246,174,235,249, 89,153,223,176, 48, + 73, 19,255,134,239,249, 7, 69,224,198,229,115, 72,186, 23, 27,119,251,218,165,240, 38,145, 29,224,230, 29,240, 30, 9, 11, 91, + 76,227,227,235, 92,169,130, 90, 44, 89, 19, 38,207,124,116,253, 31,254,173, 99,203,198, 82,242,228, 13, 0,192,204,153, 44, 27, + 86, 45, 46,168, 58,138,176, 38, 93,189, 70,185,243,236,229, 59,179, 7,245,142, 18, 20,169,141, 15, 35, 86, 42,227,163,205,128, +162,138,207,106, 3,130,189,237,144, 20,123,151, 55,107, 85,187,234,119,103,210,252,105,111,189, 99,243, 48,237, 60, 40, 79,107, + 53,252, 53,166,213, 34,121,117,213,231, 31,147, 59,105, 90,220, 73, 85, 63,108, 18, 20, 11, 31, 26, 43,177,160,210,108, 89,213, + 74, 38, 16,124, 51,126,100, 31, 20,169, 77,224,121, 64, 36, 20, 60,218, 36,200,208, 16,100,106,202, 81, 84, 90,136,148,180,116, + 40,243,146, 32, 16, 8,224,234,221, 20,229, 25,214,165, 85, 99,177,107,106,182, 32,104,228,128, 40,225,158, 75,121, 80,200, 68, + 80, 23,103,226,194,145,109, 58,158,179,172, 50,154,141, 91,221,169, 52, 54, 62,102,135,201,202, 71, 71,161, 90,107,240,144,137, +133,216,177,238, 39,140,124,109, 90, 69, 4, 18, 0,240,225,220, 69,128,128,160, 84,169, 5, 64,158, 58, 42,250, 63,111,176,196, + 2,225,177,181, 43, 62,145,199, 23,202,113, 53, 49, 23, 47, 71,249,162, 92, 83,132, 95,127,250,190, 76,111, 54,244, 43,140,217, + 87,191,112,187, 64,208,103,212,235,179,227, 2,155,134, 25, 78,197,150,165, 42,181,230, 26,251, 49,116,124,249,211,184,235,127, +253,216, 95,101, 78,126,203,206, 59,220,194,115,220, 55,229, 5,137, 11,171,127, 75,166,210,133,223,239,168,108, 30,252,104,241, +134,135,159, 45, 22, 88, 40, 15,202, 3,211, 63, 91, 9,142,183,128,183, 88,192, 91, 40,136,217,162,168, 51, 92, 46,151, 28,141, + 40, 91,230, 88,157,185,114,114,114,130,139,139, 11, 92, 92, 92, 80, 97,136,158,181, 89, 48, 56, 56, 24,118,118,118, 56,119,238, + 28,108,108,108, 96,107,251,116, 19,228,219,121,132,190,210,190,199,176, 77,221, 7,189, 46, 56,190,231, 87,203,149,211, 7, 94, +214, 21, 36, 88,109, 2, 44, 22, 11, 49,155,205,232,211,173,117,250,173,196,140,195,159, 47, 92,208,183,109,143, 17,178,151, 66, +220,161, 51,114,200,206,202,194,165,147,251,244, 77,252, 93,142,116,109,223, 44,221,108, 54,195, 98,177,212, 89,129,235, 13,198, + 98,161,216,198,101,212,232, 87,101,215,174, 94,221,100,235, 17,178, 69, 32,228,111, 83,139,176, 57, 64, 95,105,222,188, 25, 76, +102, 30,229,229,154,146,167,201,119,124,124,252,213,229,203,151, 55, 21,139,197,126,219,183,111, 47, 42, 45, 45,173,215,114, 65, + 71,207, 38,174, 16,145,210,251, 82,222, 52, 38,192, 94,211, 43,163,115, 71,140, 30,216, 25, 91,255, 58,143,211,231, 46, 33,189, +204,238, 86, 25, 39,218,155,153,158, 99, 8,111,160,222, 53,184, 99, 67,225,142,117,165,187,220,187,207,121,133, 82,217,209,194, +211,243,181,214, 87,222,128, 70,103,134,131,226,225,124, 77, 21,145, 44, 33, 33, 86, 59, 33, 2,164,156,187,116, 35,162, 77,112, + 24,110,166,168, 80,160, 52, 64,103,224,192,243, 20, 60, 40, 92,236,165,144, 75, 4,200, 72, 75, 1, 79, 77,169,245,171,103, 80, +216,111,196, 20,209,195,227,240, 34,177, 88, 4,250,168, 94,180,145, 75,203,220,221,221,173,138, 96,153, 56, 14,195,251,182, 71, +135,182,205, 49,100,202, 82, 0,192,137,245, 31,195,217, 78,140,157, 59,119, 34,227,252,242,141,129, 47, 77, 59, 26, 27, 19, 55, + 34,238,230,197, 87,251,181,182,105,233, 41,202,169,177,105,163,172,172,108, 23, 33, 68, 42,145, 72,250,118,233,210,165,193,174, + 93,187,148,174,174,174,188, 84, 34, 41, 28, 60,104, 32, 47,150, 72, 42,203,206,133, 11, 23,196, 83,166, 76,177, 47, 45, 45,205, +200,207,207,191, 68, 41, 53,215,254, 2, 24, 26, 13, 1,182,128, 16,185,157,141, 34,189, 99,244,104,239,182, 29,218, 59, 14, 29, + 62, 18, 50,169, 12,199,142, 30,198, 15,203, 23,111, 47,203,189,251,122,125, 78,229,243, 24, 69,168, 82, 57,106,239,199,223, 46, + 77, 45, 48, 58,139,157,130, 33,150,217, 79, 33,142,222,223, 11,101,118,243,221, 90, 12,117,216,185,255, 32, 98, 98, 99,209,192, +198,140,228,164,251,229,177,183,110,254, 82, 78,196, 11,105, 97,124,185,213, 17,230, 98,203,136,142,227,250, 58, 27, 76, 22,156, + 61,249,151,158,231,248,190,151,206, 28, 76,242,109,218, 86, 30,209,182,167,115,209,190, 53,195, 1,108,173, 75, 39,245,202,198, +127,235,122, 17,216,254,149,156,131, 71,207,216,121, 5, 52, 17, 18, 8,161,215,149,163, 48, 61,134,211,171,242,202,243, 99,246, +122, 91,147,190,116, 46,251,179,207,190, 94,249, 86,155, 22,225,182,148, 74, 30,139, 88, 85, 24,171, 34,181, 17,174,246, 82, 24, +180,165, 72,186,115, 78, 95, 40,206,255,164,246,103,157, 89, 81, 92, 92, 34,173,248,221,166,204,169,161,202, 81, 37,171, 52,129, + 66,192, 81,229,100,248, 87, 83, 90,137,212, 98, 49, 43,172,185, 61, 29,237,228,136, 73,205,173,236,208, 46, 19, 63,236,123, 37, + 21, 11, 43,251, 97, 89,121,159,183, 22, 73,237,144, 93,172, 7, 1, 5,111,225,192,153,141,208,168,213,200,206,201, 67,126, 94, + 62, 52, 26, 37, 20,118,206,136,104,217, 14,246,118,182, 72,184,113, 26, 0,177,234,229, 87,207, 75,130,219,182,105, 35,142, 75, + 47,131,201,204, 67, 12, 19,206, 31,218,170, 55,155,141,131,242, 99,246,158,172,239,115,152,227,233,241,216,196,244,112, 95, 55, + 47,114, 43, 73,133,141,171,127,132,241, 81, 36,211,108,182, 32, 54, 67,139,220,146,114,100,101,166, 83,240,150,227,120,193,169, +209, 96,113, 28, 39,247, 15,104,132,209, 83,198,226,151, 95, 86,226, 94,114, 6,126,251,249,145,185,186,179,231,130,149,134, 34, +186, 98,174, 12,109, 94,194, 55,175,255,146,154,181,255,102,137, 64,103,172,125,253, 41,185, 91, 0,162, 94,255,238,136, 78, 83, + 34,181, 24,202, 69,127,110,124,125, 75,117,154, 15,125, 27, 49,126, 57,107, 20,236,108, 68, 32,132,160,162, 89,240,231, 69,147, +161,144, 9, 65, 8,129,206,192, 97,236,140,101,216,184,108, 38, 40,128, 55,222,154, 85, 94, 83, 58,171, 24, 33, 50,177,111,227, +193, 95,252, 30,191,239,124,154, 75,242,128, 1, 93, 85,173, 91,183, 86,218,216,216,192,198,198, 6, 14, 14, 14,112,118,118,134, +147,147, 83,157,121,127,244,187, 71, 93,125,174, 4, 2, 1,108,109,109, 97,103,103, 7, 91, 91,219,127, 51,110, 79,106,254,155, +185,242,108, 58,178, 93,247, 97, 91,122, 12,158, 36, 56,190,231, 55,254,250,233, 63, 71,234, 10, 18,247, 90,123,141, 30, 53,235, +220, 30, 62,124,120,228,148, 41, 83, 36,159,188, 53,252,200,145,211, 55,238,237, 62,182,107, 80,137, 82,227, 71, 41,133,147,163, + 93,230,203,189, 34,255,140,106, 27,146,126,226,196, 9,126,203,150, 45, 6, 66, 72, 76, 93,233, 44, 42, 42, 88,123,226,248,201, + 37, 81, 93,187, 97,245,186, 45, 3,226,226,239, 14, 72, 74,186, 15,191,128, 64, 52,106, 28,140,114,226,140,147,103,206, 65, 83, +146,183,214,154,116, 86, 37, 50, 50,210,167, 69,139, 22,190, 74,165, 82, 63,111,222,188, 16, 74,233,222,136,136,136, 54,173, 91, +183,206,187,121,243,102, 86, 77,195,254,171,106, 94, 92, 57,180, 16,192,250,134,221, 38,110,207, 54, 41,223, 3,176,216, 63,192, + 31,167,207, 93,194,165,243, 87, 86, 22, 41,252, 23,190, 62,118,226,228,134,131,133,111, 12,238,216, 80,232,238,172,192,230,223, +190, 19,238,191,148,182, 44,173,216,178, 6,192, 34,107,174, 81,229,195, 90, 99, 66,167,102, 13, 96,182, 80,240,244,161,233,178, +151,139,171,109, 34,172, 78, 83,100,148,189, 62,117,202,148,164,136,230, 45,223, 31, 59,113,170,164,101,160, 31,174, 62, 80, 2, +132,160,129,167, 45,114,115,115,113,118,231,111, 92,105,118,194, 74,161,144,255,188, 62,231, 51,235,198,214, 38, 21,159,189,188, +188, 38,223,138,141,197,233,211,167, 81, 97,172,220,220,220,170, 53, 88, 79,106,150,150,106, 46, 44, 90,186,186,211,155,227,134, + 96, 96,183,112,156,185,150, 4,227,163,249,150, 42,134,132,167, 92, 90, 37,125,111, 84,160,241,173,225, 77,213, 58,179, 52,237, +179, 84,213,217,170,147,200, 62,169, 73, 41, 53, 18, 66,246, 39, 38, 38,118,110,209,162, 69,195,131, 7, 15,150,196, 93, 57,242, +216, 68,119,179,102,205,178,251,229,151, 95, 20,148,210, 11, 6,131, 33,217,170,188, 11,176,249,198,245,235, 46, 38, 51,143,115, + 87,110, 55,235,217,169, 37,120, 10, 92,187,118, 13,107,126, 95,163,143,185,115,107,169, 54,223,243,243,154, 38,183,173,233,124, + 90,158, 97, 20, 97,133, 38,165,167, 57, 59,143,208,149, 23,206,157,153, 43,243,110,131,208,254,159, 12,206,190,189,127,176,103, + 88, 31,184, 6,190,132,156, 59,251,113,225,200,166,131, 60,199,125, 44,231, 5,233,218,194, 4,173,181,247,123, 5, 50, 27,197, + 59, 97,173,187, 34, 35, 61, 13,169,247, 99,215,235,138,239,231,216,121,134,174,207,201, 74,159,218, 56,188, 19,206, 31,217,250, +110, 77, 6,171,174, 50,239, 46,215,172, 60,117,254,226,232,236, 29,251, 61, 52,101, 58, 27,145, 72, 80, 46, 19,145,124, 73,121, +210, 54,107,211, 73,227,227, 77,238, 65, 47, 13, 31, 51,229,211,191,150,125, 61, 87,236,225, 36, 67, 94,169, 30,106,157, 9,154, +114, 19, 4,132,160,137,183, 45,116, 90, 53, 46, 29,220, 96,182,232,139, 71,209, 7,143, 71,220,170,106,186,133, 15,249,130, 16, + 76,255,244,211, 57, 16, 74, 29,188, 27,247,252,196, 36,104,236, 9,103, 60, 49,153,121, 3,160,113,207, 79, 96,208,228, 15,250, +244,211, 57, 33,148,210,158,110,225, 67, 52, 21,107, 17,214,148,247, 98,141, 9,175,118,247,131,137,123, 56,127, 24,199, 3, 22, +254,225, 11, 63,165, 0,173,165,221,190,170, 38, 5, 36,219,254,186,128,156,124, 37,116, 70, 51, 12, 70, 14, 38,179, 5, 2,161, + 16, 78,206, 78, 8,110,212, 10, 78, 78,142, 40, 40, 42,194,181, 75,231,113, 57,241, 86, 10, 5,190, 40,106,160,218,100,205, 53, + 34, 34,219, 38, 30,238,174, 36, 95,109,132,141, 84,136,203, 55, 78,155, 41,176,214, 26,115, 85,157,166,170, 92,185,236,227, 69, +223,143,249,229,187,249,158,145,141, 29,144, 85,164, 67, 86,161, 30, 26,253,195,247, 27,206,194,195,168, 83, 33,241,218,161, 60, + 14,229,203,254,185, 17, 44,177,216,112,237, 78,162,236,227,133,223,226,238,131, 20,172, 89,249,163,214, 96, 54, 89,109,174,170, +227,143,183, 26,109,173,223, 55, 30,205, 91,250,121, 90, 29, 47,220, 79, 52, 11, 82, 30, 60,165,248,243, 74, 94,101,179, 32,255, +168, 71,229,205, 36,101, 93,133, 70,252,237, 59, 45, 63,172, 48, 66, 63,236,201,190, 44,147, 21,241, 25, 25, 25,165,155, 54,109, +170, 52, 61, 66,161, 16, 21,163, 7,141, 70, 99,157,163,138,156, 29,164,225,227,250, 53, 28, 85,147,185, 18, 10,133,224,121, 30, + 14, 14, 14,176,177,177,169,119,211,163,173,123, 72,175,118, 61,134,109,237, 49,228, 13,193,137,189,171,249,235,167,247,191, 92, + 86,144,184,167,190,215,168,180,180, 52,142, 16,114,127,233,210,165, 45,215,172, 89,211,120,246,236,217,201,171,191,158,250,195, +195, 55,184,135,203, 34,222,188,121,147, 78,155, 54,205,160,215,235, 83, 74, 75, 75,111, 88,179,200,117,121,126,226,210, 63,126, + 89, 18,146,153,157,251, 90, 96, 68, 59,184, 53,110, 7,207, 38,237, 81,170, 49,225,234,131, 28, 36,223, 61,129,248, 11, 59,183, +233, 10, 61,190,170, 79,122, 91,182,108,233, 47, 22,139, 7, 1, 8,177,177,177,105, 72, 8,145,138,197,226, 87, 8, 33,247, 9, + 33,119, 67, 66, 66, 78,160,134,229,139,170, 35,237,244, 90, 67,195,110, 19,191, 79,215,216,119, 79,206, 43,111,149,174,177,191, + 89, 46,115,156, 89,112, 98,133,193,163,247,210,101,212, 84, 20,183, 99,157,122,215,230,223,190, 19,142,157, 60,203, 18,171,114, +126, 79,100, 35, 61,246,245,107,214,143,230, 22, 16,146, 59,123,246, 7,255,154,166,225, 81,228,234,209,148, 13, 57,214,104, 60, + 90, 79,241, 35, 27,239,240,159, 98,223,155,178,168,121,219, 78,227,186,244, 27, 37,224, 36,118, 56,178,103, 21, 77,185,115,114, +135,136, 90,230,150, 23, 36,165, 60,235, 67,194,104, 52,214,105,174,170,109,186,117, 81,117,251,235,232,233,215, 14, 28, 62,243, +117,191, 94,157, 93,126,254,236, 21,124,251,235, 94,216,218,200, 64,121, 11, 70,245,240,127,249,238,150, 62,131,252, 60,228, 62, +187, 78,101,157,157,190, 60,246,163,242,114,211,189,186,214,206,123,100,152,207,217,219,219, 23,118,238,220,185,131, 76, 38, 35, + 69, 69, 69, 34,119,119,119,206,209,209,209,152,149,149, 85,110, 48, 24,118, 81, 74,181,245,201,167,201,204, 35, 53, 95,143,125, +187,119,225,246,149, 19,184,123, 55, 81,115, 55,254,238,143, 68, 68,151,151,229,221,123,170,200, 42, 95,237, 40, 66, 90,239, 81, +132, 90,161,205, 87, 55, 15,124,219, 45,184,199,187, 29, 93,130, 58,193, 57,224, 97,160, 72,149, 21,139,204,107, 59,246,105,114, + 36, 35, 41,141,125,234,177,239,222,190,141,131,169, 80,138,139,167,255, 2,229,249,149, 0, 64,121,126,229,205,243, 7,167,182, +239,255, 6, 26,184, 55,108, 65, 8, 33,245, 93,143, 17, 0,100, 2,147,234,175,117, 95,237, 72, 77, 77, 69, 66, 66, 2, 30, 60, +120,128,146,146, 18,108, 78, 61,171,170,143, 78, 65,210,197, 99, 30, 77,187,244, 25,243,250,140, 63,135,141, 24, 38,247,111,212, + 68, 16,226,235, 0, 87, 59, 17, 18, 83,178,145, 20,123,159,127,112,231,172,158,234, 10,134, 22, 61,184, 80,163,225,115, 11, 27, +233, 33, 16,146,143, 79,236,127,184,182, 96,244,144,215, 67, 62,156, 62,187, 67, 3, 23,231,106,159,227, 37,197,165,210, 5, 11, +230,133, 84,236, 95,215, 90,132, 2,161, 80, 51,121,234, 59,182, 2, 34, 64,197,233,162, 21,109,100,149, 63, 30,126,144,136, 69, +117,150,209,137,195,162,192,241, 60,180, 58, 51, 52, 58, 35, 84, 26, 3,114,139,148,136,187,251, 0, 87,206, 29, 70,106,210,125, + 13,199,113,167, 64,177,187,208, 69,181,237,201,137,117,107, 45,159, 16,250, 55,112,118, 64,154, 82, 15,185, 84,132,156,140, 36, +206,196,233,159,122,146,245,162, 91,251,115, 61, 34,134,244,158,248,214, 39,135,187,116,137,114,108,222,170,141,194,213,193, 1, + 18, 17,144,148, 81,128, 59, 55,174,106,211,239,221, 82, 91,204,186,190, 69,177,251,159,121,149,150,255, 89,131,101,178,112,209, +179, 62, 89,124,212, 98,177,216,136,132, 66,157,153,242,125,159,197, 92,253, 93, 80,202,103,189,245,238, 7,149, 81, 93, 0, 48, + 91,120,155, 55,222,154,173,171,250,134, 64,204, 22, 69, 69,228,170,142,145,122,194, 66,165, 65, 51,231,151,219,235,151,172,143, +223, 9, 32,254, 89, 71,246, 1, 64,169,218,120,219,165,215,246, 33,154,114,142, 0,184, 91,141,166,182, 71,143, 30,149,102,235, + 81,115,157,213, 21,132, 84,174,152,218,125,208,235,130, 19,251,214,240,215, 78,237, 27,249, 52,230,170, 74, 5,102, 2,112,133, + 16, 18, 59,119,238,220,182, 30, 30, 30, 30,243,230,205,147,171,213,106,241,207, 63,255,172, 47, 42, 42,202, 83,171,213,151, 40, +181,190,127,194,163, 74,115,162,141, 71,179, 85,100,231,154,222,206,238, 62,125,156, 92,253,154,150, 22,102, 37,169,139,179, 14, + 19, 30,199, 52, 5,137,151,234,155,214, 91,183,110,101, 68, 70, 70,238, 21, 10,133, 55, 0,184, 2,176,167,148,150,112, 28, 87, + 42, 22,139,243, 18, 19, 19,235,189, 32,107,218,233,181,134, 46,111,253,190,165,164,156,151, 24, 5,146, 45,105,167,215, 26, 0, + 32,255,232,236,114, 0,251, 60,186,127, 60,124,255,165,180, 31,226, 74, 29,223, 45, 56,245,213,254,250,234,103,223,220,214,228, +121,149,127, 93, 78, 92, 22,128,215,108, 61, 66,190,139,185,121,105, 62,161, 16, 91,192,125, 81,158,127,255,250,243,208, 23,139, +197,250, 54,109,218, 84, 59, 90, 80, 38,147,213, 58,191,214,163, 7,253, 26,210,173,219,186,195, 39,206,189,118,232,216,249,175, + 59,116,236,236, 34,247,245, 65,128,179, 9,235, 62,104,253,238,137,155,133, 87, 7,127,112,246,151,228, 28,253, 29, 74,169,190, + 62,105,211,104, 52,247, 8, 33,165,101,101,101, 67, 40,165,153,132, 16,191,210,210,210, 91,102,179, 57,166,222, 70,128,199,171, + 29, 59,182,219, 76, 8, 17, 81,142,255,230,146, 88,184, 69,159,123, 55,235,105, 12,197, 99,209,213, 70, 14,152, 60,117, 90,112, + 80,147,166,193, 21,107, 17,134, 55,180,199,216,137,111, 6, 55,108, 28, 28,252,175,245, 9,107,127,161,162, 57, 55,116,196, 35, +178, 87,226,209,165,159,185, 36, 93,120,203,166,129,175,157,182, 40,173,164, 52,237,250,210,242, 2,143,165, 79,174,208, 80, 95, + 82, 31,196, 45, 95,179,244,163,217,185,217, 41,107,180, 5,247, 98, 1, 64, 91,112, 47, 86,225,209,244,179,162,188,172,217,197, + 5,201, 75,159,246, 92,104,181,218,156, 77,155, 54, 57,117,234,212, 73,224,225,225,129,194,194, 66,156, 58,117,138,231,121, 62, +187,190, 90,249,247,206,158, 34, 65, 65, 13,182,172, 83,125, 35,178,177,239,207, 89,224, 77, 41, 32, 18, 32,215,100, 80, 29, 46, +116,210,125, 64,239, 92,170,189, 92,242, 22, 66, 5, 84, 80,177,182, 32,207,243,228,219,159, 54,164, 9,197,210,106,155, 84, 45, +102,163,130,231,121,171,215, 34,204, 23,166,187, 68,152, 67,173, 26,197, 23, 75, 18,234,120, 57,165, 71, 94,234, 55,190, 15,199, + 89,204, 0,244, 85,182, 2, 74,201, 73, 16,203,209,162, 6,154, 75,245, 49, 85,143,213,243, 38,147, 19,132, 18,216,219,152, 65, + 64,160, 86, 41,101,110, 22,233,221,103, 41, 75,249,177,251,226, 72,183,110, 1,198,227, 39, 39,156, 57,119,113, 36,229, 45,141, + 44, 20, 0, 37,169, 70,147,126, 71,129, 67,209,250,167, 77,239,255, 26,132,254,141,243, 81, 88,219, 92,242,223,166, 73, 8,145, + 60,170,172, 45, 85,151,191,121, 30,233,172,109,109,193,103,201,187,189, 87,179,206, 50,185,226,131,242,114,205,154,242,252,123, +127, 62,207,243, 73, 8,113,148,201,100,173,236,236,236,196, 69, 69, 69, 87, 40,165,170, 23,241,186, 87, 37,234,245,157,174, 61, +123,133,207, 56,122, 54,113,197,163,230,195, 74,124, 71, 46,151,143,235,223,125,214,250,221,251,254,109, 20,225,139,144,247,191, + 75,147,116,235, 38,114, 47,117,120,205, 98,225,191,232, 17,172, 41,207, 75, 73,156,118, 46,166,240, 10,165, 84,243, 44,233,148, + 74,165, 99, 77, 38,147,141, 68, 34,209, 25,141,198, 77,255, 45,121,119,143, 24,250, 57, 8,154, 89, 45, 66,113,183, 32,118,239, +188, 58,159, 33, 97, 97, 18, 69, 33,156,203,139, 92,139,235,107,172,254, 35,215,157, 16, 97,100,100,100,148, 68, 34,241,183, 88, + 44, 10,163,209, 88,174,211,233, 82,211,210,210, 46,214,180, 32,249,223,157, 78,143,200,161,203,197, 98,241,123, 0, 96, 54,155, +191,207,143,217, 59,163,182,239,214,180,255,255, 75,125, 52,114,164,144,238,216, 97,249, 59,174,145, 79,171,151,149,102, 51,231, + 88,241,187, 68, 44, 82,101,221,220,233,244,159, 42, 75, 47, 28,244,209,242, 8,127,199, 6, 32,154,105, 50, 77,166,201, 52,171, +217, 87,192,206, 39,211,252, 79,106,122, 53, 27,232,231,213,108,160,159,181,223,175,110,127,118, 62, 41,216, 86,243, 38, 98, 22, +147,193, 96,252, 7, 94,236,120,118, 22, 24,255, 73,114,226,255,204,252, 59,247,103, 48, 8,128,232, 26, 30,128, 86,135,254, 8, + 33,209, 79,241,128, 61,206, 52,153, 38,211,100,154, 76,147,105, 50,205,127,150,102, 93,218, 47, 76,211, 35,107, 34,100,154, 76, +147,105, 50, 77,166,201, 52,153, 38,107, 34,124,190,155, 0, 12, 6,131,193, 96, 48, 24,140,231, 10, 51, 88, 12, 6,131,193, 96, + 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,227,233, +249, 91,103,114,103, 48, 24, 12, 6,131,193,248, 39,194, 34, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, + 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, 24, 12,102,176, 24, + 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96,252,231, 13, 22, 33, 36,154,105, 50, 77,166,201, 52,153, 38,211, +100,154, 76,147, 25, 44, 6,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, + 48,131,197, 96, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,227, 63, 4, 1, 80,237, 72, 0, 74,233,113,171, 69, +158, 98, 52, 65, 93,250, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,241, 52,235,210,174,143,255,248,175,134, 82,250,183,109, + 0,162,153, 38,211,100,154, 76,147,105, 50, 77,166,201, 52,255,105, 27,107, 34,100, 48, 24, 12, 6,131,193,120,206, 48,131,197, + 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131, +193, 96, 48,158, 30,242,104, 52, 0,131,193, 96, 48, 24, 12, 6,227, 57,193, 34, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, + 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,131, 25, 44, 6,131,193, 96, 48, + 24, 12,102,176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96,252,231, 13, 22, 33, 36,154,105, 50, 77,166, +201, 52,153, 38,211,100,154, 76,147, 25, 44, 6,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, 49, 24, + 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,227, 63, 4, 1, 80,237, 72, 0, + 74,233,113,171, 69,158, 98, 52, 65, 93,250, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,241, 52,235,210,174,143,255,248,175, +134, 82,250,183,109, 0,162,153, 38,211,100,154, 76,147,105, 50, 77,166,201, 52,255,105, 27,107, 34,100, 48, 24, 12, 6,131,193, +120,206, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, 24,204, 96, + 49, 24, 12, 6,131,193, 96, 48,158, 30,242,104, 52, 0,131,193, 96, 48, 24, 12, 6,227, 57,193, 34, 88, 12, 6,131,193, 96, 48, + 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6,131, 25, 44, + 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96,252,231, 13, 22, 33, 36, +154,105, 50, 77,166,201, 52,153, 38,211,100,154, 76,147, 25, 44, 6,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, 96, 48, + 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, 12, 6,227, 63, 4, + 1, 80,237, 72, 0, 74,233,113,171, 69,158, 98, 52, 65, 93,250, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,241, 52,235,210, +174,143,255,248,175,134, 82,250,183,109, 0,162,153, 38,211,100,154, 76,147,105, 50, 77,166,201, 52,255,105, 27,107, 34,100, 48, + 24, 12, 6,131,193,120,206, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, 12, 6, 51, 88, 12, 6,131,193, + 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,158, 30,242,104, 52, 0,131,193, 96, 48, 24, 12, 6,227, 57,193, 34, 88, 12, + 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 12, 22,131,193, 96, 48, 24, + 12, 6,131, 25, 44, 6,131,193, 96, 48, 24, 12,102,176, 24, 12, 6,131,193, 96, 48,152,193, 98, 48, 24, 12, 6,131,193, 96,252, +231, 13, 22, 33, 36,154,105, 50, 77,166,201, 52,153, 38,211,100,154, 76,147, 25, 44, 6,131,193, 96, 48, 24, 12, 6, 51, 88, 12, + 6,131,193, 96, 48, 24,204, 96, 49, 24, 12, 6,131,193, 96, 48,131,197, 96, 48, 24, 12, 6,131,193, 96, 6,139,193, 96, 48, 24, + 12, 6,227, 63, 4, 1, 80,237, 72, 0, 74,233,113,171, 69,158, 98, 52, 65, 93,250, 76,147,105, 50, 77,166,201, 52,153, 38,211, +124,241, 52,235,210,174,143,255,248,175,134, 82,250,183,109, 0,162,153, 38,211,100,154, 76,147,105, 50, 77,166,201, 52,255,105, + 27,107, 34,100, 48, 24, 12, 6,131,193,120,206,136,170,251,163,184,253,151,249, 28,199,185, 3,128, 72, 36, 42, 48, 95,253,212, +171, 54, 17, 63, 47,175,158, 22, 96, 53, 0, 8,129, 55, 51,115,114,142, 85,163,121,140,227, 56,231, 71,154,165,230,171,159,246, +169, 77, 83,220,238,139, 35,143,237,127,101,110,175,106,226,139, 66,113,187, 47,114,158, 72,171,119, 61,194,119,150,255,143,116, +254,175,104,254,147,145,116,248, 50,223,108,126, 88,142,196, 98, 81,129,233, 74,237,229, 72,210,254,139,156,199,246,191, 60,215, +163, 54, 77,133,141,172, 56,200,199,109, 89,109,154,201, 57, 69, 51,181,229,122,151,218, 52,255,103,238, 77, 43,241,244,244,108, + 35, 16, 8, 62, 37,132, 56, 84,249,243,157,236,236,236,247, 89,169,100, 48, 24, 47,156,193,226, 56,206,253,198,158,249,208, 26, +128,158,227,191,112, 15, 28,250,235,230,127,219, 71, 95, 42,213,221,223, 27, 41,133,214,217, 70,204, 57,220,191,127,159, 0,128, +183,183,247,106, 0,254,213,104, 58,223,216, 51, 31,229, 70,160,203,232,133,206,157,253,252, 28,242,132,194, 89, 50, 27,155,238, +122,189, 62, 28, 0,228,114,121,156, 65,167, 59,229,105,177,124,247,228,254, 53,101,160,106, 90,123,140,251,194, 61,116,232,175, +239, 90,120, 94,170, 75,222,209,133,215,164,139, 36, 22,227,207,175,229,230, 30,154, 15, 88,172, 57, 33, 85,143,219,117,212, 39, + 46,254, 94, 94, 61,164,114,121, 11,123, 7,135, 40,158,210,102, 60,207, 19, 11,199,197,107,203,202,206,241, 28,119,219, 98, 46, +119,185,177,247, 43,190,182,116, 62,153,151,145,128,232,178,167,231,203, 10, 91,219,238, 2,145,232, 37, 0,224, 57,238, 98,185, + 86,123,170, 67, 94,222, 78,107,242,110,237,249,121,218,253,255,105,152,205,156,123,202,145,249, 48,152,129, 86, 35,190,118,111, +254,234,250,205, 0, 96, 44,184,237, 81,118,127,127,123, 0,176, 13, 26,120, 69,230,217, 42, 31, 0, 68,233,185,238,247, 14,204, +133,193, 12, 52, 27,184,208,189, 46,205,137,243,182,187,124, 56,121,184, 12, 0,142,238,250,169,233,201,221, 43,251, 1, 64,143, +225,211, 14,245, 30, 49,253, 30, 0,124,243,219,110,151,173, 95,191, 82,171,166,117,247,166, 74,162,186,127,160,137, 81,157,235, +228,103, 43,242,188,127,255,190,160, 62,247,166, 47,224,152, 11,188, 45, 16, 10,163,130,154, 52,105, 5,128, 38, 39, 37,221,180, +112,220,121, 47,224,231,231, 89,150,132, 66,225,187,217,217,217,131,170,254,205,199,199,135, 21, 72, 6,131,241, 98, 26, 44, 0, +208, 26,128, 51, 15,128,174, 29,154, 99,242,171,253,237,170,254,111,247,239,139,252,179, 98,143,133,126,181,246, 27, 65,120,120, + 56,146,147,147,173, 58, 88,185, 17, 56,125, 31,144,233, 83,237, 11,164,210,164,121,159,126,234, 16, 21, 21, 37,242,242,122,248, + 18, 94, 80, 80,208,225,252,249,243,109, 22, 44, 88, 48, 85,166, 79, 45, 45, 55, 66,115,250,126,221,186, 21,105, 13,111,218, 16, +159, 78,127,197, 17, 0,150,207,222,217,230,224,197,219, 13, 82, 83, 83,123,126,245,213, 87,197, 62,151, 46,173,108, 96,177,172, +141, 41, 40,200,180, 38,157,219,142,220,146, 7, 25,143, 5,190, 60,113,226,174,128,128, 0, 59,111,111,111,162, 80, 40, 32, 20, + 10,161, 86,171,253, 19, 19, 19,251,221,190,125, 91,123,238,242, 62,105,204,237, 17,201, 89,194,150,122,107,242, 46,225,138,228, +177,193,193,113, 47,247,235,231, 59,112,224, 64,121,163, 70,141, 0, 0,169,169,169,193,127,253,245,215,232,131, 7, 15,206,147, +112, 69, 92,185, 17,250,186,242, 94,161, 9, 0,114,224, 37, 39,119,247,177, 66,177, 56,156,227, 56,159, 71,209,133,108,139,217, + 28,167, 44, 40,216,244,228,254,140,127,199, 96, 6,238,230, 2,209, 81,173, 48,110,120,180, 45, 0,124, 52,234,203, 14,233,169, + 15, 36, 70,163, 17, 77, 67,154,117, 90,244,245,178, 35, 16, 8,176,113,247,241,202,253,173,209,188,115, 55, 5,243, 23, 45, 71, + 78,204,206, 14, 22,213,131,238, 26,181, 74, 8, 0, 14,142,142,195,119,110,219,114,202, 59,242,229,203, 15,138, 76, 86,105,214, +118,111, 30,222,246,163, 87, 86,236,169,176, 95,142,254, 33,246,247,247, 71, 76, 76, 76,189,238, 77,168, 18,237,121, 47,175,248, +239, 62,248,192,179, 75,151, 46,176,179,179,131, 72, 36, 2,199,113,209,231,207,159,143,158, 63,127,254, 52,168, 18,181,214,222, +155, 86,240,157,183,183,119,247, 33, 35,198,122,117,239, 51, 16,195,251,118, 98, 5,145,193, 96,188,184, 6, 75, 36, 18, 21,244, +154,240,149,123, 84,251, 8, 92,187,125, 79,149,150,145, 91, 86,241, 63,229,221,221, 77, 71, 71, 7,133,173, 58,248, 23, 12, 6, + 3, 46, 92,184,128,219,183,111, 35, 53, 53, 21,115,231,206, 53, 8,129, 55,107,208, 44,237, 50,122,161,179,204,144,105,215,218, + 37,179,209,214,205,167,132, 58,157, 14,167, 79,159, 70,105,105, 41,164, 82, 41,124,125,125,209,185,115,103,209,233,211,167, 27, +140, 26, 51,214,177,247,208, 73, 41, 6,153, 95,153, 72, 36, 42,173, 49, 3, 34, 81, 65,207,241, 95,184,135, 5, 55, 68, 82, 90, +142,234,211,175,127, 47,227,121, 42, 42, 79,207, 50,157, 57,115, 6,173, 90,181,194,182,109,219, 92, 74, 75, 75, 63, 91,183,110, +221,167, 94, 63,174,253, 62, 55, 43,113,118, 45,122,165, 93, 70, 47,116,110,106, 57, 25,176,115,203, 31,146,219,183,111, 75, 86, +173, 90,133,226,226, 98, 72,165, 82, 56, 57, 57,193,211,211, 19, 77,155, 54, 37,111,191,253,182, 93,247,238,137,248,108,230,164, +128, 92,167, 33,137, 53,165,179, 66, 83, 98,204, 85, 4, 11,175, 7,173, 94,191, 94,208,174, 93, 59, 82,117, 31,127,127,127,116, +235,214, 77, 62,108,216,176,160,105,111,191,195, 71, 15,155,146,100,146,122,149,215,165, 9,109,166,141, 75,249, 37,239,232,209, +163,247, 47, 92,184,208,201,211,211, 19,182,182,182, 0, 0,149, 74,229,155,150,150,214, 97,222,188,121, 35,174,220,217, 38,234, + 50, 48, 51, 7,182,126,186,218,206,231, 63, 21,177, 88, 84, 80, 17, 53,178,183,181, 41,205,204,202,215, 2,128,209,104,132,209, +104,132,193, 96,192, 91,211,166, 8,223, 28,209,174, 73, 64,212,187,183, 82,179,243, 75,154, 29,191,220,160,226,187,117,105,138, +202, 83,149,202,140, 19,111,206,255,224, 3, 79, 15,143,127,181,252,109,220,176, 65, 88, 82, 82, 18, 61,127,254,252, 48,170,232, +166,108, 54,112,161, 83,109,154,181,222,155,247,254,106,180,104,122,159, 22,191,126,125, 0, 22,139, 5,151, 46, 93,194,217,179, +103,177,108,217, 50,122,232,208, 33,149,131,173,109,173,247, 38, 84,137,246,157,189,242, 2,151, 44,217, 69,100, 50, 25,246,237, +219,135,132,132, 4, 8, 4, 2, 52,111,222, 28,227,198,141, 67,116,116,180,231,228,201, 83,104,151,190,163,146,225, 24,162,121, +150,178, 68, 8, 17,120,121,121,189,251,214,251,159,120, 13, 31,253, 26,126,252,246,115,102,176, 24, 12,198,139, 67,181,189,223, + 1, 65,227,161,191,110,221,113,157,255,171,241,208, 95,183, 82, 64, 64, 1,129, 3,208, 48, 42, 42,202,172, 84, 42,233,213,171, + 87,233, 91,111,189,165,253,254,251,239, 79,253,245,215, 95, 59, 57,147,105, 77,171, 22, 45,150, 82, 64, 80,147,102,115, 71, 71, +199,192,192,192,194,204,204, 76,122,240,224, 65,186, 96,193, 2,186,105,211, 38,122,232,208, 33,122,252,248,113,122,232,208, 33, +186,117,235, 86,122,231,206, 29,250,224,193, 3, 26, 20, 20, 84,216,220,209,209,177, 22, 77, 33, 5,132, 77,135,174,154,189,235, +154,121, 97,200,208, 95,103, 80, 64,216,204,195, 35,180, 87,175, 94,150,157, 59,119,210,141, 27, 55,210,245,235,215,211, 59,119, +238,208,162,162, 34,234, 19, 16, 88, 88,241,189,154,210, 73, 1, 65,171, 86,173, 10,149, 74, 37,245,243,243,163, 82,169,148,122, +120,120,208,166, 77,155,210, 14, 29, 58,208,126,253,250,209, 87, 95,125,149,126,246,217,103, 84,169, 84,210,128,128,128,252,138, +239,213,164, 57,208,203,203, 38, 40, 40, 40, 35, 38, 38,134,214,132, 78,167,163, 69, 69, 69,244,228,201,147, 52, 40, 40, 40, 99, +160,151,151, 77,109,154, 54, 64,235,200,200,200,194,162,162, 34,106, 50,153,104, 70, 70, 6,141,141,141,165, 9, 9, 9, 52, 35, + 35,131,234,116,186, 74,237,123,247,238,209,192,192,192, 66, 27,160,117,141,154,255,228,173,162, 76, 60,177,249,123,120,244,243, +244,244,212,237,218,181,139,102,103,103,211,117,235,214, 81, 1,240,229,191,237, 91,139,166, 20,232,221,185,115,103,203,165, 75, +151,232,173, 91,183,232,199, 31,127, 76,251,244,233, 67,251,246,237, 75,231,207,159, 79,179,178,178,104, 86, 86, 22,237,215,175, +159, 69, 10,244,174,171,124, 86,119,111, 58, 2,254, 3, 7, 14,212,153, 76, 38,154,156,156, 76,195,195,195,179,132,192, 88, 91, + 32,172, 43, 32,171,171,124,250, 0,206, 94, 94, 94,185,151, 46, 93,162,187,119,239,166, 1, 1, 1,133, 66, 96,162, 3,208,216, + 1,104, 44, 4, 38, 54,110,220,184,240,210,165, 75,180,184,184,152,250,251,251,231,250, 0,206, 79, 91,150, 0, 8,188,188,188, +254,248,226,155,159,104, 98,150,150,126,241,205, 79,212,203,203, 43,131, 82, 74,189,188,188,142,177, 50,201, 54,182,177,237,127, +125, 19,213,203,140,217,218,126,181,104,209, 34,145, 94,175,199,239,191,255,174, 25, 51,106,212,110, 39, 39, 39, 78, 44, 22,131, + 8,234, 30,144,168,113,116,124,111,238,156, 57, 78, 6,131, 1,215,175, 95, 71,155, 54,109, 32,147,201, 32,145, 72, 32, 22,139, + 33, 22,139,225,229,229,133,130,130, 2,132,135,135, 99,234,212,169,142, 63,255,248,227,123, 80,169, 22,213,166,203,243, 84, 4, + 0, 22,158,151, 54,244,246,158, 28, 26, 25,185,116,218,180,105, 2, 91, 91, 91,232,245,122, 24, 12, 6, 36, 36, 36,192,197,197, + 5, 10, 27, 27,171,242, 44, 16, 8, 4,118,118,118, 56,121,242, 36,126,251,237, 55,164,166,166, 34, 55, 55, 23,246,246,246, 8, + 15, 15, 71,179,102,205,208,181,107, 87, 36, 39, 39,131, 16, 66,234,210,139, 23,139,223, 30, 55,122,180,123, 68, 68, 68,181,255, +215,235,245, 80, 42,149, 80,169, 84,240,240,240, 64,191,126,253,220,255,220,183,239,109, 0,223, 85,183,191, 11,224,233, 27, 28, +188,255,234,213,171,174,148, 82,108,220,184, 17,101,101,101, 48, 26,141, 16, 8, 4,144,203,229,112,118,118, 70,143, 30, 61,224, +230,230,134,224,224, 96,108,223,190,221,181, 95,191,126, 7, 92, 10, 10, 90, 23, 3, 57,236,245,162,110,210,243,243,143,246, 6, + 92,199,190,250,234,161,219,119,238, 68,141, 29, 59, 22,249,249,249,159,136, 63,254, 88,105, 6,150,215,245,253, 16,192,177,129, +151,215,218, 37, 75,150, 8,242,242,242, 48,107,214,172,162,156,244,244,143, 29,129,115, 0,112,226,240,225,168, 77,155, 54, 45, +222,184,113,163,235,134, 13, 27, 4,173, 90,181, 90, 27,146,145, 17,158, 8,168,234,147, 78, 13,240,238,138, 21, 43,228,122,189, + 30,189,122,245, 74,150,167,166,182,224, 0,157,181,223,207, 5,222, 94,246,225,135,158, 50,153, 12,179,102,205, 42, 42, 79, 79, +143,224,128,194, 42,187,164,185,165,164, 28, 30, 63,126,124,236,157, 59,119, 92,151, 47, 95,238, 57, 98,216,176,183, 1,124,105, +237, 49,170,118,104,247,242,242, 10, 30, 50, 98,172, 71,211,176, 72,236,222,186, 14,191,172,248,106,173,197, 98,249,213,199,199, +103,186, 64, 32,248,150,149, 60, 6,131,241, 66, 54, 17,214,132,139,155, 91,155,208,208, 80,156, 57,115, 6,145,145,145, 87,157, +156,156, 56,137, 76, 6,177, 88, 12,202,243,117,126,223,198,214,182,103,151, 46, 93, 68, 23, 47, 94, 68, 96, 96, 32,108,108,108, + 42,141, 85,197, 38,145, 72,224,229,229, 5,181, 90,141,168,168, 40,241,218,181,107,123, 2, 88, 84,151,118, 78, 90,162, 29, 82, +214,190,186,248,187,165,141,219,181,107, 7,149, 74, 13,158,231,161, 80, 40, 96, 52, 26, 33, 18,137, 96, 52, 26,161, 55, 82,181, + 53,121,181, 88, 44, 22,161, 80,136,192,192, 64,124,245,213, 87,208,235,245,144, 72, 36, 0, 0,181, 90, 13,165, 82,137,216,216, + 88,164,165,165,129, 62,122, 37,175, 13, 91, 59,187,254,131, 7, 15,150, 86,247, 63,131,193, 0,149, 74, 5,149, 74, 5,165, 82, + 9,189, 94,143,230,205,155, 75, 79,157, 60,217,191, 38,131,101,144,203, 71,108,216,176,193, 93, 42,149, 66,167,211, 65,163,209, + 32, 51, 51, 19,233,233,233,250,130,130, 2,206,222,222, 94, 16, 16, 16, 32,144,201,100,178,161, 67,135, 18,181, 90, 13, 66, 8, + 6, 14, 28,232,178,121,227,198, 87, 0, 44, 99,197,223, 58,142, 2,134,214, 70,227,160,246,237,218,157,188,122,237, 90,171,247, +222,123, 15,119,238,220, 89,162,216,182,237, 76, 57,112,187,182,239, 38, 3,111, 47,173, 98, 92,104,122,122,164,233, 9,227, 18, +240,208,184,196, 84, 24,151,145,245, 52, 46, 0, 96,239,232,216,214,203,203, 11,135, 14, 29, 66, 70,106,234, 71,245, 49, 87, 0, + 32, 16, 10, 59,119,233,210, 5,251,246,237, 67, 86,122,250, 71, 79,152, 43, 0, 64, 33, 80, 40, 74, 78,254,104,237,218,181,127, +188,254,250,235, 16,138, 68,157,193,113, 86, 31,163,186, 14,237,111,191,247, 17,246,237,218,180, 54, 55, 55,247, 13, 74, 41, 15, +224, 42, 43,113, 12, 6,227, 69,160, 94,243, 96,121,122,122,250,216,218,218, 34, 39, 39, 7,205, 66, 67, 11,100, 50, 25,164, 98, + 49,228, 82,169, 85,223,215,235,245,145,158,158,158, 80,169, 84,112,117,117,133, 68, 34,169,220,164, 82,105,229,103,123,123,123, + 8, 4, 2,248,248,248, 64,175,215, 71,214,165,203, 41,239,187, 31, 94,247,241, 91,127,238,218,208,184, 95,191,254,112,118,110, + 0, 63, 63, 95,184,187,187,195,198,198, 6,126,126,126,104,210,164, 9, 93,189,122, 53, 4, 14, 77,172,122,128, 87, 53, 77, 34, +145, 8, 22,139, 5,249,249,249, 72, 76, 76,196,157, 59,119,112,233,210, 37,220,186,117, 11, 26,141, 6, 86,248, 43,104,203,203, + 91, 84, 23,232, 50, 24, 12, 80, 42,149,149,209, 43,165, 82,137,194,194, 66, 36, 39, 39, 67,173,209,180,172, 73,207,217,197,101, +120, 68, 68,132, 16, 0,108,108,108,208,178,101, 75,252,250,235,175,220,159,123,247,142, 10,187,116,169,129,223,145, 35, 78,171, + 87,173, 26,245,242,203, 47, 91, 46, 95,190, 12,181, 90,141,187,119,239,194,205,205, 77, 36,149,203, 95, 97, 69,191,126,220, 0, +180,174, 26, 77,223,151, 94,122, 41, 69,165, 82,225,219,111,191, 21,136,237,237,127, 91, 8, 8,235,112, 21,157,186,116,233,130, +253,251,247, 35, 39, 61,253,227,244,106,140, 75, 58, 80,152,145,156,252,241,218,181,107,209,187,119,111, 16,145,168,222, 29,145, + 58,116,232, 16,193,243, 60, 98, 98, 98,224, 4, 92,169,239,247,131,154, 52,105,101,103,103,135,132,132, 4,216, 62,138,174, 85, +251,162, 0,156,187,121,243, 38,108,108,108,208, 44, 44,172,117, 61, 15,243,157,183,183,119,238,219,239,125,132,221,135, 47, 0, + 0,246,237,218,148, 95,197, 92, 49, 24, 12,198, 63,211, 96, 85, 32, 22,139, 33,149,201, 32,149, 74, 31, 26, 35,153,204,234,239, + 18, 66, 32,151,203, 43, 13, 85, 85, 99, 85,245,179, 66,161,176,202,184, 0,128, 57,239, 66,212, 43, 35, 95,150, 74, 36, 18, 24, +141, 6, 80, 74, 33,147,201,225,228,228,132,192,192, 64,148,151,107, 49,120,200,112, 67,166, 82,114, 64,226,219,243,206,211,228, +153,227, 56,104,181, 90,148,150,150,162,164,164, 4,106,181, 26, 58,157, 14, 86,180, 14, 86, 86,181, 25, 25, 25,216,178,101, 11, +138,139,139, 1, 60,236, 64, 93, 97,170, 42,126,166,164,164, 96,227,198,141, 72, 77, 77,133, 80, 40,180,250,250, 68, 69, 69,225, +192,129, 3,194,110, 61,123,174, 57, 22, 16,144,115, 44, 32, 32,167, 91,207,158,107,246,239,223, 47,244,241,241, 65, 90, 90, 26, +174, 95,191,142,210,210, 82, 80, 74, 9, 43,250,245, 39, 9, 40, 45, 47, 41,121,253,147, 79, 62,161,118,118,118,248,118,233,210, + 22, 95, 2, 99,172, 53, 46,142,181, 24, 23,199,103, 51, 46,160,148,130,231,121, 88, 44,150,167,202, 27, 33,132,136,197,226,250, +148,103,224,225, 82, 91,214,234, 11, 40,165,239,190,245,254, 39, 94,239,124, 48, 15,167,142, 28,168,248,251,125,102,174, 24, 12, +198,139, 72,189,154, 8,115,114,114,178,181, 90,109,227,128,128, 0,100,101,101,185,251,251,251,167, 75,197, 98, 72,164, 82,171, +250, 96,201,229,242,152,252,252,252, 78, 62, 62, 62,224, 56,174,210, 76, 61,217, 68, 88, 17,149,185,123,247, 46,228,114,121,157, +227,204, 5,150,178,134,225,225,225,149,145, 32, 39, 39, 39, 56, 57, 57, 66, 38,147, 99,241,226,197,252,154,223,126,251, 89, 30, +254,182,234,253, 73, 31,210, 27, 95,174,121,174, 39,208,218, 10, 73,161, 80,196, 52,106,212,168,163, 66,161,192,238,221,187,145, +150,150,134,210,210, 82,148,151,151,195, 96, 48,160,188,188, 28, 70,163, 17,114,185, 28, 97, 97, 97,104,208,160, 1,226,226,226, +106,204,123,105,113,241,238,152,152,152,142,237,218,181,171,140,160,116,239,222,157,116,239,222,221,181,226,247,242,242,114, 20, + 21, 21,225,234,213,171, 56,126,252, 56, 8, 33,184,127,255,190,197,160,211,109,101, 69,255,233,208, 3, 23,133,107,215,254, 49, +117,234,212, 73,157, 58,117,130, 5,232, 7, 96,227,127,202,184, 84,112,233,210,165, 88,139,197,210,169,105,211,166, 80, 2,237, + 1,236,171,151,121,124,240,224, 38,199,113, 61, 91,180,104,129,221, 59,118, 68, 1, 72,171,110, 63, 45, 16,213,170, 85, 43,232, +116, 58,220,141,143,191, 97,173,185,242,242,242, 90,243,214,251,159, 76, 28, 62,250, 53,236,222,186, 14,251,118,109,202,252,249, +251, 37,126,148, 82, 19, 43, 85, 12, 6,227, 31,111,176, 74,139,139,111,196,198,198, 54,110,221,186, 53,214,172, 89,211,238,165, +142, 29,179, 37, 82, 41, 39,149, 72, 32,176,162, 2,209,105,181, 39,206,159, 63,223,190,119,239,222,162,203,151, 47,195,211,211, +179,210, 96, 85,252, 20,137, 68,160,148, 66,161, 80,224,208,161, 67, 38,157, 86,123,162, 46, 93, 11,103,177, 8, 30, 25, 60, 74, + 41,148, 74, 37, 36, 18, 9, 86,175, 94,131,117,191,253,246,106, 86,110,238,206,224, 54,206, 31, 0,144,255,199, 42,230,242,242, +147, 39, 78,156,104, 51,115,230, 76,177,175,175, 47,148, 74, 37, 74, 75, 75, 81, 92, 92, 12,181, 90, 13,181, 90,141,210,210, 82, + 40,149, 74,200,229,114, 60,120,240,192,172, 47, 47, 63, 89,147,158, 76,175,223, 53, 97,194,132, 15,111,222,188,233, 37, 18,137, + 96, 54,155,193,243, 60,120,158,135,201,100,194,131, 7, 15, 16, 23, 23,135,132,132, 4,148,148,148, 64, 44, 22, 67, 40, 20,226, +214,173, 91,165,182,102,243, 14, 86,244,159, 30, 49,176,251,252,249,243,147,198,141, 27, 7,111, 95,223,174,200,202,178,202,184, +236,173,197,184,168,158,194,184, 60,102,124, 52,154,107, 41, 41, 41,157,186,117,235, 6, 47, 95,223, 37, 97, 89, 89,199,226,235, +209, 15,203,194,113,231,206,159, 63,223,115,252,248,241, 88,179,102,205, 18,183,148,148,195,133, 79, 52,103,186, 1,110,141,130, +130,150, 76,156, 56, 17, 71,143, 30,133,133,227,106,140,200, 61,209,161,189,225,144, 17, 99,253, 88,135,118, 6,131,241, 79,162, + 94, 77,132, 68,171,157, 51,119,238, 92,179, 80, 40,196,240,225,195,237,247,237,223,255,242,173,219,183, 3, 11, 10, 10,156, 44, + 22, 75,157, 90,246, 42,213,247,139, 22, 45, 82,154,205,102,132,132,132,160,164,164, 4, 22,139, 5, 34,145, 8, 34,145, 8,132, + 16, 8, 4, 2,216,217,217, 33, 46, 46, 14,219,182,109, 83,219,171, 84,223,215,165,203,243,124,204,158, 61,123, 32, 18,137,168, + 92, 46, 7, 33, 4, 34,145, 8,171, 87,175, 46,152,147,155,187, 27, 0,132, 2,129, 17, 0, 4, 2, 98, 85,175, 92, 66, 72,157, +237,147, 82,169, 20,252,195,206,253,117,238,235,102, 54,175, 88,181,106,149,230,254,253,251,208,106,181,149,209,182,178,178,178, +202, 78,243, 74,165, 18,132, 16,232,245,122,156, 61,123, 86,227,102, 54,175,168, 73,175, 24,200,203,186,127,127,112,187,118,237, +138, 83, 82, 82,160, 82,169, 16, 19, 19,131,227,199,143, 99,251,246,237, 56,122,244, 40, 30, 60,120, 0,142,227,224,227,227, 3, + 74, 41,246,238,221,171,226, 52,154,126,197, 64, 30, 43,250, 53,211,208,211,179,167,135,187,123,134,155,171,107, 86, 67, 79,207, +158, 79,254,223, 17,184,119,239,222, 61,112, 28,135,192,192,192, 6,181,245,195,162, 28,119,254,252,249,243, 24, 63,126, 60,252, + 26, 55, 94, 28, 0,184, 61,185, 79, 0,224, 22, 16, 20,180,184,194,184, 80,142, 59, 95,223, 52,219, 3, 63,124,240,193, 7, 58, +137, 68,130,109,219,182, 5,154,155, 52, 73, 16, 1, 99,236,128,208,110,128,164,174,239,123, 1, 63,127,246,217,103,121,132, 16, +108,218,180,201,213, 49, 40, 40, 86, 4, 76,112, 4, 26, 58, 2, 13, 69,192, 4,199,160,160,216,109,219,182,185,114, 28,135, 25, + 51,102,228,121, 1, 63,215,164, 39, 20, 10,223,205,201,201, 25,148,157,157,221, 37, 39, 39,199,239,231,239,151,224,212,145, 3, +248,101,197, 87,107,115,115,115,223,200,207,207,191,154,157,157, 61, 46, 43, 43, 43,150,149, 56, 6,131,241, 34, 66,170,235,231, + 36,110,255,101, 62, 64,221,187,118,104,142,107,183, 19, 85,174,206, 14, 71, 42,254,167,188,187,187,233,192, 14,158,205,191,253, +246, 91,136, 68, 34,100,102,102, 34, 62, 62, 30, 14, 14, 14,120,239,189,247, 12,102,131, 97,112,197,122,103,132,144,104, 74,233, +241, 71,154,199, 56,142,115,150, 25, 50,237, 90, 57,167, 52,222,184,126,173,208,222,222, 30,101,101,101,149,211, 10, 40, 20, 10, +216,216,216,224,206,157, 59, 24,255,218,235,150, 36,174, 69,229, 68,163, 21,235,157, 85,213, 4, 33, 66, 0,232,231,236,172,184, + 43,147,205,114,241,240,152,253,206, 59,239,216,116,237,218, 21, 18,137, 4,109,218, 71,229,217,182,156,253,131, 64, 64,184,172, + 98,245,220,160,134,222,142,241,247,211, 0,144,135,107, 22, 62, 90,139,176,186,116, 70,202,239, 4,110,252,229,115,135,240,240, +240,135,249, 86, 42,145,159,159,143,130,130, 2, 40,149, 74,104,181, 90, 0,192,241,227,199,113,242,106,138, 58,215,174, 87,114, + 77,233,252, 87,222,211,236,155,217,220,107,244,195,138,101, 66, 39, 39, 39,228,231,231,163,176,176, 16, 74,165, 18, 58,157, 14, + 22,139, 5,106,181, 26,251, 15, 28,180, 36, 91, 34, 83, 13,178,134,154,186, 52,161,205,180,105, 80,118,193,167, 85, 88, 0,157, + 52,105,146,189,131,131, 3,120,158, 71,105,105, 41, 50, 50, 50,144,146,146,130,179,103,207,106, 11,148, 70,104, 93,123,101, 85, + 76, 52, 90,237,249,124, 94,133,234,127, 81,243, 81, 89, 2, 0,111, 47,175,156,244,244,116,119,139,197, 2, 31, 31, 31, 78, 89, + 82,178, 88, 10, 28,181, 7,114, 1,208, 34,224,211, 21, 63,252,240,250,144, 33, 67,208,182,109,219,204,188,252,252, 70,213,149, + 37, 16, 34, 12, 1, 28,203,125,125,227,174, 94,189,234,153,145,145,129,241,227,199, 23,165, 39, 37, 85, 78,211,160, 2,162, 2, +130,130, 22,111,219,182,205,181,113,227,198,136,140,140,204,147, 87, 76,211, 80,125,249,172,249,222,188,247, 87,163,105,195, 34, +218,190,245,214, 91,224, 56, 14,103,207,158,197,149, 43, 87,144,158,158,142, 11, 23, 46, 40, 29,108,109, 71,213,118,111, 66,149, +104,223, 47, 88, 27,184,105,211, 70, 34,145, 72,176,118,237, 90,220,188,121, 19, 0,208,170, 85, 43, 76,156, 56, 17, 28,199, 97, +236,216,113,244,175, 68,155,202,137, 70,171, 43, 75,190,190,190, 17, 60,207, 47, 37,132, 72, 40,165,109,115,114,114,228, 62, 62, + 62, 57, 57, 57, 57,126,245,233,115,197,202, 39,211,100,154,255, 28,205, 23,141, 58,215, 34,252, 98, 37, 28, 31, 95,142,227,205, +156, 61,191,127, 41,234,211,183, 95,232,220, 79,230, 8, 90,181,106, 5, 63, 63, 63,180,106,213, 10, 55,111,222,148, 53,107,214, +172,174,245,206,202,122, 15,157,148,210,187,119,111,167,183,223,126,219,177,107,215,174, 98,111,239,135,235,234,198,197,197,225, +208,161, 67,166, 45, 91,182,168,179,165, 81,202, 11,135,126, 47,179,102,189,179, 67,165,165,229, 0, 62,111,110, 52,254,246,217, +220,185,243,195, 35, 35, 39,189,255,254,251, 2, 59, 91,133,248,203,185,111,200, 1,224,139,159,182, 59, 14,121,249, 85,172,104, + 2,116, 29, 83,253, 58,111, 85,211,153,149, 91,144, 62,102,226,203, 77,222,126, 99,140,101,208,160, 65,182,118,118,118,240,243, +243,131,179,179, 51, 82, 83, 83, 17, 19, 19, 67,143, 29, 59, 86,118, 35, 46, 85,188,110,251,209,116,169,157,187, 53,235, 6,106, +122, 15,153,144, 58, 97,194, 4,231, 97,195,134,217,135,135,135,139,197, 98, 49,228,114, 57,138,139,139,145,153,153,105, 58,125, +250,116, 89,182,164, 99,233,133,195,235, 52, 86,174, 69,168,235, 50,122,225,131,115,199, 22,204,136,139,137, 25,199, 3, 45, 76, + 38,147,143,197, 98, 33, 2,129, 32,151,231,249, 24,147, 70,243,135,161,213,130,229,108, 45, 66,235,176, 88, 44, 18,139,197, 2, +165, 82,137, 99,199,142,137,146,146,146, 62,189,125,251,246,167, 57, 57, 57, 48,155,205, 24, 49, 98, 4, 90,181,106,133, 83,167, + 78,161, 48, 63,255,207,218,180, 18, 1,149, 44, 43,107,226,155,111,190,121,104,227,198,141,130,219,183,111,187,174, 93,187,246, +247,234,140,203,184,113,227,248,252,140,140,137,134, 90,230,192,170,227,222, 44, 58,188,237,199,219, 67,135,191, 28,182, 96,222, +167,226,151, 94,122, 9,174,174,174,136,138,138,130,201,100,114,178,226,222,212,116,233, 59, 42,185, 69,139, 22,182,203,151, 47, +247,124,253,245,215, 49,125,250,116, 0,128, 78,167,195,209,163, 71, 49, 99,198,140,188, 12, 81,123,237,141, 83,219,106, 45,159, +143, 34, 83,189, 0,192,199,199,231, 12,128, 46, 0,146, 89,135,118, 6,131,241,143, 54, 88,192,191,214, 59, 59,119, 37, 22, 85, +151,227,120,136, 91, 60,231, 58, 34,105,234,236, 37,145, 82,104,157,197,196,224,112,235,230, 77,146,146,146, 82,235,193, 42,214, + 59, 51,200,252,202, 20, 57, 69,237,126, 88,177,226,189, 53,107,214,244,172,152,138, 65, 46,151,199,232,180,218, 19,246, 42,213, +247,134,198,126, 39,234,187,118,222,157,146,146,124, 0,211, 66, 45,150, 31, 94,155, 52,229, 27,129,157,175,248,147, 47,215,232, +133, 2,129,241, 65, 78, 33, 86, 52, 1,108,173, 24,240, 88,110, 4, 98,138,221,185,120,116, 75, 92,178,112,225,172, 21,223,125, +215, 78, 97,103,215,213,204,113,193, 60,207,131, 90, 44,247,117, 58,221, 25,152, 76, 87,179,188, 39,127, 39,181,115,167,214,174, + 27,104,144, 55,210,120,104,207,180,219,181, 99,199,187,135, 14, 29,250,183,188,123,241,252, 15,201, 14,141,142, 91,147,247,170, +251,232,129,139, 40, 40,184, 88,227,219, 6,216, 90,132, 86,223, 20, 60, 63,217,217,217,121, 67,207,158, 61,229,209,209,209, 24, + 48, 96, 0, 94,122,233, 37,240, 60, 15, 74, 41, 52, 26, 13,182,111,223,142,111,190,249,230,126, 35,224,243,186,244, 12,192, 9, +217,193,131,253, 90,180,104,177,182, 54,227,242,200, 92,213,217,231,176,246,123, 83,118,159,115, 28,156, 54,250,237,175,154, 24, +213,185, 78, 46, 10,206, 51, 46, 54, 70, 96,237,189, 9,199, 16,141,229,230,246,246, 35,134, 13,123, 91, 40, 18, 69, 61, 26,209, + 72,239,198,199,223,168, 88,236, 25,173, 38, 30,171, 79, 89,162,244,225,220,115,172, 67, 59,131,193,248,199, 27, 44,145, 72, 84, + 80, 17,229, 17,137, 68, 5,201,123,167,188, 90,155,136,159,151, 87,207, 71,111,199,168,107, 45,194,138,207,183, 85, 42,205,163, + 25,218,171,157, 68, 84,252,196,254,245,201, 84, 66, 65, 65, 34,128,129, 64, 58,144,248,176, 59,139,184,221, 23, 31, 85,205, 83, +141, 39,228,177,227, 74, 74,210,242,243,207,225, 97,115, 78,181,157,113,197,254,146,146,186,210,249,100,222,207,103,102,170, 31, +229,187,250,188,123,214,157,119, 81, 61,207,143,232, 25,206,231, 63,141,236,162,162,189, 0,236,124, 15, 28,240, 56,124,224,192, + 43,179,102,206, 28,225,229,237, 29,228,234,234,234,108,111,111, 47,184,124,249,114, 10,167,215,255,208, 18, 88,119, 5, 40,183, + 70,211, 0,156, 8,201,200, 8, 31, 57,108,216,219, 68, 36,234, 92,213,184, 80,142,187, 16, 8,252,108,176, 98,246,246,122,223, +155,178,250,223,155, 89, 15,211,241, 37, 56,238, 75,220,185,243,204,247, 38,207,243, 95,248,248,248,104, 88,135,118, 6,131,241, +143,226,239, 92,135, 7, 64, 52,211,100,154, 47,138,230, 67,143, 2, 7,118, 62,153, 38,211,100,154, 76,243,249,107,254,163,215, + 34,100, 48,254,225, 47, 35, 22, 0,106,118, 38, 24, 12, 6,131, 81, 23, 4, 64,116, 13,149,137,213,163, 3, 8, 33,209, 79, 81, + 89, 29,103,154, 76,147,105, 50, 77,166,201, 52,153,230, 63, 75,179, 46,237, 23,102,116, 34,107, 34,100,154, 76,147,105, 50, 77, +166,201, 52,153, 38,107, 34,124,190,155, 0, 12, 6,131,193,192,194,133, 68, 0, 16, 2, 44, 20, 0, 59,133,192, 72,225,195,223, +159,158,145, 35, 73,181,147,208,190,251, 46,177,103,103,156,193,120,177, 97,125,176,254,131,120,121,121,249,123,120,120,252, 74, + 41, 37, 5, 5, 5,147,115,115,115, 51,216, 89,249,239,195,197,197,165, 39,199,113, 80,169, 84, 39, 94,196,252,133, 55, 33,195, +168, 0,205,254, 21,214, 70, 70,252,125,186,161,186,125,195,130,201,120,144,127,205,165, 69,120,220,141,123, 64,247, 88,123, 44, + 66,136, 96,104, 63,183,165, 0,176,247, 80,225,236,191, 99, 94, 44,111,111,239,166, 46, 46, 46, 71,132, 66,161,200, 98,177, 76, +139,137,137, 57, 80,179, 1, 26, 41, 4, 0, 55,155,221,115,156, 26,184,126,252,217, 44, 34, 54, 26,190, 85, 26,244,122,149, 64, + 36, 74,149, 74, 20,231, 57,129,237,161,172,252,126,241,213,125,127,199,142, 29, 53,174,174, 29, 17, 76,250,133,134,133, 13,106, + 29,105,147,188,244,251,118, 43,186, 6,186,138, 83, 50,111,217,173,220,144,241,171,155,179,207,160,247,222, 16, 29,144, 81,203, +184, 37,191,211, 50,118,151, 89,207,215,132, 52, 48, 1,145, 98,153,204,207,194,113, 30, 4,160, 66,145, 40,223,108, 48,100, 74, +128, 59, 31, 83,170,124,209, 53, 37, 50,153,175,133,227, 60, 0,224,191, 49,157,140, 58, 12, 86, 80, 80,208,117,129, 64,224, 91, +177,198, 95,213,197,106, 43, 62, 63,249,211, 98,177,100, 37, 36, 36,180,177,246,224,141, 27, 55,118,208,235,245,175, 16, 66, 94, + 5, 0, 74,233,102,185, 92,190, 61, 37, 37,229,169, 58, 18, 55,110,220,216,129, 82, 58,219,198,198,166,135, 94,175, 15, 7, 0, +185, 92, 30,167,211,233, 78, 18, 66,150, 62,141, 46, 33, 68,228,229,229, 53,210,214,214,182, 59,199,113,221, 41,165, 68, 36, 18, +157, 42, 47, 47, 63,153,155,155,187,131, 82,202,213, 87,211,219,219,219,198,197,197,229,203, 38, 77,154,140,121,251,237,183,139, + 27, 52,104, 16,178,112,225,194,107, 17, 17, 17, 91, 74, 74, 74,230,230,228,228,232,254, 27, 10, 7, 33, 36,200,211,211,115,179, + 88, 44, 22,102,102,102,118, 7, 0, 63, 63,191, 83, 70,163,209, 82, 80, 80,240, 42,165, 52,169, 62,122,110,110,110,182, 98,177, +184,131,173,173,109, 27, 91, 91,219, 46, 22,139,165,217,163,245, 19,239,106,181,218,179,102,179,249,186,217,108,190, 92, 88, 88, +168,253,111,185, 65, 8, 33,246,238,238,238, 27, 9, 33, 32,132, 4, 83, 74, 53, 47,218, 67,128, 10,208, 44, 62, 46, 33,164,210, + 68,133,135,214,114, 66,224, 95,205,190, 86, 27,172,254, 61,157,250, 14, 26,212, 66, 0, 0, 38,211,181,190, 0, 14, 62,111,115, +213,191,127,255,139, 63,252,240,131,179, 94,175,199, 7, 31,124,176, 57, 56, 56,248,231,251,247,239,207,169,237,123,246,246,246, + 51, 62, 95,244,147,226,209,179,204,157,231,121,247,220,220,204,224,196,132,152,190,137,137,177, 95,153,180,123, 46,155,168,112, +138,178,124,112,130, 53,233, 8, 11, 34, 3,135,140, 28, 54,224,243,207, 23, 96,204,168, 49, 13,227,226,244, 54, 62, 14,201, 82, +181,201,182,137,171,171,239,224,143, 62, 89, 66, 46, 95, 58, 61,120,199,246, 53, 39, 63,154, 68,122, 48,147,101,213,189, 72,190, + 16,137, 58, 56,135,134,118, 25,181,119, 47,236,252,252, 68, 34,153, 76, 0, 0,156,193,224, 87,150,153,233,181,109,240,224,246, + 11, 9, 57, 61,159,210, 43, 76,243,255, 95,147, 97,165,193, 18, 8, 4,190, 55,111,222,116,183,181,181,197, 35,243, 3,139,197, + 2,139,197, 82,185,168, 48,165,180,242, 39,199,113,232,214,173,155, 85,111,176, 94, 94, 94, 61, 0,188, 22, 17, 17, 49, 98,246, +236,217,146, 78,157, 58,193, 98,177,224,228,201,147, 81, 43, 86,172,248,209,219,219,123, 55,128,117,185,185,185, 39,172,125,195, +245,242,242,234, 99,107,107,187,233,211, 79, 63,117,136,138,138, 18,121,121,121, 1, 0, 10, 10, 10, 58,156, 63,127,190,205,130, + 5, 11,166,121,121,121,141,205,205,205, 61, 98,237,201,241,245,245,141, 8, 14, 14,222,217,175, 95, 63,223, 54,109,218,200,155, + 54,109, 10, 74, 41,110,221,186,245,122, 98, 98,226,232,131, 7, 15,206,247,245,245,125,217,218,245,212, 8, 33, 36, 40, 40,104, +130,167,167,231,151, 51,103,206,108, 48,116,232, 80,105,108,108,108,105, 96, 96, 32,217,189,123,183,219,159,127,254, 57,237,151, + 95,126, 25,217,164, 73,147,185, 73, 73, 73,235,105,117,235, 24, 61, 65,112,112,240,117,129, 64,224,107,141, 1, 38,132,128,227, + 56,171, 76, 48, 33,164,101,163, 70,141,182,159, 59,119,174, 81, 90, 90,154,101,232,208,161, 27, 0,224,228,201,147,145,102,179, +153,244,238,221,251, 16, 33,228, 21, 74,233, 45,107,242,238,227,227,211,220,205,205,109,223,208,161, 67, 27,248,251,251, 43,124, +125,125,137, 92, 46,135, 80, 40, 68, 89, 89,153,119, 98, 98, 98,244,173, 91,183,116, 23, 46, 92, 40,241,241,241, 25,156,157,157, +125,167, 30, 15,222,151,220,221,221,199,137,197,226, 8,142,227,124, 0, 64, 36, 18,101,155,205,230,216,130,130,130,141,148,210, +139, 79,123,131,120,120,120,252,248,229,151, 95,186, 22, 20, 20,208,197,139, 23,255, 8, 96,194,139,250, 48,216,188,101, 7,174, + 95,187, 2, 0, 18, 66, 8,121,178,252, 17, 66, 72,179, 96, 72,222,127,127, 38,218,180,109,143, 87,199,140,172, 83,115,232, 0, +215,207,165, 66,145, 75,185,209,112,165, 72, 37,216,231,239, 46, 29, 54,118,100,155,100, 0, 56,124, 40,102, 88,251,246, 13,206, +187, 58,242, 67, 20, 82, 89,123,163,133, 43,222,251, 87,209,188,250,152, 41, 79, 79,207, 35,246,246,246,138,210,210,210,188,226, +226,226,149,253,251,247,255, 98,249,242,229,206,201,201,201,200,204,204,196,107,175,189,102,151,157,157,253,182,191,191,255,165, +140,140,140, 26, 35, 89, 26,141,230,251, 47, 23,205,156,103,239,224, 44, 84,216,216,194,206,222, 1,141, 26, 5,163,109,187, 40, + 68,247, 26,140,228,228,196, 14,219,183,174,185, 41,204,221,249,181, 69,218,234, 11,165,178, 81,141,207,165,240, 16,210,181,194, + 92,205,155,183, 0,247, 18, 18, 52,105,169,130,119,254,218, 43, 82,244,235, 25, 42, 51,154,202,210, 46, 95, 58,221,168, 67,199, +110, 0,208,102,199,246, 53, 39, 23,142, 37, 61,231,111,122,241,204,251,243, 52, 87,159,139,197, 19,250, 44, 95,238,222,106,218, + 52, 73, 89,106,170, 41,121,213,170,242,252,179,103, 45, 34,153,140,250,245,237, 75,220,186,119,151, 79,187,123, 87,114, 97,241, +226, 46, 95, 73,165,129,159, 24,141,155,152,230,255,159, 38,163,126, 6, 11,182,182,182,216,182,109, 27,196, 98, 49, 68, 34, 17, +196, 98,113,141,159,253,253,253,173, 49, 65,195,195,195,195,127,154, 57,115,166,199,160, 65,131,224,236,252,248, 42, 27, 3, 7, + 14, 68,255,254,253, 37, 41, 41, 41,163,119,236,216, 49,122,195,134, 13,121, 94, 94, 94,239,228, 62, 90,176,185,150,202,187,123, + 96, 96,224,238, 45, 91,182,216,232,116, 58,156, 62,125, 26,165,165,165,144, 74,165,240,245,245, 69,231,206,157, 69,167, 79,159, +110, 48,122,244,232,221, 62, 62, 62, 3,179,179,179, 79,213,149, 86, 79, 79,207, 54,110,110,110,103,126,251,237, 55,121,104,104, + 40,121,240,224, 1, 90,180,104, 1, 0, 40, 46, 46,198,192,129, 3,229,195,134, 13, 11,122,235,173,183, 46,123,122,122,118,205, +203,203,187, 94, 71,222, 91,183,104,209, 98,125,223,190,125,189, 63,254,248, 99, 7, 59, 59, 59,164,165,165,229,122,122,122, 6, + 87,152,159, 33, 67,134, 72,123,245,234,229,181,114,229,202,239, 15, 30, 60,248,129,151,151,215,132,220,220,220, 27,181,233, 10, + 4, 2,223, 27, 55,110,184, 43, 20, 10,228,231,231, 99,243,230,205,120,251,237,183, 33, 20, 10, 81, 80, 80,128,237,219,183,227, +157,119,222,129, 80, 40,132, 74,165,178,202, 4,219,218,218, 70,183,104,209,226,247,147, 39, 79,250, 58, 57, 57,193,219,219, 91, +240,217,103,159, 69, 4, 6, 6,218, 52,108,216, 80,152,155,155,139,221,187,119, 7,142, 27, 55,110,159, 92, 46,127, 93,175,215, +215,217,116,230,226,226,242,199,250,245,235,253,111,223,190,141, 85,171, 86,161,164,164, 4, 82,169, 20, 78, 78, 78,240,244,244, + 68,112,112, 48,153, 54,109,154,162, 71,143, 30,138, 5, 11, 22,252, 1,160,165, 21, 15,221, 22,238,238,238,191,142, 30, 61, 58, +112,225,194,133, 78,158,158,158,168,120, 33, 80,169, 84,190,105,105,105, 29,230,205,155,247,178,135,135, 71, 74, 65, 65,193, 20, + 74,233,237,122, 62,212, 91,246,236,217,115,224,208,161, 67,133,185,185,185,216,184,113,227, 64, 66, 72, 75,107, 77,229,255, 26, +215,175, 93,193,228,183,222, 43,243,246,243,147,252,185,127,235,144,178,178,223,206,219, 9,156, 68, 0, 80,198, 43,185, 78, 29, +236, 58, 15, 26, 60, 90,210,127,192,208,178,223,126,249,222,206, 26,131, 37, 21,138, 92,182,109,154,154,121,246,194,253,102, 71, +142,167, 69, 15, 29, 28, 45, 16, 73, 66,130, 0, 96,214,204, 55,165,123,247, 31,255,185, 79,116,195,220, 46,157,130, 51, 71,141, + 93,229, 87, 31,115, 21, 24, 24,120,250,200,145, 35, 30, 82,169, 20,165,165,165, 46,107,215,174, 93,214,190,125,123, 65, 82, 82, + 18, 18, 18, 18,144,154,154, 10,149, 74,133,118,237,218,217,197,199,199,175, 4, 80,163,193, 42,212, 13,255, 50,208,189,232, 7, + 31, 23,231, 70,122,147,202,221,194, 21,135,157, 60,126,187,249,174, 29,229,173,220, 61,125,131, 71,143,158,140,143,230, 44, 17, +239,217,181,126,222,153,179, 71, 1, 52,170,121, 6,127,138,151, 62,153, 59, 7,106,141, 1, 99,199,188,137,113, 99,222,116,161, + 48,122, 81,139,222,214,168, 43,117,114,148,196, 29, 88,191,117,199, 48, 0,190, 85, 76,214, 9,102,178,106,230,115,145,168,253, +192,159,126,114,139,120,227, 13,217,237,133, 11,181, 69,103,207,234,154,244,239, 95,218,106,234, 84, 3, 0,104, 82, 83, 37,247, +230,207, 87,184,117,233, 98,211,113,246,108,103,139,209,232,185,136,144,118,159, 81,122,181,190,154,141,198,140,177, 44,221,189, +187,237,229,197,139,187, 97,209, 34, 97,247, 86,173,110,205,253,229,151,236,103,209,124,158,233,204, 57,115,198,160,109,214, 12, +145, 35, 70, 20,251,184,184, 24,158,103,222,159, 37,157,140,106,234,144,154,130, 36, 33, 33, 33,249,137,137,137,238,187,119,239, +174,211, 92,137,197, 98,120,121,121, 33, 42, 42,170, 32, 38, 38,198,163,150,135, 98,102,102,102,166, 47,199,113,144, 74,165,181, + 38, 76,163,209, 32, 38, 38, 6,163, 70,141,202,202,201,201,169,241,193,219,160, 65, 3,123,103,103,231,228, 83,167, 78,185,198, +197,197,225,250,245,235, 8, 12, 12,132,179,179, 51,196, 98, 49,204,102, 51,212,106, 53, 66, 66, 66, 96, 99, 99,131,254,253,251, + 23,149,148,148, 4,150,148,148,212,248, 32,107,216,176,161, 76, 44, 22,223,223,181,107,151, 95, 68, 68, 4,174, 94,189, 10, 63, + 63, 63,120,122,122, 2, 0, 82, 83, 83,113,254,252,121,244,239,223, 31,177,177,177,152, 58,117,106,166,217,108, 14, 78, 75, 75, + 51,212,216,100, 16, 22,150,187, 99,199,142,172,208,208, 80,189, 86,171, 21,228,231,231,139,207,158, 61,203,105, 52, 26, 59,149, + 74, 37, 86, 42,149, 98,181, 90, 45,210,106,181, 98,129, 64, 32, 49, 24, 12,226,203,151, 47, 11,139,139,139, 29,106, 59, 79,161, +161,161,249, 9, 9, 9,238,251,247,239, 71,100,100, 36,118,239,222,141, 89,179,102,225,194,133, 11,240,243,243,195,142, 29, 59, + 48,123,246,108, 36, 38, 38,194,213,213, 21, 61,122,244,168,245, 26, 1, 64,147, 38, 77, 30,196,196,196, 4, 73, 36, 18, 36, 39, + 39, 35, 43, 43,171, 98, 61, 59, 20, 22, 22, 34, 41, 41, 9,217,217,217,104,210,164, 9,198,140, 25,147,148,149,149,213,164,174, +130,214,186,117,235,194, 19, 39, 78,184, 54,111,222, 28,249,249,249,112,114,114,130,163,163, 35,156,156,156, 42, 63, 7, 6, 6, + 98,230,204,153,104,222,188,121, 65, 90, 90,154, 71, 93,230, 39, 50, 50,242,200,137, 19, 39, 92, 29, 28, 28,144,151,151, 7,181, + 90, 13,145, 72, 4,133, 66, 1, 87, 87, 87,200,229,114, 0,192,253,251,247, 49, 96,192,128,162,228,228,228, 62,214,154, 35, 66, +136,192,195,195, 35,225,206,157, 59,193,148, 82,100,100,100, 32, 49, 49, 17,111,189,245,214,125,189, 94, 31,250, 34,173,169, 87, +165, 95,149,100,194,196,201,146,161,131,135,148,223,186,126,152,183,193, 25,180,107,105,163, 4,128,171,183,116, 78, 58,116, 69, +203, 54,125, 5,123,247,239, 83,172, 95,247,155, 24, 60, 60, 64,144, 24,127,143, 46,170, 73,123, 96, 31,167,241,179,223,235,219, +172, 75,167, 46, 34,181,154,122,254,190, 97,117,187,244,148,100, 15, 0, 8,104, 28,152, 63,105,252,155, 87, 29, 28, 72,222,217, + 11,103,185,165,223, 31,190,123,224,136,114,131, 21,145,229, 64,127,127,255, 75,127,252,241,135,171,155,155, 27, 28, 29, 29,161, +213,106, 97, 50,153, 16, 31, 31,175,223,182,109,155,217,193,193,193, 62, 47, 47, 15, 74,165, 18, 34,145, 8,151, 46, 93,202,200, +203,203, 11,120, 82,171,162, 15, 22, 0,188,213,175,153, 56,172, 71,176,179, 68,198,217,216,136,239,121,129, 88,100,132,218,121, +156, 60,121,169,249,169, 51,231, 94,237, 63,112,148, 91,199,142,221,177,228,171,143,204, 25,121,249,173,148,229,131, 19,170,235, +131,213, 44,152,244, 24, 58, 98,216,200,207, 63, 95,128, 5,243, 22,226,192,254,189, 42, 59, 91,129,193,193, 73,236,216,165, 67, + 39,253,204,183,135,100,150,151,101,249, 45,251,121,245,152, 94,125, 70,250,118,232,216, 13,151, 47,157,198,142,237,107,174, 75, + 44,102,214, 92,248, 4, 11, 9,113,118, 10, 12,156,242,238,253,251,146,219, 11, 22,148,113, 57, 57,165,109,102,204, 40,170,110, +223,172, 99,199,108,165,222,222, 14,206,131, 7, 55,248, 62, 32,128,154, 11, 10,126,173,174, 15, 81,117,154, 87,189,188,156,246, +156, 58,213,147, 23,137,186,190, 61,125,186, 77,116,116, 52,212,106, 53, 14, 28, 56,128, 45,155, 55, 27, 60, 61, 60, 98,156,174, + 93,187, 25,152,155,251,169,181,154,109,102,204, 40,178, 88, 44,100,234, 87, 95,245,186,151,153,217,163,160,184,184, 33, 0,184, + 59, 58,102, 70,248,250, 94, 95,190,105, 83,226,143,141, 26,241,214,166,115,219,133, 11, 30,135, 10, 11,223,112,114,114,178, 41, + 44, 42, 18,201,164,210,226, 86, 77,154,236,248,122,250,244,211,198,155, 55, 37,114, 95, 95, 7,199,129, 3,235,157,247, 54, 51, +102, 20,169,202,203, 69,115,127,248,161, 83, 78,113,113, 67,173,209,216, 68, 85, 86,230,201,153, 76, 2,123, 27,155,226,128, 38, + 77, 10, 52, 39, 78,228, 6,148,149,189,183, 66,171, 45, 96,165,242, 25, 35, 88,132, 16, 80, 74,173,138, 94,137,197,226,199,250, +104,213,130, 68, 40, 20,226,234,213,171, 40, 40, 40, 64,100,100, 36, 26, 53,106,244,216, 14,201,201,201, 56,120,240, 32,148, 74, + 37, 90,183,110, 13, 0,146,218, 4,237,237,237,223,159, 51,103,142,147,193, 96,192,245,235,215,209,166, 77, 27,200,100, 50, 72, + 36,146,199,204, 95, 65, 65, 1,194,195,195, 49,117,234, 84,199, 31,127,252,241,125,212,178,134, 28,165,116,250,232,209,163,221, + 35, 34, 34, 0, 0,153,153,153, 21,105, 1, 0,184,185,185,225,214,173, 91,104,211,166, 13, 60, 60, 60,208,175, 95, 63,247,125, +251,246, 77, 7,176,180,198,140, 75, 36,130,208,208,208,182,143, 34, 68, 16, 8, 4,247, 28, 28, 28,220, 60, 60, 60,108, 29, 28, + 28,254, 45,143,107,215,174, 85, 74,165, 82,179, 53, 39, 53, 47, 47, 15, 17, 17, 17, 80,169, 84, 0, 0,173, 86,139, 38, 77,154, + 64,173,126,216,229,204, 96, 48,192,219,219, 27, 58, 93,237, 93,187, 90,180,104,177, 32, 52, 52,180,119,183,110,221,100, 98,177, + 24,183,111,223, 70,171, 86,173,176,109,219, 54,248,251,251, 67,161, 80,224,254,253,251,136,140,140,196,153, 51,103,224,230,230, +134,240,240,112, 89,235,214,173,207,149,148,148,156, 74, 75, 75, 91, 80, 75,164, 77, 96,103,103,135, 51,103,206,224,143, 63,254, + 64,106,106, 42,114,114,114, 96,111,111,143,150, 45, 91, 34, 44, 44, 12, 47,189,244, 18,238,223,191, 15, 82, 71, 97, 34,132,120, + 6, 7, 7, 31,184,122,245,170, 43,165, 20, 27, 55,110, 68, 89, 89, 25,140, 70, 35, 4, 2, 1,228,114, 57,156,157,157,209,163, + 71, 15,184,185,185, 33, 56, 56, 24,219,183,111,119,237,215,175,223,193, 71, 17,168,188,186,206,169,179,179,243,123,243,231,207, +247,115,119,119, 71, 90, 90, 26, 84, 42, 21, 60, 60, 60,208,173, 91, 55,159,227,199,143,191, 7, 96,249,139,242, 16,168,232,208, + 78, 8, 33,127,238,223, 58,196,223, 75,218,172, 93, 43, 77, 64,204, 13, 81,208,193,227, 15,154, 63, 60, 31, 1,119,218,181,214, + 36, 93,189,126, 56,253,207,253, 91,175,220,189,135,125,214, 52, 97, 23,169, 4,251,142, 28, 79,139,110, 30, 30, 37,252,225,231, +249, 67, 38, 79,234, 35,107,224, 28, 69,212, 5,219,113,225, 74, 76,192,103, 11, 62,118, 95,180, 96,241,159, 71,142,167, 89,138, + 84,130, 47,173, 73,111, 80, 96,131, 31,119,173, 22,185,106,140, 63,227,214, 21, 71, 64,220, 17,141, 3,155, 66,173, 86, 67, 46, +151,203,199,140, 25, 99,153, 51,103, 78,185,131,131,131, 66, 36, 18,225,214,173, 91, 5, 2,129,160, 79, 93,186,122,119,103,106, + 49,153, 57, 42, 21,242,148,216,235,136,165, 68, 26, 27,159,130,174, 93,251,229,183,109,211,234,171,197,223, 46,255, 36, 48, 48, +196,109,204,216, 41,226,165, 75, 63, 93, 5, 32,170, 58,157,187,247,233,201,176, 32, 98, 3, 96,192,231,139, 22, 32, 57,249,190, +243,228,215,148, 11, 69, 50, 27,239,208,128, 78,246,171,254, 56,213,183, 73,147, 70, 13, 39, 79,124,253,175,223,214,254, 49,160, +106, 36,107,235,150,223,246, 17, 66,122, 90,115,110,255, 65, 52, 31,119,224, 0,202, 50, 50,204, 37,231,206,233,123,254,244, 83, + 81,235,241,227,151,155, 57,206,181,162,174,170,248, 73, 8, 1,120,158,136,150, 46, 21, 80,111,111,152,157,156, 94,251, 24,104, + 90,151,230, 98,179,121,248,208,150, 45, 7,252,190,105, 19, 2, 2, 2, 42, 53, 29, 29, 29, 49,125,250,116, 76,155, 54, 77,118, +231,206,157,118, 7, 15, 30,108,183,225,231,159, 61, 62, 6,134, 91,147,206,179,183,111, 59,127,248,253,247,115,155, 69, 68,248, +175,248,233, 39, 89, 69,125,151,150,150, 22,252,211,143, 63, 6,244,136,142,206,255,232,195, 15,215,221,156, 53, 43, 28, 15,151, +100,171, 81, 51,239,236, 89,227,161,146,146, 55,118,236,220,233, 20, 18,242,176, 27,100, 82, 82,146,251,239,191,255,254,102,143, +183,223, 30, 59,107,244,232, 79,123, 60,120,160,116, 40, 44,148, 13,252,241, 71,209,214,145, 35,235,212,172, 72, 39, 0,140,152, + 61,251,253,246,157, 58,133,245, 27, 51,166,129,183,183, 55,177,177,177,129,201,100, 66,126,126,190,115, 98, 98, 98,208,113,165, + 82,125,244,214,173,141,120,180,136, 59,227, 25, 12, 22, 0, 88, 44, 22,171,204,149, 72, 36,250, 87,225,182,230,160, 34, 17,188, +189,189, 81, 84, 84,132,216,216, 88, 4, 4, 4,192,108, 54,227,200,145, 35, 80,169, 84, 16,139,197,144, 72, 36, 48,153,234, 94, + 27,214,214,214, 54,186, 75,151, 46,162,139, 23, 47, 34, 48, 48, 16, 54, 54, 54,149,233,170,216, 36, 18, 9,188,188,188,160, 86, +171, 17, 21, 21, 37, 94,187,118,109,116,109, 6,203,206,206,174,255,144, 33, 67, 42, 67,108,101,101,101, 16, 10,133,149,102,165, +172,172, 12, 37, 37, 37, 80, 42,149,208,235,245,104,222,188,185,244,228,201,147,253,107, 51, 88, 85, 41, 47, 47, 47, 43, 40, 40, +112,138,138,138,114, 94,183,110, 93, 98,199,142, 29, 67,170,254,255,244,233,211,122,189, 94, 47,150, 74,165,117,174,115, 71, 8, +193,166, 77,155, 42,207,125,118,118, 54, 86,173, 90, 85,249,255,251,247,239,227,135, 31,126,168,156,151,163,182,107, 20, 26, 26, +218,111,227,198,141,109, 54,108,216, 80, 42, 20, 10,145,152,152,136,205,155, 55,131, 82, 10, 55, 55, 55,148,151,151, 35, 63, 63, + 31,167, 78,157, 2,199,113,176,179,179,131,143,143,143,124,250,244,233,157, 23, 46, 92, 40, 6,176,160,150,178,100, 17, 10,133, + 8, 8, 8,192,188,121,243,160,215,235, 33,145, 60,244,149,106,181, 26, 74,165, 18, 55,111,222, 68, 90, 90, 26,234,170, 92,228, +114,249,203, 27, 54,108,112,151, 74,165,208,233,116,208,104, 52,200,204,204, 68,122,122,186,190,160,160,128,179,183,183, 23, 4, + 4, 4, 8,100, 50,153,108,232,208,161,164,194,104, 14, 28, 56,208,101,227,198,141,163,234, 50, 71,132, 16,183,102,205,154,125, +242,230,155,111,202,171,152,110,228,229,229, 97,248,240,225,138,139, 23, 47,206, 33,132,108,166,148, 22,190, 72, 15, 3, 74, 41, + 45, 43,251,237,252,217,125, 63, 53,139,185, 33, 10, 50, 26, 75, 59,246,234,255,158, 8, 0, 46,158, 89,219, 49,230, 70, 44,108, + 8,151,126,232,232,210,243,118,118,147,105, 93, 17,192,254, 61,157,250,250,187, 75,135, 13, 29, 28, 45,248,125,195,234,118,147, + 39,245,145,185, 55, 94, 77, 0,192, 89,226,139,151, 44,179, 4,122,131, 86,254,251,134,213,237,134, 14,238,127, 37, 53, 37,125, +249,128,104,231, 61, 7, 79, 40, 15,215, 22, 33,244,114, 23,249, 56,219, 23,193,217,190, 21, 2, 2,237,113,243,214, 29,236,219, +125, 14,193,161,157, 97, 48, 24,192,113,156,237,160, 65,131,202,119,236,216,161, 47, 46, 46,214,152, 76,166,174, 57, 57, 57,247, +234,202,127, 86, 86, 60, 31,226,217,193, 36,177,145,113, 26,149,164,252,227, 79,119,142,108,221,190,119, 27,103, 47, 31,177,155, + 45,255,103,247,174, 81,155,183,108,250,117,198,172, 15, 22,161,101,203,142, 29,239, 62, 56, 20, 6, 32,166, 90,211,154, 68, 15, + 68, 4, 19, 46,249,193,131, 1,233,105,105, 89, 77, 61, 60,141, 73, 74,106,126,239,227,213,189,162,186,190,220, 60,168, 89, 23, +105, 92,252, 25, 50,243,237, 55,183, 44,251,121,245,152, 10,147,117,246,236,145,174, 11, 22,164, 73, 1, 24, 88,245,244,232,229, + 84, 38,243,181, 11, 8, 16,165,174, 91,167, 11, 28, 52,168, 20, 0,204, 28,231,122,233,242,101, 71,133, 66, 1, 74, 41,204,102, +243, 99,125,132, 43,250, 5, 71,119,235,230, 97,141,102,230, 47,191, 52,127,251,237,183,145,151,151, 7,142,227, 32, 22,139,159, +124,102, 67,163,209, 96,196,136, 17, 88,187,114,101, 7,107, 52, 45, 22, 11,249,240,251,239,231, 78,127,239,189,160,177, 99,199, + 10,170, 62,123,157,156,156,240,219,234,213,210,117,235,214,249, 46,249,227,143,215,122,201,100,201,117,105,106,194,195,225, 20, + 19, 99, 83, 97,174, 0, 32, 40, 40, 8,139, 23, 47,150,141, 30, 61, 90, 58, 97,194,132,239,226, 66, 66,190, 95,144,158,254,192, +165,105, 83, 7,169, 76,230,107,237,249, 4,128, 50,163, 49, 98,254,231,159, 59, 95,185,114, 5, 57, 57, 57, 21,115, 93,129, 16, +130,200,200, 72, 50,114,228, 72,199, 14,109,218,180, 99, 37,242, 57, 69,176, 44, 22,203, 99, 70,165, 46,131, 85,239,246, 73, 66, +224,229,229, 5,147,201,132, 53,107,214, 64, 34,145, 84, 86,186, 0, 96, 52, 26,235,212,208,235,245,145,158,158,158, 80,169, 84, +104,218,180,233, 99,145, 43,137, 68, 2,145, 72, 4,137, 68, 2,153, 76, 6,131,193, 0, 31, 31, 31,232,245,250,200, 58, 12, 80, + 75, 7, 7,135,202,138,213, 96, 48, 84,154, 43,165, 82, 9,165, 82, 9,163,209,136,210,210, 82,148,149,149, 65,169, 84, 66,163, +209,180,178, 38,207, 60,207, 35, 54, 54, 54, 41, 36, 36,164,165, 80, 40,132,157,157,157,173, 86,171,173,236, 59, 84, 82, 82,130, +245,235,215,107,199,143, 31,239,122,229,202, 21,171, 22, 18,126,231,157,119, 32,147,201, 80, 94, 94,142,149, 43, 87,226,221,119, +223,133, 68, 34,129, 70,163,193,170, 85,171, 48,115,230, 76,136, 68, 34, 24,141, 70,108,219,182,173,230, 72, 70,124,124,234,229, +203,151, 91,181,110,221,218,121,207,158, 61,133,189,122,245,114,235,211,167, 15,108,108,108,160,211,233, 96, 54,155,209,161, 67, + 7,132,134,134,162,160,160, 0,135, 14, 29, 42, 10, 14, 14,118,189,114,229, 10,159,151,151,151, 94, 87,229, 93,213, 96, 91, 44, + 22,228,231,231, 67,169, 84,162,176,176, 16, 57, 57, 57,200,202,202,130, 72, 36, 66, 93, 47,239, 46, 46, 46, 35, 34, 34, 34,132, + 0, 96, 99, 99,131,150, 45, 91, 98,238,220,185,156, 78,167,123, 5,192,161, 71,187,245, 91,189,122,245,158,243,231,207,139,188, +189,189,145,144,144, 0, 55, 55, 55,145, 92, 46,175,211, 96,121,122,122,174,253,243,207, 63, 27, 84,152,234,138,178, 90, 94,254, +240,114, 12, 31, 62,188,193,134, 13, 27,214, 2,232,255,162, 61, 16,236, 4, 78,162,118, 45,109,148, 7,143, 63,104,222,171,255, +123, 34,175,160,249, 0,128,151, 0,209,177,131,223, 55,239, 31,221,100, 71, 69,191,172,218, 24,218,207,109,233,160, 65, 45, 4, + 99, 71,182, 73, 22, 73, 66,130, 54,109,248,222,163,129,115,212,191, 30, 18,194, 6,176,181, 1, 66,131, 44,130, 75, 91,147, 61, +102,190, 23, 98,220,188,238,141,228, 77, 59,174, 71, 75, 36,183,123, 0,152, 89,147,118, 92,162,121,191, 74,219,160,153,163,228, + 52,129,124, 48, 90,181, 12,134,155,155, 18, 43,127,219, 0, 31,255, 78, 48, 24, 12,112,112,112, 80, 0, 48,153, 76,166, 77,214, +152, 43, 0, 56,113, 66,201,135,135, 43,141, 66, 13,207,189,253,238,210, 97,189,250, 13, 14,235,209, 35,154, 63,122,236,168,169, + 83, 43, 83,110,143, 30, 29,243, 79,157, 62,123, 63, 47, 47, 59, 56, 52,180, 57,238, 37,222,234, 11,144, 88,160,250, 2, 27,123, +159, 30, 14, 10, 34,167,182,109,155,204,235,248,155, 54, 95,124, 25,211,111,192,128, 9, 17, 93,162,186,240,199,142,159, 52, 74, + 81,116,215,174,243, 75,217, 19, 70,191,178,103,219,238, 61,189, 79,157, 60,208, 68,165,206, 63,240,237,207,148,153,171,170, 47, +103, 28,231, 33,146,201, 4,133,167, 78,113,145,147, 38, 85,158, 27,133, 66,129,125,251,246, 65, 42,149, 86,110, 18,137,164,242, +179,135,135, 7, 8,165,130,250,104,230,230,230, 34, 47, 47, 15,142,142,142,112,115,115, 67, 94, 94, 30, 46, 94,188,136,123,247, +238, 65, 44, 22,163,111,223,190, 16,212, 80,111, 62,169, 57,245,171,175,122, 53,109,214,204,255, 73,115,133,135, 5, 19, 37, 37, + 37,136,142,142, 22,156, 56,113,194,243,210,131, 7,131, 1,108,170, 85,115,240,224,226,194, 19, 39,170, 61,118, 68, 68, 4,217, +183,111,159,108,204,232,209, 51, 22,254,248,227,207, 95,254,244, 83,166,133,227, 60,235,147,119, 66,136,128, 16, 2, 63, 63, 63, +148,148,148,160,172,172,172, 34,224, 0,103,103,103,152,205,102,240, 60, 47,102, 37,210,122, 4,117,153, 1,107,204,149, 88, 44, +134, 64, 32,120, 42,147, 85, 53, 66,240, 36,214, 24,172,138,202, 79, 46,151, 63,118,131, 85,152,181,170,159, 43,222,118,172, 64, +168, 86,171,177,107,215,174,202,130,102, 52, 26,161, 82,169,160, 84, 42,161, 82,169,160,215,235,145,154,154,138,173, 91,183, 34, + 39, 39, 7, 66,161,208,170, 73, 91,147,147,147,175, 55,106,212,168,101, 69,229,221,189,123,119,223,179,103,207,230, 84,156,131, + 79, 63,253,180,168, 67,135, 14,174, 85, 43,247, 58, 19, 43, 20,226,226,197,139,208,233,116,160,148, 66, 34,145, 32, 49, 49, 17, + 28,199,129,231,121,136, 68, 34, 20, 22, 22,214, 25,193,138,141,141,157,248,250,235,175,175,152, 52,105,210,169, 15, 63,252,240, + 88,247,238,221, 51, 9, 33, 48,153, 76,112,112,112,128,167,167, 39, 18, 19, 19,161,215,235,241,254,251,239,103,108,216,176,225, +248,202,149, 43, 79,173, 89,179,102, 69, 86, 86,214,235,245,185,222, 28,199, 65,171,213,162,180,180, 20, 37, 37, 37, 80,171,213, +208,235,245, 79, 85,134,162,162,162,112,224,192, 1, 97,207,158, 61,127, 15, 8, 8,200, 11, 8, 8,200,235,217,179,231,239,251, +247,239, 23,250,248,248, 32, 45, 45, 13,215,175, 95, 71,105,105, 41, 40,165,181, 30, 64, 44, 22,119, 31, 63,126,124,103,127,127, +127, 98, 50,153, 96, 48, 24, 96, 48, 24, 96, 50,153,192,243, 60,210,210,210,208,172, 89, 51, 65, 64, 64, 64, 71, 66, 72,119,246, + 8,177, 30,117,193,118,208,242,159, 64, 13, 91,193,171,127,134,246, 41, 39, 35, 41, 45, 45,253,242,173,143, 85, 5, 22,195, 45, +196,199,156,134,166,220, 7,190,141, 39,226,205,215,187,227,234,229,163, 40, 41, 41, 65,124,124, 60,186,118,237, 42, 33,132,212, +171, 92, 30, 59,118,217,242,202,184,119, 95,238,222,123,112,155,232,232,254,220,145, 35,199,141, 55,174, 29,185,222, 36,200,185, +128,242,101,249, 78, 78,138,155, 15, 30,220, 69,112,211, 48,152,204,230, 40, 96, 65,173,229, 41, 41,137, 26,255,250,203,203,242, +202,164,216,113,125,250,190,214,162,103,207, 62,230, 35,199,254,180,156, 59,181,243,102,159, 62, 65,103,190,254,126,187, 95,137, + 49, 52, 92,238,224,121,176, 99,103, 69,212,212, 87,253, 39,179,146, 82, 67, 52, 64, 46,231,241,232,185, 88,209,133,165,170,185, +122,114,179,166, 78,170,170, 89,181, 46, 82, 42,149,184,127,255, 62,190,253,246, 91,220,186,117, 11, 22,203,195,174,118,117,117, +179,168,170,153,152,145,209,227,221,119,223,149, 85,103,174,138,139,139, 81, 84, 84,132,236,236,108, 12, 28, 56, 80, 82,226,236, +220,186, 46, 77, 31,119,119,131, 66, 46,207,191,119,239,222,191,165, 87,173, 86, 67, 42,149,226,199,159,126,146, 28, 73, 72,120, +235,200,201,147,174,245, 57,159, 85,235, 82,119,119,119, 4, 5, 5,161, 85,171, 86,136,140,140,132, 92, 46, 71, 92, 92, 28,126, +253,245, 87, 8, 9,225, 88, 73,124, 78, 17,172,250, 24,172,250, 24, 2,107,177,166,137, 80, 46,151,199,228,231,231,119,242,241, +241, 1,199,113,149,102,234,201, 38,194,138,104,199,221,187,119, 33,151,203, 99,106,211, 84, 40, 20, 49, 66,161,176, 99,187,118, +237,176,123,247,110,156, 58,117, 10, 41, 41, 41, 40, 47, 47,135,193, 96,128, 78,167, 67, 92, 92, 28,120,158, 71, 68, 68, 4, 28, + 29, 29,161, 80, 40, 98,234, 74,171, 86,171,205, 21,139,197, 33, 54, 54, 54,255,106,238,240,242, 66,113,113, 49,111, 54,155,177, +126,253,122,181,167,167,167,173,141,141, 13, 42,230, 31,179,198, 92, 22, 20, 20,192,215,215,183,178, 15,150, 70,163,129,187,187, + 59, 76, 38, 83,101, 4,206,222,222,190, 78,115, 73, 41,213, 3,152, 85, 69,187,237,200,145, 35,183,108,219,182,173,241,241,227, +199,113,229,202, 21,184,185,185,225,171,175,190, 74, 73, 75, 75, 27, 67, 41,189,246,188,175,185, 53, 6,171,184,184,120, 87, 76, + 76, 76,199,118,237,218, 85, 22,186,238,221,187,147,238,221,187,187, 86, 13,233, 23, 22, 22,226,234,213,171, 56,126,252, 56, 8, + 33,184,127,255,190, 69,167,211,109,169,229,216,146,128,128,128,117,115,231,206,181,227, 56,174,178,108,219,216,216, 64, 46,151, + 67, 34,145, 64, 40, 20, 34, 45, 45, 13, 67,134, 12,113,252,233,167,159,214, 18, 66,130, 40,165,166, 23,229,129, 80,198, 43,185, +171,183,116, 78,206,206, 1,119, 46,158, 89,219,241,165, 71,207,136,139,103,214,114,206,206, 1,119,174,222,210, 57,117,241, 83, +114,118,117,232,236, 61, 84, 56,219,100,186,214,247,240,161,152, 97,179,102,190, 41, 13,104, 28,152,127,225, 74, 76,192, 75,150, + 89, 2, 91, 27, 64,171, 3, 74,148, 64, 66,146,144, 15,104, 28,152,127,237, 70,162,244,187,101,107, 2,203,117,198, 61, 7, 79, + 40, 15,215,166,157,149,149,165,247,241,241, 25, 58,107,161,226,204,232, 49,238, 82,137,220, 15,154,210, 27,104, 24,224,130, 87, + 70,132,224,231,223,110,192,193,161,193,195, 8, 6, 33,182,214,230,189,168,168,136,236,218,122,110,210,248,215,222,236,208,167, +247, 0,238,240,145,191, 68,167,142,238,191,184,246,183, 79,246, 80,161, 86, 65,168,198,198,207,223,247, 78,106,202,189, 49, 93, +186,244,134,141, 84,209, 4, 8,173,182,192, 86, 14, 28,160,200, 16, 8, 32, 31,255,218,228,151,250,244, 25,204, 29, 57,178, 23, + 71, 14,110,184, 60,127,126,195,131, 41,217,155, 37,151,174,101,201,135,190, 60,173,244,192,161,187,198, 17,131, 26,221,243,182, +109,169, 99,213,210, 19, 47,144, 34, 81, 62,103, 48,248,249,246,233, 35, 44, 79, 79, 23,219,121,120,112, 0, 96, 54,155,255,205, + 84, 85,141, 96, 9, 4, 2, 64, 32,224,173,209,180, 54, 45,229,229,229,224, 1,206, 26,205,194,146,146,134, 79,246, 49, 54,155, +205, 40, 46, 46,174,220,148, 74, 37,228,114, 57, 74, 31, 77, 26, 90,151,102,151,230,205,215, 47,251,238,187,217,191,173, 94, 45, +169,106,174, 42, 54,129, 64,128, 57,159,124, 34,153,247,245,215,211,134,139, 68,239,213,231,124, 86,188,172, 11,133, 66,136, 68, + 34,164,167,167, 35, 35, 35, 3,233,233,233, 72, 79, 79,135,141,141, 13, 40, 33, 60, 43,145,207,193, 96, 85, 92, 60,107, 59,185, + 91,107, 8, 42,222, 4,158,151,193,210,106,181,199,207,159, 63,223,190,119,239,222,162,203,151, 47,195,211,211,179,210, 96, 85, +252,172,104,118, 82, 40, 20, 56,116,232,144, 73,171,213,214,186,144,164, 78,167, 59,113,226,196,137, 54, 51,103,206, 20, 79,156, + 56, 17,241,241,241,152, 50,101, 10,148, 74, 37,212,106, 53,138,139,139, 81, 94, 94,142,246,237,219, 67, 46,151,227,193,131, 7, +102,157, 78, 87,215, 84, 5,180,160,160,160,204,205,205,205,235,201,127,188,252,242,203, 30,191,252,242, 75,121, 66, 66,130,185, + 83,167, 78, 14,214, 26,141, 10,182,110,221, 90,105,158,238,221,187,135, 95,126,249,165,178,207,213,141, 27, 55,176,116,233,210, +202,185,203,234, 25, 85,188, 22, 30, 30,206,153,205,102, 52,105,210,164,162,121, 21, 43, 86,172,224,254, 14,115,101, 45,122,189, +126,231,132, 9, 19, 62,186,121,243,166,151, 72, 36,170, 8, 93,131,231,121,152, 76, 38, 60,120,240, 0,113,113,113, 72, 72, 72, + 64, 73, 73, 73,229, 11,192,173, 91,183, 74,205,102,243,246,154,116,221,220,220, 62,253,227,143, 63, 60, 21, 10,197, 99,229, 89, + 32, 16, 84, 62,116, 36, 18, 9, 10, 11, 11,225,228,228,132,158, 61,123,186,159, 56,113,226, 83, 0,243, 94,132,135, 1, 33,132, +116,234, 96,215,249,157,105,175,161, 93,107, 77, 82,204,141, 88, 28, 59,248,125,115,224, 97, 39,247,200,214, 17, 73, 87,111,218, +163, 95,239,217,157, 47, 92,158, 82,107, 39,247, 71,125,168, 14,182,111,223,224,252,222,253,199,127,254,120,230,155, 87, 63, 91, +240,177,187,222,160,149,135, 6, 89, 4,192, 67,115,117,233,166,173,126,209,130, 55,175, 46, 94,182,158,207, 40, 48,205,184,114, +165,180,198,209,189, 85, 77,139,179, 29,228,158,126, 51,114, 26, 6,246,104, 20,115, 99, 13, 92, 29, 75, 97,223,164, 19,250,245, +105,143,227, 39, 98,144,158,173, 71, 65, 65, 1, 0,212, 58,237, 65,194,157, 61,227, 40,161,254,132,146, 12, 34,160,242,113, 19, +222,136, 26, 48, 96, 48, 61,112, 96, 63,183,119,207,166,243,219, 55,254,176, 83, 32, 17,139,116, 70, 71, 35, 33,122, 21, 47,176, +143,215,106,139, 31, 62, 60, 37,146,154,151,187,121, 52, 33,107, 88,120,168,231,184, 9, 83, 28,251,247, 27, 66, 15, 30,220,203, +111,223,182,254,212,246, 53,145,155,120,129, 90,146,155, 89, 46, 83,169,205, 42, 74,164, 78,101,106,190, 60, 63, 57, 72,239, 61, +224,101, 19,171,150,158,168, 7, 12,134,172,178,204, 76,175, 6, 93,187,202, 30, 44, 88,160,240,104,223, 94, 95,209,133,165, 54, +131, 37, 20, 10, 65, 1,222, 26, 77,107,211,162,211,233, 64, 9, 49, 63,141, 38,199,113,143,153,171, 10,131,245,232, 89,111, 85, + 58,191,125,255,253,203,109, 95,123,173,228,210,165, 75, 30, 29, 59,118, 36, 26,141, 6, 26,141,230, 49,147,229,230,230, 70, 26, + 7, 6, 42,142,228,230, 6,206,179,242,124, 90,147,119,129, 64, 80,227,249,100, 60,133,193,170,136, 96, 89, 99,176,132, 66,161, + 53,166,192,108, 54,155,225,238,238,142,162,162,162, 26, 43,124,129, 64, 0, 27, 27, 27,104,181, 90, 0,168,117, 36,157, 70,163, + 89,177,104,209,162,233,221,187,119,119, 13, 9, 9, 65, 97, 97, 33, 60, 60, 60, 32,151,203, 43,251,134, 85,232,197,198,198, 98, +219,182,109,106,141, 70,179,162,142,124, 47, 95,181,106,213,219,253,251,247,111,224,234,234, 10,103,103,103,220,185,115, 7,206, +206,206, 80,171,213, 72, 76, 76,132,189,189, 61, 8, 33,208,235,245, 56,123,246,172,134,231,249,229,117,220,152,244,194,133, 11, + 38,133, 66,113,167,176,176, 80, 88, 82, 82, 34, 42, 45, 45, 21,169,213,106,177, 74,165, 18, 31, 62,124,216,213,209,209,177,252, +228,201,147,133,254,254,254,194,212,212, 84,161,209,104, 20, 88, 81, 41,226,189,247,222,131, 68, 34,129,193, 96,192,138, 21, 43, + 48,123,246,236,202, 62, 87,223,124,243, 13,230,206,157, 91, 25, 82,255,243,207, 63,235,107,178, 96, 50,153, 96, 54,155, 97, 54, +155,173, 50,189,207,130, 53, 70,157, 82,154, 71, 8, 25,216,174, 93,187,163, 59,118,236,112,177,183,183, 71, 90, 90, 26,242,243, +243,145,159,159,143,194,194, 66,148,149,149,129,227, 56,248,248,248, 32, 63, 63, 31,123,247,238, 85,105, 52,154, 62,181,141, 32, + 20, 10,133, 19,162,162,162, 68, 79,166,161,226,173,174,194,180,203,100, 50,228,228,228,160,123,247,238,210,211,167, 79, 79,248, + 95, 55, 88, 21,198,165, 89, 48, 36,131, 6,143,150,180,108,211,183,252,234,245,195,233, 54,132, 75,239, 31,221,100, 7,240,112, +154,134,171, 55,237,209,178, 77, 95,193,160, 92, 99,123,101,233,111, 45,195,154, 18, 83,109,203,234, 0,128,171, 35, 63,164, 79, +116,195, 92, 7, 7, 34, 90,180, 96,241,159,191,111, 88,221,238,210,214,127, 77,211,176,104,193,195,105, 26,250, 68, 55,228,226, + 19,238, 13, 1,176,193, 90,211, 50,112, 96,159,155,127,172,221,134,236,212, 63,189,151,127,110, 35,133,190, 20, 16,135, 32,170, +131, 3,174,253,156,133,236,236,236, 60,158,231,107,109,198,165,132,250,199,197,199, 54,141, 12, 15,243, 28, 55, 97,178,195,192, +129, 67,112,224,192, 62,108, 92,191,230,236,136,209,195,127,207, 46, 85, 11,221,197, 10,137,130,242, 82,161,196, 81, 36, 87, 40, + 10, 76, 57, 57, 15, 31,158, 34,177, 3, 48,146, 7,106,142, 12, 79,157, 60,214,177, 71,244, 16,252,117,112, 31, 54,174,255,237, +204,103,225, 47,175,105,212,170, 25,105,223,250,219,105,141, 26, 55, 10,208,150,229,171, 5, 68,106,210,235,121,251,111,215,167, + 45, 75,158, 59, 33,249,102,236,200,239,216, 40,194,199,184,179,177,127,255,118,239, 38, 37, 73,220, 58,119,182,201, 57,117, 74, + 97,141,193, 18,137, 68,128, 64,192, 89,163, 73,142, 29, 19, 0,168,117,112,149, 68, 34, 65,121,121, 57, 56, 66, 76,214,104,186, +223,186,149,153,150,150, 22,236,228,228,244,152,185, 42, 41, 41,169,252,172,215,235, 97, 52, 26, 97, 35,151,199, 89,163,153,127, +246,172,126,238,196,137,243,222,126,235,173, 31,182,110,219, 38,119,116,116,132, 74,165,122,204, 96, 25,141, 70,180,107,223, 94, +178, 54, 33, 97, 28,128,249,214,156, 79,143,238,221,235,236,239,251,200,176,178, 38,194,250,212,103,117, 53,213, 88, 59,138,176, +186,138,145, 16, 18,253,196,239,115,251,245,235,167, 79, 73, 73,129,191,191,127,165, 73,169,122, 76, 7, 7, 7, 56, 57, 57, 33, + 33, 33, 1,107,214,172,209, 17, 66,230,214,166, 89, 82, 82,162,209,235,245,163, 70,143, 30,173,147, 72, 36, 8, 13, 13,173,156, +255,138,231,121, 72,165, 82,216,218,218, 34, 54, 54, 22, 19, 38, 76, 40,215,235,245,163,158,156, 3,235, 73,205,180,180, 52,149, + 86,171,125,245,213, 87, 95, 45,191,119,239, 30,162,162,162,112,251,246,109,148,149,149,161,172,172, 12,169,169,169, 8, 11, 11, +131,209,104,196,206,157, 59,117, 90,173,246,213,180,180, 52, 85,109,154, 26,141,102,208,146, 37, 75,132, 7, 15, 30,108,228,235, +235, 27,222,182,109,219,144,158, 61,123, 6, 13, 27, 54, 44,160,127,255,254, 94,193,193,193,250, 62,125,250,184,245,235,215,207, + 77, 40, 20,138,147,146,146,114, 41,165,253,106,211,172,106, 74,238,221,187, 87,217, 36, 40, 18,137, 80, 84, 84, 84, 57,211,126, +197,195,168, 58, 3, 92,147,102, 85,147, 93, 97,172, 42,140, 86, 93,207,254,234, 52, 9, 33,117, 86, 24, 82,169,180, 34,194, 73, +235,210,164,148,222,186,123,247,110,175,174, 93,187,222,154, 52,105,146, 38, 47, 47, 15,246,246,246, 8, 12, 12, 68,211,166, 77, +225,234,234, 10,147,201,132, 61,123,246,104,247,238,221, 27,163, 82,169,186, 63, 57, 7,214,147,154, 2,129, 32,181,186,135,107, + 69,244,170,194, 96,201,229,114,248,248,248, 84,156,219,212,250,156,207,167,140, 44,253,189,154,143,140, 75,207, 30,125, 26,247, + 31, 48,212,113,239,254,125,138, 31, 87,174,187,219,101,200,244, 85,174, 1,179,118,187, 6,204,218,221,101,200,244, 85, 63,174, + 92,119,119,239,254,125,138,254, 3,134, 58,246,236,209,167,113,124, 92, 66,200, 99,235, 18, 86,147, 78,133, 84,214,190, 75,167, + 96,229,217, 11,103,185,197,203,214, 91, 58,189,212,255,202, 15, 63,172,218,254,195, 15,171,182,119,122,169,255,149,197,203,214, + 91,206, 94, 56,203,117,233, 20,172, 84, 72,101,237,173,201,251,212,201, 99, 29, 7,244, 31,130, 3, 7,246,112, 91, 54,174,248, +102,223, 17, 99,215,151, 39,235,243,211, 83,111, 80,148,175,131,155, 67, 12, 50, 50, 50, 84, 28,199,117,175,174,131,123,117,154, + 83,222, 28, 91,213, 92,157,115,241,140, 90,125,247, 46, 44,199,142,253,105, 62,113,226,166,238,220,173, 2,213,245,248,162,146, + 98,181, 62, 69,171, 81, 27,121,158, 7,229, 45,194,133, 11, 65,106,187, 70,157, 58,117,195,201,227,155,177,126,221,175, 42,158, +135,254,229, 29, 59, 44, 35, 71, 46,160, 1, 13, 27, 6,108,218,186,153, 12, 28, 60,212,145, 2,252,160,225, 67,156,182,108,219, + 66, 26, 55,105,220, 48, 48,240,225,212, 52,255,147,101,233,111,208,156, 79,105,169, 58, 61,253,204,141,159,126, 50,120,140, 26, +213, 64,234,225,225, 0,158, 39, 21,207,247,154, 54,145, 72,244, 88,196,165, 54, 77,143, 6, 13,178,143, 28, 57,130,144,144, 16, +248,248,248, 60,214,229,165, 98, 34,109, 87, 87, 87, 28, 59,118, 12, 20,184,110,141,102,152,183,247,141,159,127,250,201,200,243, + 60, 74, 75, 75,255, 45,122, 85, 90, 90, 10,158,231,113,246,204, 25,163,170,172,108,189,181,121,111,111, 52,150, 13,109,211,230, +235,241,227,199,155, 82, 83, 83,193,243, 60,170, 70,178, 10, 10, 10,160, 80, 40, 80,174,211,249,121,120,120, 40,172,209, 44, 56, +124,216, 22,117, 60,215, 5, 2,193, 99, 77,132,127,199,117,255, 71, 69,176, 56,142,131,159,159,223, 99,243,140, 8, 4,130,199, +182,250,140, 32,204,206,206,222,224,225,225,113,100,220,184,113,243, 90,182,108, 57,117,198,140, 25,194,198,141, 27, 67,165, 82, +193,217,217, 25,238,238,238, 72, 77, 77,197,153, 51,103, 44, 74,165,114,149,197, 98,249, 60, 63, 63,191,208, 10,221, 83, 62, 62, + 62, 3,123,247,238,189,237,237,183,223,118,236,218,181,171,216,219,219, 27, 0, 16, 23, 23,135, 67,135, 14,153,182,108,217,162, +214,235,245,163,172,153,197, 29, 0,114,115,115,143,122,121,121,141,152, 48, 97,194,166, 97,195,134,217,235,245,122,113,106,106, + 42,140, 70, 35, 56,142, 67, 73, 73,137,233,204,153, 51,101,229,229,229, 99,115,115,115,143, 90,161,119,131, 16, 18,102, 50,153, + 38,220,188,121,243,203, 17, 35, 70,184,188,244,210, 75, 18,142,227,112,254,252,249,194, 86,173, 90,185,171,213,106,211,133, 11, + 23,138,245,122,253,220,156,156, 28,171,150,202, 33,132, 64,173, 86,195,213,213, 21, 6,131, 1, 60,207,195,104, 52,194,206,206, +174,114,121, 35, 74,233, 83,247,145,227, 56, 78,104, 50,153, 48,122,244,104,240, 60,143, 21, 43, 86,128,227,184,122,139,217,217, +217, 93,143,139,139, 27, 24, 30, 30, 94,105, 90, 42,202,144, 76, 38,131,171,171, 43, 92, 92, 92,112,252,248,113, 8,133,194,235, + 86, 70,215,110, 3,104, 69, 8,121, 41, 38, 38,102, 60,128,150, 38,147,201,199, 98,177, 16,129, 64,144, 75, 41,189,163, 86,171, +127,183,118,169,156,130,130,130, 47, 95,123,237,181, 86,155, 55,111,182, 19,137,254,117,107,136, 68, 34,200,100, 50,184,187,187, +195,209,209, 17,148, 82, 24,141, 70,124,250,233,167,106,173, 86,251,229,139,242, 48,104,211,182, 61,126,251,229,123,187, 19, 39, +143, 20,222,189,143,125, 85,167, 98,176, 3,112,225,242,148,125,202,210,223, 90,230,100,102,218,181,105,219,222, 42, 77,163,133, + 43, 30, 53,118,149,223,163,165,114,190, 76, 77, 73, 95,190,121,221, 27,201, 0,240,221,178, 53,129, 25, 5,166, 25,241, 9,247, +134,172, 92,117,186,189,209,194, 21, 91,163,249, 47,211,178, 73, 5, 10,125,118,118,246, 21, 95, 95,223, 70, 81, 67, 76,115, 67, +130,200,224,252, 34, 62,155, 16,242, 78,118,118,118,178,181,121,239,220,169, 43, 78, 30,221,130,141,235, 55,169, 41, 47,212,187, +186,186, 82, 0,184,123,215,149,222,189,171,164, 64,197,124,141, 78, 90, 55, 69,225,231,115,231, 76,157,169,209,104,150,255,252, +109,237, 19,206, 54,111,209, 1,205, 91,116,192,244,119, 62,113, 12, 11, 15,245, 7,128, 29, 59,168, 37, 34,152,252, 57,239,179, + 5,131, 63,255,124, 1,212, 26, 3, 62,255,252,225,178, 58,137,177,241,127, 37, 37, 81, 35,171,154, 30,103, 30,199, 93,193,204, +153,193,229, 37, 37,110,157, 63,250,200, 85,244,237,183,130,234, 58,185, 87, 68,176,170,222,191,214,104, 30, 62,113,226,175, 15, +102,206,204, 94,250,237,183,125, 22, 47, 89, 98,211,172, 89, 51,228,229,229, 33, 52, 52, 20, 62, 62, 62,184,112,225, 2,142, 28, + 60,168, 45,211,233,230,122,122,122,174,180, 70,243,199, 45, 91, 18,187,244,232, 81,180, 97,195, 6,239, 30, 61,122, 16,173, 86, + 11,149, 74, 5,149, 74, 5,131,193, 0,137, 68,130,236,236,108,154,145,153,121, 55, 43, 43,107,149,181,121,183, 20, 22,202,103, +101,100,100,137,214,173, 91, 50,101,242,228,217, 51,103,205,146,249,250,250, 18,131,193, 80, 25,197, 50,153, 76, 80, 40, 20, 38, +141, 70,227, 2,160,220, 26, 77,217,159,127,114,197,197,197,112,113,113,169,156,118,169,234,188,130, 90,173, 22,148,178, 73,112, +235,245,162, 80, 83, 29, 30, 26, 26,122, 93, 36, 18,249, 86,141,102,213,244,179, 74,101,156, 21, 27, 27,219,166,170,195,165,148, + 86,219,223,201,215,215, 55,144,231,249,175, 94,122,233,165, 17,111,190,249, 38, 57,115,230, 12, 78,158, 60, 73,179,178,178,118, + 10, 4,130,185, 89, 89, 89,201, 53,189,217,212,164,217,160, 65, 3,123,123,123,251,247,109,109,109,163, 43,166, 98,144,203,229, + 49, 90,173,246,184, 70,163, 89, 81,211,236,237,181,105, 54,110,220,216,129,231,249,247,108,109,109,123, 21, 21, 21,181, 4, 0, + 87, 87,215, 91, 90,173,246,152, 64, 32,248,190,166, 5,164,107,211,244,246,246,182,177,179,179,251,178, 65,131, 6,175,190,249, +230,155, 46,103,206,156,201,189,117,235,150, 68,173, 86,111,230, 56,174,198,197,158,171,211, 12, 11, 11,123,108, 45,194,231,121, +141, 0,160, 69,139, 22, 7, 6, 13, 26, 52, 96,236,216,177, 48,155,205, 88,185,114, 37,142, 29, 59,246,215,253,251,247, 7,214, +246,246,249,164,166,167,167,167,171,143,143,207,233,113,227,198, 5, 12, 29, 58, 84,225,224,224, 0,161, 80, 8,173, 86,139,148, +148, 20,220,185,115,135, 30, 59,118,172, 44, 46, 46, 46, 75,167,211,117,203,203,203, 43,178,246,124, 62,203, 91,242,147,154, 98, +177,184,171,159,159,223,214,249,243,231,219,247,234,213,203,198,197,197, 5, 66,161, 16,102,179, 25,185,185,185,136,141,141,197, +145, 35, 71,180, 59,119,238,212, 22, 23, 23,143,166,148,158,249, 79,164,243,121,106,134, 53, 37,159, 61,177,128,115,141,179,179, +215,182,175, 53,233, 28, 16,237,220,127,196,136,182,209, 0,176,107,215,181,227,127, 29, 47, 61,248,180,233,172, 43,173,214,104, + 54, 11, 22,206,143,139,143,125,108, 34,202,240,176,136,123,205, 34,135,127, 97,141, 86,197, 76,238, 79,230,189,202,236,248, 85, +222, 8, 30,111, 78,173, 88, 16,250,147,185,115,240,213,151, 95, 99,223,142, 61,127,197, 39,209, 3,255,203,101,233,239,212,172, + 88,156, 88,225,229,213,101,139,171,235,156,163,199,143,219, 85,125, 81,171,136, 52, 87,125,153,108,217,178,101,193,173, 91,183, + 60,172,209, 28,248,227,143, 38,189,189,189,108,241,170, 85, 93,203,141,198,174,179,102,205, 18,221,184,113, 3, 91, 54,109,226, +116,153,153,155,242, 44,150,247,170,107,253,168, 77, 51,232,131, 15,228, 95,109,222, 60,177, 97,227,198,238, 67,134, 12, 17, 11, +133, 66,104, 52, 26,228,228,228,224,226,133, 11,198,148,212,212,248,242,242,242,193, 89, 89, 89, 57,214,106, 14,252,241, 71,147, + 83, 96, 32, 20,110,110,244,194,165, 75,142, 31,206,159, 63,213,211,203,203,177,115, 84,148, 88,161, 80,160,180,180, 20, 25, 25, + 25, 56,119,238, 92, 65,114,114,178, 55,165,212, 98,141,230,254,152,152,230, 39,175, 92,121,249,195, 15, 63,148,134,132,132,192, +222,222, 30, 26,141, 6,241,241,241,184,120,241,162, 97,235,214,173, 42,173, 86, 59, 53, 51, 51,115,255,223,117,221,255, 49, 6, +235,255,235,198,243,244,244,108, 35, 16, 8, 62,123,212, 28,181,168,174, 53,253, 94,164,135,142,151,151,151,191,179,179,243,111, + 58,157,142, 26, 12,134, 41,185,185,185, 25,255,109,233, 36,132,136,218,180,105,243, 75, 65, 65,193, 75,148, 82, 56, 58, 58, 94, +140,139,139,123,139, 82,202,213, 87,147, 16, 34,244,244,244,124,201,214,214,182,189,173,173,109, 87,147,201,212,236, 81, 63,188, +187,229,229,229,103,204,102,243,149,188,188,188,139,148, 82,203,127, 50,239,132, 16, 33,128, 94,222,222,222,111,240, 60,223,132, + 16,226,100,177, 88, 96, 54,155,149, 60,207, 63, 80,169, 84,107, 0, 28,251, 79,167,243,121,105,134, 55, 33,195,168, 0,205,106, + 50, 2,143, 25,154, 39,140, 3,225,113, 55,238, 1,221, 99,109, 58, 9, 33,130,161,253,220,150, 2, 15, 71, 26,214,181,228,208, + 99, 6,203, 10,211, 82,111,115,217, 68,244, 26, 37,212,255,241,135, 34,201, 8,109, 62,108,227,179, 24, 44,107, 9, 15, 33, 93, + 65,241, 18, 79,113,229,238,125,122,242, 69,125,214, 61, 79,205,175, 9,105,176,163,105,211,139, 2,145,200,147, 16, 34, 0, 0, + 34, 16,240, 60, 96,129, 64,192, 85,109, 22,172,250, 66, 89,151,166, 9,136, 20,203,100,126, 22,142,243, 40,145, 72,236, 46,216, +218,182, 54, 0,101,158, 22,203,103,199,139,139, 19,159, 38,157, 38, 32, 82, 40,147,249, 95,176,183, 31,162,116,118,110, 94,106, + 50,185, 1,160, 54, 54, 54,119,203,202,203,215,167,165,165,253, 92,205,162,234,117,106, 74,100, 50, 95,203,163,145,135, 2,145, +168,224,136, 76,230, 87,232,230, 54,190, 92,167, 11,144,203,229,102, 74,169,218,100, 50,141,205,200,200, 56, 81,159,188,103, 8, +133, 97,119,236,237,163, 44, 14, 14, 46,102, 66,108,141, 22,139,201,100, 54,103, 26, 12,134, 24,161, 80,184, 44, 43, 43, 43,233, +239,188,238, 47, 28, 21,163,205,254,142, 13, 64, 52,211,100,154, 76,147,105, 50, 77,166,201, 52,255,126, 77,119,119,119,133,167, +167,167, 63, 0,225,255, 98,222, 95,180, 77,196, 44, 38,131,193, 96, 48, 24,255,251,228,231,231,151,163,154, 62, 87,140,255, 80, + 19, 33,128,232, 26, 34, 91, 86,135,254,158,102, 52,129, 21, 77, 9, 76,147,105, 50, 77,166,201, 52,153, 38,211,124,193, 52,235, +210,126, 97,154, 30, 89, 19, 33,211,100,154, 76,147,105, 50, 77,166,201, 52, 89, 19,225,243,221, 4, 96,212,228,172, 61, 8, 33, + 30,207,123, 95,198,139, 93, 22,170,249,174, 15, 33,196,167,158,251,123,177,179,206, 96, 48, 24,255,219,252,191,247,193,170,168, +168, 40,165,249,207, 99,191,231,253,221, 71,223,255,154, 16,124,248,232,243, 55,148,210, 57,207, 99,223,186,240,246,246,246,107, +208,160,193,107,174,174,174,157,138,139,139,207,230,230,230,174, 45, 42, 42,202,173,199,247,131,229,114,249, 91, 2,129, 32, 2, + 0,120,158,143,213,235,245,191,228,228,228,220,127, 14,215,141, 0,152, 44,147,201, 94,113,118,118,110, 82, 82, 82,242,192,104, + 52,238, 0,240,235,211,204, 58,237,229,229,213,218, 98,177,188,139,135, 35, 89,127, 45, 44, 44,188, 96,237,119, 61, 34,134,110, +167, 64, 48, 0, 1, 79,248,151, 5, 84,176, 19, 0, 79,128,251,249,177,123, 95,121,206,229,245,169,175,111,125,191, 75, 8, 89, + 70,128,247, 65, 64,159,181, 44, 49, 24, 12, 6,227,127,200, 96,249,248,248, 76, 0, 48, 27, 15,103,218,254, 46, 59, 59,123,253, +223, 81, 89, 61,199, 74,109, 5,165,116, 86,253,163, 21,248,144,231,169, 0, 0, 4, 2,242,145,135,135, 71,132, 72, 36, 50, 60, +185, 47,199,113, 50, 66,208,151,231, 41,121,180,239,135,132,144,239,159,198,216,185,184,184,120,143, 25, 51,102,211,231,159,127, +110,163, 80, 40,144,145,145, 49,116,206,156, 57,209,222,222,222,227,115,114,114, 50,235,250,126,227,198,141,199, 68, 54,111, 57, +115,206, 39,159,217,185,185,187,219,114,156,197,148,153,157,165,248,246,235, 69,237, 27, 55,110,252,125, 74, 74,202,150,250, 24, + 41,145, 72,244,138, 92, 46, 15,210,235,245, 73, 28,199,237, 20, 10,133,125,190,252,242,203,136,254,253,251,203,213,106,181,148, +227,184, 38, 27, 55,110,156,249,199, 31,127,244, 35,132, 12,169,109,184,125, 69, 4,135, 82,154, 93,229,220,189,117,227,198,141, + 30, 98,177,152, 60, 90,180,249, 66,109,251, 87,133, 2,193,113,231,119, 68, 2, 64,120,231,145,247,226,206,239,192,163,207,207, +253,101,224,201,178,224,236,236,188,185,180,180, 52,190, 46, 35, 95,221,119, 9, 33, 63, 80, 74,243,188,189,189, 59, 1,120,235, +209,174,191,228,228,228, 92, 32,132,120,202,101,178,247,117,122, 61, 1, 64,158,165, 44, 49, 24, 12, 6,227,127, 47,130, 53,231, +222,189,123,246,148, 82,132,132,132,124, 12,192,106,131,245,100,133, 35, 20, 10, 62,238,213,171,215, 68,153, 76,246, 88,197,108, + 48, 24, 4, 2, 1,113,183, 88, 30,254,185, 62, 21, 77,197, 49,140, 70,131, 64, 44,150, 66, 40, 20,204,108,217,178,101,191,252, +252,252, 67, 50,153,236,155,212,212,212,130,167,137,220,172, 95,191,190,149,139,139,203,191, 25,136,226,226, 98, 65,191,126,125, + 73,125,244, 38, 18, 34, 51,200,100,237, 37,132,120, 89, 56,206, 9, 0, 68, 34, 81,105, 19, 15,143,174,159,206,153, 99,243, 72, + 23,101,101,101,120,237,181,215, 20, 15, 30, 60, 24, 11,224,171, 58, 34, 87, 77, 91,180,106, 51, 99,203,230, 77,205,212, 37,165, +250,213,203,127,189,161, 19, 73,202, 27,133,133, 74, 22,125,189,204,249,211,143,102,190,227,237,237,125,171,186,101, 67,158,200, +171, 0,192,158,247,223,127, 63,124,224,192,129, 82,141, 70, 35,215,233,116, 13, 55,109,218,244,105,155, 54,109,236, 90,182,108, + 41,221,186,117, 43, 81,169, 84,160,148, 42, 66, 67, 67,233, 43,175,188,162,223,182,109,219,116, 0, 63,212,199, 44,243, 60, 47, +172,174, 28, 90, 99,174, 9,112, 63,188,243, 72,128,160, 73,220,249, 29,242,240,168,145,122, 80, 60, 32,192,253, 71, 47, 2,159, + 3, 85,230,117,122,156,187,217,217,217, 79,181,118,224,128, 1, 3, 9,165,116,143,183,183,247,137,162,162, 34,123, 66, 48,186, + 30,209, 41,226,230,230,246, 14,128, 79, 40,165,239,159, 58,117,170, 35, 0,116,239,222, 93, 2,224,130,163,163, 99, 79,163,193, + 64,216, 35,137,193, 96, 48,254,129, 6,139, 82, 42, 3,128,115,231,206,129, 82, 42,127,154,160, 64,213, 95,102,205,154, 5, 23, + 23,151, 39, 77, 11, 78,158, 60, 81,227,119,234,123,140,175,191,254,218,169,160,160, 96,244,239,191,255, 62,212,211,211,243,237, +188,188,188,195,117,228, 49,159, 16,242,205,163,136, 3,145,203,109, 74, 39, 77,154,116,241,209,255,154,253,249,231,159,246,131, + 6, 13,210, 16, 66,238, 2,128, 92,110,211, 85, 40, 20, 56, 83, 74, 41,165,248,166, 54, 35, 56,146,144, 64,169, 84,218, 99,202, +143, 63,114,173, 7, 13, 18,217,186,185, 17, 0, 72, 79, 72,112,253,225,167,159,186, 40, 51, 51,101, 34,123,251,178,252,210, 82, +227,189,123,247, 32,151,203,137, 64, 32,232, 84, 87,134, 21, 10,197,187,179,102,127,108,171, 46, 81,234,244,106,141, 81,200,153, + 13,246, 54, 10, 75,126, 94, 65,177,157,141,109,249,228,183,223,149,206,255,100,246,187, 85,162, 38, 53, 49,125,230,204,153,205, +218,181,107,231,179,125,251,118,162, 82,169, 32, 18,137,236, 90,182,108,137, 54,109,218, 88, 78,158, 60, 73, 26, 53,106,132,136, +136, 8,156, 63,127, 30, 23, 47, 94, 36,173, 90,181, 82,236,222,189,123, 92,117, 6,171, 58, 83, 61,102,204,152,137, 82,169,148, +239,218,181, 43,222,120,227, 13, 80, 74,209,170, 85,171, 78,227,198,141,203,213,233,116, 86,153,235,138,102, 64,247,136,161,119, + 0, 68,130,226, 65, 65,236,222,230, 85,118,105,150,152,152,216,161,180,180,180,178,179, 97,197,194,226, 93,186,116,169, 79,121, +207, 39,132,124, 51,104,208,192,143, 1,130,232,232,232,178,233,211,167,211,196,196,196,222, 67,135, 14,105,116,255,254,131, 26, +211,249,100, 57,154, 58,117,154, 86, 44, 22,191,230,237,237, 29, 79, 8, 17,139,197,226,138,115, 36,106,216,176,161, 71,100,100, +228, 28, 47, 47,175,114,161, 64,160,160,168,187, 44, 49, 24, 12, 6,227, 5, 50, 88,132,144,156,219,183,111, 55, 44, 47, 47, 7, + 33, 36,199,138, 10,234,120,213, 10, 71, 36, 18,253, 38, 20, 10,166, 0, 64,219,182,237,180, 75,150, 44,169,174, 89,137,111,219, +182,157, 86, 40, 20,216, 62,172,188,132,191,114, 28,151, 95,157,102, 13, 21,226,183, 82,169,236, 3, 0,196,215,215,175,108,223, +190,125,252,136, 17, 35,240,237,183,223,202, 62,254,248,227,159, 27, 54,108,216, 61, 45, 45, 45,189,166,116, 62,250,125,142,135, +135, 71,196,250,245,235, 91, 77,154, 52,233, 98,118,118,246,240, 71,145,145,221, 0, 58, 16, 66,238, 86,253,219,238,221,187, 95, +154, 48, 97,194,205,252,252,252, 57, 53,105,142, 32, 36, 40, 32, 52,180,199,231,103,207, 82,129,193, 64,138,206,157, 83,151, 20, + 22,154,146,138,138,108, 55,199,196,140,254,112,225, 66,137,167,143, 15, 46, 28, 61,106,159,167, 84,106,148,229,229,198,212,212, + 84,222, 98,177,156,176, 34,239,225,110,174,174,138, 95,151,173,188,102, 47, 22,242,238,190, 62, 68,220,160,129, 72,160,112,144, + 10, 69, 2, 67,163,134,129, 82, 0,225,117, 93, 35,137, 68, 50,174,119,239,222,138,109,219,182,145,136,136, 8, 56, 57, 57,225, +220,185,115,184,117,235, 22, 74, 75, 75, 5,102,179, 25,109,219,182,197,146, 37, 75,224,239,239, 15,165, 82,137,140,140, 12, 87, +169, 84,234, 86,203,249, 36, 85,202, 15, 62,250,232, 35,184,185,185,193,108, 54,163,164,164, 4, 22,139, 5,182,182,182, 0,128, +188,188, 60,236,219,183,183,206,178,100,165, 57, 66,199,142, 29, 43,141,112,213, 8, 86,125, 52,125,124,124,206, 21, 22, 22,141, +236,209,163, 7, 74, 74, 74,184, 5, 11, 22,160, 69,139, 22,104,218,180,169, 53,101,126,142, 76, 38,251, 35, 32, 32, 96,221,212, +169, 83, 27, 58, 59, 59,195, 96, 48, 44, 45, 46, 46,198,135, 31,126, 8, 0,104,215,174, 93, 91, 74,233,173, 73,147, 38,161, 97, +195,134,154,188,188,188,162, 59,119,238, 12, 85, 42,149,119,158, 54,239, 86,158, 31,166,201, 52,153, 38,211,252,175,210,252, 71, + 27, 44, 0,249, 62, 62, 62, 13,109,108,108, 0,160,222,111,215, 28,199, 77,117,119,119, 23,124,250,233,167,131, 26, 55,110,204, + 79,159, 62,253, 66,106,106,234, 99, 29,103, 26, 53,106,180,227,167,159,126,234,148,146,146, 82,254,197, 23, 95,252, 89, 80, 80, + 48,173,158, 23,253, 35, 66,200,114, 0,200,204,204, 44,222,187,119,111,212,217,179,103,191, 94,190,124,185,239,244,233,211,101, +211,167, 79,255, 8, 64,157,154, 34,145,200, 80, 93,179, 96,117,184,184,184,240,213,245,209,170, 96, 16, 33, 54, 14, 82,105,247, +207,207,158,165,198,180,180,242,109, 63,255,108,179,234,218,181,121,102, 74,189, 60, 60, 60,132, 93, 59,119, 54,216, 75,165,154, +252,156, 28,222,217,215,151,164, 36, 37,217,153,133, 66,211,225,195,135,203, 10, 11, 11, 55, 89,145, 4, 53, 79,169,209,206,215, +223,252,242,208, 94, 17,215,174,220, 74,176,119,119, 21,180,106, 25,209, 60,225, 94,218, 13,240, 22, 19, 0,117, 93, 34,142,142, +142, 77,139,139,139,161, 86,171,225,230,230,134, 21, 43, 86,192,211,211, 19,229,229,229,136,139,139,163,190,190,190,228,236,217, +179,240,245,245, 69, 97, 97, 33,140, 70, 35, 52, 26, 77,129,193, 96,208,213,100,120, 69, 34,209, 31, 2, 1,153, 68, 8, 65, 72, + 72,168,118,249,242,229, 60,165, 20,205,154, 53,195,240,225,195,177,107,215, 46,196,197,197, 85, 68,154,248,160,160, 38, 90,129, +128,216, 2,224,159, 37,138,195,243, 60,170, 26,225,250,226,237,237,109, 3,224,195,224,224,224, 81,175,190,250, 42, 39,145, 72, +160,213,106,161,211,233, 16, 27, 27,203, 13, 24, 48,176,108,208,160,129,118,127,253,245, 87,173,233, 52, 24, 12, 73, 1, 1, 1, + 35,102,204,152,113,244,215, 95,127,117,153, 59,119, 46,120,158,175,220, 56,142,171, 92,148,123,239,222,189,120,240,224,193,156, +170,230,138,193, 96, 48, 24,255, 12,131,245,204,136,197,226,207,255,250,235,175,222, 95,125,245,149,184,103,207,158,157,188,189, +189, 95,202,201,201,185,248,168, 82,123,169,127,255,254,157,220,221,221,241,253,247,223, 27,197, 98,241,231, 79,233,172,171, 86, +118,167, 60, 61, 61,167,239,222,189,123,255,148, 41, 83,224,229,229,213,254,255, 59,207, 14, 50, 89,171, 73, 43, 86,112, 98,179, + 89,176,245,215, 95,101, 95,157, 56,177, 98,219,246,237,226,118,109,219,130, 2,136,143,139,147,125,243,227,143,178,145, 3, 7, + 22,196, 61,120,128,195,199,143, 27,149, 37, 37, 57,133,106,245,236,252,252,252, 66, 43,140,235,165,148,212, 20,239,168,174, 29, +125,206, 92,141,189,245,242,208,254, 61,196, 34, 1,121,144,150,117,221,203,211,213,241,226,249,243, 58,142,227, 46,213,165,163, +213,106, 83, 57,142,107, 64, 41,117, 59,125,250, 52,220,220,220, 80, 90, 90, 10,179,217, 12,163,209,104, 44, 47, 47,151, 23, 23, + 23, 67,175,215,195, 96, 48,192,193,193, 1, 49, 49, 49,249, 28,199,157,172, 37,109,111, 16, 66, 22, 80, 74, 17, 31, 31,159, 13, + 0,126,126,126, 97, 78, 78, 78,199, 42, 22, 80, 62,123,246,108,239,172,172,172,184, 42,145,174, 90, 59,185, 91, 27,193,122, 90, +188,188,188, 90,203,229,242,111, 62,254,248, 35,239, 22, 45, 90,160,176,176, 8, 60,207,195,206,206, 14, 58,157, 14,246,246,246, +232,212,169, 83,222,130, 5, 11, 82, 40, 69, 63, 74,105, 94,109,122,233,233,233,121,254,254,254,163,167, 76,153,242, 99,112,112, +112, 83, 74, 41,130,131,131,209,187,119,111, 28, 58,116, 8,247,238,221, 67, 89, 89, 25,119,245,234,213,213, 57, 57, 57,219,216, + 99,137,193, 96, 48,152,193,170, 55,217,217,217,217, 62, 62, 62, 27,110,222,188, 57,233,149, 87, 94,193,169, 83,167,230, 2,232, + 7, 0,114,185,124,238, 43,175,188,130,155, 55,111,226,238,221,187, 27,178,179,179,179,159,199, 49,165, 82,169,214,104, 52,226, +209, 49, 20,245,172,168,155, 61,106, 26, 4,165,180, 89, 77,127,171, 13,129, 72,228, 21,217,183,175,168,244,214, 45,245,242,243, +231, 23,109,217,186, 85,220,190, 93, 59,152,204,102,240, 22, 11,252,252,253,209, 35, 58, 90,182, 97,251,118, 91, 78,171,189,240, +217,123,239, 29, 90,249,218,107,101,151,203,202, 30, 88,147, 70,173, 86,251,195,103,159,124, 20,189,109,251, 46,159,176,208,160, + 6,135,143,158,186,233,226,226,168,104,218,164,137,173, 82,169,178, 44, 91,250,149,168,172,172,236,199,186,116,116, 58,221,158, +227,199,143, 15,245,243,243,115,139,141,141,133,209,104,132,197, 98, 65,207,158, 61, 43,250,223,241, 34,145, 8, 9, 9, 9, 48, +153, 76, 5,247,239,223,207,121,240,224,129, 12,192,226, 58,206,225,147,215,113,210,128, 1, 3, 96, 54,155,209,187,119,111,236, +221,187,247,117, 0, 51,106,217,255,169, 12, 86,213,235, 4, 43, 59,183,123,123,123,247,106,210,164,201,247, 75,150, 44, 17,248, +250,250,130,231,121, 56, 59, 59,163,188,188, 28, 69, 69,197, 8, 11, 11,131,159,159, 31, 22, 47, 94, 12, 0, 91,235, 50, 87, 21, +100,100,100,220, 5,208, 61, 40, 40, 72,170,215,235, 59, 69, 71, 71,111,236,217,179, 39,110,222,188,137,139, 23, 47,246, 32,132, +228,233,245,122,179,143,143,207, 44, 0, 78,148,210,223,172, 25, 61,202, 96, 48, 24,140,255,113,131, 21, 20, 20,100, 47, 22,139, +186, 77,155, 54,213,206, 98,225, 33, 22,139,186, 55,108,216,208, 49, 45, 45, 77,245, 20,149,223,247,155, 54,109,122,117,217,178, +101,178, 1, 3, 6, 52,247,242,242,234, 13, 0, 35, 71,142,108,238,224,224,128, 77,155, 54, 25, 40,165,223, 63,175, 76,114, 28, + 55,180, 77,155, 54, 40, 41, 41, 65, 90, 90,218,197,250,124,247,207, 63,255,180, 7,208,161,174,191,213,122,124,163,209,217,201, +199, 71,144,125,234,148,169, 68,173,246,174, 48, 87, 2,129, 0, 37, 37, 37, 72, 79, 75,131,131,189, 61,226, 19, 19,101, 43,223, +125,119, 91, 64, 68,132,216, 98, 52,186, 88,171, 95, 88, 88,168,245,244,244,156, 56,239,179, 79,247,252,248,211, 79,110, 74,181, + 58,201,198, 70, 97,144,201, 36,158,243,230,205,181,168, 84,170, 9, 69, 69, 69,101, 86, 72, 45,222,188,121,115,223,190,125,251, +222,241,247,247,119, 47, 44, 44,244, 84,169, 84,180,164,164,132,224, 97, 95, 42, 2, 0,119,238,220, 65, 90, 90, 26,103,177, 88, +206, 2,248,156, 82,106,180, 54,173,222,222,222, 46, 29, 59,118, 28,230,238,238, 94,217, 20,217,178,101,203, 97,222,222,222, 95, +230,228,228, 20, 63,207,194,125,236,216, 49,123, 74,105, 7, 74, 41,250,246,237,107,237,215,222, 26, 56,112,160,128, 16, 2,157, + 78, 7,153, 76, 6, 91, 91, 59,216,219, 59,160,105,211, 16,100,103,103,163,119,239,222,150,164,164,164, 45, 18,137,228,135,250, +166, 73,167,211,141,233,212,169,211,194,105,211,166,129,231,121, 12, 25, 50, 4,153,153,153,235, 82, 82, 82,214,248,250,250, 78, +155, 52,105,146,135,139,139, 11,102,205,154,165,168,106, 58, 25, 12, 6,131,241, 2, 26, 44,111,111,239,104,103,103,231,165, 78, + 78, 30,118, 71,142, 28, 21, 1, 64,215,174, 93,108,205,102,238,146,183,183,247,199, 57, 57, 57,127,214,231,160, 57, 57, 57,197, +222,222,222,191, 94,188,120,241,189,225,195,135,227,216,177, 99,159, 0,192,240,225,195,113,241,226, 69,164,164,164,252,250,188, + 42, 91, 31, 31,159, 9, 93,187,118,125,187, 93,187,118, 56,112,224, 0, 44, 22,203,193,250,124,191,234,136,193,234, 70, 17, 86, +252,205, 42, 49,161, 16,132, 16, 88, 44, 22, 80,158, 71, 81,113, 49, 18, 18, 19, 81, 90, 90, 10,139,197, 2, 93,121,185, 57,184, +113, 99,173,202,104,116, 32, 15,231, 26,179,154,188,188,188,244,160,160,160,140,114,189,206,221,197,185,129, 78,161,144, 65,163, + 41,147,196,220,185, 85,150,149,149,149,100,165,241, 53, 18, 66,186, 30, 58,116,104,158, 80, 40,124,197,199,199, 7, 35, 71,142, + 36, 61,123,246,132, 84, 42,133, 94,175, 71,105,105, 41,254,252,243, 79,112, 28,215, 24, 0,220,220,220, 60, 26, 54,108,184, 75, + 32, 16,228,167,164,164, 76,170,235, 24,132,144,241,131, 6, 13, 18, 27,141, 70, 44, 90,180, 8,243,231,207, 71,191,126,253,196, + 55,110,220, 24, 15, 96,217,243, 42,216, 60,207,163, 87,175, 94, 85, 59,185,223,173,235, 59,221,186,117, 19, 9,133,194,144,160, +160, 32, 20, 22, 22,162,176,176, 16,110,110,110,240,246,246,134,187,187, 59,150, 45, 91,134, 21, 43, 86, 92,165,148, 46,206,203, +203, 75,168,111,154,252,252,252,102,189,246,218,107,179, 70,141, 26, 5,141, 70,131,139, 23, 47,162, 83,167, 78, 88,178,100,137, +239,185,115,231, 22,182,105,211, 6, 18,137, 4,167, 79,159, 6,199,113,169,236,241,196, 96, 48, 24, 47,168,193,242,241,241,105, +192,243,252,151, 3, 7, 14, 28, 52,108,216, 48, 44, 89,178,184,138, 87, 16, 97,237,218,117,142,187,119,239, 94,229,231,231, 55, + 76, 40, 20,126,156,150,150,102,117,135,100, 27, 27,155,149,155, 55,111,158,216,177, 99, 71,251,232,232,232, 96, 0,144,201,100, +252,230,205,155, 53, 54, 54, 54, 43,235,155,145, 39, 39,125,244,242,242,234, 44,149, 74,167, 15, 26, 52,168,243,196,137, 19, 17, + 23, 23,135,141, 27, 55,222,246,246,246,222, 95, 79,221,187,117,141, 34,172, 43,154, 37,148, 74,139,149,121,121, 78,118,254,254, + 98, 23, 71,199,156, 83,167, 78, 5,180,111,223, 30,233, 25, 25, 80,150,150, 66,167,211, 33, 46, 46,142, 74, 68,162, 20,145,179, + 51, 73,191,116,137, 8,165,210,122, 27, 76, 91, 57, 9,254,236,195,201, 13,245,122,125,184, 74,165,226,196, 18,137,216, 70, 74, +235,213,204, 68, 41, 53,248,251,251, 15,177, 88, 44,174, 70,163,209,236,225,225, 33, 62,126,252, 56,164, 82, 41, 8, 33,136,140, +140,132, 84, 42, 53,250,250,250,106, 0,192,197,197, 69,176,120,241, 98,241,251,239,191, 31, 87,151,118,235,214,173,197, 1, 1, + 1,147, 66, 66, 66,112,241,226, 69,196,199,199, 39, 94,190,124, 57,164, 85,171, 86,240,241,241,153,212,186,117,235, 31,111,220, +184, 97,126, 30, 5,155, 82, 90,239, 78,238,103,206,156,161,222,222,222, 16, 8, 4, 16, 8, 4,224,121, 30,133,133,133,104,220, +184, 49, 86,174, 92,137, 21, 43, 86,252,146,155,155,251, 84,145,213,160,160, 32,105,139, 22, 45,222, 30, 53,106, 20,146,146,146, +240,213, 87, 95, 21,228,231,231, 31, 60,122,244,232,248,105,211,166,137, 58,117,234,132,226,226, 98,172, 93,187,214,124,243,230, +205, 31,114,115,115, 87,178,199, 19,131,193, 96,188,128, 6,203,207,207,111,162, 92, 46, 95, 56,106,212, 40, 81, 72, 72, 8,242, +243,243,161,209,148, 89, 34, 35, 35, 44, 0,161,118,118,182, 68,161, 80, 96,202,148, 41,104,222,188,121,175,143, 62,250,168,167, +183,183,247,215, 57, 57, 57, 63, 91,115,224,164,164, 36,141,183,183,247, 15, 51,103,206, 92,114,233,210, 69, 91, 0,184,117,235, +150, 54, 39, 39,231,139,156,156, 28, 77, 61, 77, 80,197,228,148,196,214,214,246,126,147, 38, 77,204, 3, 6, 12,112, 25, 54,108, + 24, 92, 93, 93,113,243,230, 77, 44, 94,188,248,166, 86,171, 29,147,150,150,102,254,255, 62,201,156,193,144,119,125,239, 94,251, +110,175,190,234,240,225,208,161, 95,189,249,230,155, 63,207, 95,176, 64, 28, 20, 24, 8,163,201,132,248,248,120,186,117,203, 22, +211,150, 37, 75,190,131,173,173,248,210,174, 93, 82,163,209,152, 94,159, 99,248,250,250,118,237,223,183,107,200,210,101, 63, 64, +175, 43,195,149,139,127,161,180,180, 16,191,254,182, 59,196,215,215,183,107, 86, 86,214, 25,171,211,203,113,129, 59,119,238, 4, + 0, 72,165, 82,124,254,249,231,240,246,246,134,131,131, 3, 52, 26, 13, 38, 79,158, 44,125,255,253,247, 1, 0,113,113,113,176, +179,179,179, 54,202,214,127,242,228,201, 78,102,179, 25,135, 14, 29,210, 75, 36,146, 87,143, 30, 61,122,177,121,243,230,242, 46, + 93,186, 56,109,220,184,113, 0,128,189,207,203, 96, 61,197,119, 44, 62, 62, 62, 41, 71,143, 30,109, 60,114,228, 72, 72, 36, 18, +148,150,150,194,193,193, 1, 63,253,244, 19,175, 80, 40,214, 62, 67,146,164, 10,133, 66,102,177, 88,176,125,251,118,228,231,231, + 15,172,232,143, 56,123,246,236, 47, 66, 67, 67,131, 18, 18, 18,146,245,122,253,220,236,236,236, 7,236,209,196, 96, 48, 24, 47, +168,193,226,121,254,195, 35, 71,142,136, 44, 22, 11, 86,175, 94,141,107,215,174,209,252,252,252,239, 76, 38,211,215, 10,133,130, + 43, 41, 41,153,253,230,155,111, 78,157, 63,127,190, 32, 42, 42, 10,151, 46, 93, 18, 52,110,220,120, 58,128,159,171, 24,159,232, +218,230,202, 40, 45, 45, 61,152,151,151,251, 51,207, 63,172, 12, 5, 2, 98, 43,149,202, 14,214, 97,166, 30,211,172,102, 50,203, +166, 95,127,253,117,129,139,139, 11, 31, 23, 23,135,149, 43, 87, 90,174, 95,191,190,139,231,249, 79,139,138,138,202,173,209,124, + 30, 84,213,148,114,220,141,141,179,103, 55,107, 61,100, 8, 63,252,141, 55, 12, 2,145,232,173,175,150, 47,255,164, 84,169,244, + 6, 33,212,213,217, 57,125,205,151, 95, 46,122,169,123,119,125,220,153, 51,242, 91,199,142,137,221,204,230,219,245, 73,103, 86, + 86,214,153,224, 32,127,172, 91,189, 12, 38,147, 1,185,217, 15,253, 89, 81,177, 10,181,153,171,234, 52, 5, 2,129,242,181,215, + 94, 83, 24,141, 70, 50,122,244,104,113, 65, 65, 1,130,130,130, 0, 0,106,181, 26,127,253,245, 23, 66, 67, 67, 1, 0, 49, 49, + 49,149,159,235, 74,167,141,141,205,164, 78,157, 58, 33, 61, 61, 29,241,241,241, 59,115,114,114,242,189,189,189,119,166,167,167, +143,111,219,182, 45,118,237,218,245,122, 77, 6,171,190,215,200, 26,131, 85, 67,222,223,216,189,123,247, 7,151, 46, 93,234, 59, +107,214, 44,210,189,123,119, 0, 64, 89, 89, 25,159,155,155,171,121, 26,205,170,105,226, 56, 14, 0, 32,151,203, 53, 0,240,200, + 76,141,124, 90,205,231, 81, 62,153, 38,211,100,154, 76,243,191, 65,243, 31, 99,176, 0,152, 44, 22, 11,206,156, 57,131,221,187, +119,115,122,189,126,120, 94, 94,222,245, 42,255,255,194,215,215,119,255,136, 17, 35, 14, 38, 38, 38,138,226,227,227, 1,128,171, +207,193, 13, 6,131,145, 16, 80,252,107, 50, 74,106, 48, 24,140, 79,115,173,171,254,242,251,239,191, 35, 55, 55,215,144,158,158, +190,149, 82,186, 42, 55, 55, 55,235, 25, 34, 33,207, 60,138,112, 45,165,134, 87, 9, 57, 62,191,115,231, 94,243,142, 29,147,189, + 50, 99,134,105,248,168, 81,179, 45, 70,163, 89, 40,145,240, 82, 91, 91,129, 69, 38, 19,199,157, 57, 35,255,126,218,180, 6, 58, +131,225,240,198,122,116, 28,175, 18,193,194,107,111,204,128,174, 74, 4,235,210,181,123,168,111, 4, 75, 36, 18,249,155,205,102, + 25,199,113,217, 60,207, 99,252,248,241,224,121, 30, 58,157, 14, 26,141, 6, 37, 37, 37,250,119,222,121, 71, 0, 0, 10,133, 2, +189,123,247,150, 90,163, 27, 24, 24,216, 72, 44, 22,227,240,225,195, 16,139,197,235, 1, 64, 44, 22,175, 63,118,236,216,248, 49, + 99,198,192,223,223, 63,140, 16, 66,234, 90, 60,186,114,177,103,130, 38,143,174,126, 19,247,136,161,119,170, 44,246,124,183, 85, +171, 86,128, 21,253,174,158, 36, 51, 51, 51, 23,192, 12, 95, 95,223,181, 31,124,240,193,135,237,219,183,111,179, 96,193, 2, 16, + 66,132,207,122,179,241, 60, 15,179,217,252, 76, 83, 72, 48, 24, 12, 6,227,127,223, 96, 45,235,222,189,251, 76, 74,169,136, 16, +242,237, 19,230,170, 34,106, 18,231,227,227,243, 89,227,198,141, 43, 23,128,174,167,121,201, 39,132, 44, 17, 8,200,135, 15,127, +175,255,196,146, 85, 52, 62,122,104, 14,196,219,174, 95,191,254, 73,122,122,122, 54,165,148,123,214, 19,244, 60, 70, 17, 2,192, +102, 74, 83, 71, 19,114,100, 86, 68, 68,116,223,105,211,208,188,111, 95, 7,239,128, 0,139,206,100,226, 99,206,159, 39, 23,119, +238,148,220, 58,118, 76,172, 51, 24, 14,239,166, 52,163,190,233,204,202,202, 58, 19, 20,232,123,244,229,225,253,123, 7, 54,242, + 6, 0, 36,167,230,160,168, 68,117,180, 62,230, 10, 0,210,210,210, 12, 0, 12, 94, 94, 94,195,183,111,223,190,243,145,233,169, + 92,118, 6,128, 65, 36, 18, 5, 3,128, 70,163, 9,216,179,103,207,102,145, 72, 84,167,137,189,123,247,238,154,249,243,231, 79, + 73, 78, 78,222,154,149,149,149, 8, 0,233,233,233,137, 62, 62, 62,223,228,230,230, 78,205,204,204, 92, 73,173,112, 31, 79, 44, +246,140,184,243, 59,228, 0, 34, 43, 22,123,126,218,181, 6,159, 56,159,177, 0,198,250,248,248,116,239,211,167,207,116, 0,121, +207,162,103, 48, 24,204, 6,131,193,204,243,188,216,100, 50, 81,131,193, 96,102,143, 31, 6,131,193,248, 7, 26,172,236,236,236, +245,176, 98, 49,103,107,247,171,197, 32,205, 33,132,124, 95, 97,150,158, 85,195,100, 50, 61,175,245,219,238, 14, 30, 60,184, 94, +251,215,181,195, 86, 74,211,223, 37,100,195,129, 31,127,108,121,120,213, 42, 31, 11,199,185, 16,128, 10,165,210, 98,163,209,152, +230,102, 54,223,174,111,228,170, 42, 73,201, 89,125, 0, 32, 56, 56,152, 62,120,240, 0,148,210,103, 90, 60, 56, 55, 55,247,168, +175,175,175,187, 72, 36,146, 18,242,152,148,225,145, 9, 3,128, 59,132,144, 48, 0,117, 70,120, 50, 51, 51,151, 3, 88, 94, 77, + 25, 90, 1, 96,133,181,233,170, 92,236, 25, 16,240,132,127, 57,188,243,200,157, 0,248,138,197,158,159, 39,217,217,217,167, 0, +156,122, 14,134, 77,223,176, 97,195, 85, 75,150, 44,153,122,251,246,237,223,179,178,178,244,236,241,195, 96, 48, 24,255, 64,131, +245,255,201,243, 88,212,246,121, 47,140,251, 60,162, 32,213,241,195, 67, 3,117,249,239, 60,159,247,239,223, 39,207, 75,235,145, + 17,208,215,113,238, 41,234,217, 60,252, 44, 84, 44,246, 92,133,136,255,133,155, 45, 45, 45,237,235,214,173, 91, 47,205,202,202, + 98,209, 43, 6,131,193,120,193, 17,176, 83,192, 96,252,255,241,188,166,161, 96, 48, 24, 12,198,127, 55, 4, 64,116,117,255,168, +207,232, 0, 66, 72,116,125, 15, 92,151, 62,211,100,154, 76,147,105, 50, 77,166,201, 52, 95, 60,205,186,180, 95,152,209,137, 85, + 59, 47, 63,239, 13, 64, 52,211,100,154, 76,147,105, 50, 77,166,201, 52,153,230, 63,109, 99, 77,132, 12, 6,131,193, 96, 48, 24, +207, 25, 17, 59, 5,213,211,210, 75,184,200,223,215,189, 77,101,148,143,231, 1, 0,252,163, 89, 4, 42,167, 19,224,121, 80, 74, +145, 83,160,188,113, 39,159,126,246,180,199, 11,241, 33, 13,220,229,242, 21, 60,165,157, 31,253,233,140,170,216, 48, 35, 86, 69, +149,214,106, 52,243, 36,205,228, 2,124,192, 83, 52, 7, 0, 1,193, 29, 61,143,111,239,230,209,187,207,122, 62, 8, 33, 36,220, + 13,147,165, 54,138, 81,142, 78,206, 77, 74, 75,139,238,155,244,134, 29,241,133,248,149, 62,197,196, 78, 65, 13, 72, 7,158,226, + 19, 0, 2,177, 0,223,221, 43,166,167, 88,169, 99, 48, 24,255, 79, 60,235,188,118,150,234, 30,147,207,168,201, 38,200,251, 39, + 27,172,112,119, 50, 13, 4, 11, 0, 80, 80, 44,140, 43,160,245, 90, 47, 45,220,155, 68,203,133,194, 53, 0,132,122,147,101, 22, +229,113,182,218,202, 92,128, 46,114,137,240, 59, 0,188,222, 98,153, 20,151, 99,125,123,108,132, 47,233, 43,226, 5, 27,121, 74, +197, 22,158,174, 7,197, 1, 59, 9, 46, 92,202,162,245, 26, 22,239,239,235,222,102,239,213,220,222,167, 86,190,135,246,205,131, + 64, 45, 28,192,155,161,136,250, 0, 39,150,143, 71,251,102,254,160,188, 25,224, 57,216,245, 91,138,126, 17,142, 79,125,115,132, +248,144, 6, 1,174,238,177,171, 87,175,241,244, 14, 12, 35, 60,103, 66,226,213,163, 99,223,255,112, 94,143, 8, 71, 18, 97,141, +201,106,225, 77,222, 8,106, 28,242,193,140, 5,203,132, 94,222,126,182,188,217,192,229,165,222,109,245,195, 55,243,118,181,240, + 38,223,221,206,161,107,172, 53, 82, 97,110,152, 34,146, 73, 71,218,200,109,155,148,151,107, 30, 88, 76,230, 29, 17,222,162,190, +223, 46, 93,209,178, 91,175,254,118, 22, 77,158,192,204, 35,108,251,182,173, 1, 63,254,252, 75,127, 66,200, 96, 74, 41, 95,159, + 60,243, 20, 31,222,219, 48,185,191, 88, 36, 36,205, 94, 95, 45,196, 83, 78,133, 16,230, 65,198, 16,138,168, 58,159, 92, 4,231, +226,243,233,150,167, 57, 70, 51, 15,242, 59,161,104, 10,130,157,132, 98,107, 92, 1, 45, 96,143, 14, 6,227,197,194,215,215,247, + 84, 86, 86, 86,247,231,169,233,237,237,221, 33, 39, 39,231, 50, 59,187,204, 96, 89, 81,251,226,139,184,164, 76,103, 88, 76, 8, +111, 26,184, 8, 64,189, 12,150, 92, 40, 92,127,237,126,190, 39, 56, 19, 86,127,249,214, 54,163, 25,224,204, 38, 88, 56, 51, 44, +156, 25, 28,103,130,197,108, 6, 53, 27, 48,239,143, 83,128, 81,131, 54, 17,193,235, 1,120, 89,123, 12, 49, 21,108,188,113,254, +104, 3, 98, 84, 97,203,202,175,223,201, 44, 44,123,231,248,157,156,162,112, 15, 50, 39,190, 0,107,235, 99, 4, 78,173,122, 15, +155,246,252,149,245,253,239,218, 4,158, 82, 52,112,176, 9, 25, 59, 48,206,111,195,190, 83,153, 43,214,235, 19, 0,192,209, 86, + 26, 50,225,206,125,255,103,185, 8,238,114,249,138, 95,127,249,209,211,203,197,134,112, 23, 23,131,179, 88,224, 23, 48, 64, 56, +103,250, 88,175, 47,150,175, 89, 14,224,181,218,190, 31,234, 65,194,154, 6, 53,155,181,254,175,139,254, 90,117,129,241,232,230, + 79,146, 96,128,217,211,167,153,120,209,215,203,132,115, 63,122,111,102,168, 7,185,146,144, 79,227,235, 48, 87,130,102,238,216, +247,245,226,165,205,123,244, 27,104,199,151, 21, 10,245,218,178,166,171,255, 88,179, 32,180,121, 59, 69, 84,132,175,164, 96,199, + 84,162,211,148,192, 36,144,203,122,132, 71, 59,232,198,141, 54,175, 94,183,105, 58,128, 31,234,245,250, 71,255, 85,246,120,254, +233,223, 38, 9, 69,212,173,203,167,166, 88,114,174,129, 90,204,128,197, 84,249, 19, 22, 51, 40,255,240,103,251,169,127, 0,192, + 83, 25, 44, 1, 69,239,227,231,175,121,229,231,229,182, 93,190,244,171, 57, 97,238,228, 16, 44,216,120,183, 4,103,234,107, 44, + 25, 12,198,127, 47,222,222,222, 92, 78, 78,206,115,109,217,241,241,241,233,159,157,157,125,240, 25,211,245, 1,128, 55, 30,253, +186, 38, 39, 39,231,219,103, 77, 87,219,182,109,125, 41,165,158,143,158,253,121,215,174, 93,203, 98, 37,224, 63,105,176, 0, 57, + 40, 15,236, 28, 10, 0, 54,245, 61, 24, 5,228, 32, 66,192,172,197,144,126,189,224,234,238, 9,152,203, 1, 83, 57, 96,214, 1, +102, 45, 96,214,161, 40, 55, 29, 48,105,129,228, 67,224, 40,149,213, 59, 87, 6, 21,112,111, 7,122,182,242,135,155,163, 28,239, + 13, 9,115,253,237,240,189, 53,107,142, 38, 70, 3, 24,101, 85, 90, 41, 69,251,200, 38,248,126,141, 54, 97,255,141,130, 62, 0, + 48,160,165,235,225,246, 97, 1,126, 43,214,235, 19,254,186, 83,210, 23, 0,250, 69, 56, 30,106, 23,226,229,207, 63, 67,116,151, +167, 52,202,187, 97, 19, 98,185,245, 43,120,117, 22,212,106, 29,178, 82, 55,192,217,167,181,192,194,163,107, 93,223,183, 17,226, +227,119,231, 46, 17,151,171,243,141,188,169,208,226, 38, 44, 21,138,164, 60, 65,246, 25, 67, 25,175,180,204,152, 60,158,155,245, +217,151, 31, 3, 24, 91,107, 52,200, 29,211,191,251,110, 69,100,167, 54,161,238,121,187,222, 35,101,165,249,224,132, 10,217,144, +142,157,224, 20, 28,198,231,159,254,142, 72, 3,163,225,228, 18,136,236,139,155,145,118,121, 55,233,220,106,184,108,237, 22,201, +184,154, 12, 86,176, 27,233,220,167, 75,187,109,129,254,222, 94,148,242,224,121, 10,202, 91,240,250,203,189, 49,103,123, 50, 44, + 22, 11, 70,244,233,220,115,201,148, 30,148,231,121, 80,202, 35, 51,175,184,252,228,149,132,158, 73, 37,244,138, 53,145,169, 22, + 29,186,119,190,115,227,114,168,249,222,159,104, 51,246,235, 4, 2,156,175, 82,230, 58,223, 60,178, 54, 20,248,227,233, 12, 28, + 33,164,153, 59, 44,105,135, 23,195,191,203,100,225,175, 91, 14,187,169, 10,179, 39,236,218,240,203,203, 43,127,253,117, 19,128, +169,236, 49,194, 96,188, 24,228,228,228, 60,119,147,117,241,226,197,156,103, 49, 89,109,219,182,237, 2,224,155,156,156,156, 10, +179,245, 77,251,246,237,231, 85,173,171,170,160,162,148,142,189,118,237,218,217,218, 52,103,206,156,233, 13,160,209,245,235,215, + 43,142,209,168,109,219,182,141,170,219, 87,161, 80, 88, 90,180,104,145,182,108,217,178, 28, 86, 66,254, 94,131,149,144,177,227, +189, 86,134,220, 50, 0, 72,176,194,164, 60,214,180,167, 55, 91, 22,175, 91, 48,126,113,120,195, 6,208,104,141, 56,122, 61, 13, + 22,139, 25, 22,142,123, 20,201,226, 96,225,204,232,211,194, 21, 47,233,167,226,135, 3,137,224, 44,252,215,181,105, 62,137,137, +242, 99, 90, 70,191,178,157,231,169, 84, 38, 22,168,154,250,185,184,207, 26,209, 66,240,222,144,112,232, 76,220, 43, 97, 30,228, +100,124, 62, 93,109,149, 38,255,239,115,103,210,234,254,102,225,234,204,123, 45,209,167,246,163, 7,246,114,160, 6, 21,204, 69, +201,208,148,155,145, 92,108, 70,158, 94, 9, 25,201,181, 74,147,167,104,238,235,227,165,184,176,237,163, 84, 23,161, 90,228, 46, +228, 36, 82, 1, 7, 11, 79,133, 84, 25,111,104, 16,218, 75, 92,209, 47,171,182,116,218, 40,236,199,119,233, 61,192, 49, 99,243, +100, 98,211,180, 15,220, 91,249, 33,245,236, 58, 20, 92, 63,128,226,156, 52,226,160, 87,194,195, 37, 8,253,198,142,194,183,163, +218, 66,163,214, 64,152,155,228, 40, 21,203,156,106,210,164, 22,140,253,110,201,151, 94, 34,161,224,225,249,172,216, 44,102,232, + 12, 6,192,194, 65, 46,226, 65,104,197,255,204,176,152, 77,138,230,195, 63,122, 11,192,149,186,242, 30,159, 79,183,132,187,147, + 40,240,230, 80,106,214,129, 0,231,227, 10,104,165,233, 9,243, 32, 99, 90,247,153, 24, 69, 9,206, 61,205, 53,138,112,193,192, + 54,141,236,108,109,213, 9,200,218,249, 14,146, 32,167, 30,157,222,192,152,215,167, 43,126,251,237,183, 65,132,144,105, 85,251, +160,253, 29,195,139,153, 38,211,252, 95,213,116,116,116,108,220,176, 97,195,121,102,179,185,139, 68, 34,241, 48,153, 76,224,121, + 62, 79, 42,149,158, 75, 75, 75,251, 92,165, 82,165,252,183,229,253,208,161, 67, 86,155, 44,107, 52,197, 98, 49, 78,156, 56,241, +192, 90,147, 85,205, 2,244, 27,119,238,220,137,237,219,183, 3, 0, 78,157, 58,133,224,224, 96,219,234,190,155,153,153,105, 59, + 98,196,136,141, 0,252,106,211,188,127,255,126,227, 47,191,252, 18, 59,119,238, 4, 0,108,216,176, 1, 77,155, 54,173, 54, 61, +183,111,223, 22,126,250,233,167,141, 1,228,252,221,215,232,159,110,176,146,253,157,165,173,160,183, 0, 64,114,125, 15, 22,159, + 71,151,180,240, 18,247, 61,177,243,231, 46,114,137, 0,243, 87,207,202, 44, 44,209,116, 16, 17,240, 0,192, 81, 8,156,237,164, +151,190,158,208,194,191,180, 76,143,253, 87,179,207,198,229,211,122,133, 66,227,114,232, 49, 0, 78,255,170, 32, 73,211, 9,223, + 30,219,186,245,227,190,205,103, 12,105,142,125, 23,211,102, 0, 88, 93,103, 33,231,121, 80,158,171,236,212,254,208,201,240, 0, +207, 61,246,198,192,131, 62,252, 27, 95,191, 8, 86, 55, 66, 68,165,238,232,215, 64, 33,253,105,202,148, 55, 29,204,133,247, 81, + 98,148, 32,179, 84,143, 60,157, 24,101, 34,119,100, 39,196, 88, 4, 4,199,234,142,178, 64, 77, 57,189,147,179,212, 78, 16,209, +235, 45, 31,245,225, 79, 74,165,132, 19, 58, 12,251,194,169,232,196,178, 52, 78, 91,168, 37, 4,117, 78,112,233,232,232, 20,172, + 47, 78, 19,170, 74,139,224,228, 25,142,190,175, 12,196,194, 1, 97,208,168,181, 40, 44,185, 68,155,120, 57,144,244,115,155, 48, +183, 95, 51, 20,231,231,194, 96, 6,136,214, 80,162, 55,234,203,106, 60,143, 2,252,250,254,236, 15,199, 4,120,185,217, 86, 12, + 22,160,188, 5, 45,154, 5,162, 87,151,246, 56,118,254, 2,174,197,220, 3,255,104,176, 0,229,121,100, 21,148,230,235, 77,150, +117,245, 58,161, 22, 14,212,172,175,214,128,225, 41,154, 6, 35, 61,136,194, 2,124,214,161,137,253,164,143, 7, 6,216,219,202, + 8,244,102, 11,244, 70, 51, 52, 23,126,130, 75,195, 72, 40,228,114,210, 10, 58, 17, 0, 54,121, 40,131, 81,133,145, 35, 71,202, +243,243,243, 79, 15, 24, 48, 32,172, 87,175, 94,138,168,168, 40,104,181, 90, 28, 61,122, 20, 90,173, 54,192,207,207, 47,224,232, +209,163,195, 59,116,232, 16,239,235,235,219,109,199,142, 29,245,233, 35, 43,194,191, 58,169,243, 0,184, 71, 75,121, 9,241,176, +163, 57, 79, 41,181, 60,109,218,165, 82, 41, 46, 93,186,244,220, 35, 89, 87,175, 94,125,240, 52,145, 44,173, 86, 43,241,242,242, +130,139,139, 11, 44, 22, 11,180, 90, 45,246,238,221, 11,149, 74, 5,158,231, 97, 99, 99,131, 47,190, 91,141,132,155,167,113,229, +202, 21,168, 84, 42, 73, 93,154, 69, 69, 69, 36, 36, 36, 4, 6,131, 1, 28,199, 65,175,215,227,248,241,227,149,191,139, 68, 34, +124,184,104, 57,238, 93, 63,141, 91,183,110,161,168,168,136,176, 82,253,247, 27,172,103,198, 98,225,230,252,182,126,235,165, 57, + 83, 71, 97,250,232,104,191,207,127,222, 29, 29, 95, 72,215, 3, 64,152, 27,153, 48,174,123, 19,127, 39,133, 24, 11, 55, 95, 7, + 40,157,243,172,199,139, 45,166,247,194, 61,201,140, 61, 87,210, 79,127, 50,170, 21, 2,189, 28,130,131,130,136, 52, 41,201,138, + 53,255,120, 14,206,118,178,144, 1, 45, 93, 15,131,231,225,100, 47, 11,133,133,131,147,157, 44,164, 95,132,227, 33, 0,112, 82, + 72, 66,171,139,116,213, 24,238,245,151, 76, 86,200, 68,147,109, 91,123,249,191, 54,168,151, 77,255, 65,195,109,236,196, 28,138, +175, 28,133, 90,236, 11,115,131, 0, 24,204, 37,200, 74, 73,178,156,184,124, 55,187, 72, 99,152, 85,103, 50, 41,206,102,167, 36, +186, 53,110,222,203,185,232,192,220,130,198, 19, 55, 55, 18,128, 23,104, 54, 13,203,183,117,111,103,115, 53, 57,165,140,167,255, + 30,193,121, 18,181, 74,149,102,182,192, 75,103, 17,217, 39,157, 90,139,143,251, 69,162,180,164, 0,122, 19, 7,149,142, 51,121, + 58,201,101,134,148, 88, 24, 76, 28,140,102, 30, 98, 39, 31, 28,189, 20, 83,196,155,205,135,106,210, 76, 42,162,183, 0,216, 85, +253, 91,144, 27,105,241,145,131,205, 45,152,117, 72,207,202,193,250,191, 46,181,122,180,223,211,191,157,242,220,195,102,230, 42, +145, 43, 66, 17,245, 52,157,219,155,121,144,118, 54,114,201,143,223,204,120, 53,172, 99,211, 6, 50, 62,235, 18, 8,111,130,173, + 69, 4,157,212, 2, 71,191, 64,240, 70, 13, 45,215,235,149,113,255,143, 75, 4, 49, 24,255, 11,132,134,134,122, 58, 58, 58,198, +205,158, 61,187,193,176, 97,195,176,103,207, 30,168,213,106,172, 91,183, 14, 43, 86,172,192,130, 5, 11, 96, 54,155,241,219,111, +191, 41,118,237,218,213,238,151, 95,126,201, 10, 8, 8, 8, 79, 79, 79,175,107, 65,117, 2, 64, 6, 64,252,168,238, 34, 0,248, +131, 7, 15,162,127,255,254, 56,120,240, 32,255,232,111, 22, 66,136,153, 82,106,120, 90,131, 37,149, 74,145,144,144,240, 92, 76, +150, 88, 44,134,157,157, 29,164, 82, 41, 18, 19, 19,235,109,178, 56,142, 19,102,101,101, 65,165, 82,161,215,160, 65, 88,254,245, +215,232,222,189, 59,122,245,234, 5, 74, 41,142, 31, 63,142,232, 78, 17, 24, 53,184, 27,238,222,189, 11,179,217,108, 85,122,243, +242,242,144,159,159,143,190,131, 6, 97,245, 47,191,160,125,251,246, 8, 9, 9, 1,199,113, 56,125,250, 52, 94,238,211, 9,242, +161,209,184,119,239, 30, 43,212,255, 43, 6, 43,182,128, 94, 14,115, 35, 7, 70,247,105, 55,112, 80,231, 48,172,222,118,226,203, +176, 48,178, 21, 0, 92,236,101, 95,140,239, 30,136,248,140, 82,156,184,149,115, 32,190,144, 62,151,209, 23,188, 5,174, 46, 14, + 10, 64, 40,133,206,196,115, 14,201,168,179, 99, 50, 79, 41, 20, 93, 62,194,184, 65,241,126,237,195,252,252, 42, 70, 17,218,245, + 95,134, 9, 49, 15,252,219,134,120,250,195, 98, 6, 44,102, 56,140,218, 12, 44,178,173, 51, 29,157, 27,203,142,125, 52,107,198, + 75,253,134,190, 98, 35, 85, 56,194,162,206,132, 57, 47, 6,197,247,207, 66,171, 8, 70, 94,122, 50,182, 31,185,162,186,159, 85, +172, 22, 8,112, 52, 95,101,248, 32,169,132,150,213,165,171, 55,227,235,121,115,103, 13,216,190,117,155,189, 44,176, 51, 73,250, +169,191, 74, 42,226,100,110,141, 90, 11,202,229,174,244,171,117,219, 28,180, 70, 44,174, 75,167, 92,171,222,125,252,232,225, 81, + 77, 26,119,182, 79,189,246, 23,116,122, 3, 12,102, 32,188, 93, 55, 88, 44, 84, 74, 4,132,119, 16, 10, 73, 65,113, 41,136,217, +146,127,238,118,106,238,249,219,201, 66,131,125,221,218,143, 21, 58, 34,124,119, 80,183,150,128, 89,135,193, 93, 34,177,124,211, +137,119, 0, 76,124,182,139,252, 48,130, 69,129,206,225,238,100, 21,128,206,215,247,174, 8,109, 51,244,125,212, 39,130, 21,225, + 70,250, 69, 4,121,175, 93,254,197, 71, 13, 92,124,131,133,132, 55,131,122, 54, 7,212, 89,148,100, 93,130,163, 79,123, 88,188, + 59,225,183, 31,150,150,241, 60,221,250, 52, 83, 84, 48, 24, 47, 50,122,189,126,247,146, 37, 75, 26, 12, 28, 56, 16, 0, 80, 86, + 86,134, 75,151, 46, 97,205,154, 53,176,181,125,252, 57,217,191,127,127, 80, 74, 27,204,159, 63,127, 55,128,142, 53,105,118,234, +212,105,208, 15, 63,252,144,211,178,101,203,228, 71, 38, 75, 2, 64, 16, 27, 27, 43,200,204,204, 36,206,206,206,212,219,219,219, +156,147,147,195, 3,176,188,254,250,235, 66, 59, 59,187, 38,101,101,101,103,158,214, 96, 73,165,210,231,210, 39, 75, 44, 22,131, + 16, 2,169, 84, 10,137, 68,130,236,236,236,122,153, 44,142,227, 68, 7, 15, 30,196,245,235,215,177,160,101, 75,204,240,241, 65, +131, 6, 13,112,250,244,105, 80, 74, 97,107,107,139,146,146, 18,108,221,186, 21, 61,122,244, 0,199,113, 18,107,116,119,238,220, +137, 27, 55,110, 96, 81,155, 54,152,225,232, 8, 59, 59, 59, 28, 63,254,176,213, 79, 38,147, 33, 61, 61, 29,199,143, 31, 71,183, +110,221, 88,161,254,187, 13, 86, 55, 66, 68,196, 3,158, 38,163, 14,148,163, 0,129,119, 88, 24,145,196,199, 83, 83,125, 15, 42, + 16, 96,238, 15,235, 15, 12, 88,246,254, 32, 50,121, 72, 43,239,207,215,158,154, 6, 0,147, 70, 52,245, 81,200, 68,248,126, 95, + 60, 21, 8, 48,247,121,100, 48, 44,140, 72, 4, 2, 76,235,213, 62, 4, 57, 74, 35,146,114,148, 39,227, 41,181,170, 73,231,196, +178,113,216,176,255,116,230,138, 13,250, 4, 74, 41,156,236,100, 33, 19,238, 36,249,175, 61,120, 35,227,187,237,250, 4,202, 83, + 56, 41,196,161, 19,239,118,170,115, 20, 97, 91,127,201,228, 57, 31,125,208,105,200,196,217,114, 46, 97, 7,140, 73, 71,192,155, +116, 80,155, 36, 80, 10, 61,145,149,145,129,175,126, 59,144,169,214, 26, 71,197, 22,212,207, 88,222, 43,162,101, 97,110,100,216, + 87, 11, 63, 57,246,245, 23,243,237,116,201,167,203,132,132,211, 9, 27,118, 21,125,177, 96, 25,209, 24,140,175, 36,149, 80, 77, + 93, 58, 6,123, 44, 94,242,221, 15, 3,222, 28, 59, 60,161,105,112, 87, 23, 75, 78,138,139, 94,173, 46,216,124,248,134,231,163, + 55, 67, 2, 0, 73, 89,197, 40, 84,105, 57, 11,103, 62, 99, 47,198,231,113,214, 68, 3, 31, 17,232, 65,220,134, 69, 53,127,213, +205, 94, 2, 93,153, 18,238,246, 98,244,105, 31,244,106,160, 7,249, 40, 57,159, 22, 62,189,193, 50,131,154,117,184,188,184, 71, + 40,181,152, 67, 97, 49,195,116,103, 99,253, 35, 97, 4, 51,166,119,177,115,112, 54,166, 10,160,181, 5,108, 92, 65, 28, 2, 0, +199, 70, 68,220,236, 21,228, 36,199,113,239,188, 58,182, 56, 37, 45,235,119, 87, 27,124,203, 30, 33, 12,198,227,164,167,167,143, +159, 51,103,206,249,246,237,219,123,184,186,186, 34, 50, 50, 18,251,247,239,199,236,217,179, 43,247,105,217,178, 37, 40,165, 40, + 41, 41,193,146, 37, 75,242,114,114,114,198,215,166, 25, 23, 23,151,176, 97,195,134, 46, 97, 97, 97, 38,137, 68,162, 4, 32, 83, + 42,149,242,146,146, 18,162,215,235,193,243, 60,239,232,232,104,201,201,201, 49,143, 26, 53,202,112,241,226,197, 32,173, 86,155, +254, 44, 17,172,182,109,219,198, 42,149, 74,149, 64, 32,120,230, 41, 28, 42,204, 85, 68, 68,132,155, 86,171,229, 1,148, 62,205, + 20, 14, 28,199,161, 77,155, 54, 56,114,246, 38, 14,158,184, 8,117, 78, 34,166,189, 57, 30,145,145,145, 56,114,228,200, 83, 95, +179, 22, 45, 90,224,240,241,243, 56,127,253, 54,210,239,221,193, 59,211,222, 68,120,120, 56, 14, 31, 62,204, 10,244,223,109,176, +154,185,145, 22,222, 77,164, 27,231,247, 11,106, 38,238, 53, 31, 68,108,131, 29,193,135, 59,205,253,234,167,132, 72, 15, 50, 54, + 38,191,238,209, 94,143, 69,177,242,105, 92,184, 59,217,114,251,110,232,171,131,219,251, 97,245,126,197,103, 0,240, 74, 84, 99, + 92,189, 95,136, 43,247, 10,182,196, 21,208,184,103,205, 92,164, 7, 81,128, 98,203,146,119,135,116, 11,240,245,196,154, 61,231, + 65, 8,118, 91, 85,209, 82, 74,219,135, 5, 96,197,134, 39, 71, 12,122,250,127,183, 93,159,112, 36, 86,221, 15, 0,122, 55,179, + 61,212, 54,200,217,191,174, 72,134,141, 84, 52,165,223,240,113,114,238,222,126, 32,237, 56, 8,103,128,206,196, 35,183, 72,131, +114, 71, 63,156,190,116, 91,167,210, 27,223,143, 43,120,186,168, 93,124, 33, 77,110,233, 69, 50,202,180, 58, 47,133, 91,144, 94, + 40,224,249, 50, 3,197,213,248, 52,117, 92, 46, 77,180, 70, 35, 41,137, 26, 59,250,146,168, 85,235,183,207, 19, 75,164,175, 8, + 9,136,187,147,173,219,170,101,139, 96,111,111, 7,222, 88,246,127,236,157,117,120, 84, 71,219,198,239, 57,235,217,221,184,111, + 18,136,224, 1, 2, 73,112, 40,161, 4, 45,148, 66,161, 20,104,145,182,120,129, 66,145, 82, 40, 82,156, 22, 43, 69,107, 80,220, +139,123,112, 77, 32, 33, 9,132, 32,113,119, 91, 61,123,230,251, 35,242, 6,136,108, 2,253,222,190,244,252,174,107,175,100,237, +222, 57,115,100,238,243,204,204, 51, 64, 97, 58,250, 79, 88,146, 30,150,168,247, 4,128,134,118, 68,249,142,151,120,155,144, 33, + 9, 23,162,117,115,170,251, 13, 98,192,216, 97, 61, 90,138, 56, 93, 33, 38, 45,223,131,205, 51,251,225,147,174, 77, 68,199,175, + 69,141, 5,176,176,182,251,154, 26, 89, 80,131, 26,237,102, 95,126, 72,128,171, 20,232,120,119,239,162,198, 64,136,201, 26,126, +132,136,132,206,164,137, 79, 29,133,152, 75,184, 6, 46,225, 26, 21,184,117, 0,169,243, 14, 33, 78,254,244,167, 21,243, 11,183, +110,253,229, 12,199, 96, 65,117, 41, 47,120,120,254,173, 80, 74,159, 90, 89, 89,245,236,221,187,247,249,211,167, 79,219, 52,107, +214, 12, 0, 80, 58, 99,205,223,223, 31, 13, 27, 54, 68,106,106, 42, 62,254,248,227,140,228,228,228,158,148,210, 42,199,244,230, +231,231, 63,219,191,127,191, 99, 97, 97, 97,203, 57,115,230,164,213,173, 91, 55, 79,163,209,144,156,156, 28,142,101, 89, 88, 91, + 91, 75, 90,182,108,137,246,237,219, 23,220,184,113,195, 61, 62, 62, 62, 31, 64, 76,109,202,255,249,231,159,227,224,193,226,102, +226, 77,228,197, 18,139,197, 8, 12, 12,116,185,126,253,122, 34, 0,212, 38, 47, 86,249,230,229,254,253,251,184, 20,146, 0,161, + 78, 13, 73,122, 18,110, 30,218,143,190, 99,198,131,101,107, 63, 90,225,254,253,251, 56,124,238, 38, 20, 82, 33, 30, 61, 10,199, +254,253,251, 49,110,220,184,215,210,228,169,198, 96,213,171, 71, 36,210, 2,204,235,225,239, 50,227,163,142,245, 4,134,188, 36, +112, 70, 14, 2, 17,224, 96,103,129, 63,255,220,229,185,107,207,158, 27, 45, 92, 68,235, 56,150,253, 54, 44,149, 22,213,224,183, +231,173,218,115,245,163, 63,167, 5, 8,199,245,106,108, 3, 0, 98, 33,131,181,127,133,179, 0,230,189,206, 70,181,115, 37,178, + 2, 3, 70, 59,217, 90,206,253,230,243,247,108, 2,252, 27,226,210,173, 7, 88,183,255,198,101, 73, 26,182,155,124, 80,115,134, +151,167,192, 86, 56,139, 16, 92,245,227, 41,141, 70,234, 36, 86, 88, 67, 31,115, 17,208,107,160,209,234, 17,159,105, 68,124,150, + 6, 66,185, 24,119,163, 18,212,182, 41, 56, 86,219,109, 38,132,144,142, 94, 50,213,119,139,127,116,213,168, 11,216,188,236, 12, + 86, 44,185, 41,146,155, 73,147,107,162,115, 35,129,106, 58,123,138,253, 0, 78, 32,145,209,162,217, 83, 71, 40, 18, 35, 78,163, + 62,147, 4, 66, 41,204,154,188, 7,115, 51,129,184,147,135, 56, 14, 0, 60,156, 44, 37,203, 23,124,109, 57,101,230,130,106,199, +120,121, 19, 34,110,222,202,105, 74,179,186,214,184, 28,252, 16,151,195, 98,195, 47,223,125,212,180, 75,115, 21, 26,186, 90, 77, +246, 38,100, 89, 4,173,121, 68,180,120,199,176,128, 65, 83, 54,139,208,219,145, 12,105,245,209,156, 10,103, 15, 86,134, 7,192, + 69, 25, 41,136, 64, 0, 16,166,120, 70, 99,252, 53, 8,173,188,232,174,189,135,139,126,249,101,251,247, 17,233,148,143, 90,241, +240, 84, 67, 78, 78, 78,168, 92, 46,239,225,227,227,243,199,164, 73,147,204,135, 13, 27,166,250,226,139, 47, 24, 0, 72, 77, 77, +229,214,172, 89,147,244,211, 79, 63,229,102,100,100,140,212,235,245, 97,166,220,240, 18, 66,174,255,250,235,175,233, 87,174, 92, +105,218,186,117,107,169,159,159, 31,103,109,109, 45,148, 74,165, 70,157, 78,167,137,138,138, 50, 62,125,250,212, 57, 39, 39, 39, + 26,192,147,218,116,223,171, 84, 42, 48, 12,179,208,213,213,245,187,164,164,164,102,111, 98, 12, 86,253,250,245, 85, 0,162, 93, + 92, 92,234,215,180,123,240,149, 6, 91, 40, 68,118,118, 54,138, 82,194, 33, 75,120, 12, 31, 5, 3,111,107, 37, 44, 44, 44, 94, +203, 12,229,230,230, 2,133,137,184,122,245, 62,192,178,176,180,180,132,165,165, 37,111,176,254, 46,131,213,212,129,140,179,150, + 96,205,152,247,234,137, 61,234,184, 66,155,112, 23,247,227, 11,240,109,219,214, 17, 2,169,185,102,204,167,253,252, 7, 12,116, + 71, 64,251, 86,196,195,217,114,242,178, 85, 27, 39, 52,117, 36, 95,135,167,210,181,166,252,112,120, 26,125,214,196,129,252,114, + 49, 52, 97,172,171, 92, 13,142,163,184, 24,150,140,176,152,236, 95, 34,211,232,179,154,108, 68, 83, 21, 9, 20,130,217, 67, 41, +149, 89, 42, 20,249, 45, 91, 52,182, 11,108,215,130,233,217,217, 31, 98, 1,112,245,246,125,124,181,234,224, 77,142,163,239, 5, +155,216, 61, 88, 60, 99,240, 69,227, 84, 60, 99,208,240,194,140, 65, 74, 41, 45,158, 69, 88,245,176, 46,129,128,164, 20,197,222, +113, 18,217, 54,128,250,201, 69,196,100,115,136, 77,203, 71,158,208, 9,218,196, 68,128,114,113, 65,148,214,250,104,182,179,179, +115,240,244,110, 88,111,253,182,253,208, 23,229,226, 89,208, 31, 40,200, 78,198,162, 77,127,213,115,117,117,237,156,144,144,112, +169, 6,102,173,225,249, 99,187, 28, 64, 1,129, 72,138,227, 27,246, 34,195,214, 12,118,114, 49, 56,117, 58,198, 76, 25,102,217, +171,219, 48, 75, 0,136,125,116, 15,117,229,106,147,116,245,182, 24,240, 81,151, 70, 86, 48,168,177,237,212, 61, 13, 3,244,220, +126, 38,252, 73,151,198, 86,178,143, 58,214,181, 94,152,148,243, 33,106,153, 12,180, 52,130, 85, 22,209,171,197,236,193,125,148, + 26,155,216,147, 39,123,174,167, 41, 6,118,243,147,139,133,132,208,130, 68, 80, 51, 59,108,220,182,175, 64, 98,192, 22,254,146, +193,195, 99, 26, 69, 69, 69,193,132,144,230,211,167, 79, 31, 50,123,246,236,119, 20, 10,133, 39, 0, 20, 22, 22, 62, 51, 24, 12, +151, 1,236,170,201,108,191, 18,195, 20, 77, 8,121,246,228,201, 19,199, 29, 59,118, 88, 1,144,149,188,173, 1,144, 3, 32,245, +117,102, 16,150,154, 41,149, 74,245,221,155,170,135, 82, 51,229,226,226, 82,191, 54,223, 23, 8, 4, 70, 66, 8, 8, 33,144, 74, +165,184,114,229, 10, 6,189,215, 13,145,199,115,208,204, 74,137,214, 35,199, 96,207,217,179, 16, 8, 4, 32,132, 64, 32, 16,212, +168, 29, 17, 10,133,184,122,245, 42, 62,249,120, 32,164, 66,192,210,210, 18,211,167, 79,199,145, 35, 71, 32, 20,242,171,233,253, + 61, 17, 44,130,133,103,255, 88, 34,134,209,128,163,127,252,128, 99, 15, 10,116,143,210,241,109,163,116,172,217,143,124, 46,125, +213,246,177,103,175, 62, 88, 57,106,112, 31,249,187, 93,186,225,221,128, 46,194,166,173, 58,207, 5,176,182, 92, 67, 29, 88, 85, +174, 12, 35,135,239,183,156,122, 56,102, 79, 80, 20,129, 62, 31,131,187,183,162, 70, 14,223, 87,211,248,191,162,105,105,166,220, +115,245,198, 13,107,232, 11, 16,115,239,130,204,221,179, 30, 96,212, 35, 58,250, 49,126,218,118,136, 11,186,253,232, 79, 29,139, + 73, 79,178,104,161,169,154,197,142,138,133,165, 66,210,168, 87, 51,203,147, 28, 40,172,228,226,198,148, 51,194, 74, 46,106,220, +189,137,226, 36,165,148,154,155,137, 26, 83,163,161, 90, 77,181,142,221,188,237,183, 95,126,252,236,179,207, 20, 25, 9, 41, 72, +202,123,128, 2,137, 11, 12,114, 55, 60,185,119, 89, 93,164,101,171,109,188,171,170,207,140,140,140,180,224, 91, 89,216,179,105, + 41, 12, 58, 45,210, 18,138, 61,106, 82, 70, 30, 44,236, 92,110,212, 68, 83,207,114,185, 3,134,141, 22,155,153,195,236,147, 1, +125, 36, 79, 50,181,240, 85,153, 23, 95,228, 10,210, 17,121,238, 42, 2, 10,139,253,218,211,120, 6,117, 91,168, 76, 42,167,185, + 76, 60,169,151,159, 11,158,197, 37,227, 74,120,226,182,167,153, 52,201,203,150,108,123,146,148, 51,182, 95,219, 58, 88,125, 36, +226,203,202, 76, 81,101,154,222,142,100, 8,128,142,197,131,220,213,160, 64, 71,111, 71, 50,196,148,153,131, 21,105, 10,197, 24, +250,227,201,216, 57,251,238,100,244,155, 49,180,147, 69,251,246,189, 37, 96,117,200, 87,107, 13, 17,217, 52,239,117,246,209,107, + 68, 39,121, 77, 94,243,127, 82,179,196,236,252, 89,242,120,147,154, 73,120, 41, 47,211,235,110,123,249,238,192,164,164, 36, 97, + 73,244,170,202, 65,238,213,105,150,239, 14, 76, 76, 76, 60, 81, 18,189,170, 50,138, 85,129,102, 82,155, 54,109,108,250,246,237, + 11,163,209,136,199,143, 31, 35, 54, 62, 30,129, 99,191,132,149,149, 21, 46,135,134,226,209,163, 71,248,238,187,239,192,113, 28, +110,222,188,153, 80,157,166, 72, 36,210,183,104,209, 66,252,193, 7, 31,128,101, 89, 60,125,250, 20,137,137,137,248,234,171,175, + 96,105,105,137,224,224,224, 50, 77,173, 86,139,103,207,158,233,255, 63,142,165,127,143,193, 2,140, 48, 26,144,123,118, 30,214, + 94,129, 94,111, 64,227,240, 52,250,188,220,251, 27,125,108,201,209,208, 7, 15,159, 5, 95,123, 87,130,180,176,226,239,212,128, +168, 12,154,220,202, 77,152, 15,125,190, 5,158,158,196,243,212,252,130,168, 12,154, 92,211,141,160,156,145, 64, 95, 4, 36,223, +197,245,203,151, 16,116,243, 62,238,132, 61, 52, 94, 15,142,218,195,112,248, 62, 34,131, 62,174,177, 38,165, 80,190,183, 26, 35, +194,162,235,180,106,232, 88, 7, 70, 22,148, 51,192,114,240, 46,140,140,104, 95,167,149,151, 85,157,226,200,149, 1,214,159, 95, + 0,126,148, 85,169,119, 39, 78,191,165,163,167,244,195,252,156,204,182, 93, 59,183, 83, 88, 54,233,133,140,232, 40, 60,190,127, + 85, 29,252,224,201,245, 59,113,250,215,138,142,184,184,184,188,211,181,115, 35, 12, 30,243, 13,244, 69,185,120, 26,244, 27, 10, +178, 82,112,229,134, 18, 15,243,242,218, 1, 48, 57,130,117, 61,214,208, 20, 0, 58,122,136,227,204,161,117,250,180, 79, 95, 72, +137, 6,156, 54, 15,164, 40, 3, 79, 18,117,185, 31,110,138, 55, 2,128, 92, 74,132, 10,154,107, 97,138,174,119, 93,219, 6,114, +129, 1,219,207,134,131,227,138,151, 89,226, 56,108,220,126,225,201,216,239, 63,241,133,119, 29,235, 22,132, 16, 82,147,208, 62, +161,232,116,103,207,130,198,154,243,115, 1, 78,143,171,147,109, 26,119, 90,155,213,169,182,145,176,176, 68,154, 8, 96,108, 19, + 21,217, 60,121,237,169,185,254,103, 35, 58, 78,251,188,159, 5, 40,191, 48, 58, 15, 15,207,127, 37, 18, 56,102,230,204,153,155, + 5, 2,129, 61, 0, 66, 41,133, 86,171, 21,110,218,180, 73,196,178, 44, 35, 16, 8,140, 50,153,140, 13, 14, 14, 54,112, 28,151, +174,215,235,199, 84,167,169,211,233,158,172, 95,191,190,158,193, 96, 40,155,113,168,213,106,241,219,111,191, 65,171,213, 66, 42, +149, 66,169, 84,226,233,211,167, 32,132,232,141, 70,227, 19,126, 79,188, 73,131, 69,177,160,195, 39,243,230, 1, 32,160,152,255, +146,185, 2, 0,132,102,210,164,166, 14,228,171,166,173, 58,207, 43,253, 78, 77, 11,160, 49, 26, 7,182,106,222,112, 55, 0,104, +169,241,147,218,108, 68,158, 86,253, 81,203, 86,237,246,112,148, 10, 89, 74,127, 97, 56, 28,208,176,136, 52,101,230, 92,165,119, + 30,105, 57,193,165, 11, 56,115,160,255,233, 22, 44, 73,199, 64, 41,165,101,221,130, 63,200,144,145,171,173, 54,143,211,213,103, +218,110,173,234,136, 71,159,185,118,111,140,209, 72,157, 4, 2,146,162,214,177,155, 95,215, 92,149,220,125, 93,242,118, 32,103, + 66, 91, 56,118,183,147,151, 68,181,138,128,140, 34,156, 73, 72,203,191, 84, 27,205,236, 66, 67,191,217,107,142,252, 37, 17, 9, +132,160,180, 56, 17, 40,165,208,232,141, 89,165, 38,204,199,150,168,166, 31,102,119, 11, 4, 36,182, 58,189, 91,143,146, 87, 15, + 94,118,238,235,240,152,236, 95,158,103,211, 7, 0,240, 60,155, 62,168,111, 75,230, 62, 73,201,255,250, 65,108,246, 15, 53, 29, + 55, 65, 9,174,180, 26, 60,239,149,215, 94,183, 62, 35,147,232,125, 0,253,155, 58,144,110,131,167,253, 52,141, 16,240,203, 68, +240,240,252,139, 40,141, 98, 49, 12,179,240, 77,105,150, 70,177, 0, 68,215,224, 59,183, 0, 52,127,147,219, 22, 28, 28,156, 9, + 32,147,223,203,255, 37,131, 21,158, 70, 55,194,132,197,156, 77,253, 92,165,223, 79,162,231, 0,216,190,206, 70,148,104,216,188, +201,138, 9, 77,165,115,255,142, 10, 47, 49, 83,127,203, 88,158,136, 52,218, 3, 0, 26, 52,104, 64,163,163,163, 65, 41,125,173, +236,187,145,233,244, 62, 94, 90,114,161, 34,147, 13,160,147, 41,122, 81, 25,244,123,224,213, 46,224,232, 76,186, 8,192,162, 90, +109,115, 45, 51,181,155,124,108,165,209,179, 64,245,217,244,121,120,120,222, 78,147,245,166, 53, 95,119,225,103,158,183,192, 96, +241,252,239,242,248,241, 99,126, 89, 3, 30, 30, 30,158,202, 49,254, 13,154,124,210, 97,158, 23, 96,248, 42,224,225,225,225,225, +225,225,225,121,179, 16, 0,129, 21, 90,241, 26,204, 14, 32,132, 4,214,216,234, 87,163,207,107,242,154,188, 38,175,201,107,242, +154,188,230,219,167, 89,157,246, 91, 51, 59,145,150, 27,188,252,166, 31, 0, 2,121, 77, 94,147,215,228, 53,121, 77, 94,147,215, +228, 53,255,109, 15,190,139,144,135,135,135,135,135,135,135,231, 13,195, 27, 44, 30, 30, 30, 30, 30, 30, 30, 30,222, 96,241,240, +240,240,240,240,240,240,240, 6,139,135,135,135,135,135,135,135,135, 55, 88, 60, 60, 60, 60, 60, 60, 60, 60, 60,181,135,212,112, +101, 18, 30, 30, 30, 30, 30, 30, 30, 30,158,106,224, 35, 88, 60, 60, 60, 60, 60, 60, 60, 60,188,193,226,225,225,225,225,225,225, +225,225, 13, 22, 15, 15, 15, 15, 15, 15, 15, 15,111,176,120,120,120,120,120,120,120,120,120,120,131,197,195,195,195,195,195,195, +195,195, 27, 44, 30, 30, 30, 30, 30, 30, 30, 30,222, 96,241,240,240,240,240,240,240,240,240,252,247, 13, 22, 33, 36,144,215,228, + 53,121, 77, 94,147,215,228, 53,121, 77, 94,147, 55, 88, 60, 60, 60, 60, 60, 60, 60, 60, 60,188,193,226,225,225,225,225,225,225, +225,225, 13, 22, 15, 15, 15, 15, 15, 15, 15, 15,111,176,120,120,120,120,120,120,120,120,120,120,131,197,195,195,195,195,195,195, +195,243, 95,130, 0,168,112, 38, 0,165,244,156,201, 34,181,152, 77, 80,157, 62,175,201,107,242,154,188, 38,175,201,107,242,154, +111,159,102,117,218, 53,241, 31,255,104, 40,165,127,219, 3, 64, 32,175,201,107,242,154,188, 38,175,201,107,242,154,188,230,191, +237,193,119, 17,242,152, 26,165,116, 36,132, 56,242, 53,193,195,195,195,195,195, 83, 61,194, 55, 41,214,152,144, 54, 43,223,169, + 51,175,247,165,216,158, 38, 52,216, 12,254, 51, 6,140, 43, 14,166, 21,219,226,215, 48, 1,111, 92,147, 7, 32,132, 44, 37, 4, + 51, 74,254, 95, 65, 41,253,230,109,220,206, 25, 51,102, 12,244,245,109, 5,107, 89, 42, 90,121, 61, 6,178,119, 1,214, 31, 97, +206,233, 46,104,229,219, 1,151, 67,226,113,249,102, 56,110,108,232,139,207,167,204,131, 70,163, 71, 70, 70, 18,238, 95, 61,181, +255, 45,218,215,109, 69, 34,209, 71,214,214,214,230,105,105,105,231, 1,252, 5,224,125, 7, 7,135,174,217,217,217,249, 6,131, + 97, 47,165,244,102,109,180,223,105, 73,102, 74,196,162, 81, 26,189, 97,249,213,123,244,183, 0, 63, 98,203,114, 88, 38, 19, 11, + 59,105,117,236,138, 43,247,233, 47, 53, 44, 43,121, 41, 26,207,159,235,175,201,187,239,190, 59, 66, 32, 16, 44, 6, 0,163,209, +248,237,133, 11, 23,254,120, 19,186, 42,149,106, 8,165, 84, 81,178,223, 10,147,146,146,118,153,250, 93, 63, 63,191, 88, 0,117, + 74,158,198, 5, 7, 7,215, 53,229, 61,158,154,113,247,238, 93, 90,183,110, 93, 52,111,222,252, 81, 74, 74,202, 79,148,210,141, +124,173,252, 67, 12, 86, 35, 66,234,143,237,221,254,108,247, 15,123, 40, 76, 49, 66, 46, 46, 46,203,236,237,237,199, 21, 21, 21, +105, 0, 80,129, 64, 64,155, 52,105, 2, 66, 8, 74,175,155, 70,163, 49,253,225,195,135,205, 76, 53, 87,111, 74,179, 97,195,134, +119, 25,134,113, 45,127,253,174,238,127,142,227, 18, 34, 34, 34,252,171, 43,167,179,179,115, 15,134, 97,102, 85,247, 57,142,227, +150, 37, 39, 39,159,174,234, 51,205,155, 55, 15, 81, 40, 20,142, 12,195,144,202, 62, 83,190,205, 97, 89,150, 22, 21, 21,165,134, +135,135,251,214,160, 17,115, 36, 4, 51, 56,142, 50, 0,192, 48,100,166,181,181,245,206,236,236,236,136,210,247, 75,126, 39,181, + 38,199,139,139,139,203,112, 0, 95, 3,160, 0,126, 76, 76, 76,220, 86,147,239, 55,104,208,224,174, 88, 44,118, 21, 8, 4,228, +229,125, 82,209,115,142,227,168, 78,167, 75,120,244,232, 81,165,251, 40, 40,232,210,190, 21, 43, 86,132,108,249,245, 23,223, 22, + 45, 7,130,145,119,129,158, 90, 32, 36, 70,139, 86, 45, 8, 40,199, 65,147,151, 6,142,227, 80,164,209,226,252,161,223, 66,234, +120,212,243, 69,241, 88,198,183,193, 92,245, 28, 62,124,248,146,229,203,151,219, 73, 36, 18,102,239,222,189,237,190,250,234,171, + 81,171, 87,175,118,249,232,163,143,204,117, 58, 29, 55,115,230,204,119, 8, 33, 11, 40,165, 71,106,162,221,190, 37,105,219,200, +195,249,187,137,195,222,197,215, 75,119, 79,236,216,156,100,152, 41,196, 27, 63,236, 84,207,170,169,167, 53, 22,108,190, 62, 9, +192, 47, 53, 40, 43,113,115,115,107,233,232,232,232,161, 86,171,141, 0,208,180,105, 83, 42, 16, 8, 94,248,156, 94,175,215, 63, +124,248,240, 4,127,169, 55, 13,129, 64,176,248,212,169, 83,206,148, 82,244,232,209, 99, 49,128, 55, 98,176, 40,165,138,228,228, +228,210,107,160,162,134, 95,175, 19, 28, 28, 92,106,168,234,212,224, 61,147,105,215,174,157,140,213,235,199, 11, 24,166, 59, 5, +154,163,248,164, 14, 51, 2,103,133, 66,225,207, 55,110,220,208,188,237,251,254,236,217,179, 24, 61,122, 52,194,194,194, 26,157, + 56,113, 98,131, 74,165,154,144,156,156,220,133, 82,154,206,159, 25,255, 69,131,213,148, 16,135, 62,126,141,174,140,255,100,160, +156,219,191,134, 96,196,156, 42,141,144,179,179,243,242, 78,157, 58,141,218,177, 99,135,226,240,225,195, 10,119,119,119,136,197, + 98, 8, 4, 2, 8, 4, 2, 48, 12, 3,161, 80,136,247,223,127,223,164,134,235,101,205,243,231,207, 43, 26, 54,108,248, 74, 35, +203, 48, 12,122,245,234, 85,173, 38,195, 48,174, 33, 33, 33, 14, 50,153,172,204,164,112, 28,247,194,163, 92, 63, 52, 88,150, 69, +167, 78,157, 76,170, 43,134, 97,102, 69, 70, 70,190, 83, 88, 88, 88,101,223,109,137,222,233,106,180, 84,215,174,156,119, 32,250, +103, 0,155, 5, 42,176, 1, 36,158, 0, 35,173,240,243, 89, 89, 89,232,210,165,139,224,117,246,245,123,239,245, 33,148,210, 67, + 42,149,234,124, 70, 70,134, 57, 33,248,184,150,145,173,111,162,162,162,204, 41,165,104,212,168,209, 44, 0, 53, 50, 88, 2,129, +192,245,204,153, 51, 14, 82,169,180,108, 63, 87,246,215,104, 52, 66,175,215,163,103,207,158,108, 53,166, 22, 63,111,254,205, 87, +163, 53, 64, 67,221, 17, 30, 89,136,147, 39, 15,193,163,208,128, 39, 15, 52,224, 56, 21, 52,249,105,160,148, 66,173,209,161, 69, +192,135,190, 28,247,246, 4, 77, 44, 45, 45, 7,174, 94,189,218,254,151, 95,126,201,123,244,232,145,126,211,166, 77,246, 99,198, +140,105,172,215,235, 49,118,236,216,244, 70,141, 26,137, 87,175, 94,109,127,232,208,161, 30, 0,106,100,176,132, 4,223,127,220, +175, 59, 52, 6, 6, 6, 3,107,239,108,111,254,231,228,225, 1, 34, 74,117,216,126, 36, 24, 6,150,251,173,166,230,170, 87,175, + 94,117, 55,110,220, 40,140,140,140, 20, 54,105,210, 4, 70,163,177,236,193,113, 28,140, 70,163,201,231, 37,207, 11,231, 22,226, +227,227, 97,105,105,105, 22, 16, 16,144, 76, 8,153,127,241,226,197, 45,127,199,111,189, 78,100,235, 77,225,231,231,215, 90,200, + 48, 7,230,206,158,232,228,211,178,165,192,193,209, 30, 81,143,227, 32, 22,112,129,209, 15,163, 2,150,252,176,113,178,159,159, +223,135,193,193,193,183,223,182,125, 93,119,192, 47, 27, 56, 86, 63,174,248,153, 21,128, 45,200,207,207,199,231,159,127,142, 35, + 71,142, 52,105,219,182,237, 50, 0,163,248,179,226,191,100,176,188, 9, 81,180,112,119, 10,250,254,235, 49,214,244,228,239, 76, + 81,102, 26,196, 85, 24, 33, 39, 39,167, 69,157, 58,117,250,100,199,142, 29,214,132, 16,156,157, 56, 10,214,122, 13, 84,223,173, +128,181,157, 61,116,179, 70,195,220,200,194,231, 98,168,169, 23,219, 87, 52, 31, 61,122,132,236,236,108,216,217,217, 65, 46,151, + 67, 38,147, 65, 44, 22, 67, 34,145,152,170, 9,153, 76,134,115,231,206, 65, 40, 20, 66, 32, 16, 64, 40, 20,150, 61,202, 63, 23, + 8, 4,112,116, 52,125,104, 18,199,113,203, 26, 55,110,236, 19, 21, 21,101,145,147,147,131,182,109,219,230, 17, 66, 66,203,221, +233,249,132,134,134, 90,152,220,216,232,159,161, 32,110, 19,104,246, 1,192,106, 0,140, 22,131,161,129,103, 89, 3, 83,254, 47, +199,113,181,185,243, 76, 37,132,172,232,219,183,207, 44,128, 32, 48, 48,176, 96,226,196,137,244,209,163, 71,221, 63,248,160,159, +199,227,199,209, 37,102,143,204, 32,132,172, 53, 53,146, 69, 41,149, 2,192,149, 43, 87, 64, 41,149,213,230,216,147, 74,165,184, +113,227, 70, 89,132,146, 97, 24, 48, 12, 3,129, 64,128,163,209,118, 40,212, 49, 40, 74,125,128, 47,251,212,129,167,167,231, 43, +134,251,149,125, 67, 41, 38,140, 25, 21,178,112,249, 26, 95,163,209,136,147, 39, 79, 98,213,170, 85,208,106,181, 8,232,218, 29, +207,105, 11, 52,243,180, 3,199,113, 80,107,116, 8,189,116, 32, 68, 85,199,211,247,109,185, 24,228,230,230,254,217,176, 97, 67, + 65,122,122,250, 5, 0,207, 12, 6,195,250, 63,255,252,211,225,179,207, 62, 75,219,177, 99,199, 68, 0,110, 43, 87,174,236, 81, + 80, 80,176,167, 38,186,157, 90,144,222,254, 45,155,181,173,227,230,134, 75,215,111, 67, 44, 17, 89,141, 31,209, 7, 74,165, 16, + 63,252,114,156,139, 77,200,154,120,229, 62,221,102,226,185, 73,156,157,157,125,186,119,239,238,182,113,227, 70, 49, 0, 60,120, +240, 0,105,105,105,176,181,181,133, 76, 38,131, 72, 36, 42,187, 97,227,169,145,209,104,216,165, 75, 23,153,209,104, 68, 97, 97, + 33, 54,110,220,104,105,102,102,102,217,171, 87,175,121, 0, 76, 54, 88,237,219,183, 79,213,233,116, 14, 0, 32,145, 72,210,174, + 95,191,238, 8,160,200,195,195,195,172,228, 35,234, 26, 70,182,226,202, 69,167,226,106,240, 94,181,248,251,251,183,106,210,208, +227,220,210,165,243,149, 57,121, 41,176,180, 76, 5,131, 28,108,217,242, 51,204,204, 44, 48,111,222,108,161,127,155, 54, 46,147, +191,154,125,206,207,207, 47,240,109, 51, 89, 28,171, 31,215,194,191,125,217,243,109,103,215, 65,107,233,139,196,249,243,177,102, +205, 26, 52,104,208,160, 53,127,102,252,151, 12, 86, 0, 33, 66, 87, 27,229,209, 13,243, 38,123, 48, 55,142,137,212,113,209, 72, +210, 24, 97,245,159,147,231, 92,249, 11, 35, 0,198,209,209,113,252,174, 93,187, 44, 74, 27,187, 70,196, 8, 43,232,225,209,180, + 41,228,150, 86, 72, 97,245,160, 6, 61,196, 34, 81,133, 13,162, 41,154,165, 17, 48,177, 88, 12,177, 88, 92,118,193, 21,139,197, +213,106,190, 80, 57, 66, 33, 24,134,193,217,179,103,193,178, 44, 6, 14, 28,248,138,185, 18, 10,133, 47,116, 65, 86,167,153,156, +156,124,218,197,197, 37,148, 82,250,142,209,104, 4, 33, 36, 52, 49, 49,177,115,233,251,206,206,206, 61, 90,180,104, 49,139,227, +184,101, 38,149,147,205, 4,205,218, 5,243,118, 25,200,187, 97, 7,162, 8, 4, 71,220, 17,246, 56, 25, 23,238,196, 32, 61,187, + 16,126, 13,237,209,163,125, 61, 24,141, 70,147,183,189, 60, 46, 46, 46, 87,210,211, 51, 6,189,251,238,187,200,202,202, 98,231, +207,159,143, 22, 45, 90,160, 97,195,134,149,153,167,106, 53, 9, 33, 73,161,161,161,238,106,181, 26,132,144, 36, 19, 12,217,185, +138,140,240,159,127,254, 9,141,230,213,232,189,117,231, 37,248,122, 64, 93,140,252,114, 27, 86, 60,218,139, 13, 27, 54,224,229, + 33, 58, 47,107,114, 28,135,133,203,214,248,170,181,186,178,186,210,106,181,184,113,227, 6,180, 69,249,184,184,227,139,178,232, +165, 90,163,131,171, 79, 55,223,234, 52,223, 4,255, 95,154,148,210, 32, 0, 65,229,234,119,206,142, 29, 59, 6, 1, 56, 72, 41, +189, 14,224, 58,128,221, 53, 46, 39,193,200,143, 6,124, 0,161,216, 28, 15,163, 19,208,185,157, 47, 28, 29, 28, 16, 26,249, 4, +177,137, 89,169,132, 96, 68,207, 14,210,101,106,181,110,206,229,123,244,215,234, 52,157,157,157, 61,183,108,217, 34, 42, 31,113, + 17, 8, 4, 47,156,235,165,175, 85,100,178,254,151,247,209,223,165,233,231,231,215, 48, 32, 32,224,250,162, 69,139,172,226,227, +227,113,237,218, 53,184,187,187,163,168,168, 8,213, 13,109,123, 89, 83,167,211, 57,148,235,182,115, 0,128,148,148,148,221,248, + 79, 87, 58,173, 73, 57,171, 26, 87, 85,147, 49, 87, 47,151,179, 94,189,122, 18, 59,107,235,125,203,150, 47, 84, 70, 68, 94, 70, +203, 22,109,161,180,244, 6,103, 76, 65,102, 86, 1,178,163,147,176,104,209, 10,204,155,255, 45, 86, 44, 95,164, 28, 60,100,228, +129,118,237,218,213, 47,223, 93,248,191,190,223, 25,161,120,227,253,187,215,199, 1, 64, 94,228, 65, 76, 30,210, 30,249,249,209, + 24, 59,118, 46, 18, 19, 19,241,248,241,227,224,255,207,114,242, 6,171,156,185,241,151,138,118,238,158, 55,177,181, 52, 38, 76, +162,125,112, 3, 73, 90,142,254, 17,207, 38,254, 80,197,247,138,138,138,116, 71,142, 28,193,153, 9,163, 80,159,176,176,249,110, + 37, 28, 93, 92,144, 51,242,125,228, 27,244,168,119,242, 54,164, 74, 37, 36, 10,101,181, 17,135,242,154, 23, 47, 94, 68,120,120, + 56,132, 66, 33,148, 74, 37,148, 74, 37,164, 82, 41, 36, 18, 73,153,185,170,204, 96, 85,114,240, 64, 32, 16,224,193,131, 7,136, +141,141,133,149,149, 21,174, 93,187,134,174, 93,187,190, 18,197,170,229, 1, 95, 97, 68,169,100,220,213,105, 83, 53, 32,178, 3, +108, 62, 65,254, 77, 21, 96, 61, 12, 6, 88,193,104, 52,226, 94,116, 38, 70,127,242, 30, 0, 96,252,156, 77, 8,108,227, 81,102, + 14, 76, 69,165, 82,153, 1,152,209,160, 65,131,193, 67,135, 14,101,197, 98, 49, 10, 11, 11,161, 86,171,241,224,193, 3,246,189, +247,250, 20,244,237,219, 71,121,252,248,113,142, 82,172,168,225, 56,172, 84,149, 74,229, 94,210, 13,155, 90,139,227, 15,132, 16, +236,221,187,183,194,247, 71,172,138,128,176,120,120, 22, 54,110,220, 8,163,209, 8, 74, 41,169,174, 62,191,155, 53, 37,100,242, +204,133,190, 28,199,161,107,215,174,152, 54,109, 26,158, 62,125,138, 65,131, 6,149, 69, 3, 41,165, 80,107,181, 72, 12, 59, 23, +226,236,230,225,251,182, 94, 28, 40,165, 39, 0,188,254,248, 37, 10, 23, 7, 39, 55, 48,212,128,164,180, 76,124,240, 94,119, 8, +196, 74, 60,143,207, 64, 11,111, 47,231,161,239,119,112, 22, 16, 22, 51,150,237, 26, 15,224, 87, 19,206,119, 99,100,100,164,232, +254,253,251, 16, 8, 4,176,176,176,128, 92, 46, 47, 59,199,203, 27, 46,158,202,233,214,173,219, 24, 0,243, 40,165, 57, 1, 1, + 1,142,139, 23, 47,182, 78, 76, 76, 68, 68, 68, 4,246,238,221,155,206,178, 44, 11,128, 80, 74, 23,188,129, 99,137, 43, 31,217, +106,223,190,125,218,245,235,215, 29, 9, 33,133,165,145, 43, 66, 72, 97, 45,162,110,162,188,156,228, 47,173, 21,180,159,144, 49, +247, 96,243, 10,158,103,179,204, 17, 11,123,199,159,130,131,131, 13, 85,125,215,210,210,242,243,197, 11,167,170,236,236, 56, 4, +116,126, 23,201,169,122, 44,153, 58, 28,153,153,249,248,117,235, 82, 0, 18,232, 89, 1,222, 9,248, 16, 14, 14, 46,232,212,177, +147,211,165,171, 87, 38, 0,248,225,109, 57, 6, 98, 15,126, 62,158, 16,242,125,157, 58,117, 46,109, 90,186,180,126,215,174, 93, + 1, 0,231,207,159,199,111, 67,134, 96, 62,240,233, 58, 66,146, 39,189,165, 19,155,254,177, 6,203, 67,170,188,180,229,171, 65, +109,109,141, 69, 34,221,213,163, 72,212,114,236, 15,209,250,162, 59, 57,116,200, 15, 21,159, 96,148, 16,194, 17, 66, 56, 79, 79, + 79, 88, 24, 52,176,162, 58, 56,170, 84, 48,183,177, 69,150,161, 56,114, 37, 81, 40, 32, 81, 40, 77,186, 56,150,215,244,246,246, + 70,106,106, 42, 36, 18, 9,148, 74, 37,204,205,205, 95, 49, 87,166, 94,112, 9, 33,224, 56, 14, 66,161, 16,161,161,161,232,216, +177, 35,220,220,220,176,119,239, 94,244,232,209,227,149, 46, 67, 83, 77,219,203,141,121,249,136, 82,233,224,119, 83, 6,183,191, +128,164, 30, 88,243,143,192,200,187,194, 0, 75,104, 56,167,226,238, 64, 74,113,226,118, 42, 30,197,102,130, 51,114, 53,238, 34, +116,118,118,246,147,201,100, 43,102,205,154,169,106,209,162, 5,210,211, 51,192,113, 28,148, 74, 37,212,106, 53,204,205,205,209, +161, 67,135,148,249,243,231, 63,163, 20,189, 40,165, 41,255,141, 3,248,204,153, 51, 47,116, 15,150, 62, 10,147, 19, 48,114,210, + 14, 72,132, 64,104,104, 40, 26, 55,110, 92,125,184,156,163,152, 52,115,129,175, 70,171,131, 68, 34, 65,251,246,237,209,182,109, +219,178,113,113,165, 6, 85,175,215,195,104,228,224,228,253,174, 47,121, 11, 47, 10,132,144, 86, 0, 62,179,180,180,116, 47, 42, + 42, 74, 49, 24, 12,123, 75, 76,127, 15,145, 72,244,145, 92, 46,119,202,205,205,141, 1,240, 43,165,244, 78,117,122,102, 50,153, +173, 84,102, 1,142,213, 66, 40, 20,194,205,205, 3,212,168, 67,118,158, 26, 35, 6,247, 69, 72,104, 36, 78, 93,188,201, 26, 12, +220, 58, 83,203,216,176, 97, 67,100,102,102, 66, 32, 16, 64, 46,151, 67,161, 80,160, 81,163, 70,136,143,143, 47, 51, 87,124, 23, + 97,181, 44, 56,121,242,164,131, 80, 40,116, 50, 26,141,136,139,139, 67,120,120, 56,214,174, 93,155,154,159,159, 31, 16, 28, 28, + 28, 85, 27, 81,137, 68,146, 86, 26,185,146, 72, 36,105, 85, 69,182, 94,103,204,149,171,171,171,151,139,131,244,236, 31,107, 39, +214,241,105,217,154, 49, 19, 40,179, 11,159,166,118,188,125,243,102,251, 57,191,238,159,224,234,234,218, 61, 33, 33,225,105,165, +141, 31,195,244,106,225,219, 82, 8,154, 2,161,164, 35, 86, 44, 31,140,244,140, 60,100,103,229, 67, 44, 86, 64,103, 16,192,200, + 17,180,239,216, 9,191,111,219,131,166, 77,155, 9, 4, 64,183,183,201, 96,149, 68,128,151, 29, 62,124,184,190, 76, 38,195,226, +197,139, 97,110,110,142,155,223,127,143,223,196, 98,152, 1,216,168,215,207, 2,192, 27,172,255, 47,131,165,112,108, 52,100,247, + 39,221, 58,120,123,186, 48,134,189,107,145, 80,196,106,230, 61,210,107, 30,230,211,247, 35, 40,189, 86,149,175, 32,132, 80,177, + 88, 12,199,153,223,163,110,179,230, 40, 28, 61, 0, 89, 6, 61,188,142,223,132, 84,169,196,195,110,190,160, 58, 29,222,121,152, +102,170,113,161,132, 16, 10, 0,246,246,246, 16,139,197,144,201,100,144, 74,165,144, 74,165,101,198, 74, 34,145, 64, 34,145,152, +108,134, 56,142, 67,126,126, 62,158, 63,127,142,209,163, 71, 67, 46,151,163, 36,212,141,186,117,235, 66, 40, 20, 34, 49, 49, 17, + 23, 46, 92,128,167,167, 39, 36, 18, 73,141,218,218,114, 13,182,143,139,139,203, 37, 66,136,207,221,187,119, 45,252,253,253, 97, +106, 4,171,184, 53, 20, 67,139,186,224,136,219, 11, 99,173, 12, 6,246,133,109, 41,141,190,152, 24,185,234, 86,191,126,253,181, +203,151, 47,103, 92, 93, 93,193,113, 28,172,173,173, 81, 84, 84,132,140,140, 76,120,123,123,195,205,205, 13,203,151, 47, 7,128, +221,255, 45,115, 5, 20,119, 7,151, 26,172,242, 70,107,210,251,117,144,149,165,132, 64,192,148, 25,230,106,247, 57,165, 88,183, +124, 94,200,208,209,211,124,167,204, 89, 1,141, 86, 15,181, 86, 7,141, 86, 7,141, 86, 95,242, 87,135,210,129,237, 41, 17, 23, +222,186, 8, 22, 33,164, 79, 96, 96,224,250, 85,171, 86, 57, 57, 57, 57,137,210,211,211,217,159,127,254,185,199,207, 63,255, 28, + 49, 97,194, 4,239, 9, 19, 38, 88,219,219,219, 11, 83, 82, 82, 12, 83,167, 78,237, 65, 8,153, 69, 41,221, 93,229,245, 66, 97, +110, 35, 16, 43, 64,136, 16, 86,150,214, 16, 74, 20,224, 88, 33,140, 28, 96, 97,105,143,235, 33,251,113, 45, 44,127, 76, 90, 38, +246,153,114, 83,213,172, 89, 51, 42, 16, 8, 96,107,107,251, 66,215, 32, 0, 56, 58, 58, 34, 47, 47, 15, 2,129,160,236, 53,158, +202,175, 65,148, 82, 60,123,246, 12, 69, 69, 69,184,126,253, 58, 14, 28, 56,144,254,178,185, 10, 12, 12,252, 66,169, 84,206, 87, +171,213, 43, 78,159, 62,189,182, 58,221,146, 49, 87,111,140,138, 82, 49,248,249,249,137,156,108, 5,167,207, 28, 92, 93,215,156, +187, 71, 16,243, 57,240, 56, 47, 92,121,203,225,157,174,173,222, 99,154,127, 63,217,189,215,236, 31, 79,251,249,249, 53,170, 44, +146, 69, 41,245, 53, 83, 40, 1,164, 34,248,110, 80,153,185,202,204,202,133, 86, 47,128, 86, 71,160,209, 51,120, 55,176, 39,214, +111,250, 19,137,169,153, 40,157, 97,248, 54,209,160, 65, 3, 63, 23, 23, 23, 76,153, 50, 5,154, 93,187, 80, 0,160, 15,128,195, +122, 61, 0,192, 28,152,198,159, 45,255, 79, 6,203,202,169, 81,231, 57, 51, 39,175,233,248, 97, 79, 38,245,139,118,200, 41,208, +106,103, 68,176, 92, 66, 81,181,230, 10,148, 82,218,184,113, 99, 48, 12, 3,165,165, 21,204, 44, 44,160, 41, 23,185,146, 42,205, + 65,117, 58,112,122, 29,196, 38, 94, 28, 75, 53, 41,165, 48, 51, 51,131, 88, 44,126,161,107,176,212, 88,213, 36,130, 5, 0, 57, + 57, 57,216,183,111, 31, 90,183,110, 13,185, 92, 14,161, 80, 8, 31, 31, 31, 68, 70, 70,194,203,203, 11,132, 16, 28, 62,124, 24, +253,251,247,199,211,167, 79,225,237,237,173,172,141,193, 58,123,246,172, 5,165,244, 29, 74, 41, 50, 50, 50,106,181, 19, 57,142, + 67, 65, 65, 1,206,156, 57,131,228,228,100, 56, 58, 58, 34, 59, 71, 14, 75, 85,147,226,223, 42,103,178, 76,100,124,159, 62,125, + 24, 66, 8,212,106, 53,164, 82, 41, 20, 10, 37,204,205, 45,208,176, 97, 35, 36, 38, 38,162,123,247,238,198, 39, 79,158,236, 18, +139,197,235,106, 90,222,122,245,234,153,231,228,228,188,231,225,225, 33, 6, 0, 51, 51,179, 62,238,238,238,150, 49, 49, 49,185, + 53, 52, 3,101,198,138, 16, 82, 54, 3,149, 97, 24, 8, 25, 6,206, 78, 14,101,207, 75,182,157, 84, 87,143, 67,190,152,230,203, + 25,117,216,190,234, 83, 16, 54, 19, 44, 44,161,133, 11, 88,163,160,204,192, 42, 20, 10, 52,237,252,209, 91, 25,193, 18,139,197, +195,183,110,221,234,242,199, 31,127,228, 28, 57,114, 36,183, 77,155, 54,138, 53,107,214, 56,172, 95,191,190,139, 78,167,195,148, + 41, 83,210,110,221,186, 85,216,175, 95, 63,203, 45, 91,182,184,212,175, 95,255,125, 84, 48, 46,139, 16,162, 0, 48, 24,192, 39, + 1,173, 45,133, 57,249,106,112,172, 14,207, 98,158, 35,183, 64, 7,206,168, 71, 92, 66, 18, 10, 52, 70,100,102,229,195,199,183, +251, 79, 65, 65, 65,223, 18, 66,102, 83, 74,143, 85, 87, 78,163,209,136,155, 55,111,226,218,181,107,184,124,249, 50, 98, 99, 99, +203,222,179,176,176,192,217,179,103,209,165, 75, 23,254, 10, 95,245, 53,104, 94,247,238,221,231,217,218,218,202,214,173, 91,103, + 89,183,110, 93,176, 44,171,123, 57,114,229,239,239, 63,103,206,156, 57,206, 31,124,240,193, 68, 0,107,107,251,123,149, 69,182, + 76,224,149, 84, 12,233,233, 41, 95,252,180,117,184,157, 66, 28,155,132,199, 63,186,148,196, 98,128,162, 60, 32,104, 39, 72,135, +185,207, 71, 4,142,183, 94,126,100,253, 23, 0, 54, 84, 38,252,228,105, 60, 54,110, 92,143,175,166,140,192,239,191,174, 0,199, + 9,161, 53, 8, 80,199,163, 45,180,122, 14,132, 17,162,133,175, 63, 46, 6, 93,129,136, 1, 38,143,185,245,214, 29, 7,143, 31, + 63,190, 29, 27, 27,219,120,238,220,185,248,221,197, 5,230,230,230,152, 58,111,222, 13,150,101,219,243,103,201,255,147,193,242, +107,232,245,189,165,141,245,168,246,173,154,216, 78,157,248,133,232,105,138, 6, 23, 58,126,147,179,127,249, 76,101, 60, 85, 78, +136,165, 57,215,106, 18,117, 96, 23, 78, 69,166, 81, 7,143,163,215, 33, 85, 42, 17,213,195, 31, 84,167, 67,135,144, 88, 72,149, + 74, 8,101,102,181, 57,129, 95,232, 14,124,249, 57,195,152,150,184, 94,175,215, 91,117,235,214, 13, 93,187,118,197,135, 31,126, + 88, 54,230,170,101,203,150,216,189,123, 55, 6, 12, 24,128,123,247,238,193,217,217, 25,141, 27, 55, 70,227,198,141,113,225,194, +133, 26,223, 61, 26,141, 70,244,232,209, 35,143, 16, 18, 74, 41,245,185,125,251,182, 69, 77, 53, 74, 27,155, 51,103,206,224,189, +247,222,131,151,151, 23,130,131,131,113,102,193, 15,144,219,212, 1, 96, 5,206,104,132, 78,167, 3,195, 48,213,142,193, 10, 8, + 8, 16, 10, 4,130, 70,245,234,213, 67,122,122, 58,210,211,211, 97,111,111, 15,149, 74, 5, 7, 7, 7,172, 90,181, 10,107,214, +172,185, 77, 41, 93,150,146,146,242,176,166,251, 72,165, 82, 5, 90, 91, 91,255,160, 86,171,197,165,101, 33,132,136,156,157,157, +111,168, 84,170, 89, 73, 73, 73, 71,107, 98,176,244,122, 61, 8, 33, 56,254, 76,133, 66, 29, 65, 94, 66, 48, 38,191, 95,247, 5, +195, 37, 18,137, 94, 72,171, 81,185,193,162,216,181,245,199,144, 89,223,124,230,139,172, 29, 96, 51,119,128, 88, 15,193,129,240, +158,248,243,150, 45, 0,160,161, 19,131, 31, 71, 41,223,218, 8,150, 94,175,223,210,160, 65, 3,232,116,186,243, 0,182,134,134, +134,246, 79, 78, 78, 94,253,215, 95,127,169, 6, 13, 26,148,116,244,232,209,175, 0, 28, 10, 13, 13, 29,185,120,241,226,174, 6, +131,161,194,217,101, 2,129,224,247,169, 83,167, 6, 12, 26, 52,136,136, 25,131,238,204,233,109, 66,150, 53,144,233,179,127, 49, + 6, 93,189,196,176,172,129,124,248,241, 84,238,196,133, 48,102,204,164,149,198,150,109,223,195,131, 7, 15,156,250,244,233,179, + 8,128, 73, 6, 75, 36, 18,149, 25,232, 10,126,159,239, 34,172,134,243,231,207,111, 6,176, 57, 32, 32, 32, 85,161, 80,160,160, +160,224,149,115,164, 93,187,118, 50,149, 74, 37, 19,137, 68,104,221,186,181, 77,143, 30, 61,162, 24,134, 89,123,242,228,201, 26, + 39,161,172, 40,178, 85,219, 52, 13,230,214, 92,159,150,109,155,154, 63, 50,159,111, 46, 19,106,238,185, 71,201, 44, 8,128, 92, +173,227,179,235,177,131,243, 72,154,180,101,179, 64,119,200, 25, 89,159,202, 12, 22, 33, 36, 36, 47, 39,183, 87, 94,190, 14, 87, +175, 61,192,199,131,235, 67,171, 39,224, 56, 6, 5,133, 90, 64, 32, 2, 3, 96,200,208,225,160, 68,136,236,140, 20, 16, 32,236, +109, 59, 14,140, 70,227,172,126,253,250,181, 90,188,120,113,147,169, 83,167,150,238,151,118, 42,149, 42,130,207,131,245,255, 96, +176, 26,120,185,246,236,220,202,127,210,183,179,191, 53,127,124,251, 50,190, 93,244, 19, 87,223,191, 71,238,178, 93,135,243,115, +149,117,186, 22, 37, 61,188, 87,211,168,131,136, 53,128,178,122, 72,149,202, 23, 34, 87, 18,133, 2, 34, 51,121,141, 54,130, 16, + 2, 74,233, 43,221,129,229,205, 85, 77, 46,182, 18,137, 36,231,202,149, 43, 14, 9, 9, 9, 47, 12,104,247,240,240, 0, 33, 4, +183,110,221,194,205,155, 55,241,241,199, 31, 67, 40, 20, 66, 36, 18, 33, 52, 52, 52,191, 54, 17,172,210, 89,132,206,206,206, 61, +218,180,105, 83,225,236, 65, 83, 34, 88,113,113,113,240,242,242,130, 86,171,133,181,181, 53,178, 82,158,225,233,227,135, 40,210, + 26,224,238, 32, 65, 70, 70, 6, 74,243,122, 85,197,165, 75,151,168, 74,165,122, 33,242,147,158,158, 14, 79, 79, 79,108,220,184, + 17,107,214,172,217,144,156,156, 92,227,187, 88, 23, 23, 23, 27,142,227, 22,247,233,211,167,111,255,254,253,209,163, 71,143, 23, +222,223,177, 99,135,229,193,131, 7, 55,185,185,185,245, 23, 8, 4,179, 98, 98, 98, 82,171,219,231, 0,240,219,111,197,233,147, +228,109,231, 97,214, 32,119,124, 50,126, 27,126,252,241, 32,164, 82,233, 11,141,237,194,133, 11,171,175, 71, 74,209,237,195,207, +125,187,248,232, 96,204, 60, 12,139,246,217,200,187,110,141,220,124, 95,220, 90,213, 27, 0,208,252,179, 99,160,212, 29, 0,222, +202, 8, 22,165,244, 44,128,179,229, 94,218, 79, 8, 49, 16, 66,134, 2,216, 67, 41, 61, 88,242,250, 47,168, 34, 49,104,219,182, +109, 91,206,158, 61, 91, 84,154, 54, 67, 85,103, 49,171,215,235, 57, 0,104,228,243,206, 11,125,213,209,209,209,248,241,199, 31, + 81, 88, 88, 8,113, 13,194,204,129,129,129,101, 99, 34,197, 98, 49,236,236,236,160,215,235,193,178, 44,111,174,106,198,188,222, +189,123,207,163,148, 82,142,227,230,150,187,217,146, 90, 91, 91, 95,249,233,167,159,108, 89,150,197,180,105,211,172, 50, 51, 51, +173,198,142, 29, 59, 11, 64,165, 6,171,146, 52, 13,149, 29,111,181, 74,211,192,113,104,168, 84, 90, 32, 19, 9,208,218, 25, 90, +230,216,178, 89,103,147,191,184,167,138,245,245, 86, 24, 13,158, 76,158, 14,150, 50,115, 80, 74, 27, 86,246,219, 44,199,157,124, + 24, 17,209,189,142, 91,125,193, 95,199, 46,163, 95,255, 65,208,106, 25,104, 12, 4, 68, 32, 2, 17,136,209,220,199, 23,141,155, +250,128, 2,136, 10, 15,101,141, 47,158, 27,255,243,212, 29,240,203, 6,215,190, 63,143, 3,128,105,107,207,227,219,239, 87, 99, +216,135, 61, 48,114,228, 72, 62, 15,214,255,135,193,170, 83,167,142,149,131, 82,254,219,132,207, 70,153,199,222,191,129,132,208, + 27,184,118, 53, 42,123,231,129, 35,137,121,185,233,159,213,196, 92,149,143, 96,121,237, 56, 14, 23,103,231,178,200, 85,251,224, + 24, 72,149, 74, 4, 53,119, 1,167,213,162,251,243,188, 26,111, 76, 69, 81, 43,177, 88, 92,171,153,126,165,166,234,229, 1,237, + 99,198,140,193,214,173, 91,209,161, 67, 7, 52,104,208,160,214,119,202, 47,143,137,170,201,236,193,138,180,234,212,169,131,176, +176, 48, 88, 90, 90, 98,251,246,237,112,117,117,193,200,158, 94, 16, 8,138,187,182, 24,134, 49,105, 12, 22,165,212,232,226,226, +242,236,204,153, 51,158,131, 6, 13,130, 88, 44, 70,118,118, 54, 44, 44, 44,176,126,253,122, 78, 46,151,255, 94,211,242,185,185, +185,141,148,201,100, 11, 6, 15, 30, 44,108,212,168, 17, 82, 83, 83, 97,105,105,201,149, 44,109, 4, 27, 27,107, 78, 46,151, 99, +204,152, 49,240,241,241,233, 54,115,230,204,174, 42,149,106,105, 82, 82,210,207,213,153,172,221,187,139,123,167, 62, 91,251, 16, + 58, 93,241, 80,139, 13, 27, 54,192,217,217,249,133,207, 62,121,242,164,250, 89,132, 28,135,179, 7,126, 9, 25, 63,113,176, 47, +177, 30,130,188,235,214,160,150, 31, 35,181,192, 28, 59, 46,165,225, 82, 72,108, 89,162,209,183, 45,130, 69, 8,233,135,226,161, + 23, 39, 40,165,135, 8, 33, 3, 1,244, 40,125,142, 26, 38, 22,101, 89,150, 50, 12, 67,226,227,227,245,114,185,156,216,216,216, + 8,165, 82, 41,180, 90,109,153,209,138,142,142,198,177, 99,199,144,144,144, 0, 27, 27, 27,198,210,210, 18,122,189, 62,219,196, +187,238, 87,210, 51,148,252, 46,111,174,106, 72, 80, 80,208,102, 0,155, 75,159,191,251,238,187, 35,133, 66,225,183, 0, 44,183, +108,217, 98,101,101,101, 69,142, 30, 61,106,216,178,101, 75,142, 64, 32,200, 6,176,186, 42,189,138, 6,179,191, 14, 21,165, 98, +160, 20, 17, 89,185,207,234,138,172, 84,220,125, 13,189, 62, 37,126, 86,227,108, 81,125,123,210,180, 25,250,167, 69, 94, 29,201, + 62,105,159,158,146,198, 80,208,136,202,116,115,115,115,127,249,125,219,190,233,123,247,252, 86, 71,170,148, 98,204,216,217, 56, +126,234, 34, 8, 35,194,149,235,183,160,211, 27,145,145,149,139,193, 67,134,193,213,217, 14, 40, 72, 76, 23, 73, 36, 63,191, 77, +251,254,133, 60, 88,254,237,113,237,224, 74,236,142,170,131,196,239,191,231,243, 96,253,157, 6,203,221,221, 93,170, 16, 97,180, +141,153,120,198,132,161, 31,216,167, 61, 9, 71, 66,100, 8, 0, 64,171, 85, 27,146,163, 46,181, 48,225,162, 29,248,114,174,140, +210,174, 27, 27,123,135,178,200, 85,249,217,131,156, 86, 11, 78,175, 3, 42,233,206,169, 76,147, 97,152, 87,140, 85,249, 11,111, + 77,202, 89, 26, 29,169, 40,193,168,155,155, 27,150, 46, 93,250, 74, 30, 44, 83,202, 89,114,151,214,131, 16,226, 83,106,140, 40, +165, 62,206,206,206, 61, 76,153, 57, 88,153,102,105,198,234,147, 39, 79, 34, 34, 34, 2,148, 82,244,233,211, 7, 34,145, 8,230, +230,230,101, 38,171,162, 49, 88, 21,105, 50, 12,243,249,193,131, 7,167,223,184,113,163,231,180,105,211, 72,233, 88,150,130,130, + 2, 46, 57, 57, 57,191,166,229,228, 56,110,198,233,211,167,133, 70,163, 17, 91,183,110,197,157, 59,119,168, 92, 46, 95, 38, 18, +137,150,202,229,114,214, 96, 48,124,253,197, 23, 95,140,157, 63,127, 62,211,169, 83, 39,220,184,113,131,241,244,244,156, 8,224, +231,234,182,253,214,173, 91,197, 93,206, 89,113, 24, 63,107, 15, 20,102, 66, 60,124,248, 16, 89, 89, 89,175, 36, 31,173,190,156, + 20,190, 93, 6,249,114, 84, 15,189,114, 16, 24,179,119,139,151,202,121,174, 69, 43,159,226,168,163, 58, 47,189,172, 30, 43,138, + 96, 85, 86,206,215, 52, 63,127,171, 38, 33,164,111,147, 38, 77,190,137,136,136,112,109,222,188,185, 55, 33, 36,160, 89,179,102, +173,194,194,194, 74,159,139, 40,165,123,107,162,121,231,206,157,253,235,215,175, 31, 59, 98,196, 8, 49,199,113,198,216,216, 88, + 3, 0,226,228,228, 36,184,115,231, 14,247,215, 95,127, 65,173, 86,195,213,213,149,113,113,113, 33,103,207,158,229, 34, 35, 35, +111, 81, 74,103,155,186,237,165,145,105,145, 72, 4,129, 64, 0,181, 90,109,146,185,250, 95,220, 71,255,159,154, 2,129, 96,225, +129, 3, 7, 92,180, 90, 45,196, 98, 49,246,237,219,167,223,182,109, 91, 68,110,110,110,199,224,224, 96,117,109,203, 89,147, 4, +164,213,105, 22,228, 8,142,159, 58,253,160,149,160,231, 47, 24,159,148,222,177,204,120, 17, 98,115,208,209,187,163,188,117,243, + 68,243,203, 43,153, 34,104,142, 87,166,249,228,201, 19,157,191,191,255,160,153, 51,230,157, 95,176,104,129,114,238,188,121,184, +118, 43, 12,153, 57, 5,224,168, 0, 28, 33,248,246,219,185,112,178,179,129,141,196, 80,148, 89, 72,250,191,188,100,206,255,250, +126,127,157, 60, 88,127, 71, 57,255, 53, 6,203, 92,136, 7, 29,189,189, 92, 58,249, 54,149, 9,141,106, 36, 68, 62, 65, 86,161, + 6,103,195, 99,115, 24,202,252,254, 58, 63, 42, 16, 8, 96,105,105, 9,177, 88,140,118, 97,137,144,136,197,144, 42,205, 1,160, + 56,114, 69, 41, 24,137,180,166, 7, 80,133, 6,171,182, 24,141, 70, 56, 58, 58,190,176,236, 74,249, 6,187,212, 40,214, 52, 69, + 3,195, 48,179,110,220,184, 97, 17, 23, 23, 7, 74, 41, 14, 29, 58,100, 49, 96,192,128, 89,181,137, 94, 81, 74,145,153,153, 9, +142,227, 32,149, 74,209,179,103, 79,116,234,212, 9,250,146,217, 31,165, 13, 80, 77, 51,185,199,199,199, 39, 3,248,202,213,213, +245,247,233,211,167,207,104,211,166,141,255,252,249,243, 65, 8,169,109,104, 64,111, 52, 26,113,233,210, 37, 28, 60,120,144,213, +104, 52, 3, 82, 82, 82,238,150,123,127,145,171,171,235, 95, 3, 6, 12, 56,241,232,209, 35, 97, 68, 68, 4, 0,176,213,137,170, +213,106, 52,104,208, 0, 44,203, 98,249,120, 55,228,231, 55, 7,203,178, 48, 26,141, 80, 40, 20, 47,228,253, 50,101, 63,113,148, + 67,200,197,125, 33,117, 91,246,240,173,110,169,156,183, 44,130,213, 51, 34, 34,194,117,232,208,161,105, 97, 97, 97,174,199,142, + 29,179,234,211,167,143, 98,200,144, 33,105, 97, 97, 97,174,132,144,119, 0,236,173,225,249,243, 13, 33,228,212,146, 37, 75,102, + 77,154, 52,169,205,136, 17, 35, 68, 34,145,136, 75, 76, 76,100,119,237,218, 69, 26, 52,104,192,136,197, 98,114,250,244,105,238, +246,237,219, 55, 89,150, 93, 78, 41,189, 82,211,235, 72,169,185,226,199, 92,189, 81,246, 14, 26, 52,104,228,128, 1, 3,204, 90, +183,110, 45,253,229,151, 95,114,139,138,138, 42, 52, 87, 21, 81,147, 52, 13, 53, 77, 64, 90, 74, 82, 82,210,175, 75, 23, 94,158, +242, 73,227, 33, 94,159,219,185,227, 92, 97, 26,178,133, 2,198,194,138,129,111, 93, 1,212, 57,207,237,207,223, 58,240, 60, 57, + 41,169,202,188,106,119,239,222,189,227,231,231, 23,248,201, 39, 35, 15,140,249,236, 11,135,185,223,204, 20,237,255,235, 4,192, +234,113,251,202, 21, 88,201, 9,101, 11,147, 83, 51,117,228,131,183,113,169,156,216,131,159,143, 7, 48,158, 16,242,241,188,121, +243,118,141, 31, 63, 30, 28,199, 33, 40, 40, 8, 63,207,156,137,249, 70,227,167,235, 8, 41,154, 68,233,120,254,180,120,131, 6, + 11, 12,201,191,249, 56,182,224,214,227,216, 2,112,148,114,148,106, 25, 6,241,133,122,253,146,168,167, 9,167, 95,103,159,246, +236,217,147,121,217,184, 84, 4,203,178,166, 14,174,139, 13, 12, 12,124, 99,154, 28,199, 37,116,236,216,241,149,134,185,178,255, + 75,116, 19, 76, 10,201,114,220,178,118,237,218,189,242, 90,173,194,187, 28,247,172,107,215,174,250,151, 77, 87, 85,207,141, 70, + 99,130,169,250, 9, 9, 9, 15, 0, 12,115,113,113,233,210,163, 71,143,137, 0,106,155,142, 97, 85,151, 46, 93,166, 82, 74,133, +132,144,149, 47,153,171,210,223, 10,119,113,113,153,235,233,233, 89,182, 0,116,117,219, 30, 24, 24,168,175,110,145,231,242, 3, +160, 57,142, 75,168, 90,147,162, 78,139,238,190,122, 67,177, 73,171,106,169,156,202, 34, 88,255,163,236, 33,132,136, 0,100, 71, + 68, 68,188, 83, 18,185, 74,120,240,224,193,185,221,187,119, 59, 2,213,167, 79,168,228, 6,224, 10,128, 43,132,144, 78, 27, 54, +108,248,102,204,152, 49,173, 63,254,248, 99, 97, 64, 64, 0,142, 31, 63,110, 12, 10, 10,186,165, 86,171,151,213,212, 88, 17, 66, + 10, 94, 62,135,170, 40,195, 91,191, 72,239,155,230,236,217,179, 95,183,107,215,110,238,190,125,251,146,188,188,188,164, 34,145, + 72,103,170,185, 2,106,150,166,129, 82,202,213,242,216, 98, 29, 29, 29,123,239, 24, 58,254, 72,139, 9, 35, 60,122,118,240,151, +187,184, 59,184, 60,122,158,129,132,176,115,133, 79,131,214,199, 24, 53, 89,253, 40,165,213,222,168, 5, 7, 7,223,110,215,174, + 93,253, 13, 91, 54,141, 23, 48, 76,119,214,104,244,153, 58,126, 24, 37, 64, 24, 7,156, 21, 75, 37,111,253, 98,207, 82,177,248, +211, 9, 19, 38,224,207, 63,255,196,161, 53,107,208, 35, 33, 1,187,197, 98,152,137,197,216,168,215,143, 3,192, 27,172, 55,105, +176,194, 30, 63,247,251, 59,126, 48, 34, 34,162,221, 63, 93, 51, 34, 34,194,255,239,170,240,215, 25,107, 85, 65, 57,255, 95,166, +209, 38, 38, 38, 94, 4,112,241, 53,190,191, 13, 38, 44,230,108,234,231, 0,224,225,195,135,111,124,219,169,212,114, 80,220,253, + 51, 57, 78, 77,222,181, 98, 89, 22,132, 16,104, 52, 26,220,188,121, 19,218,162,124, 4,237, 28, 93,150,201, 29, 20, 72,137,188, +144,227,228,209,204,234,127,253, 34, 64, 41,189, 12,224,114,137,121,233, 79, 8,233, 13,224, 52,165,116,255, 27,210, 47, 51, 90, + 91,182,108,153, 66, 41, 69, 94, 94,222,154,154, 26,171,178,107, 83, 88,216, 5,240,252,173,220,184,113, 67,211,181,107,215,223, + 23, 47, 94,220,150,227,184, 63,222,132,230,107,164,105,168,144,212,212,212,231,132,144, 22,220,247,107, 71, 5, 91,153,191, 71, + 13, 76, 35, 98, 16, 30, 37,186,204,227, 41, 41, 41,191, 81, 74,141, 53,217,222,146,155,186, 31,255,141,251,251,126, 88, 88, 15, + 0,232,213,171, 23,212,211,138,211, 94,109,251, 79, 30,172,141,252, 25,241,166, 35, 88, 60, 60,255, 50, 18,163,130,247, 3, 64, + 74,100,113,251,253,211, 79, 63, 1, 0,122,244,232,241,202,172,199,210,207,164, 60,127,240, 86,213, 65,201,128,246, 67,127,147, +246, 21, 0, 87,248, 35,237,127,131,243,231,207,191,209, 4,147,111, 58, 1,105,201, 49,101, 4,176,181,228,193, 83, 75, 26, 54, +108, 72, 0,192,206,206, 14,115,106,176,156, 26, 79,213, 48,124, 21,240,240,240,240,240,240,240,240,188, 89, 8,128,192, 74,238, + 12, 76,158, 29, 64, 8, 9,172,197,157,199, 57, 94,147,215,228, 53,121, 77, 94,147,215,228, 53,255, 93,154,213,105,191, 53,179, + 19, 75, 51, 92,255, 29, 15, 0,129,188, 38,175,201,107,242,154,188, 38,175,201,107,242,154,255,182, 71, 21, 99,176,246, 11, 18, + 19, 97, 33,145,200,197, 0,160,211, 21,233, 93, 92,144, 7, 12, 52,130,135,167, 38, 97, 82, 66, 28, 75,204,124,234,155,252, 44, + 15, 15, 15, 15, 15,207, 63, 21, 97,101,230, 42, 35, 67,110, 39, 20,102, 55, 52, 26, 53,141, 1, 64, 40,100, 30,102,100, 88, 71, +217,217,237,207,120,211, 38,171, 87,175, 94,179, 41,165,142, 34,145,232,184,147,147, 83,208,230,205,155, 13,255,102,163,241, 58, + 38,227,255,195,160,216,218,218,170, 28, 29, 29,135, 90, 89, 89, 5,228,230,230, 94, 73, 73, 73,217,158,153,153,153, 84, 73,121, +150, 18,130, 25, 37,255,175,160,148,126, 83, 69,217, 77,254,236,203,168, 84,170, 6, 50,153,108, 60,195, 48,205, 0,128,227,184, + 7, 26,141,102, 67, 82, 82,210,227,127,219, 73,173, 82,169,204, 40,165, 31,136, 68,162,225, 54, 54, 54,173,211,211,211,231, 39, + 38, 38,174,174,229, 49, 43, 4, 48,205,202,202,234, 99, 43, 43, 43,207,172,172,172,167,121,121,121,123, 1,252, 72, 41,173,246, + 60, 93, 48, 89,213, 46,160, 71,192,156,160,211, 65,139,230,173, 77,186,241,202,251, 95,171,108,187,119,235, 48, 55,232,232,245, +133,223,172, 79,204,170, 97,217, 24,252,103, 28, 41, 87,124,216,255,115, 71,232, 58, 56, 56,180, 45, 73,164,202, 48, 12,243, 99, +106,106,234,197,127,242,113,100,111,111,175,112,114,114, 90, 78, 8,233, 43, 16, 8, 34, 82, 83, 83, 71, 39, 37, 37, 37,188,161, +107, 33, 83,183,110, 93,243,216,216,216,252,218,166,106,248, 55,210,174, 93,187, 84,189, 94, 95,101,118,124,177, 88,156,118,227, +198, 13, 71,190,182,254,161, 6, 43, 49, 17, 22, 66, 97,118,195,180,148,176,193, 73,201,161, 31, 1,128,202,217,103,175,131, 83, +243, 61,137,137, 18,125,171,110, 3,148, 34,185,112,131, 64, 32,106,169,209,105,237, 68, 66, 81,134,158, 53,220, 99,116,116,124, +242,195,131,113,166,252,112,223,190,125, 27, 2,176,244,245,245,189,163,211,233, 90,175, 94,189,218,249,192,129, 3, 62,193,193, +193, 67,222,127,255,253,163,148,210,211, 71,143, 30, 85,215,232,164, 13, 8, 16, 58,228,216,124, 42, 16, 10,251, 2,240,161, 20, + 0, 17,132,114,122,221,137, 52,177,205, 31, 52,184,246,198,173, 93, 3,219,134,132,234,167,139, 8,237,100,160,228, 10, 37,226, +149, 55, 30,103, 70,213,224,130, 98,146,121,120, 29,147,241,210,119,215, 80, 74,167,189,233, 3,198,201,201,201,110,224,192,129, + 59, 22, 45, 90,164, 48, 55, 55, 39, 49, 49, 49,253,191,249,230,155, 30, 42,149,234,147,164,164,164,248,151,205, 30, 33,152,193, +113,148, 1, 0,134, 33, 51, 29, 29, 29,155, 9,133, 66,237,203,186, 44,203, 74, 9, 65, 79,142, 43, 94,206,134, 97,200, 12, 66, +200, 90, 83,140,162,167,167,231,144,230, 62, 45,167,126, 51,123,174,210,222,193, 65,193,178, 70,125,124, 98,130,124,229,210,239, +219,120,122,122,174,125,246,236,217,174,154,110, 39, 33,132,184,186,186, 14, 22,137, 68,125, 0, 52, 41,121, 57,210, 96, 48, 28, + 75, 72, 72,216, 99,106, 67,222,162, 69,139,203, 12,195,184,215,228,183,141, 70, 99, 92,104,104,104,199,218,236, 31, 23, 23,151, + 65, 46, 46, 46,191,181,109,219, 86,222,178,101, 75,136,197, 98,172, 88,177, 98, 26,170, 89,222,164,212, 72,201,229,242,193, 10, +133,194,171,160,160,224,137, 90,173, 62, 32,145, 72, 2,215,174, 93,235,214,161, 67, 7,243,212,212, 84, 34, 16, 8, 28,143, 29, + 59,246,233,186,117,235,122, 16, 66,186, 86,151,103, 40,247, 9,157, 35,237,219,164, 83,238,147,139,115, 0,244,122,101,191,107, +100,195,169,192,173,143,154,134,196,163, 6, 83,228, 9, 33,140,171,171,235, 90, 71, 71,199,145,106,181, 90, 67, 8,161,132, 16, +218,188,121,243,210,247, 1, 0, 58,157, 46,251,209,163, 71,141,170,210,242,104,103,115, 87,192, 8, 92, 43,221, 31,156, 49,225, +249,141,172,215, 78,221, 98, 52, 26,103, 68, 68, 68,244, 22,137, 68,164, 69,139, 22, 2,212, 32,245,137, 74,165,106, 72, 8,249, +150, 82,122, 39, 57, 57,121, 67,201,146, 86, 93, 40,165,101,215,138,146,116, 42,112,113,113,217, 80,191,126,253,247,163,163,163, + 55, 38, 38, 38, 46,122, 13,163,190,121,201,146, 37, 31,245,232,209, 67,144,153,153,233,210,189,123,247,157, 0, 58,189, 78, 29, +248,249,249,137, 82, 82, 82,166,181,104,209,226,203, 86,173, 90, 57,135,135,135,167,168, 84,170,117, 78, 78, 78, 63, 6, 7, 7, + 87,123,125,246,241,241, 81, 9,133,194,145, 0, 62, 5, 32,160,148,238, 6,240, 71, 72, 72,200,211,127, 67,131,173,215,235, 29, +206, 45,154, 11, 34, 20, 66,214,177, 43, 56,142, 67,198,202,121, 96,179, 50, 96,183,104, 29, 88,150, 69, 96, 96,160, 3,120,254, +185, 6, 75, 34,145,139,141, 70, 77,227,164,228,208,143,222,233,252,147, 37, 0, 92,190,244,229, 71, 14, 78, 77, 31, 72, 36,242, + 40,169,133,236,224,128,190,129, 45, 7,246,233, 76, 92,157, 29,144,144,156,230,248,235,238,211, 61,143,157,190,120, 16,128, 73, +249,179,242,242,242, 22,215,173, 91,215,254,252,249,243, 49, 18,137,196, 76, 38,147,145, 65,131, 6,153, 13, 25, 50,196,251,194, +133, 11, 94,167, 78,157, 26,216,175, 95,191, 83, 98,177,248,248,190,125,251,170, 93,159,204,177,121,127,111, 39,161,211,254,126, + 31,244,114,127,175,155,131,164,174,147, 61, 40, 39,195,195,103,250, 58,103,175,132,244, 60,126,242,244, 12, 7,239,254, 31,166, + 69, 28, 50,121, 53,244,102,205, 44,173,204,212,116,170,153,152,126,220,179,141,183, 71,223,110,237,137,167,167, 39,162, 30, 69, +121, 93,188,118,103,100,151,198,230,207,213,122,178, 91,109, 70, 86, 61,120,144,155, 83, 85, 84,169,188,209, 16, 8,152, 89,221, +186,117, 27, 41,149, 74, 95,184,115,211,106,181, 12,195, 16, 7,163,177,248,229,154,152,140,210,223,208,233,180,140, 72, 36,129, + 64,192, 76,109,217,178,101,175,212,212,212,147, 82,169,116,197,243,231,207,107,148,119,102, 18, 33,146,108,161,208,143,145, 74, +157,141, 58,157, 45, 0, 16,137, 36,187,142,173,109,219,239,190,251, 78, 41, 16, 8,144,153,153, 9,141, 70, 67, 62,255,252,115, +179, 39, 79,158,140, 0,176,176, 58,211,178,109,219, 54, 95, 91, 91,219, 87,238, 88, 51, 51, 51,153, 94,189,122,214, 56,111,167, + 74,165,106,216,194,215,255,171, 93, 59,119, 52,201,203,202,214,108, 93,189, 57,216, 32,147,107, 61,155, 52, 18,125,191,116,149, +229,156,153, 83,191, 84,169, 84,247,146,146,146, 76, 54,195,206,206,206,117,220,221,221, 15,206,158, 61,187, 89,199,142, 29, 69, + 14, 14, 14, 72, 77, 77,197,163, 71,143,154, 93,187,118,237,131,195,135, 15, 79,115,118,118, 30,144,156,156, 92,237,205, 4,165, +180,193,145,149, 75, 29,164, 54,182,224, 12, 6,216,248,248,150, 37,127, 77,190,120, 6, 70,189, 30,156,193, 0,183,247, 62, 64, + 73,228, 13,239,190,251,110,173, 82,146,187,186,186,170, 26, 54,108,248,231,172, 89,179,196, 58,157, 14, 33, 33, 33,184,113,227, + 6,151,150,150,182,172, 58,115, 69, 8, 57, 51,111,222, 60,215,142, 29, 59,154,103,100,100,192,104, 52,218, 29, 62,124,120,188, +175,175,175,133,155,155,155,100,251,246,237, 40, 40, 40, 0,203,178, 54, 94, 94, 94, 54, 67,134, 12,209,109,223,190,125, 26,128, +229,149, 69,174,242,158,208, 57, 41,196,171,103, 35,191,225, 72, 33,167,122, 78,237,229,124,210,162, 30, 41,139,100,245,170, 87, +207,220,171,177, 98,166,210,162,185, 77, 94,226,185,153,189,234,213,219,122,242,201, 19, 83,150, 98, 98, 92, 92, 92,214,246,238, +221,123,232,198,141, 27,229,145,145,145,242, 38, 77,154,128,227,184,178, 76,254,165, 43, 23,116,234, 84,189, 31, 16, 48, 2,215, +107, 7,195, 29,204,204,204,202,214, 8, 45,253, 91, 88, 88,136, 30,195,219,254, 29,215,219,154,238,227, 5,215,175, 95, 31,116, +242,228,201, 97,139, 22, 45,106, 0, 96, 34,199,113,115, 35, 35, 35, 59, 3, 64,147, 38, 77, 36, 0, 46,170, 84,170, 81,227,198, +141, 27, 55,113,226, 68,124,250,233,167,115, 9, 33,139,107, 19,213, 35,132, 8,154, 54,109,218,187, 71,143, 30, 2,131,193, 0, + 51, 51, 51,232,245,250,122,175,179,241,222,222,222,226,162,162,162, 3, 11, 23, 46,236,211,175, 95, 63, 8,133, 66,112, 28,231, +116,249,242,229,165,211,166, 77,107,239,231,231,215,191, 50,147,229,231,231,215, 18,192,194,250,245,235,247, 24, 62,124,184,160, + 67,135, 14, 40, 40, 40,192,153, 51,103,190, 61,120,240,224,183,126,126,126,215, 1,204, 13, 14, 14, 14,122,219, 27,109,129,210, + 28,143, 6,116,129, 87,100, 38, 0, 32,101,195, 74, 0,128,197,119, 63,240,142,230,127,193, 96, 85, 71, 81, 81,145,239, 55,147, + 62, 5,195, 20,183,135,245, 61,235, 96,233,236,209,228,200,177,211,190,213,132, 55, 87, 25,141,198, 6, 54, 54, 54,211, 53, 26, +141,108,205,154, 53,178,164,164,164,198,251,247,239,167,247,239,223,135, 88, 44,134,165,165, 37,186,118,237, 42,237,217,179,103, +189,235,215,175,215, 57,120,240, 96,191,247,222,123,239,143,227,199,143, 31,173,202, 92,217,217,219, 95,250, 97,209, 23, 54,205, + 60,189,160, 55, 24, 16,159,150, 8, 74, 36,112,118, 80,224,147,254, 45,197, 29,253, 37, 94, 63,252,124, 46,200,177, 89,191,119, + 82, 31, 28, 9,175,110, 27, 59,213, 87,220,238,239, 87,207,175,111, 96,123,166, 65, 35,111,136,101,242,178,247,154,183,244, 69, +243,150,190,100,244,200,124,207,251,247,239,207, 57,117,233,214,236, 78,245, 21,193, 87,162, 11,171, 90, 24,243, 5,243, 48,109, +218, 52,216,218,218,190,108, 50,112,225,194,249, 74,191, 99,202,117,177,252,147,165, 75,151, 90,165,165,165,125,252,235,175,191, +126,224,228,228, 52, 33, 37, 37,229,148, 41, 34,159, 18,226, 14,169,180,235,200, 31,127,228, 90,190,255,190,192,202,201,137,225, +140, 70,146,240,228,137,221,143,107,214, 4,230,199,199,203,213,230,230, 5,233,185,185,186,168,168, 40,152,153,153, 17,129, 64, +208,161, 2,115,145, 74, 8, 89,193, 48,100, 38, 33,132,200,100,102,217,159,125,246,217,245,146,247,154, 28, 61,122,212,188,111, +223,190,249,132,144, 72, 0,144,201,204, 58, 11, 4,140, 53, 45,238,232, 89, 97,138,177,148,203,229,147,166,125, 61, 75,145,151, +149,163,214, 23, 22, 26,236, 45,148,132, 40,205, 5,121,185,249,249,137,201,233,218,113, 95, 78, 17,204,153, 53,117, 18, 76,204, + 68,236,236,236, 92,167,113,227,198,183,183,110,221,234, 96,107,107,139,156,156, 28,100,102,102,226,246,237,219,224, 56, 14,189, +122,245,146,250,250,248,248,254,184,106,213, 13,103,103,231,118,166,152, 44,153,173, 29,246,191,211, 18, 0, 48,232,105,102, 89, +132,229,228,224, 62,101,159, 25, 18,155, 91,252, 89,153,172,198,203, 47,149,171,239,118, 29, 58,116, 16, 3,192,212,169, 83,243, + 10, 11, 11,151, 18, 66,118, 38, 37, 37, 37, 86,243,213,105,115,230,204,113,241,244,244,172,187,115,231, 78, 20, 20, 20, 0,128, +131,167,167, 39, 26, 53,106,100, 12, 10, 10, 66,195,134, 13, 97,110,110,142,203,151, 47,227,230,205,155,240,243,243, 51, 23,139, +197, 31, 85,102,176, 2,122, 4,204,145,246,109,210,169,145,223,112, 40, 45,156,177,117,215, 30, 60, 10,222,214, 73,171,143,156, +179,116,162,203, 39,106, 42, 29,225,218,192,124,150,187,127,103,219,250, 77,223, 71, 93,191, 16, 59,141,241,202,179,185, 19,188, +150, 9,101,154,109,243,126, 72,202,172,204, 92, 57, 57, 57,173,236,213,171,215,160,141, 27, 55, 90, 1, 64, 88, 88, 24, 82, 83, + 83, 97,111,111, 15,153, 76, 6,145, 72, 84,182,126,168,169,152,153,153, 33, 57, 57,185,108,153, 41,163,209,136,252,252,124, 56, + 57, 57, 21,187,155, 5,132,153, 55,207,180,174, 44,103,103,231,142,190,190,190, 59, 92, 93, 93,221,202,191,222,163, 71, 15,140, + 30, 61, 26,148, 82,116,232,208,161,235,232,209,163, 41,165, 20, 28,199, 33, 53, 53,181, 32, 44, 44,172, 91, 98, 98,226,173, 74, +182, 91,157,146,146,130,113,227,198, 33, 46, 46,110,130, 74,165,138,101, 24, 70, 86,186, 28, 24, 33, 68,162, 82,169, 26, 54,108, +216,112,237,232,209,163, 17, 19, 19,131,168,168,168,219,181,237, 50,165,148, 26,219,182,109, 27,109, 48, 24,252, 89,150,133, 90, +173, 70,207,158, 61,101,141, 27, 55, 78, 21,137, 68, 15,115,114,114,134,149, 44,169,101,138, 89, 19, 58, 59, 59, 59,137, 68,162, +141, 95,124,241, 69,239,246,237,219,227,225,195,135, 56,121,242, 36,250,245,235,135,128,128, 0,204,153, 51,231,189, 57,115,230, + 76, 3, 80,217,205,192,254, 3, 7, 14,120,184,186,186,150, 45,137,100, 97, 97,129,207, 62,251, 12,159,126,250, 41, 78,156, 56, +209,126,201,146, 37, 7, 2, 2, 2, 28,130,130,130,216,183,185,209,150,250,183,135, 87,100, 38,158, 54, 41,110, 63, 74,141, 86, +233,115,184,248,130,231, 31,108,176,116,186, 34,189, 80,200, 60, 84, 57,251,236,189,124,233,203,178, 46, 66,128,121,168,211, 21, +233,139,195,230, 20,121, 69, 44,204,164, 12, 98, 82,242, 17,254, 52,163,162,147,244,220, 75,198,236,171,117,235,214, 97,197,138, + 21,189,212,106,117,193,179,103,207,146, 11, 10, 10, 10, 63,249,228, 19, 34, 20, 10,113,237,218, 53, 60,127,254, 28,205,155, 55, +135,181,181, 53, 58,118,236, 40,238,222,189,187,219,168, 81,163, 62, 1,112,180, 34, 77, 18, 16, 32,116,150,218, 31, 92,185,104, +176, 13,152, 40, 68,197,229,160,158,107,107,216, 89,185, 33, 49,189, 0,119, 34, 78,224,241,147,227,168,231, 82, 23,163,135,214, +183, 90,189,249,218, 49,226, 55,166, 94,249,238,194,138,166,132,202, 4,198, 86,243,119,221,135, 49,235, 9,104,110, 28,104,225, +171,171,196,200,237,220,208,184,157, 35,228, 86,246, 76,216,195,213,173, 42,219,118, 74,105,170, 80, 40,220, 34, 16, 48, 99, 0, +160, 85,171,214,133,203,151, 47,175,232, 98,205,181,106,213,186, 80, 32, 96, 20,197, 17, 44,193,102,150,101, 83,171, 42,231, 75, +102,102,165, 68, 34,157, 14,128,184,186,186, 21, 28, 57,114,132,251,240,195, 15,177,114,229, 74,233,172, 89,179,126,118,119,119, +239, 18, 19, 19, 19, 91,213, 62, 26, 64, 72, 29,151,122,245,186, 47,190,118,141,138, 12, 6,146,117,251,118, 94,126,106,170, 33, + 49, 63, 95,246, 71, 72,200,192, 9, 51,102,200,156,188,188,112,253,220, 57,243,148,236,236,252,156,162, 34,221,179,103,207,168, +209,104,188, 82,201,182,127,227,232,232,216,108,219,182,109,190,159,125,246,217,245,196,196,196, 1, 37,221, 24, 7, 1,180, 37, +132, 68,150,127,237,224,193,131,237,135, 15, 31, 30,146,154,154,250, 77, 85,229, 44, 71, 83,123, 59, 59,249,174,205,219, 67,109, +204,205, 24,123, 87, 21, 35,178,178, 18,178, 18, 51, 49, 7,168,235,184,121, 40, 0, 52,173,164,206, 94, 94, 52,156,184,187,187, + 31,252,253,247,223, 29, 68, 34, 17,140, 70, 35,236,237,237,241,252,249,115,228,228,228, 32, 63, 63, 31,207, 30, 70,194,195,205, + 13,147, 71,127,238,188,224,135, 85, 7, 9, 33,254,229, 27,177, 10, 23,227,214,235, 95,110,112, 42, 91, 32, 28,166,148,179, 50, + 56,142,123,158,148,148, 4,185, 92,142, 38, 77,154, 40,239,220,185,115, 37, 49, 49, 49,177, 58, 77,153, 76,246, 81,135, 14, 29, +204,119,237,218, 5, 63, 63, 63, 88, 90, 90, 34, 40, 40, 8, 97, 97, 97,208,235,245, 76, 65, 65, 1,204,205,205,177,108,217, 50, +212,173, 91, 23,121,121,121,136,139,139,179, 21,137, 68,118,149,105, 6,157, 14, 90,148,251,228,226,156, 20,114,170,231,214, 93, +123,240,197,144,193,112,162, 79,175, 88,214, 35,139,186,247,237,240, 29, 21,184,245, 81,152,251, 88, 55,104,214, 23, 98,137, 18, + 19,103, 44, 68,212,131,163,214, 69,249,161, 19,136, 49,222, 13,192,228,151, 53, 73,113, 5, 49, 42,149,234,243,205,155, 55,155, +151,221,209,151,172, 73, 88,222, 88,149, 62, 42,170,211,202, 22, 76,215,235,245,208,235,245, 48, 26,141,200,200,200, 64,126,126, + 62,172,172, 74, 18,245,207, 3, 8, 8,161,149,172, 66, 95, 94,147, 97,152, 97,123,246,236,113,147,203,229, 47,127, 6, 37,209, + 65,200,229,114,112, 28, 7,189, 94, 15,150,101,161,213,106,149, 1, 1, 1,227, 1,220,170, 72, 83, 32, 16, 76, 29, 55,110, 92, +135, 99,199,142,121, 45, 90,180, 8,122,189,126,101,122,122, 58, 70,143, 30, 13,142,227,208,177, 99,199,182,148,210, 71,147, 39, + 79, 6, 0,204,159, 63,223, 80, 80, 80, 48,182,182,199,146,163,163,163,119,223,190,125,189,206,159, 63,143, 78,157, 58, 65,171, +213,226,187,239,190,179, 88,177, 98,133,197,222,189,123,237,151, 46, 93,250, 27,128, 30, 85,105,250,249,249,137, 82, 83, 83,103, + 14, 27, 54,108, 90, 96, 96,160,101, 92, 92, 28,204,204,204,112,228,200, 17,108,222,188,249,164, 94,175,159,115,224,192,129,197, + 91,182,108,233,217,175, 95, 63,108,222,188,121, 82,201,176, 8,174, 2, 77,149,155,155, 27, 66, 67, 67, 97,109,109, 13, 59, 59, + 59,228,230,230,226,230,205,155,184,125,251, 54, 26, 55,110, 12, 66,136,117, 73,155,198,190,206,121, 84, 67, 35,250,255,174, 89, + 58, 67,141, 43,119,236, 82, 74,139, 55,154,214,190,156,132, 16,161, 74,165,234,103,101,101, 53,129, 82, 42,204,206,206,222, 44, +151,203,247, 63,121,242, 68,247,255,181,237,255, 10,131,229,226,130,188,140, 12,235, 40, 7,167,230,123, 28,156,154,150,164,170, +102, 30, 10, 4,214, 81,142,142, 69,121, 0,160,103, 41,174, 63,204, 65,104,116, 10,194,162, 83,160,144, 86,127,215,109,107,107, +139,246,237,219,227,200,145, 35,136,143,143, 87, 46, 91,182,172,129, 94,175,215,247,237,219, 55,201,221,221, 61,187, 99,199,142, + 16,137, 68,184,115,231, 14,242,242,242,192, 48, 12,164, 82, 41, 56,142,171,244, 86,212, 33,219,122,248,240,209,205, 61,237,172, + 24, 28,189,122, 10,109, 27,247,135, 92, 42, 66,122,142, 26, 4, 4, 79,159,159, 3,199, 42,113, 63, 50, 6,237,125,228,120,167, +181,149,107,193,249,172,209, 0,126, 54,165,130,244,207,130, 32,241, 30, 0,112, 77, 65,179,159,128,203, 75, 4,149, 59,160,144, + 51, 67, 70, 82, 44, 30, 94,217, 7,170,175,126,168, 24,203,178, 99, 29, 28, 28,152, 57,115,230,244,245,244,244,228, 38, 78,156, +120,237,249,243,231,131,202,127,198,195,195, 99,223,250,245,235, 59, 60,123,246,172,104,209,162, 69, 71,211,210,210,198,213,240, +196,156, 73, 8, 89, 13, 0,241,241,241,153,135, 15, 31,238,116,249,242,229,165,171, 87,175,118,157, 56,113,162,116,226,196,137, + 51, 1,140,171,170, 91, 80, 33,149, 6, 46,190,124,153,178, 9, 9,218, 67,155, 55, 11,214,220,184, 49, 75,207,113,117,236, 29, + 28,132, 1,157, 58,105,236,172,172, 10, 83, 83, 82, 56, 43,149,138, 60,127,242, 68,201,137, 68,250, 83,167, 78,229,103,101,101, + 85,186,196,141, 80, 40,212, 86,212, 45, 88,201, 49,194, 85, 52, 70,171, 10,242, 56, 74,245, 86,158,158,180,123,215,118,245,163, + 31, 61,125, 42,179,178, 18, 52,168,239,209, 40,252,225,243,219,212,200,106, 0,228,153,216,197, 54,120,222,188,121,205, 45, 44, + 44,192,113, 28, 44, 45, 45,145,158,158, 14,157, 78,135,188,188, 60,232,242,115,161,203,205, 69, 88,236,115,116, 8, 8, 64,247, +118,109,155, 28, 55, 24, 6, 3,216, 93,149,174,141,143,111, 89,228,106,159,215,127,162,150, 31,199,228,148,153,173, 19,173,235, + 65,162, 84,160,249,148,111,106,125, 50, 39, 39, 39,135,212,173, 91,247, 68,175, 94,189,122,143, 25, 51,134, 73, 73, 73, 57,229, +232,232,216, 33, 53, 53, 53,162,170,239, 41,149,202,122,165,134,194,210,210, 18,107,214,172,129,163,163, 35,138,138,138,112,231, +206, 29,234,234,234, 74, 46, 94,188, 8, 87, 87, 87,100,100,100, 64,175,215,163,176,176, 48, 69,167,211, 85,122,224,151,116, 3, +246,154,218,203,249,228,163,224,109,157, 92,200,179, 59, 31, 77,235, 28,253, 40,236, 97,220,153,179,215,190,103, 53,178,248,156, +132,115, 51, 61, 91,133,216, 77,152,190, 0,235, 87,206,195,163, 91,151,179, 28,235,228,253,108, 70,180,127,180,233, 86,101, 4, + 93,243,240,225, 67,243,251,247,239,131, 16, 2, 75, 75, 75,200,229,242, 10, 77,150,169, 24,141,198,178,191, 25, 25, 25, 72, 79, + 79,199,147,216, 40, 28,184,176, 13, 6,214, 96,247,123, 27,139, 20, 47,177, 56,212, 46,151,204,206,120, 64, 67,170, 57, 15, 55, +127,252,241,199,131, 93, 92, 92,204,203,191,222,162, 69, 11, 12, 27, 54, 12,219,183,111,199,221,187,119,203,186, 49, 41,165, 72, + 79, 79, 79, 54, 26,141,127, 84,166, 25, 23, 23,151,227,234,234,218,243,243,207, 63, 15, 62,116,232,144,197, 15, 63,252, 0,163, +209, 8,150,101,203,186, 69, 75,255,238,220,185, 19,193,193,193,115, 83, 82, 82, 30,214,230, 56,114,114,114,106,220,183,111,223, +203, 63,255,252,179, 85, 90, 90, 26, 50, 50, 50, 80, 80, 80,128,194,194, 66, 24,141, 70,120,120,120, 16,150,101, 27, 85,215, 29, +200, 48,204,145, 11, 23, 46,244,108,208,160, 1, 0,192, 96, 48,224,250,245,235, 24, 61,122,116,166, 92, 46,255, 40, 38, 38,166, + 80,165, 82,125,123,252,248,241,158, 45, 91,182,132,143,143,143, 83, 90, 90,154, 57,128,220, 74,110, 32, 96, 52, 26,145,158,158, +142,244,244,116,252,250,235,127,214,113,214,106,181, 37,193, 1, 29,105,213,170,149,199,157, 59,119,158,191,173,141,118,204,159, + 91, 17, 51,251, 75,184, 95,121, 4, 0, 8,246, 46, 30,114, 85,247, 82,100,241,240,131,225,195,107,164,167, 82,169,108, 41,165, + 95, 4, 6, 6, 78,233,217,179,167,189, 74,165,130,141,141, 13,194,194,194, 58,156, 62,125,250, 39, 87, 87,215, 77, 70,163,113, +147, 41,209,122, 30,147,186, 8, 7, 26,237,236,246,103, 36, 38, 74,244, 18,137, 60,170, 52,170, 85,108,174, 6, 26,129, 93, 96, +245,134,146, 11, 4, 45,121,152,214,173,161, 73,254, 16,156,250, 47, 56,200,251, 97,203,150, 67, 72, 75, 75, 19,175, 89,179,198, +253,208,161, 67,174,195,134, 13,139,171, 95,191,126,110, 64, 64, 0,182,109,219, 6, 39, 39, 39,104,181, 90,112, 85,136,155,219, + 24, 7,182,109, 94, 95,240, 56,246, 1,252, 27, 14,132,135,170, 35,158, 38,230, 34, 43, 95,139,204, 92, 53, 26, 53,156,142,212, +204, 34,228, 22,106, 16,246,104, 39, 92,156, 60, 25,129,232, 73, 79, 83, 13,150,230,254, 14,104,195,246, 64,236,213, 5,146,166, +131, 33,114,109,135,248,176, 32,220, 59,241, 35, 18,194,175,130,114, 70, 56,186, 55, 49,105,219, 69, 34,209,194,227,199,143,119, + 95,178,100,137,168,107,215,174, 29, 84, 42, 85,251,164,164,164,235, 37, 7,121,251,222,189,123,119,112,112,112,192,218,181,107, +117, 34,145,104, 97, 45,239,126,202,119,171, 93,116,114,114,154,120,240,224,193,191,198,140, 25, 3,103,103,231, 54, 85,125, 55, + 93, 36,106, 49, 98,201, 18, 42, 18, 8,232,241,223,126, 35,179, 79,156, 88,183,253,207, 63, 37, 29, 58,116, 0, 1, 16, 26, 22, + 38, 91,182,102,141,217,224,126,253,210,162,158, 63,199,153, 11, 23,180,105, 41, 41, 25,233,133,133, 51,222,212,236,162,154,194, +178,236,141,184,248, 56, 23,255, 54, 45,237, 67, 34,159,133,247,120,183,125,123,134, 97,152, 71, 79, 99,175,219,219, 91,200,175, + 92,185,172,103, 89,246,134,137,251,167, 79,199,142, 29,133,217,217,217, 80,169, 84, 72, 79, 79, 71, 98, 98, 34, 12, 6, 3, 52, +185,217,208,231,230,194,144,151, 3, 99, 97, 1,158,221,185, 13,111, 55, 23,233,153,226, 65,240,187,171,187,227,172, 40, 66, 85, + 62,146, 37, 53, 87, 66,170, 84,190,176, 56,181,137, 23,199,126, 22, 22, 22, 51,243,243,243, 79, 36, 38, 38, 46,210,233,116, 19, +151, 44, 89,210,106,225,194,133,118,179,102,205,178,152, 49, 99,198, 62,119,119,247,150, 49, 49, 49,149,154,214,130,130,130, 39, + 44,203,218, 1,112, 56,127,254, 60, 28, 28, 28,144,155,155, 91,188,221, 26,141,174,168,168, 72,150,153,153, 9,173, 86, 11,157, + 78, 7, 11, 11, 11,220,189,123, 55,155,101,217,191,170, 43,159, 69, 61,178, 72,171,143,156, 99,219, 68,145,164,103,173, 59,167, +101,113,217,243,126, 72, 90, 8,224,199, 94,245,234,109,213,115,151,159, 61,126,112,212,250,249,157,160,172,164,199,133, 94, 91, +143, 63,205,175,162, 30, 41, 33,132, 35,132,208,134, 13, 27, 34, 61, 61, 29, 2,129, 0,114,185, 28, 74,165, 18,141, 27, 55, 70, +124,124,124,173, 13, 22,203,178,101,230,234,236,141, 99,200, 44, 72,198,214,149,187,224,226,228,198, 0,176, 79, 76,137,239, 54, +106,218,160, 54,158, 29,173,151, 62,187,154, 93,233,184,182,164,164,164,123, 0, 44, 94,188,105,117,233, 98, 99, 99,115, 65,167, +211, 33, 38, 38, 6,103,206,156, 9, 72, 72, 72,184, 84,147,125,157,144,144,240,212,197,197,165,231, 7, 31,124,176,173,121,243, +230,245, 40,165,104,220,184, 49,250,245,235,135, 3, 7, 14, 32, 34, 34, 2,121,121,121,220,149, 43, 87,126, 79, 78, 78,174,209, +128, 28, 66, 8,161,148, 82,103,103,231, 70,125,250,244,185,186,126,253,122,235,140,140, 12,168,213,106, 20, 22, 22, 98,255,254, +253,232,212,169, 19,108,108,108,112,248,240, 97,182,180, 71,161, 50,115, 69, 41, 61,114,232,208,161,158, 94, 94, 94,120,248,240, + 33,206,158, 61, 11, 79, 79, 79,136, 68, 34,244,233,211,199,118,207,158, 61, 19,189,189,189, 87,137, 68,162,239,123,247,238, 13, +163,209,136,187,119,239, 38,199,198,198,230, 87,103,130, 43, 66,173, 86,131, 82, 10,131,193,176,134, 97,152,143,252,252,252,186, + 7, 7, 7,223,126, 91, 26,106, 87, 87,215,166, 34,145,104,178,181,181, 53, 50, 51, 50,144,203, 1, 89, 89, 89,160,148, 34,151, + 43, 14, 92, 41, 50,255,211,171,222,160, 65,131,227,106,181,122,118, 66, 66, 66,165,107,121,185,184,184,248,200,229,242, 41,125, +251,246, 29,246,222,123,239, 9, 12, 6, 3,142, 30, 61,138,245,235,215,163,103,207,158,168, 95,191, 62,102,204,152, 97,169,209, +104,102,157, 58,117,106,102,147, 38, 77, 78,229,231,231,127, 83,149, 38,143, 73, 6,171,216,100,185,184, 32,187,228,142,198,206, +198,198,102,189,209,104,236, 2,124, 7,115,161, 37, 30,134,220, 65, 86,166, 0, 90,181, 17, 28, 45, 54, 89, 38,117, 99,168,255, +130, 69, 67,138,188, 40, 2,131,193, 0, 71, 71, 71, 44, 91,182, 12,185,185,185,194, 81,163, 70,121, 44, 88,176,224,158, 78,167, + 67, 97, 97, 33,212,106, 53,212,106, 53,140, 70, 99,165, 6, 75, 44,213, 54,175,227,216, 0,249,234,214,144, 75, 37,200,202,211, + 22,155,171, 28, 13, 14,252,245, 49,180, 69,106, 24,245,122,176, 58, 3,148,142,253, 81,207,187, 11,128,232,102, 38,154,149,226, +191, 28, 11, 93,244, 89,232,162,207, 66,209,101, 14,142, 44, 25,246,210,137,111,218,228,196,196,196,196, 68, 23, 23,151,237, 33, + 33, 33,159,125,244,209, 71,184,120,241,226,183, 40,153, 89, 37,147,201,190,253,232,163,143, 16, 18, 18,130,200,200,200,237,149, +117,237,212, 20,137, 68, 82,168,211,233, 74,187,130,228,213,124,214,165,213,128, 1, 76,110, 72, 72,222,146, 11, 23,230,253,241, +199, 31,146,119, 58,117,130,193, 80,108,166, 61, 60, 60,208,189, 71, 15,233,142,189,123,149,234,156,156, 59,179, 39, 78,252,107, +195,240,225,121,183, 11, 10, 30,152, 88,159, 77, 74,186, 6, 65, 41,109, 82,217,107, 53,161,176,176,112,221,236, 89,211, 2,247, + 31, 56,226, 86,199,205,197,226,244,217, 75,247,165,102, 18,198,203,163,158, 32, 63, 63, 71,184,126,205,143,102, 5, 5, 5, 63, +153, 40,215,196,206,206, 14, 41, 41, 41,136,142,142,134, 86,171, 45,222,246,162, 66,232,178,115,160,203,205, 2,209,168, 33, 53, + 26,161,201, 72,133,187,151, 39,240,159, 25,134,213, 53, 96, 21, 26,172,210,191,102, 22, 22, 16, 43, 20, 16,136, 68, 38,143,193, +114,118,118,246,243,245,245,221,187,101,203, 22,241,212,169, 83,219,184,187,187,175, 79, 73, 73,137,117,117,117,237,186,114,229, +202,219,139, 23, 47,150, 14, 27, 54,172,209,230,205,155,135, 3,216, 92,233, 77,132, 70,179,247,248,241,227, 67,235,214,173,235, + 16, 22, 22, 6,141, 70, 83, 58,222, 12, 0,100,165,159,123,244,232,145, 90,163,209,164, 61,120,240, 32, 47, 54, 54, 86, 7, 19, +102,253,205, 91,155,116, 99,234, 32,215, 1,142, 78, 46, 55,101,102,238, 30,180, 32,164,255,212, 65,174, 43, 87,237, 75,208,156, +124,242, 36,127,238, 4,175,101,133,249,161, 19,172, 92, 11,126, 62,121,244,105,190, 41,135, 81,201,140, 65,216,218,218, 66, 40, + 20, 66, 36, 18,161,116, 44,146,163,163, 35,114,115,115,171,236, 34,172,172,241,206,203,203, 67,110,110, 46, 30, 63,127,136,204, +130,100,156,217,117, 3, 70,163, 17, 26,141,166,216,204, 58,186,226,220,238,219,230, 1, 3, 91,205,182,245, 33, 23, 51, 67,233, + 29, 83,143, 83,134, 97,166, 12, 24, 48, 0,122,189, 30,253,250,245,195,174, 93,187,166, 0,184, 84,211,227, 61, 49, 49,241, 38, + 33,164, 65,116,116,180,133,193, 96,120,191,111,223,190,127,244,238,221, 27, 55,110,220,192,249,243,231, 3,116, 58, 93,148,209, +104, 84, 59, 59, 59, 47,117,118,118,118, 32,132, 44,173,106,130, 71, 73, 42,134, 13, 77,155, 54,125,191, 75,151, 46,247,123,247, +238,221,108,253,250,245, 86,105,105,105,165,147, 26,144,144,144,128, 19, 39, 78, 36, 31, 61,122, 52,143,227, 56, 91,134, 97,142, +103,100,100,124, 83, 89,183,160, 94,175, 63,116,244,232,209,158, 94, 94, 94,184,116,233, 18,150, 44, 89,130,230,205,155,227,248, +241,227,112,119,119, 71,227,198,141, 97, 99, 99, 51, 57, 47, 47,175,221,138, 21, 43,122,251,250,250,226,208,161, 67, 72, 77, 77, +253,169,170,148, 13, 44,203, 86,107,176,222,125,247,221,209, 83,167, 78, 69,223,190,125,207,248,251,251,183,190,123,247,238,255, +124,154, 22,149, 74,181, 44, 48, 48,112,102,139, 22, 45,240,231,159,127, 66,227,215, 1,138,223,143,226, 65,159, 14,160, 0, 84, +191, 31, 1,165, 20,225,253,222, 1, 5,224,209,117, 32,102,206,156,217,187,127,255,254,117, 80,201,240, 8,149, 74,245,195, 39, +159,124, 50,237,211, 79, 63, 69,112,112, 48, 54,111,222,140,123,247,238,149,181,121, 6,131, 1,145,145,145,136,140,140,132,179, +179, 51,250,244,233, 67,198,140, 25,211,171, 87,175, 94,246, 0,252,193,243,186, 6,171, 44, 92,108,103,109,109, 29,254,243,207, + 63,219,182,110,221, 90,192,178, 44, 46, 6, 5, 97,254,119,211,208,171,199,103,208,115,150, 96,117, 98,112, 98,153,105,191, 40, +237,131,188, 40, 2, 78,220, 27, 58,157, 14, 95,236, 20,193,138,164, 97,205, 8, 71, 0, 32, 26,141,166,204, 88,149,222, 61, 85, + 21,193,202,207, 85,232, 13, 6,138,164,180, 88, 36, 36,135,195, 66,233, 6, 42,112, 67, 90, 86, 17, 8, 28,193,106,163, 96, 52, + 20, 27, 32,173, 58, 1, 69, 58,242, 90, 21,102,204,122,117, 54,176,145, 53,125, 76, 37,165,116,237,142, 29, 59,134,174, 90,181, + 74,250,222,123,239,249, 56, 59, 59,119, 7,128, 65,131, 6,249, 88, 88, 88, 96,199,142, 29, 90, 74,233,218, 55, 24,225,249,192, +223,223, 31, 89, 89, 89,136,137,137,185, 94,229,182,233,116,182, 74, 7, 7, 65,218,197,139,134,172,252,252, 58,157, 74,204, 21, +195, 48,200,206,206,198,243,231,207,161, 84, 40,240, 32, 34, 66,250,227,184,113, 59, 26,251,248, 48,165, 51, 12, 77,225,232,209, +163,230, 0,218, 86,247, 90, 77, 72, 79, 79, 47,116,114,114, 26,249,237,236,217,135,126,250,233, 39,203,212,180,212, 40,169, 68, +194, 42,149, 50,213,228,201,227,133,121,121,121, 67, 51, 50, 50, 10, 76,213,203,206,206,198,179,103,207, 96,102,102, 6,177, 72, + 4, 78, 93, 4, 99, 97, 1, 52, 89,233, 16,232,117,144, 24,141,176,145, 75,225,230,232,136, 58,246,118,166,117,221, 93, 60, 83, + 54,160,189,124,183,224,169,246,141, 32, 85, 42, 32, 85, 42,209,225,112,241, 16, 54,177, 88, 12,172,217, 98, 74, 55,142,157, 74, +165,250,107,253,250,245,226,204,204, 76,132,135,135,223,143,137,137,201,181,177,177, 49, 23,137, 68,220,227,199,143,207, 61,124, +248,176,143,167,167, 39, 40,165,213,205,254,250,241,224,193,131,221, 58,118,236,200,122,120,120, 40,210,210,210,234,228,230,230, +146,228,228, 23,199, 48,223,185,115, 71, 22, 23, 23, 87,200,113,220, 33, 20,231,193,170,246,192,159, 58,200, 85,118, 61, 4,147, + 58,247,112,111,110, 97,231,131, 44, 54,164,249,205,251,201,147,166, 14,114, 93,183,106, 95,130,198,140,104,255, 32,198,120, 55, +161, 76,179,205,196,243,135,122,123,123,131, 82,138,219,183,111,227,234,213,171,184,124,249, 50, 98, 99, 99,203, 62, 99,105,105, +137,179,103,207,162, 75,151, 46, 38, 31, 71, 69, 69, 69,112,118,118,134,181,181, 53, 14, 94,220,142,173, 43,119,149, 13,116, 47, + 37, 35, 35, 3,114,185, 28,139,191, 94,165, 28, 53, 99,224,247, 0,186,155,162,237,230,230,230,217,161, 67,135,247, 28, 29, 29, +145,157,157, 13, 7, 7, 7,180,106,213,170,175,163,163,163, 71,106,106,106,173,186,178,116, 58,221,248, 46, 93,186, 44,250,250, +235,175,193,178, 44, 62,254,248, 99, 60,123,246,108,239,211,167, 79,215,212,173, 91,119,210,132, 9, 19, 28,237,236,236, 48,126, +252,120, 5,128, 1, 85, 24,172,165, 43, 86,172, 24, 26, 24, 24,200, 24, 12,134,119,206,159, 63,143,152,152, 24,232,116, 58,176, + 44,139,152,152, 24,204,155, 55, 47, 57, 47, 47,175,115, 66, 66,194,147,234,202,149,146,146, 50,237,240,225,195,189, 27, 54,108, +136,211,167, 79, 99,236,216,177,199, 45, 44, 44,154,250,248,248,212,169, 83,167, 14,254,250,235, 47,152,153,153,193,217,217,217, +113,214,172, 89,125,122,244,232,129,115,231,206, 97,225,194,133,199,156,156,156,126,172,206, 4, 11,133, 66, 24, 12, 47,222,208, + 10, 4, 2,220,187,119, 15,239,190,251, 46,102,206,156, 9, 0, 56,119,238,156, 69,247,238,221, 31, 4, 4, 4, 88, 4, 5, 5, +105,241, 63,140, 66,161, 24,249,251,239,191, 35, 58, 58, 26, 87,174, 92, 65, 70, 70, 6,116, 58, 29,114, 74,172,168,180, 36,146, + 69, 93,234,162,253,180,217, 24,210,103, 0,146,147,147,193, 48,140, 93, 21, 55,124,195,102,207,158,141,147, 39, 79, 98,249,242, +229,200,205,205,173,240,115,102,102,102,104,213,170, 21, 90,182,108,137,103,207,158, 1,128, 29,120,222,156,193,178,182,182, 94, +179, 97,195, 6,219, 14, 29, 58, 8, 74,204, 14, 90,183,106,133,225, 35, 71,226,236,193, 99,112,104,216, 19, 68,167, 4, 43,151, +152, 22,193,178,216,134, 76, 67, 38,100, 98, 25,164, 58, 29, 56,206, 12,161, 9,154, 50,215,172, 86,171, 81,106,178, 10, 11, 11, +161, 80, 40,170, 54, 16, 58, 73,112,228, 51,214, 45, 55,255, 30,110,134,108,135, 65,103, 64,189,134,179,161, 54,216, 66, 97,255, + 25, 52,186,191, 96,204, 41,158,185, 43,177, 8, 64, 74, 74, 6, 0, 98,106,196,229,213,147, 60,255,213,193,238,156,209,244,188, +171, 73, 73, 73,153, 42,149,106,243,245,235,215, 39, 15, 24, 48, 0,103,207,158,157, 13, 0, 3, 6, 12,192,245,235,215,241,236, +217,179,205, 73, 73, 21,207,160,170, 41, 46, 46, 46,195, 59,119,238, 60,161,117,235,214, 56,118,236, 24,140, 70,227, 9, 83,190, + 39, 16,137, 40, 33, 4,165, 51,156,178,178,179,241,232,209, 35,100,101,102,194,104, 52,162, 72,173,102,155, 54,106,148, 71, 57, +206,188, 38,229, 41, 63, 99,176,162, 89,132,165,175,213,116, 59, 83, 82, 82, 98,235,213,171, 23, 87, 84, 84,104,111,109,101,157, + 47,145, 72,140,121,249,249,185,209, 81, 15,117,166, 52, 10,229,136,140,136,136,104,150,144,144,128,184,184, 56,176,133,249, 16, +104,117, 96,180, 69,232,218,190, 29,204, 64, 33, 3, 7, 17,103,128, 72, 32, 66,126,241,108,187,200,106,143,249,114, 13, 66,169, +185, 34,132, 64,166, 84, 66,162, 84, 64,106,174,124, 33,162,101,202,196, 47, 51, 51,179,157,155, 55,111,118,118,114,114,194,170, + 85,171,224,236,236,220, 56, 48, 48,176,168,115,231,206,102,118,118,118,104,216,176, 33,252,253,253,113,241,226, 69, 16, 66,158, + 84,115,156,179,132,144,238, 87,174, 92,153,118,237,218,181, 65, 42,149,138,124,250,233,167,232,217,179, 39,100, 50, 25,138,138, +138,144,157,157,141,227,199,143, 19,163,209,232, 91, 98,240,234,186,187,187,239, 34,132, 36, 60,127,254,252,163,151, 53,183,175, +246, 81,165,101,113,159, 57, 58,185,244,239,220,195,189,249,187, 61, 2,225,217,224, 93,188,219, 35, 14, 0,150,217, 8, 99, 62, + 94, 57,167,217, 33, 59, 55,155,223,206,156, 58, 59,175, 99,231,119,191,157, 53,198,122,209,178,205,217,213,142,151, 35,132,148, + 53,182, 12,195, 84, 24,165, 18, 10,133,101,179,205,170,189,105,226,140, 9, 61, 71,180, 43,123,110, 96, 13,118, 46, 78,110, 76, +105,228, 10, 0,114,115,115, 17, 31, 31, 15,131,193, 0, 91, 91, 91, 24, 12,122,159, 26,116, 63, 78, 26, 60,120, 48,209,104, 52, +152, 54,109, 26,126,248,225, 7,244,235,215,143,220,186,117,107, 18,128, 41,181,136,104,172,156, 48, 97,194,180,145, 35, 71, 34, + 39, 39, 7, 23, 46, 92, 64,151, 46, 93,176,113,227, 70,251, 11, 23, 46, 44,105,223,190, 61, 4, 2, 1,206,158, 61, 11,189, 94, +255,168,202, 6, 64, 40,124, 63, 48, 48,144,137,143,143,135, 88, 44,134,191,191, 63, 18, 18, 18, 80, 84, 84,132,180,180, 52, 44, + 88,176, 32, 37, 55, 55, 55, 32, 49, 49,241,137, 9,251,133,233,208,161,195,228,250,245,235,227,194,133, 11, 24, 55,110,220, 73, +133, 66, 49, 32, 51, 51,115,140, 70,163, 89, 55,120,240, 96, 52,110,220, 24, 81, 81, 81,120,239,189,247,208,170, 85, 43, 92,184, +112, 1, 51,102,204, 56, 46,151,203, 63,172, 38, 15,214,227,160,160,160,102,254,254,254, 40, 42, 42, 66, 94, 94, 30, 68, 34, 17, +172,172,172, 16, 25, 25,137, 6, 13, 26, 96,230,204,153, 88,181,106, 21,166, 78,157,202,117,239,222,157,213,235,245, 98,137, 68, +242, 63,223, 72, 23, 22, 22,210,228,228,100, 88, 88, 88, 96,223,190,125, 8, 59,119, 26, 39,190,252, 12,178, 57, 43, 65, 41, 69, +252,162, 89,232, 58, 99, 14,218,222,127,138,228,228,100,108,219,182, 13, 12,195,148,205,136,173,172,109,203,205,205, 69,203,150, + 45,113,251,246,109,108,219,182, 13,171, 87,175, 46,139,214,138, 68, 34, 4, 4, 4,160, 91,183,110,120,252,248, 49, 54,111,222, + 12, 11, 11, 11,222, 49,189,105,131,197,113,220,187,173, 90,181, 18, 20, 20, 20, 64,163,209, 32, 37, 37, 5, 49, 49, 49, 48,147, +155, 33, 62, 35, 17, 45,124,245, 72,225,242, 16,121, 63,220, 72, 4,162,123,213,221,129,232,116, 58,232,116, 58,132,134,134, 22, + 79,125,111,176,180,108,160,167,193, 96,128, 86,171,133, 90,173,198,133, 11, 23,168, 84, 42,133, 66,161, 32, 85,245,189,115,172, +246,228,133,171,247,123, 15,235,223, 69,114, 54,104, 43, 12, 58, 14,121, 26, 11, 20,168,181, 40,208,136,160,149,246, 0, 33, 87, +192, 8,164,104,223,178, 62, 46, 92,141,210, 24, 13,122,147,210, 21,128, 51, 66,232,236, 3, 54, 57,244, 63, 47,189, 52,155, 80, + 44, 87,130, 51,214,108, 86,176,153,153,217,198,157, 59,119,142,108,215,174,157,121, 96, 96, 96, 3, 0,144, 74,165,220,206,157, + 59,243,205,204,204, 54,214,116, 39,190,156,189,221,217,217,185,163, 68, 34,153,216,183,111,223,142, 35, 71,142, 68,120,120, 56, +254,252,243,207,251, 42,149,170,202, 49, 51, 2,137, 36,179, 32, 45,205, 74,233,225, 33,180, 50, 55, 79, 58,125,250,180,251, 59, +157, 59, 35, 54, 38, 6, 89, 89, 89, 80,171,213,136,136,140,164, 98,134,137, 35, 22, 22,204,163,144, 16, 70, 32,145,100,214,160, +156,145,213,205, 34,172,109, 52, 75, 97, 70,234,205,153, 57,198, 83,163,209, 52,203,203,203, 99, 69, 34,145, 72, 46,161,177, 53, +209, 48, 24, 12,199,174, 92,185,242, 65,135, 14, 29,164, 81,161,247,192,230,230, 66,151,155, 13, 49,103,132,141,111, 11, 8,244, + 90, 64,103,128, 75, 19, 10, 77,142, 28,215,238, 61, 53, 24, 12,134, 99,166, 26, 44, 70, 32,120,113,220,149,133, 18, 82,115,115, + 72,148,202, 23, 94, 39,213,244,107, 57, 58, 58,202,123,245,234,213,213,215,183, 56,167,214,202,149, 43,161,215,235, 37, 6,131, +161,108, 38, 92, 65, 65, 1,246,239,223,143,237,219,183, 95,179,180,180,252,221,132,155, 9,214,213,213,117, 34,199,113, 14, 44, +203,234,237,237,237,197,123,247,238,133, 76, 38, 3,195, 48,104,217,178, 37,100, 50,153, 86,165, 82,233, 75,202, 96, 88,181,106, +149,240,179,207, 62, 19, 87,164,215,168,121,227,233,158,172,117,103,153,153,187,135,133,157, 15, 60, 27,188, 11, 0,232,214,103, + 20, 60,235,215, 65, 94, 70,168,135, 70, 29,211, 95, 44,204,182, 14, 95,151, 24, 97,246, 94,179,145,133,105, 65,143, 1,252, 98, +210,169,201,113, 8, 12, 12, 68,143, 30, 61,202,186, 3, 29, 28, 28,160,211,233, 96, 52, 26,107, 52,150,173, 52,137,232,130, 5, +132,193, 60,224,247, 54, 22, 41, 0,236,203,155,171,184,184, 56,196,197,197,149,221, 8,114,212,180, 20, 42, 42,149,202,204,211, +211,115, 68,179,102,205,112,254,252,121,132,134,134, 38, 6, 5, 5,185,180,110,221, 26,174,174,174, 35, 85, 42,213,236,164,164, + 36,147, 19, 42,219,219,219, 43, 58,117,234,244,229,200,145, 35,241,240,225, 67,204,154, 53, 43, 51, 57, 57,249,208,209,163, 71, + 63,255,234,171,175,152,206,157, 59, 35, 45, 45, 13, 27, 55,110, 52,222,190,125,251, 7,107,107,235,133,213,236,247,135, 73, 73, + 73,174, 26,141, 6, 89, 89, 89, 96, 89, 22, 69, 69, 69, 56,117,234, 20, 78,159, 62,157,154,147,147, 19,144,148,148, 20,109, 74, +217,234,214,173,107,238,239,239,239,248,248,241, 99,236,218,181, 11,122,189,126, 78, 76, 76,140,222,210,210,114,199,146, 37, 75, +230, 89, 90, 90,218, 4, 6, 6,162,244,184,253,235,175,191, 48,127,254,252,227,102,102,102, 3, 34, 34, 34,244,213,200,247,255, +254,251,239,191,183,179,179,251,104,232,208,161,140,191,191, 63,238,222,189, 11,163,209,136,174, 93,187,150,153,171, 83,167, 78, +237, 60,117,234,212, 64, 0, 98,165, 82, 41,251, 95,143, 94,149,162,209,104, 16, 21, 21, 5, 71, 71, 71,212,111,221, 14, 51, 31, + 60,199,149,235, 55, 64, 41, 69,199,240,231, 40, 40, 40,196,239,191,255,142,224,224, 96, 8, 4, 2,120,121,121, 85,171,169,215, +235, 17, 29, 29,141,244,244,116,244,235,215, 15,195,134, 13,195,138, 21, 43,160,215,235,241,237,183,223, 34, 43, 43, 11, 91,182, +108, 65,116,116, 52,132, 66, 33,148, 74, 37,239,152,222,180,193, 42,233,102, 2,199,113, 72, 76, 76,196,221,187,119,241,252,249, +115, 40, 20, 10,168, 89, 35,183,241,220, 85,142, 16,113, 2, 71,233, 53,202, 22,103, 17,175,202,137, 27, 12, 6, 34, 20, 10,113, +253,250,117, 60,125,250, 20,230,245,105,153,185, 42,141, 96, 21, 21, 21, 65, 36, 18, 21,220,184,113, 35, 38, 56, 56,216, 83, 40, + 20,234, 42,211, 76,179,206,222,118,246,252,185,233,126, 45,189, 27,116,235, 60, 31,199,142,205, 67,118,110, 30,138,116, 34,228, +171,245, 40, 84, 83,184, 88, 52, 64,107, 31, 31,164,103,233,240, 56, 60, 56, 33, 67,108, 83,109, 31,140,129, 50,185, 59,151,141, +181,124,127,216, 56,152,185,191, 3,109,248, 62,112,249, 41,224,242,139,187, 77, 36, 10, 11,152,219,185,161,160, 72,131,171, 15, +158,194, 64,153, 92, 83, 43,253,201,147, 39,249, 42,149,106,221,212,169, 83,151,223,184,113, 93, 1, 0,247,238,221, 43, 76, 74, + 74, 90,148,148,148,148, 95,147, 29, 88, 46,123, 59, 81, 40, 20,143,235,215,175,111,120,239,189,247,108,251,247,239, 15, 59, 59, + 59,132,132,132, 96,217,178,101, 33,133,133,133, 67, 98, 98, 98, 12,213,116, 59, 36, 6, 31, 62,108, 17,240,233,167, 86,179,250, +245, 91, 54,126,252,248,159, 22, 46, 92, 40,174, 87,191, 62, 56,163, 17, 17, 17, 17,116,199,142, 29,236, 47,115,231,174,148, 40, + 20,194,219, 71,142,136, 88,173, 54,241,191,125, 16,187,186,186,118,238,221,179,115,147, 31, 86,173,131, 70, 93,128, 91,215,143, + 35, 59, 59, 29,155,183, 28,108,226,234,234,218,217,212,193,196, 9, 9, 9,123, 14, 28, 56, 48,205,199,187,137,175,151,155, 27, +194, 98,159, 67,194, 25, 33,102, 89, 8,244, 90, 48,172, 6,110,205, 40, 8, 99,142,148,148,124,108, 60,125,225, 65, 66, 66,194, +158,106, 35,137,189,222,199,144,216, 92, 16, 66,112,166,147, 55,100,230, 74, 72, 20, 10,180, 63,112,169,204, 84,197, 46,253, 26, + 34,133, 18,214,173,223,169,182,156,169,169,169, 69,245,235,215,191,251,240,225,195, 86,141, 26, 53,194,130, 5, 11, 16, 31, 31, + 15, 74, 41,210,210,210, 52,233,233,233,137,153,153,153, 49,132,144, 67, 73, 73, 73, 91, 77, 93,138,132,227, 56,135,163, 71,143, + 2,128, 24, 0,206,159, 63, 15,149, 74, 5, 75, 75, 75,228,229,229,225,211, 79, 63,149,126,247,221,119, 0,128,187,119,239,138, +204,204,204, 42,213, 10, 11,142,252, 33, 39,159,102,211,130,144,254, 89,108, 72,243,119,123,196,163, 91,159,145, 56,123,236,119, + 92, 56,125, 14, 54,194,152,231, 80,228,159,204,120,158,145,151, 80,216, 96, 83, 19,191,207, 5,201,133,167, 55, 77,234,103, 45, +112,118,230,246,205,218, 80,121,226,222,210, 59,112,129, 64, 80, 54, 6,171,116, 64,123, 77,205, 85,121,230,205,163, 28, 1, 33, + 94, 98,113,104, 98, 74,124, 55,149,163, 43, 82, 83, 83, 17, 31, 31,143,184,184, 56,196,199,199,163,126,253,250,120, 30,251, 20, + 18,137,248,158,137, 81,240,161,125,251,246, 53,215,233,116, 56,124,248, 48, 75, 8,233,115,244,232,209,187, 45, 90,180, 16,118, +233,210,197,252,247,223,127, 31, 10, 96,107, 77,238, 37,148, 74,165, 88,175,215,227,143, 63,254, 64, 66, 66, 66,231,148,148,148, + 72,149, 74,181,105,236,216,177, 27,154, 52,105, 82, 63, 50, 50,242,177, 90,173, 30,159,148,148, 20, 90,157, 88, 78, 78,206,168, +158, 61,123,238,227, 56,174,110,199,142, 29, 21,243,230,205,179,120,244,232, 17,220,221,221, 65, 41, 13,171,201, 82, 83,177,177, +177,249, 87,175, 94, 77,109,218,180,169,163,179,179, 51,196, 98,241, 50,103,103,231, 69, 74,165,242,135, 46, 93,186,216,236,216, +177, 3,167, 79,159,134, 72, 36,194,211,167, 79,147, 30, 62,124,184,198,201,201,105,173, 41, 25,220,131,131,131,159, 1, 24,210, +186,117,235,249,171, 87,175,158,195, 48,204, 39,103,206,156,129, 72, 36, 2,128, 50,115,229,225,225, 49,124,223,190,125,195,222, +178,118,218,160,211,233, 96,107,107,139,244,244,116,164,165,165,161, 78,157, 58,104,215,174, 29, 12, 6, 3,142, 28, 59,142, 43, + 87,174,128, 82, 10, 59, 59, 59, 88, 90, 90,226,254,253,251, 0, 80,213,236, 97,131, 94,175,135,141,141, 13,114,114,114,112,255, +254,125, 56, 56, 56, 96,234,212,169,208,233,116,216,187,119, 47,238,221,187, 7,134, 97,224,224,224, 0,115,115,115, 83, 52,121, +106,106,176, 4, 2,193,197,139, 23, 47, 14,244,241,241, 17, 70, 71, 71, 35, 58,186,248,102, 70,173, 86,179, 66, 1,246,167,134, + 30, 30, 82, 69,227, 31, 88, 62, 87,134, 68, 34,217, 56,112,224,192,241,163, 70,141,194,196,137, 19, 65, 8,193,111,247,116,136, +139,227, 96, 48, 24,144,154,154,138,176,176, 48,218,170, 85, 43,194,113,156, 62, 32, 32,224,139,224,224,224,214, 2,129, 32,175, + 50, 77, 26, 20,196, 58, 54,239,255,225,207, 27,183, 94, 26, 49, 98,132, 77,223,126, 63,227, 94,100, 4,114,139,236, 1, 74,225, + 98,175, 68,235,134, 95, 35, 45, 83,131,211, 39,143,101,115,172,230, 67,250, 96,183,161,170,114, 2, 64,186, 80,237,176,105,251, +129,149,187,247, 29,252, 98,244,200,161,178,128,192, 79, 33,206, 8, 3,155, 20, 12, 23,239,142,160, 66, 51,220, 14, 14, 65,104, +116,188,166, 72, 47,216,154, 39, 86, 79,175, 78,179, 60,217,217,217, 39, 82, 82,146,127, 46,157, 28,192, 48, 68, 33,145, 72, 79, + 84, 99,166, 2, 95,202, 11,244,114,134,248,134, 75,151, 46, 77,179,181,181,229,194,195,195,177,113,227, 70,227,221,187,119, 15, +112, 28, 55, 39, 35, 35,163,168, 58, 77,123,131,225,254,206, 89,179,188, 91, 15, 24, 64,251,127,241,133,134,145,201,198, 47, 91, +181,106,118,102,110,174, 11, 0,216, 88, 89,197,111,158, 63,127, 97,175,222,189,243,195,175, 94, 53,187,126,248,176,153,132,101, +131,171, 43,231,155,160, 42,205,132,132,132, 75, 13,234,213,193, 31, 91, 87, 65,175,215, 34, 57,177, 56,112,149,145,153,139,170, +204,213, 43,199, 82,241, 44,170, 1,171,215,172,189, 57,238,211, 79,156,222,233, 26,136,184,251,247,160,207, 74, 7, 49,176, 16, + 17, 33, 10,211,228, 72, 75, 45,192,210, 19,231,210,212, 26,205,128,151, 19, 57, 86, 86,206,178,110, 65, 11,115, 72, 20,197,227, +174,202, 71,173,196,230, 22, 16, 41,148, 16,136,197, 21, 13,134, 15,172, 32,167,220,135,163, 71,143, 14, 61,113,226,132,245,144, + 33, 67,240,254,251,239,135,228,228,228,116,201,202,202,202,175,109,125, 50, 12,147,214,187,119,111, 7,157, 78,199, 14, 30, 60, + 88,152,145,145,129,210, 41,246, 5, 5, 5, 56,121,242, 36, 26, 53, 42,158,157, 31, 30, 30,142,166, 77,155, 86,170,249,249,140, +176, 68, 0, 11,167, 14,114, 93,121,243,126,242, 36, 0,203, 60,235,187,225,194,233,115,184,114,225,250,172,182,205,184,117,189, +135,181,250, 94,222,229,163,233, 77,252, 62, 23, 40, 45,156,177,237,224, 1, 65,100,240, 47,139,139,138,194,234, 1,248,186,178, +114,150,118, 95,191,156,146, 65,173, 86,155,100,174,170, 58,150, 40, 40,181,203, 37,179, 71, 77, 27,212,230,236,174, 91,230, 74, +165, 18,122,189, 30,148, 82,212,171, 87, 15, 66,145, 16,191, 30,250,169, 48, 39, 39, 99,174, 41,154, 10,133, 98, 98, 64, 64, 0, +158, 60,121,130,208,208,208, 3, 73, 73, 73,161, 42,149,234,192,179,103,207, 6,183,105,211, 6,123,246,236,153, 88,153,193,170, + 76,179, 52, 99, 61,165, 20, 70,163, 49, 11, 0,146,146,146,238,155, 18,253,125, 89,179, 36, 89,104, 7, 0,104,210,164, 73,188, +163,163,163,197,253,251,247,225,236,236, 12,189, 94,223,166, 38,199, 18,165,148, 83,169, 84,107,111,223,190,189,180,101,203,150, +248,248,227,143,187,221,189,123,183, 91,139, 22, 45,224,229,229,133,107,215,174,225,204,153, 51,127,114, 28, 55, 54, 57, 57, 89, + 83, 85, 18,212,202,182,253,246,237,219,209, 0, 62,245,243,243,251, 72, 40, 20,194,194,194, 66,144,152,152, 40, 56,115,230, 12, + 0,140,222,183,111,159,177, 54,251,253,239,184, 46,189, 41, 77, 66,200,183,195,135, 15,223, 52,102,204, 24, 89,155, 54,109, 94, +136,168,158, 56,113, 2, 28,199,193,214,214, 22,182,182,182,136,142,142,198,161, 67,135,116,185,185,185,107,196, 98,241,178,170, + 52, 63,253,244,211, 77, 99,198,140,145,181,110,221, 26,185,185,185,101,230,237,216,177, 99, 32,132,192,206,206, 14,182,182,182, +120,252,248, 49, 14, 29, 58,164,201,206,206, 94,165,211,233, 86,252,157,219,254,175, 51, 88, 89, 89, 89,147,191,249,230,155, 46, + 95,124,241,133,109, 97, 97,161,192,214,214, 22, 41, 41, 41,236,169, 83,167,178,242,243,243, 39,215,228,199,174, 95,191, 62,161, + 79,159, 62,107,126,251,237,183, 45, 91,183,110,237, 60,120,240, 96,124,250,222,123, 24,215, 86, 14,173, 86, 11, 66, 8, 78,159, + 62,253,232,226,197,139,158, 98,177, 88, 59,111,222, 60, 14,192,205,106,239,232,195, 14, 69, 56, 54,239,223,121,221, 79, 27,246, +251,250,183,173,235,238,225, 46,109,239,106, 9,189,193,136,212,180, 76, 92,186, 30,174,141,138,184,151, 72,245,250, 15,211, 34, +170,207,226, 14, 0, 17, 17, 84, 15, 96,178,183,183,197,130, 21,155,118,108,220,190,107,127,255,209,195, 6, 8,125, 91,116,197, +179,235,135,112,249,230, 5, 54, 91, 67, 15,229,139, 4,227, 34,162,243,178,107, 90,241, 90,173, 86, 71, 8, 40,254,147,125,157, +106,181, 90, 93,109,206,199,242, 79,126,253,245, 87, 36, 39, 39,107, 99, 99, 99,119, 83, 74, 55, 37, 39, 39,155,156, 62, 97, 29, +165,186, 1,132,156,155,211,177, 99,207, 57,167, 79,203, 6,125,249,165,174,255,135, 31, 78,135, 86,171,135, 68, 66,133, 10, 5, + 3,169, 84, 20,126,245,170,217,218,113,227,108,136, 78,119,246,119, 74, 77, 14,193,255, 29,179, 8,203, 69,176, 48,226,243,175, +160, 46, 23,193,186,113, 39, 10, 53,137, 96, 1, 64,114,114,114,156,179,179,115,219, 69,107,215, 29,236,213,182,117,147, 6, 42, +103,169,173,135, 59,148, 78, 78,200,202,200,192,173,123, 79, 12, 63,157,187,244, 64,173,209, 12, 48, 53, 47, 12,199,113,101,179, +220,188,191,156, 9, 70, 32, 40, 51, 2,165, 73, 3, 45,252, 59,130, 8,133, 48, 82, 10,189, 94, 95,237, 32,172,164,164,164, 4, + 23, 23,151, 15,191,252,242,203,243,127,252,241, 7, 19, 16, 16,208,242,175,191,254,122,173, 69,115, 19, 18, 18, 92, 75,186,181, +242, 44, 44, 44,132, 35, 71,142,132,193, 96, 64, 81, 81, 17,114,115,115,145,153,153,169,157, 50,101,138, 20, 0,196, 98,177,161, +103,207,158,213, 94, 63, 86,237, 75,208, 76, 29,228,186,206, 70, 24,243,113, 94, 70,168,135,141, 48,230,121,219,102,220,186, 85, +251, 18, 52, 11,190,178, 90,148, 17,115, 41, 42,185,240,244,166,109, 7, 15, 8,134,247,255,208,232,170,124, 60, 75,230, 64,247, +191,219,183,218, 70,232,149,164,162,181,141, 92,189, 76,198, 3, 26,226,217,209,122,105,151, 65,173,103, 47,154,182, 74,233,224, + 96, 15,214,200,226,121,220, 51,252,118,112,125, 97,190, 54,123,113,102, 4,189,107,138,150,167,167,167,135, 64, 32,192,145, 35, + 71, 0, 96,125,201,203,235, 79,157, 58, 53,120,200,144, 33,168, 91,183,174,183,187,187,187,180,170, 52, 26, 21, 69,239, 12, 6, + 3,222,244,186,214,132,144,167, 27, 55,110,116,177,177,177, 33, 87,174, 92, 97, 25,134, 57, 90, 83, 13, 39, 39,167, 31,143, 31, + 63,222,137, 82,218,211,215,215, 23,117,235,214, 45,185,158, 70,224,202,149, 43,187, 18, 19, 19, 71,188,161,197,157, 41, 33, 4, +121,121,121,165, 3,237,244, 74,165,242,173, 92, 52, 58, 49, 49,113,187,163,163,227,233,249,243,231,127, 87,175, 94,189,177,163, + 71,143, 22, 52,108,216, 16,185,185,185,176,176,176,128, 74,165, 66, 98, 98, 34,182,111,223,110, 76, 75, 75,251,141, 97,152, 5, + 73, 73, 73, 73,181,213,180,182,182,134,179,179, 51, 18, 18, 18, 74, 53,183, 24, 12,134,133,233,233,233,169,224,121,179, 6, 43, + 37, 37, 37,195,201,201,169,233,175,191,254,186,182, 56, 77, 67,113, 84, 43, 63, 63,127,114, 74,241,136,241, 26,113,236,216,177, + 39, 0, 2,250,244,233, 83,111,255,254,253, 91,118,238,220,217,185, 95,191,126, 24, 60,120, 48, 88,150, 69,175, 94,189, 70,188, + 28,181, 50,133,212,176, 67, 17, 36, 32,160,233,221, 91,151, 63, 13,185,123,179, 15,165,212, 7, 0, 33, 12,243,159,197,158, 35, +106,190,216,115, 68, 68, 94, 54,128,143,124, 93, 45,188, 22,175,223,177,213, 76,200,117, 84,179,204, 85,181,150,249, 34, 36, 33, +175,214, 11,140,150,100, 94, 95,206, 48,100, 70,241,115,211,150,134,169, 68, 99, 38, 0, 8,133,162, 61,119,239,222,157, 29, 27, + 27,155,104,202, 12,175,138, 56, 72,105,220,167,132,156,153,238,227,211,181,207,148, 41, 34,191,238,221,205,109,220,220, 56, 74, +169,241,249,173, 91,228,198,145, 35,162, 27, 71,142,200, 12, 90,237,249,125,148,214,104, 6,212,223, 49,139,176, 52,130, 85,207, +203,245,204,192, 1,189,187,123,121,168, 0, 0, 79,159, 39, 33, 35, 43,247, 76, 77,115, 13,149,154, 44, 66,136,255, 95, 44, 59, + 88, 36, 18,245, 33, 37,169, 24,104, 45, 22,123, 54, 26,141, 9,109,219, 86,178,121,243,150, 85,102,200, 82, 77,188,240, 6,169, + 84,170, 79,218,183,111,191, 44, 41, 41,233, 96,122,122,122,225, 27,186, 46,244,218,185,115,231, 9,142,227,204, 94,138,112,229, + 37, 37, 37,153,151, 52,164,117, 79,157, 58,181,139, 16, 82,173,129, 95,181, 47, 65,179,114, 78,179, 67, 26,117, 76,127,162, 44, + 58,180,106,109,241,172,150,121,171,115,114, 1,252, 50,169,191, 13, 23, 25,252,203, 10, 23,139,199, 51,214, 30,202,250,173, 58, + 61,134, 97, 30,183,105,211,166,204,104, 85, 83,255, 73,181,169,128,103, 87,179,151,217,250,144,139,159,205, 28,248,189, 78,175, +111,193, 16, 80,145, 88,124, 63, 39, 39, 99,174,169,230,170,196, 88,252, 60,109,218,180,201, 79,158, 60,217, 85,154,243, 46, 41, + 41,233,186, 74,165,250, 49, 46, 46,110, 66,124,124,252,250,248,248,120,147,205,149, 82,169,212,168,213,106,142,101, 89, 70,171, +213, 66, 34,145,232,223, 84, 99, 80, 88, 88, 56,116,195,134, 13,191, 26, 12,134, 38,132,144,163, 57, 57, 57, 53,206,122, 27, 28, + 28,108,240,246,246,238,119,252,248,241,201, 15, 30, 60,152,234,232,232,232,152,154,154, 26, 27, 23, 23,183, 52, 37, 37,229,151, + 55,100,174, 16, 28, 28, 44,245,243,243,211,150,171, 23,139,183,101,188, 85,133,237, 91,106,106, 58,128,137,174,174,174,107,166, + 79,159,190,184, 69,139, 22, 3, 71,141, 26, 69,228,114, 57,246,238,221,139,152,152,152, 67,148,210,217, 53,233,210,173, 76,211, +204,204, 12,123,247,238,165, 49, 49, 49,251, 24,134,153,147,148,148,244,175, 88, 72,251,239,128,188,233,187,160,154,134, 79,251, +244,233, 83, 47, 35, 35, 99,139, 86,171,125, 7, 64, 97,104,104,168,249,127, 59, 36, 91, 21, 1,222,246,138,160,136,234, 27, 50, + 83, 53, 95, 30,160, 94, 27,205,154,104,152,170, 89,217, 98,207,156, 86,155,100,203,178,119,215, 81,170, 51, 85,211,197,197,101, + 33, 76,204, 23, 85, 66,100, 98, 98,226,119,181,169,207, 6, 13, 26,208,232,232,104, 80, 74,201,155,220,239,127,199,177,244,111, +210,220,190,218, 71,213,168,121,227,233, 97,193,145, 63,148,116, 31,150,177, 96,146,141,121,199,119, 3,230, 94,189, 16,244,253, +188,117, 47,118,113,190, 13,219, 78, 8, 97, 42, 50, 22,165,201, 61,107,170, 89,167, 78,157, 77,190,190,190, 95,132,132,132,252, + 26, 23, 23, 55,250,159,186,237,132, 16, 82,183,110, 93, 73, 77,162,115,252,121,100,154,166,147,147,147, 63,195, 48,115, 75,110, + 56, 22, 39, 36, 36,220,126,131,154, 70, 74,233,162,228,228,228,144,255,239,109,255,215, 69,176,254,110, 74, 35, 90,239,191,255, +190,131, 64, 32,248,199, 47,210,105,138,185,170,105, 20,234,159,160,241, 50, 37, 6,234,250,155,208,122,217, 44,253,157, 60,126, +252,152,240,167,245, 63,143, 79,191, 10, 77, 2, 48,197,191,130,212, 84, 37,166,106,122,151,247,223,206,109,175, 44,106, 83,219, +133,152,227,226,226,198,170, 84,170,169, 53,153,125,248, 95,218,110, 10, 64,203, 31,253,111,158,148,148,148,187, 0,250,254,211, + 53,121,131,245, 15,225,175,191,254, 74,227,119, 7, 15, 15, 15, 79,245,252,211,205, 21, 15, 15, 79,241, 0,233,192, 74,238, 62, + 76, 14,253, 17, 66, 2,107,113,119,115,142,215,228, 53,121, 77, 94,147,215,228, 53,121,205,127,151,230,191,134,210, 89, 76,127, +199, 3, 64, 32,175,201,107,242,154,188, 38,175,201,107,242,154,188,230,191,237,193,240, 22,147,231,239,230,167, 1,196,229,167, + 1,196,229,239,250, 60, 15, 15, 15, 15, 15,207, 63, 13,225,219,182, 65,254,254,254,222,148,210,161,132,144,129, 37, 17,186,253, +132,144,157,119,239,222, 53, 41, 3,173,153,153, 89,170, 70,163,113, 0, 0,153, 76,150,166,209,104,156,202, 71, 75,129, 87,150, +200,160,197, 63, 83,249,128, 85, 79, 79,207, 84,173, 86,235, 96, 66, 52,241, 18, 33,228, 50,195, 48,151,106,147, 94,224,221,119, +223, 29, 33, 16, 8, 22, 3,128,209,104,252,246,194,133, 11,127,252, 93,245, 76, 8,105,227,166,114,250, 93,111,208,179,169,233, + 89,115, 41,165, 71, 42,250,220,134,190,100,169,144, 96,122,201,255, 43,199, 31,165, 85, 78,253,174,233,231,171, 40,159,191, 72, + 36,154,232,232,232,216, 43, 33, 33,225, 46,128, 25,148,210,106,143, 1, 43, 23,239, 79, 69, 34,209, 48,131,209,232, 37, 18, 8, +158, 26, 12,134, 29, 57,137, 17,219,249, 75, 5, 15, 15, 15, 15,207,223,102,176,218, 53,176,109, 72,168,126,186,136,208, 78, 6, + 74,174, 80, 34, 94,121,227,113,102,212,235, 20, 64,165, 82,185, 17, 66, 2, 40,165, 77, 24,134, 9,227, 56,238, 76, 77, 23, 59, +246,243,243,115, 3,240, 49,128, 33,109,219,182,109, 54,110,220, 56,212,175, 95, 31, 26,141, 6,183,111,223,158,181, 99,199,142, + 89,126,126,126, 15, 0,236, 2,176, 59, 56, 56, 56,190, 50, 45,141, 70,227, 80,234,149, 8, 33, 14, 3, 7, 14,188, 93,222, 84, +149, 44, 46, 75, 40,165, 55, 8, 33,215,141, 70,227,205,125,251,246,197, 55, 38,164,205, 24, 15,241,254,201,207,116,174, 47,107, +106,181, 90,135, 99, 83, 39,128, 82, 14,154,204, 12,116, 88,182,182,236,189,147, 61,219,130, 49, 26, 32,145,138, 47, 5, 28,189, +113, 25,192,165,146, 71,141, 17, 8, 4,139, 79,157, 58,229, 76, 41, 69,143, 30, 61, 22, 3,248, 91, 12, 22, 33, 68,218,214,191, +197,197,163, 7,118,201, 10,178, 82,209,179,223,224, 29,132,144, 17,148,210, 3, 47,152,165,222,196,145, 8, 49,125,220,146,157, + 2, 0,216, 48,123,232,140, 53, 61,200,186, 41,167,105,138,139,139, 75, 23, 74,233,140, 18,189, 21,137,137,137, 23, 55,244, 38, +142, 16, 96,230,184, 37, 59, 9, 0,108,156, 61,116,250,134,222,100,237,248, 19, 53,155, 37, 73, 8, 25, 63, 98,196,136,117,139, + 23, 47, 22, 56, 59, 59, 35, 49, 49,177,167,183,183,119, 67, 66,136, 55,165,180,210,193,193, 54,117,124,246,244,236,217,203,243, +227, 65, 3,228,246,118,214, 72, 72,206,176,248,115,199,206, 49, 54,117,124,122,101,197,133, 14,230, 47, 23, 60, 60, 60, 60, 60, +111,204, 96, 53,107,102,105,101,166,166, 83,205,196,244,227,158,109,188, 61,250,118,107, 79, 60, 61, 61, 17,245, 40,202,235,226, +181, 59, 35,187, 52, 54,127,174,214,147,221,106, 51,178,234,193,131,170,215, 15, 27,225, 75, 12, 6, 99,241,111,138,133, 48, 94, + 72,119, 61, 20, 24, 24,232, 49,106,212, 40,248,250,250,226,238,221,187, 93,246,237,219, 55,217,205,205,237,142,193, 96, 56, 33, +149, 74,131,170,203,161,226,231,231,183,204,197,197,101,198,180,105,211,136,191,191, 63,164, 82,105,217,123, 74,165, 18, 93,187, +118, 69,215,174, 93,145,154,154,218,236,226,197,139,205,118,238,220,185,212,207,207,111, 69,112,112,240, 44, 83, 42,104,238,220, +185,254, 21,188,124,138, 16,242,132,101,217,123, 62, 62, 62,241,141, 8,169, 63,182,119,251,179,227, 59, 52, 80, 84, 17,157,194, +157,197,197,171,107,148, 55, 88,180, 40, 31, 34, 11,243, 75, 34,165,242, 21,115,213,132,144, 22,109,173,153,223,127,201, 50,250, +212,192,100, 33, 62, 62, 30,150,150,150,102, 1, 1, 1,201,132,144,249, 23, 47, 94,220,242,134,143,155, 54,243,167,143, 23,103, +199,132, 34,229,225, 13, 76, 29,212, 81, 62,229,167,191,190, 7,112,160,106,227,195, 48,127, 60,181,155, 53, 5,152,204,113,220, +220,200,200,200,206, 0,208,164, 73, 19, 9,128,139,219,162,173,123,143,104,146, 91,235, 52, 11,132, 16,177, 64, 32,248,121,219, +182,109,159,127,250,233,167,136,141,141,197,213,171, 87,161, 84, 42,177,112,225, 66,247,105,211,166, 45, 5, 48,185,178,200, 85, +143,158,189, 61, 55,254, 48,199, 59, 63, 43, 87,187,249,231,189,119, 84,205, 26, 49, 83, 38, 77, 48,215,177,122, 39, 43, 23,239, + 79,249, 72, 22, 15, 15, 15, 15,207, 27, 49, 88,157,234, 43,110,247,247,171,231,215, 55,176, 61,211,160,145, 55,196, 50,121,217, +123,205, 91,250,162,121, 75, 95, 50,122,100,190,231,253,251,247,231,156,186,116,107,118,167,250,138,224, 43,209,133,173, 43,211, + 51, 24, 33,220,185,115, 39, 0,224,199,175,135, 10,126,190, 18,229, 81,126,193,216,206,157, 59,163,115,231,206,204,210,165, 75, +219, 92,188,120,177,205,238,221,187,245, 46, 46, 46,107, 18, 19, 19,247, 85, 81,204, 25,251,246,237, 35, 2,129, 0, 2,129,160, +210, 15, 57, 58, 58,162, 91,183,110,112,118,118, 38, 95,127,253,245, 12, 0, 21, 26, 44,153, 76,150, 70, 8,113, 0, 0, 27, 27, + 27,227,252,249,243,239, 81, 90,214, 3, 72, 41,165, 55, 24,134,185,201,113,220,173, 35, 71,142, 36, 52, 37,196,161,143, 95,163, + 43,227, 63, 25, 40,167,251,215, 84,106, 14,180, 57, 89, 21,190, 46, 81,200, 47, 73, 20,138,203, 82, 51,179, 23,204, 85, 83, 66, + 92,219, 54,242, 56,179,225,171,161,230, 38, 70,241, 26,118,233,210, 69,102, 52, 26, 81, 88, 88,136,141, 27, 55, 90,154,153,153, + 89,246,234,213,107, 30,128, 50,131,229, 77, 72,243, 15, 85,130,209,243, 19,217, 9,181, 48, 48, 86,157,218,249,199,252,180,108, +158,133,127,219, 78,120,124,241, 79,100,101,229, 35, 55,167, 0, 47,103,253, 6,128,241, 39,104,234,134,190,100,229,134,111,134, +206, 36, 12, 67, 90,244,159,129, 30, 13,233, 36,149, 74, 21, 78, 8, 17,149, 46, 31, 67, 8, 17,186,186,186,170, 26, 54,108,185, +178, 65,143,198,216,248,237, 39,160,197,139, 52,174, 52, 53,122, 69, 8,113, 48, 55, 55, 63,114,230,204,153, 54,173, 90,181,194, +205,155, 55,241,236,217, 51,140, 31, 63, 94, 55, 97,194, 4,241,240,225,195,201,212,169, 83,191, 36,132,236,167,148, 94,123,249, +251, 34,145,104,216, 71, 3, 62,144, 20,228,228,105,116, 90,189,206,198,206,138,211, 22,106,138, 50,178,243, 52,159, 12, 29,166, +187,119, 55,120, 24,128, 87, 12,214,235,212, 39, 15, 15, 15, 15,207,191,212, 96,201, 4,198, 86,243,119,221,135, 49,235, 9,104, +110, 28,104, 97,202, 43,159,145,219,185,161,113, 59, 71,200,173,236,153,176,135,171, 91,189, 20,181,169,114,170,102,169,185,218, + 60, 84,213,180, 48, 59, 89, 12, 0, 10,107,103,253,232, 29,137,225,173, 90,181,130,189,189,189,248,250,245,235, 83, 1,236,171, + 66,147,232,194,130,241,176, 79,123,212,123,152, 5,185, 92, 14,137, 68,242,194, 7,162,162,162,112,249,242,101,196,197,197,193, +203,203, 11,120,105, 28, 85,121, 77,181, 90,237,216,179,103,207,160, 21, 43, 86,116,254,241,199, 31, 31,108,219,182,173,115,101, +221, 74,222,132, 40, 90,184, 59, 5,125,255,245, 24,107,122,242,119,166, 40, 51, 13,226, 74,202,217,126,241, 42,180, 95,188, 10, + 0,176,215,219, 25, 50, 11,115,200,148,202, 75,129,167,239,190, 18,185,242, 35,196,194,203,217,246,194,250,249,147, 21,184,176, + 71,130, 47, 22, 86, 89,159,126,126,126, 13, 3, 2, 2,174, 47, 90,180,200, 42, 62, 62, 30,215,174, 93,131,187,187, 59,138,138, +138, 94, 88,175,204,155, 16,199,214,141,234,158,153, 61,109,164, 37,128, 9,166,236,163, 23, 76,136, 64,240,253, 15,243,103, 88, + 88, 74, 41,158, 92, 59,132,103, 79,158,227,118,196,115,195,246,179,161, 70,157,193, 56,170,162,250, 28,127,148,126, 51,173,171, +244,247,187,249, 94, 71,251,116,153,208, 96,209, 16, 71,232,245,250,173,233,233,233, 24, 61,122, 52, 56,142, 67,199,142, 29, 59, + 80, 74, 19, 39, 77,154, 4, 47, 47, 47,108, 57, 29, 85, 36,204,186, 21,176,227,122,222, 93, 83,142, 37, 66, 72,179,186,117,235, +158,185,120,241,162,163,139,139, 11,130,130,130,144,146,146, 2, 39, 39, 39, 76,152, 48, 65,178,108,217,178,109,121,121,121,131, + 22, 47, 94, 44,123,240,224,193,110, 66,136, 91,137,105, 46,211, 52,114, 70,149,167,187, 74,121, 96,247,233,251,214,230,114,212, +241,114, 19, 11,148, 22, 70, 10, 82, 84,199,217, 94,108,228,140,170, 10,246,255,107,213,167,169,240,154,188, 38,175,201,107,254, + 27, 52,255, 85, 6,171, 20,253,179, 32, 72,188, 7, 0, 92, 83,208,236, 39,224,242, 18, 65,229, 14, 40,228,204,144,145, 20,139, +135, 87,246,129,234,171,207,123, 39, 18,128,157, 51, 97,168,208, 74, 6, 72,204,237,245,249,249,249, 80, 40, 20, 40,204, 78, 22, + 79,251,161, 44,178, 37,190,120,241, 34,130,131,131,161, 82,169, 76, 42, 35,213, 21,247, 34,234,116, 58,232,116, 58,164,244,110, + 13, 69,219,119,144,253,201, 4,156, 63,127, 30,105,105,105, 16,139,197,144, 72, 36, 96,217,234,147,197, 51, 37,171,198,150, 70, +173, 42,250, 76, 0, 33, 66, 87, 27,229,209, 13,243, 38,123, 48, 55,142,137,212,113,209, 72,210, 24, 97,101, 66,125, 74,149, 10, + 72,228,102,151, 36, 74, 69, 69,230, 74,164, 80,202,142,254,190,104,170,147, 32,228,188, 76, 29, 29, 90,102,218,202,211,173, 91, +183, 49, 0,230, 81, 74,115, 2, 2, 2, 28, 23, 47, 94,108,157,152,152,136,136,136, 8,236,221,187, 55,157, 45,222, 80, 66, 41, + 93, 0, 0,237, 8,145,213,177,183, 58,189,254,187,201,230,184,184, 71,130,207,106,158, 92,221,178, 73,223,227, 31, 14, 31, 55, + 97,221,228,190, 40,204, 87, 99,231,217, 16,156, 10,126,242, 62,128,171,148,210, 74, 51,220,255,120, 94, 27,237,226,226,210,245, +139, 47,190,184,119,240,224, 65,187, 31,126,248, 1, 70,163, 17, 44,203,130,101,217,178,255,141, 70, 35,118,237,218,133,171,119, + 35, 38, 37, 37,229,153,180,222, 27, 33, 68,229,225,225,113,238,214,173, 91,246,114,185, 28,103,207,158, 69, 78, 78, 78, 89,228, +106,196,136, 17, 36, 39, 39,231,227,141, 27, 55,126, 24, 19, 19,243,195,149, 43, 87, 50, 1, 8, 0,176, 47,238,115,225, 19,150, + 53, 52,118,110, 82, 95, 56,168,111,167, 78, 5,153,161, 80,218,250,224,198,253, 39, 71,179,179,115,212, 12, 35,124, 82,254,243, +111,162, 62,121,120,120,120,120,254,229, 6, 75,115,127, 7,180, 97,123, 32,246,234, 2, 73,211,193, 16,185,182, 67,124, 88, 16, +238,157,248, 17, 9,225, 87, 65, 57, 35, 28,221,171, 95,106,238,143, 16, 42, 82,169, 84,193, 73, 73, 73, 8, 9, 9,193,147, 39, + 79, 32,147,201, 94,249,220,249,243,231, 1, 0, 78, 78, 78, 38,109,132,196,191, 61,220,238, 39, 35,190,133, 51, 0,192,237,126, + 50, 0, 96,233,236,217, 16,139,197, 16,139,197,101,139,194,154, 98,176, 72,201,135,185,226,110, 42, 90,209,251,254, 82,209,206, +221,243, 38,182,150,198,132, 73,180, 15,110, 32, 73,203,209,163,169,198,227,222,166, 24, 44,185,252,146, 68,169,188, 44, 86, 40, + 94, 48, 87, 0, 64, 69,162,237,127, 46,152,232,163, 72,125,170,208,220, 57,143,100, 13,167,183,168, 88,102,193,201,147, 39, 29, +132, 66,161,147,209,104, 68, 92, 92, 28,194,195,195,177,118,237,218,212,252,252,252,128,224,224,224,168,114,229,101, 90,153, 73, +246,110, 95, 56,217, 83, 24,122, 73,166,125,242,160, 66,211, 86, 21,246,205,251,247,120, 63,160,197,241, 49,159,124,139, 15,122, +119,199,240, 0,111,250, 60, 41, 75, 3,224, 44,165,212, 88,221,247, 19, 19, 19, 19, 93, 92, 92,186, 13, 24, 48, 96, 71,211,166, + 77,155, 80, 74,209,184,113, 99,244,235,215, 15, 7, 14, 28, 64, 68, 68, 4,242,243,243,245, 87,174, 92, 89,147,148,148,244,155, + 41,101, 34,132,200,173,173,173, 79, 93,184,112,193, 94, 46,151,227,204,153, 51, 80,171,213,112,118,118,126, 33,114,181,116,233, + 82,217,243,231,207,215,159, 62,125,218, 29, 0, 83,209, 66,216,122, 86,187,229,183,109,187,215, 77,253,242, 11,151, 11, 55, 35, +206,107, 11,242, 45,235,214,141,207,179,183, 86,154, 47, 94,186,188,142,158,213,141,169,184, 62,131,106, 85,159, 60, 60, 60, 60, + 60,255,114,131, 85,218,197, 68, 57, 22,186,232,179,208, 69,159,133,162,203, 28, 28, 89, 50,236,133,207, 25,141,134, 90, 21, 64, +163,209, 64,172,180,213,255,248,245, 80, 49, 0,112, 34, 69,217,234,240, 28,103,218,194,235, 53, 89,210,171, 38, 6,171, 68,247, + 21,243,224, 33, 85, 94,218,242,213,160,182,182,198, 34,145,238,234, 81, 36,106, 57,246,135,104,125,209,157, 28,186, 98,118, 37, +154,199,186,181,134, 33, 59, 3, 50,115,197,165,158, 23, 31, 84, 56, 91,208, 67,102,113,126,239,212, 33, 29,157,196, 16,235,142, +239, 67,146,150,211,110,138, 49,252,182,182,146,109,166,148,226,217,179,103, 40, 42, 42,194,245,235,215,113,224,192,129,244,151, +205, 85, 73,121,131,126,157, 49,172,141, 69,126,138, 88,119,231, 28,146,180,156,182,161, 41,166,202,167,127, 7, 49, 67,206, 16, + 70, 96,214,187,147, 55,166,124,209, 31,171,127,253,139,213, 57,116,234,179,238,200,137,143, 10,180,250,217,166,152,171,114, 38, + 43, 20,128,183,187,187,187,148,101,217, 46,125,251,246, 61,209,187,119,111,220,184,113, 3,231,206,157,107,160,215,235,147, 1, + 64,165, 82, 45, 4,224,200, 48,204,138,132,132,132,167,149,236, 35, 70, 44, 22,239, 62,119,238, 92, 83,149, 74,133,115,231,206, + 65,173, 86, 99,220,184,113,186,137, 19, 39,138, 71,140, 24, 65,114,115,115,203, 34, 87,215,175, 95,207,172,204, 92, 1, 64, 94, +194,195,147,214,110, 77,219,119,233,220,174,127,131, 6,245, 45,158,230,231,165,201,229, 50,179,139,151,174,136,111,221,188,181, + 62, 47, 33,242,118,197,245,121,222,228,250,228,225,225,225,225,225, 13, 86,149, 24,179, 94,109,243,140,108,237,215,105,110, 55, +243,116,184,153,153, 25, 54,110,220, 8,185, 92, 94, 99,227, 84,116,242, 16,226,199, 15, 45,139, 92,149, 70,178,208,115,196,107, + 25, 44,142,227,174, 3,120,193,229, 41, 28, 27, 13,217,253, 73,183, 14,222,158, 46,140, 97,239, 90, 36, 20,177,154,121,143,244, +154,135,249,244,253,136, 10, 6, 79,151, 97,208, 65,166, 40,142, 92, 85,100,174,148, 78, 13, 63,220, 54,164, 75, 64,139, 70,245, + 24,118,207, 42, 36, 22, 25, 10,102, 69,234,245, 79, 11,233,193, 74, 76,229,188,238,221,187,207,179,181,181,149,173, 91,183,206, +178,110,221,186, 96, 89, 86,247,178,185, 82, 56, 54, 26,178,103, 68,207, 14, 13,157,172, 25,195,254,159, 16,175, 54, 22,173,125, +106,216,182,201, 4,115,101,103,169, 60,189,105,201,120, 51,185, 84, 4,141, 70,131,101, 27,246,227,204,181, 7,125,210,195, 14, +157, 6,112,186,182,251, 91,175,215,127, 30, 24, 24,184,122,250,244,233, 96, 89, 22, 31,127,252, 49, 98, 98, 98,206, 68, 71, 71, +175,117,117,117,253,122,252,248,241, 42,123,123,123,140, 29, 59, 86, 12, 96, 68, 37, 50,203,119,238,220,217,167, 69,139, 22,184, +116,233, 18,114,114,114,224,236,236,140,137, 19, 39, 74,150, 46, 93,186, 45, 47, 47,111,208,146, 37, 75,100,207,158, 61,171, 50, +114, 85,158, 28,154,187,232,151,213, 99,191,110,221,182, 3, 19, 29, 29,197,198,181,238,204,156, 63,119,226,114,182,131,116,219, + 11,245, 57,178, 87,141,235,147,135,135,135,135,135, 55, 88,213, 70,135,140,249,175, 14,118,231,140, 38, 7, 50, 76, 54, 78, 70, + 19, 53, 57,173,166, 58,195, 84, 35,131, 85, 50, 6,235, 20,165,244, 5,131,101,229,212,168,243,156,153,147,215,116,252,176, 39, +147,250, 69, 59,228, 20,104,181, 51, 34, 88, 46,161,168, 26,115, 5,128, 49,234, 47,137, 44, 44, 46,139, 95,154, 45, 8, 0,102, +142,245, 91,207,250,234,203, 13,239, 14,233, 75,210,199,117, 68,118,142, 90,251,117, 56, 75, 18,213,116, 80, 4,165, 23, 43,210, + 59,127,254,252,102, 0,155, 3, 2, 2, 82, 21, 10, 5, 10, 10, 10, 94,169,215,210,242,118,248,176, 39,147,250,121, 27,100, 21, +234,181, 51,194, 89, 36,169,185,221,213,153, 43,123, 43,243,211,155, 22,143,151, 39, 37,196, 64, 44, 22, 67,169, 84,226,236,213, + 48,164, 63, 56,124,250,117, 14, 56, 87, 87,215,249,147, 38, 77,154, 55, 98,196, 8,100,103,103,227,236,217,179,120,247,221,119, +241,243,207, 63,215,189,112,225,194,234,246,237,219, 67, 32, 16,224,236,217,179, 48, 24, 12,143, 43,217,159,253, 71,143, 30,253, +245,135, 31,126,136,219,183,111, 35, 57, 57,249,133,200, 85, 78, 78,206,199, 27, 54,108,248,240,249,243,231,213, 70,174,202,227, + 2,180,246,172,215, 82,252,205,220, 31,161, 45, 74, 19,166, 39,222,188,116,254, 44,189, 81, 55, 43, 75, 14, 32,183,182,245,201, +195,195,195,195,195, 27,172, 10,220,139, 17, 66,103, 31,176,201,161,255,121,233,165,217,132, 98,185, 18,156,177,122,227, 50,194, +151, 24, 70,214,131,112, 85, 47, 6, 98,165,173,190,221,204,211,225,149,125, 86,169, 84,154,218, 69,104, 20,247,254, 80, 80,175, +199, 7,120,218,220, 9,212,160, 47,139,100, 97,246,236, 23, 76,150, 88, 44,134, 78,167, 3, 42,232,246,123,137, 91,132,144, 24, + 0, 55, 40,165,212,175,161,215,247, 50,133, 98,164,191, 79, 61,187, 41,227, 63, 23, 61, 79,211,226, 66,199,111,114,246, 47,159, +169,140,167,202, 9,177, 52,231, 90, 53,134,242, 82,239, 43, 15, 95,137, 92,249, 54,244,250, 86, 38,151,125,209,182, 89, 67,167, + 89, 83,199,139,158,167,106,201,133,214, 51,242, 14,172,152, 33,127, 6,243,175,227,105,246, 69, 19,182,127, 94,239,222,189,231, + 81, 74, 41,199,113,115, 1,160,124,121,167, 78,252, 66,244, 52, 69,131,243, 29,191,205, 62,176,124,166,121, 60,170, 46,175,189, + 79,255, 14,142,214, 22,167, 55, 45,153, 32, 79, 78,140,133, 84, 42,133,185,185, 57,226, 83,115, 33, 18, 10,212,175,115,176,185, +187,187, 75,219,180,105, 51,115,248,240,225,136,140,140,196,172, 89,179,146,147,146,146, 14, 30, 57,114,100,220,212,169, 83,133, +157, 59,119, 70, 90, 90, 26, 54,110,220,104,184,125,251,246,146,148,148,148,149, 21, 30,180, 66,225,231,223,127,255, 61, 77, 74, + 74, 34,207,158, 61,131,179,179, 51,190,252,242, 75,201,146, 37, 75,202,198, 92,213, 36,114, 85, 74, 66, 66,194,165, 6,245,234, +224,253,147,107,192, 26,180,151,114, 50,227, 46, 63,124,154,125,201, 70, 34,153,214,209,207,167, 86,245,201,195,195,195,195,195, + 27,172, 87, 48, 80, 38,119,231,178,177,150,239, 15, 27, 7, 51,247,119,160, 13,223, 7, 46, 63, 5, 92,126,177,129,145, 40, 44, + 96,110,231,134,130, 34, 13,174, 62,120, 10, 3,101,114,171,212, 51, 66,184,232,231,255,204, 22,180,178,178, 66,110,110,238, 11, +145, 23,185, 92, 14,149, 74,133,188,188, 60,236,223,191, 31,180,154,200, 16,165,244,251,225,195,135,127, 55,126,252,120,166,222, +144, 81, 40,184,121,229,229,104, 20,204,204,204, 32,147,201,144,144,144,128, 71,143, 30,113,148,210,239,171,137,120,221, 98, 89, +246,254,238,221,187, 19, 26,120,185,246, 12,104,213,122,210,236,111,102,153, 71, 92, 57,131,185, 75,214,115,245,253,123,228, 46, +219,117, 56, 63, 87, 89,167,107, 81,210,195,123,213, 85, 50, 33,228,213, 36,162,158,117,222,109,231,219,114,250,220,185,223, 90, +132, 95, 57,139,239, 86,108,162, 13, 90, 4,230,174, 56,112, 36, 47, 67,238,222, 93,157,250,159, 49, 63, 85, 17, 20, 20,180, 25, +192,230,210,231, 47,151,119,214,194,181, 92,195, 86, 61,179,151,237, 58, 80,152,103, 94, 39,176,170,242, 58,120, 15,104,239,230, +108,115,250,167, 69, 99,229, 41,137,113,144, 74,165, 80, 42,149,136, 75,206,193,188, 53,123, 11,245, 28,215,243, 53,143, 55,169, + 66,161,144,234,245,122,252,241,199, 31, 72, 76, 76,108,151,156,156, 28,231,228,228,180,105,236,216,177,235,154, 52,105,210,248, +209,163, 71,143, 11, 10, 10, 38,164,164,164, 60,172, 76,196,202,202,170,157,189,189, 61,185,113,227, 6,198,142, 29,171,251,242, +203, 47,197,195,135, 15, 39,217,217,217,181,138, 92,149,139,174,117,238,247, 94,123,116,232, 54,238,146, 78,147,115,249,249,195, +109,151, 24,122, 77,230,215,210,167, 86,245,201,195,195,195,195,195, 27,172, 10, 73, 23,170, 29, 54,109, 63,176,114,247,190,131, + 95,140, 30, 57, 84, 22, 16,248, 41,196, 25, 97, 96,147,130,225,226,221, 17, 84,104,134,219,119, 67, 16,250, 36, 94, 83,164, 23, +108,205, 19,171,167,191,100, 44, 2,171,202,149,145,155,155, 11,119,119,119,236, 26,215,168,169, 54, 47, 77, 92, 7, 0,147,104, +169,191, 16,213, 59,252,242,229,203, 5, 0,182, 54,104,208, 96, 95, 85,154, 33, 33, 33, 11, 90,182,108,121,228,155,111,190, 89, +218,160, 65,131,158,163, 23,254, 12,241,148,225, 80, 71,132, 66, 30, 48, 8, 54, 54, 54,200,204,204,196,237,219,183,145,159,159, +127,138, 82,250,205,189,123,247,194,170,210,164,148,222,244,241,241, 73,168, 83,167,142,149,131,210,236,183,113,159, 13, 55,143, + 13,189,137,212,168,251,184,118, 53, 42,123,231,129, 35,137,121,185,233,159, 85,213,184,150,215,100, 24,230, 5,115,213,176,161, +157, 82, 33,181,222, 62, 97,244, 40,139,184,176,219, 72,139,186,135, 43,215, 30,103,239,218,125, 40, 61, 51, 51,117,100,101,230, +170,186,250,172,168,188, 55,175, 60,202,222,189,239, 80, 66,126, 97,246,231, 21,149,183,188,166, 82, 33,154,126,228,143, 69,242, +164,132,216, 50,115, 21,155,156,141,239,214,236, 46, 84,235, 12, 61,211, 67, 15,153, 20,169,169,170,156, 28,199,129,101, 89, 80, + 74, 33,145, 72,242, 0,160,196, 76,117, 53, 85, 51, 35, 35, 35, 40, 38, 38,166,159, 82,169, 44,139, 92,229,230,230, 14, 90,182, +108, 89,141, 34, 87, 47,151, 51, 33, 33,225, 82, 61, 79,215,229,201,131, 7,105,157,157,237, 47, 29, 61,121, 39,204, 65,105,246, +176,182,245,249,166,224, 53,121, 77, 94,147,215,252, 55,104,254,171, 12, 86, 68, 4,213, 3,152,236,237,109,177, 96,197,166, 29, + 27,183,239,218,223,127,244,176, 1, 66,223, 22, 93,241,236,250, 33, 92,190,121,129,205,214,208, 67,249, 34,193,184,136,232,188, +236,234,126, 76, 36, 0, 59,116,232, 80, 33, 0, 72,132, 96, 87,245,233, 19,212,180,105,211,142,109, 13,105,226,121,235,138, 35, + 91, 11, 38, 13, 21, 7,221, 14,218, 39,149, 74, 55, 63,123,246, 44,207,148,141, 40, 49, 76,189, 90,181,106,245,206,215, 95,127, +189,188,183,135,107,235,254,237,187, 64, 36, 18,225,246,237,219,200,204,204,188,205, 48,204,204,144,144,144,203,166,232,133,133, +133,101, 52,173,239, 62,217,198, 76, 60,125,194,208,254,246,233, 79, 34,144, 16, 25, 2, 0,208,106,213,134,228,168, 75, 45,106, + 82,201,165, 11, 55,123,123,123,139,141,218,130, 17, 50,161,197,220,113, 31,247,115,200,124,254, 16,241,225,197,233,158,180,154, + 34,125,124,212,133,198,181,217,137,238,238,238, 82,133, 8, 99, 42, 44,175, 78, 99, 72,121, 28,217,210, 20,157, 34,173,110,201, +130,213,219,187, 47,154, 62, 82,106, 97, 97,129,224, 7,209,152,187,106, 87,141,204, 85,117, 80, 74, 97, 48, 24,106, 52,243,179, + 2,102,182,104,209,162,209,226,197,139, 27,148,140,229,122,173,200, 85,121,158, 60, 75,152, 21, 16, 16,224, 29,253, 40,184,139, +141,153,120,199,235,212, 39, 15, 15, 15, 15, 15,111,176, 80,181,209,202,203, 6,240,145,175,171,133,215,226,245, 59,182,154, 9, +185,142,106,150,185,170,214, 50, 95,132, 36,228, 61, 53,245,199,254, 8,161,162,151, 95,243,246,246, 86, 68, 11, 81, 80,250, 60, + 58, 11, 72, 74, 74, 90, 81,155,141,185,115,231,206,101, 0,109,124,125,125,251,159, 32,100, 54,240, 20,148,210, 37, 33, 33, 33, +135,106,162, 99, 46,196,131,142,222, 94, 46,157,124,155,202, 4, 70, 53, 18, 34,159, 32,171, 80,131,179,225,177, 57, 12,101,126, +175,109,101, 51,250,162,251,157,188,235,213,121,199,175,169, 92, 68,116, 72,136, 8, 70,174, 90,135, 51,225,177,185, 32,164,214, + 3,165,223, 84,121, 83, 66, 15,223,177,247,233, 31, 72, 8, 57, 55,123,226, 16,233,188, 85,187,223,168,185,178,177,177, 41, 74, + 73, 73,201,212,104, 52,182,169,169,169, 58, 27, 27,155,162, 90,154,180,104, 66, 72,243, 41, 83,166, 44,252,250,235,175,167, 47, + 95,190, 92, 92,155, 49, 87,149,145,157, 24,123,232,157,166,111,126,255,243,240,240,240,240,240, 6,171, 66, 74,204, 84, 64,128, +183,189,226,234,163,244,194, 55, 81,128,136,136,136,194, 17,190,164, 44,178, 37, 18,128,125, 93,205, 18, 67,117,168,214, 2, 12, +201,191,249, 56,182,224,214,227,216, 2,112,148,114,148,106, 25, 6,241,133,122,253,146,168,167, 9,181,159, 69, 71,136,241, 78, +116,156,250,238,147,120, 13,229, 56,202, 81,170, 35, 4, 41, 6, 3,183,228,193,211,152, 35,255,132,242,166,135, 30,186,230,228, + 61,160,211,181, 91, 15,166, 22, 22,234,215,167, 71, 28,186,254,166, 14,182,224,224, 96,131,179,179,243,176,190,125,251,142,226, + 56,110, 83, 98, 98,162,161,182, 90,148, 82, 29,128,153,132,144,131, 97, 97, 97,123,175, 95,191,158,252, 38,204,213,223,186,255, +121,120,120,120,120,120,131, 85, 21, 65, 17,111,198, 92,149, 82, 81,100,235,191, 73,216,227,231,126,127,135,238,131,199,207,155, +253, 47,148, 55, 37,226,224, 93, 0, 31,255, 29,101, 77, 78, 78, 62, 3,224,204,155,210,163,148,222, 33,132,120, 0, 16,188, 17, +115,245, 55,238,127, 30, 30, 30, 30, 30,222, 96,241,240,252,207, 64,139, 7,116,177,124, 77,240,240,240,240,240,252, 83, 32, 0, + 2, 43,105,180, 76,158, 29, 64, 8, 9,172, 69,163,120,142,215,228, 53,121, 77, 94,243, 45,209, 76,171, 66,243, 65, 53,154,149, + 69,182, 29,254,135,234,179,101, 37,154,203,171,209,156, 89,197,219,247,248,227,243,237,212,252, 55,221,253,255,109, 15, 0,129, +188, 38,175,201,107,242,154,255, 2,205,102,124,125,190, 81,205,153,124,125,254,251, 52,223,182, 7,195, 91, 76, 30, 30, 30, 30, +158,191,173,155,132, 16, 41, 33, 68, 90,219,247,121,120,254, 87,169,241, 24,172,214,173, 91,215, 7,128,219,183,111, 71,255,141, + 39,228, 68,103,103,231,209, 62, 62, 62, 77,196, 98, 49,147,159,159,191,224,194,133, 11,243, 95,254,220, 59, 77, 69,119, 5, 12, + 92,203,125, 19, 32, 2,128, 97, 96,164, 72,184,124,191,200,159,223,197,255, 93,156,157,157, 79,203,100,178,186, 28,199,129,229, + 40,140,172,177,248,175,145,131,193, 72,161,215,105, 98,181,133,185, 61,106,165,221,114, 64, 29,214, 72,151, 1,220, 6, 2,102, + 28, 5,183,145, 80,102, 28,101,176,129,112, 24, 11,161, 97, 37, 88,209,215, 66,177,240,219,164,224,125,241,111, 67,125,238,223, +191, 95,240, 58,223, 31, 56,112, 96,133,203, 68,249,250,250, 30,147,201,100,245, 42,251, 94, 81, 81, 81,242,253,251,247,187,188, +205,199,170,147,147,211, 59, 12,195,252, 4,160,233, 75,111, 61, 4, 48, 57, 41, 41,233,252,235,254, 70,107,185, 92,104, 39, 16, +140, 17, 17, 50, 3, 0, 12,148,174,200, 48, 26, 55,223, 46, 42,250,199,140, 33,116,112,112,184, 44, 16, 8, 27, 20, 22, 21, 22, +230,231,229,121,153,155, 91, 60, 53,147,203, 21, 70,214,248, 56, 35, 35,237,157, 26, 94,203,199, 3, 88, 89,242,255,116, 74,233, +134,154,188,207,195,243, 86, 27, 44, 63, 63,191,134, 0, 58, 19, 66, 58, 83, 74,223,105,220,184,177, 99, 81, 81, 17,252,252,252, + 82, 9, 33,151, 41,165,151, 0, 92, 10, 14, 14,142,122, 19, 5, 18, 8, 4, 63,172, 93,187,118,218,151, 95,126, 89,182, 72,115, +104,104,104,197,159,101,224,122,241,232, 57,135, 59, 97, 81,104, 21, 56,176,196, 96, 49, 64, 97, 50,186,116,107, 93,171,223,183, +177,177, 49,119,112,112, 88, 64, 8, 25,196, 48, 76,181,141, 25,199,113, 70, 74,233,190,180,180,180,121, 89, 89, 89,249, 53,249, +173, 86,254, 62,134, 98, 71, 88, 17,212,120,231,110,104,149,179, 43, 27, 55,110,124, 87, 32, 16,184,150, 92,156, 94,190,176, 85, +248,191,209,104, 76, 8, 15, 15,247, 55,181, 46,100,114,249,116,194, 8, 3, 65,185,226, 36,168,132,121, 72, 57,246,156,166,168, +104,165, 41,219, 43,149, 74,235, 6,135,220,107, 16, 17,245, 20, 94, 30,117,160,211,179,208,233, 89, 28, 57,119, 27, 45, 26,123, +160,111,239,110,181, 62, 86,140,148, 44,152, 59,121, 88,151,197,107,119,182,250,118,242, 80,197,226,181, 59, 91,125, 59,101,168, +114,241,186,157,254,223, 78, 25,166, 92,180,110,135,255,156, 41,195, 44, 22,175,219,169, 7,240, 89,109,126,227,179,230,117, 11, + 25, 35, 91,225,221, 53, 39, 16,106,127, 13,139, 85,252, 55, 78,220, 81,163, 70, 53, 44, 44, 44,140, 24,213,167,245,247, 77,220, + 29, 43, 28,255,147,147,153,234,240,248,193,237,185, 66,153,194,251,131,233,191, 85,121,126,138,197, 98,207,203,151, 47, 55,224, + 56, 14, 70,163, 17, 44,203,150,253,213,233,116,248,240,195, 15,223,200,132, 24,127,127,255, 81,148,210,197,197,135, 37, 89,116, +247,238,221,245,175,113, 35,166, 20, 10,133, 95, 73, 36,146,206, 44,203, 54, 1, 0,145, 72, 20,169,213,106, 47,177, 44,187,154, + 82, 90, 80, 19, 61,134, 97,214,220,185,115,199, 91,169, 84, 66,175,215,151, 45, 12, 47, 16, 8, 26,183,105,211,230,103, 0, 13, + 94,119,251,237, 4,130, 49,237, 59,118, 92, 59,106,202, 20, 65,246,157, 59,248,105,235,214, 53,200,206, 6,128,159,171,251,174, +171,171,235, 93, 66,136,107, 77,126,143, 82,154,144,144,144,224, 95,179,107,176,176, 65,108,124,146, 67, 93, 55, 21, 0, 64, 46, +151, 43,238, 60,120,238,224,215,212,163,198,145, 43, 0, 43, 41,165,102, 37,245,187,182,125,251,246,237, 8, 33, 44, 0,202,113, + 28, 67, 8, 25,194,113,156,176,228,243, 43, 9, 33,191, 81, 74,181,124,211,204,243, 86, 27, 44, 63, 63,191, 19, 0, 58, 55,110, +220,216,172, 91,183,110,240,245,245, 69,221,186,117, 33,147,201, 0, 0, 89, 89, 89,142, 17, 17, 17, 31,221,187,119,239,163, 27, + 55,110,192,207,207, 79, 13,224,106,112,112,112,133,209,136,192,190,157,190,148, 41,165,235, 0, 32, 61, 33, 51, 57,225, 89,218, +186,228,228,228,149,148, 82,174,220, 9,233, 53,124,248,240,169,147, 38, 77,194,177, 99,199,176,107,215, 46,104,181, 90,228,231, +231,227,194,133, 11,149,220, 90,167, 33,251,194, 50, 64,241, 28,136,187, 4,200, 29, 0,133,227,235,220,189, 45, 24, 60,120,240, + 20,111,111,239,178,172,227, 6,131, 1, 44,203,194, 96, 48, 32, 59, 59, 27, 83,167, 78, 45,189,120,129,227, 56, 92,184,112,225, +203, 25, 51,102, 0,192, 87, 21,105,118,235, 92,239,174,144, 16, 87,238, 63,166, 44,225,236,229,167,254, 0, 17,220,185,123,159, + 84,108,190, 90, 8,170,191, 16, 10, 92, 67, 66, 66, 28,196, 98,177, 73,219,198,113, 28,124,125,125, 77,250,172,139,139, 75, 23, +133,210, 98,215,128, 33,159, 91,183,244,109, 41,114,113,118,134,129,101,241,236,121, 92,235,251,247,130, 91,158, 57,186,231, 11, + 23, 23,151, 33,137,137,137, 85, 46, 72,109, 52,114,184, 31,241, 24,231,174,222, 67, 95,145, 12,133, 26, 29, 10,213, 58,108,255, +235, 58, 18,210,114,107,189,159,218,180,105,227, 34, 23,216,183,254,114,212, 7,138, 21, 63,109, 83,124, 57,234, 3,172, 92,191, +189,228,239, 54,197,151,163,250, 97,229,250, 63,148, 95,142,234,135,181, 27,126,107,219,166, 77, 27,151, 91,183,110, 37, 86,166, + 87,217, 62, 98,140,172,116,107, 68,162, 0, 0,210, 55,109,130, 33, 45, 13,170,121,243, 0, 0, 95,120,187,152,220,173,209,172, + 89,179,187, 66,161,176,218,198,145,101,217,132, 7, 15, 30,248,155, 98,174, 88,150,165, 66,161,112,238,213, 29,223,239,239,208, +178,225, 11,149, 25, 21, 21,101,249,221,119,115, 7,238, 13,206,167, 31,249,153, 71, 28, 94, 57,170, 74,147,197,113, 28,163,213, +106,241,248,241,227, 10,179,236, 51, 12, 99,172,205,126, 10, 8, 8,144, 22, 22, 22,238, 84, 42,149, 62,133,133,133,163, 40,165, +223, 5, 5, 5, 57, 50, 12,131,192,192,192,239,252,253,253,159,203,100,178, 13,106,181,250,158, 82,169, 28, 18, 20, 20,100, 82, +227, 74, 8,121,199,194,194, 98,251,161, 67,135,172,125,125,125,153,140,140, 12,120,120,120, 32, 43, 43,171,245,229,203,151,253, + 62,251,236,179,207, 8, 33,159, 82, 74, 47,215,160,184,141,228,114, 57, 29, 62,124, 56, 49, 26,255,179,185,191,254,250, 43,252, +156, 83,235,141,237,169, 40,210,232,104,238,249,199,150, 99,197, 98,241,213,152,152,152, 26, 31,192, 34, 66,102,140,154, 50, 69, + 32, 78, 78,134, 34, 42, 10,125, 8, 17,110, 41,142,102,253,108,194, 54,187,174, 90,183,210, 65, 34,145,128,101,217, 50, 19, 88, +122,141, 50, 24, 12,208,235,245, 48, 24, 12, 48, 26,141, 48,232, 13,216,186,233,183, 90,159, 99,114,133, 92,238,228,236,156,106, + 38, 87,200,223, 68, 99, 35,149, 74,133,219,182,109, 27, 34,145, 72, 0, 0, 58,157, 14,205,154, 53, 35,124, 51,204,243,111,140, + 96,245, 10, 10, 10, 2,203,178, 48, 55, 55,135, 64, 32,120, 57,186,129,119,222,121, 7,109,218,180, 65, 96, 96, 32, 30, 61,122, +100,182,124,249,242, 74,195, 17, 67,167,245,129, 91,131, 98,227, 99, 48,112,206,215,142,223, 91,246,235,247,251,237, 1, 76, 43, + 31, 48, 24, 51,102, 12,201,204,204,196,160, 65,131, 46,107,181,218,247, 41,165,149, 46,151, 99,228,144,208,229,227, 97,224, 40, + 49, 91,125,107, 43,209,105,212,148, 97, 24,117,105, 23, 97, 45,239,138, 7,169, 84, 42,236,222,189, 27, 58,157,238,149,247, 45, + 44, 44, 16, 30, 30, 94,222,228,160,101,203,150, 2, 66,200,160,202, 12, 22, 67,136,235,201,160,232,178, 25, 65,131,223,111, 41, +238,222,185, 94,170,144,145, 80, 0,228,219,111,191, 45, 51,108, 0,176, 96,193, 2,147,203, 43, 22,139,241,232,209, 35, 8, 4, + 2, 60,233, 80,124,131,221, 44, 36, 30, 2,129, 0,247,125,138,239, 64,219, 71,231, 64, 32, 16, 64,169, 84,154,106,174, 2, 28, +157, 93, 15,127, 51,111,169,185,198, 64,113,252,194,109,196, 37,157, 5,165, 20,206, 14, 54,104,239,231, 43,106,218,188,133,195, +175, 63,175, 56,236,226,226,210, 47, 49, 49, 49,168, 50, 45, 3,107, 68,147, 6,158,216,118,232, 50, 22,109, 56,128,204, 60, 53, +242,139,138,235,181,107, 91,111,252, 82,251, 72,231,202, 70,238,238,110,191,239, 61,133,118,109, 91,225,143,189,167,209,174, 77, + 43, 20, 63,111,131, 63,246,158, 66,251,118,197,127,155, 54,169, 87, 39, 43, 38,119, 37,170,200,237,245,202, 62,234, 87,188,143, + 60, 4,226,178, 6, 32,102,220, 56, 0, 40, 51, 88, 53, 58,209,132, 66,215,123,247,238, 57, 84,247,185,150, 45, 91,154, 20,185, + 98, 89, 22,105,105,105, 36, 39, 39,135, 90, 89, 89, 13, 44,111,178, 74,205,213,158,187,121, 80,223, 92, 79,118,252,117,137, 27, +246,126,231,136,195, 43, 71,121, 15, 28, 56, 48,178, 34, 93,189, 94,255,188,123,247,238,180,164,225,115,145, 72, 36,226,151, 12, +152,170, 67,135, 14,175, 24,180,234,186, 14, 11, 11, 11,119,110,217,178,165,127,189,122,245, 48, 96,192,128, 51,222,222,222, 18, +185, 92,142, 83,167, 78,193,205,205,205,206,220,220,252,196,210,165, 75,177,106,213,170, 58,103,206,156,217, 5,160,191, 9,231, +104, 96,151, 46, 93,118, 31, 59,118, 76, 38, 22,139,161, 86,171, 17, 30, 30, 14, 75, 75, 75, 72, 36, 18,244,235,215, 79,208,161, + 67, 7,219,128,128,128, 3,132,144, 33, 53,153,209,164,209,104,232,236,217,179, 33,151,203, 33,151,203,161, 80, 40,160, 80, 40, + 96, 38,230,200,166,201, 30,102,147,182,228,152,125, 53,111,211,178,237, 27,230, 95,172, 83,167,206,119,113,113,113, 57, 53, 61, + 22,178,239,220,129, 34, 42, 10,154,187,119,107,124, 28, 89, 42,108, 48,107,214,172,234,142, 53,136,197, 98,180,111,223,190, 90, +189, 38, 77,154,108, 18, 8, 4,246, 47,154,105, 34,152,251,237, 55,236,131,240, 40,133,222, 72, 21, 26, 45,139, 69, 11,231,178, + 2,134, 17, 52,107,214,236, 16,165, 52, 61, 60, 60,124,172, 9,209, 51, 45, 33,100, 58,195, 48,107,165, 82,169,208,221,221, 61, +118,238,220,185, 55,138,187, 26, 0, 74, 41,227,238,238,222,218,204,204,172,174, 86,171,101, 1, 76,231,163, 87, 60,255, 22,131, + 5,165, 82,137, 59,119,238,128, 16, 2,115,115,115, 88, 88, 88,192,210,210, 18,121,121,121,136,136,136,192,195,135, 15, 17, 19, + 19, 3, 66, 8,188,188,188, 80,122,226,148, 59,193,202, 46,108, 59,127, 60, 6,153, 82, 10, 66, 0,223,119,125,224,243, 78, 51, +180,186,253,116,178, 74,165,218,146,148,148,244,152, 16, 34,108,214,172,217,103,109,219,182,197,170, 85,171,160,213,106, 87, 85, +100,174,202,107, 94, 14, 55,248, 3,128, 74,165,250,250,207, 83, 79,228,159,244,172, 87,148,148,148,244, 67, 77, 43,225,229, 11, +112, 70, 70, 6, 56,142, 51, 57, 42,148,147,147, 83,165,230,203, 17,129, 69,203, 86, 91,229,231,166,226,251,229,127,194, 96, 48, + 96,218,180,105,224, 56,174,236, 81,145, 94, 69,229, 44,237,250, 19, 8, 4, 47, 24,224,234,158, 87,165,105,111,111,175,144,202, +228,187,190,254,246,123,243,208,168, 4, 28,187,112, 27,148, 82, 28,217,242, 29, 0,160,223,232,133, 72, 76,201, 64, 7,191,198, + 24, 49,118,170,249,234, 37,179,119,217,219,219,215, 75, 79,255, 79,242,217,242,154, 6,150,195,129, 83, 55,144,148, 89,128,225, + 3,186, 66,163,213, 35, 61, 45, 5,191,253,188, 2,227, 71, 28,128,181,210,204,201,203,203, 43,170,124, 29, 81, 74,137, 88, 44, +190, 26, 21, 21,245,121,101,229, 52, 24, 12,189,190,153,250, 5,214,110, 61,128,102,245,157,112,244,236,117,248, 55,173,139,147, + 23,110,163,109,115, 15,156,190, 20,140,182, 62,158,184,116, 51, 28, 83,198,126,138,233,147,175,246,170,201, 62, 90,188,116,181, + 85,126, 94, 42,142, 45,222,134,180,159,127, 70,236,196,137,104, 93,242,153,219,132, 64,236,234, 10,152, 87, 95,159, 47, 19, 25, + 25, 9,173, 86, 91,209,221, 61,154, 52,105, 82,237, 62, 42,141, 92,165,166,166,146,212,212, 84, 40, 20, 10, 18, 25,254,192,216, +164,105,179,129,244,225,254,173, 0, 80, 28,185,202, 67,209,245,117, 80,223,248, 9, 98,143, 80,102,235,194,177,186, 47,190,219, + 20, 81,174,113,123,161,156,247,239,223, 47,171,159,182,109,219, 62,188,122,245,106,163,210,227,171,164,171, 80,204,178,108,131, +210,110, 67,150,101,161,213,106, 49,100,200, 16, 65, 85,219,110,102,102,230,227,229,229,133,224,224, 96,140, 29, 59, 86,210,165, + 75, 23, 68, 71, 71,131, 16,130,145, 35, 71,194,219,219, 27,233,233,233,104,213,170, 21,174, 92,185,210,210,132, 99,222, 92,161, + 80,252,118,244,232, 81, 25,195, 48,200,207,207, 7,199,113,232,208,161, 3, 24,134,193,131, 7, 15,240,237,183,223,226,224,193, +131, 56,124,248,176,153,159,159,223,111,132,144, 38,148,210,124, 19,246, 17,213,104, 52, 84, 42,149, 66, 42,149, 66, 38,147, 65, + 38,147, 65, 34,145, 64,173,103, 48,122,117,172, 86, 32,179,227,154,182,236, 88,111,228,164, 37,204, 15,115, 71, 93, 0,112,164, + 68,243,129, 41,215, 11, 3,165, 43,214,255,242,203,186,247, 80, 60,193,104, 95,126, 62,103,160,116,133, 41,231, 38, 0, 20,104, +114, 81,215,203, 21, 7,246, 28,198,135,131, 63,168,208, 92,137, 68, 98,136, 69, 34, 88,216, 40,170,213, 20,137, 68,118, 33, 33, + 33, 86,229,175, 15, 44,203, 70,126,249,229,151, 94, 31,244,123,207,113,239,193, 99,130, 79, 6,247, 51, 58, 57,218,103,196,199, +199, 70, 3,176,242,243,243,163,166, 30,243,148,210, 13, 45, 91,182,244, 61,116,232,208,168, 89,179,102,221,253,250,235,175,191, + 47,255,254,202,149, 43, 23,158, 56,113,162,110,255,254,253,183,223,187,119,111, 67,185,239, 45,127,211,141,221,223,145, 58,128, +215,228,169,181,193, 42,223,248,228,229,229, 33, 47, 47, 15,241,241,241,216,180,105, 83,201,137, 44,130, 80, 40,132, 80, 40, 44, + 27,175, 80, 25,231,142, 94,249, 9,192, 79,126,126,126,162,176, 27,251, 78,206,216, 50,169,171,127,160,175, 32,248,124,216, 64, + 0,139, 0,244, 26, 62,124,184, 29, 0,108,219,182, 45, 3,192,201,255, 70,133, 80, 74,247, 61,126,252,120,138,179,179,115,217, + 24,148,242,221,132, 44,203, 66, 38,147,161,116,172,138, 86,171,197,206,157, 59, 89, 74,233,190,170,234, 47, 42,252, 2, 30,135, + 95, 44,254, 30,199,129, 51, 22,127, 95,163,209, 96,254,252,249,229,167,190, 98,220,184,113, 64, 13,214, 66,174, 44,114,213,238, +113, 54,132, 66, 33,174,120, 22, 59,129,222,233,244,149,177, 90,175,116, 97, 72,100,211,122, 15, 24,102,195, 82, 65,153,185, 42, +222,134, 98,195, 41, 17, 11, 97, 38, 21, 35,234,105, 28,220, 93,252,208,181,247, 7,214,231,142, 29,152, 6,160,194,176,155,222, +200,161, 87,128, 31,126,222, 19,132,188, 2, 53,114,179,179,144, 30, 23,137,200,208, 59, 16, 10,133,184,123,247,174,185,133,133, +165,185,167,167, 7,140, 28,135,107, 55,238,130,130,224,232, 95,135,188,234,122,120,226,255,216,187,234,240, 40,174,246,123,238, +204,250,110,220,179, 9, 16, 72,136, 2, 81, 8,238,197, 41,238, 20,183,162,133, 34, 69,138,182,184,148,226, 80,164,180,184,187, + 20,119,146,160, 33, 36, 36, 1, 34, 27,247,108,214,119,230,247, 71,164,129, 70, 54, 41,223, 87,190, 95,247, 60,207, 60,187, 59, + 51,123,230,206,189,119,238,156,251,222,247,190,247,253,219,216,209,229, 8, 91, 78,179, 32, 31,228,103, 36,128,166,105, 52,245, +119, 3, 77,211,104, 17,228, 1,154,166,209,188,161, 39, 56, 28, 14, 90, 55,246, 65,221,186,117, 81,236,231, 81,113, 25,253,129, +168,151, 55, 74,137, 93, 22, 44, 0, 77, 82,210, 95, 95,148, 73, 73, 96, 77,237,170, 90,183, 48,123,246,236,236,164,164, 36,205, +199,130, 78, 42,149,242,142, 31, 63,110, 81,217, 34,216, 18,137,196,135,195,225,132,103,102,102, 50, 98,177,152, 98, 24, 61,227, + 93,175, 62,125,231,183,165, 71,139,207, 89,178,100,233,209,254,129,102,125,247, 31, 57,203,242, 92,154, 19,194, 21,232,198,124, +191,141,207, 17, 74,124, 12,236, 52, 80, 42,149, 10,175, 95,191,174,116, 81,110,150,101, 43,172, 80,114,185,124,120,159, 62,125, + 46, 79,152, 48, 65, 72, 8,193,237,219,183, 75, 4, 63, 77,211,136,137,137, 1, 69, 81,216,177, 99, 7, 84, 42,213, 4, 3, 44, +129,211,142, 29, 59,102,206,231,243,145,151,151, 87,242,220,208, 52,141,136,136, 8,172, 89,179, 6,195,134, 13, 67, 92, 92, 28, +164, 82, 41,102,204,152, 97,178, 98,197,138,105, 0,150, 24,112,235,207,212,106,117,144, 88, 44,134, 80, 40, 68,177,208, 2,128, +208, 36,251, 23,177,177,177, 13,108,108,108, 28,108,111,158, 61,221,180,205,151,126,214,182,142, 77,138, 5,150,161,136,211,106, +119,200,228,242,249,253,118,239,182,187,117,250, 52,243,226,244,233, 4,142, 94,191,221,224, 58,164,165,240, 62, 38, 1,129,129, +129, 8, 13, 13, 69, 96, 96,224, 7,214,108, 62,159, 15, 30,143, 7, 30,143, 7, 27, 75,131, 92, 37, 88,154,166,145,156,156,252, +193,190,177, 99,199,190, 31, 50,100,136, 29, 0, 36,201, 18,216,111,166, 77, 78, 76, 79, 79,103,237,237, 43,230,244,243,243,187, + 69, 81,148,203, 71,162,216,114,220,184,113,200,206,206,238, 50, 97,194,132,230,133, 86, 50, 42,113,243,230,205, 67, 1,128,207, +231, 87,123, 8,218, 8, 35,254,231, 5,150, 33,168, 76, 96, 21, 35, 52, 52, 84,235,228,228,180, 51,234,201,187,118,110,190,174, + 16, 73, 4, 29, 8, 33, 63, 11, 4,130,233, 95,125,245, 21, 30, 60,120,128, 23, 47, 94,252,242,119,151, 61,105,208,160,193, 37, +129, 64, 80,171,172, 99, 42,149,234,253,243,231,207,203,244, 21, 75, 77, 77, 93,248,232,209, 35, 84,228,228,222,191,127,255,210, + 47,163, 18, 39,247,114, 91, 48,134,133, 86,163,133,188, 64,241,231,203,187, 72, 96,201,229,114, 12, 24, 48,224, 3, 11, 86,106, +106,106,181,238,185, 42,150,171,242, 64,209,116, 71, 95,191, 0,238,181,123,207, 62,120,185,246, 28,183, 12, 2, 30, 7, 98, 1, + 15, 66, 1, 23, 34, 1, 15,241,137, 41,240,242,170,207,187,121,233,108,199,242, 4,150, 86,199, 96,213, 47,231, 0, 0, 71,206, + 92, 67, 80,109, 49, 22,207,159,141,126,253,250,129,207, 23,226,216,177, 35, 88,179,121, 31,198,215, 42, 44,170, 70, 13,253,177, +122,235, 65, 44, 93,178,152, 58,114,248, 72,115, 3, 94,184,224,112, 56,160,105,250, 47,159,197,223, 13,177, 70,178, 12, 11,205, +199,101,196,176, 0,203,194,249,135, 31,224,252,195, 15,120, 84, 36, 78,125,228,114, 40, 20, 10,160,181,111,149,196,149, 90,173, +134, 76, 38,211, 60,125,250,212,190,140, 23, 83,138, 90,173,174, 84,208,236,222,189, 59,114,228,200,145, 62, 86, 86, 86,225,207, +158, 62,213,250,250,249,113, 63,246,193,242,240,240,200, 89,178,100,233,209,161,253,186,245,221,246,221, 64,221,248, 37,191,114, + 12,113,116, 47, 17,197, 26,205,219,246,237,219, 27, 36,241, 21, 10, 69,114,121,199,130,130,130, 70, 18, 66,126,240,240,240, 16, +180,105,211, 6,183,110,221,194, 15, 63,252,192,232,116,186,116, 0,104,218,180,169,237,210,165, 75, 73,120,120, 56, 44, 44, 44, +144,154,154,186, 55, 40, 40,104,105, 69,142,239,124, 62,191,117,195,134, 13, 41,149, 74,245, 23,113,181, 98,197, 10, 12, 26, 52, + 8, 30, 30, 30, 96, 24, 6,249,249,249,104,211,166, 13,119,227,198,141,173, 13, 17, 88, 20, 69, 77,109,215,174,221, 26, 20,206, + 34, 44, 45, 28, 95, 1,152, 89,100,221, 78,238,214,103,216,203, 22,237,123, 7,185,212,173,239, 88, 25,167,189,189,253,119, 20, + 69,245, 7, 64, 3,136,167,172,172,234,218,218,218,218,183,236,214, 13,249,132,208,219, 47, 94, 36, 28,145,200, 4,128, 65, 67, +141, 74,173, 28,181, 92, 11, 93,249,250, 12,232,137,208,208, 80,244, 29,216, 11, 60, 30, 15, 28, 14, 23, 60, 46, 23, 92, 94,161, + 5,203,194,198,172, 90,237, 72, 81,231,145,152,155,155, 3, 44, 96,102,110, 94,108,201, 36, 0, 88,138,162,216, 10,234,185,251, +254, 73, 99,237,120,102,230, 96,116, 90,212,252,178,111, 73,157,142,218,189, 69, 4,134, 17,229,199,189,197,212,235,143,184, 48, +194, 8,163,192, 50, 12,165,157, 66,203, 66,219,182,109, 39,155,154,154,110, 44,106,120, 17,255, 32, 17,241, 15, 18,225,237, 89, +175, 89,128, 95, 80,206,160, 65,131, 96,109,109,141,111,191,253,150, 5,240, 75, 85,175, 31, 19,249,210, 4, 0, 43,149, 74,191, + 45,178, 8,248, 61,122,244,200,246,241,227,199,104,216,176, 97,233,151, 7,154, 55, 47,255,189, 93, 52, 51,238, 27,148,227, 79, + 85, 77,171, 24, 52, 26, 13, 10, 10, 20, 80,171, 53,208,105, 25,232,116, 58, 4,214, 51,197,175, 59,230, 20,238,211, 21, 91,203, + 10,173,100, 2,158, 10,173, 26,215,208,130, 80,138,155,247,223, 87,216, 82,150,101,185,162,105, 26,119, 92, 11,255,214, 33, 73, +107,176,208, 98, 25,189,167,131,189, 61,226, 46, 62, 4, 0,152,136,133,184,180,111, 41, 36,226,194,201, 13, 93,134,205,133, 72, +192,131, 72,192,133, 70,163,129,189, 93,109,232,244, 90,207,114,133,183, 86,173,174,101,111, 14,199, 46,141,241,244,241,125,124, + 51,121, 12, 70,142, 28, 5,158,208, 20, 55,111, 94, 71,156, 44, 21,111, 18,178, 48,121,225, 22,104,117, 12, 52, 58, 61, 52, 90, + 61, 54,236, 61, 7,141,158,173,244, 37,207,227,241, 48, 99,198, 12, 81,121,199, 15, 30, 60,168, 48,188,140,180,144,203, 21, 80, +169, 84,208,168,117,208,104,117,208,215,225, 97,233,252,193,208,105,116, 40, 24,216, 4, 26,173, 14,204,180, 94,208,168,181,136, + 23,115,168,230, 13,165, 90,128, 82,220,121,156, 96, 86, 25,127,177, 40,168, 72,128, 25,130, 98,145,229,235,231, 23, 62,188,107, +163, 21,119,239, 63, 78,187,123,255,241, 95,206,115,173,215, 40,118,252,242,131,115,170, 34,174,128, 15,135, 11,255,102,189,255, +254,198,141, 27,246, 38, 38, 38,136,140,140, 4, 77,211, 32,132,100,132,134,134,218, 3,192,162, 69,139,210,185, 92,174, 53, 77, +211,152, 54,109, 26, 56, 28,142,237,215, 95,127,189, 0,192,166, 10, 58,114,222,166,166,166, 31, 88,175,120, 60, 30,230,204,153, +131,161, 67,135,150,136, 43, 30,143,135,189,123,247, 34, 40, 40, 8,106,181,218,219,144,244, 38, 36, 36, 60, 6,208,194, 0, 1, + 66,138, 68,121,165,245,147,162,168,225, 79, 39, 76,168,171,124,244, 8, 95, 51,140,143,167,167, 39,148, 74,101,201,113, 55, 55, +183,154, 9, 9, 9,201, 82,169,244, 55, 0, 91,100, 50,217,147,138,248,180, 74, 6,239, 99, 18,138, 59,171,104,212,168, 81,137, +197,170,180,245,138,199,227, 65,196, 55,169,114,153, 49, 12,131,220,220, 92,122,239,222,189,117,124,124,234, 17, 0,240,246,174, + 71,206,157, 59, 95,211,196,196, 36,214,202,202, 74, 83,233, 51,105,102,142,171,163, 6, 0, 0,250,181,237, 84,108,197, 66,200, +210,185,224,112,185,240,155, 62, 23,192,163,146,243,213,106, 53, 24,134,161, 97,132, 17, 70,129, 85,206,131,175,213, 86,120,124, +221,186,117,104,208,160, 65,133, 47,160,141, 27, 55, 98,255,254,253,235, 88,150,141,169,234,245,187,181, 11,168,135,245, 39, 94, +186,122, 20, 54, 10, 75,166,117,167,228,114, 57,238,222,189, 11,115,115,115,188,121, 99, 88,216,174,255, 68,152, 6,150, 5, 52, + 90, 29,228, 5, 74,168,213,106, 76,155,101,208,204,116,162, 81,231,113,186,118,106, 89,174,120, 40, 30,238,163, 40,170, 82, 31, +172,202,134, 6, 63,176, 96,104,181, 40,126,117,228, 23, 40,209,118,240,119,120,116,106, 3, 0, 20,138, 43, 33, 23, 34, 62, 15, + 34, 62, 7, 20, 1, 8,202,231,214, 42,114,191, 92,191,116,214,237,173,191,252,234,220,179,229, 24, 76,158, 52, 25, 28,190, 24, +150,214,182,208, 49, 44,106, 74,237, 16,157,152,133, 99, 63,207, 42, 26, 21,101,209,114,200, 34,172,155, 63, 6,171, 23, 86,110, +196,228,112, 56,216,180,105,147,226, 99,171, 85,233, 79,182,242,247,224,159, 2,171, 64, 1,133, 82,133,111,191,219, 98,120, 25, +117,108, 33, 50,228,228,138, 4, 84,101, 2,172, 44,145,101,200,243,235,215, 19,243,255,201, 6,134, 97, 24,156, 59,119,174,164, + 60,202, 43, 67, 67,173,173, 12,195,224,253,251,247,120,249,242, 37, 26, 55,110,140,156,156, 28,112, 41, 10, 51,158, 63,135,207, + 87, 95, 65,205,227,129, 97, 24,240,249,124,140, 27, 55,206,224,252,172,162,114, 44,242, 99,211, 87, 72,238,232,232,184,214,203, +203,171,110, 76, 86, 22, 66,159, 62, 69,163,177, 99, 1, 0,119,238,220, 41,109, 1,196,224,193,131,249,177,177,177,163, 34, 34, + 34, 70, 57, 58, 58,174, 75, 74, 74,154, 81,238,243,196,170, 74,124,176,250, 15,238,131,186, 94,117,176,127,207,129,146,227,211, +103, 78, 5,151,203, 3,151,199,133,133,185, 69,149,111, 45, 55, 55,151,179,118,237, 58,223,224,224,198,162, 33, 95,141,160, 52, + 58, 22, 75, 87,110,160, 15, 31,248,213,122,223,175,251, 69, 66,161,240, 85,165,101,164,213,252,165,157, 34,132,128,195,229,130, +195,231, 1, 12, 3,150,101, 37,171, 87,175, 94,242,242,229,203,134, 94, 94, 94, 80,169, 84, 95, 17, 66,194,140,113,176,140,248, + 87, 9, 44,154,166, 43,181, 78, 81, 20, 85,233, 16,225,244,233,211, 97,106,106, 90,222,139,135,125,254,252,121,120, 82, 82,210, + 14,150,101,171, 21, 23,231,236, 31, 97, 47, 23,127,211, 43, 15,128, 2, 0, 44, 44, 44,210,219,182,109,155, 15, 64,115,248,240, +225, 15,206, 85,169, 84,239,203,227,177,179,179, 91,188,106,213,170, 41,157, 59,119,166, 40,138,250, 75,227,254,241,166,213,106, +113,230,204,153, 41,203,151, 47, 71,121, 86,175,226,151,119,129, 92, 1, 69,145,131,115,244,139,163,134, 54,230,149,158,242,204, +207,169, 76,203,213, 23, 50, 13,104,154,198, 5,187,194,251,232,146, 86, 57, 23,161,232,200,183,239,227, 27, 57,216, 88, 32, 43, + 39, 31, 2, 62, 23, 34,193,159,214,124,145,176,208,122, 37, 18,112, 97,105, 97,138,140,140, 20,112,185,220,200, 10,132,195,123, + 66, 72,139, 1,189,186, 92,166,104,142,176,244, 49,174,200, 76,124,229,238,115,203,148, 76, 57, 74, 27, 3, 24,134,197,148,165, +123, 12,171,192, 28, 14, 38, 78,156, 88,174,192, 57,125,250,116,149, 45, 88, 10,101, 21,203,200, 64,254,138,134, 0, 43, 59, 94, + 25,138,103, 23, 74, 36, 18,159, 34,241,101, 48,252,252,252, 46,136,197, 98,131,131, 28, 25, 26,116,148, 16,178,164,109,219,182, + 63, 56, 59, 59,219, 77,152, 48,129,208, 52,141,160,160, 32,155,239,191,255, 62,167,208, 50,226,109, 90,220,198,172, 95,191, 30, +175, 94,189, 74, 35,132, 44,173,136,147,207,231, 71,152,155,155, 7,181,105,211, 6, 57, 57, 57,136,143,143,135, 68, 34,129,207, +218,181,120,254,245,215,240,219,182, 13, 84,219,182, 32,132,128,207,231,227,249,243,231, 16,137, 68, 17,229,241, 57, 57, 57, 5, +179,133, 78,230,205,240,231,176, 32, 11,224, 46, 33,100, 86, 98, 98,226,195, 50,218, 59, 10, 0,244, 12,195, 86,114,255,131,191, +251,238, 59, 80, 34, 17, 28,155, 52,129, 34, 38, 6, 26,141, 6,141, 27, 55, 46,177,170, 55,110,220, 24, 52, 77,163,110,221,186, +176,178,178,194,241,227,199, 7,227,195,153,213, 31, 64,153,175,193,251,152, 4, 52,105,210,164,196, 82,213,181,107,215, 18, 11, + 22,151,203, 45,177,100, 17,125,229,130,149, 16,194,126,212, 22, 19, 62,159, 39, 24, 54, 98, 20, 53,235,219,111, 24,173, 78,203, +208, 52,151,250,118,254,114,234,205,235, 23, 2,185, 92, 78,145, 74,122,107, 53,123,244, 67,191,118,133, 70,208, 99,117,109, 65, + 23, 9,171, 30, 47, 18, 74,202,197,236,236, 31,252, 21, 43, 86,244,245,242,242, 42, 28,110, 7, 56,198, 56, 88, 70,252,155, 4, + 86,212,211,167, 79,221,235,213,171,135,184,184,184,191,204,108, 43,126,198, 36, 18, 9, 68, 34, 81,177,133, 40,170, 60,178,107, +215,174,253, 12,224,231,226,223, 82,169,180, 73,155,254,173,239, 53,234,212, 16,191, 47, 63,144,147,148,148,228, 91, 28, 19,139, + 16, 66,164, 82,233, 80, 46,159, 51,192,181,126,205, 86, 96,152, 85, 87, 79,223, 89, 84,209,141,184,122,212,203, 7,160, 40, 53, +139,112, 77,117, 50,132, 16,210,175,115,231,206, 84,120,120, 56, 6, 12, 24,128,253,251,247,151,123,238,208,161, 67,113,240,224, + 65,116,236,216,145, 90,177, 98, 69,191,202, 4, 86,161,117, 68,253, 31, 43,204,178, 44, 87, 31,139,196, 74,133, 0,163,187,250, +252, 73,168,191,111, 80, 83,238,187,132, 20, 8,249, 28, 8, 5,127,206,216, 23, 21,249, 95,137, 4, 92, 56,216, 90,226,209,189, + 27, 26,157, 78,123,181, 18,113,241, 30,101, 4,105, 20,152,218, 68,126,209,172,129,101, 89,255, 89,251,221, 87,104,112,104,109, +165,233,229,114,185,216,189,123,183,162, 60,235,149,161,121, 80,104,101,212,162,160, 64,129, 2,133,242,147,149,137,189,189,189, +173,157,157,221, 86, 11, 11, 11, 97, 89, 2,234,227,227,127, 71, 92, 21,197,197, 10, 31, 57,114,100,149, 68, 22,159,207,175,125, +247,238,221,146, 32,163, 21,125,170,213,106,244,239,223,223, 32,203,119, 72, 72,200,238,128,128,128,104, 91, 91,219, 43, 62, 62, + 62,130,232,232,104, 44, 91,182,140,112,185, 92,179,226,246, 35, 47, 47, 15, 52, 77, 35, 43, 43, 11,132,144,225, 33, 33, 33, 23, + 43,226, 84,169, 84, 55,111,222,188,233,223,189,123,119, 58, 34, 34, 2, 52, 77, 23,166,171, 73, 19,248,109,219,134, 23,223,124, +131, 86,239,222, 65,169,209, 64, 40, 20,226,210,165, 75,154,130,130,130,155, 21,220,251,142,251,247,239,215, 19, 10,133,208,104, + 52, 96, 24, 6, 20, 69, 17, 14,135,211,220,199,199,103, 35,128,134, 31,117,192,236,198, 77, 95,233,169,215,233,244, 73,113,209, +105, 6, 88,132,176,127,255,126, 52,110,220, 24,173, 90,181, 66, 98, 98, 34, 98, 98, 98,208,165, 75,151,146,115,158, 62,125,138, +176,176, 48,184,185,185, 85,110,193,163,180,112,243,172, 13, 30,143, 7, 46,151, 11, 30,183,240,179,112, 43,180, 92,241,184, 60, +112, 57, 92, 8, 69, 66, 3,181,255,135,117,210,188,200,242, 37, 22,139,152,186,117,235,134,191,137,142,241, 1, 11,202,204,204, +220, 32, 95,219, 98, 62, 66, 72,137,184,226,242,121, 37,150, 44, 0,200,201,201, 81,246,236,217,243, 55,149, 74, 53, 2,159,112, + 36,197, 8, 35,254, 87, 4, 86,151,209,163, 71,111,235,208,161, 67,187, 25, 51,102,192,196,196, 4, 73, 73, 73, 37, 15, 24,159, +207, 71,141, 26, 53, 80, 80, 80,128, 91,183,110, 33, 59, 59,251, 26,128,113,134, 94, 56, 41, 41,233,193,155, 39, 81, 25,109,250, + 54,181,174,215,212,211, 34, 62, 42,161, 49,128,123, 69,226,234,151, 65,211,187,140,104,211,187, 17,120,124, 46,226,223, 36,255, +215, 50,132,162, 40,154, 16,130, 1, 3, 6, 24,116,254,192,129, 3,113,243,230, 77, 84, 52,156, 88, 98,193, 42, 80, 66,174,248, +116,157, 51, 66, 8,244,122, 61, 26, 71,102,126, 48, 51,171,216,114, 85, 44, 44, 12,177, 92,149,244,144, 11, 10, 86,223,190,122, +106,172, 87,125, 63,219,198,254,238,120, 19,155,128, 85,115,199,148, 28,255,118,252, 32,236, 61,116, 26, 78, 14, 54, 80, 22,228, +225,226,249, 51, 57,185,185,185,171,171,123, 15,251, 78, 22,198,129,108, 49,248,195, 57, 2, 3,190,249,201,160,255,115,185, 92, +140, 24, 49,162, 92, 11,214,149, 43, 87, 20,134, 12,143,178, 44, 11,141, 90,139,124,185, 2,138,130, 79, 35,176,164, 82,169, 95, +227,198,141,175,108,223,190,221,218,198,198, 6, 50,153,236, 3,129, 37,149, 74,253,130,131,131,175,108,223,190,221,218,214,214, + 22,241,241,241, 6,135, 7, 41, 67, 92, 33, 45, 45,141,100,101,101, 49,150,150,150, 85, 18, 89, 20, 69, 65,165, 82,225,213,171, + 87,134, 62, 35, 6,207,248, 50, 49, 49,217,179,124,249,114, 65,106,106, 42,104,154,198,171, 87,175, 62,168,171,197,219,119,223, +125,135,185,115,231,110, 5, 80,171, 34, 62,157, 78,183,110,232,208,161,163, 18, 19, 19, 45,237,236,236,144,148,148, 4, 62,159, + 15,150,101, 65,218,180, 65,139,216, 88,104,244,122,136, 68, 34, 68, 70, 70, 98,199,142, 29,114,149, 74,181,174, 44, 46, 55, 55, + 55, 62, 69, 81,238, 60, 30, 15, 67,134, 12,249,176, 94,238,219,135, 38,181,178,130,198,126, 33,200,215, 65,168, 74, 17,117,190, + 64,211, 52, 25,247,237, 42,143,224,150, 93,235,191,126,241, 48, 58, 45, 37,225,110, 37,183,175, 85,171,213,240,242,242,194,227, +199,143,113,245,234, 85,180,109,219, 22, 45, 91,182,196,141, 27, 55, 16, 18, 18,130,176,176, 48, 16, 66, 96,109,109, 93,236,102, + 81,161,175,133,186, 64,135, 84, 89,198, 95,172, 85, 31,255,230,241,120, 80, 41, 52, 6,149, 81,105,209, 68, 8,129,149,149,149, +106,195,250,213, 2, 19, 19, 19, 61, 0,152, 72,196,250,195,251, 54,195,198,218, 74,197, 26,104, 98, 45, 25, 22, 44, 18, 87, 52, +151,251,129,155, 2,203,178,121,207,158, 61, 27, 75, 8,121, 70, 8, 41,110, 63,140,113,176,140,248,119, 8,172,208,208,208, 88, + 0,237, 3, 2, 2, 6,223,186,117,107,221,244,233,211,109,155, 55,111,142,204,204, 76,212,170, 85, 11, 82,169, 20,143, 31, 63, +198,211,167, 79,211, 89,150,157, 17, 18, 18,178,191,140,135,172,125,121,177, 50, 88,150,101,165, 82,233, 17, 85,126,254,215,129, +173,188,113,237,240,237,229,142,142,142,227,156,156,156,166, 13,159,219, 99, 68,235,158, 13, 17, 25,246, 22, 15, 46, 63, 71, 74, + 92, 58,134,183,152, 85, 33,231,199, 78,238, 22, 22, 22,163,196, 98, 49, 31,128,166,140, 94,240, 7,179, 8, 75,115, 50, 12,163, + 87,171,213, 56,116,232,144, 65, 34,235,192,129, 3, 80, 42,149, 96, 24, 70, 95,222,189,235, 25,134,112,184, 2, 72,107,120, 65, +163,145,131, 97, 12,159, 32,201, 86,146,159, 58,157, 14,139, 23, 47,198,204,153, 51,177,116,105,249,163, 43, 28, 14, 7,155, 55, +111, 70,101,101,148,153,153,153, 39,149, 74,135, 30,220,245,211,209, 33, 99,166,152, 58, 55,245,197,158,195, 23,160,213,104, 32, + 16,112, 97,105, 38, 65,221,218,206, 80, 43,229,216,182,105,125,174, 82,161, 24,250,177,239, 89, 69,229,254, 49,134,245,108,137, + 21, 59, 78,225,246,239,127, 78, 66,108, 49,120, 33,126, 91, 61, 9, 1, 1,187, 43,228,212,235,245,224,112, 56, 56,120,240,160, +162,172,217,131, 52, 77,131,203,229,150,107,193,250,176,140,244,132,203, 19,162, 70, 45, 31,168, 85,249,159,164,140,172,173,173, +103,238,218,181,203, 90,169, 84,226,245,235,215,120,245,234, 21, 8, 33, 37, 42,166,248,120, 65, 65, 1, 94,188,120, 81, 44,112, + 94, 85,229, 57, 42,182, 92,165,165,165,145,164,164, 36,136,197, 98,234,217,179,103, 74, 95, 95,223,240,138,158,239,210,156, 42, +149,234, 93,187,118,237,202,179, 24, 57, 9, 4,130, 15,102,124, 21, 7, 29,253,120,168,176,172,116, 22, 20, 20, 60, 95,183,110, + 93,157,134, 13, 27, 98,251,246,237,106, 83, 83, 83,254,244,233,211, 89,154,166,201,134, 13, 27,144,149,149,165,158, 51,103, 14, +255,246,237,219,144,203,229, 79, 42,187,119,150,101,243, 8, 33, 99,155, 54,109,186,239,226,197,139, 98,119,119,119,228,230,230, +130,101, 89,236,221,187, 23,147, 38, 77,130, 80, 40, 68,100,100, 36,190,252,242,203,130,130,130,130,177,165, 99, 96,149,230,212, +233,116,132,203,229,178, 12,195, 96,193,130, 5, 37, 65, 69,139,131,140,138,120,122,236,152,238, 42,153,186, 51, 71, 50,248,251, +157, 95, 1,128, 94,167,211,191,126,241, 48,122,239,166,239,175,243,120,188, 91,165, 56,235,127, 28, 11,139, 16, 50,239,199, 31, +127,220,218,172, 89, 51,145,137,137, 9,220,221,221,113,247,238, 93,220,189,123, 23,183,111,223, 46,174, 3,176,178,178, 66,118, +118, 54,226,227,227, 21,132,144,121, 21,229, 39, 95,204,133,171, 71,237,194,217,130, 69, 22, 43,110,169,217,131,165,173, 89, 60, + 46,183,210,231,253, 99,247, 14, 43, 43, 43, 93, 96, 96, 64,184, 66,161,160,139,181,148,141,141,205,139,162,115,217, 26, 53,106, +168, 63,170,242,127,225,140,218,181, 25, 33,203,230, 21, 14, 11, 62,143, 47, 17, 91,215,191, 8, 0,135,199, 67,141,110,125, 74, +191, 7,182, 16, 66,118, 23,125, 87,149,226,156,253,169, 99, 97, 85,165, 93, 50,114,254, 51,156,255, 38, 11, 22, 0, 32, 44, 44, +236,247,250,245,235, 95, 88,177, 98,197,138, 19, 39, 78,140,153, 50,101, 10, 49, 51, 51,195,145, 35, 71,216,140,140,140, 61,124, + 62,127,230,253,251,247,179,170,115,113,150,101,247,220, 56,126,111,194,176, 57, 61,201,244, 13,195,155,135,252,241, 34,162, 65, + 83,119, 52,104,234,142,144,107,225,216, 52,247,192,126,189, 86,191, 32, 41, 41, 41,174, 18, 42, 85,251,102,158, 31, 59,185, 91, +223,188,254,135,117, 85,103, 17,178, 44,123,228,196,137, 19, 83,186,116,233, 66, 61,122,244,232, 47, 62, 87,197,203,227, 48, 12, +131, 43, 87,174, 64,163,209,224,200,145, 35, 76, 69,113,176, 24,176,167,182,109, 89, 61,108,219,174,227,124, 62,143,224,254,173, + 99,200,201,170,216, 42,199,227,113,241,219,129, 83, 26, 14,135,126, 93, 65, 90,223,135,133,133, 89,175, 90,181,138, 38,132, 96, +203,150, 45,160, 40,170, 92,135,246, 23, 47, 94, 48, 90,173,182,210,178,146,201,100, 87, 28, 28, 28, 6,110, 89,183,120,111,155, +142, 61, 44,188,189,124, 56,118,118, 53,193,161, 9,178, 50,210, 17,242,224,182,238,226,185, 83,217, 42,149,106,184, 76, 38,187, +242,119, 42,224,242,237, 39,203,220,223,103,202,186,202,172, 40, 58,173, 86,203,145, 72, 36,208,233,116,101,134,106,104,219,182, +173,232,238,221,187, 10,141, 70, 3,154,166, 43, 84, 76, 12,240,201,203, 72,175,215,123,103,101,101, 65, 46,151, 35, 52, 52,148, +221,180,105, 83, 90,118,118,246,220,210,199, 51, 51, 51,145,151,151,135,144,144, 16,118,251,246,237,105,185,185,185,115,171,146, +127,197,113,177,178,178,178, 24,177, 88, 76,105,181, 90,173,175,175,175, 80, 34, 49, 44,230, 21, 0, 60,121,242,164, 83,121,199, +154, 53,107, 22,117,247,238,221,186,122,189,190,244, 26,133, 60,165, 82,233,222,163, 71, 15,142, 1,233, 27,124,249,242,229,223, +111,223,190,221, 64,165, 82,141, 74, 77, 77,221, 7,160, 38,135,195,193,155, 55,111,210,212,106,117,159,121,243,230,237,145,203, +229,207, 77, 76, 76, 6, 27,216,110, 92, 36,132, 12,241,246,246,222,189,120,241, 98,147, 86,173, 90,113,164, 82, 41, 26, 54,108, +136,200,200, 72,156, 59,119, 78,187,101,203, 22,121, 65, 65,193, 72,150,101,175, 84,208,233, 96, 1, 16,157, 78, 7, 62,159, 95, +178, 9, 4, 2,240,120, 60, 20,168, 41,140, 94, 27,163,208, 65,164, 88,183,104,236, 57, 22, 32,201,241, 49,233,169,201,241, 15, + 9, 33,183,100, 50, 89, 78,121,150, 49,165, 82,233,207,178, 44, 39, 55, 55,119,131, 74,165, 26, 62,125,250,116,199, 85,171, 86, +193,215,215, 23,233,233,233,176,178,178,130,163,163, 35,242,243,243, 17, 27, 27,171,215,104, 52,219,244,122,253,146,148,148,148, + 10,135, 29,179,211,115,225,236, 80,243, 3, 75, 39,203,178, 96,245,128, 86,165,135, 94,195, 66, 77,180,224,114,181, 48,112, 9, + 45, 86,167,211,161, 91,183,110, 56,123,246, 44,122,246,236,201, 2, 40,215,138,116,246,236,217,202,135,220, 25, 6, 92, 1, 31, + 28,222,159,195,130,133,214,172,194,125, 20,249, 75,121, 26,173, 86, 70,252, 59, 5, 86,209,139, 57, 27,192,184,134, 13, 27,238, +155, 60,121,242, 89,134, 97,184, 12,195,116,125,242,228,201,237,191,115,241,164,164,164, 80,169, 84,250,157,189,179,229,138,206, + 67,155,195,211,191, 22,244, 58, 61,238,158,127,130, 61, 63,158, 60,152, 24,159, 56,188,244, 90,133,229, 63,207,204,245,102, 65, +158, 20, 0, 94,169,225, 23,166, 58,179, 8, 83, 83, 83, 23, 46, 91,182, 12, 63,252,240, 67,149,103, 17,150,119,206,189,199,137, +227,154, 4, 57, 58, 15,236,211,182, 35, 69, 40, 86,165, 86, 85,208, 43, 0, 91,236, 21,193,225,208,175,111, 62,136,247, 45,239, +220,228,228,228,118, 19, 38, 76,248,131,162,168, 90,165, 77,243,229, 65,175,215, 39,101,100,100,116, 48, 36, 31,146,147,147, 47, + 56, 59, 59,123,220,188,120,234,187, 59, 87,207,183,214,235, 53,110, 4, 4, 60, 30, 47, 90,171,215,221,208,170,213,203, 19, 18, + 18,178,254,110, 5,252,110, 92, 79,188,151,165,131,195,161, 11, 3,123, 22, 21,247,177,141,211, 17, 16,240, 91,185,255, 19, 8, + 4, 23,118,239,222,221,109,216,176, 97,164,216,239,140,101,217, 15, 26,244,135, 15, 31, 42,212,106, 53,246,236,217,195,138, 68, +162, 10, 3,215,126, 88, 70,132, 85, 85,224, 15,101,104, 25,229,231,231,143,236,209,163,199, 94, 0, 2, 0,111,114,114,114,198, +203,100,178,132,210,199,123,246,236,185, 23,128,128, 16,242,151,227,134,160, 56,100,131,165,165,101,120,145,229, 74, 88, 29, 71, +247, 10,234, 55, 93,222,240,161, 33, 67,133, 69,107, 11,246, 46,254, 29, 20, 20,180,100,194,132, 9, 37,139, 61,135,133,133,221, + 1,224, 90,141,206,217, 21, 66, 72,189, 5, 11, 22,124, 35, 20, 10,219, 20, 20, 20,120, 20, 9,186, 72,149, 74,117, 93,161, 80, +172,103, 89,182,194,216, 82,209,209,209,234, 58,117,234, 68,234,116,186,250,182,182,182,224,112, 56, 37, 34, 11, 0, 30,196, 89, +133, 36, 38, 38, 54,172,106,218,206,159, 63,239, 98,105,105,217,129, 16,210,151,101, 89,207,188,188, 60,213,247,223,127,127,239, +230,205,155,185, 17, 17, 17,157, 90,180,104, 65, 28, 28, 28,240,246,237, 91, 54, 63, 63,255, 40, 69, 81,243,100, 50, 89,140, 1, +247,156,176,103,207,158,170,230, 83,133,245, 73,173, 86,167,221,191,127,223,234,234,213,171,180, 94,175,199,197,139, 23, 75, 58, +146,101,141, 6,198,196,196, 64,173, 86, 87, 56,134,174,201,201,130,239,212,217, 96,139,102,115, 22,163,102,215, 62, 32, 96,193, +170,141,122,202,136,127, 7,200,127,100, 26,115, 21, 77,136, 82,169,116,128, 80, 34,152, 88,203,195,209, 87, 22,147, 26,158,151, + 83,176, 63, 41, 41,105, 59,203,178,250,234,114, 86, 37,208,168,209,204,251,207,112,242,197,102,151, 8,205,171, 85,238,203, 65, +175,121,175, 46,200,237, 88, 22,103,112,112,176, 19,143,199, 91,173, 82,169, 58, 87, 20,165,157,166,105,157, 72, 36,186,160, 84, + 42,103,126,188,216,243,255, 98,126, 30, 61,122,180, 76,209,111,232, 44,194,190,125,251,234,171,146, 78, 63, 63,191,235, 98,177, +184,204,128,154, 5, 5, 5,113, 79,159, 62,237,240, 57,228,103,241,204, 54, 67,124,132, 74,115, 86,103, 22, 97, 57,156, 37, 67, +132, 46, 46, 46, 2,141, 70, 19, 0,192, 3,128, 5,128, 76,173, 86,123, 49, 45, 45, 45,197,193,193, 33,136,162,168, 5, 69,226, +117,105,114,114,114,200, 63,249,108, 58, 59, 59, 11,205,204,204, 86, 83, 20,229,104,200,255, 25,134, 81,167,166,166, 78, 79, 79, + 79, 79, 46,139,179, 94,189,122, 33, 52, 77, 87,186,168,185, 94,175, 79,120,249,242,101, 80, 5,233, 52, 14, 17,254, 11, 57,255, +149, 22,172,255, 52,100, 50,217, 33, 0,135, 62, 37,103,121,145,218,141,248,124, 80, 44,158,170,131, 34,177, 52,240,223,150,103, +197, 2,169,140,253,175, 0,144, 79,125, 61, 67,194, 49,124, 14, 96,171,217, 83, 44, 18, 80, 45, 62,101, 90,222,189,123,167, 2, +112,175,104,251, 0, 69,130,170,251,231,146,111, 9, 9, 9, 74, 0,147, 62, 21, 95, 69,162,201, 8, 35,254,109,160,140, 89, 96, +132, 17, 70, 24, 97,132, 17, 70, 24,241,105, 65, 0,180, 47,167, 71,104,176,233,143, 16,210,190, 26, 61,206,171, 70, 78, 35,167, +145,211,200,249,255,132, 51,181, 2,206, 23,149,112,214, 47,231,144,221,255, 80,126,250,151,195,185,178, 18,206,217, 21, 28,126, + 98,172,159,255, 63, 57,255, 53, 40,118,102,252, 79,108, 0,218, 27, 57,141,156, 70, 78, 35,167,145,211,200,105,228, 52,114,254, +219, 54,227, 16,161, 17, 70, 24, 97,132, 17, 70, 24, 97,196, 39,134,193, 2,203,196,193,219,219,214,197,111,175, 85, 13,223,103, + 86, 53,124,159,217,186,248,237, 53,113,240,246,254, 55,102,154, 84, 42, 21, 57, 58, 58, 14,174, 89,179,230, 21,127,127,255, 92, + 39, 39,167,111,140, 85,169,234,104, 77, 8,103, 32, 33, 19,135, 17, 18, 55,140,144,184,129,132, 76,108, 77,200,255,187,101, 51, + 22, 79,149, 54,185,125,113,200,133,197, 83,165, 77,202, 60,254,173,212,250,225,149,254, 63, 45,159,228,100,245, 41,174, 71, 8, + 49,181,183,183,223,225,224,224,240,206,222,222,254,189,189,189,253,110, 66,136,185,177,198, 25, 97,132, 17, 70,252,247, 96,208, +203,204,170, 86,131,209,222, 94,158, 51,151, 45,154, 75, 28,236,108,196, 58, 61,163,121,251, 46,222,103,225,178, 21, 71,173,106, + 53, 88,151,249,254,249,174,106,188, 4,136,179,179,243, 0, 46,151,219, 13, 64,177, 80,123,165,213,106,207, 38, 36, 36, 28, 50, +116, 86,144,175,175,239, 29,154,166,107, 86,229,218, 12,195,188,123,250,244,105,203,234,100,152,147,147, 83, 63, 39, 39,167,221, +141, 27, 55, 22,251,251,251,131,199,227, 97,213,170, 85, 51, 0,172, 55,248,222, 91,183,230,216,101, 91,125, 69,115, 56,221, 1, +248,178, 44, 0, 66, 63, 99, 52,234,243,169, 60,171,189,108,232,118,173, 33, 60,142,142,142,115, 9, 33,195, 81, 56,173,124,151, + 76, 38, 91,253,159,168, 36, 82,169,180, 6, 33,164, 13,203,178, 94, 20, 69, 61,103, 24,230,178, 76, 38,203,248,187,188,246,192, +184,166,205,155,255, 52,108,198, 12, 90,113,235, 22,126,218,189,123, 3,114,115, 1, 96,115, 85,235, 82,112,176,127, 95, 83, 83, +116, 35, 64, 0, 8, 8, 5,246, 73,102, 54,117,254,241,227,176, 67,134,196, 82, 43, 15,129,129,129,231, 0, 20, 47, 28,119, 62, + 52, 52,180,107, 85, 57,114,162,217,249,130,238,222, 45,114,162,175,207, 7,208,249,227,227, 58,165,112, 24, 75,215,232,166, 96, +195,226, 1,172,253, 59,121, 74, 8, 17,219,218,218, 62, 59,117,234,148,115,163, 70,141, 56, 0, 16, 18, 18,242, 85,183,110,221, +218, 22,133, 18,200,253, 39, 26,154, 38, 77,154, 88,234,116,186,125, 52, 33,141, 25,134,177, 0, 0,138,162,178,245, 44,251,128, +195,225, 12,171,110,176, 98, 35,140, 48,194,136,255, 89,129,101, 98,239,229, 83,175,158,247,140,139, 39,246,213,200,206,204, 86, +254,188,102, 95,168,156,195, 47,112,247,113,231,253,188,126,181,229,196,169,211,167,153,216,123, 61,204, 79,137, 8, 55,244,162, +142,142,142, 53, 93, 92, 92,142,207,157, 59,183,126,243,230,205,185,118,118,118, 72, 73, 73,193,235,215,175,235,223,189,123,183, +231,201,147, 39,103, 56, 58, 58,246, 54, 32,130, 59, 36,124, 94,157, 67,171,150, 59,240,205, 45,192,234,117,176,172,239, 95, 56, +254,201, 48, 72,190,121, 21,122,141, 6, 44,163,135,115,167, 47,139,197, 21,130,131,131,121,213,201, 44,103,103,103,169,135,135, +199,254, 57,115,230,240,212,106, 53,194,194,194,112,255,254,125, 38, 53, 53,117,133,193,162,162, 65, 47, 31, 7,142,195,209, 30, + 61, 59,187,116,253,194,142, 95,203,193, 22, 44, 35, 68, 68,172,166,230,149,219, 97,157,206, 93,184, 52,203,206,167, 87,159,212, +240, 19,207, 43,226,169, 95,191,126, 99,138,162,126, 72, 76, 76, 44, 22, 65,171,130,131,131,191, 47,125,206,199, 26,149, 97, 24, +112, 56,156,148,130,130,130, 1, 47, 94,188, 8, 43,139,119,120, 0,209,106,245,133,245,130,199,129,254, 90,154,243,137,246,237, +219,215, 30, 57,114, 36, 2, 2, 2, 16, 18, 18,210,230,200,145, 35, 83,107,212,168,241, 88,171,213,158, 23, 8, 4, 55,138,166, +165, 87, 25, 60, 96,214,176, 25, 51,104,147,119,239, 96,242,244, 41,134,228,230,114, 86, 2,179,170, 34,176, 2, 3, 3,235,116, +104, 31,112,180,103,239, 86,222, 14, 14, 62, 60, 46,215, 6, 44,203, 66,171,205,244, 72, 75,123,213,215,220, 28,115, 26, 53,106, +212,231,209,163, 71, 6, 69,154,109,216,176,161, 61,195, 48,219, 88,150,229, 17, 66, 38, 3,232,114,241,226, 69,232,245,122,116, +237,218,181, 75, 96, 96, 96, 29,150,101,127, 54, 49, 49, 97, 21, 10,197,168,199,143, 31,167, 84,100,185,202,141,102,231, 39, 19, +215, 78,158,129,195,144, 76, 46,118,154,222,217,241,130,153, 27, 89,182,240, 39,217,125, 0,232,236,230,102,234,234, 37,153,109, + 98,214,192, 42, 55,241,234,236,206,110,110, 59, 47, 68, 71,231, 85,167,195, 82, 84, 15, 86,255,250,235,175, 53,130,131,131, 75, +226,101,249,251,251,211,171, 87,175,118,250,230,155,111, 54, 0, 24, 97,160,168,246,176,182,182,190,196, 48,140,234,229,203,151, + 30,197,251,237,252,122, 55,181, 54,149,180, 75,203,202,187,149,254,242,228, 77, 67,184,130,130,130, 70,242, 40,106,199,250, 5, +147,104,175, 6,126, 16,219,218, 66,147, 32,131, 92,175,181,122,240,244,101,215,149,235,119,164, 5, 5, 5,141, 13, 9, 9,217, +109,108,146,141, 48,194,136,127,141,192, 18, 8,248,115, 22,206,155, 77,178, 51,178, 21,202,220, 60,181, 86,169, 84, 82, 60, 86, +249, 60, 60, 54,149,226,208,217,223, 76,157, 98, 58,231,187,121,115, 0, 12, 49, 84, 92,121,121,121, 61,218,185,115,167,157,149, +149, 21,114,114,114,144,145,145,129, 71,143, 30,129,101, 89,116,238,220, 89,224,215,160,126,192,186,245, 27,238, 59, 58, 58, 54, +169, 76,100,113,184, 28,194, 21,139,113,172, 85, 0, 40, 30, 15,125, 34,146, 10,197,133, 86,131, 11, 3,186, 1, 0,104, 62, 31, +253,163, 10, 39,249, 8,133,194,106,103, 22,203,178, 77,154, 53,107,198, 3,128,233,211,167,231,202,229,242,229,132,144,223,101, + 50, 89,162,161,226,202,198,214,246,230,154,101, 99,172,234,215,113,133, 70,171, 69,124,106, 34, 88,194,135,163,157, 4, 67,123, +249,243,154, 7,241, 93,215,108,190,122,195,190,126,143,150, 41, 47, 78,189, 44, 87, 88, 74, 36,251, 54,108,216,128,195,135, 15, + 3, 0,174, 95,191, 14,119,119,119, 73,101,105,120,253,250,181,235,240,225,195, 15, 2,168, 91,214,113,173, 30,156,223,127,255, + 29, 0,176,246,219,193,244,230,219,145,181, 69,162, 63,215, 82,110,213,170, 21, 90,181,106, 69, 45, 95,190, 60,248,250,245,235, +193, 7, 15, 30,212, 56, 57, 57,109, 72, 76, 76, 60, 82,157, 60, 85,220,186, 5,147,167, 79,129,155, 55,171,252,223,192,192,192, + 58, 94, 94,214, 15,214,173,253,222,230,204,217,151, 88,179,102, 55,162,163,163, 1, 0,174,174,174, 24, 60,168, 31,247,247,223, +182,213,155, 51,103,209,189,192,192,192,230,161,161,161,149, 70, 55,103, 24,102,219,183,223,126,251,165,147,147, 19,230,207,159, + 31, 89,167, 78, 29,152,153,153, 97,251,246,237,176,180,180,132, 86,171,141, 92,181,106, 21, 71, 38,147, 97,227,198,141,191,148, +178,110,253, 5,173, 59,182,158, 47,232,238,221,194, 51,112, 24, 76,204, 28,177,243,192, 33,188, 14,221,215, 66,165,121, 53,127, +249, 36,167,161, 10, 86, 48,220,217,221,116,142, 75, 80, 43,235,186,245,190, 68,173,192, 48, 27,165,254,118,236,130,137,174, 43, + 56, 66,229,190,133,107,254,106, 37, 36,253,142,210,245,115, 35,172, 94, 92, 65, 6,203, 46,100,138,132, 85, 73,252, 43, 61,139, + 47, 91,182,108, 89, 34,174,222,189,123, 7,149, 74, 5,111,111,111, 74,173, 86, 27, 20,211, 74, 42,149,122,180,108,217,242,206, +254,253,251,173, 91,180,104,241,193,210, 45, 14,214, 22, 29,111, 30,223, 48,229,135,159,126,243,178,243,233,149, 93, 89, 71, 32, + 40, 40,104,100, 3, 79,183, 93, 27, 86,125, 79,232,188,120,112, 44,210, 0,125, 58,146, 14,253, 2, 34,182, 66,215,241,211,209, + 48, 56,152,158,242,205,220, 93, 13, 27, 54,100, 31, 63,126,188,199,216, 44, 27, 97,132, 17,255, 10,129,197,176,140,175,189,157, +181,104,195,154,189,143,105,141, 90, 45,177, 48, 87,115,205,205, 24, 98,106, 78,107,212,218,252, 90,174,181,248, 12,203,248,150, + 35, 72,174,126,220,203,118,113,113, 57,190,103,207, 30, 59, 46,151, 11,134, 97, 96,107,107,139,183,111,223, 34, 59, 59, 27,121, +121,121,136,126,245, 10,181,107,214,192,148,177, 99, 28,151,174, 89,123,156, 16, 18, 84,122,184,240, 99, 78,150, 97,193,232,116, + 31,247,230,129, 50,150,140, 41,111, 25, 25, 67,167,148, 50, 12,243, 86, 38,147, 65, 44, 22,195,219,219,219,228,241,227,199,183, + 19,139, 77, 72,149,221,123,235,214, 28, 71,129,237,241,213,203, 6, 88,129,138, 68,100, 92, 54,220,156, 27,193,198,162, 6, 18, +211,242,241, 56,252, 60,162,162,207,193,205,169, 22,198, 14,174,107,177,126,251,221,179, 36,112,156, 91,233,225,194,210,156,121, +121,121, 38,181,106,213,130,147,147, 19, 24,134,129, 94,175, 71,120,120, 56,244,122,125,201,239,210,159,123,143, 93,131, 46,247, + 61,134,125,245, 21, 50, 51, 51, 77, 12,189,247, 98,113,181,125,176,180,158, 60, 43,137, 7, 0, 18, 75, 71,205,216,223, 18, 95, + 54,108,216, 16,182,182,182,188,123,247,238, 77, 7,112,164,170,249,169, 1, 86,253,180,103,207,198, 33, 57, 57, 20, 0,236, 34, +132,209, 20, 70,213, 54,168, 46,181,111,239,119,108,195,134, 5, 54,132, 13,135,149,249, 74, 60,122,244, 30, 26, 77, 97, 85,201, +200, 72,197,228,137,185,224,112, 76,177,118,221, 34,235,254,253,199, 31, 43, 26, 34, 99, 42, 74, 39,203,178,188,107,215,174, 97, +208,160, 65, 56,120,240, 32,135,166,105, 60,124,248, 16, 34,145, 8, 35, 70,140, 64,189,122,245, 56, 34,145, 8,119,238,220, 65, +110,110, 46,169, 40,157, 55, 46,221, 88,150, 19,125,125,126, 50,185,216,105,231,129, 67, 24, 51,104, 0, 28,216,152,219,230,110, +100, 89,135,238,205,190,103,233, 26,221, 36,166,190,150,238,245,187,131,199, 55,193,164, 89, 75, 16,249,226,140,101, 65,222,179, +137, 68, 31, 95, 3,192,212,143, 57,217, 35,125,245, 27, 15,220, 11,188, 82,243,113, 45,105,224,184,135, 0,158,253, 41,176, 92, + 57,132,210,155, 23, 91, 47,223,188,121,131,232,232,104,112, 56, 28, 40, 20,138, 15, 22,245, 45,205, 25, 16, 16, 48, 78,175,215, +127, 15, 0,106,181,122,175,189,189,253,200,159,127,254,217,186,120, 9,162,210,150,171,204,236,220,172,123,143, 95,190,158, 62, +174,111,235, 91, 15, 94,196, 91,248,245,140,203,126,122, 50,167,172,252,108,210,164,137, 37,159,166,119,252,180,122, 33,209,199, + 92,131,192,187, 53, 56, 38,238,208,107, 19,161,204,146, 67, 25,155, 4,245,246, 77,112,157,240, 13, 86,175,252,129, 12, 26, 58, +106,135,155,155,219,241,232, 82, 22,188,255,196,116,111, 35,167,145,211,200,249,121,114,254,235, 4, 22, 33, 84,174, 94,207, 8, +120,182,118,202, 81,253,219, 53,184,124, 53,228,137,216,198,140,211,177,117, 64,171, 71,207, 99,239, 19,138,104, 9,161, 12,242, +235,112,118,118, 30,176,112,225,194, 6,102,102,102, 96, 24, 6,230,230,230, 72, 75, 75,131, 90,173, 70, 78, 78, 14, 84,121,185, +208,228,229,226,105,252, 59, 52,107,213, 26,237,155, 52,246,190,160,213, 14, 0,112,176, 60, 78, 61, 69,179,214, 1,141,208, 47, + 38, 3,140, 70,141, 35,174,214, 37, 86,171,129,239,178, 65, 8, 1,163, 81,227, 66,112, 93,240, 77, 36,240,155,185,176,218,153, +149,148,148, 20, 86,171, 86,173, 11,157, 59,119,238, 60,110,220, 56, 42, 57, 57,249,162,189,189,125,179,148,148,148, 74,135, 71, +237,178, 44,135, 13, 27,219,160,142,141, 5,133, 51,119, 46,162,177, 87, 47,136, 5, 92,164,101, 43, 64, 64, 16,243,246, 42, 24, +157, 9,158,190,122,135,166,190, 98,180,108,100,225,156,255, 71,230, 88,148, 63, 92, 70,178,178,178,144,154,154, 10,173, 86, 11, +173, 86,139,190,253,250,225,215,125,251, 32,151,203,161, 80, 40,160, 86,171,161,215,235, 65, 81, 20,174,156, 61,130,248,216, 87, +104,218,164, 9, 80, 65,196,111, 46, 13,221,218,111, 7,115, 0,128,111,106,171,201,203,203,131, 68, 34,129, 60, 43,137, 55, 99, + 77,137,101,139,119,253,250,117,132,134,134, 66, 42,149, 26, 84,143,202, 66, 52,176,227,173, 94, 63,191,243,137, 19,118,119, 79, +156, 96, 30,156, 57,147, 32,200,203,219,110,200,127,131,131,253,251, 78,153,220,213, 83, 36, 20, 33, 33,110, 3,188,188,120,152, +241,141, 53,150,175, 76, 7, 0, 76,153,236,140,134, 65, 54,200,205, 62, 10, 27, 59, 55,204,152,222,211, 45, 63,159,253, 10,192, +222,138,235, 59,153,252,236,217,179, 72,123,123,123, 78, 88, 88, 24,248,124, 62, 68, 34, 17, 68, 34, 17,132, 66, 33,146,147,147, +161, 86,171,113,248,240, 97, 93,209, 16, 98,185, 40, 26, 6,236, 60,189,179,227,133,215,161,251, 90, 56,209,177, 79,251, 76,106, +254,238,217,131,176,188,203, 87,238, 46,213, 41,133,241,217, 9, 87,103,215,105, 24,102, 51,113,230, 98,108, 90,189, 16,175, 31, +222,202,180,175,153,187, 89, 68, 84,123,131,191, 40,195, 42,214,122, 49,103,226,130,254,186,113,195,251, 88,156,177,191, 55,238, + 60,135,164, 37,167,135,174,193,219, 48,133,160,110,192, 80, 15, 87, 74,125,237,218, 53, 81,203,150, 45,161, 84, 22, 46, 25, 71, +211, 52,246,239,223,207,232,116,186,235,101, 90, 45,181,218,239, 67, 67, 67, 29, 21, 10, 5, 6, 14, 28, 56,101,209,162, 69, 18, + 46,151, 91,248,124,233,245, 31, 88,174,150,173,255,245,210,180,239, 55, 95,191,116,112,165,116,217,156,145,173,135, 76,250,225, + 58,128,139,101,241,234,116,186,125, 27, 86,126, 71, 11, 44,180, 32, 13, 59, 64,147,162,192,251,157, 99,160,206, 85,194, 99,233, + 98, 0,124,168,181, 20,206,245,232, 11,202, 74,138,209, 45,154,113,182,223,186,179, 15, 64, 79, 99,211,108,132, 17, 70,252,255, +183, 96, 49,204,173, 55,177,239,186,116,104, 31,236,124,246,230,243,199,227, 70,116,237, 72, 81, 20,121, 18,254,254,166, 91, 45, + 7,155,235, 55,110,177, 12,195,220, 50,228, 98, 92, 46,183, 91,243,230,205, 57, 89, 89, 89,144, 74,165, 72, 75, 75, 67, 98, 98, + 34,180, 90, 45,148, 57,217, 80,231,229, 66,157,155, 3,189, 60, 15,209, 33,143,224, 85,211, 89,112,181,208, 9,254,160, 33,252, + 31, 91,168,138, 23,253, 5, 33, 16,152,154, 64, 96, 98, 82,249, 74,240, 31, 65, 42,149,246, 48, 51, 51,155,157,151,151,119, 62, + 49, 49,113,153, 90,173,158,248,227,143, 63, 62, 94,178,100,137,205,156, 57,115,204,102,205,154,117,196,197,197,197,191, 50, 63, + 36, 83, 43,125,223,198, 13,234,210, 81,239, 95, 32,200,163, 47,106, 75,155, 35, 38, 49, 7,153,121, 42,100,228, 40,224,233, 49, + 19, 41, 25, 5,200,145, 43,241,252,245,239,112,114,168, 67,209,220,232, 78, 21, 8, 44,164,164,164,124,112,207, 7, 15, 28, 64, + 65, 78, 14,220,220,220,224,237,237, 13, 91, 91, 91,188,127,255, 30,119,238,220,193,144,254, 95,130,203,237,131,212,212,212, 10, +239,119,111, 24,203,149, 74,165,161, 50,153, 12, 97, 97, 97,136,142,142, 46,115, 88,245,143, 63,254, 40,124,241, 58, 56, 24,156, +151,246,246,246,223, 81, 20,213, 31, 0, 13, 32,158,146, 74,235,218,218,218,218, 55,235,217, 19, 57, 92, 46,253,243,245,235,132, + 99,110,110, 2, 32,187, 50, 46, 51, 51,116, 13, 10,106,206,207,206,218, 13,160,208, 40, 53,114,132, 45, 58,119,178, 7,161, 4, +144, 58,154,130, 80, 2, 16,194, 71,129,252, 26,124,234,249,242, 76, 77,143,119,171, 72, 96, 21, 59,180,215,171, 87, 15,227,199, +143,199,201,147, 39,177,119,239,159,167,247,233,211, 7,189,123,247, 70,126,126, 62,236,237,237, 57, 50,153, 44, 38, 48, 48,176, + 82,199,119, 51, 55,178, 76,165,121, 53,223,194, 93,146,166,135, 77,211,124,173, 32, 99,225,154,152,133, 0,214,118,118,115,219, +169, 97,110,197, 70,189, 56, 99,249,246,241,141, 76, 89,148,220,117,231,185,152,114,125,176,110,222, 4, 99,239,123, 83,243,101, +167, 86,156,158,221,219, 20, 56, 57,219,123,252,188, 89,189, 63,211,201,122,153, 75, 77,231, 33, 11,127,156,173, 25,218,171,133, +102,246,140,201,220,122, 62,222, 36, 55, 55, 23,135, 14, 29,210, 93,184,112, 33,137, 97,152,105,229,208,210, 69, 66, 11,253,251, +247,151,136,197, 98,196,199,199,195,203,203, 11, 12, 83,152,183, 73,105, 25,207,239, 62,126, 17, 49,125,124,191, 86,191,159,190, +254,234,210,141,144, 87, 61, 59, 53,243, 35,132,117, 41, 47,173, 52, 33,141,125,124,125,193,178,137,160,185, 30, 72,216, 63, 18, +202,140, 60,168,228, 74, 80, 92, 9,212, 90, 26, 26,134, 64,224,219, 8,111, 78,158, 70,221,193,245,192, 33,164,153,177, 89, 54, +194, 8, 35,254, 63,160, 82,181, 65, 43,213,203,191,157, 61, 31,150,230, 34,243, 70, 1,238, 14,167, 46,222, 12,185,117, 47,228, +149, 75, 13, 27, 91, 86,171,182, 92,181,110,147, 51, 41, 80, 24,234,228,237,109, 99, 99, 3,141, 70,131, 55,111,222, 32, 33, 33, + 1, 26,141, 6, 58,185, 28,170,236,108, 40,179,178,160,151,231,129,167,215, 67,145,150, 10, 75, 33, 31,248,115,134, 97, 69,166, +202, 63,197, 84, 25,130,139, 16, 2,145,153, 25, 4,166,166,160, 56,180,193,153,227,232,232, 24,232,239,239,127,248,218,181,107, +193,205,155, 55, 95,234,226,226, 98,158,156,156,252, 62, 37, 37,165,221,234,213,171, 85,182,182,182, 24, 50,100,136,167, 86,171, + 29, 86, 25, 23, 79,160,106, 80,211,222, 29, 53,236,191,132,212,166, 49, 50,115, 85, 72,205, 86, 32, 37,163, 0,135,142, 15,192, +229,243, 3,241,228,206, 87,120,243,112, 36,210,243,205, 32,180,106, 3,128,173, 95, 17,231,189,123,247,176,109,219, 54,108,219, +182, 13, 91,183,110,197,166, 77,155,144,149,149,133,250,245,235, 35, 46, 46, 14, 23, 46, 92, 64, 82, 82, 18,108,108,108,240,228, +201, 19,108,223,190, 29,143, 30, 61,170,114, 37, 81, 42,149,224,153, 88,107,214,126, 59, 24,107,191, 29, 12,134, 43,209,148, 18, +224,134, 87, 54,138, 26,158,212,179,103,131, 36, 11, 11, 31, 95, 95,223,206,253,251,247,119, 13, 14, 14, 46, 57,238,230,230, 86, +147,195,225, 36, 75,165,210, 93, 82,169,212,191, 98,229,207, 6, 88, 90,121, 67,173,138, 40, 42, 99, 46, 8, 17,162,237, 23,175, +208,172, 69, 8, 52, 90, 30, 40, 34, 0, 69, 9,161,211,101,192,204,212, 30, 44, 75,234, 87,146,196, 46, 23, 47, 94,196,182,109, +219,240,246,237,219, 18, 97,217,173, 91,183,201,131, 6, 13, 58,174,215,235,113,246,236, 89,156, 60,121, 18,181,107,215,134,159, +159, 31, 52, 26, 77,151,202,238,123,225, 79,178,251,191,175,187, 48,144,171,181,244, 23,138, 92,106, 67,110,210, 99, 98,107, 91, + 9, 0, 92,136,142,206,179,171,153,187, 66,158,247, 44,206,194, 57,127,101,101, 14,238, 44,187,144, 9,141,138,120,240,251,137, +139, 57,169, 41, 89,220,128, 6,245, 20,203,151,204,228,185,212,174,187,106,225,236,241, 14,137,185,194,236, 47,166, 92,136, 56, +126,241, 81,254,208, 17, 99,116,163,198, 78, 82, 94,184,120,229, 4,195, 48, 13,202,155, 65,200, 48, 12,146,146,146,240,242,229, + 75,196,196,196, 32, 45, 45, 13,233,233,233,200,203,203, 43, 25, 86, 20,231,229,158,219,180,231,204, 83,137, 72, 36, 14,110,224, + 94,243, 97, 88,120,170, 68, 36, 18,187,215,174,233, 65,200, 98,170, 28, 94, 11,161, 72, 8,128, 32,239,197, 45, 40, 51,243,161, +200,206,135, 50, 43, 31, 42, 13, 13,165,138,130, 66, 77,193,166, 69, 7,228,203,149, 80,102,100,129, 97, 89, 75, 99,179,108,132, + 17, 70,252, 43, 44, 88,233,233,145,249,102,182, 62,189,191,153,245,253,133, 3,191,252,108,167, 82, 21,196, 89, 91,154,232, 77, +196,124,155, 81,227,126, 64, 94,126, 86,175,252, 76,195,103, 61,101,101,101, 33, 54, 54, 22, 34,145, 8, 60, 46, 23,122,133, 2, +122,133, 28,138,172, 12, 80, 26, 21,120,122, 61,172,196, 34,212,146, 58,192,197,190,114,235, 8,205,232,137,236,202,121, 92, 26, +218,235, 47,195,130, 23,155,122, 66, 96, 34,129,208,194, 18,205, 78,222, 46, 20, 58, 60, 30,176,176,242, 69,218, 29, 28, 28,108, +164, 82,233,233, 77,155, 54,241, 50, 50, 50,240,242,229,203,167,239,222,189,203,177,178,178, 50,229,114,185, 76, 84, 84,212,213, +136,136,136,110,117,234,212, 1,203,178,110,149,241,229,229, 72, 52, 90, 45, 11, 89,234,123, 36, 36,189,132,153, 73, 13,176,116, + 13,164,102, 22,128,192, 30, 58, 85, 36,244,218, 66,119, 43,149, 34, 1, 5,106,195,214,237,213,104, 52,208,104, 52,208,106,181, + 80,169, 84, 24, 58,116, 40,238,222,187,135,131, 39,255, 64,108,116, 36, 60,107, 59,224,171,175,134,194,223,223, 31,143, 31, 63, +174,118, 69,105, 50,251,210, 75,145, 72,132,173, 91,183, 66, 44, 22,127, 32,110, 13, 20,171,107,219,181,107, 87, 55, 82, 46,199, +203,136, 8, 52,234,215, 15, 0,112,231,206,157,146,115, 20, 10, 5, 6, 15, 30,204,143,141,141, 29, 21, 17, 17, 49,202,209,209, +113, 93, 82, 82,210,140,242, 56,207,157,187,143,241,227,195,145,150, 86,232,135,125,232, 64,189,146, 99,111, 99, 53,232,212,181, +112,228,202,194,194, 2,235,214,213, 55, 40,157,122,189, 30, 59,118,236, 40, 25, 22, 4, 0, 14,135,211,108,250,244,233,189,203, + 58,223,199,199,167, 82,206,233,253,156,133, 79,222,139, 38,154,215,117,169,103,102,227,139, 12,109, 88,253,176,196,164,201,211, +251, 57,111, 88,119, 36, 65, 41, 34,170,189, 68, 31, 95,131, 35, 84,238, 51, 36,141,209, 23, 54,170, 45, 92, 70,236, 75, 78,203, +157, 55,105,204, 96,107, 51, 11, 59,249,174, 77,203, 45, 41,154, 98, 79,135,104,178,235,185, 90, 91,244,104,252, 83,254,248,111, + 22,132,169,117,241,147, 16,127, 58,178,162, 80, 21, 12,195, 64, 38,147, 33, 45, 45, 13,113,113,113, 72, 79, 79, 47,122,246,211, + 75,134, 8,171, 3, 66, 8,212,113,113, 72, 57,185, 11, 14, 67,134,194, 99,201, 18,232, 25, 14,148, 5,122, 28,109,217, 14,185, +217, 10,168, 25, 2,139,192,166,232,112,246, 54, 8,163, 7, 30,220, 51,182,202, 70, 24, 97,196,191, 67, 96, 1, 64,110, 90,120, +140,117, 45, 95,153, 92, 33, 23,219,219,217,170,196, 66, 1,147,147,155, 71,135, 61,127,170,201, 79,122,243,186, 10,215,123, 21, + 30, 30, 94, 63, 33, 33, 1,113,239,223, 67,167,144,131, 82,169,193, 42, 11,208,190,121, 83, 8, 1, 8, 41, 2, 30,163, 1,135, +230, 35, 47, 63, 23, 0, 94, 85, 70,202,104,181, 31, 52,234,132, 16, 16,138,130,208,196, 4,124, 83, 9, 4,102,166, 31, 88,180, + 12,129, 72, 36,250,125,251,246,237,142, 14, 14, 14, 88,183,110, 29, 28, 29, 29,189,218,183,111, 95,208,170, 85, 43,145,141,141, + 13, 60, 60, 60, 16, 20, 20,132,235,215,175,131, 16, 18, 93, 25,159, 78,205, 15,125, 21,171,171,145,147,247, 4, 15,194,126,133, + 86,173,133,155,199, 92, 40,180,214,144,216,142,130, 82,125, 26,250,236, 27, 0, 0,190, 89,107, 36, 39,167, 3, 32, 47,170, 82, +152, 44,203,226,217,179,103, 56,112,234, 38, 28,107,121, 35, 46, 42, 2, 17,215,175,226,174,173, 53, 92,124,234, 65,171,213, 26, + 44,136, 12, 61,207,208, 23, 48, 33,100,240,152, 49, 99,144,205,225, 0, 93,187,130, 23, 19, 3,141, 70,131,198,141, 27,163, 97, +195,134, 0,128,198,141, 27,131,166,105,212,173, 91, 23,214,214,214, 56,118,236,216, 96, 0,101, 10, 44,150,144, 39,140, 62,195, +203,213,213,181, 68, 96,237,251, 53, 13, 97, 33, 95,128,128,143,141,155,254,140,202, 80,179,102, 77, 36, 39,199,130, 16,182,178, +252, 60,223,181,107,215, 46,150,150,150, 24, 57,114, 36,132, 66, 33,122,245,234, 5,165, 82,217, 31, 0, 86,172, 88,129,239,190, +251,174,208, 42,181,112, 33, 22, 45, 90,132,130,130,130,114,135,134,127, 93,239, 43, 77,205,100, 70,217, 59, 56,245,106, 99,227, +210,160,109,199,246,168,227,222, 22,109, 59,198, 1,192,143, 86,156,119,253, 87,207,175,127,194,166,134,213,238,203, 23,175, 44, +108,222,170,237,188, 57,227, 44,151,173,216,158, 85,169, 79, 99,206,251,189,121,175,249, 3,214,255,188,237,215,245,223,127, 55, + 85, 24,151,166,206, 74,204, 98,243, 77, 4, 28, 19, 55,123, 98, 50,121,214,210, 88,153, 44,102, 6,226, 47, 70, 26, 82,134, 49, + 49, 49, 37, 62,123, 74,165, 18,114,185, 28,241,241,241, 37,229,171,144,152,117,154, 52,162,187,159, 92,161, 40,120,248, 60, 42, +110,254,148, 33, 77,228, 10, 69, 65,212,219,184, 72,150,253,137, 41,167,204,179, 11,228, 5, 86,170, 28, 37,114,158,190,134,117, +219, 90,208,232, 8, 84,122, 61,178,210,243,160,214, 1, 90,154, 11,231,190, 95, 65, 11, 14,114,211,146, 65, 17, 98,140,135,101, +132, 17, 70,252,123, 4, 22, 33,132,248, 53,168, 37, 93,189,112,136, 51,163,211,121,166,166,167,232, 56, 28, 1,183,134,185, 34, +169, 42, 23,211,106,181,103,111,223,190,221,179,121,243,230,130,168,231, 79,161,206,201,129, 58, 39, 27, 92, 70, 7, 43, 81, 16, + 40,141, 10, 68,173,134,147, 23, 3,101,158, 8,247, 30,189,214,106,181,218,179, 21, 10, 1,176, 44,163, 43, 20, 88,132,162, 62, + 24, 42, 20,152,155, 66, 96, 98, 2,129,169,105,153, 67,136,229,193,222,222, 94,220,185,115,231,118, 1, 1, 1, 96, 89, 22,171, + 87,175,134, 70,163,225,107,181,218, 18,139, 81,126,126, 62,142, 30, 61,138, 95,127,253,245,174,185,185,121,165, 83,203, 25,157, +234,194,181, 59, 79,187, 12,233,213,134,127,229,198, 78,104,213, 12,114,149,102,200, 87,168,144,175,228, 66, 37,232, 8, 66,110, +131,162, 5,104,234, 95, 23,215,238, 68, 42,245, 90,205,197,170, 10, 33,165, 82,137,248,184,119, 72,136,142,132, 73,110, 50,108, +205,196, 40,136,137,132,255, 87,195,160, 86,171, 43,189,247,225, 1, 68, 59,189, 62, 56,235, 58, 83,224,153, 88,107,154,204,190, + 84,110,168, 8, 19, 19,147, 42, 13, 17,166,167,167,227,204,153, 51,104,220,184, 49, 90,181,106,133,196,196, 68,196,196,196,160, + 75,151, 63, 71,217,158, 62,125,138,176,176, 48,184,185, 85,108, 20,204,205,101,207,103,102,190,233,215,163, 71, 15,222,131, 7, + 15,192,178, 44,220,221,205, 96,102, 42, 1,161, 4,240,246,182, 3, 80,168,253, 91,183,110, 13,181, 58, 81, 39,151,227,124, 69, +156,161,161,161, 93, 3, 3, 3,235,104,181,218,200, 86,173, 90,113,222,188,121,131,190,125,251,226,208,161, 67, 0,128, 57,115, +230, 96,206,156, 57, 31,252, 39, 63, 63, 95, 89, 30,159,103, 3,175,153,117,116,150,173,132, 34,151,218,102, 54,190,168,227,222, + 22, 0,240, 69,183,145,168, 83,183, 38,114,211,159,213, 86, 42,222,245,226,113,178, 44,159,109, 76, 12, 23,117,173, 63, 66,153, +122, 35, 10,128, 33,129,123, 89, 69,212,161,148, 56,238,208,195, 39, 79, 95, 24,215,165,219,151, 92,173, 94,167,171, 95,139,107, +113,228,196,185,212,196,247,113, 63, 33,238,226,139,146,199,164, 98,129,165,207,205,205,133, 68, 34, 65, 76, 76,140,170,123,247, +238, 2,133, 66,129, 55,111,222,148, 8, 44, 59, 27, 43,159,102, 13,235,123, 45, 91,255,235, 37,137, 64, 32,232,216, 58,200, 59, + 60,234,125, 2,203,146,119,229,242,178,236,131, 55,175, 94,119,181,115,172, 11,217,205, 7, 16, 55,239, 2,149,138,130, 82,205, + 64,165, 3,116, 52, 15,230,126,193, 16,185,122,131, 5,240,234,249, 83,232, 88,246,174,177, 89, 54,194, 8, 35,254, 53, 2,203, +198,198,198, 46, 32, 32,200,109,231, 47,135,193,178, 44, 94,135,173, 65, 86,106, 4, 22,252,120,223,205,217,217,185, 85, 66, 66, +194, 77, 67,120, 18, 18, 18, 14, 29, 59,118,108,134,175,143, 79, 64,109,103,103, 60,125,247, 22, 60, 86, 15,158, 94, 15, 74,163, + 2, 71,175,134,115,125, 61, 40, 98,130,164,164, 92,108,191,120,245, 69, 66, 66,194,161, 10, 95, 14,132, 70,141,238,125, 48,232, +139,174, 96,181, 26, 92,110,225, 3,161,169, 9, 4, 22, 22,104,122,244, 6, 8, 33, 96,117, 90,188, 95,254, 45,184, 18, 19, 88, + 53,169, 60, 20, 80, 74, 74, 74, 65,221,186,117, 67, 34, 34, 34, 26,122,122,122, 98,241,226,197,136,143,143, 7,203,178, 72, 77, + 77, 85,166,165,165, 37,102,100,100,188, 35,132,156,144,201,100, 59, 13,137, 20,158,106,153,181,239,202, 31, 87,103, 6,250,251, +184,127,209,106, 17,206,158, 93,136,172,156, 92, 20,168,185,200, 83,104, 32, 87,176,112, 50,115, 71, 35, 95, 95,164,101,170, 17, +245, 50, 52, 33,157,103,181,163, 42,214, 43,138,162,240,244,233, 83,184, 74, 77, 17,121,251, 38,108,196, 92,248, 73, 29, 32,109, +214, 28, 49, 49, 49,134,137, 96, 61, 56,165,103, 11, 90, 88, 88, 32, 39, 39,231, 3, 33, 39, 22,139, 33,149, 74,145,155,155,139, +163, 71,143,130, 53,236,165,168, 85,171,213,240,242,242,194,227,199,143,113,245,234, 85,180,109,219, 22,173, 90,181,194,179,103, +207,112,249,242,101,132,133,133,129, 16, 2,107,107,235, 98,223,159,114, 35,218, 63,122,244,244,136,137, 9,153, 59, 98,196,132, +122, 67,134, 12,193,177, 99, 7, 49,114,132,103,145, 99,187, 0, 95,118,247,196,146,165,143, 17, 28,220, 26,182, 54, 60, 92,185, +250, 50,150,195, 49,255,213,128,124,252,249,231,159,127,230, 40, 20, 10,228,231,231,195,196,196, 4, 25, 25,133,225,168,202,177, + 96,149, 27, 88,237,121,232,171, 53,217,121,108, 22,155, 31,214, 43, 83, 23,214,160,109,199,120,124,209,109, 4,174,156,221,131, +107,151,174,194,138,243,238, 45, 36,121, 23,210,223,166,231, 38,201,221,183,121, 7,142,166, 19,228,151,182, 77,233, 97, 73, 59, + 58, 50, 71,230,108,201,201,174, 32,157, 44, 33,132,100,134,239, 63,125,130,197,151, 77,155, 4,215,173, 95,211,145,159,149,158, +202, 30, 61,117,225,133,230,237,177, 51,197,194,202,128, 85, 17,150,108,216,176,225,123, 0, 96, 24,102,239,250,245,235, 71,207, +156, 57,211, 86, 38,147,149, 8,172,212,244,204,107, 77,187, 78,214,103,100,231,168,119,175,159,213, 87, 36, 20,240,231,175,216, +125, 67, 75,227, 65,185,141, 11,135, 51,108,238,214,223,210,142, 29,217, 67,219, 8,121,184, 59,103, 33,162,175, 94,135,134,226, +161,227,229,135, 80,107,244,200, 77,203,192,245, 81, 19, 97,225, 96,137,243,233, 81,250,156,188,220, 97,198,102,217, 8, 35,140, +248,255, 0,131,166,212,165,167,167,167,222,186,245, 16, 55,206, 46,195,205,179,203,240, 50,236, 41,100,137,106, 36,166, 40, 97, +102,102,118,191, 2,203, 87,251,143, 95, 10, 74,165,178,247,250, 13, 27,146,197, 18, 9, 90,182,107, 7, 7, 91, 59,136,121, 92, +208, 58, 6, 52,225, 34, 63,205, 2, 81,207, 21, 88,126,226,108,170, 66,169,236,253,241,203,225, 99,206, 82,251, 1, 66, 32, 50, + 51, 5,223,196, 4,194,210, 86, 43, 66,192, 51, 53, 3,207,212, 12, 52,143, 95,105, 58, 1,160,160,160,160,207,216,177, 99,179, +242,242,242, 48,104,208, 32, 60,120,240, 32,236,226,197,139,102, 87,175, 94, 21, 61,127,254,188,174, 76, 38,235,144,152,152,184, +189, 60,113,245,151,123,191,113, 67,199,234, 52,125, 54,111,221,153,169,208,218,163,123,143,205, 48,227,103, 64,171,211, 3, 44, + 11, 39, 91, 19, 52,106,246, 45, 82, 85, 77,113,246,204,217, 44, 70,167,236,243,241,146, 57,165, 57, 89,150,101,173,173,173, 63, +176,202, 81, 20,133, 27, 55,110,160, 95,223, 62,232,216,171, 39,108,107,187,194,174,125, 23,116, 28, 61, 30,219,183,111, 7, 69, + 81,176,178,178,250,192,162, 81, 94,126, 22, 35, 39, 39, 7, 46, 46, 46,120,184,186, 75,189, 11,211,189, 2,106, 70,255, 28, 32, +126,178,182,222,181,107,215,176,118,237,218,252,200,200,200,117,238,238,238,223, 86,150,159,132,144,121, 63,254,248,163,226,253, +251,247, 48, 49, 49,129, 78,167,195,221,187,119,177,101,203, 22,172, 93,187, 22, 97, 97, 97,176,182,182, 70,221,186,117, 65, 81, + 20,226,226,226, 20,132,144,121, 21,212, 37, 38, 47,143,211,231,242,229, 19, 25,221,187,183,196,238,221,155,224,224,208, 20, 92, +142, 3, 56, 92, 91, 72, 76,188,176,107,231, 74,116,237, 18,136, 87, 17, 79, 50,243,243, 57,125,110,220,184,161, 51, 32,157,154, +231,207,159,227,248,241,227, 88,178,100,137,110,241,226,197,200,201,201, 41,177, 96, 21,175,146,190,104,209, 34, 0,128, 74,165, + 18,148,199, 57,122,214,243,196,153,203, 94, 44, 73, 73, 78,108,124,243,250,253,193,215, 46, 93, 69,108,212, 53, 92,187,116, 21, +183,175,221,155,147,146,156,216, 56,160,145, 7,175,247,232, 73, 51,247, 29, 63, 70,155,152, 57, 98,223,241, 99,244,160,201,211, +126, 8,234,216,118,158, 1,101,196, 2, 96,243, 83, 83,190,251,113,205,207,249, 58,141,146, 90,253,211,102,153, 34, 45,105, 30, +138,167, 86,150, 99,189, 42,205, 25, 19, 19,179,253,237,219,183,210,183,111,223, 74,223,191,127, 63, 47, 49, 49,177,229,242,229, +203,211,138, 4, 87,161,192,122,121,234,254,171,219,123,126,180,179,177, 20, 53,109, 88,207,115,221,246,163, 55,226,226, 83,126, + 43,142,129, 85, 86, 58,239,223,191,159,165,210,234,198,126, 59,107, 17,155,157,173,134,231,212, 57,208, 9, 76,160,210, 1, 26, +134,134, 6, 28,132, 45, 91, 7, 83,107, 83,220,101,179, 88, 21, 77,141,137,254,200,201,191,178,250, 89, 29, 24, 57,141,156, 70, +206,207,147,243, 95,105,193,114,114,114,106,217,227,203,246,104,221,109, 62, 88,150, 69, 68,232, 42,100,165,189,134,147,131, 0, + 49,113,185, 77, 0,220, 52,244,130, 73, 73, 73,113,142,142,142,141,151,109,216,120,188, 99,112, 35,111,119, 39, 71,129,133, 75, + 45, 72,236,236,144,158,158,134, 7, 33,145,218,173,151,175,189, 80, 40,149, 6, 45,149,195, 48, 12,203, 48, 12,120, 60, 30, 88, +154,134,207,148, 57, 32, 20, 5,138,203, 41,177,236,128, 16,152, 5, 54, 3,225,114,161, 53,208,103, 72, 38,147, 37, 56, 57, 57, +245,153, 60,121,242, 31,123,247,238,165, 90,183,110,237,127,250,244,105,230,239,100,118,202,243, 19,225,246, 13,122,181,218,248, +243,150,163, 1, 65,141,107,185,212,118, 17, 52,117, 54,135, 70,171, 71, 74,106, 6,110,222,123,169,138, 12,127,146,200,106, 52, +125, 82,195,203,143,226, 14, 0, 90,173, 54,206,217,217,217,126,241,226,197,208,233,116,208,233,116,208,235,245, 72, 79, 79,199, +253,251,247,209,160, 97, 48,188, 71,140, 66, 90, 90, 26, 54,110,220, 8,103,103,103,252,248,227,143,200,203,203,195,173, 91,183, +202,205, 87, 46, 13,221,224,193, 69,113,176, 56,208,173,235,214,237, 70,189,122,245,154, 55,214,166,242, 22,110, 44,180,108, 77, + 29, 51,152,119, 35,238,198, 17,129, 64,176, 61, 54, 54,182, 66,127, 33, 55, 55, 55,190, 82,169,244,103, 89,150,206,205,205,221, +160, 84, 42,135, 79,159, 62,221,113,197,138, 21,112,119,119, 71,122,122, 58, 36, 18, 9,220,221,221,145,151,151,135,216,216, 88, +189, 70,163,217,166,215,235,151,164,164,164,164, 85,196,253,232,209,163, 55, 1, 1, 1,141, 83, 83,182, 30,159, 48,190,163,187, + 86, 23,196, 55, 51,107, 1,150,213, 34, 59, 43, 1,192, 51,205,137,147, 87,163,179,179,233,222, 33, 33, 33, 81, 6,245, 56, 40, +106,252,250,245,235, 81,188, 84, 78, 98, 98, 98,137,233,175, 44, 11,150, 33, 88,119, 36, 65, 9,224,192,234,111,154,126,147,155, +254,204,221,138,243,238,109,227,250,204,198,117, 71, 18,148,139,191,177, 88,150,254,238,102,100,146,252,210,182,125,199,143,209, +195,122,245,209, 59,155, 68,205, 17,218,177, 71,219,118,175,212,218,198,250,251,251,215, 32, 36,179, 78,106,198,235,144,145,163, +199,245, 55,231, 41,206,251, 57,103,184, 81, 53, 3,132, 97, 97, 97,111, 13, 93,211,243,163,186, 31, 41,149, 74, 91,174, 89,179, +230, 18,128, 15,124,204, 82,211, 51,175, 53,233, 54,137,205,206,206,121,146, 26,126,234,121,101, 92, 33, 33, 33,187,131,130,130, +240,213,208,145, 59,198,140, 26, 67,215,159, 50, 19,137, 55,174, 1,122, 45,146,111,223,132,200, 68,143,179,233,239,244, 5, 52, + 53, 54, 36, 36,196, 24,197,221, 8, 35,140,248,119, 9,172,132,132,132,155,110,174,206,151, 35, 35, 91,118,168,233,108, 91,216, +235,125, 43, 67, 98,138,234,178,161,195,131, 31,139, 44, 66, 72,208, 57,157,110,192,101, 46,183, 27, 41, 10,197,192, 86, 99,177, +231,130,130,130,148,198,141, 27,151, 19,123,225,199, 50,247,234,245,250, 4, 67,184, 19, 19, 19,111, 72,165,210,161, 77,155, 54, + 93, 33,147,201,142,167,165,165,201,255,110,134,167, 60, 63, 17, 78, 90,183,174, 23,242,240,214, 87, 97, 33, 15,186,177, 44,235, + 11,128, 16,138,250,115,177,231,240,202, 23,123, 86, 40, 20,227,230,207,159,191,157,195,225,212, 68, 81,224,208,226, 44,211,104, + 52,244,238,221,187,133,106,181,154, 6, 64,120, 60,158,206,196,196, 68,121,247,238, 93,157, 94,175,143,211,106,181,227,202,227, +221, 27,198,114, 63,222,231,227,227, 35,121,195, 65,126,241,239, 12, 5, 32,147,201, 86, 25,114,191,231,207,159,119,177,180,180, +236, 64, 8,233,203,178,172, 87, 94, 94,158,234,251,239,191,191,119,253,250,245,220,215,175, 95,119,106,209,162, 5,113,112,112, + 64,108,108, 44,155,159,159,127,148,162,168,121, 50,153, 44,198,208,252, 12, 11, 11,139, 33,132,248,201, 11,216,129,166, 38, 23, +187, 50, 44,252, 0,150, 16, 66,158,231,231,147,243,142,142,174,191, 93,185,114,196,224,169,112, 69,107, 11,246, 40,254, 29, 24, + 24,120,254,245,235,215, 93,138, 45, 88, 31,251, 96, 85, 9,226,252,211, 74,197,187, 62,196,164,224,196,186,159, 18,148, 0,176, +112,125,118, 14,128, 93, 83,122, 89, 49,175, 66,119,173,114, 50,139,154,245,211,137, 76,131,214,228, 11, 8, 8,112,165, 40,106, + 0,128,250,118,130,236,186,182,252, 28, 61, 33,108, 27, 66, 40, 27, 0,207,124,124,124,206, 2, 72,168, 78, 82,101, 50, 89, 36, +128, 90, 31,239, 79,125,121,234, 62,128,251, 85,225, 10, 9, 9,217,221,164, 73,147, 83,155,119,108,219, 71, 19,210,152,232,245, + 22,250,241,131,254, 92,236, 89,192, 31, 22, 98, 92,236,217, 8, 35,140,248, 55, 10, 44, 0,136,142, 73,232, 8, 0,238,238,238, +236,155, 55,111,192,178, 44,249, 59, 23, 46, 18, 80, 7, 97, 96, 16,209,242,240,226,197,139,128,255,100, 6,201,100,178, 3, 0, + 14,124, 74, 78,182,112,168,106,119,209, 86, 45, 36, 38, 38, 62, 7, 16,252,223,168, 36,225,225,225,242,225, 1,164,196,178,197, +165,161, 51,244,191, 29, 58,116,120,175,209,104,174, 2,136, 39,132, 88, 0,200,212,104, 52,151,210,210,210, 82, 28, 28, 28,130, +222,191,127,191,160,200, 18,185, 52, 57, 57, 57,164,154,117,137, 1,240,123,209,246, 73, 17, 26, 26,218, 85, 42,149,134, 89, 91, + 91,187, 41,149, 74,190, 82,169,228,149,214,254, 34,145, 40,205, 80, 46, 11, 83,178,151,199,201,178,182, 48, 37,127, 41,119, 43, + 39, 28, 83,200, 95,120, 90, 57,225, 88, 85,196,165,191,191,255,126,138,162,106,179, 44,107, 15,176,230, 44,139, 52,150,101,211, + 57, 28, 78, 98,120,120,120,226,231,210,208,220, 47, 20, 80,221,140, 77,174, 17, 70, 24, 97, 20, 88,229, 32, 42, 42,138, 24,179, +237,223,135,178, 44, 91,134,160, 40,194,253,189,162,237, 3, 20, 9,170,238,159,251,189,203,100,178, 79, 34,226, 71,207,122,158, + 8, 96, 90, 80, 25,243, 44, 22,110,204,204, 3, 48,179,205,151, 85,227,124,242,228, 73, 28,128, 56, 99, 13, 53,194, 8, 35,140, +248,188, 64, 25,179,192, 8, 35,140, 48,194, 8, 35,140, 48,226,211,130, 0, 40,115, 38, 64, 85, 86,202,174,206,108,130,202,248, +141,156, 70, 78, 35,167,145,211,200,105,228, 52,114,254,255,227,252,215,160,120,218,249,127, 98, 3,208,222,200,105,228, 52,114, + 26, 57,141,156, 70, 78, 35,167,145,243,223,182, 25,135, 8,141, 48,194, 8, 35,140, 48,194, 8, 35, 62, 49,202,117,114,119,117, +173,225, 67,233,153,102, 44, 75,209, 44,197,106, 73,174,226, 80,116,102,230, 7, 65, 0,107,214,172,105,193,165,208,157,176,172, +132, 16, 70,207,208,212,221,152,152,248,112, 67, 46,236,227,227,195, 3, 48,156,203,229, 54,215,106,181,142, 28, 14, 39, 73,169, + 84,222,225,114,185,123,195,195,195, 53,159, 83, 38, 53,111,222,124,208,209,163, 71, 45,186,117,235,166,210,104, 52, 58,129, 64, +192,249,253,247,223, 5, 35, 70,140,200,190,115,231, 78,181,102, 24,250,251,251,183, 93,189,122,117,157,182,109,219,162,121,243, +230,242, 46, 93,186,240,130,130,130,120, 51,103,206,140,125,242,228,201,181,170,112,217,219,219,251,112, 56,156, 95, 9, 33, 52, +203,178, 95, 21,205, 48,252,143,128, 16, 50, 8, 64, 63, 0,142, 0,146, 1, 28,102, 89,246, 64, 53,185, 58,161,208,201,221,183, +104,215, 51, 0,103, 88,150,189,248, 55,210,215, 9, 64,119,154,166,253, 1, 64,175,215, 63,249, 84,156, 92, 46,215, 15, 0,180, + 90,237,211, 79,197, 73, 8,241, 43,178, 36, 87,139, 51, 48, 48,240,123, 62,159, 63, 6, 0,212,106,245,110, 19, 19,147,229,101, +157,119,243,230, 77,117,121,161, 79,124,234, 16, 54,124,150, 87,225,247, 85, 17, 0,128, 74,127,199, 86,115, 22,241,118,111,182, + 44, 94,140,123, 85,237,201, 51, 82,169,244,235, 46, 93,186,204,190,120,241,226, 15, 9, 9, 9, 59, 96,132, 17, 70, 24,241,185, + 10, 44, 87,215, 26, 62,125,123,246,254,113,252,184, 9,132,166, 41,188,138,136,224, 76,156,242, 77, 7,111,111,111, 39,137, 82, +233,205, 2,140, 66, 36,122, 65,211, 84,226,214,205, 63,155,122,122,120,232,245,122, 6,219,182,111,237,236,234, 90, 99,110,101, + 34,203,206,206,174,142,163,163,227,134, 41, 83,166,216,117,232,208,129,178,183,183, 71, 66, 66,130,217,137, 19, 39,234,254,242, +203, 47,221,236,236,236,166,165,166,166,198, 86,231,134, 28, 29, 29, 91,216, 89,160,131,137,144,109,135, 92,130,124, 61,254, 72, + 85,225,114, 82, 82,210,237,234,102,146, 90,173,158, 92, 80, 80, 16,236,237,237,205,110,219,182,141,140, 25, 51,134, 37,132, 16, +133, 66,177, 23,213, 12,225, 32, 22,139, 55,183,109,219,214,189, 89,179,102, 49,247,238,221,235,194,178,236,249,190,125,251,186, +138,197,226, 40, 0, 30, 85,225,162,105,122, 79,120,120,184,159, 82,169, 68, 96, 96,224, 47, 0, 2,255, 67,226,234, 23,107,107, +107,102,235,214,173,219, 27, 52,104,224, 38,151,203, 11, 70,143, 30,221,145, 16,210,150,101,217, 81, 85,224,145, 0,216,104,110, +110,206, 91,182,108,217,131,214,173, 91,199,241,249,124,113,100,100, 36, 59,101,202,148,145,132,144,190, 0,166,176, 44, 43,175, + 42,167, 84, 42, 53, 91,185,114,229,235,128,128,128,123,124, 62,159,247,246,237, 91, 76,157, 58,117,252,223,225,244,242,242, 18, +175, 92,185,242,169,183,183,119,134, 80, 40,228,189,127,255, 30,211,167, 79, 31, 77,211,116, 95,134, 97,170,197,105,103,103, 39, + 89,190,124,249,243,160,160,160,108,161, 80,200,139,142,142,102,191,249,230,155, 49, 85, 73,103,171, 86,173, 6, 82, 20,181,248, +214,173, 91, 0,128, 38, 77,154,124,175, 86,171,231,127,124, 30,203,178,104,222,188,185,178, 85,171, 86, 99,110,222,188, 89,102, + 88,148,125,130, 89,131, 0, 96,230,247, 69,191,139,246,151,245,123,152,106, 85,149,235,188, 79, 29,194, 2,192,196,111,183, 12, + 45,252, 44,220,191,181, 40,116,239,230, 58,132,173,138,104,115,114,114, 26,215,168, 81,163,239, 30, 62,124,184, 47, 40, 40,104, +234,142, 29, 59,184,221,186,117, 91, 38,149, 74,221, 58,117,234,212,247,254,253,251,171, 35, 34, 34, 54, 27,155,120, 35,140, 48, +226,179, 18, 88,148,158,105, 54,126,220, 4, 50, 96,208,192,228,164,148, 84,198,196,212,124,208,225, 35, 71,196, 30, 30, 30,148, +242,231,159,161, 75, 75,131,126,198,140,166, 55,111,222,212, 78,154, 54, 67,161, 82, 22,236,113,180,183, 19, 31, 58,112,208,225, +248,177,163,205, 0,132, 87,100,185,114,116,116,220,112,236,216, 49,135, 58,117,234, 64,173, 86, 35, 35, 35, 3, 90,173, 22,189, +122,245,162, 27, 55,110,236, 48,114,228,200, 13, 62, 62, 62,189,171, 98,201,178,181,181,181,119,175,201, 61,187,112, 90,103,143, +182,173, 2, 37, 14, 78,181,129, 4, 6,137,177,111, 26, 94,125, 24, 58,165,185,155,115,100, 84,174,186, 91, 90, 90, 90, 74, 85, + 51, 41, 35, 35, 99,214,184,113,227,142,249,250,250,218, 10, 4, 2, 56, 56, 56,144,209,163, 71,167, 38, 37, 37, 45,254, 27, 98, +165, 48,175, 41, 74, 95,250,211,208, 5,169, 63,130,179,185,185, 57,204,205,205, 1,192,233,239, 84,136,126,253,250,209,113,113, +113, 99, 24,134,241, 46,189, 63, 41, 41,201,213,214,214, 54,229,237,219,119,126, 10,181, 38,104,194,164,185,139, 6,244,109,111, +113,239,222, 61,116,237,218,149, 34,132, 12,170,130, 37,107, 99,112,112,112,212,138, 21, 43,120, 81, 49,111,235, 61,120,252, 4, + 18, 33, 79,239,236,236, 36,120,246,236, 25,127,229,202,149, 41, 63,252,240,195, 70, 0, 35,171,144,244,141,253,250,245,203,154, + 54,109, 90, 65,100,244,219,218, 15,195,158,179, 38, 2,158,214,222,222,150,190,119,239, 30,119,243,230,205,100,222,188,121, 85, +230, 28, 61,122,116,210,180,105,211, 56,105, 25,217,117,147, 83,210, 89, 62,143,214, 88, 88, 88,112,174, 92,185, 66,237,217,179, + 71, 51,101,202,148, 42,115,118,237,218, 53,101,206,156, 57,220,136,168, 24,215, 7,161,207, 97, 34,224,106, 29, 28,236,232, 7, + 15, 30,208, 27, 55,110,212, 45, 92,184,208, 32, 78,150,101,183,173, 89,179, 6,167, 78,157, 2, 0, 28, 56,112, 0,174,174,174, + 31, 12,251, 43,148, 42, 80, 4,120,251,246,173,120,252,248,241,219, 80, 70,220,185,240, 89, 94,216, 7, 96,216,176, 97,201,134, + 89,161, 86, 85,173, 82,109,247,102,139,133,213,132, 9, 19,202,139,205, 53,212,167, 10, 34,171, 89,179,102,179, 15, 29, 58,100, +115,228,200,145,111, 79,156, 56, 81,220,105, 17,111,218,180,233,235, 30, 61,122, 96,212,168, 81,179, 1, 24, 5,150, 17, 70, 24, +241,121, 9, 44,150,165,104,154,166,144,154,146,174,253,162,125,135,145,155,182,108, 17,240,249,124,168,213,106,200,175, 93, 3, +171, 84,194, 66, 44, 70,151, 46, 93,184,245,235,215, 55, 27, 55,122,244,232,148,100,217,118,154,166, 28, 88,150,162, 43,185,230, +240, 41, 83,166,216,213,169, 83,231,131,157,122,189, 30,153,153,153, 48, 53, 53, 69,255,254,253,109,246,239,223, 63, 28,128, 65, +230,126,123,123,123, 23, 15, 87,251,187, 71,119,205,112,180,179,160,128,180,163,192,251, 55,192,239, 66,184,219,213,132,123,155, +214,146, 30,141, 26, 4,244, 95,189, 59,204,222,222,190, 89, 74, 74,202,187,170,100,210,219,183,111,239, 72,165,210,209, 10,133, +226, 20, 0,234,238,221,187,108, 92, 92,220,184,228,228,228,247,213,205,120,134, 97,144,157,157, 13,134, 97,232,162,223,197,159, +255, 88,101,232,215,175, 31, 29, 31, 31, 63,206,219,219,187,238,206,157, 59,145,154,154, 10,145, 72, 4,189, 94,143,166, 77,155, +214,108,215,174, 93,116, 90, 70,182,165, 86,167, 85, 39, 37, 68, 55, 58,184,227, 93,129,159,187,251,189,195,135, 15, 55,176,182, +182,238,111,136, 53,143, 16,210,201,212,212,148,243,227,143, 63, 82,166, 22, 14, 93, 27, 5, 75,185,207,195, 95,191,227, 9, 56, + 76, 78, 78,110,198,211,167, 79, 35, 22, 46, 92,216,226,244,233,211,201,132,144, 78,134, 12,153, 17, 66, 58, 57, 56, 56,152, 78, +157, 58, 85, 46, 50,181,105,222, 48,216,142,243, 34,252, 77, 34,151, 71,105,155, 53,107,214,230,254,253,251,123,102,204,152,225, +123,238,220,185,156,170,112,214,173, 91, 87, 52,109,218, 52,218,220,194,166,189,173,131,148,182,181,178,112, 3,128,152,152,152, +253, 41, 41, 41, 81, 19, 38, 76,104,120,238,220,185,188,170,112,218,216,216,136,231,204,153,195,169,237,234,217,199,213,221,147, +186,122,227,225,115, 62,159,210, 42, 20,138,204, 87,175, 94,189,153, 61,123,118,208,185,115,231,114, 13,225, 44, 40, 40, 48,117, +114,114,130,189,189, 61, 24,133, 2, 57, 57, 57, 56,126,252, 56,242,242,242,160,215,235, 33, 18,137,240,195,186,237,136,126,241, + 0,183,111,223,134, 66,161, 48,253, 20,245,196,103, 85, 4,194,199, 25, 46,174,182, 50,147,134, 86, 32,172, 80, 74,120, 13,197, +118,111,182,162,225,194, 82,150,171,132, 35, 71,142,216,185,185,185,161,117,235,214, 0,128,145, 35, 71,162,125,251,246, 56,117, +234, 20, 46, 95,190, 28,215,164, 73,147, 55,241,241,241,107, 19, 19, 19,183, 27,155,122, 35,140, 48,226,191,141, 50,157,220, 89, + 66,228, 47, 95,189,226,154, 88, 88, 12,221,180,101,139,128,203,229,226,253,251,247, 8, 15, 15, 71,193, 31,127, 64,113,239, 30, + 82, 82, 82,144,159,159, 15, 91, 91, 91, 44, 95,181, 74,194, 19, 73, 70, 70,189,121, 67,179, 20,171, 45,213,195,254,203, 84, 77, + 62,159,223,188, 75,151, 46,229, 58,215, 39, 39, 39,163, 67,135, 14, 28, 14,135,211,188,156, 94,251,213,143, 94, 90, 68,106, 75, +206, 28,217, 49,213,209,142,243, 28,120, 51, 29,200, 11, 3, 88, 21,160, 83, 3,113, 17,192,201,117,112,202,136, 34, 7, 38,247, +119,112, 18,241,206,144,143,204, 68,149, 77, 41,117,118,118,118,117,117,117,221,213,183,111, 95, 10, 0,154, 55,111, 78, 92, 93, + 93,119, 56, 59, 59,187, 86, 96, 93,168,144, 83,169, 84, 62,200,202,202, 66,183,110,221,172,155, 54,109,122,181, 91,183,110,214, +197,251,171,203, 89, 4,235,182,109,219,102,184,186,186, 30,112,113,113, 17, 24, 96, 5, 41,225,140,139,139, 27,227,229,229, 85, +119,231,206,157, 52, 77,211,216,185,115, 39, 14, 29, 58,132, 59,119,238, 32, 53, 53, 85, 60,125,250,116,139,179, 87, 31, 92,188, +123,231,209,233, 53,243,191,181,238,213,174,181,171,101, 78, 90,174,149,149, 85, 23, 0, 14, 6,166,179,251,252,249,243,111, 62, +121, 21, 99, 71,113,184, 60, 1,143, 43,178,181,177,168,229, 96,107, 89,215,201,218,178,174, 41,159,107,145,155,155, 27,123,242, +228, 73, 29, 74, 5, 33,173,140,115,245,234,213,175, 34, 98,226,173, 41,154,195,229,210, 92,190,133,185,137,245,151,221, 58,180, + 1, 0, 17, 77, 4,185,185,185,241,251,247,239,175, 18,231,138, 21, 43, 66,147,210,178,236,184, 60, 62, 71,192,227, 10,139, 15, + 88,154,153,216, 75, 4, 2, 81, 65, 65,193,251, 93,187,118,169,171,200,249,244,101,212,123, 27, 66,129,166, 64,184,150,150,166, +118,182, 22,166, 14,118,102, 38, 14, 66, 10,194,220,220,220,119, 7, 14, 28,208, 24,202,153,154,154,138,136,136, 8,212,104,216, + 16, 87,175, 94, 69,205,154, 53,209,191,127,127, 12, 28, 56, 16, 34,145, 8,109,155, 52,192,220,185,115, 17, 29, 29, 93,110,185, + 23,251, 67, 85, 4,169, 84,122,163, 42,117, 9, 40, 28, 22,172, 72, 92,125,204, 89,214,121, 31,115, 54,107,214,108,246,241,227, +199,109,214,175, 95,239,255,205, 55,223,196, 28, 63,126, 28,190,190,190,120,245,234, 21,156,156,156,112,240,224, 65, 76,154, 52, + 41,102,209,162, 69,254, 87,174, 92,145, 74,165,210, 89,213,124,142,170, 4, 35,167,145,211,200,105,132, 65, 22, 44, 45,131, 51, +147,167, 78,239,126,236,248,113, 49,159,207,199,219,183,111,145,154,154,138,115,103,206,232,207, 55,104, 80, 64,211, 52,219,251, +216, 49,211,254, 3, 7, 18, 46,151,139,186,117,235,162, 75,151, 46,162,209, 99, 39,164,114,228,138, 67,149, 20,138,157,173,173, + 45,190,251,238, 59, 44, 95,254,161, 63,238,240,225,195,177, 97,195, 6,152,154,154,130, 16, 98,103,200, 13, 56, 58, 58,246, 27, + 57,179,141,179, 89, 45,179, 20, 54,108, 31,151,208, 98, 43,208, 98,128,226, 1, 34, 17,160, 85, 3,106, 10,170,199,119, 50,217, + 54,155,115, 59, 6,228, 57, 37,171, 15,246, 3,112,216,208, 76,178,177,177, 89,112,244,232, 81,219,153, 51,103,178,121,121,121, + 36, 37, 37,133,157, 61,123,182,237,252,249,243, 23, 0, 24, 86,157,140,151,201,100, 75, 71,142, 28,217,113,247,238,221,246,125, +250,244, 49, 47,234,129,167,200,100,178,165,127,167, 64,185, 92, 46,125,237,218, 53,171,109,219,182, 13, 92,182,108, 89,189,118, +237,218, 57,100,103,103,191, 75, 74, 74,234, 91,153,197,141, 97, 24,239,157, 59,119,130,166, 11,141,144, 20, 69,129,207,231,131, +207,231,195,220,220, 60, 59, 38, 38, 70,239, 98, 47,226,203, 83,146,114, 44, 57,150, 92,226,232, 96,109,225,224,216, 90, 46,151, +223, 1, 32, 49, 48,137,190,173, 91,183, 14,191,118,255,133,126,194,240,182,117,197, 60,138,107, 42, 18,210, 34, 62,151, 16,150, +213,107,180,234, 38,155,247, 93,223, 93,187,118,237, 96, 0, 6, 13, 17, 19, 66,252,124,125,125,111,221, 15,139,196,211,151, 49, + 9,182, 86, 98,235, 78,109,155,121,150, 92,176, 81,227,129,165, 78, 55,104,105, 27, 14,135,227,215,160, 65,131,228,184,164, 76, +216,217,152,127, 32,164, 45,109,236,218, 3,128, 60, 39,103,179,163,163,163, 71,209,122,144, 6,165, 51, 40, 40, 40,237, 78, 72, + 36, 28,108,173,172,138,118,155,149, 62, 39, 61, 41,105,155,139,139,139, 7, 33,196,217, 16,206,147, 39, 79, 34, 52, 52, 20, 75, +235,213,195, 76, 23, 23,216,218,218,226,143, 63,254, 0,203,178, 48, 49, 49, 65,118,118, 54, 14, 31, 62,140,118,237,218,253,237, +198, 66, 42,149,222,144,201,100,173, 75, 28,211, 63, 1,138, 57, 13,181,142,221,185,115,231,248,145, 35, 71,190,118,115,115,195, +136, 17, 35, 92,247,236,217, 19,227,233,233,233,218,188,121,115,220,185,115, 7,179,102,205,138, 89,180,104,145,235,240,225,195, +177,119,239, 94, 36, 38, 38,254,102,108,230,141, 48,194,136,207, 70, 96,197,197,197,101,123,123,123, 59,185,185,185, 81,106,181, + 26, 57, 57, 57,184,116,225,130,254,224,225,195,231,212,106,245, 20,138,162,120,123,127,253,117,155,131,163, 99,155,222,125,250, + 16,173, 86,139,246,237,219,243,175, 93,187,102,253, 44, 46, 46,175,162, 11,210, 52, 93, 98, 61,250,250,235,175,177,126,253,122, + 0,192, 87, 95,125,245,167,192,211,106, 13,246, 69, 18,153, 48, 93, 90,181,175,111, 22, 47,249,217, 76,211, 84,155,239, 18,109, +250, 64,146, 47, 10, 2,197,231, 64, 36, 4,163, 22,234,162,178,219,135, 68,191,173,237, 35, 82,166,214,110,230, 25,140, 67, 15, + 78,116,169,138,192, 18,137, 68,141,196, 98, 49, 34, 34, 34, 50, 3, 3, 3,179,205,204,204,204,221,221,221,109, 68, 34, 81,163, +234,102,124, 74, 74,202, 91, 39, 39,167,150,189,123,247,158, 68, 81, 84,123,134, 97,174,102,100,100,108, 74, 73, 73,121,107,200, +255,157,156,156, 38,176, 44,187, 16,192,209,226,125,106,181, 26, 20, 69,129,101, 89,116,239,222, 29, 43, 86,172,240,185,122,245, + 42,110,221,186,101, 53,120,240,224, 7, 82,169, 52,155, 16, 50, 42, 49, 49,177, 92, 43, 89, 70, 70, 6,182,109,219, 6, 14,135, + 3, 11, 11, 11,152,154,154, 66, 40, 20,162,117,235,214, 41,107,214,172,113, 63,112,224,128, 54, 59, 53,149,136,242,114, 84,196, +218, 90, 8,105,205, 78, 67,251, 15,120, 0,224,136,161,247,110, 98, 98, 34,226, 67,149, 71,233,149,212,234, 69,155, 57, 98, 30, +143, 8,121, 28, 8,152, 2,122,238,138,101,172,144,176,220,226, 33, 83, 67, 33, 20, 10,249, 18, 62,171,226, 10, 40,173,152, 98, + 63,201, 56, 43,135,195, 17, 8,184, 80,148,119,156, 71, 17,154, 16, 34, 2,160,170, 74, 58, 77,248,250,114,207, 23, 82,160, 41, +138, 18,150,199,217,175, 30, 97,143, 76, 42, 22, 56, 37, 70, 53,232,116, 58, 52,106,212, 8, 7, 79, 93,199,249, 63,238, 33,253, +253, 51, 76,153, 48, 18,238,238,238,184,116,233, 82,133,105, 42,246,193, 50,160, 83, 80, 40,136,190, 55,175,252,228, 34,191,171, +202,134, 6, 75,115,250,172,138,168,112,118,162,179,179,243, 88,127,127,255, 97, 39, 78,156, 64,155, 54,109,208,173, 91, 55,120, +122,122,186, 14, 30, 60, 24, 0,208,178,101, 75, 44, 88,176,192,117,224,192,129, 56,121,242, 36,206,159, 63,143,160,160,160,169, + 82,169, 52, 85, 38,147,109, 49, 54,247, 70, 24, 97,196, 63, 46,176, 0, 64,160,209,120,170,182,109,131,252,234, 85,240, 47, 95, +198, 89, 63,191,124,157, 78, 55, 67, 38,147,197, 3,128,189,189,253,180,195, 71,142,220,109,255,199, 31,102,234,136, 8, 56, 63, +127, 14,142,135,135,191,161, 23, 46,182, 94,169,213,106, 0,192,175,191,254,138,156,156, 28,228,228,228, 64,167, 51,120, 45, 97, +112,249,104,110,103, 93, 19, 73,136, 2,195,161, 76,222,121, 22, 52, 54, 81,154,202,156,226,236,229, 57, 60, 15, 68, 36,212,147, + 40,178, 85,141, 9,173,134, 50,189, 0,206,205,221,193, 65,217,195,143,229,129,162,168,226,151, 99,102,104,104,104,247,230,205, +155,159, 1, 96, 83,188,191,186, 72, 76, 76,124, 3, 96, 74,117,254, 75,211,244,194,219,183,111,219, 29, 62,124,120,210, 79, 63, +253,196,150, 22, 88,197,223, 57, 28, 14, 88,150,133, 68, 34, 1,135,195,177, 63,121,242,164,253,151, 95,126,185, 25, 64,185,229, + 36, 22,139, 97,103,103, 7, 62,159, 15, 83, 83, 83,200,115,179, 36, 91,127,156,223, 90,108,105,111, 53,101,234, 12,106,236,216, +177,225, 27, 54,108,168,225,224,233,233,253,226,197,139,183,189, 6, 12,188,119,234,212, 41, 69, 21, 28,220,159, 69, 68, 68,208, +238,110, 46, 60, 70,171, 96, 36, 60, 64,248,244, 39,134,111,234, 0, 33, 77,131, 67,192,138,196, 18,187,248,164,164, 56, 0, 73, +134, 16,178, 44,251,244,221,187,119,196, 89,106,207,201,147, 43,179, 37, 28,134, 31,251,248,209,171, 58, 13, 27,121, 3,128,242, +241,189, 19, 2,207,122,166,178,220, 60,145,147,147, 83,140, 33,156, 58,157,238,105, 66, 66, 2,177,178,178,226, 70, 69,189,249, +205,218,204, 84,106,101,111,223, 26, 0,212,153,105,183,136, 66, 41,227,114,185, 78,105, 25, 25, 73, 58,157, 46,206,208,116,198, +198,198, 18,103,169, 61,231,204,185,243, 7, 29, 36, 98, 71, 11,145,192, 92, 72,129, 8, 89, 38,135,175,211, 37,139,196, 18,105, + 66, 98, 98, 10,203,178,229,250, 9,110,101, 38, 13, 45,252,246,203,254,143,172, 59,184, 30, 18, 11,115, 90, 15,174, 86,142, 7, +199, 15,163,247,228,111, 12,122,158, 86, 47, 25,126, 96,245,146,225,229,134,103,248, 72, 16, 65, 54,238,111,182, 60,219,189,111, +252,133, 83, 86,177,131,123,167, 78,157,230,237,216,177, 67, 92,252,251,213,171, 87,104,222,188,240, 81, 94,188,120, 49, 58,118, +236, 8, 63, 63, 63,188,122,245, 10,181,106,213,194,241,227,199, 65,211, 52,119,236,216,177,179, 1, 24, 5,150, 17, 70, 24,241, + 95, 69,185, 10,129, 97, 89, 70,151,153, 9, 86, 85,216,145,230,241,120, 44,203,178, 37,141, 27,151,203, 21,155,155,155, 19,174, +179, 51,136,160,200,213,135, 16,253, 39,176, 26, 64,175, 55,156, 70,175, 7, 13,162, 1,139, 63, 67,252,200,133, 4, 63,216,180, +195, 20,201, 55, 72,230,155,151,126,195,129,213, 49,208,163,106,214, 17, 66, 8, 43,151,203,161, 82,169, 44,221,220,220,206, 41, +149, 74,203,162, 23, 38,251, 79, 21,156, 78,167,139,225,112, 56, 24, 62,124, 56, 80,184,228, 17,212,106, 53,158, 60,121, 2,149, + 74, 5,181, 90,141,187,119,239, 34, 39, 39, 7,106,181, 26, 87,174, 92, 65,173, 90,181,192,225,112, 28, 43,226,101, 24, 6,182, +182,182,176,183,183,135, 74,158, 43, 57,182, 99, 67,215, 85,139,190,179, 25,228,198, 82,191,108, 92,203,184,185,185,101,213,175, + 95,223, 74, 36, 18,101, 5, 6, 6,102,159, 60,121,242,116, 85, 66, 52, 0, 56, 51,103,206, 28,223,224,224, 96, 23, 11, 19,137, + 70,192,167, 33,208,201, 89,129, 42,131,229, 40,210,217, 90,206, 46, 26, 72, 76, 26,245,233,211, 71, 15,224,140,161,156, 83,166, + 76,169,233,237,237,109, 99, 97, 38,201,229, 80, 72,228,233,245,137, 89, 33,247,174, 0, 0,207,198, 78, 1,137, 73,163,193,131, + 7,107,171,194, 57, 99,198, 12, 55, 39, 39, 39,107,138, 34,217, 58,141,230,125, 73,125, 80, 42, 82,104,129, 80, 14,129,176,197, +168, 81,163,116, 85, 76,167,171,175,175,175,181,165,185, 89, 54,151, 34,113, 60,189, 46, 94,196,234, 19,248, 90, 77,154,192,206, + 62, 31, 18,147,102,131, 6, 13, 42, 55,157,197,214,171,143, 45, 67, 28, 14, 7,137,137,137, 40,144, 61, 3, 47, 49, 2,126, 38, + 92, 52,118,176,129, 68, 34,169, 92, 96,141,123, 69,194, 99, 89, 18, 30,203, 18,140,123, 69,202,250, 93,134,200,170,176,238, 87, +232,215,181,221,251, 70,117, 56,207,159, 63,191,178, 71,143, 30,218, 1, 3, 6,224,202,149, 43, 32,132,224,206,157, 59, 72, 76, + 76, 68,199,142, 29,193,178, 44,158, 60,121, 82, 34,190,250,246,237,139,110,221,186, 21, 92,188,120,241, 7, 99, 83,111,132, 17, + 70,124, 54, 2, 75, 43, 16,188,100, 38, 79,134,197,233,211,224, 70, 69,161,111,239,222,102, 2,129, 96,163,163,163, 99,160, 84, + 42,109, 38, 18,137, 54,207,152, 62,221,212,102,249,114, 72,111,221, 66,242,213,171,208,114,185,143,171,114,113,133, 66, 81, 44, + 96,160, 42, 18,114, 22, 22, 22, 85, 18, 88,140, 14,247,147,210,162,192,135, 11, 24,176,249, 23,115, 91, 62, 28, 20, 51,223,238, +108,110, 29,247, 55,114,158,251, 18,219,198,118, 27,107, 53,127, 40, 39,156,124,190,133, 16,178, 68, 25,244, 96,238, 87, 37,157, + 74,165, 50, 71, 46,151,163,110,221,186,214,161,161,161,110,238,238,238, 86, 69,130,230,209,223,201,124,169, 84,218, 36, 32, 32, +224, 72, 96, 96,224,219,128,128,128, 35, 82,169,180, 73, 21,254,254,203,227,199,143, 65,211, 52,198,142, 29,139,188,188, 60,104, + 52, 26,100,100,100, 32, 46, 46, 14,106,181, 26, 9, 9, 9,120,253,250, 53,212,106, 53,222,189,123, 87,146,199, 21, 65,171,213, +194,212,212, 20,217, 25,169,146, 67, 91,215,118, 93,182,104,158, 40, 39, 58, 20, 9,178, 20, 48,122,133,108,193,130, 5, 49,110, +110,110,119, 84, 42,149,151, 78,167,235,194,178,236,161, 42, 8, 85, 10,192, 19,119,119,247, 14,107,214,172,105,190, 96,197, 46, +129, 41,157,199,242, 77, 5, 12,223,148,207,242,189, 26, 99,244,194, 77,194,117,235, 86,223, 15, 9, 9,201, 49,112,102, 30, 5, +224, 73, 96, 96, 96,147,228,228,228,230,126,126,126,254, 14,117, 61,132, 2, 39,105, 58, 95, 90, 43,131, 85, 20, 92,165,106,214, +238,190,103,207,158,219,183,110,221, 74,169, 10,167,189,189,125,243,109,219,182, 5,212,172, 89,179,161,208,220, 92,148,159,157, +189, 67,149,157,185,139,107,227, 32,162,172,109,250, 29, 59,118,236,143,115,231,206,101, 84,133,211,211,211,179,217,242,229,203, +253, 2, 2, 2, 2, 29, 61, 60,133, 34, 39,231, 52,158, 83,173, 84,145,111,144,144,170,229,218,119,215,174, 93,215,239,222,189, +155,110,104,192, 81,138,162,192,229,114, 33,145, 72,112,243,230, 77, 12,234,221, 9, 14,118,102,240,240,244, 68,235,113,147,113, +238,220, 57,240,249,124,252, 93,107,235,199, 48, 68, 16, 85, 85,124, 85,198, 41,147,201,182,132,132,132,252,212,191,127,127,180, +111,223, 30, 79,159, 62,197,172, 89,179, 98,206,157, 59, 7, 0,120,250,244, 41,150, 45, 91, 22,115,255,254,125,140, 24, 49, 2, +205,155, 55,199,147, 39, 79,246, 25,131,143, 26, 97,132, 17,159,141,192,114,179,178, 50, 85, 42, 11, 18,110,221,186,165,161, 40, + 10, 98,177, 24,253, 6, 12,160,126,252,241,199, 22, 61,253,252,174, 13,110,210,228,194,225, 67,135, 2,252, 3, 2, 10,215,219, +161, 40,156, 58,117, 74,145,147,147,157, 81,179,102, 77, 11, 67, 47,158,150,150, 86,210,251, 86, 40, 20, 96, 89, 22,166,166,166, + 85, 18, 88,138,124,234,234,237,155,225, 89,172,254,235,184, 46,111,214,107, 86, 36,247, 12,206,102,244,156, 28,189, 22, 57, 10, + 22,121, 74,112, 30, 82, 86,193,195,221,123,105, 98,219, 7,191,126,248, 54, 44, 67,205,170,171, 52,251, 33, 43, 43,107,222,132, + 9, 19, 50,236,237,237,137,169,169, 41,236,237,237,169,209,163, 71,167,199,199,199, 47,169,110,198,251,248,248, 12,108,210,164, +201,153,176,176,176,190,135, 15, 31,118, 57,114,228, 72,223, 38, 77,154,156,241,241,241, 25,104, 32,197,225,149, 43, 87,202,249, +124, 62, 26, 55,110,140,188,188, 60,168,213,234, 74,183, 74, 5, 43,195, 64, 40, 20,226,200,174, 13, 29,150, 45,154, 39,202,140, +120,136,103,119,174,224,226, 91, 85,193,194, 21, 63, 61, 16, 10,133,213,186, 95,119, 59, 73,131, 6, 82,211, 87,223,140, 28, 32, +155, 51,123,182,249,243,231,207,197,211,191,153,198,202,210,178, 89, 97,215,117, 52,213,122, 1,245, 82,105, 67,122,116,107,139, + 31, 22,207,234, 0, 3,134, 78,125,236, 36, 13,234, 75, 77,195,191, 29, 59, 40,102,202,148, 41,226,149, 43, 87, 22, 52,111,222, + 60, 59, 39, 39, 71,100,110,239, 24, 32,176,179, 15,150,101,101, 75,154, 54,107,246,100,228,200,145,242,170,114, 46, 88,176, 64, +114,251,246,109, 65,167, 78,157,242,114,115,115, 37, 66, 19,147, 96,158,153, 69,203,180,156, 28,179,206,157, 59,135,245,239,223, + 95, 91, 29,206,215,175, 95, 11,154, 54,109,154,151,147,147, 35, 49,179,119,108, 36,180,115,104,145,152,153,101,218,184, 73,147, +176, 49, 99,198,168, 43,226,236,183,233, 79,113, 34, 22,139, 51,189,189,189, 49,127,254,124, 44, 94,188, 24,253,250,245, 67,236, +219, 88,180, 26, 49, 22,117,134,143,199,153,251, 15,145,152,152,136,185,115,231,194,221,221, 29, 20, 69, 37,125,202,198,163, 34, + 65, 84,158, 35,188, 79, 29,114,163, 34, 63,171,202, 68, 86,135, 14, 29, 70,244,232,209, 3,167, 78,157, 42,113,104, 31, 50,100, + 8, 0,192,223,223, 31, 51,102,204,112, 93,179,102, 77,204,186,117,235,208,164, 73, 19, 56, 59, 59,127,105,108,230,141, 48,194, +136,127, 2,101,199,193, 50, 19, 13,216,177,101,179,249,164,105, 51,228,222,222,222,150, 14, 14, 14, 32,132,160, 83,167, 78,164, +201,197,139,166, 92,169, 20,214, 13, 26,148, 44,104,120,251,214, 45, 92,187,118, 77,190,127,247, 47, 78, 35, 71,143,238, 14,148, +239, 51, 91,122, 88, 45, 35, 35, 3, 14, 14, 14, 37,179,213,100, 50, 25, 28, 28, 28,192,227,241, 64,211, 52,167,104,233,151, 10, +213,150,131,131,195,175, 43,150,189,156,147,224, 59,163, 78,176,152, 34, 23,228,201,208,179, 44,184, 68, 15, 40, 88,104,245,128, + 74,203, 34,168, 54,109,245,135, 26,150, 15, 95, 94,142,117,112,112,248,181, 42,153, 20, 19, 19,115,221,209,209,113, 92, 65, 65, +193, 81, 0,212,131, 7, 15,152,183,111,223, 78, 52,212, 33,189, 44,136, 68,162, 89, 71,143, 30,181, 90,178,100, 73,214,181,107, +215,114,218,182,109,107,190, 98,197, 10,171,129, 3, 7,206, 66, 25,193, 32,203,120, 17, 41,164, 82,233,190,164,164,164,137, 13, + 27, 54, 68,102,102, 38, 52, 26, 13, 66, 67, 67,225,238,238,142,144,144, 16,120,120,120,224,241,227,199,240,244,244,132, 94,175, +135, 82,169,132,222, 0,245, 42,139,127,111, 34, 86,101,153,201, 30, 94, 64,228,243, 80,156,143, 81, 21,172,222,125,232,124, 3, +255, 32,121,241, 12,195,170,192,211, 94, 82,207,201,206,250,242,138,197,223,219,189,187,126, 8,199,119,111, 98,174,159, 63, 95, + 95,100,134, 97,205, 6, 76, 29,168,209,194, 5, 4,130,150,205,154,162,187, 85,164,158, 87, 3, 41,127,188,172, 56,146,185,167, +189,164,158,212,214,250,210,234,229, 75, 76,163, 47,238,197,225,237,235,216,163,191, 30, 8, 80, 2,245,220,220,220,186,211, 52, +109, 15, 64,161,215,235,163, 97,224, 18, 52,101,113,254,113,246,108,160, 18,168,231,236,236,220,157,203,229,214, 0,160,210,106, +181,239, 63, 5,103,221,186,117,187, 19, 66,156, 0, 40,139,124,174,170,180, 84, 78,251,246,237, 87,239,218,181,107,186, 74,165, +178, 42,101,109, 37,167, 78,157,130, 70,163, 33, 60, 30,143,145, 72, 36,136,139,139, 99, 1, 36,177, 44, 59,254, 83, 53, 28,125, +250,244,193,131, 7, 15, 22, 3, 88, 88,209,121,153,153,153, 28, 43, 43, 43, 93,101,194,203, 80,206,135, 15, 31,174, 28, 51,102, +204,204,139, 23, 47, 38, 44, 90,180,200,127,248,240,225, 56,121,242, 36,106,214,172,137,215,175, 95, 99,250,244,233, 32,132,184, +174, 89,179,230,201,193,131, 7, 29,147,147,147,215, 26,155,121, 35,140, 48,226,179,177, 96, 17,134,112,221,235,214,213,171, 11, +242,247,140, 30, 49,162,224,229,203,151,208,235,245,208,233,116, 80, 62,122, 4,249,197,139,208,235,245, 96, 89, 22, 15, 31, 60, +192,148,201,147,243,149, 5,249,187,106,215,118, 97, 9,203,150, 76,215, 39,132,180,255,152, 91, 93,202,140,162, 80, 40,160, 80, + 40,192,225,112, 96,106,106,138,212,212, 84,240,249,124,136, 68, 34,248,249,249, 81,206,206,206,221,254,146,182,143, 56, 67, 67, + 67,181,200, 85,245, 61, 53,124,106,146,115,129,142, 29,103, 81, 27,181,120,162,146, 89,136, 14,102, 4, 95,250,113, 97,207, 75, +103,159,237, 29, 36, 35,186,156,190,161,161,161,218,138, 56, 63,134, 84, 42,245,240,241,241,217,210,167, 79, 31, 10, 0, 90,180, +104, 65,213,171, 87,239,103,169, 84, 90,238,146, 54,149,113, 10,133, 66, 1, 0, 92,189,122, 53,243,246,237,219,157,174, 94,189, +154, 89,122,191, 33,156, 20, 69,237,216,186,117, 43,196, 98, 49,116, 58, 29,212,106,117,137,255, 85,233, 79,141, 70, 3, 27, 27, + 27,252,241,199, 31, 96, 24,230, 92,101,233,244,174,239,155,159,195,177, 72,217,119,230, 26, 46,188,211,228, 87, 85, 92,149,230, +172,235,104,226,233, 96, 99,125,101,245,143, 75,109,179,222,132, 34, 33, 33,129,189,116,241,220,125, 5,203, 38,102,228,176, 63, +100,230,177, 62,249, 74, 86, 28, 84, 27,241,231,126,158,206,126,219, 4, 58, 16,176, 21,113,214,115, 52,241,116,178,181,190,180, +118,245,143,166,217,111, 66,145,148,156,140,243,231,206, 60, 81,176,108, 34,203,178, 23, 89,150,157,160,211,233, 26,233,116,186, + 70, 44,203, 78, 40, 79,180, 84,149, 83,163,209, 4,107, 52,154,224, 79,201,201, 48, 76, 48,195, 48, 6,115,254, 57,131, 16,152, + 63,127,254,163, 91,183,110,245,127,244,232, 81,187,226,237,197,139, 23,109, 99, 99, 99,219, 38, 36, 36,180,137,157, 37,160,159, + 63,127,206,121,252,248, 49,247,241,227,199, 53, 67, 66, 66, 46, 26, 90, 63, 43,120, 22, 74,139,252, 69, 50,153,140,148,201, 57, +238, 21,217,188,230,235,253, 71,142, 28,177,255,100,156, 0, 34, 34, 34, 54,239,218,181,171,150,147,147,147,227,192,129, 3,177, +119,239, 94,236,218,181, 11, 64, 97, 36,251, 82,150, 43,187,144,144,144, 58,101, 5, 25,173,238,189, 27, 90,231,141,156, 70, 78, + 35,167, 17,229, 11, 44,194,232,245,122, 6,118,246,118,166,105,169,169,155, 38, 76, 24,159,177,100,201, 18,229,205,155, 55,161, +142,136,128, 50, 44, 12, 87,174, 92,193,212,169, 83, 11,198,142, 27,151,164, 44,200,223,224, 96,111,103,163,215, 51, 32,132,169, +208, 66, 66, 81, 84, 76, 84, 84, 84,113,111, 27,155, 54,109,210,105, 52, 26,152,154, 22, 6,153,222,185,115, 39,195,178, 44,218, +181,107, 39,225,114,185, 6, 45, 65,146,152,152,248, 44, 55, 78,214,241,216,128,241,209,175, 14,157,206,242,205,208, 96,136, 72, +138, 1,129,128,143,105, 28, 18, 31,254,146,117,111, 75,207,232,130,204,248, 78,137,137,137,207,170,154, 73,246,246,246, 11,127, +255,253,119,187,208,208, 80, 86,165, 82, 33, 49, 49,145,157, 53,107,150,157,189,189,253,194,234,102, 60,203,178, 36, 59, 59, 27, +132, 16,166,168,178, 50,197,251, 13,229, 72, 72, 72,120,113,228,200,145, 83,215,175, 95,135,179,179,115,137,200,250, 88, 96,113, + 56, 28, 16, 66,176,117,235,214,108, 66,200,119,149,241, 10, 4, 2,236, 60,122,241,194,183, 91,143, 31, 62,124,245,209,241,234, + 90,174, 0,128, 79, 81,139, 86, 46,253,222, 46,253,213, 3,242,226,254, 53,230,208,211,164, 20,157,158,157, 84,230,201,121, 50, +182,168, 82, 86,236,219, 67,209,139, 86,254,184,196,188,120,248,242,247, 80, 89, 46,209,179,147,255,222,147,240, 63,194,249, 15, +162,112,166,159,140, 72,165, 82, 28, 59,118,172,202, 62, 88, 62,117,200, 95,156,219,171,203, 41,147,201, 86,125,241,197, 23,178, + 69,139, 22,109, 81, 42,149,242,162,206,155,102,237,218,181,107, 38, 77,154,148,146,152,152,104,180, 92, 25, 97,132, 17,255, 40, +202, 28, 34,100,104,234,238,182,237, 91, 59, 31, 58,112,208,129,166, 41,135,216,216,183,143,191, 26, 53, 42,241,214,173, 91, 86, +220,186,117, 27, 81, 20,197,168,231,204,185,159,159,155,147,249,235,158,221,181,106,215,118,241, 43, 90,236,153,101,104,234,110, + 69, 23,204,204,204,220, 59,109,218,180, 70,251,246,237,227,173, 90,181, 74,158,152,152,120,249,193,131, 7,157,183,108,217, 34, +220,185,115,103, 65, 94, 94,222,233,243,231,207,247,104,211,166,141, 78,173, 86, 23, 24,122, 35, 41, 41, 41,225,132, 16,111,106, +237,174,193,175,183,254,254, 5, 75,147,102, 80,241, 64, 88,221, 93, 74, 39,191,146, 34,147,253,206,178,172,174, 58,153, 36, 18, +137,252, 68, 34, 17,222,188,121,147,213,168, 81, 35, 53,159,207,231,185,184,184, 88,139, 68, 34,191,191, 33,176,216,172,172, 44, +176, 44,203, 1, 64, 24,134,225, 20,237,175, 82, 12, 39, 30,143, 55,112,228,200,145,167,182,108,217,210,161,125,251,246,112,117, +117,133, 86,171,133,135,135, 7,212,106, 53,220,221,221,161, 82,169,176, 97,195, 6,228,231,231, 79, 79, 76, 76,204,170,140, 83, + 40, 20,130,207,231,195,211,187,126,129, 80, 40, 68,117,197, 21, 0, 72,184,148,235,235,179,187,145,154,145,206, 28,126,154,146, + 82,160,209,119,140, 74,149,191,252,248,188, 2, 61,228,109, 70, 76, 73, 4, 0, 21,131,252, 10, 57,249,112,141, 60,183, 19, 41, +169,233, 56, 20,150,148, 45,215, 48,157, 94,151,193, 89,165,116,254,143,112,246,219, 20,129,214, 95, 27,126,238,145,113,159,166, +161, 40,109, 85, 50, 20,225,177, 44,193,118,111, 22,219, 55,149, 25,227,170, 58,156,165, 58, 85,219, 1,108, 7, 0,103,103,231, +232, 41, 83,166,204, 76, 76, 76, 92, 95, 20,239,106,161,177,105, 55,194, 8, 35, 62, 75,129, 21, 19, 19, 31,238,234, 90, 99,238, +241, 99, 71,155,177, 44, 69,179,132,200, 1,234,204,203,151, 47,179, 75,159,231,102,101,101, 58,114,204,200, 1,132, 33, 92, 66, + 24, 61, 67, 83,119, 99, 98,226,195, 43,105, 24,159, 15, 27, 54,108, 83,155, 54,109, 70,233,245,250, 85, 81, 81, 81,151, 61, 61, + 61,159,116,234,212,233, 91,157, 78,183, 38, 58, 58,250,178,151,151,215,149, 67,135, 14,205,210,235,245,223, 87, 81,180,232, 80, +232,255,181,239, 83,102, 18, 69, 81, 75, 88,150, 53, 23,137, 68, 57, 33, 33, 33, 7, 90,182,108, 57,136,101, 89,115,138,162,114, +170,203,169, 86,171, 39,231,229,229,217, 12, 28, 56, 80, 75, 8,241,236,213,171,215,156,168,168, 40,174, 92, 46,143,169, 10,207, +187,119,239, 84, 46, 46, 46, 61,190,254,250,235, 93, 60, 30,175, 29, 10, 67, 54,176,165,242, 4, 44,203, 66,175,215,159,150,201, +100, 21,230, 11,151,203,205,239,220,185,179, 73,165, 86, 41, 62, 63,223,208,244,229,169,245,211,182, 94,123,185, 92,169,101, 89, + 29,195,142,123,157, 34, 47,115, 10,217,163,215,108, 61,131, 57,149,204,180,141,151,194,151,171,180, 12,163, 99,216,241,229,113, + 86, 5,255, 43,156, 0, 48,129,218,180, 31,219, 55,149, 56,188, 23, 15, 27,126,252,251, 63,133, 34,139, 19, 11,160,242,197,206, +139, 44, 86,149,173, 93, 88, 37,206,143, 80, 52, 75,208, 56, 83,208, 8, 35,140,248,188, 80,252, 2,254, 79,108, 0,218, 27, 57, +141,156, 70, 78, 35,167,145,211,200,105,228, 52,114,254,219, 54,202, 40, 49,141, 48,194, 8, 35,140, 48,194, 8, 35, 62, 45, 8, +128,246,229, 88,182, 12,142, 21, 85,157,217, 4,149,241, 27, 57,141,156, 70, 78, 35,167,145,211,200,105,228,252,255,199,249,175, +129,113,136,208,200,105,228, 52,114, 26, 57,141,156, 70, 78, 35,167,113,136,208, 56, 68,104,132, 17, 70, 24, 97,132, 17, 70, 24, +241, 89,195, 40,176,170, 1, 66,200, 87,132,144,139,132,144, 23,132,144, 75,132,144,175,254, 6,151,136, 16, 50,167, 20,223, 5, + 66,200, 44, 66,136,192,152,211,159,117, 29,160,141,185, 96, 68,117, 81, 20,188, 56,180,162, 96,197, 70, 24, 97,196,255, 54, 56, +229, 29,112,115,115,187, 71, 81, 84,157,226, 69, 98,139, 35,163, 23,127,255,248, 55, 0,176, 44, 27, 27, 30, 30,222,180, 60,206, + 58,117,234,148,112, 22,111,132, 16,104,181, 90, 83,154,166,243,202,226,212,235,245, 9,175, 95,191, 14,250,140, 94,172,251,173, +172,172,152,109,219,182,109,246,245,245,173,155,151,151, 87, 48,102,204,152, 46,132,144,246, 44,203, 14,173, 34, 87,125, 66,200, +175, 13, 27, 54, 60, 62,105,210,164, 35, 62, 62, 62,102, 10,133,130,127,224,192, 1,135,109,219,182,221, 38,132,140,100, 89, 54, +220, 88, 77, 63, 31, 56, 58, 58, 6, 16, 66, 54,185,187,187, 7, 73,165,210,199, 0, 38,202,100,178,167,198,156,249,175, 62,131, +163,249,124,126, 39,119,119,247, 70, 42,149, 42, 43, 54, 54,246,145, 94,175,255,158,101,217,228, 79,196,111, 14,224,123,129, 64, + 16,236,230,230, 86, 35, 42, 42, 42, 94,163,209, 60, 4,176,132,101,217,156, 79, 33,174,130,131,131,239,252,248,227,143,214,223, +125,247,221, 29,169, 84,218, 92, 38,147, 69, 26, 75,214,136,127, 2, 53,107,214,180,144,203,229,187, 56, 28, 78,128, 64, 32,112, + 48, 49, 49,129,137,137, 73,178, 64, 32,120, 34, 22,139, 71,157, 59,119, 46,219,152, 75,159, 88, 96,209, 52,237,252,232,209, 35, +187,226,197,151, 25,134, 1,195, 48, 96, 89,182,228,179, 24, 69,113,150,208,166, 77, 27, 77,133, 23,227,112,106,132,134,134,218, +153,152,252, 25,106, 73,163,209,192,215,215,151, 9, 11, 11,179,251,120, 33, 97,181, 90,141,192,192, 64,246,115,201, 44, 66,200, + 16,107,107,107,249,251,247,113, 45,149, 42, 77,240,152,201,223,205, 29,210,247, 11,203,187,119,239,162,123,247,238, 52, 33,228, + 43,150,101,127, 53,144, 75, 68, 8,249,101,238,220,185, 43,185,124,177,221,177,115,119,232, 13, 59,246,191,247,247,168, 77,166, + 76,153,104, 50,105,210,164,199, 62, 62, 62,187, 9, 33, 45, 88,150, 85, 25,171,234,103, 81,254,156, 26, 53,106,156, 90,190,124, +185, 83,114, 82, 18,214,173, 95,223, 24,192, 22, 0,141,141,185,243, 95, 43,131, 57,139, 23, 47, 94, 62,120,240, 96,232,245,122, + 40, 20, 10,233,155, 55,111,234,205,159, 63,191, 23, 33,164, 17,203,178, 49,127,147,223,214,221,221, 61, 98,218,180,105, 86,141, + 26, 53, 2, 69, 81,200,201,201,145,222,190,125,187,241, 47,191,252,242, 21, 33,196,139,101,217,180,191,115, 13, 75, 75,203,223, +214,172, 89, 99, 45, 16, 8,176,103,207, 30,235,254,253,251,223,150, 74,165, 45,170, 43,178, 8, 33,148,181,181,245, 20, 0,109, + 25,134,225, 3,120,152,149,149,181,140,101, 89,141,177,198, 24, 81, 17,108,108,108, 70,231,229,229,109, 22,139,197, 60, 51, 51, + 51,136,197, 98,112,185, 92,240,249,252,154,150,150,150, 53, 77, 76, 76,186, 12, 26, 52,104,226,129, 3, 7,118, 25,115,235, 19, + 10, 44,138,162, 32, 18,137,112,248,240, 97,208, 52, 13, 46,151, 11, 46,151, 11, 30,143, 87,230,247,154, 53,107, 26,210, 16, 0, + 0,206,156, 57, 3, 51, 51, 51,152,155,155,195,203,203, 11,132, 16, 8, 4, 2,252,241,199, 31,224,114,185,224,112, 56,224,114, +185, 8, 10, 10,250,192, 82,246,223, 64,191,122,132, 5,202, 14,222,216,181,158, 9,186, 79,254,177, 79,129, 82,211, 14,128, 60, + 59, 43, 43,235,241,241,227, 50,127, 15, 15,222,225,195,135,253,172,172,172, 6, 1, 48,116, 33,233,169,141, 27, 55, 62,205,242, + 36,246,195,134,143, 24, 54,138, 67,105,190, 26,247,237, 15,241, 73,233,242,177, 99,199, 30, 63,125,250,244,176,141, 27, 55, 70, + 77,156, 56,113, 10,128, 85,134,166,223,197,197,229, 30, 77,211,197,150, 71,217,155, 55,111, 2, 62,147, 23,163, 20,192,106, 0, + 90, 0, 43, 89,150,141, 40,117,204,131,199,227,173,210,104, 52,153, 0, 22,178, 44, 27,255, 57, 62, 44, 78, 78, 78, 94, 67,135, + 14,181,201, 76, 79,199,186,245,235,139,119, 7, 25,178, 40,249,167, 70, 96, 96, 96, 29,161, 80,184, 26, 64,128, 74,165,114, 2, + 0,145, 72,148,200,178,236, 9,133, 66, 49, 47, 52, 52, 84, 81,205,114,170, 1,160, 30, 10,103, 24,151, 5,118,249,242,229, 81, +115,230,204,137,249,111,115, 18, 66, 92,236,237,237,127,236,215,175, 31,206,157, 59,135,243,231,207,107, 69, 34, 17,103,248,240, +225,100,226,196,137,150,211,166, 77,235, 2,224,167,191,153,181, 93, 22, 47, 94,108,229,237,237,141,163, 71,143,226,217,179,103, + 10,119,119,119, 81,235,214,173,193,225,112,172,230,206,157,219, 25,192,222,191,115,129,172,172,172,101, 75,151, 46,221,183,105, +211, 38,211,216,216, 88, 44, 89,178,196,102,210,164, 73, 55,165, 82,105, 43, 67, 69, 86,145, 11,193, 20, 0,109,104,154,110, 49, +124,248,112,221,228,201,147,185, 20, 69,105,215,175, 95,111,251,203, 47,191, 12,176,177,177, 9, 72, 79, 79,207,135, 17,168,192, +144,160, 97, 24,134, 11, 64,200,178,172,170,178,223,255,159,238,221,218,218,122, 66, 86, 86,214, 22,169, 84, 10, 91, 91,219,146, +119, 45,195, 48,144,203,229, 80, 40, 20,168, 83,167, 14,207,219,219,123,231,164, 73,147,184,155, 54,109,218,106,172, 49,159, 72, + 96, 17, 66,192, 48, 12,184, 92,238, 7, 2,171, 88,252,124,252,189,204, 86,243,163,169,154, 20, 69,145,252,252,252, 18,113,101, +102,102, 86, 98, 9,211,106,181,127,225,213,235,245,160, 40,138,173,136,179,156,180, 79, 0,240, 7,203,178,209,134,100, 66,105, +206, 35,147,188,176, 79, 48,107, 80,113,200,243, 46,223, 22,126,238, 3,112,245,205,184, 85,171,154, 53,171, 49,101,193,198, 69, +138, 12, 89,250,220,161,221, 93,220, 29,172, 69,146,236,212, 28, 75, 79,207,238, 0, 82,170,144,206,230, 99,199,142, 61,122,252, +234, 75,161, 80,200,227,113,104,154,219,188,129,135,117, 13,115,218,220, 20, 48,143,143,137,186,247,213, 87, 95,141,153, 56,113, +162, 85,177,192, 50,228,222,185, 92,174,243,195,135, 15,237, 56, 28, 14,154, 53,107,166,175,202,189,127, 42,148,195, 57, 63, 37, + 37,101,160, 82,169, 68, 80, 80,208,151,132,144, 54, 44,203, 62, 33,132, 52,232,209,163,199,237, 35, 71,142,152,134,133,133,161, +113,227,198, 34, 0,253,255,193,116,254, 5, 82,169,244, 50,128, 47,104,154,134, 90,169, 84,175, 94,251,193, 50,119, 33,165,197, +213,127, 35,157,254,254,254, 94, 98,177,248,222,218,181,107,205,124,124,124, 8,151,203,133, 78,167, 67, 84, 84, 84,141,253,251, +247,143,123,252,248,113,231,192,192, 64,159,143, 23, 53, 55,240,222,235,221,190,125, 91,238,234,234, 90,102,221,201,205,205,229, +120,120,120,180, 2, 16,243, 15,112, 38,164,164,164,244,252,226,139, 47,198, 39, 39, 39, 71,232,116,186,217, 0,234,219,216,216, +132,245,238,221, 27, 34,145,168,141, 33, 2,171,162, 50,178,179,179,235,209,180,105, 83,108,218,180, 9, 43, 87,174,108,207,178, +236, 31,132,144,118,185,185,185, 87,191,252,242, 75, 88, 88, 88,244, 44, 75, 96, 85,161, 46,121, 52,106,212,104,231,244,233,211, + 77,207,157, 59, 7,119,119,119,228,228,228, 96,196,136, 17,118, 27, 55,110,188, 33,149, 74, 91, 23,139,172,242, 56, 9, 33, 62, + 2,129, 96,239,129, 3, 7, 76, 92, 93, 93, 93,121, 60, 30,229,234,234,138,204,204, 76, 40,149, 74,193, 15, 63,252,208, 64, 36, + 18, 61,253,233,167,159,246, 2,232,253, 79, 62, 71,132,144, 28, 0,102, 0, 44,170, 50,188, 90,193,189,231, 0, 16,148,106,239, + 32, 20, 10, 33, 20, 10, 33, 16, 8, 16, 27, 27,123,140,166,233, 17, 69, 29,185, 74, 57,201,159, 61,120, 63, 66,200, 35,154,166, + 43,252,253,241, 82,102,255, 68,187, 68, 8,113, 38,132,108, 0,208, 6,133,126,212, 55,237,236,236,166, 38, 39, 39,191, 55,148, + 83, 42,149, 90,231,231,231,255, 36,149, 74, 97,103,103, 87, 44, 54, 17, 20, 20, 4,165, 82,137,151, 47, 95,130, 97, 24, 68, 71, + 71,195,204,204, 12, 13, 26, 52,248,105,241,226,197, 71, 23, 46, 92,152,241,159,188,247,127,141,192, 42, 86,178, 28, 14,231, 3, +129,245,241, 86, 44,134, 8, 33,149, 46, 84, 76, 8,161,212,106,117,137,184, 50, 55, 55, 47,249,175, 78,167, 43, 83, 96, 85, 83, +153,251, 50, 12, 83,135, 16,178,221, 80,145,245, 49,134, 13, 27,246, 23,127,142, 57,115,230, 36,164,167,167, 51,125, 58,250, 73, + 34, 46,200,146,220, 44, 77, 68,182,166,166,181,133,150, 86, 22,249,249,249,183, 0,152, 84,225, 18, 78,222,222,222,230,155,247, + 93,144,141,249,102,249,210, 32, 87,107, 51, 95,103, 27, 75, 7,115, 17,223,132, 34,114,161, 78,155, 32,145, 72,124, 0,100, 84, + 37,221, 20, 69,193,204,204, 12,167, 79,159, 70,177,255,220,103, 2, 75,133, 66,129,172,172, 44,108,219,182,205,108,252,248,241, +215, 9, 33, 83,123,246,236,185,233,200,145, 35,146,236,236,108,104, 52, 26, 0, 80,124,134,207,201, 82, 75, 75,203,150,109,218, +180,225, 31, 60,124,152,207,178,172, 28,133,203, 17,229,179,108, 57, 11, 87,255, 7, 33, 20, 10,191, 93,182,108,153,153,143,143, + 15,201,200,200, 0,195, 48,160, 40, 10, 54, 54, 54,152, 57,115,166,112,254,252,249, 78,175, 95,191,158,139,106, 44, 59, 3,128, +148, 39,132, 0,192,204,204, 76,135,170, 79,142, 41,147, 83,167,211,145,102,205,154,205, 76, 79, 79,111,160, 80, 40,126, 48,224, +197,163, 3,112,186,104, 43,110, 83,158, 70, 68, 68, 40,250,247,239, 47,170, 93,187,118,240,223,205, 91, 15, 15,143, 38, 92, 46, + 23, 15, 31, 62, 84, 1,184, 89,180,251,230,179,103,207, 84,189,123,247, 22,212,168, 81,163,137,161, 92, 82,169,212,195,205,205, +237,138,141,141,141,168,120,218,118,215,174, 93,185,171, 87,175, 54, 77, 72, 72,128, 70,163,193,156, 57,115,208,173, 91, 55, 88, + 90, 90, 98,228,200,145,246, 59,118,236,248, 13, 64, 96, 5,109,168,144,207,231,255,250,230,205, 27,119, 71, 71, 71,209,131, 7, + 15,224,235,235,139,244,244,116, 36, 39, 39, 35, 63, 63, 31,201,201,201, 24, 53,106,148,221,186,117,235,164,159,209, 51,148,205, +227,241, 32, 22,139, 45,178,179,179,115,254, 6,143, 0, 0,191,180,184, 18, 8, 4, 16, 8, 4,248,216,197,228,255, 35, 8, 33, + 78,132,144,112, 30,143, 39, 16,139,197, 60,138,162, 32,145, 72, 58,214,168, 81,227,229, 87, 95,125, 85,255,215, 95,127,125,103, + 8,143, 82,169,252, 85, 36, 18,113,109,109,109, 1, 0, 29, 58,116,192,240,225,195,145,150,150,198,200,100, 50,120,121,121, 81, + 55,110,220, 64, 74, 74, 10,158, 62,125,138, 70,141, 26,113,173,172,172,126, 5,208,217, 40,155, 62,161, 5,139,195,225,148,108, +101, 89,174,138,183,143, 29,223,203,227,212,235,245,176,183,183,135, 88, 44,134, 88, 44, 46,237,204,254, 23,126,150,101,171, 53, + 68, 40,145, 72, 48,120,240, 96,118,235,214,173,227,139, 68,214, 27, 67,255,219,111, 83, 68,137,213,234, 99,248,250,250,222,157, + 55,111, 94,167, 75,151, 46,101, 5,185,214,230, 72,100,239,243,133,102, 22, 22,112,174,217,245,171,126, 3,238, 1, 56, 80,133, +100,202, 84, 42, 21,207,205, 89,172,166, 40, 37,169, 41,224,152, 58, 74,120, 2, 7, 75, 75, 39,158, 90,149,106,102,105,201, 47, + 26, 50,147, 85, 70, 84, 60,121,128, 16, 2, 11, 11, 11,110,209, 39,236,236,236, 4,245,235,215, 79,161, 40, 10, 44,203,202,158, + 63,127,110,240,112,161,171,171,107, 8, 69, 81,206,132,144, 15, 38, 36,148,222, 24,134, 73,120,249,242,165,161, 19, 16,230,249, +249,249,181,218,178,101,139,173,187,187, 59,182,109,219,102,118,244,232,209,189,191,253,246, 27,178,179,179,241,238,221, 59,140, + 26, 53, 42, 23,133,195,136,159, 21,172,172,172,238,244,235,215, 15, 59,119,238,100,139, 58, 17, 18, 66,136,175,185,185,249,235, +240,240,240,255,186,159, 11, 69, 81, 29,189,188,188, 72, 78, 78, 14, 24,134, 1, 77,211, 37, 29, 33,154,166,241,237,183,223,138, + 70,141, 26, 53,191, 73,147, 38, 51,185, 92,110,174, 78,167, 59,152,159,159,255,195,139, 23, 47, 62, 43,103,213, 22, 45, 90,124, + 19, 31, 31,223,173, 86,173, 90,103,254, 70,111,159,109,216,176,161, 26,128,136,166,105,238, 39,120,129,209, 69,237,145,178,120, +113,120,150,101,117,129,129,129,202,162,151, 59, 93,133,122,243,219,254,253,251,157,157,157,157,161,213,106,161,211,233,144,159, +159,143, 27, 55,110, 64,165, 82, 65,167,211,193,203,203, 11, 43, 87,174, 84, 78,156, 56, 81,120,232,208,161, 84,133, 66, 49,164, + 18,218,169, 71,143, 30,149, 56, 58, 58,138, 20, 10, 5, 98, 98, 98, 16, 24, 24,136,188,188, 60,200,229,114, 20, 20, 20, 64,163, +209, 32, 55, 55,215, 66,175,215,171, 63,155, 23, 13,135, 3,129, 64, 0, 30,143,151, 93,171, 86, 45, 16, 66,132,239,222,189,171, +206,144,155, 25,128, 92, 46,151,203, 47, 45,172, 4, 2, 1,158, 63,127,126,168, 60,235, 85, 69,245,167, 42,191, 63, 3,129,181, +129,199,227, 9,172,172,172,120,197,251, 52, 26, 13,207,210,210, 18,181,107,215,222, 4,160,139,129,109,136,191,165,165, 37, 8, + 33,224,241,120, 24, 51,102, 12, 30, 61,122,116, 34, 33, 33,225,171,212,212, 84, 20, 20, 20,252,106,110,110,222, 43, 53, 53, 21, +122,189, 30,111,223,190,133,191,191,191,191, 81, 50,125, 98, 11, 86,121,130,234, 99,193,101,136,181, 68,163,209,152,116,237,218, +149, 41,253,146, 46,250, 31,169, 64, 96, 85,171,130,115,185, 92,211, 9, 19, 38,228,109,221,186,117, 28, 33,100, 7,203,178, 81, +213,205,164, 51,199, 14,216,175,252,126,206,247, 86,210,218,110,179,103,207,230,244,238,221,251,218,158, 61,123, 26, 90,121,123, +127,113,253,242,126,251, 77,179,231,158, 60,117,234, 84,129,161, 14,238, 69,184,123,226,196, 9,199,233, 83, 38,242,190,255,118, +234, 69, 51,119, 27,190, 9,177,146, 8, 85,242, 52, 19,176, 10, 65, 93,175,110,103, 47, 93,138, 7,112,199,128,198,203,249,225, +195,135,118, 22, 22, 22, 0, 10, 39, 7, 88, 88, 88, 96,235,214,173,150,197,150, 66, 67,134, 11, 63,122, 0,157,195,194,194,236, + 76, 76, 76, 32,151,203, 75, 94, 8, 44,203,150, 52,150, 45, 91,182,172,202,139, 48,134, 16,210,242,235,175,191,190,181,101,203, + 22, 91, 55, 55, 55, 44, 93,186, 20, 25, 25, 25,136,139,139,195,144, 33, 67,114, 99, 98, 98,218,148,246,205,250, 28,208,160, 65, + 3,246,238,221,187,184,120,241, 34,190,252,242, 75,114,234,212, 41,141, 94,175,231, 37, 38, 38, 62,255,167,210,164,211,233, 76, +121, 60, 94,201,176,122,177,176, 42,222,156,157,157,113,245,234, 85, 78, 65, 65, 1, 39, 61, 61, 93,252,203, 47,191, 76, 14, 9, + 9,113, 4, 48,232,159,204,203,173, 91,183,214, 26, 51,102, 76, 28,135,195, 97, 59,117,234, 52,244,253,251,247, 61, 29, 29, 29, +255,184,126,253,250, 90, 0, 85, 14, 87, 80,191,126,253, 16, 14,135,227,204,178, 44,239,228,201,147, 90,189, 94,207,107,208,160, + 65,202, 71,193, 16,161,211,233, 18, 34, 35, 35,131, 12,225, 19, 10,133,188, 29, 59,118,104,149, 74, 37,207,215,215, 55,165, 20, + 15,239,212,169, 83, 90,173, 86,203,243,244,244, 12, 49,100,102,115,102,102,230,144,105,211,166,221, 62,124,248,176, 13, 77,211, +120,255,254, 61, 50, 50, 50, 96, 97, 97,129, 95,127,253, 21,181,107,215,198,149, 43, 87, 50,117, 58,221,232,157, 59,119,206, 87, + 40, 20, 67, 12,240,193,106, 25, 28, 28, 92, 43, 59, 59, 27, 22, 22, 22,144,203,229, 8, 9, 9,129,143,143, 15,100, 50, 25, 40, +138,130,133,133, 5,182,108,217, 82, 64, 8,201,252, 28,158, 33,154,166, 75,172, 76,165, 68,145,178, 73,147, 38,184,115,231,206, +239, 85, 17, 69, 44,203,170,185, 92,238, 7,194,170,248, 59, 77,211, 85, 30,242,208,235,245, 60, 66,136, 63,138,252, 3, 43,251, +253, 25,160,149, 88, 44,230,149, 81,215,120, 30, 30, 30, 45, 12, 37,225,243,249,214, 34,145,168,144,176, 85, 43,164,166,166,234, + 93, 93, 93, 7,244,239,223, 95, 11, 0,227,198,141, 27,144,154,154,170,212,233,116, 52, 77,211, 72, 75, 75, 67,237,218,181,173, +141,146,233, 63, 96,193,170,200,114, 85,218,130, 85, 89, 37,164, 40, 42, 59, 52, 52, 84, 34,145, 72, 74,246,105,181, 90,248,251, +251, 51, 12,195,144,143,175, 83,156,142,234,130,203,229,154,126,247,221,119,217, 91,182,108,249, 10,192, 60, 67,254,115,100,146, + 23,246,125, 36,174,182,173, 92,178,233,231,149,203,172,162, 47,238,193,174,141,107,244, 92,190, 73,136,191,191,127,203,156,156, + 28,149,133, 68,133,228, 12,156, 96, 89,246,183, 42,244, 66, 40, 0,135,238,223,191,255,164, 67,135, 14, 15,118, 31, 58,110, 37, +139,137,185, 47,200, 77, 79, 50,171,235,206,225, 57,213,234, 37, 87,171,185,189,122,245, 50, 1,176,209, 0, 62,196,197,197,225, +222,189,123, 48, 51, 51,131,153,153, 25, 44, 44, 44, 74,190, 87, 39, 15,139,135,109,207,158, 61, 11,137, 68,130,162,169,187,144, + 72, 36,224,243,249, 40, 93,134, 85, 16, 89,145,132,144,169,199,143, 31, 63,184,124,249,114,100,102,102, 66, 46,151, 99,225,194, +133,136,137,137,153,198,178,236,147,207,233,225,240,245,245,101,239,223,191,143,187,119,239, 66, 46,151,227,231,159,127,134,163, +163, 99, 91, 0, 11,254,201,116, 49, 12,195, 43,182, 40,150, 22, 86,165,173, 88, 52, 77, 67, 40, 20,194,198,198, 6,115,231,206, +229,125,249,229,151,221,254,201, 52,175, 90,181,170,238,134, 13, 27,126,217,183,111,223,133, 33, 67,134, 28,126,241,226,197, 8, +115,115,243,231,215,174, 93, 91, 38, 16, 8,152,106, 90, 69,156,159, 60,121, 98, 87,250,145,103, 24, 70,172,211,233,160,211,233, +160,213,106, 81, 80, 80,128,246,237,219, 27,204,247,232,209, 35, 49, 0, 44, 88,176,128, 11, 64,204, 48, 12,244,122, 61,138, 57, + 11, 10, 10,184,237,218,181,115, 54,200, 68, 45,147, 69, 74,165,210, 22,253,251,247,191,119,240,224, 65,203, 90,181,106, 33, 49, + 49, 17,137,137,137,168, 91,183, 46, 54,110,220, 40,103, 89,182, 89,145,168, 58,101,224,109, 75, 45, 45, 45,185,113,113,113,208, +233,116,240,247,247,199,150, 45, 91, 48, 96,192, 0,212,175, 95, 31,185,185,185, 8, 15, 15,199,222,189,123, 45,121, 60, 94,159, +127,250, 25,162, 40,234, 47,226,170,244, 86,205, 14,134,153, 80, 40,204, 21, 8, 4,252, 98,255,171, 71,143, 30, 85,217,122, 85, +170, 93,122, 82,149,223,255, 36, 76, 77, 77, 97, 98, 98, 2,173,246,195,219,148, 72, 36,168, 91,183,174,193, 60, 38, 38, 38,164, +216,136,161,213,106,145,148,148,164,127,241,226,133, 62, 32,160,112,144,195,209,209, 81,255,240,225, 67,189, 82,169,164, 77, 77, + 77, 81, 52, 42, 66, 96,196,167,179, 96, 21, 91, 43, 42,178, 92, 21,127, 47,182, 68, 85,246,176,209, 52,141,139, 23, 47,150, 84, + 20, 47, 47,175,146,107,125,106,129,101,109,109, 45, 15, 14, 14, 54,139,143,143, 63, 80,157,255, 23,139,171,229, 75, 23, 90,101, +190,122,128, 4, 89, 18, 50, 83,181,161,119,158,191,189, 12,224, 50, 0, 96,187,247, 13,140,123,101,176,184,242,182, 21,251, 53, +144,154,158,248,162, 75,183, 26,253,199,126, 67, 77,156, 56,177,241,136, 17, 35, 50,134, 12, 25, 50, 81, 36, 18,121,235,116,186, +140,179,151, 46, 69,247,234,213,203, 65,167,211, 13,103, 89,214, 16,159,164,132,193,131, 7,243, 8, 33,176,179,179,227,238,219, +183,207,210,204,204, 12, 35, 70,140,200,122,251,246,173,182,168, 39,150, 82,197,219, 79,104,214,172,217, 95,134, 5,139, 95,236, +197,150,129, 42,138, 54,255,110,221,186,237, 60,124,248, 48,210,211,211, 33,151,203,193,229,114,177,122,245,106,196,197,197,253, + 68, 8,121,241,185, 52,102,126,126,126,236,195,135, 15,241,252,249,115,168, 84, 42,140, 30, 61,186,180,143, 97,135,127,122,164, + 32, 49, 49, 17,251,247,239, 7,195, 48, 24, 50,100, 8,106,213,170, 85, 34,172,146,147,147,177,123,247,110,232,245,122,140, 25, + 51, 6, 53,107,214,132, 86,171, 21,182,110,221,154,115,227,198, 13,221, 63,145,224,233,211,167, 71,159, 56,113,226, 66,124,124, +124,231,149, 43, 87,182, 34,132, 48, 51,103,206, 92, 97,102,102,246,183,102, 95,102,229,228,225,245,155,247, 37, 2,232,227,205, +214,198,170,202,124, 81, 49,241, 37,255,215,235, 75,243,233, 97,109,101, 89, 37,190,164,164,164,130,140,140, 12,249,232,209,163, + 45,118,238,220, 73,234,214,173,139,216,216, 88,112,185, 92,152,154,154, 22, 68, 68, 68, 84, 53, 52, 67, 98,102,102,166, 59, 77, +211,188, 55,111,222,192,197,197, 5,193,193,193,248,225,135, 31,144,158,158, 14,157, 78, 7, 59, 59, 59, 70,171,213,134,169,213, +234, 91,255,244,115, 84,218,202, 84,122,187,123,247,238,239, 52, 77, 83, 0,206, 0,168,146,192,102, 89, 86, 93,179,102,205, 15, +184,171, 99,189,250, 15, 90,236,254, 99, 51, 19, 61, 60, 60,110, 74, 36,146,110,175, 95,191,254,192,138, 53,120,240, 96,141,155, +155,219,109, 67,121,204,204,204,178,120, 60,158,181, 82,169,196,253,251,247,225,237,237,205,203,201,201, 89, 78, 8,153, 83,212, +185, 92,158,146,146,194,147, 74, 11,221,248, 60, 61, 61,145,151,151,151,101,148, 76,159, 88, 96,149,101,185, 42, 75,100,209,116, +229,174, 9,132, 16, 40, 20, 10, 72, 36,146,146,173,216,207,170, 44,129, 85,228,251, 83,173, 33,194, 34,113, 37, 58,120,240,224, +239, 27, 55,110,188,107,232,255, 74,251, 96,109, 95,187,116,101,177,184,122,118,247, 10, 78, 69,228,164,207, 90,190,126, 67,117, + 51,219,199, 86,226,235, 96,111,115, 99,245,143, 75,204,162, 47,238,197,225,237,235,216,103,143, 30, 53, 28,255,232, 81,159,241, +227,199, 91, 1, 72, 2,144, 8,224, 62,128,159, 12, 20, 87,136,140,140, 44, 9,238, 26, 16, 16, 16,111,105,105,105, 41, 18,137, + 32,147,201, 84, 79,158, 60,169,150,163,107, 84, 84,212, 39, 13,238, 74, 8,241,232,222,189,251,173, 99,199,142, 73,178,179,179, +241,254,253,123,204,156, 57, 19,155, 55,111,134,153,153, 25,206,157, 59,103,218,173, 91,183, 27,132,144,166,255,116,112, 85,127, +127,127,246,241,227,199,120,247,238, 29,116, 58, 29,122,244,232, 81,233, 4,142,255,178, 5,139,157, 54,109, 26,118,238,220, 9, +154,166,241,213, 87, 95, 33, 55, 55,183,228,184,149,149, 85, 89,199,232,162,231,253, 31, 17, 88, 28, 14,135,189,121,243,230,202, + 86,173, 90, 33, 62, 62,190,115, 96, 96,224,207, 35, 70,140, 72,252,187,188,150,230,166,240,243,113,133, 74,165,130, 74,165,130, + 84, 42, 69, 94, 94, 30,162,163,163,161, 82,169, 96,111,103, 81,101,190,128,250,117, 75,248,236,236,236, 32,151,203,241,246,237, + 91,168,213,106,216,216, 88, 86,165,206,215,232,216,177,227,245,223,127,255,221,250,247,223,127, 87,247,238,221,155,191,100,201, + 18, 98,102,102,134,212,212, 84, 84,211,189,231,230,157, 59,119,106,181,111,223,222,243,213,171, 87,184,121,243, 38,212,106, 53, + 2, 2, 2, 16, 21, 21,133, 38, 77,154, 32, 63, 63,255,225,227,199,143, 79,127, 14,117,181,120,248,174,120, 11, 9, 9, 57,196, +227,241, 88, 0,213,178, 54, 21, 35, 46, 46, 78,224,235,235,171, 18, 10,133,252, 34,177,246,183,248, 62,113, 91,247,183,102, 38, + 86, 4, 87, 87,215,105,206,206,206,237, 3, 2, 2,240,234,213, 43,158, 64, 32,192,208,161, 67, 53, 93,186,116,209,112, 56, 28, +131, 39,220,136, 68,162, 87, 38, 38, 38, 45, 85, 42, 21,212,106, 53,174, 92,185, 2,107,107,235, 89,221,187,119,159,154,148,148, + 4,153, 76,198,231,243,249, 37,254,183,173, 91,183, 70, 70, 70,198, 43,163,100,250, 68, 2,171,184,142, 24, 50, 60,104,168, 15, + 22, 69, 81, 80,171,213,144, 72, 36, 16,139,197,144, 72, 36, 37,215, 33,132,148, 41,176,170,131, 26, 53,106, 32, 56, 56, 88,116, +248,240,225,223,214,172, 89,115,175, 58, 28, 71,127,223,239,104,206, 20,212,144, 61, 60,143,200,231,161, 56, 17,158,157, 62,107, +249,250, 41,221,251, 12, 74,249, 88,144, 29, 25,103, 64,207,195, 78, 82,223,201,222,250,198,218, 85,203,205, 50, 95, 61, 64, 82, +114, 50,206, 63,124, 28,170, 42,244, 13,251,225, 19, 62,220, 40, 30, 91,255,156, 32, 16, 8,166, 29, 61,122, 84,146,157,157,141, +152,152, 24, 12, 25, 50, 36,251,221,187,119, 95,247,236,217,115,243,229,203,151, 45, 45, 44, 44,112,249,242,101,211, 26, 53,106, + 44, 7,208,237, 31,108, 28, 89,189, 94,143,204,204, 66,247,149,102,205,154,125, 86,226, 10, 0, 66, 66, 66,120,221,187,119,255, + 3, 64,219, 87,175, 94,129, 97,152,123,161,161,161,205,138,143, 87,116,204, 16,253,150,151,151,199, 53, 53, 53, 45,243,101,197, +227,241,120, 85,181, 56,148,230,188,123,247,238,138,181,107,215,158,152, 49, 99,198,155,191,201, 89,166, 5,171, 91,183,110, 80, +168, 52, 72, 72,201,129, 94,175,131, 66,147,250,183, 44, 88,221,186,117, 67,129, 82,141,184,164, 76,232,116,122,228, 41,116,134, +214, 35,241, 23, 95,124,113,233,224,193,131, 14,247,239,223,135, 74,165, 98, 66, 66, 66,222,142, 29, 59,214,108,212,168, 81,214, +229,133,182, 49, 0, 27, 7, 13, 26,212,247,238,221,187,153,158,158,158, 86, 15, 31, 62, 68,106,106, 42,116, 58, 29,218,182,109, + 11, 62,159, 31,183,124,249,114, 30, 12,112, 45,248,111, 9, 44,129, 64,128,240,240,240, 98, 97, 53,236, 83, 9, 33, 62,159, 95, +237, 97,198,255, 85,252,246,219,111,137,123,246,236,241,113,114,114,218, 48,108,216,176, 54, 82,169,148, 18, 8, 4, 55, 57, 28, +206, 84, 0,239, 13,229,225,241,120, 35, 44, 44, 44,162, 41,138,162, 19, 19, 19,241,230,205, 27,196,198,198, 2, 0,191,160,160, + 0,118,118,118, 37, 70,147, 65,131, 6,161, 70,141, 26,250,168,168,168, 17, 70,201,244,137, 45, 88, 75,150, 44,193,246,237,219, + 49,110, 92,197, 42,226,204,153, 51,192, 71, 67,132, 69,203,199, 92, 45,253,242,215,235,245, 88,184,112,225, 7,255, 43, 30,126, +250,250,235,175, 63,224, 60,121,242,228, 95,134, 8, 63,230, 44, 11,169,169,169,175,142, 28, 57,242,120,213,170, 85, 15, 13,108, + 12, 75, 56,139,125,176,250, 14, 30,154,180,105,197,247, 47,246,157,185, 86, 63, 73,193, 38,205, 90,190,126,198,199,226,202, 80, + 78,111, 7, 19,111,103, 59,235,155,107, 86, 45, 55, 47,182,134, 29, 12, 75,206,129,142, 29, 87,149,194, 50,228,222,117, 58, 93, +130,191,191, 63, 15, 48,108, 88,208, 16,206,106,136,148,191,112,170, 84, 42, 60,120,240, 0, 0, 48,114,228,200,236,119,239,222, +181,100, 89,246, 37, 33,228, 85,199,142, 29,111, 94,186,116,201,146, 97, 24,160,156,176, 20,255,173,116, 22,229, 27, 56, 28, 14, +220,221,221,171, 44,174,254, 91,233, 76, 74, 74, 26, 55,126,252,248,237, 42,149,138, 35,151,203,199, 25,122,172,178,116, 30, 57, +114,228,141,187,187,123, 43,148, 31,138,129, 41,178,176, 86,155,115,195,134, 13, 0,224,249,119, 56,203,179, 96, 29, 58,116, 8, + 12,195,160,134,131, 5, 84, 42, 21,196, 98,113,149, 56, 63,182, 96, 29, 62,124, 24, 12,195,160,166,163, 21,212,106,117,185,157, +151,143, 57,173,173,173,215,237,219,183,207, 57, 34, 34, 2, 9, 9, 9, 88,191,126,253,251,180,180,180, 46, 28, 14, 71,240,243, +207, 63,223,232,218,181,171,189, 78,167, 83, 85,181,220, 89,150, 85, 17, 66, 70, 52,109,218,244,215,101,203,150,197,122,121,121, +213,108,214,172,153, 69, 70, 70, 70,218,147, 39, 79,222,110,223,190,221, 68,167,211,141, 40,111,232,233,191,249, 28, 1, 64, 98, + 98,226,105, 0,220,170, 10, 43, 67,210,249,232,209,163,195, 69,220,231, 13,225,254,111,221,251,223,157,153, 88, 89, 58, 71,140, + 24,145,128,143,226,155, 85, 53,157,151, 47, 95,126, 55,120,240,224,165,245,235,215, 95,100, 98, 98,130,200,200,200,146,176, 72, +197,117,156, 16,130,126,253,250,225,235,175,191,198,165, 75,151,150,246,237,219,247,221,127, 58, 63,255, 53, 2, 75,175,215,199, +191,123,247,206,113,223,190,125, 52, 33, 4,191,253,246, 27, 74, 79,217,167,105, 26, 20, 69,129,195, 41,164,120,240,224,129,174, +178,152, 83,122,189, 62, 62, 36, 36,196,126,239,222,189,220, 98,147,113, 98, 98, 34, 24,134, 97, 82, 82, 82,168,223,127,255,189, +196, 26,198,225,112,240,224,193, 3,157, 70,163,137,171,234, 77, 69, 70, 70,126,146,222,219,173,151,239,166, 94, 58,127,210,166, +113,112,139,108, 51, 43,171, 50,187,174,197, 17,223, 43,172,220, 28,234,135,149, 63, 46,177, 40, 22, 87,135,194,146,179,149, 42, +125,155, 87,105, 5,207, 62,117,129, 62,123,246,172,233,103, 90,215, 22,182,106,213,138, 1, 96, 3, 96,126,241,172,206, 34,145, +213,184,110,221,186, 51, 0,136, 0, 44,252, 39,173, 87,165, 67,131,124,110,150,171,210, 8, 13, 13,141, 5,208,174,170,199, 42, + 67,223,190,125, 99, 80, 70,192,207,191,131,255, 4,103, 49, 50,179,115, 17,243, 46, 17,133,206,232, 12,244,239, 83, 74,252,166, +180, 90, 29, 50,115,171, 20, 70, 14, 89, 57,121,136,126,155, 88,180, 52,152, 30,122,189,172,136,175,208,209,157,205, 42,168,148, +131,203,229, 54,223,176, 97, 67, 23,138,162,168, 7, 15, 30,168, 86,173, 90, 21,159,150,150,214,131,101,217, 56, 0,144, 74,165, +173, 79,158, 60,249,155, 1, 33, 25,202,235,248,134, 19, 66,154,204,158, 61,123, 10,128,230, 0,106, 2,136, 67,225,140,227,141, +159, 89,196,241, 97,255,163,220,213,198,255,202,204,196,223,127,255,125,241,215, 95,127,205, 9, 14, 14,158,219,176, 97, 67,234, +237,219,183, 72, 77, 77, 5,135,195,129,135,135, 7, 58,116,232, 0, 23, 23, 23,230,220,185,115, 63,246,234,213,107, 49,140,248, +116, 2, 43, 61, 61,189,227,176, 97,195,174, 80, 20, 85,187,244, 48, 94, 89,159, 0,192, 48,204,187,148,148,148, 10,131,144,165, +167,167,119, 92,184,112,225, 21, 14,135, 83,187, 84,252, 43, 85, 70, 70,198,215,253,250,245,219,194,229,114, 5,165,173, 93, 12, +195,188, 79, 74, 74,250,175, 58, 20,127, 28, 7,171, 99,151,158,233,127,151,211,132, 71,185, 69,158,219,137,148,212,116, 28, 10, + 75,206,202, 83,235, 91, 71,166,201, 95,252,155, 42, 26,203,178,169, 0,190, 46,231,216, 27, 0,227, 62,131, 52,146, 34,145,101, +156, 45,243, 63, 0,157, 78,151,208,190,109,107,124, 28,150,225,227,223,122,189, 62,193, 80,190,118,109, 90,149,203, 83,252,189, + 50, 62,154,166,103, 4, 7, 7,211, 51,102,204, 72,185,112,225,194, 31, 89, 89, 89,211, 89,150, 45, 81,102, 69,179, 6, 3,255, +102, 93, 85,161,112,133,135, 85,198,154,240, 89,182,119,255, 19, 51, 19,183,108,217,178, 96,214,172, 89,123,157,157,157,247, 55, +111,222,220,211,205,205,205,204,212,212, 20,185,185,185,121, 89, 89, 89,175,207,158, 61, 59,100,216,176, 97,177,198, 18,253,196, + 2, 43, 45, 45, 77, 14,160,201,167,188, 88, 37,156,181, 62,155, 46,151,106,213, 1,108, 95,245,193, 58,132,197,226,171,204,223, +149, 72,131, 28,133,110,226,198, 75, 47,215,168,116, 44,163,209, 49, 35, 35, 83,229,225,198,170,247,217, 54,140, 70,113,245, 63, +130, 23, 47, 94, 4,125,142,124,106,181,122,106,211,166, 77,127,210,235,245,107,181, 90,237, 29, 99, 73, 25,241, 57, 99,213,170, + 85,177,197,239,229,126,253,250,209, 0,112,228,200, 17,189, 49,103,254,131, 2,235,223,138, 35, 47,255,124,193,126, 44,156, 42, +251, 93, 30, 94, 39,231,223,252,187, 61, 86, 35,140, 48,226,127, 70,164,199, 1,232, 97,204, 9, 35,254,231,222,127, 70, 97,245, + 73, 65, 25,179,192, 8, 35,140, 48,194, 8, 35,140, 48,226,211,130, 0,104, 95, 78, 47,204,224,217, 1,132,144,246, 85,189,176, + 1, 43,134, 27, 57,141,156, 70, 78, 35,167,145,211,200,105,228,252,127,198,249,175, 65,105, 71,206, 79,189, 1,104,111,228, 52, +114, 26, 57,141,156, 70, 78, 35,167,145,211,200,249,111,219,140, 67,132, 70, 24, 97,132, 17, 70, 24, 97,132, 17,159, 24, 70, 39, +119, 35,140, 48,194,136, 82,144, 74,165,221, 1, 44, 70,161, 11,197,114,153, 76,118,216,152, 43, 70,252,127,130,173,173,173,196, +218,218,250, 15,138,162,106, 1, 31,134, 92, 42, 35,184, 55,244,122,125, 82,102,102,102,135,228,228,228,244,255, 38,231,191, 78, + 96,181,173,107,209,194,181,142,203,239,105,169,233, 97,249,202,220, 81,127,188,206,203,172,206,133, 9, 33,214,124, 62,127,128, + 68, 34,105,207,178,172, 43, 77,211, 17, 57, 57, 57, 87,181, 90,237, 65,150,101,243,141,143,128, 17,255, 52,252,253,253, 27,240, +249,252, 89,132,144,198, 58,157,206,153,203,229,202, 0, 60, 84,169, 84,171,195,194,194,194,140, 57,244,255, 3,132, 16,202,209, +209,241, 39, 11, 11,139,224,236,236,236, 33, 0,230, 70, 70, 70,250, 82, 20, 5, 31, 31,159,185, 82,169, 52,218,204,204,108, 87, +110,110,238,189,164,164,164,169, 85, 89, 59,206,136,207, 23,110,110,110, 33, 20, 69, 57, 23, 47,201,246,177, 32, 40, 75, 32,176, + 44, 27, 27, 30, 30, 94,110, 48,103,103,103,103, 87, 51, 51,179, 45, 0, 26,126, 44, 42, 62, 70,209, 48,219,227,220,220,220,175, + 19, 18, 18,202, 12,196,107,101,101,101,106,103,103,183,152, 16,210,143,162,168, 74, 23,252,101, 24, 70,207,178,236,145,212,212, +212,133,153,153,153,121,229,157,103,109,109,125,245,214,173, 91, 13,109,108,108, 42, 13, 75,163,211,233,144,152,152,104,219,181, +107,215, 91, 0,188,254,155,156,255, 58,129, 5,150, 26,186,122,222, 24,167,180,248,104,167,185, 27,142,123,180,240,178,105,125, + 59, 34, 61,185, 42, 20, 34,145,104,128,175,175,239,198,159,126,250,201,218,197,197,133,136,197, 98, 36, 37, 37,121, 61,121,242, +164,215,162, 69,139, 22,114,185,220, 17, 90,173,246,202,223,108, 52, 45,172,196,156, 89, 25,114,237,119,198,166,196,136,170,160, + 95,191,126,116,124,124,252, 34, 27, 27,155,111,231,204,153, 35,168, 93,187, 54, 76, 76, 76,144,154,154, 90,243,205,155, 55, 53, + 54,111,222,220,189,105,211,166, 63,171,213,234,249,161,161,161, 90, 99,142,253,111,195,209,209,241,167, 83,167, 78, 77,242,244, +244, 68,203,150, 45,239,249,251,251,155,137,197, 98, 92,188,120, 17,110,110,110,245,204,204,204, 30,110,219,182,141,187,120,241, + 98,191,227,199,143, 3,192,100, 99,174,253,239,131,162, 40,231,176,176, 48, 59,177, 88, 12,189, 94, 95, 20,189,159, 1,203,178, + 37,159,165,197,144, 94,175, 71,155, 54,109, 52, 21,113, 10,133,194,205,207,159, 63,111, 95,188,142, 95, 41, 33, 85, 38,100, 50, + 89,251, 54,109,218,108, 6, 80,102, 64,109, 59, 59,187,197,253,251,247,159, 86,191,126,125, 0, 40, 73,103,241,103,122,122, 58, + 38, 78,156, 88,114, 13,134, 97,112,235,214,173, 41,223,124,243, 13, 0,124, 83,193,189,215,178,177,177, 33,149, 45,129,183,104, +209, 34, 44, 90,180, 8, 27, 55,110, 36, 28, 14,199,162,146,252,252,228,156,255, 58,129, 69, 40,114,126,211,182,189,163,166,247, +111, 76, 86,141,109,225, 62,111,215,141,251,237,235, 88,182,188, 26,155, 21,111,160,184,154, 50,126,252,248, 21, 75,150, 44, 17, +190,126,253, 26,225,225,225,208,233,116, 48, 53, 53,133,175,175, 47,117,254,252,121,199,169, 83,167, 30,229,243,249, 35,213,106, +245,241,234,222,152,131, 25,119,181, 68, 64, 13,230,115, 56, 15,213, 58,221,233,207, 49,243, 93, 92, 92, 46,107,181,218,149,137, +137,137,215,255, 87, 42,140, 84, 42,109,198,231,243, 23,190,123,247,174, 19,203,178,186,255,143, 15, 69, 92, 92,220,146,230,205, +155, 79, 95,180,104,145,224,237,219,183,136,138,138,130, 76, 38, 67,237,218,181,225,226,226, 66, 54,110,220, 40,252,249,231,159, + 39, 63,125,250,148, 11, 96,122, 85, 44, 37, 14, 14, 14,163,219,181,107,215,199,198,198,198, 60, 49, 49, 49,231,238,221,187,167, +146,146,146,118, 84, 55, 47, 9, 33,148,141,141,205,240,110,221,186,245,177,178,178,178, 74, 78, 78,206,186,122,245,234,201,212, +212,212, 93,127,199,210, 66, 8,113, 4,224, 11,192,186,104, 87,146,139,139,203,203,183,111,223,166,126, 66, 78,153,139,139, 75, +120,117, 56,109,109,109, 37, 28, 14,231, 48, 33, 68, 90,129,133, 64,166,211,233,250, 23, 5, 56, 46, 23,102,102,102,141,221,221, +221, 17, 26, 26,138,249,243,231, 91,181,105,211, 6,111,222,188, 1, 33, 4, 51,102,204, 32, 62, 62, 62,220,164,164, 36, 4, 5, + 5,225,234,213,171, 77, 97, 68, 85,202,252, 8, 0, 11, 0,131, 88,150, 77, 47,181,223, 6,192, 73, 0,169, 44,203,246,254,167, +210, 39, 18,137,112,240,224, 65,112,185, 92,112,185, 92,100,101,101,193,217,217,185,228, 55,143,199, 43,249, 94,179,102,205, 74, +249, 24,134,105, 68,211, 52,242,243,243,161,215,235, 75,182,236,236,108,176, 44, 11,129, 64, 0,189,190,112,217,165,226, 99, 12, +195, 52,170, 32,255,250, 73,165, 82, 28, 56,112, 0,106,181,186,172,186,139, 23, 47,254, 92, 20,132,166,105,248,249,249, 81,132, +144,126, 21, 9, 44, 66, 8, 11, 0, 99,199,142, 5, 77,211, 37, 75,223, 21,127, 47,222,244,122, 61, 22, 45, 90, 84,232,176, 77, + 81,149,149,245, 39,231,252,159,175,255, 21,169,235, 54,110,150, 95,183,110,209,120,181, 80,192, 17, 49, 58, 45,244, 58, 45, 24, +157, 26, 52, 97,208,194,219, 14, 1, 53,133,200,204,202,195,252,253, 79,115,101, 25,202,224,203, 81, 25,145,149, 20,128, 75,112, +112,112,216,181,107,215, 44,254,248,227, 15, 68, 70, 70,226,135, 31,126, 0, 0, 72, 36, 18, 92,188,120, 17, 52, 77,131, 97, 24, +116,234,212, 41, 77, 38,147,121,177, 44,155, 89,141,135,186, 86,203,250,206,161,199,191,107,105, 85,111,194,209,247,201, 57,106, + 87,150,101, 63,187, 0,106, 82,169,148,229,114,185, 5, 58,157,174,251,255,130,200,146, 74,165,205,184, 92,238, 69,157, 78, 39, +230,114,185,162,119,239,222,169,254,191, 61, 16,254,254,254, 13,172,172,172, 30,156, 56,113, 66,248,232,209, 35,100,101,101, 33, + 53, 53, 21, 83,166, 76,193,214,173, 91, 81,175, 94, 61, 72, 36, 18,240,249,124, 76,156, 56, 81,145,151,151,215, 58, 36, 36,228, +177, 1,117,146,110,217,178,229,129,223,126,251,205, 69,167,211, 81, 0,160, 86,171, 17, 31, 31,175,159, 55,111, 94, 92, 72, 72, +200,160,170,138, 44, 66, 8,213,180,105,211,253,191,253,246,155, 27,159,207,167, 24,134,129, 86,171,197,155, 55,111,244,243,230, +205,123, 23, 26, 26, 58,184, 58,245,158, 16,226, 47, 22,139,125,190,254,250,235,180, 30, 61,122,104, 0,224,241,227,199,212,179, +103,207,204,234,212,169,243,126,193,130, 5, 97,213,224, 12, 52, 53, 53,245, 28, 55,110, 92,122,183,110,221,180, 60, 30,143,185, +123,247, 46, 39, 50, 50,210,204,197,197, 37,102,238,220,185,207,170, 88, 23,207,157, 56,113,162,181, 84, 42,213, 3, 96,139, 27, +120,138,162,216,162, 79,196,196,196,112,250,246,237,123, 67, 38,147,125, 89, 97,103,204,193,193,219,209,209,241,214,130, 5, 11, +172,138, 95, 82,165,183,226,178, 90,180,104,145, 38, 41, 41,169,177, 76, 38,123, 2, 35, 12, 45,247,135, 0, 26, 1,120, 9,160, + 45,203,178,233, 69,226,234, 58, 0, 31, 0,119, 89,150,109,254, 79,164,205,211,211, 51,229,197,139, 23,118,167, 78,157, 2,151, +203,197,149, 43, 87,176,117,235, 86, 28, 60,120,176, 76,145,229,232,232,136, 22, 45, 90, 36, 60,121,242,164, 70,121,156,110,110, +110, 57,209,209,209,102, 57, 57, 57,208,235,245,120,248,240, 33,118,237,218, 5, 59, 59, 59,216,216,216,192,214,214, 22,141, 26, + 53,130, 68, 34, 41, 17, 89,253,250,245,203,141,142,142, 54, 47,139,207,219,219, 91, 54,100,200, 16,199,208,208, 80,104,181,218, + 50, 5,214,180,105,211, 74, 91,145, 32,145, 72,208,163, 71,143,164, 87,175, 94,149,219,249,168, 87,175, 94,210,203,151, 47, 29, +158, 61,123,246, 65, 93, 47, 75, 16,209, 52, 13, 83, 83, 83, 52,105,210, 36,229,201,147, 39, 14,255, 77,206,255,215, 22, 44,247, + 90, 14,243,190, 27,223, 83, 4,189, 6,172, 86, 1,104, 10, 0, 77, 62, 24,117, 1, 8, 79, 4,104, 21,176,226,103, 98,227,176, + 58,102,203, 79,189,123,213,214,213,182,235,181,152,180,139,229,241, 89, 88, 88, 44,218,182,109,155,197,139, 23, 47, 16, 25, 25, +137,117,235,214, 97,233,210,165,224,241,120,200,204,204, 68,247,238,221,113,239,222, 61,104, 52, 26,204,159, 63,223,106,246,236, +217,147, 80,232,108, 90, 69,235, 21,103,235,225,221, 27,173,172,232, 12,140,108, 27, 98,189,249,242,219,175, 1,252,252, 57, 22, +192,234,213,171,197,179,102,205, 58,227,228,228,244, 89,139, 44,169, 84,218, 76, 36, 18, 93,156, 54,109,154,100,197,138, 21,159, + 68,172, 58, 59, 59,215,227,112, 56,135,212,106,245,140,164,164,164, 75,213,104,188,107, 7, 7, 7,175, 8, 15, 15, 63,150,159, +159,127,164,172,115, 76, 76, 76,250,121,122,122,246, 12, 9, 9,153,199,178,236,219,202, 56, 5, 2,193,148,153, 51,103, 10, 19, + 19, 19,145,157,157, 13, 62,159, 95,178,202, 60, 33, 4, 2,129, 0, 20, 69,129,207,231,227,171,175,190, 18,254,242,203, 47,223, + 0, 24, 88,105,157,116,112, 24,181,127,255,126, 23,141, 70, 67,201,229,114,240,120, 60,240,120, 60, 52,104,208,128,158, 57,115, +102,141, 41, 83,166,140, 7,176,169, 42,247,111,105,105, 57,108,255,254,253,110,124, 62,159, 74, 74, 74, 66,179,102,205,240,240, +225, 67, 4, 7, 7,211,179,102,205,170, 57,105,210,164,177, 0,182, 86,213,202, 36, 22,139,235, 95,191,126, 61,190, 70,141, 26, + 37,189,175,218,181,107,235,187,118,237,154, 25, 17, 17,225,121,255,254,253,140, 38, 77,154,196, 85,129,211, 73, 44, 22,123,157, + 63,127, 62,105,201,146, 37,237,182,111,223,222, 3, 0, 26, 53,106,116,122,233,210,165,215, 50, 51, 51,235,221,190,125, 59,179, + 69,139, 22, 9, 85, 72,170,181,189,189,189,238,235,175,191, 54, 45,239,132,189,123,247,102, 0,176,171,164, 94,119,167, 40,106, +113,189,122,245,204,218,180,105,131, 91,183,110, 97,242,228,201, 42,173, 86, 27, 5, 0,237,219,183,247, 88,180,104, 17, 63, 52, + 52, 20, 22, 22, 22,220,164,164,164,221, 82,169,212,232,248,110, 56,122, 0,184, 1,160, 30,128,107,132,144,254, 0,142, 2,240, + 6, 16, 9,160,239, 63,153, 56,189, 94, 15, 14,135,131,132,132, 4,252,242,203, 47,248,241,199, 31,225,238,238, 14,173, 86, 91, + 34,176, 56, 28, 14,184, 92, 46, 8, 33, 6, 47,165,165,211,233,240,248,241, 99,236,255,245, 87,204,159, 55, 15,166,166,133,213, + 84,163,209, 32, 51, 43, 11, 66,161,176,196,130, 85, 17, 88,150, 61,242,230,205,155,105,206,206,206, 31, 12, 13, 22,127, 22,181, +113, 96, 24, 6, 58,157, 14, 42,149, 10, 59,119,238,212,177, 44,123,164,146,103,178,196,226, 53,109,218, 52,168, 84,127,246,149, +125,125,125, 1, 0, 46, 46, 46,240,243,243, 43,249, 93,108,161, 50,132,115,103,211,250, 80,148, 58,219,115,209,154,226, 54, 31, +158,158,158,112,116,116, 52,136,243,255,181,192,138,138, 75, 93, 57,107,241, 79,107, 36,124,154, 59,162,179, 55,164,102, 92, 64, +100, 5, 94,203,217, 32, 22,181, 10, 43, 64,102, 44,112,121, 54,230,119,200,160,230, 40, 52, 39, 59,187, 89,217, 94,136, 46,215, +185,174, 81,141, 26, 53,112,251,246,109,212,169, 83, 7, 11, 22, 44,128,151,151, 23, 36, 18, 9, 82, 82, 82, 32,151,203, 33,145, + 72,144,155,155,139,128,128, 0,218,212,212,180, 77, 85, 5, 22, 33, 36, 96,116,247,224, 70, 28,123,111, 52,107,215, 24,151, 23, +182,150,236,189,153,248, 29, 33,100,119,233, 5, 87, 63, 23,244,237,219, 23,201,201,201,226, 13, 27, 54, 84, 91,100,185,184,184, + 92,214,104, 52, 95, 24, 96, 14,191, 30, 29, 29,221,182,186,226,234,204,153, 51, 18, 83, 83, 83,172, 88,177,226, 83,137,171, 59, + 29, 59,118, 52,187,116,233,210, 9, 71, 71,199, 94, 85, 17, 89,132,144,218,253,250,245, 59,187,107,215, 46,143,182,109,219,234, + 1,148,217,160,248,248,248,244,185,124,249,114,239,209,163, 71,215, 39,132,116,171, 76,100, 17, 66,154,214,174, 93, 27,241,241, +241, 72, 73, 73,129, 82,169, 68, 74, 74, 10, 0, 32, 33, 33, 1,206,206,206,176,176,176,128,179,179, 51, 60, 60, 60, 8, 69, 81, +193,134,164,183, 77,155, 54, 61, 0, 80, 49, 49, 49, 72, 75, 75,131,185,185, 57, 36, 18, 9,156,157,157,209,186,117,107,142,155, +155, 91,151,170, 10,172,206,157, 59,247, 17,139,197, 84,124,124, 60,222,190,125, 11,149, 74,133,168,168, 40,152,155,155,163, 93, +187,118, 92, 55, 55,183,110, 85, 21, 88, 0,234,143, 29, 59, 54,165,180,184, 42,134, 68, 34, 33, 30, 30, 30,153,214,214,214,129, + 0,226,170,194, 57,105,210,164,212,229,203,151,183,188,122,245,234,236,226,157, 87,175, 94,157, 5, 0, 63,253,244,211,109, 91, + 91,219, 64, 0, 85, 17, 88, 96, 89,150, 25, 61,122,244, 27, 30,143, 7, 62,159, 95,178, 9, 4, 2,112,185, 92,208, 52,109,110, + 0,205,220,200,200, 72, 95, 19, 19, 19, 68, 70, 70,130,166,105, 16, 66,222,200,100, 50, 95, 0,152, 61,123,118,180, 66,161,112, + 85, 42,149,232,219,183, 47,233,222,189,123,131,117,235,214,205, 3,240, 89, 8, 44, 66, 72, 67, 0,235, 0,168, 1,204, 99, 89, +246,225,231,212,190,177, 44,155, 66, 8,105, 93, 74,100, 61, 1, 32, 40, 18, 87,173, 89,150, 77,249, 7,243, 14, 12,195,128,203, +229, 98,205,154, 53,208,104, 52,248,237,183,223,112,244,232, 81, 80, 20, 85,226,232,110,102,102,134,141, 27, 55,254,197,241,189, + 50,225,182,119,239, 94,204,158, 53,171, 68, 92, 1, 0,143,199,131,131,189, 61,172,109,108, 16, 19, 19, 83,169,192, 74, 77, 77, + 93,248,232,209, 35, 84,228,228,222,187,247,159, 35,172,165,157,220, 13, 73, 39, 77,211, 80,169, 84,248,226,139, 63, 95, 31,147, + 38, 77, 42,249,158,153,153, 89,252, 76,128, 24,120,243, 52, 77, 67,193, 2, 61,133,127,238,235, 50, 99, 70,201,247,244,244,244, + 42,115,254,191, 20, 88, 45,163, 51, 55,221, 35,240,155, 53,178,221,112,169,141, 25,216,252, 20,240,218, 46,196,243, 76, 49, 54, +108, 43,124, 23, 78,235, 27,128,250,237,151, 65,189,167, 3, 70,249,235,249,223, 36, 97, 38,128, 5,101,241,217,216,216, 88,235, +116, 58, 16, 66, 32,145, 72,224,237,237, 13,161, 80,136,180,180, 52, 76,158, 60, 25, 23, 47, 94,132, 70,163, 1,143,199, 67,157, + 58,117,160,209,104, 92,171, 97,189,218,181,126,245,143, 22, 25, 97, 7, 16, 26,155, 13,177,117, 13,204, 27,212,200,114,209,111, +143, 22, 2,152,245, 57, 22,130,159,159, 31,150, 44, 89, 34, 94,184,112, 97,181, 68,150, 70,163, 89,202,229,114,155,253,248,227, +143,162, 65,131, 6,253,229,248,211,167, 79,209,183,111, 95,133, 82,169,252,161,186,226,234,244,233,211, 18, 43, 43, 43,196,199, +199,227,239, 62, 19,197,226,234,247,223,127, 55,171, 85,171, 22,234,213,171, 39, 92,187,118,173,193, 34,139, 16,226,219,187,119, +239,227,187,118,237,170, 53, 98,196,136,247, 33, 33, 33, 41,132,144,242,132,184,108,228,200,145,239,247,236,217,227, 65, 8, 57, + 91,153,200,210,233,116, 53,197, 98, 49,210,210,210, 48,117,234,212, 15, 28, 84,139,135,179, 1, 32, 50, 50, 18,206,206,206, 80, + 42,149, 78,134,220,179,149,149,149, 37, 0,140, 25, 51, 6,241,241,127,186, 43, 58, 57, 57, 33, 62, 62, 30, 58,157,206,170,170, +249,104,101,101,101,165,213,106,209,162, 69, 11, 40,149, 74, 0, 64,255,254,253,193,229,114,145,154,154, 10,141, 70, 99, 93,141, +226,177,233,218,181,171,172,188,131,102,102,102, 26, 75, 75, 75,239, 42,114, 90,119,239,222, 61,113,199,142, 29,127, 25,170,123, +244,232,209,151, 86, 86, 86, 87,173,172,172, 60,170,145, 86,166,180,160, 42,254,206,231,243,139, 45, 14, 6,245,142, 25,134,193, +185,115,231, 64,211, 52, 56,156, 63,155,196, 5, 11, 22,140,179,176,176,176,191,117,235, 22,146,147,147, 33,151,203,145,159,159, +143,186,117,235,214,105,223,190,253,211,228,228,228,119,225,225,225,189,254,105, 35, 56,128, 98,191,176,173, 0,252, 62,183,246, +173, 72,100,245, 3, 16, 82, 36,174,212, 0,250,252,147,226,170,116,217,115, 56,156,146,231, 92, 40, 20, 34, 32, 32,160, 68, 76, + 17, 66, 80, 80, 80, 0, 14,135, 83,236, 47,100, 80,227,151,157,157, 13, 71, 7, 7,152,154,154,162,174,187, 59,222, 68, 69, 1, + 64,201,119,129, 64, 0, 66, 8,116,186,138,189, 2,138,102, 2,126,131, 10,252,169,170, 41, 46,217, 98, 49, 84, 73,251, 15,134, + 97,138,219,124,246, 83,112,218,216,216, 32, 63, 63,223, 32,206,255,183, 2,107, 49, 33,212,189,186, 86,191,204, 26,222,122,120, + 11, 15, 75, 40,211,222, 66, 96,106, 3, 98,225,130, 13,219, 46,225,213,187, 66,215,168, 13, 71,195,176,247,187,142,128,200, 10, +174, 38,145,176,145,136,123,149, 39,176, 50, 51, 51,229, 90,173,214, 74, 36, 18,129,195,225,128,207,231, 35, 35, 35, 3, 11, 22, + 44,192,225,195,135,225,226,226, 2,189, 94, 15,129, 64,128,212,212, 84,240,120,188, 42,205, 78,228,112, 72,215, 69, 99, 58,215, +150, 56,184, 35,227,202,210,194,157,246,254, 24,219,157,226,175, 61,254,124, 24, 33,100, 45,203,178,169,159, 91, 33,152,152,152, +160, 81,163, 70,152, 48, 97,130,120,219,182,109,251, 0, 56, 87,229,255, 50,153,236,174, 84, 42,237, 48,111,222,188,203,137,137, +137,162,198,141, 27,195,196,196, 4, 38, 38, 38,136,136,136,192,255,177,119,237, 81, 81, 92,121,250,171,170,126, 3,205, 75,161, + 21, 80, 48, 1,154,230, 49,108, 0, 17,118,112,243, 24, 53,146, 77,102,141,102, 98, 98,226,104, 52,179,192,100, 93,204, 26, 95, +135,205,104,194, 14,171, 39,103,116, 18, 71,196,179, 74,102,207, 1, 93, 38,232,134, 56,113, 9,230,140,154,241, 57,193, 30, 26, + 21,232,238,129, 70, 4,177, 5, 58, 60,187,171,155,174,187,127,208,221,211,102,120,116, 35,137,168,245,157,115, 79, 83,221,156, +175,234,222,170,186,247,171,239,254,238,175,242,243,243,205, 44,203, 62, 63, 25,119, 76, 40, 20,150,102,103,103,251, 74, 36, 18, +232,116, 58, 4, 7, 7,223, 83, 93,157,226,234,200,145, 35,254, 74,165, 18, 13, 13, 13,200,204,204,196,236,217,179,165,155, 54, +109,154, 80,100, 57,158,120,126,125,244,232,209, 40,129, 64, 64,125,242,201, 39,243, 0,228,123,178,239,178,178,178,184,138,138, +138, 95, 81, 20,181,140,140, 17,124, 40, 18,137,218,140, 70, 99,244,156, 57,115,112,232,208, 33,208, 52,141,142,142, 14,108,223, +190, 29, 69, 69, 69, 88,176, 96, 1,228,114, 57,230,204,153, 3,157, 78, 7,169, 84,218,225,201,190,111,222,188,217,205,113, 92, +232,201,147, 39, 97, 52, 26, 93,223, 71, 70, 70,162,167,167, 7, 22,139,165,203,219,182,108,107,107,235, 2,160, 80,171,213,104, +105,105,193,210,165, 75,113,252,248,113,164,165,165,193, 17,143,213, 53,137, 83,100,103, 24,134, 76,208,254, 65, 83,201,233, 24, +180,188,229, 4, 33,132,184, 11, 42,231,223,206, 34, 16, 8, 60, 9,242,255,165, 74,165,218,249,216, 99,143,197, 23, 20, 20, 8, + 25,134, 65, 86, 86,150,242,157,119,222, 49, 72,165,210, 25, 91,183,110,245, 25,205, 12, 6,144, 28, 31, 31,239, 59, 13,186, 15, +119,151,110, 90, 46, 58,161, 40, 42,212,225,248,137, 1, 88, 29,159, 71, 40,138,122,198, 61,240,253,126, 58, 88, 59,119,238, 68, + 78, 78, 14, 20, 10, 5,182,108,217, 2,129, 64,224, 42, 20, 69,185, 28, 45,111, 16,170, 80,140,251,187, 51, 6,107,130,135,168, +239, 36, 77,131,167, 98,104,100, 92, 21,120,228,222,125, 23,156, 15,165,192,114,138,171, 45, 63, 93,184, 38, 75,233,143,154, 51, +127,194,211,143,211, 0, 43, 30,167, 11,181,129, 18,249, 66, 33,167, 35,198,177, 14,213, 6,131, 97,110, 96, 96, 32,172, 86, 43, +196, 98, 49, 18, 19, 19,113,254,252,121,176, 44, 11,139,197,226,234, 28,175, 94,189, 10,171,213,122,198,139,155,133, 81,200,133, + 31,110, 46,120, 95, 14,205, 97, 4,250,138,241,116,106, 52, 48, 67, 5,166,187, 17,191,218,248, 66,240, 63,239, 58,182, 23, 30, +196,203,220, 15,129,165,213,106, 81, 82, 82, 50,104,177, 88,126, 58, 25, 14,167,200, 42, 46, 46,174, 14, 12, 12,148, 61,249,228, +147,208,104, 52,216,180,105,147,153,101,217,127,156,108,124,151,205,102, 91,251,217,103,159,157,140,142,142,246, 93,184,112,225, + 93,118,247,100,196, 21,195, 48, 95,173, 91,183, 78, 30, 21, 21, 5,189, 94,143,128,128, 0,248,249,249, 97,222,188,121, 40, 47, + 47,151,174, 90,181,106, 92,145, 69, 8, 33, 20, 69,229,173, 92,185,178,170,180,180, 52,114,237,218,181,134,202,202,202, 42, 0, + 99,117, 38,242,229,203,151,191, 80, 90, 90, 26,185,126,253,250, 70, 0,111,147,113, 86,118,112, 28,119, 78,167,211, 61,174, 82, +169, 40,165, 82, 9,177, 88,140,240,240, 17,147, 42, 57, 57, 25,241,241,241, 16, 10,133, 0, 0,173, 86, 11, 0,151, 60,169,251, +217,179,103, 63,109,106,106, 90,151,150,150,198,204,154, 53,203, 21, 60, 43, 18,137, 80, 88, 88,104, 53, 24, 12, 39,188,109,207, + 47,191,252,242,184, 70,163,121, 51, 43, 43, 75, 16, 20, 20, 4,137, 68,130,164,164, 36,132,133,133,161,176,176,208,218,220,220, +124, 98, 18,167,169, 85,163,209, 72, 99, 99, 99, 71,237,249,101, 50,153, 63, 0,111,157,135, 27,151, 47, 95, 22,103,100,100,124, +250,249,231,159, 39,186,255,144,158,158,254,169,159,159, 95, 0,128,142, 73, 28, 43,231, 46,168,156,197, 57,101,232,137,192,106, +111,111,175,154, 53,107,214, 95, 20, 10,197, 31, 19, 18, 18, 2, 52, 26, 13, 10, 10, 10, 68, 22,139,101,110, 77, 77,141,107, 32, + 30,229, 58,196,192,192,128,108, 26,116, 31,249, 0,246, 0,240, 1,176,101, 26,138, 43, 5, 70, 2,218,227, 48, 50, 45,248,178, + 67,108, 57, 99,178,238,171,200, 34,132, 64, 40, 20, 34, 46, 46, 14, 27, 55,110,196,174, 93,187,144,151,151,135,216,216, 88,215, +185,119, 6,185,123,227, 96,137, 68, 34, 40, 20,138,145, 69, 39, 14,247, 10, 0,180, 77, 77, 16, 8, 4,224, 56, 14, 44,203, 78, +232, 96,133,134,134,238,220,189,123,247,134,236,236,108,250,219, 43,238,156,105, 37,220,139,205,102, 67, 85, 85,213,134,162,162, + 34,120,226,122, 49, 12,131,228,228,228,187,166, 5,247,237,251,107,164, 66, 74, 74, 10, 22, 47, 94,236,145,104,114,231,140,219, +241,193, 93,211,130,191, 15,249,107,179,205, 89,253, 51,196,254,242, 35,175, 56, 31, 84,140,186, 70,242, 92, 76, 96,225,150,215, +126,184, 38, 43, 70,142, 47,206, 92,193,222,223, 55, 55, 24, 58,186,192,117,106,192, 25,175, 35,255,165, 20,196, 71, 5, 35, 62, + 42, 24,249, 47,165,128,187, 93, 15,210,163, 7,145, 4,226,134, 9,237,227,216,166,187,222,127,255,125, 83,112,112, 48,100, 50, + 25,196, 98, 49,218,218,218,144,144,144, 0,137, 68,226,122, 2,165,105, 26, 5, 5, 5, 70,163,209,120,192,211,138,248,138,233, +159,237,250,183,151, 21, 34,169, 31,112,227, 12,252,229,126, 56,244,155, 15,128,254,118,128, 17,225,133, 39,255,142,153, 61, 51, +240, 25,138,162,148,211,237, 36,232,245,122,108,216,176, 97,208,108, 54,223, 83,160,123,123,123,251, 31,173, 86,235,146,162,162, +162,161,178,178,178,123, 22, 87, 78, 78,150,101,151,238,217,179,103, 64,167,211,221,147,192, 18, 8, 4, 91,109, 54,155,127, 73, + 73, 9,151,154,154,106, 95,182,108,153,125,201,146, 37,246,204,204, 76,123, 66, 66,130,125,197,138, 21,118,179,217, 44,241,241, +241,217, 61, 65,167,120,173,178,178,114,209,250,245,235, 27, 75, 75, 75, 35, 23, 44, 88, 16, 70, 8,249,197,104, 37, 45, 45, 77, +225, 20, 87, 21, 21, 21, 19,198, 96, 89, 44,150,125,197,197,197,102,231, 42, 23,177, 88,140,144,144, 16,151, 16, 22,137, 68,144, + 72, 36,176, 90,173,216,191,127,255,208,208,208,208, 94, 79,234,222,213,213,117,120,243,230,205,173,213,213,213,182,222,222, 94, + 80, 20,133,155, 55,111,162,176,176,208,122,240,224,193,155, 38,147,233,160,183,237,217,219,219, 91,186,121,243,230,150, 19, 39, + 78,216,104,154, 70, 79, 79, 15,252,253,253, 93,156,125,125,125, 94,115,102,102,102,234, 12, 6,131,255,224,224,224,104,110, 38, +229,235,235, 59, 31,192,151,222,112,166,164,164,232, 91, 91, 91,229,133,133,133,167, 23, 45, 90,180, 75, 46,151, 55,201,229,242, +166, 69,139, 22,237,254,232,163,143,254, 32,149, 74,211, 1,120,253,114, 88,154,166, 57,247,126,195, 61, 6, 75, 34,145, 64, 36, + 18,121,148,166, 34, 32, 32,224,227,226,226,226,128,142,142, 14, 88, 44, 22,168,213,106,168,213,106,180,181,181,185, 6,225, 81, +222,195,134,193,193, 65,233,253,238, 59, 8, 33,127, 32,132, 36, 19, 66,162, 9, 33,211,113,145,204,239,220,196,213, 83,132, 16, + 13,128,167, 28,219,137, 0,254,247,126, 58, 88, 78,129, 37, 16, 8,240,234,171,175,226,212,169, 83,136,137,137,113, 5,182,187, + 7,185,123, 35, 8,134,135,135,145,148,148, 4, 11,203,222, 37,208, 5, 2, 1, 66, 66, 67,161,211,233, 60,114,176, 40,138,250, + 73,118,118, 54,125,245,234, 85,168, 84, 42,212,214,214,186,138, 90,173, 70, 93, 93, 29,234,235,235,113,237,218, 53,164,166,166, +194, 96, 48,224,217,103,159,117,166,105, 24,247,210,241,212,109,114,174, 4,244,192,109,250, 46, 56, 31, 62, 7, 43, 34,196,103, +237, 15,231, 81,248,226,236, 21,124, 88,221,254, 49, 33,164,242,164,166,247,179,156,212, 97, 88, 43, 86, 33,233,165,255, 30,153, + 22, 4,192,221,174,135,181,226,117, 80, 62, 51,113,169, 83,140, 94,179,109,204,167,102,171,213,122, 49, 40, 40,232,200,225,195, +135,215,189,241,198, 27, 98, 0,240,241,241,193,219,111,191, 13, 66, 8,196, 98, 49, 24,134, 65,110,110,110,255,237,219,183,247, + 16, 66,116, 30,222, 40,178,240, 32,113,193,107, 63,255,119, 41,212, 7, 1, 90,132, 59,126, 41, 72,126,118, 29,110, 55,158, 7, +186,174, 3,140, 8, 7,118,188, 57,243,199,111,125,112, 16,192,194,233,114, 2,234,235,235,241,214, 91,111,221,179,184,250,182, +147, 85, 94, 94,254, 91,150,101,223,156, 66,206,165, 91,182,108, 57,169, 80, 40, 38, 61, 45, 98, 48, 24, 86, 71, 70, 70,174,155, +232,198,211,235,245, 19, 78,117, 16, 66,154, 41,138,122,190,165,165,229, 63, 26, 26, 26,142,143,245,127, 13, 13, 13,199, 23, 47, + 94,204, 92,188,120,113,171, 39,171, 8,107,107,107,107, 51, 50, 50,138,247,238,221,155,155,159,159, 47,147, 72, 36,240,247,247, + 71, 99, 99,163, 43, 15, 14,203,178,216,182,109,219,144,205,102,251,248,242,229,203,231, 61, 28, 8,135, 41,138,122, 37, 39, 39, +103,189, 82,169,252, 49,199,113, 51, 88,150,237, 50, 24, 12, 39,250,250,250, 38,149, 7,139, 16,194, 81, 20,181, 42, 55, 55,119, + 77,108,108,236, 10,171,213, 58,195,110,183,119,181,182,182,126,218,219,219,123,104, 50,156,231,206,157, 51,238,223,191,255, 47, + 70,163, 81, 21, 17, 17,241,141,159,159, 31,203,178, 44, 35,147,201,252,125,125,125, 83, 0,156, 7,112,205, 27,206,175,191,254, +250,214,129, 3, 7, 90, 44, 22, 75,220,129, 3, 7,206,250,251,251,159,162, 40,138, 18,137, 68, 65, 50,153,236,105, 0,167, 1, +104,189, 61, 86,134, 97,198,117,176,224, 97,124, 71, 95, 95,223,197, 29, 59,118,164, 62,241,196, 19, 40, 46, 46,238,246,243,243, +147,175, 88,177, 66, 96, 50,153,168,241, 28,172,233, 32,176, 30, 0,116, 57, 92,222,127,114,198, 92,185, 5,190,255, 14,128,233, + 62, 11,212,187,132,212,220,185,115, 93,219,238,197, 45, 6,203, 35,216,237,118,136, 68, 34, 8, 4, 2,204, 14, 11,115,137, 57, + 66, 8,116, 58, 29,186,187,187, 61, 18, 88, 52, 77, 51, 20, 69, 97,229,202,149, 30,237,247,149, 87, 94,193,233,211,167, 49,209, +116,162,251,138,191,168,168,168, 9,197,144,227, 88, 60, 94, 69, 24, 17, 17, 49, 37,156, 15,165,192,106, 53,154, 11, 55, 30,188, +188, 77,127,219, 82,249,247,218,158,141, 59, 0, 2, 4, 85,171,130,169, 37, 11,233, 54, 88, 14,102,129,242, 31, 25,108, 72,127, + 7, 40, 95, 5, 58, 16,129, 95, 87,235,111,217,136,117, 92,247,193,100, 50,229,239,219,183,143,169,174,174,126,185,168,168, 40, + 64,165, 82,225,245,215, 95, 7,203,178,168,171,171, 67, 78, 78, 78,183,209,104, 44, 49,153, 76,187, 60,173,196, 76, 63,193,187, +123,255,101,201, 12,218,214, 15,220,170, 5, 36, 1,152, 25,228,135, 63, 95, 58, 3,220,250, 26, 96, 68, 0, 35, 70,218, 15, 84, + 72,142,143, 86, 81, 20,149, 69, 8,249,106, 58,156,128, 23, 95,124,113,202,196,149,187, 32, 2,240,216, 84, 30,167, 83,100,173, + 89,179,230, 36,199,113, 62,147,177,119, 29, 57,153,236, 83,216, 57, 54, 99,130, 41, 95, 71,250,134, 10,111,120,109, 54,219, 54, +141, 70,131,220,220,220,220,213,171, 87,203,148, 74, 37,162,162,162,208,212,212,132,198,198, 70,148,148,148, 12, 13, 15, 15, 31, + 50,153, 76,155, 38, 81,255, 18, 71,153,170, 54,224, 0, 28,118,148, 41, 65, 94, 94,222,159,245,122,125, 87, 72, 72,200, 2,145, + 72,244, 3,140,196,249,220,114,236, 67, 59, 25,206,156,156, 28,181, 94,175,191, 19, 30, 30,158,225,224, 12, 4,112, 19,192,127, + 77,146,179, 75,173, 86, 71,167,167,167,115, 2,129,128, 56, 28, 6, 34, 20, 10,137, 80, 40, 36, 0, 80, 93, 93, 45, 1, 48, 97, +204,101, 71, 71,199,191, 30, 59,118, 12, 53, 53, 53, 11,250,251,251, 95, 3,240,219,193,193,193,244,111,190,249,198, 53, 8,143, +225,118, 74,120,253, 52,225,245,185,108,140,239, 59, 1,100, 77,131,227,195,123,239,189,135,146,146, 18, 76,148,129,188,170,170, + 10,152, 96,138,208,121,173, 56,197,147,213,106, 69,125,125,189,243,221,123,174,105, 65,103,138,134,225,225,225,113, 51,189,115, + 28,103,103, 89, 22, 71,143, 30,245, 72,100,149,151,151,195,108, 54,131,227, 56,143,250, 89, 71, 98, 82,116,119,119, 35, 44, 44, +204,233, 56,187,155, 34, 94,183, 41,195, 48,136,139,139,195,157, 59,119, 48,115,230, 76, 0, 35,211,130, 46,119,111, 96,224,145, +185,254,199, 77, 52,234,142,167,162, 2, 3,104, 17,117,236, 71, 49,162,167,158, 79,146, 99, 78,136, 31, 4, 98, 9,110,247,218, +241,149,190, 31,255,115,222,120,131,181,219,159, 63,213,216,163,241,208,117,202,152, 61,123,246,118,187,221,158, 72,211,180, 15, + 33,164,159, 97,152, 43,237,237,237, 59, 9, 33,245,222, 84, 34, 80,198,104,131,124,153, 0,161, 80, 76,236, 28, 7,128, 6, 40, +103, 97, 70, 62,233,145,237, 33,179, 85,100, 39, 84,101,167,241,206,250,251,221,248, 74,165,178,122, 96, 96,224,129,203,228,238, +235,235,251, 11,173, 86,251,208,102,114,119, 98,254,252,249,105, 50,153,108, 59,199,113,243,205,102,243, 44,153, 76,214, 73, 81, +212,159,250,250,250,254,243,202,149, 43, 23,248,225,243,254, 97, 42, 51,185,143,114,141,191, 0, 96,231,140, 25, 51,148,117,117, +117, 18,119, 7,203,189,191,244, 38, 47, 18,143,233,135,248,248,248,139,101,101,101,105,115,231,206,165,221, 3,217,105,154,118, + 37,199,164,105,218,181,178,244,194,133, 11,195,121,121,121,231,213,106,245, 63,140,197, 25, 19, 19, 83, 93, 83, 83,179,216,100, + 50,253,141,144,114,207,236,238,220, 30, 26, 26,194,187,239,190,251,133, 86,171, 29,245, 85, 57, 42,149,106, 79, 65, 65,193,134, +231,158,123,142,166,105,250,111, 98,174,156,175,245,113, 22,171,213,138,202,202, 74,174,180,180,244,195,235,215,175,143, 25,131, +149,146,146,114,163,182,182, 54,194,153, 50, 97,172,226,142,140,140,140,142, 11, 23, 46,132,125,159,156,143,140,192,114,116, 40, +212, 51, 49,129, 47, 19, 66,253,132, 2,149, 68, 83, 68, 60, 76,208, 72, 1,213, 62,131,146,253, 85,237,237, 67,252,109,203,227, +161,188, 81, 40,138,230, 95,242,251,104, 33, 38, 38, 70,171,213,106,163,199,185, 38,120,129,245,128,139,244,144,144,144, 83, 52, + 77, 71, 58, 69,244, 88,159, 14, 55,169,165,179,179,243, 71,157,157,157, 99,230, 83,140,136,136,120, 92, 42,149,254,134,227,184, +116, 79, 94,246, 76,211,244, 37,179,217,252,243,239,251,101,207,137,137,137,186, 75,151, 46, 61, 46,147,201,238,138, 43,116,214, +249,219,199,222,220,220,140,229,203,151, 27,212,106,117,212,247,201,249, 72, 9, 44, 30, 60,120,240,120, 84, 16, 30, 30,126,209, +106,181,170,204,102,179,208, 98,177, 8,135,135,135,239, 26,224,100, 50,153,113,112,112, 48,148,111, 41, 30, 15, 26,194,194,194, +148,129,129,129,255, 39, 20, 10, 37,163, 61, 56,124, 27,118,187,221,220,213,213,181,180,189,189,189,241,251,228,124,224, 49,218, + 10,153,169, 42, 0, 22,241,156, 60, 39,207,201,115,242,156, 60, 39,207,201,115, 62,106,133,230,181, 60, 15, 30, 60,120,240,224, +193,131,199,212,130, 23, 88, 60,120,240,224,193,131, 7, 15, 30,188,192,226,193,131, 7, 15, 30, 60,120,240,224, 5, 22, 15, 30, + 60,120,240,224,193,131,199, 35,133,255, 31, 0, 6,160,247, 56,137, 5,159,139, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, 0}; diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h index cc18c81fe51..0786d0f9be0 100644 --- a/source/blender/editors/include/ED_anim_api.h +++ b/source/blender/editors/include/ED_anim_api.h @@ -30,15 +30,18 @@ #define ED_ANIM_API_H struct ID; -struct Scene; struct ListBase; +struct AnimData; + struct bContext; struct wmWindowManager; struct ScrArea; struct ARegion; struct View2D; -struct gla2DDrawInfo; + +struct Scene; struct Object; + struct bActionGroup; struct FCurve; struct FModifier; @@ -88,18 +91,19 @@ typedef enum eAnimCont_Types { typedef struct bAnimListElem { struct bAnimListElem *next, *prev; - void *data; /* source data this elem represents */ - int type; /* one of the ANIMTYPE_* values */ - int flag; /* copy of elem's flags for quick access */ - int index; /* copy of adrcode where applicable */ + void *data; /* source data this elem represents */ + int type; /* one of the ANIMTYPE_* values */ + int flag; /* copy of elem's flags for quick access */ + int index; /* copy of adrcode where applicable */ - void *key_data; /* motion data - mostly F-Curves, but can be other types too */ - short datatype; /* type of motion data to expect */ + void *key_data; /* motion data - mostly F-Curves, but can be other types too */ + short datatype; /* type of motion data to expect */ - struct ID *id; /* ID block that channel is attached to (may be used */ + struct ID *id; /* ID block that channel is attached to */ + struct AnimData *adt; /* source of the animation data attached to ID block (for convenience) */ - void *owner; /* group or channel which acts as this channel's owner */ - short ownertype; /* type of owner */ + void *owner; /* group or channel which acts as this channel's owner */ + short ownertype; /* type of owner */ } bAnimListElem; @@ -118,6 +122,7 @@ typedef enum eAnim_ChannelType { ANIMTYPE_FILLACTD, ANIMTYPE_FILLDRIVERS, ANIMTYPE_FILLMATD, + ANIMTYPE_FILLPARTD, ANIMTYPE_DSMAT, ANIMTYPE_DSLAM, @@ -125,6 +130,8 @@ typedef enum eAnim_ChannelType { ANIMTYPE_DSCUR, ANIMTYPE_DSSKEY, ANIMTYPE_DSWOR, + ANIMTYPE_DSPART, + ANIMTYPE_DSMBALL, ANIMTYPE_SHAPEKEY, // XXX probably can become depreceated??? @@ -164,6 +171,7 @@ typedef enum eAnimFilter_Flags { ANIMFILTER_ACTIVE = (1<<8), /* channel should be 'active' */ ANIMFILTER_ANIMDATA = (1<<9), /* only return the underlying AnimData blocks (not the tracks, etc.) data comes from */ ANIMFILTER_NLATRACKS = (1<<10), /* only include NLA-tracks */ + ANIMFILTER_SELEDIT = (1<<11), /* link editability with selected status */ } eAnimFilter_Flags; @@ -181,12 +189,15 @@ typedef enum eAnimFilter_Flags { #define EXPANDED_OBJC(ob) ((ob->nlaflag & OB_ADS_COLLAPSED)==0) /* 'Sub-object' channels (flags stored in Object block) */ #define FILTER_MAT_OBJC(ob) ((ob->nlaflag & OB_ADS_SHOWMATS)) +#define FILTER_PART_OBJC(ob) ((ob->nlaflag & OB_ADS_SHOWPARTS)) /* 'Sub-object' channels (flags stored in Data block) */ #define FILTER_SKE_OBJD(key) ((key->flag & KEYBLOCK_DS_EXPAND)) #define FILTER_MAT_OBJD(ma) ((ma->flag & MA_DS_EXPAND)) #define FILTER_LAM_OBJD(la) ((la->flag & LA_DS_EXPAND)) #define FILTER_CAM_OBJD(ca) ((ca->flag & CAM_DS_EXPAND)) #define FILTER_CUR_OBJD(cu) ((cu->flag & CU_DS_EXPAND)) +#define FILTER_PART_OBJD(part) ((part->flag & PART_DS_EXPAND)) +#define FILTER_MBALL_OBJD(mb) ((mb->flag2 & MB_DS_EXPAND)) /* 'Sub-object/Action' channels (flags stored in Action) */ #define SEL_ACTC(actc) ((actc->flag & ACT_SELECTED)) #define EXPANDED_ACTC(actc) ((actc->flag & ACT_COLLAPSED)==0) @@ -337,12 +348,15 @@ void ipo_rainbow(int cur, int tot, float *out); /* Obtain the AnimData block providing NLA-scaling for the given channel if applicable */ struct AnimData *ANIM_nla_mapping_get(bAnimContext *ac, bAnimListElem *ale); -/* Set/clear temporary mapping of coordinates from 'local-action' time to 'global-nla-mapped' time */ -void ANIM_nla_mapping_draw(struct gla2DDrawInfo *di, struct AnimData *adt, short restore); - /* Apply/Unapply NLA mapping to all keyframes in the nominated F-Curve */ void ANIM_nla_mapping_apply_fcurve(struct AnimData *adt, struct FCurve *fcu, short restore, short only_keys); +/* ..... */ + +/* Perform auto-blending/extend refreshes after some operations */ +// NOTE: defined in space_nla/nla_edit.c, not in animation/ +void ED_nla_postop_refresh(bAnimContext *ac); + /* ------------- Utility macros ----------------------- */ /* checks if the given BezTriple is selected */ diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h index 8c19f2c3ecf..738cbf094cb 100644 --- a/source/blender/editors/include/ED_armature.h +++ b/source/blender/editors/include/ED_armature.h @@ -99,6 +99,8 @@ void ED_armature_from_edit(struct Scene *scene, struct Object *obedit); void ED_armature_to_edit(struct Object *ob); void ED_armature_edit_free(struct Object *ob); void ED_armature_edit_remake(struct Object *obedit); +void ED_armature_deselectall(struct Object *obedit, int toggle, int doundo); + int ED_do_pose_selectbuffer(struct Scene *scene, struct Base *base, unsigned int *buffer, short hits, short extend); void mouse_armature(struct bContext *C, short mval[2], int extend); @@ -112,9 +114,14 @@ void add_primitive_bone(struct Scene *scene, struct View3D *v3d, struct RegionVi void transform_armature_mirror_update(struct Object *obedit); void clear_armature(struct Scene *scene, struct Object *ob, char mode); -void create_vgroups_from_armature(struct Scene *scene, struct Object *ob, struct Object *par); void docenter_armature (struct Scene *scene, struct View3D *v3d, struct Object *ob, int centermode); +#define ARM_GROUPS_NAME 1 +#define ARM_GROUPS_ENVELOPE 2 +#define ARM_GROUPS_AUTO 3 + +void create_vgroups_from_armature(struct Scene *scene, struct Object *ob, struct Object *par, int mode); + void auto_align_armature(struct Scene *scene, struct View3D *v3d, short mode); void unique_editbone_name(struct ListBase *ebones, char *name, EditBone *bone); /* if bone is already in list, pass it as param to ignore it */ void ED_armature_bone_rename(struct bArmature *arm, char *oldnamep, char *newnamep); @@ -126,6 +133,7 @@ void ED_armature_exit_posemode(struct bContext *C, struct Base *base); void ED_armature_enter_posemode(struct bContext *C, struct Base *base); int ED_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan); void ED_pose_deselectall(struct Object *ob, int test, int doundo); +void ED_pose_recalculate_paths(struct bContext *C, struct Scene *scene, struct Object *ob); /* sketch */ @@ -133,9 +141,6 @@ int ED_operator_sketch_mode_active_stroke(struct bContext *C); int ED_operator_sketch_full_mode(struct bContext *C); int ED_operator_sketch_mode(const struct bContext *C); -void ED_freeSketch(struct SK_Sketch *sketch); -struct SK_Sketch* ED_createSketch(); - void BIF_convertSketch(struct bContext *C); void BIF_deleteSketch(struct bContext *C); void BIF_selectAllSketch(struct bContext *C, int mode); /* -1: deselect, 0: select, 1: toggle */ diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h index 1b8524eea33..c56807ad09a 100644 --- a/source/blender/editors/include/ED_fileselect.h +++ b/source/blender/editors/include/ED_fileselect.h @@ -64,13 +64,13 @@ typedef struct FileLayout short width; short height; short flag; + short dirty; float column_widths[MAX_FILE_COLUMN]; } FileLayout; struct FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile); -short ED_fileselect_set_params(struct SpaceFile *sfile, const char *title, const char *dir, const char *path, - short flag, short display, short filter, short sort); +short ED_fileselect_set_params(struct SpaceFile *sfile); void ED_fileselect_reset_params(struct SpaceFile *sfile); @@ -80,6 +80,7 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar); FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar); +int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar); int ED_fileselect_layout_offset(FileLayout* layout, int x, int y); void ED_fileselect_layout_tilepos(FileLayout* layout, int tile, short *x, short *y); diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h index 3b3d0157362..64672e3502b 100644 --- a/source/blender/editors/include/ED_keyframing.h +++ b/source/blender/editors/include/ED_keyframing.h @@ -110,8 +110,7 @@ void ANIM_OT_delete_keyframe(struct wmOperatorType *ot); * required for each space. */ void ANIM_OT_insert_keyframe_menu(struct wmOperatorType *ot); -void ANIM_OT_delete_keyframe_menu(struct wmOperatorType *ot); // xxx unimplemented yet -void ANIM_OT_delete_keyframe_old(struct wmOperatorType *ot); // xxx rename and keep? +void ANIM_OT_delete_keyframe_v3d(struct wmOperatorType *ot); /* Keyframe managment operators for UI buttons. */ void ANIM_OT_insert_keyframe_button(struct wmOperatorType *ot); diff --git a/source/blender/makesrna/intern/rna_scriptlink.c b/source/blender/editors/include/ED_mball.h index b486cd4a874..adb50867bf9 100644 --- a/source/blender/makesrna/intern/rna_scriptlink.c +++ b/source/blender/editors/include/ED_mball.h @@ -6,7 +6,7 @@ * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -17,32 +17,23 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * Contributor(s): Blender Foundation (2008). + * The Original Code is Copyright (C) 2008 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation * * ***** END GPL LICENSE BLOCK ***** */ -#include <stdlib.h> - -#include "RNA_define.h" -#include "RNA_types.h" - -#include "rna_internal.h" - -#include "DNA_scriptlink_types.h" - -#ifdef RNA_RUNTIME - -#else +void ED_operatortypes_metaball(void); +void ED_keymap_metaball(struct wmWindowManager *wm); -void RNA_def_scriptlink(BlenderRNA *brna) -{ - StructRNA *srna; +struct MetaElem *add_metaball_primitive(struct bContext *C, int type, int newname); - srna= RNA_def_struct(brna, "ScriptLink", NULL); - RNA_def_struct_ui_text(srna, "Script Link", "Scripts linked to a datablock, to be executed on changes to the datablock."); - RNA_def_struct_ui_icon(srna, ICON_PYTHON); -} +void mouse_mball(struct bContext *C, short mval[2], int extend); -#endif +void free_editMball(struct Object *obedit); +void make_editMball(struct Object *obedit); +void load_editMball(struct Object *obedit); diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 8d4819d2d71..c8a72a2aa97 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -54,8 +54,8 @@ void ED_base_object_activate(struct bContext *C, struct Base *base); void ED_base_object_free_and_unlink(struct Scene *scene, struct Base *base); void ED_object_apply_obmat(struct Object *ob); - /* single object duplicate, if dupflag==0, fully linked, else it uses U.dupflag */ -struct Base *ED_object_add_duplicate(struct Scene *scene, struct Base *base, int usedupflag); + /* single object duplicate, if dupflag==0, fully linked, else it uses the flags given */ +struct Base *ED_object_add_duplicate(struct Scene *scene, struct Base *base, int dupflag); void ED_object_parent(struct Object *ob, struct Object *parent, int type, const char *substr); diff --git a/source/blender/editors/include/ED_previewrender.h b/source/blender/editors/include/ED_previewrender.h index 0e50ea896d6..41cbecb5353 100644 --- a/source/blender/editors/include/ED_previewrender.h +++ b/source/blender/editors/include/ED_previewrender.h @@ -71,7 +71,7 @@ void ED_preview_init_dbase(void); void ED_preview_free_dbase(void); void ED_preview_shader_job(const struct bContext *C, void *owner, struct ID *id, struct ID *parent, int sizex, int sizey); -void ED_preview_iconrender(struct Scene *scene, struct ID *id, int *rect, int sizex, int sizey); +void ED_preview_iconrender(struct Scene *scene, struct ID *id, unsigned int *rect, int sizex, int sizey); void ED_preview_draw(const struct bContext *C, void *idp, void *parentp, rcti *rect); diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 6036a4c9e0f..fc29d64eb37 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -55,13 +55,14 @@ void ED_region_init(struct bContext *C, struct ARegion *ar); void ED_region_tag_redraw(struct ARegion *ar); void ED_region_tag_redraw_partial(struct ARegion *ar, struct rcti *rct); void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *ar); -void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, char *context); +void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, char *context, int contextnr); void ED_region_header_init(struct ARegion *ar); void ED_region_header(const struct bContext *C, struct ARegion *ar); /* spaces */ void ED_spacetypes_init(void); void ED_spacetypes_keymap(struct wmWindowManager *wm); +int ED_area_header_switchbutton(const struct bContext *C, struct uiBlock *block, int yco); int ED_area_header_standardbuttons(const struct bContext *C, struct uiBlock *block, int yco); void ED_area_overdraw(struct bContext *C); void ED_area_overdraw_flush(struct bContext *C, struct ScrArea *sa, struct ARegion *ar); @@ -86,6 +87,7 @@ void ED_screen_draw(struct wmWindow *win); void ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win); void ED_screen_do_listen(struct wmWindow *win, struct wmNotifier *note); bScreen *ED_screen_duplicate(struct wmWindow *win, struct bScreen *sc); +bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, char *name); void ED_screen_set(struct bContext *C, struct bScreen *sc); void ED_screen_set_scene(struct bContext *C, struct Scene *scene); void ED_screen_set_subwinactive(struct wmWindow *win, struct wmEvent *event); @@ -94,6 +96,8 @@ void ED_screen_animation_timer(struct bContext *C, int redraws, int enable); int ED_screen_full_newspace(struct bContext *C, ScrArea *sa, int type); void ED_screen_full_prevspace(struct bContext *C); +void ED_screen_new_window(struct bContext *C, struct rcti *position, int type); + /* anim */ void ED_update_for_newframe(const struct bContext *C, int mute); unsigned int ED_screen_view3d_layers(struct bScreen *screen); @@ -130,6 +134,7 @@ int ED_operator_editsurf(struct bContext *C); int ED_operator_editsurfcurve(struct bContext *C); int ED_operator_editfont(struct bContext *C); int ED_operator_editlattice(struct bContext *C); +int ED_operator_editmball(struct bContext *C); int ED_operator_uvedit(struct bContext *C); int ED_operator_uvmap(struct bContext *C); int ED_operator_posemode(struct bContext *C); @@ -142,5 +147,6 @@ int ED_operator_posemode(struct bContext *C); #define ED_KEYMAP_ANIMATION 8 #define ED_KEYMAP_FRAMES 16 + #endif /* ED_SCREEN_H */ diff --git a/source/blender/editors/include/ED_screen_types.h b/source/blender/editors/include/ED_screen_types.h index 3ea5dfba65c..76a2a55c29e 100644 --- a/source/blender/editors/include/ED_screen_types.h +++ b/source/blender/editors/include/ED_screen_types.h @@ -33,9 +33,18 @@ typedef struct ScreenAnimData { ARegion *ar; /* do not read from this, only for comparing if region exists */ int redraws; - int reverse; + int flag; /* flags for playback */ } ScreenAnimData; +/* for animplayer */ +enum { + /* user-setting - frame range is played backwards */ + ANIMPLAY_FLAG_REVERSE = (1<<0), + /* temporary - playback just jumped to the start/end */ + ANIMPLAY_FLAG_JUMPED = (1<<1), +}; + + typedef struct AZone { struct AZone *next, *prev; diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h index 7ccbf1ff18d..7b1c87f9cb2 100644 --- a/source/blender/editors/include/ED_util.h +++ b/source/blender/editors/include/ED_util.h @@ -44,6 +44,7 @@ void ED_editors_exit (struct bContext *C); /* undo.c */ void ED_undo_push (struct bContext *C, char *str); void ED_undo_push_op (struct bContext *C, struct wmOperator *op); +void ED_undo_pop_op (struct bContext *C, struct wmOperator *op); void ED_undo_pop (struct bContext *C); void ED_undo_redo (struct bContext *C); void ED_OT_undo (struct wmOperatorType *ot); diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h index f9e427ac006..010101a1a80 100644 --- a/source/blender/editors/include/UI_icons.h +++ b/source/blender/editors/include/UI_icons.h @@ -158,10 +158,10 @@ DEF_ICON(ICON_NLA) DEF_ICON(ICON_SCRIPTWIN) DEF_ICON(ICON_TIME) DEF_ICON(ICON_NODE) -DEF_ICON(ICON_BLANK053) -DEF_ICON(ICON_BLANK054) -DEF_ICON(ICON_BLANK055) -DEF_ICON(ICON_BLANK056) +DEF_ICON(ICON_LOGIC) +DEF_ICON(ICON_CONSOLE) +DEF_ICON(ICON_PREFERENCES) +DEF_ICON(ICON_ASSET_MANAGER) DEF_ICON(ICON_BLANK057) DEF_ICON(ICON_BLANK058) DEF_ICON(ICON_BLANK059) @@ -179,7 +179,7 @@ DEF_ICON(ICON_WPAINT_HLT) DEF_ICON(ICON_SCULPTMODE_HLT) DEF_ICON(ICON_POSE_HLT) DEF_ICON(ICON_PARTICLEMODE) -DEF_ICON(ICON_BLANK062) +DEF_ICON(ICON_LIGHTPAINT) DEF_ICON(ICON_BLANK063) DEF_ICON(ICON_BLANK064) DEF_ICON(ICON_BLANK065) @@ -235,10 +235,10 @@ DEF_ICON(ICON_RENDER_RESULT) DEF_ICON(ICON_SURFACE_DATA) DEF_ICON(ICON_EMPTY_DATA) DEF_ICON(ICON_SETTINGS) -DEF_ICON(ICON_BLANK080D) +DEF_ICON(ICON_RENDER_ANIMATION) DEF_ICON(ICON_BLANK080E) DEF_ICON(ICON_BLANK080F) -DEF_ICON(ICON_BLANK080) +DEF_ICON(ICON_BOIDS) DEF_ICON(ICON_STRANDS) DEF_ICON(ICON_LIBRARY_DATA_INDIRECT) DEF_ICON(ICON_BLANK082) @@ -570,7 +570,7 @@ DEF_ICON(ICON_PAUSE) DEF_ICON(ICON_PREV_KEYFRAME) DEF_ICON(ICON_NEXT_KEYFRAME) DEF_ICON(ICON_PLAY_AUDIO) -DEF_ICON(ICON_BLANK178) +DEF_ICON(ICON_PLAY_REVERSE) DEF_ICON(ICON_BLANK179) DEF_ICON(ICON_BLANK180) DEF_ICON(ICON_PMARKER_ACT) @@ -819,9 +819,9 @@ DEF_ICON(ICON_MATSPHERE) DEF_ICON(ICON_MATCUBE) DEF_ICON(ICON_MONKEY) DEF_ICON(ICON_HAIR) -DEF_ICON(ICON_RING) -DEF_ICON(ICON_BLANK317) -DEF_ICON(ICON_BLANK318) +DEF_ICON(ICON_ALIASED) +DEF_ICON(ICON_ANTIALIASED) +DEF_ICON(ICON_MAT_SPHERE_SKY) DEF_ICON(ICON_BLANK319) DEF_ICON(ICON_BLANK320) DEF_ICON(ICON_BLANK321) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index b40f90dcf0c..70fbad3216d 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -142,6 +142,7 @@ typedef struct uiLayout uiLayout; #define UI_BUT_ANIMATED_KEY (1<<21) #define UI_BUT_DRIVEN (1<<22) #define UI_BUT_INACTIVE (1<<23) +#define UI_BUT_LAST_ACTIVE (1<<24) #define UI_PANEL_WIDTH 340 #define UI_COMPACT_PANEL_WIDTH 160 @@ -206,6 +207,8 @@ typedef struct uiLayout uiLayout; #define HSVCIRCLE (42<<9) #define LISTBOX (43<<9) #define LISTROW (44<<9) +#define HOTKEYEVT (45<<9) + #define BUTTYPE (63<<9) /* Drawing @@ -313,6 +316,10 @@ int uiButGetRetVal (uiBut *but); void uiButSetFlag (uiBut *but, int flag); void uiButClearFlag (uiBut *but, int flag); +/* special button case, only draw it when used actively, for outliner etc */ +int uiButActiveOnly (const struct bContext *C, uiBlock *block, uiBut *but); + + /* Buttons * * Functions to define various types of buttons in a block. Postfixes: @@ -422,6 +429,7 @@ uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip); void uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *spoin, char *tip); +uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *keypoin, short *modkeypoin, char *tip); uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, char *tip); @@ -474,9 +482,9 @@ int uiSearchBoxhHeight(void); void uiBlockSetHandleFunc(uiBlock *block, uiBlockHandleFunc func, void *arg); void uiBlockSetButmFunc (uiBlock *block, uiMenuHandleFunc func, void *arg); - void uiBlockSetFunc (uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2); -void uiBlockSetRenameFunc(uiBlock *block, uiButHandleRenameFunc func, void *arg1); + +void uiButSetRenameFunc (uiBut *but, uiButHandleRenameFunc func, void *arg1); void uiButSetFunc (uiBut *but, uiButHandleFunc func, void *arg1, void *arg2); void uiButSetNFunc (uiBut *but, uiButHandleNFunc func, void *argN, void *arg2); @@ -667,9 +675,9 @@ void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func); void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname); void uiItemMenuEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname); -/* Animation */ - +/* Helpers for Operators */ void uiAnimContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index); +void uiFileBrowseContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop); /* Styled text draw */ void uiStyleFontSet(struct uiFontStyle *fs); diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h index e3fbd906cf6..38c4d82e6da 100644 --- a/source/blender/editors/include/UI_view2d.h +++ b/source/blender/editors/include/UI_view2d.h @@ -145,10 +145,15 @@ typedef struct View2DScrollers View2DScrollers; void UI_view2d_region_reinit(struct View2D *v2d, short type, int winx, int winy); void UI_view2d_curRect_validate(struct View2D *v2d); +void UI_view2d_curRect_validate_resize(struct View2D *v2d, int resize); void UI_view2d_curRect_reset(struct View2D *v2d); void UI_view2d_sync(struct bScreen *screen, struct ScrArea *sa, struct View2D *v2dcur, int flag); void UI_view2d_totRect_set(struct View2D *v2d, int width, int height); +void UI_view2d_totRect_set_resize(struct View2D *v2d, int width, int height, int resize); + +/* per tab offsets, returns 1 if tab changed */ +int UI_view2d_tab_set(struct View2D *v2d, int tab); /* view matrix operations */ void UI_view2d_view_ortho(const struct bContext *C, struct View2D *v2d); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 284ec6943ea..9e9b6165a73 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -442,7 +442,7 @@ static int ui_but_equals_old(uiBut *but, uiBut *oldbut) if(but->retval != oldbut->retval) return 0; if(but->rnapoin.data != oldbut->rnapoin.data) return 0; if(but->rnaprop != oldbut->rnaprop) - if(but->rnaindex != oldbut->rnaindex) return 0; + if(but->rnaindex != oldbut->rnaindex) return 0; if(but->func != oldbut->func) return 0; if(but->funcN != oldbut->funcN) return 0; if(oldbut->func_arg1 != oldbut && but->func_arg1 != oldbut->func_arg1) return 0; @@ -496,6 +496,43 @@ static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut return found; } +/* needed for temporarily rename buttons, such as in outliner or fileselect, + they should keep calling uiDefButs to keep them alive */ +/* returns 0 when button removed */ +int uiButActiveOnly(const bContext *C, uiBlock *block, uiBut *but) +{ + uiBlock *oldblock; + uiBut *oldbut; + int activate= 0, found= 0, isactive= 0; + + oldblock= block->oldblock; + if(!oldblock) + activate= 1; + else { + for(oldbut=oldblock->buttons.first; oldbut; oldbut=oldbut->next) { + if(ui_but_equals_old(oldbut, but)) { + found= 1; + + if(oldbut->active) + isactive= 1; + + break; + } + } + } + if(activate || found==0) { + ui_button_activate_do( (bContext *)C, CTX_wm_region(C), but); + } + else if(found && isactive==0) { + + BLI_remlink(&block->buttons, but); + ui_free_but(C, but); + return 0; + } + + return 1; +} + void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block) { uiBut *but; @@ -702,8 +739,9 @@ static void ui_is_but_sel(uiBut *but) case BUT: push= 2; break; + case HOTKEYEVT: case KEYEVT: - if (value==-1) push= 1; + push= 2; break; case TOGBUT: case TOG: @@ -1809,7 +1847,33 @@ void ui_check_but(uiBut *but) strcat(but->drawstr, WM_key_event_string((short) ui_get_but_val(but))); } break; - + + case HOTKEYEVT: + if (but->flag & UI_SELECT) { + short *sp= (short *)but->func_arg3; + + strcpy(but->drawstr, but->str); + + if(*sp) { + char *str= but->drawstr; + + if(*sp & KM_SHIFT) + str= strcat(str, "Shift "); + if(*sp & KM_CTRL) + str= strcat(str, "Ctrl "); + if(*sp & KM_ALT) + str= strcat(str, "Alt "); + if(*sp & KM_OSKEY) + str= strcat(str, "Cmd "); + } + else + strcat(but->drawstr, "Press a key "); + } else { + /* XXX todo, button currently only used temporarily */ + strcpy(but->drawstr, WM_key_event_string((short) ui_get_but_val(but))); + } + break; + case BUT_TOGDUAL: /* trying to get the dual-icon to left of text... not very nice */ if(but->str[0]) { @@ -1823,10 +1887,8 @@ void ui_check_but(uiBut *but) } /* if we are doing text editing, this will override the drawstr */ - if(but->editstr) { - strcpy(but->drawstr, but->str); - strcat(but->drawstr, but->editstr); - } + if(but->editstr) + strcpy(but->drawstr, but->editstr); /* text clipping moved to widget drawing code itself */ } @@ -2767,9 +2829,10 @@ void uiBlockSetFunc(uiBlock *block, uiButHandleFunc func, void *arg1, void *arg2 block->func_arg2= arg2; } -void uiBlockSetRenameFunc(uiBlock *block, uiButHandleRenameFunc func, void *arg1) +void uiButSetRenameFunc(uiBut *but, uiButHandleRenameFunc func, void *arg1) { - + but->rename_func= func; + but->rename_arg1= arg1; } void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(const bContext *C, void *idv, void *argv, rcti *rect), void *arg) @@ -2903,6 +2966,17 @@ void uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, ui_check_but(but); } +/* short pointers hardcoded */ +/* modkeypoin will be set to KM_SHIFT, KM_ALT, KM_CTRL, KM_OSKEY bits */ +uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *keypoin, short *modkeypoin, char *tip) +{ + uiBut *but= ui_def_but(block, HOTKEYEVT|SHO, retval, str, x1, y1, x2, y2, keypoin, 0.0, 0.0, 0.0, 0.0, tip); + but->func_arg3= modkeypoin; /* XXX hrmf, abuse! */ + ui_check_but(but); + return but; +} + + /* arg is pointer to string/name, use uiButSetSearchFunc() below to make this work */ uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, char *tip) { diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index 4a2ef50a31b..2993a1aba15 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -144,7 +144,7 @@ void ui_but_anim_autokey(uiBut *but, Scene *scene, float cfra) if(fcu && !driven) { id= but->rnapoin.id.data; - + if(autokeyframe_cfra_can_key(scene, id)) { short flag = 0; @@ -165,6 +165,10 @@ void uiAnimContextProperty(const bContext *C, struct PointerRNA *ptr, struct Pro uiBlock *block; uiBut *but; + memset(ptr, 0, sizeof(*ptr)); + *prop= NULL; + *index= 0; + if(ar) { for(block=ar->uiblocks.first; block; block=block->next) { for(but=block->buttons.first; but; but= but->next) { diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 442d472a47a..30cfafb24f8 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -152,6 +152,10 @@ typedef struct uiAfterFunc { uiButHandleNFunc funcN; void *func_argN; + uiButHandleRenameFunc rename_func; + void *rename_arg1; + void *rename_orig; + uiBlockHandleFunc handle_func; void *handle_func_arg; int retval; @@ -239,7 +243,7 @@ static void ui_apply_but_func(bContext *C, uiBut *but) * handling is done, i.e. menus are closed, in order to avoid conflicts * with these functions removing the buttons we are working with */ - if(but->func || but->funcN || block->handle_func || (but->type == BUTM && block->butm_func) || but->optype || but->rnaprop) { + if(but->func || but->funcN || block->handle_func || but->rename_func || (but->type == BUTM && block->butm_func) || but->optype || but->rnaprop) { after= MEM_callocN(sizeof(uiAfterFunc), "uiAfterFunc"); after->func= but->func; @@ -250,6 +254,10 @@ static void ui_apply_but_func(bContext *C, uiBut *but) after->funcN= but->funcN; after->func_argN= but->func_argN; + after->rename_func= but->rename_func; + after->rename_arg1= but->rename_arg1; + after->rename_orig= but->rename_orig; /* needs free! */ + after->handle_func= block->handle_func; after->handle_func_arg= block->handle_func_arg; after->retval= but->retval; @@ -344,7 +352,12 @@ static void ui_apply_but_funcs_after(bContext *C) after.handle_func(C, after.handle_func_arg, after.retval); if(after.butm_func) after.butm_func(C, after.butm_func_arg, after.a2); - + + if(after.rename_func) + after.rename_func(C, after.rename_arg1, after.rename_orig); + if(after.rename_orig) + MEM_freeN(after.rename_orig); + if(after.undostr[0]) ED_undo_push(C, after.undostr); } @@ -468,10 +481,10 @@ static void ui_apply_but_TEX(bContext *C, uiBut *but, uiHandleButtonData *data) /* give butfunc the original text too */ /* feature used for bone renaming, channels, etc */ - /* XXX goes via uiButHandleRenameFunc now */ -// if(but->func_arg2==NULL) but->func_arg2= data->origstr; + /* afterfunc frees origstr */ + but->rename_orig= data->origstr; + data->origstr= NULL; ui_apply_but_func(C, but); -// if(but->func_arg2==data->origstr) but->func_arg2= NULL; data->retval= but->retval; data->applied= 1; @@ -827,6 +840,9 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut ui_apply_but_CHARTAB(C, but, data); break; #endif + case HOTKEYEVT: + ui_apply_but_BUT(C, but, data); + break; case LINK: case INLINK: ui_apply_but_LINK(C, but, data); @@ -945,6 +961,20 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data, button_activate_state(C, but, BUTTON_STATE_EXIT); } } + /* operator button (any type) */ + else if (but->optype) { + if(mode=='c') { + PointerRNA *opptr; + char *str; + opptr= uiButGetOperatorPtrRNA(but); /* allocated when needed, the button owns it */ + + str= WM_operator_pystring(but->optype, opptr, 0); + + WM_clipboard_text_set(str, 0); + + MEM_freeN(str); + } + } } /* ************* in-button text selection/editing ************* */ @@ -1029,15 +1059,17 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, sho /* XXX solve generic */ if(but->type==NUM || but->type==NUMSLI) - startx += 20; + startx += (int)(0.5f*(but->y2 - but->y1)); + else if(but->type==TEX) + startx += 5; + /* XXX does not take zoom level into account */ while((BLF_width(origstr+but->ofs) + startx) > x) { if (but->pos <= 0) break; but->pos--; origstr[but->pos+but->ofs] = 0; } - but->pos -= strlen(but->str); but->pos += but->ofs; if(but->pos<0) but->pos= 0; @@ -1577,7 +1609,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle } if(changed) { - /* never update while typing for now */ + /* only update when typing for TAB key */ if(update && data->interactive) ui_apply_button(C, block, but, data, 1); else ui_check_but(but); @@ -1788,20 +1820,77 @@ static int ui_do_but_BUT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEv return WM_UI_HANDLER_CONTINUE; } -static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) { if(data->state == BUTTON_STATE_HIGHLIGHT) { if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) { + but->drawstr[0]= 0; button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT); return WM_UI_HANDLER_BREAK; } } else if(data->state == BUTTON_STATE_WAIT_KEY_EVENT) { + short *sp= (short *)but->func_arg3; + + if(event->type == MOUSEMOVE) + return WM_UI_HANDLER_CONTINUE; + + if(ELEM(event->type, ESCKEY, LEFTMOUSE)) { + /* data->cancel doesnt work, this button opens immediate */ + ui_set_but_val(but, 0); + button_activate_state(C, but, BUTTON_STATE_EXIT); + return WM_UI_HANDLER_BREAK; + } + + /* always set */ + *sp= 0; + if(event->shift) + *sp |= KM_SHIFT; + if(event->alt) + *sp |= KM_ALT; + if(event->ctrl) + *sp |= KM_CTRL; + if(event->oskey) + *sp |= KM_OSKEY; + + ui_check_but(but); + ED_region_tag_redraw(data->region); + + if(event->val==KM_PRESS) { + if(ISHOTKEY(event->type)) { + + if(WM_key_event_string(event->type)[0]) + ui_set_but_val(but, event->type); + else + data->cancel= 1; + + button_activate_state(C, but, BUTTON_STATE_EXIT); + return WM_UI_HANDLER_BREAK; + } + } + } + + return WM_UI_HANDLER_CONTINUE; +} + + +static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) +{ + if(data->state == BUTTON_STATE_HIGHLIGHT) { + if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) { + short event= (short)ui_get_but_val(but); + /* hardcoded prevention from editing or assigning ESC */ + if(event!=ESCKEY) + button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT); + return WM_UI_HANDLER_BREAK; + } + } + else if(data->state == BUTTON_STATE_WAIT_KEY_EVENT) { if(event->type == MOUSEMOVE) return WM_UI_HANDLER_CONTINUE; if(event->val==KM_PRESS) { - if(WM_key_event_string(event->type)[0]) + if(event->type!=ESCKEY && WM_key_event_string(event->type)[0]) ui_set_but_val(but, event->type); else data->cancel= 1; @@ -3087,6 +3176,67 @@ static int ui_do_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data, wmE return WM_UI_HANDLER_CONTINUE; } +/* callback for hotkey change button/menu */ +static void do_menu_change_hotkey(bContext *C, void *but_v, void *key_v) +{ + uiBut *but= but_v; + IDProperty *prop= (but->opptr)? but->opptr->data: NULL; + short *key= key_v; + char buf[512], *butstr, *cpoin; + + /* signal for escape */ + if(key[0]==0) return; + + WM_key_event_operator_change(C, but->optype->idname, but->opcontext, prop, key[0], key[1]); + + /* complex code to change name of button */ + if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) { + + butstr= MEM_mallocN(strlen(but->str)+strlen(buf)+2, "menu_block_set_keymaps"); + + /* XXX but->str changed... should not, remove the hotkey from it */ + cpoin= strchr(but->str, '|'); + if(cpoin) *cpoin= 0; + + strcpy(butstr, but->str); + strcat(butstr, "|"); + strcat(butstr, buf); + + but->str= but->strdata; + BLI_strncpy(but->str, butstr, sizeof(but->strdata)); + MEM_freeN(butstr); + + ui_check_but(but); + } + +} + + +static uiBlock *menu_change_hotkey(bContext *C, ARegion *ar, void *arg_but) +{ + uiBlock *block; + uiBut *but= arg_but; + wmOperatorType *ot= WM_operatortype_find(but->optype->idname, 1); + static short dummy[2]; + char buf[OP_MAX_TYPENAME+10]; + + dummy[0]= 0; + dummy[1]= 0; + + block= uiBeginBlock(C, ar, "_popup", UI_EMBOSSP); + uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_MOVEMOUSE_QUIT|UI_BLOCK_RET_1); + + BLI_strncpy(buf, ot->name, OP_MAX_TYPENAME); + strcat(buf, " |"); + + but= uiDefHotKeyevtButS(block, 0, buf, 0, 0, 200, 20, dummy, dummy+1, ""); + uiButSetFunc(but, do_menu_change_hotkey, arg_but, dummy); + + uiPopupBoundsBlock(block, 6.0f, 50, -10); + uiEndBlock(C, block); + + return block; +} static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) { @@ -3129,9 +3279,22 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) } /* handle menu */ else if(event->type == RIGHTMOUSE && event->val == KM_PRESS) { - button_timers_tooltip_remove(C, but); - ui_but_anim_menu(C, but); - return WM_UI_HANDLER_BREAK; + /* RMB has two options now */ + if(but->rnapoin.data && but->rnaprop) { + button_timers_tooltip_remove(C, but); + ui_but_anim_menu(C, but); + return WM_UI_HANDLER_BREAK; + } + else if((but->block->flag & UI_BLOCK_LOOP) && but->optype) { + IDProperty *prop= (but->opptr)? but->opptr->data: NULL; + char buf[512]; + + if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) { + + uiPupBlock(C, menu_change_hotkey, but); + + } + } } } @@ -3160,6 +3323,9 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) case KEYEVT: retval= ui_do_but_KEYEVT(C, but, data, event); break; + case HOTKEYEVT: + retval= ui_do_but_HOTKEYEVT(C, but, data, event); + break; case TOGBUT: case TOG: case TOGR: @@ -3505,6 +3671,10 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA } button_activate_state(C, but, BUTTON_STATE_HIGHLIGHT); + /* activate right away */ + if(but->type==HOTKEYEVT) + button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT); + if(type == BUTTON_ACTIVATE_OPEN) { button_activate_state(C, but, BUTTON_STATE_MENU_OPEN); @@ -3531,6 +3701,7 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *but, int mousemove) { uiBlock *block= but->block; + uiBut *bt; /* ensure we are in the exit state */ if(data->state != BUTTON_STATE_EXIT) @@ -3556,7 +3727,14 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b if(!data->cancel) ui_apply_autokey_undo(C, but); - /* disable tooltips until mousemove */ + /* disable tooltips until mousemove + last active flag */ + for(block=data->region->uiblocks.first; block; block=block->next) { + for(bt=block->buttons.first; bt; bt=bt->next) + bt->flag &= ~UI_BUT_LAST_ACTIVE; + + block->tooltipdisabled= 1; + } + ui_blocks_set_tooltips(data->region, 0); /* clean up */ @@ -3572,6 +3750,7 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b MEM_freeN(but->active); but->active= NULL; but->flag &= ~(UI_ACTIVE|UI_SELECT); + but->flag |= UI_BUT_LAST_ACTIVE; ui_check_but(but); /* adds empty mousemove in queue for re-init handler, in case mouse is @@ -3630,6 +3809,23 @@ static int ui_handle_button_over(bContext *C, wmEvent *event, ARegion *ar) return WM_UI_HANDLER_CONTINUE; } +/* exported to interface.c: uiButActiveOnly() */ +void ui_button_activate_do(bContext *C, ARegion *ar, uiBut *but) +{ + wmWindow *win= CTX_wm_window(C); + wmEvent event; + + button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER); + + event= *(win->eventstate); /* XXX huh huh? make api call */ + event.type= EVT_BUT_OPEN; + event.val= KM_PRESS; + event.customdata= but; + event.customdatafree= FALSE; + + ui_do_button(C, but->block, but, &event); +} + static void ui_handle_button_activate(bContext *C, ARegion *ar, uiBut *but, uiButtonActivateType type) { uiBut *oldbut; diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index aef52572fe3..04c0c417fdb 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -186,7 +186,11 @@ struct uiBut { uiButSearchFunc search_func; void *search_arg; - + + uiButHandleRenameFunc rename_func; + void *rename_arg1; + void *rename_orig; + uiLink *link; short linkto[2]; @@ -416,6 +420,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rct /* interface_handlers.c */ +extern void ui_button_activate_do(struct bContext *C, struct ARegion *ar, uiBut *but); extern void ui_button_active_cancel(const struct bContext *C, uiBut *but); extern int ui_button_is_active(struct ARegion *ar); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 07fe2686317..6932ad350b0 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -486,7 +486,9 @@ static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, i if(subtype == PROP_FILEPATH || subtype == PROP_DIRPATH) { uiBlockSetCurLayout(block, uiLayoutRow(sub, 1)); uiDefAutoButR(block, ptr, prop, index, "", icon, x, y, w-UI_UNIT_X, h); - but= uiDefIconBut(block, BUT, 0, ICON_FILESEL, x, y, UI_UNIT_X, h, NULL, 0.0f, 0.0f, 0.0f, 0.0f, "DUMMY file select button"); /* XXX */ + + /* BUTTONS_OT_file_browse calls uiFileBrowseContextProperty */ + but= uiDefIconButO(block, BUT, "BUTTONS_OT_file_browse", WM_OP_INVOKE_DEFAULT, ICON_FILESEL, x, y, UI_UNIT_X, h, "Browse for file or directory."); } else but= uiDefAutoButR(block, ptr, prop, index, "", icon, x, y, w, h); @@ -495,6 +497,34 @@ static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, i return but; } +void uiFileBrowseContextProperty(const bContext *C, PointerRNA *ptr, PropertyRNA **prop) +{ + ARegion *ar= CTX_wm_region(C); + uiBlock *block; + uiBut *but, *prevbut; + + memset(ptr, 0, sizeof(*ptr)); + *prop= NULL; + + if(!ar) + return; + + for(block=ar->uiblocks.first; block; block=block->next) { + for(but=block->buttons.first; but; but= but->next) { + prevbut= but->prev; + + /* find the button before the active one */ + if((but->flag & UI_BUT_LAST_ACTIVE) && prevbut && prevbut->rnapoin.id.data) { + if(RNA_property_type(prevbut->rnaprop) == PROP_STRING) { + *ptr= prevbut->rnapoin; + *prop= prevbut->rnaprop; + return; + } + } + } + } +} + /********************* Button Items *************************/ /* disabled item */ @@ -724,8 +754,8 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PropertyRNA subtype= RNA_property_subtype(prop); len= RNA_property_array_length(prop); - if(ELEM(type, PROP_STRING, PROP_POINTER) && !name[0]) - name= "non-empty"; + if(ELEM3(type, PROP_STRING, PROP_POINTER, PROP_ENUM) && !name[0]) + name= "non-empty text"; else if(type == PROP_BOOLEAN && !name[0]) icon= ICON_DOT; diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 377861ae0d7..846fbe75072 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -1031,6 +1031,9 @@ static void ui_do_drag(const bContext *C, wmEvent *event, Panel *panel) dx= (event->x-data->startx) & ~(PNL_GRID-1); dy= (event->y-data->starty) & ~(PNL_GRID-1); + + dx *= (float)(ar->v2d.cur.xmax - ar->v2d.cur.xmin)/(float)(ar->winrct.xmax - ar->winrct.xmin); + dy *= (float)(ar->v2d.cur.ymax - ar->v2d.cur.ymin)/(float)(ar->winrct.ymax - ar->winrct.ymin); if(data->state == PANEL_STATE_DRAG_SCALE) { panel->sizex = MAX2(data->startsizex+dx, UI_PANEL_MINX); diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index c1129db8ebe..b59db055647 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -291,10 +291,13 @@ void ui_remove_temporary_region(bContext *C, bScreen *sc, ARegion *ar) /************************* Creating Tooltips **********************/ +#define MAX_TOOLTIP_LINES 8 + typedef struct uiTooltipData { rcti bbox; uiFontStyle fstyle; - char lines[5][512]; + char lines[MAX_TOOLTIP_LINES][512]; + int linedark[MAX_TOOLTIP_LINES]; int totline; int toth, spaceh, lineh; } uiTooltipData; @@ -314,7 +317,7 @@ static void ui_tooltip_region_draw(const bContext *C, ARegion *ar) bbox.ymin= bbox.ymax - data->lineh; for(a=0; a<data->totline; a++) { - if(a == 0) glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + if(!data->linedark[a]) glColor4f(1.0f, 1.0f, 1.0f, 1.0f); else glColor4f(0.5f, 0.5f, 0.5f, 1.0f); uiStyleFontDraw(&data->fstyle, &bbox, data->lines[a]); @@ -344,22 +347,13 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) float x1f, x2f, y1f, y2f; int x1, x2, y1, y2, winx, winy, ofsx, ofsy, w, h, a; - if(!but->tip || strlen(but->tip)==0) - return NULL; - - /* create area region */ - ar= ui_add_temporary_region(CTX_wm_screen(C)); - - memset(&type, 0, sizeof(ARegionType)); - type.draw= ui_tooltip_region_draw; - type.free= ui_tooltip_region_free; - ar->type= &type; - /* create tooltip data */ data= MEM_callocN(sizeof(uiTooltipData), "uiTooltipData"); - BLI_strncpy(data->lines[0], but->tip, sizeof(data->lines[0])); - data->totline= 1; + if(but->tip && strlen(but->tip)) { + BLI_strncpy(data->lines[data->totline], but->tip, sizeof(data->lines[0])); + data->totline++; + } if(but->optype && !(but->block->flag & UI_BLOCK_LOOP)) { /* operator keymap (not menus, they already have it) */ @@ -367,6 +361,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) { BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Shortcut: %s", buf); + data->linedark[data->totline]= 1; data->totline++; } } @@ -376,6 +371,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) ui_get_but_string(but, buf, sizeof(buf)); if(buf[0]) { BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Value: %s", buf); + data->linedark[data->totline]= 1; data->totline++; } } @@ -385,14 +381,43 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) if(ui_but_anim_expression_get(but, buf, sizeof(buf))) { /* expression */ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Expression: %s", buf); + data->linedark[data->totline]= 1; data->totline++; } } /* rna info */ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s.%s", RNA_struct_identifier(but->rnapoin.type), RNA_property_identifier(but->rnaprop)); + data->linedark[data->totline]= 1; data->totline++; } + else if (but->optype) { + PointerRNA *opptr; + char *str; + opptr= uiButGetOperatorPtrRNA(but); /* allocated when needed, the button owns it */ + + str= WM_operator_pystring(but->optype, opptr, 0); + + /* operator info */ + BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s", str); + data->linedark[data->totline]= 1; + data->totline++; + + MEM_freeN(str); + } + + if(data->totline == 0) { + MEM_freeN(data); + return NULL; + } + + /* create area region */ + ar= ui_add_temporary_region(CTX_wm_screen(C)); + + memset(&type, 0, sizeof(ARegionType)); + type.draw= ui_tooltip_region_draw; + type.free= ui_tooltip_region_free; + ar->type= &type; /* set font, get bb */ data->fstyle= style->widget; /* copy struct */ @@ -737,12 +762,14 @@ void ui_searchbox_autocomplete(bContext *C, ARegion *ar, uiBut *but, char *str) { uiSearchboxData *data= ar->regiondata; - data->items.autocpl= autocomplete_begin(str, ui_get_but_string_max_length(but)); + if(str[0]) { + data->items.autocpl= autocomplete_begin(str, ui_get_but_string_max_length(but)); - but->search_func(C, but->search_arg, but->editstr, &data->items); + but->search_func(C, but->search_arg, but->editstr, &data->items); - autocomplete_end(data->items.autocpl, str); - data->items.autocpl= NULL; + autocomplete_end(data->items.autocpl, str); + data->items.autocpl= NULL; + } } static void ui_searchbox_region_draw(const bContext *C, ARegion *ar) diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c index e2c97e4f05e..67ee29a1d3c 100644 --- a/source/blender/editors/interface/interface_style.c +++ b/source/blender/editors/interface/interface_style.c @@ -94,17 +94,17 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name) style->paneltitle.uifont_id= UIFONT_DEFAULT; style->paneltitle.points= 12; style->paneltitle.kerning= 1; - style->paneltitle.shadow= 5; - style->paneltitle.shadx= 2; - style->paneltitle.shady= -2; - style->paneltitle.shadowalpha= 0.25f; - style->paneltitle.shadowcolor= 0.0f; + style->paneltitle.shadow= 1; + style->paneltitle.shadx= 0; + style->paneltitle.shady= -1; + style->paneltitle.shadowalpha= 0.15f; + style->paneltitle.shadowcolor= 1.0f; style->grouplabel.uifont_id= UIFONT_DEFAULT; style->grouplabel.points= 12; style->grouplabel.kerning= 1; style->grouplabel.shadow= 3; - style->grouplabel.shadx= 1; + style->grouplabel.shadx= 0; style->grouplabel.shady= -1; style->grouplabel.shadowalpha= 0.25f; @@ -112,9 +112,9 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name) style->widgetlabel.points= 11; style->widgetlabel.kerning= 1; style->widgetlabel.shadow= 3; - style->widgetlabel.shadx= 1; + style->widgetlabel.shadx= 0; style->widgetlabel.shady= -1; - style->widgetlabel.shadowalpha= 0.3f; + style->widgetlabel.shadowalpha= 0.15f; style->widgetlabel.shadowcolor= 1.0f; style->widget.uifont_id= UIFONT_DEFAULT; @@ -122,10 +122,10 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name) style->widget.kerning= 1; style->widget.shadowalpha= 0.25f; - style->columnspace= 5; + style->columnspace= 8; style->templatespace= 5; style->boxspace= 5; - style->buttonspacex= 5; + style->buttonspacex= 8; style->buttonspacey= 2; style->panelspace= 8; style->panelouter= 4; @@ -248,6 +248,9 @@ void uiStyleInit(void) BLF_size(11, U.dpi); BLF_size(12, U.dpi); BLF_size(14, U.dpi); + + if (!(U.transopts & USER_USETEXTUREFONT)) + BLF_mode(BLF_MODE_BITMAP); } } diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 8b01c341565..edf01f4da2c 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -432,31 +432,21 @@ static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, i /* Softbody not allowed in this situation, enforce! */ if(((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) && (md->type!=eModifierType_Surface)) { uiItemR(row, "", ICON_SCENE, &ptr, "render", 0, 0, 0); - uiItemR(row, "", ICON_VIEW3D, &ptr, "realtime", 0, 0, 0); + uiItemR(row, "", ICON_RESTRICT_VIEW_OFF, &ptr, "realtime", 0, 0, 0); if(mti->flags & eModifierTypeFlag_SupportsEditmode) - uiItemR(row, "", ICON_VIEW3D, &ptr, "editmode", 0, 0, 0); + uiItemR(row, "", ICON_EDITMODE_HLT, &ptr, "editmode", 0, 0, 0); } - uiBlockEndAlign(block); + /* XXX uiBlockSetEmboss(block, UI_EMBOSSR); */ if(ob->type==OB_MESH && modifier_couldBeCage(md) && index<=lastCageIndex) { - int icon; //, color; - - if(index==cageIndex) { - // XXX color = TH_BUT_SETTING; - icon = VICON_EDITMODE_HLT; - } else if(index<cageIndex) { - // XXX color = TH_BUT_NEUTRAL; - icon = VICON_EDITMODE_DEHLT; - } else { - // XXX color = TH_BUT_NEUTRAL; - icon = ICON_BLANK1; - } + /* XXX uiBlockSetCol(block, color); */ - but = uiDefIconBut(block, BUT, 0, icon, 0, 0, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode"); + but = uiDefIconBut(block, BUT, 0, ICON_MESH_DATA, 0, 0, 16, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode"); uiButSetFunc(but, modifiers_setOnCage, ob, md); + uiBlockEndAlign(block); /* XXX uiBlockSetCol(block, TH_AUTO); */ } } @@ -464,8 +454,10 @@ static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, i /* up/down/delete */ if(!isVirtual) { /* XXX uiBlockSetCol(block, TH_BUT_ACTION); */ + uiBlockBeginAlign(block); uiItemO(row, "", VICON_MOVE_UP, "OBJECT_OT_modifier_move_up"); uiItemO(row, "", VICON_MOVE_DOWN, "OBJECT_OT_modifier_move_down"); + uiBlockEndAlign(block); uiBlockSetEmboss(block, UI_EMBOSSN); @@ -1227,7 +1219,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent) uiDefIconButC(block, ROW, B_MATPRV, ICON_MATCUBE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_CUBE, 0, 0, "Preview type: Cube"); uiDefIconButC(block, ROW, B_MATPRV, ICON_MONKEY, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_MONKEY, 0, 0, "Preview type: Monkey"); uiDefIconButC(block, ROW, B_MATPRV, ICON_HAIR, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_HAIR, 0, 0, "Preview type: Hair strands"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_MATSPHERE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE_A, 0, 0, "Preview type: Large sphere with sky"); + uiDefIconButC(block, ROW, B_MATPRV, ICON_MAT_SPHERE_SKY, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE_A, 0, 0, "Preview type: Large sphere with sky"); } if(pr_texture) { @@ -1558,7 +1550,7 @@ ListBase uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *pr /* XXX hardcoded */ if(itemptr.type == &RNA_MeshTextureFaceLayer || itemptr.type == &RNA_MeshColorLayer) { uiBlockSetEmboss(block, UI_EMBOSSN); - uiItemR(subrow, "", ICON_SCENE, &itemptr, "active_render", 0, 0, 0); + uiDefIconButR(block, TOG, 0, ICON_SCENE, 0, 0, UI_UNIT_X, UI_UNIT_Y, &itemptr, "active_render", 0, 0, 0, 0, 0, NULL); uiBlockSetEmboss(block, UI_EMBOSS); } diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index 5c10c69d1c1..8ff9e857407 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -972,6 +972,13 @@ static void colorband_pos_cb(bContext *C, void *coba_v, void *unused_v) break; } } + + WM_event_add_notifier(C, NC_TEXTURE, NULL); +} + +static void colorband_cb(bContext *C, void *coba_v, void *unused_v) +{ + WM_event_add_notifier(C, NC_TEXTURE, NULL); } static void colorband_add_cb(bContext *C, void *coba_v, void *unused_v) @@ -983,6 +990,7 @@ static void colorband_add_cb(bContext *C, void *coba_v, void *unused_v) colorband_pos_cb(C, coba, NULL); ED_undo_push(C, "Add colorband"); + WM_event_add_notifier(C, NC_TEXTURE, NULL); } static void colorband_del_cb(bContext *C, void *coba_v, void *unused_v) @@ -1000,6 +1008,7 @@ static void colorband_del_cb(bContext *C, void *coba_v, void *unused_v) ED_undo_push(C, "Delete colorband"); // XXX BIF_preview_changed(ID_TE); + WM_event_add_notifier(C, NC_TEXTURE, NULL); } @@ -1011,32 +1020,30 @@ static void colorband_buttons_large(uiBlock *block, ColorBand *coba, int xoffs, if(coba==NULL) return; - uiBlockBeginAlign(block); - bt= uiDefBut(block, BUT, redraw, "Add", 0+xoffs,100+yoffs,50,20, 0, 0, 0, 0, 0, "Adds a new color position to the colorband"); + bt= uiDefBut(block, BUT, redraw, "Add", 0+xoffs,100+yoffs,50,20, 0, 0, 0, 0, 0, "Add a new color stop to the colorband"); uiButSetFunc(bt, colorband_add_cb, coba, NULL); - uiDefButS(block, NUM, redraw, "Cur:", 50+xoffs,100+yoffs,100,20, &coba->cur, 0.0, (float)(coba->tot-1), 0, 0, "Displays the active color from the colorband"); - bt= uiDefBut(block, BUT, redraw, "Del", 150+xoffs,100+yoffs,50,20, 0, 0, 0, 0, 0, "Deletes the active position"); + bt= uiDefBut(block, BUT, redraw, "Delete", 60+xoffs,100+yoffs,50,20, 0, 0, 0, 0, 0, "Delete the active position"); + uiDefButS(block, NUM, redraw, "", 120+xoffs,100+yoffs,80, 20, &coba->cur, 0.0, (float)(coba->tot-1), 0, 0, "Choose active color stop"); + uiButSetFunc(bt, colorband_del_cb, coba, NULL); - uiDefButS(block, MENU, redraw, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4", - 200+xoffs, 100+yoffs, 100, 20, &coba->ipotype, 0.0, 0.0, 0, 0, "Sets interpolation type"); + bt= uiDefButS(block, MENU, redraw, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4", + 210+xoffs, 100+yoffs, 90, 20, &coba->ipotype, 0.0, 0.0, 0, 0, "Set interpolation between color stops"); + uiButSetFunc(bt, colorband_cb, coba, NULL); uiBlockEndAlign(block); - uiDefBut(block, BUT_COLORBAND, redraw, "", xoffs,65+yoffs,300,30, coba, 0, 0, 0, 0, ""); + bt= uiDefBut(block, BUT_COLORBAND, redraw, "", xoffs,65+yoffs,300,30, coba, 0, 0, 0, 0, ""); + uiButSetFunc(bt, colorband_cb, coba, NULL); cbd= coba->data + coba->cur; - uiBlockBeginAlign(block); - bt= uiDefButF(block, NUM, redraw, "Pos", xoffs,40+yoffs,110,20, &cbd->pos, 0.0, 1.0, 10, 0, "Sets the position of the active color"); + bt= uiDefButF(block, NUM, redraw, "Pos:", 0+xoffs,40+yoffs,100, 20, &cbd->pos, 0.0, 1.0, 10, 0, "The position of the active color stop"); uiButSetFunc(bt, colorband_pos_cb, coba, NULL); - uiDefButF(block, COL, redraw, "", xoffs,20+yoffs,110,20, &(cbd->r), 0, 0, 0, B_BANDCOL, ""); - uiDefButF(block, NUMSLI, redraw, "A ", xoffs,yoffs,110,20, &cbd->a, 0.0, 1.0, 10, 0, "Sets the alpha value for this position"); + bt= uiDefButF(block, COL, redraw, "", 110+xoffs,40+yoffs,80,20, &(cbd->r), 0, 0, 0, B_BANDCOL, "The color value for the active color stop"); + uiButSetFunc(bt, colorband_cb, coba, NULL); + bt= uiDefButF(block, NUMSLI, redraw, "A ", 200+xoffs,40+yoffs,100,20, &cbd->a, 0.0, 1.0, 10, 0, "The alpha value of the active color stop"); + uiButSetFunc(bt, colorband_cb, coba, NULL); - uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI, redraw, "R ", 115+xoffs,40+yoffs,185,20, &cbd->r, 0.0, 1.0, B_BANDCOL, 0, "Sets the red value for the active color"); - uiDefButF(block, NUMSLI, redraw, "G ", 115+xoffs,20+yoffs,185,20, &cbd->g, 0.0, 1.0, B_BANDCOL, 0, "Sets the green value for the active color"); - uiDefButF(block, NUMSLI, redraw, "B ", 115+xoffs,yoffs,185,20, &cbd->b, 0.0, 1.0, B_BANDCOL, 0, "Sets the blue value for the active color"); - uiBlockEndAlign(block); } static void colorband_buttons_small(uiBlock *block, ColorBand *coba, rctf *butr, int event) @@ -1048,16 +1055,17 @@ static void colorband_buttons_small(uiBlock *block, ColorBand *coba, rctf *butr, cbd= coba->data + coba->cur; - uiBlockBeginAlign(block); - uiDefButF(block, COL, event, "", xs,butr->ymin+20.0f,2.0f*unit,20, &(cbd->r), 0, 0, 0, B_BANDCOL, ""); - uiDefButF(block, NUM, event, "A:", xs+2.0f*unit,butr->ymin+20.0f,4.0f*unit,20, &(cbd->a), 0.0f, 1.0f, 10, 2, ""); - bt= uiDefBut(block, BUT, event, "Add", xs+6.0f*unit,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Adds a new color position to the colorband"); + + bt= uiDefBut(block, BUT, event, "Add", xs,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Add a new color stop to the colorband"); uiButSetFunc(bt, colorband_add_cb, coba, NULL); - bt= uiDefBut(block, BUT, event, "Del", xs+8.0f*unit,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Deletes the active position"); + bt= uiDefBut(block, BUT, event, "Delete", xs+2.0f*unit,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Delete the active position"); uiButSetFunc(bt, colorband_del_cb, coba, NULL); - + + uiDefButF(block, COL, event, "", xs+4.0f*unit,butr->ymin+20.0f,2.0f*unit,20, &(cbd->r), 0, 0, 0, B_BANDCOL, "The color value for the active color stop"); + uiDefButF(block, NUMSLI, event, "A:", xs+6.0f*unit,butr->ymin+20.0f,4.0f*unit,20, &(cbd->a), 0.0f, 1.0f, 10, 2, "The alpha value of the active color stop"); + uiDefButS(block, MENU, event, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4", - xs+10.0f*unit, butr->ymin+20.0f, unit*4, 20, &coba->ipotype, 0.0, 0.0, 0, 0, "Sets interpolation type"); + xs+10.0f*unit, butr->ymin+20.0f, unit*4, 20, &coba->ipotype, 0.0, 0.0, 0, 0, "Set interpolation between color stops"); uiDefBut(block, BUT_COLORBAND, event, "", xs,butr->ymin,butr->xmax-butr->xmin,20.0f, coba, 0, 0, 0, 0, ""); uiBlockEndAlign(block); diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index fa56af74033..eed4425b7ad 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -749,7 +749,7 @@ static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect) /* textbut exception */ if(but->editstr && but->pos != -1) { - int pos= but->pos+strlen(but->str); + int pos= but->pos+1; if(pos-1 < but->ofs) { pos= but->ofs-pos+1; @@ -780,48 +780,50 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b /* text button selection and cursor */ if(but->editstr && but->pos != -1) { - short t, pos, ch; + short t=0, pos=0, ch; short selsta_tmp, selend_tmp, selsta_draw, selwidth_draw; if ((but->selend - but->selsta) > 0) { - /* XXX weak, why is this? (ton) */ - t= but->str[0]?1:-2; - /* text button selection */ - selsta_tmp = but->selsta + strlen(but->str); - selend_tmp = but->selend + strlen(but->str); + selsta_tmp = but->selsta; + selend_tmp = but->selend; if(but->drawstr[0]!=0) { ch= but->drawstr[selsta_tmp]; but->drawstr[selsta_tmp]= 0; - selsta_draw = BLF_width(but->drawstr+but->ofs) + t; + selsta_draw = BLF_width(but->drawstr+but->ofs); but->drawstr[selsta_tmp]= ch; ch= but->drawstr[selend_tmp]; but->drawstr[selend_tmp]= 0; - selwidth_draw = BLF_width(but->drawstr+but->ofs) + t; + selwidth_draw = BLF_width(but->drawstr+but->ofs); but->drawstr[selend_tmp]= ch; + + /* if at pos 0, leave a bit more to the left */ + t= (pos == 0)? 0: 1; glColor3ubv((unsigned char*)wcol->item); glRects(rect->xmin+selsta_draw+1, rect->ymin+2, rect->xmin+selwidth_draw+1, rect->ymax-2); } } else { /* text cursor */ - pos= but->pos+strlen(but->str); + pos= but->pos; if(pos >= but->ofs) { if(but->drawstr[0]!=0) { ch= but->drawstr[pos]; but->drawstr[pos]= 0; - t= BLF_width(but->drawstr+but->ofs) + 1; + t= BLF_width(but->drawstr+but->ofs); but->drawstr[pos]= ch; } - else t= 1; + + /* if at pos 0, leave a bit more to the left */ + t += (pos == 0)? 0: 1; glColor3ub(255,0,0); glRects(rect->xmin+t, rect->ymin+2, rect->xmin+t+2, rect->ymax-2); @@ -857,7 +859,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB if(but==NULL) return; /* cutting off from left part */ - if ELEM3(but->type, NUM, NUMABS, TEX) { + if ELEM5(but->type, NUM, NUMABS, NUMSLI, SLI, TEX) { ui_text_leftclip(fstyle, but, rect); } else but->ofs= 0; @@ -887,9 +889,9 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB rect->xmin += UI_icon_get_width(but->icon+but->iconadd); if(but->editstr || (but->flag & UI_TEXT_LEFT)) - rect->xmin += 5; + rect->xmin += 10; } - else if(but->flag & UI_TEXT_LEFT) + else if((but->flag & UI_TEXT_LEFT)) rect->xmin += 5; /* always draw text for textbutton cursor */ @@ -1037,7 +1039,7 @@ static struct uiWidgetColors wcol_menu_back= { {45, 45, 45, 230}, {100, 100, 100, 255}, - {255, 255, 255, 255}, + {160, 160, 160, 255}, {255, 255, 255, 255}, 0, @@ -1114,13 +1116,13 @@ static struct uiWidgetColors wcol_scroll= { {50, 50, 50, 180}, {80, 80, 80, 180}, {100, 100, 100, 180}, - {180, 180, 180, 255}, + {128, 128, 128, 255}, {0, 0, 0, 255}, {255, 255, 255, 255}, 1, - 10, -20 + 5, -5 }; static struct uiWidgetColors wcol_list_item= { @@ -1599,6 +1601,7 @@ static void widget_numbut(uiWidgetColors *wcol, rcti *rect, int state, int round { uiWidgetBase wtb; float rad= 0.5f*(rect->ymax - rect->ymin); + int textoffs; widget_init(&wtb); @@ -1613,9 +1616,15 @@ static void widget_numbut(uiWidgetColors *wcol, rcti *rect, int state, int round widgetbase_draw(&wtb, wcol); /* text space */ - rect->xmin += (rect->ymax-rect->ymin); - rect->xmax -= (rect->ymax-rect->ymin); - + if(!(state & UI_TEXTINPUT)) { + rect->xmin += (rect->ymax-rect->ymin); + rect->xmax -= (rect->ymax-rect->ymin); + } + else { + textoffs= rad; + rect->xmin += textoffs; + rect->xmax -= textoffs; + } } @@ -1707,8 +1716,11 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat wcol->shadetop+= 20; /* XXX violates themes... */ else wcol->shadedown+= 20; - if(state & UI_SCROLL_PRESSED) - SWAP(short, wcol->shadetop, wcol->shadedown); + if(state & UI_SCROLL_PRESSED) { + wcol->inner[0]= wcol->inner[0]>=250? 255 : wcol->inner[0]+5; + wcol->inner[1]= wcol->inner[1]>=250? 255 : wcol->inner[1]+5; + wcol->inner[2]= wcol->inner[2]>=250? 255 : wcol->inner[2]+5; + } /* draw */ wtb.emboss= 0; /* only emboss once */ @@ -1819,6 +1831,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s rcti rect1; double value; float offs, fac; + int textoffs; char outline[3]; widget_init(&wtb); @@ -1828,6 +1841,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s /* fully rounded */ offs= 0.5f*(rect->ymax - rect->ymin); + textoffs= offs; round_box_edges(&wtb, roundboxalign, rect, offs); wtb.outline= 0; @@ -1869,9 +1883,8 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s widgetbase_draw(&wtb, wcol); /* text space */ - rect->xmin += (rect->ymax-rect->ymin); - rect->xmax -= (rect->ymax-rect->ymin); - + rect->xmin += textoffs; + rect->xmax -= textoffs; } static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index 0f7532383c9..f9fb7a9306f 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -154,13 +154,15 @@ static void view2d_masks(View2D *v2d) */ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) { - short tot_changed= 0; + short tot_changed= 0, init= 0; uiStyle *style= U.uistyles.first; /* initialise data if there is a need for such */ if ((v2d->flag & V2D_IS_INITIALISED) == 0) { /* set initialised flag so that View2D doesn't get reinitialised next time again */ v2d->flag |= V2D_IS_INITIALISED; + + init= 1; /* see eView2D_CommonViewTypes in UI_view2d.h for available view presets */ switch (type) { @@ -170,7 +172,7 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) case V2D_COMMONVIEW_STANDARD: { /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */ - v2d->keepzoom= (V2D_KEEPASPECT|V2D_KEEPZOOM); + v2d->keepzoom= (V2D_KEEPASPECT|V2D_LIMITZOOM); v2d->minzoom= 0.01f; v2d->maxzoom= 1000.0f; @@ -197,7 +199,7 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) case V2D_COMMONVIEW_LIST: { /* zoom + aspect ratio are locked */ - v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT); + v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT); v2d->minzoom= v2d->maxzoom= 1.0f; /* tot rect has strictly regulated placement, and must only occur in +/- quadrant */ @@ -214,7 +216,7 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) case V2D_COMMONVIEW_STACK: { /* zoom + aspect ratio are locked */ - v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT); + v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT); v2d->minzoom= v2d->maxzoom= 1.0f; /* tot rect has strictly regulated placement, and must only occur in +/+ quadrant */ @@ -230,7 +232,7 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) case V2D_COMMONVIEW_HEADER: { /* zoom + aspect ratio are locked */ - v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT); + v2d->keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT); v2d->minzoom= v2d->maxzoom= 1.0f; v2d->min[0]= v2d->max[0]= (float)(winx-1); v2d->min[1]= v2d->max[1]= (float)(winy-1); @@ -257,9 +259,10 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) float panelzoom= (style) ? style->panelzoom : 1.0f; /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */ - v2d->keepzoom= (V2D_KEEPASPECT|V2D_KEEPZOOM); + v2d->keepzoom= (V2D_KEEPASPECT|V2D_LIMITZOOM|V2D_KEEPZOOM); v2d->minzoom= 0.5f; v2d->maxzoom= 2.0f; + //tot_changed= 1; v2d->align= (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y); v2d->keeptot= V2D_KEEPTOT_BOUNDS; @@ -273,10 +276,12 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) v2d->tot.ymin= -winy; v2d->cur.xmin= 0.0f; - v2d->cur.xmax= winx*panelzoom; + /* bad workaround for keeping zoom level with scrollers */ + v2d->cur.xmax= (winx - V2D_SCROLL_WIDTH)*panelzoom; v2d->cur.ymax= 0.0f; - v2d->cur.ymin= -winy*panelzoom; + /* bad workaround for keeping zoom level with scrollers */ + v2d->cur.ymin= (-winy + V2D_SCROLL_HEIGHT)*panelzoom; } break; @@ -296,17 +301,16 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy) /* set 'tot' rect before setting cur? */ if (tot_changed) - UI_view2d_totRect_set(v2d, winx, winy); + UI_view2d_totRect_set_resize(v2d, winx, winy, !init); else - UI_view2d_curRect_validate(v2d); - + UI_view2d_curRect_validate_resize(v2d, !init); } /* Ensure View2D rects remain in a viable configuration * - cur is not allowed to be: larger than max, smaller than min, or outside of tot */ // XXX pre2.5 -> this used to be called test_view2d() -void UI_view2d_curRect_validate(View2D *v2d) +void UI_view2d_curRect_validate_resize(View2D *v2d, int resize) { float totwidth, totheight, curwidth, curheight, width, height; float winx, winy; @@ -349,10 +353,30 @@ void UI_view2d_curRect_validate(View2D *v2d) if(winx<1) winx= 1; if(winy<1) winy= 1; - /* keepzoom (V2D_KEEPZOOM set), indicates that zoom level on each axis must not exceed limits + /* V2D_LIMITZOOM indicates that zoom level should be preserved when the window size changes */ + if (resize && (v2d->keepzoom & V2D_KEEPZOOM)) { + float zoom, oldzoom; + + if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) { + zoom= winx / width; + oldzoom= v2d->oldwinx / curwidth; + + if(oldzoom != zoom) + width *= zoom/oldzoom; + } + + if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0) { + zoom= winy / height; + oldzoom= v2d->oldwiny / curheight; + + if(oldzoom != zoom) + height *= zoom/oldzoom; + } + } + /* keepzoom (V2D_LIMITZOOM set), indicates that zoom level on each axis must not exceed limits * NOTE: in general, it is not expected that the lock-zoom will be used in conjunction with this */ - if (v2d->keepzoom & V2D_KEEPZOOM) { + else if (v2d->keepzoom & V2D_LIMITZOOM) { float zoom, fac; /* check if excessive zoom on x-axis */ @@ -458,11 +482,17 @@ void UI_view2d_curRect_validate(View2D *v2d) if ((width != curwidth) || (height != curheight)) { float temp, dh; - /* resize from centerpoint */ + /* resize from centerpoint, unless otherwise specified */ if (width != curwidth) { if (v2d->keepofs & V2D_LOCKOFS_X) { cur->xmax += width - (cur->xmax - cur->xmin); } + else if (v2d->keepofs & V2D_KEEPOFS_X) { + if(v2d->align & V2D_ALIGN_NO_POS_X) + cur->xmin -= width - (cur->xmax - cur->xmin); + else + cur->xmax += width - (cur->xmax - cur->xmin); + } else { temp= (cur->xmax + cur->xmin) * 0.5f; dh= width * 0.5f; @@ -475,6 +505,12 @@ void UI_view2d_curRect_validate(View2D *v2d) if (v2d->keepofs & V2D_LOCKOFS_Y) { cur->ymax += height - (cur->ymax - cur->ymin); } + else if (v2d->keepofs & V2D_KEEPOFS_Y) { + if(v2d->align & V2D_ALIGN_NO_POS_Y) + cur->ymin -= height - (cur->ymax - cur->ymin); + else + cur->ymax += height - (cur->ymax - cur->ymin); + } else { temp= (cur->ymax + cur->ymin) * 0.5f; dh= height * 0.5f; @@ -494,7 +530,7 @@ void UI_view2d_curRect_validate(View2D *v2d) curheight= cur->ymax - cur->ymin; /* width */ - if ( (curwidth > totwidth) && !(v2d->keepzoom & (V2D_KEEPZOOM|V2D_LOCKZOOM_X)) ) { + if ( (curwidth > totwidth) && !(v2d->keepzoom & (V2D_KEEPZOOM|V2D_LOCKZOOM_X|V2D_LIMITZOOM)) ) { /* if zoom doesn't have to be maintained, just clamp edges */ if (cur->xmin < tot->xmin) cur->xmin= tot->xmin; if (cur->xmax > tot->xmax) cur->xmax= tot->xmax; @@ -540,13 +576,13 @@ void UI_view2d_curRect_validate(View2D *v2d) * We favour moving the 'minimum' across, as that's origin for most things * (XXX - in the past, max was favoured... if there are bugs, swap!) */ - if ((cur->ymin < tot->ymin) && (cur->ymax > tot->ymax)) { + if ((cur->xmin < tot->xmin) && (cur->xmax > tot->xmax)) { /* outside boundaries on both sides, so take middle-point of tot, and place in balanced way */ - temp= (tot->ymax + tot->ymin) * 0.5f; + temp= (tot->xmax + tot->xmin) * 0.5f; diff= curheight * 0.5f; - cur->ymin= temp - diff; - cur->ymax= temp + diff; + cur->xmin= temp - diff; + cur->xmax= temp + diff; } else if (cur->xmin < tot->xmin) { /* move cur across so that it sits at minimum of tot */ @@ -577,7 +613,7 @@ void UI_view2d_curRect_validate(View2D *v2d) } /* height */ - if ( (curheight > totheight) && !(v2d->keepzoom & (V2D_KEEPZOOM|V2D_LOCKZOOM_Y)) ) { + if ( (curheight > totheight) && !(v2d->keepzoom & (V2D_KEEPZOOM|V2D_LOCKZOOM_Y|V2D_LIMITZOOM)) ) { /* if zoom doesn't have to be maintained, just clamp edges */ if (cur->ymin < tot->ymin) cur->ymin= tot->ymin; if (cur->ymax > tot->ymax) cur->ymax= tot->ymax; @@ -662,6 +698,11 @@ void UI_view2d_curRect_validate(View2D *v2d) view2d_masks(v2d); } +void UI_view2d_curRect_validate(View2D *v2d) +{ + return UI_view2d_curRect_validate_resize(v2d, 0); +} + /* ------------------ */ /* Called by menus to activate it, or by view2d operators to make sure 'related' views stay in synchrony */ @@ -781,7 +822,7 @@ void UI_view2d_curRect_reset (View2D *v2d) /* ------------------ */ /* Change the size of the maximum viewable area (i.e. 'tot' rect) */ -void UI_view2d_totRect_set (View2D *v2d, int width, int height) +void UI_view2d_totRect_set_resize (View2D *v2d, int width, int height, int resize) { int scroll= view2d_scroll_mapped(v2d->scroll); @@ -839,7 +880,57 @@ void UI_view2d_totRect_set (View2D *v2d, int width, int height) } /* make sure that 'cur' rect is in a valid state as a result of these changes */ - UI_view2d_curRect_validate(v2d); + UI_view2d_curRect_validate_resize(v2d, resize); +} + +void UI_view2d_totRect_set(View2D *v2d, int width, int height) +{ + UI_view2d_totRect_set_resize(v2d, width, height, 0); +} + +int UI_view2d_tab_set(View2D *v2d, int tab) +{ + float default_offset[2]= {0.0f, 0.0f}; + float *offset, *new_offset; + int changed= 0; + + /* if tab changed, change offset */ + if(tab != v2d->tab_cur && v2d->tab_offset) { + if(tab < v2d->tab_num) + offset= &v2d->tab_offset[tab*2]; + else + offset= default_offset; + + v2d->cur.xmax += offset[0] - v2d->cur.xmin; + v2d->cur.xmin= offset[0]; + + v2d->cur.ymin += offset[1] - v2d->cur.ymax; + v2d->cur.ymax= offset[1]; + + /* validation should happen in subsequent totRect_set */ + + changed= 1; + } + + /* resize array if needed */ + if(tab >= v2d->tab_num) { + new_offset= MEM_callocN(sizeof(float)*(tab+1)*2, "view2d tab offset"); + + if(v2d->tab_offset) { + memcpy(new_offset, v2d->tab_offset, sizeof(float)*v2d->tab_num*2); + MEM_freeN(v2d->tab_offset); + } + + v2d->tab_offset= new_offset; + v2d->tab_num= tab+1; + } + + /* set current tab and offset */ + v2d->tab_cur= tab; + v2d->tab_offset[2*tab+0]= v2d->cur.xmin; + v2d->tab_offset[2*tab+1]= v2d->cur.ymax; + + return changed; } /* *********************************************************************** */ diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index f0745ebfd71..1e8cda68e6d 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -151,6 +151,13 @@ static void view_pan_apply(bContext *C, wmOperator *op) /* request updates to be done... */ ED_area_tag_redraw(vpd->sa); UI_view2d_sync(vpd->sc, vpd->sa, v2d, V2D_LOCK_COPY); + WM_event_add_mousemove(C); + + /* exceptions */ + if(vpd->sa->spacetype==SPACE_OUTLINER) { + SpaceOops *soops= vpd->sa->spacedata.first; + soops->storeflag |= SO_TREESTORE_REDRAW; + } } /* cleanup temp customdata */ @@ -464,7 +471,7 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot) /* ------------------ 'Shared' stuff ------------------------ */ /* check if step-zoom can be applied */ -static short view_zoomstep_ok(bContext *C) +static int view_zoom_poll(bContext *C) { ARegion *ar= CTX_wm_region(C); View2D *v2d; @@ -487,17 +494,33 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op) { ARegion *ar= CTX_wm_region(C); View2D *v2d= &ar->v2d; - float dx, dy; - - /* calculate amount to move view by */ - dx= (v2d->cur.xmax - v2d->cur.xmin) * (float)RNA_float_get(op->ptr, "zoomfacx"); - dy= (v2d->cur.ymax - v2d->cur.ymin) * (float)RNA_float_get(op->ptr, "zoomfacy"); + float dx, dy, facx, facy; + /* calculate amount to move view by, ensuring symmetry so the + * old zoom level is restored after zooming back the same amount */ + facx= RNA_float_get(op->ptr, "zoomfacx"); + facy= RNA_float_get(op->ptr, "zoomfacy"); + + if(facx >= 0.0f) { + dx= (v2d->cur.xmax - v2d->cur.xmin) * facx; + dy= (v2d->cur.ymax - v2d->cur.ymin) * facy; + } + else { + dx= ((v2d->cur.xmax - v2d->cur.xmin)/(1.0f + 2.0f*facx)) * facx; + dy= ((v2d->cur.ymax - v2d->cur.ymin)/(1.0f + 2.0f*facy)) * facy; + } + /* only resize view on an axis if change is allowed */ if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) { if (v2d->keepofs & V2D_LOCKOFS_X) { v2d->cur.xmax -= 2*dx; } + else if (v2d->keepofs & V2D_KEEPOFS_X) { + if(v2d->align & V2D_ALIGN_NO_POS_X) + v2d->cur.xmin += 2*dx; + else + v2d->cur.xmax -= 2*dx; + } else { v2d->cur.xmin += dx; v2d->cur.xmax -= dx; @@ -507,18 +530,25 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op) if (v2d->keepofs & V2D_LOCKOFS_Y) { v2d->cur.ymax -= 2*dy; } + else if (v2d->keepofs & V2D_KEEPOFS_Y) { + if(v2d->align & V2D_ALIGN_NO_POS_Y) + v2d->cur.ymin += 2*dy; + else + v2d->cur.ymax -= 2*dy; + } else { v2d->cur.ymin += dy; v2d->cur.ymax -= dy; } } - + /* validate that view is in valid configuration after this operation */ UI_view2d_curRect_validate(v2d); - + /* request updates to be done... */ ED_area_tag_redraw(CTX_wm_area(C)); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); + WM_event_add_mousemove(C); } /* --------------- Individual Operators ------------------- */ @@ -527,7 +557,7 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op) static int view_zoomin_exec(bContext *C, wmOperator *op) { /* check that there's an active region, as View2D data resides there */ - if (!view_zoomstep_ok(C)) + if (!view_zoom_poll(C)) return OPERATOR_PASS_THROUGH; /* set RNA-Props - zooming in by uniform factor */ @@ -563,7 +593,7 @@ void VIEW2D_OT_zoom_in(wmOperatorType *ot) static int view_zoomout_exec(bContext *C, wmOperator *op) { /* check that there's an active region, as View2D data resides there */ - if (!view_zoomstep_ok(C)) + if (!view_zoom_poll(C)) return OPERATOR_PASS_THROUGH; /* set RNA-Props - zooming in by uniform factor */ @@ -675,6 +705,7 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op) /* request updates to be done... */ ED_area_tag_redraw(CTX_wm_area(C)); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); + WM_event_add_mousemove(C); } /* cleanup temp customdata */ @@ -831,6 +862,8 @@ void VIEW2D_OT_zoom(wmOperatorType *ot) ot->invoke= view_zoomdrag_invoke; ot->modal= view_zoomdrag_modal; + ot->poll= view_zoom_poll; + /* operator is repeatable */ // ot->flag= OPTYPE_REGISTER|OPTYPE_BLOCKING; @@ -914,6 +947,7 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op) /* request updates to be done... */ ED_area_tag_redraw(CTX_wm_area(C)); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); + WM_event_add_mousemove(C); return OPERATOR_FINISHED; } @@ -929,7 +963,7 @@ void VIEW2D_OT_zoom_border(wmOperatorType *ot) ot->exec= view_borderzoom_exec; ot->modal= WM_border_select_modal; - ot->poll= ED_operator_areaactive; + ot->poll= view_zoom_poll; /* rna */ RNA_def_int(ot->srna, "event_type", 0, INT_MIN, INT_MAX, "Event Type", "", INT_MIN, INT_MAX); @@ -1154,6 +1188,7 @@ static void scroller_activate_apply(bContext *C, wmOperator *op) /* request updates to be done... */ ED_area_tag_redraw(CTX_wm_area(C)); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); + WM_event_add_mousemove(C); } /* handle user input for scrollers - calculations of mouse-movement need to be done here, not in the apply callback! */ @@ -1293,20 +1328,20 @@ static int reset_exec(bContext *C, wmOperator *op) /* posx and negx flags are mutually exclusive, so watch out */ if ((v2d->align & V2D_ALIGN_NO_POS_X) && !(v2d->align & V2D_ALIGN_NO_NEG_X)) { v2d->cur.xmax= 0.0f; - v2d->cur.xmin= v2d->winx*style->panelzoom; + v2d->cur.xmin= -winx*style->panelzoom; } else if ((v2d->align & V2D_ALIGN_NO_NEG_X) && !(v2d->align & V2D_ALIGN_NO_POS_X)) { - v2d->cur.xmax= (v2d->cur.xmax - v2d->cur.xmin)*style->panelzoom; + v2d->cur.xmax= winx*style->panelzoom; v2d->cur.xmin= 0.0f; } /* - posx and negx flags are mutually exclusive, so watch out */ if ((v2d->align & V2D_ALIGN_NO_POS_Y) && !(v2d->align & V2D_ALIGN_NO_NEG_Y)) { v2d->cur.ymax= 0.0f; - v2d->cur.ymin= -v2d->winy*style->panelzoom; + v2d->cur.ymin= -winy*style->panelzoom; } else if ((v2d->align & V2D_ALIGN_NO_NEG_Y) && !(v2d->align & V2D_ALIGN_NO_POS_Y)) { - v2d->cur.ymax= (v2d->cur.ymax - v2d->cur.ymin)*style->panelzoom; + v2d->cur.ymax= winy*style->panelzoom; v2d->cur.ymin= 0.0f; } } @@ -1317,6 +1352,7 @@ static int reset_exec(bContext *C, wmOperator *op) /* request updates to be done... */ ED_area_tag_redraw(CTX_wm_area(C)); UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); + WM_event_add_mousemove(C); return OPERATOR_FINISHED; } @@ -1332,7 +1368,7 @@ void VIEW2D_OT_reset(wmOperatorType *ot) ot->poll= view2d_poll; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + // ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } /* ********************************************************* */ diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c index 4576280a38d..269c9a4e972 100644 --- a/source/blender/editors/mesh/bmesh_tools.c +++ b/source/blender/editors/mesh/bmesh_tools.c @@ -1396,17 +1396,9 @@ static int mesh_duplicate_exec(bContext *C, wmOperator *op) static int mesh_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event) { - int ret; - WM_cursor_wait(1); - ret = mesh_duplicate_exec(C, op); + mesh_duplicate_exec(C, op); WM_cursor_wait(0); - - if (ret == OPERATOR_CANCELLED) - return OPERATOR_CANCELLED; - - RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); - WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); return OPERATOR_FINISHED; } @@ -1514,9 +1506,7 @@ static int edge_rotate_selected(bContext *C, wmOperator *op) EDBM_InitOpf(em, &bmop, op, "edgerotate edges=%e ccw=%d", eed, ccw); BMO_Exec_Op(em->bm, &bmop); - BMO_ITER(eed, &siter, em->bm, &bmop, "edgeout", BM_EDGE) { - BM_Select(em->bm, eed, 1); - } + BMO_HeaderFlag_Slot(em->bm, &bmop, "edgeout", BM_SELECT); if (!EDBM_FinishOp(em, &bmop, op, 1)) return OPERATOR_CANCELLED; diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c index 49872eae897..5892af0060b 100644 --- a/source/blender/editors/mesh/editmesh.c +++ b/source/blender/editors/mesh/editmesh.c @@ -1106,7 +1106,7 @@ void load_editMesh(Scene *scene, Object *ob, EditMesh *em) if(pid.type == PTCACHE_TYPE_CLOTH) cloth_write_cache(ob, pid.data, pid.cache->editframe); else if(pid.type == PTCACHE_TYPE_SOFTBODY) - sbWriteCache(ob, pid.cache->editframe); + softbody_write_cache(ob, pid.data, pid.cache->editframe); } /* the edges */ diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index 806ef4c299e..ff0814661eb 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -1180,9 +1180,9 @@ static float new_primitive_matrix(bContext *C, float primmat[][4]) Mat4One(primmat); - if(rv3d) + if(rv3d && (U.flag & USER_ADD_VIEWALIGNED)) { Mat3CpyMat4(vmat, rv3d->viewmat); - else + } else Mat3One(vmat); /* inverse transform for view and object */ diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c index a2ba040adc8..b59c46a8068 100644 --- a/source/blender/editors/mesh/editmesh_loop.c +++ b/source/blender/editors/mesh/editmesh_loop.c @@ -888,7 +888,7 @@ void MESH_OT_knife_cut(wmOperatorType *ot) ot->modal= WM_gesture_lines_modal; ot->exec= knife_cut_exec; - ot->poll= ED_operator_editmesh; + ot->poll= EM_view3d_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 0ade6ff8844..97c72dc49ca 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -93,7 +93,7 @@ editmesh_mods.c, UI level access, no geometry changes #include "BLO_sys_types.h" // for intptr_t support /* XXX */ -static void waitcursor() {} +static void waitcursor(int val) {} static int pupmenu() {return 0;} /* ****************************** MIRROR **************** */ diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index dea78545fac..c1497ce1a06 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -97,7 +97,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise /* XXX */ static int extern_qread() {return 0;} -static void waitcursor() {} +static void waitcursor(int val) {} static int pupmenu() {return 0;} static int qtest() {return 0;} #define add_numbut(a, b, c, d, e, f, g) {} @@ -713,7 +713,7 @@ static int mesh_extrude_invoke(bContext *C, wmOperator *op, wmEvent *event) Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); - int constraint_axis[3] = {0, 0, 1}; +// int constraint_axis[3] = {0, 0, 1}; extrude_mesh(scene, obedit, em, op); @@ -726,11 +726,11 @@ static int mesh_extrude_invoke(bContext *C, wmOperator *op, wmEvent *event) RNA_boolean_set(op->ptr, "mirror", 0); /* the following two should only be set when extruding faces */ - RNA_enum_set(op->ptr, "constraint_orientation", V3D_MANIP_NORMAL); - RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); +// RNA_enum_set(op->ptr, "constraint_orientation", V3D_MANIP_NORMAL); +// RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis); - WM_operator_name_call(C, "TFM_OT_translate", WM_OP_INVOKE_REGION_WIN, op->ptr); +// WM_operator_name_call(C, "TFM_OT_translate", WM_OP_INVOKE_REGION_WIN, op->ptr); return OPERATOR_FINISHED; } @@ -4701,9 +4701,9 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event) BKE_mesh_end_editmesh(obedit->data, em); - RNA_enum_set(op->ptr, "proportional", 0); - RNA_boolean_set(op->ptr, "mirror", 0); - WM_operator_name_call(C, "TFM_OT_translate", WM_OP_INVOKE_REGION_WIN, op->ptr); +// RNA_enum_set(op->ptr, "proportional", 0); +// RNA_boolean_set(op->ptr, "mirror", 0); +// WM_operator_name_call(C, "TFM_OT_translate", WM_OP_INVOKE_REGION_WIN, op->ptr); #endif return OPERATOR_FINISHED; diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index ebdef22349b..f3a504bb214 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -230,6 +230,8 @@ static void MESH_OT_specials(wmOperatorType *ot) void ED_operatortypes_mesh(void) { + wmOperatorType *ot; + WM_operatortype_append(MESH_OT_select_all_toggle); WM_operatortype_append(MESH_OT_select_more); WM_operatortype_append(MESH_OT_select_less); @@ -313,9 +315,21 @@ void ED_operatortypes_mesh(void) WM_operatortype_append(MESH_OT_edge_specials); WM_operatortype_append(MESH_OT_face_specials); WM_operatortype_append(MESH_OT_specials); - WM_operatortype_append(MESH_OT_vert_connect); WM_operatortype_append(MESH_OT_edge_split); + + /* macros */ + ot= WM_operatortype_append_macro("MESH_OT_duplicate_move", "Add Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER); + WM_operatortype_macro_define(ot, "MESH_OT_duplicate"); + WM_operatortype_macro_define(ot, "TFM_OT_translate"); + + ot= WM_operatortype_append_macro("MESH_OT_rip_move", "Rip", OPTYPE_UNDO|OPTYPE_REGISTER); + WM_operatortype_macro_define(ot, "MESH_OT_rip"); + WM_operatortype_macro_define(ot, "TFM_OT_translate"); + + /*ot= WM_operatortype_append_macro("MESH_OT_extrude_move", "Extrude", OPTYPE_UNDO|OPTYPE_REGISTER); + WM_operatortype_macro_define(ot, "MESH_OT_extrude"); + WM_operatortype_macro_define(ot, "TFM_OT_translate");*/ } /* note mesh keymap also for other space? */ @@ -395,12 +409,12 @@ void ED_keymap_mesh(wmWindowManager *wm) WM_keymap_add_item(keymap, "MESH_OT_colors_rotate",EIGHTKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_colors_mirror",EIGHTKEY, KM_PRESS, KM_ALT, 0); - WM_keymap_add_item(keymap, "MESH_OT_rip",VKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "MESH_OT_rip_move",VKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_merge", MKEY, KM_PRESS, KM_ALT, 0); /* add/remove */ WM_keymap_add_item(keymap, "MESH_OT_edge_face_add", FKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "MESH_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "MESH_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "OBJECT_OT_mesh_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "MESH_OT_separate", PKEY, KM_PRESS, KM_SHIFT, 0); /* use KM_RELEASE because same key is used for tweaks */ diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index 5f406cb4db8..49e721f34e8 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -97,7 +97,7 @@ #include "mesh_intern.h" /* XXX */ -static void waitcursor() {} +static void waitcursor(int val) {} static void error() {} static int pupmenu() {return 0;} /* XXX */ diff --git a/source/blender/editors/metaball/Makefile b/source/blender/editors/metaball/Makefile new file mode 100644 index 00000000000..d971ec9b412 --- /dev/null +++ b/source/blender/editors/metaball/Makefile @@ -0,0 +1,56 @@ +# +# $Id$ +# +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2007 Blender Foundation +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): none yet. +# +# ***** END GPL LICENSE BLOCK ***** +# +# Makes module object directory and bounces make to subdirectories. + +LIBNAME = ed_metaball +DIR = $(OCGDIR)/blender/$(LIBNAME) + +include nan_compile.mk + +CFLAGS += $(LEVEL_1_C_WARNINGS) + +CPPFLAGS += -I$(NAN_GLEW)/include +CPPFLAGS += -I$(OPENGL_HEADERS) + +CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include +CPPFLAGS += -I$(NAN_ELBEEM)/include + +CPPFLAGS += -I../../windowmanager +CPPFLAGS += -I../../blenkernel +CPPFLAGS += -I../../blenloader +CPPFLAGS += -I../../blenlib +CPPFLAGS += -I../../makesdna +CPPFLAGS += -I../../makesrna +CPPFLAGS += -I../../imbuf +CPPFLAGS += -I../../gpu +CPPFLAGS += -I../../render/extern/include + +# own include + +CPPFLAGS += -I../include diff --git a/source/blender/editors/metaball/SConscript b/source/blender/editors/metaball/SConscript new file mode 100644 index 00000000000..4b1b4090631 --- /dev/null +++ b/source/blender/editors/metaball/SConscript @@ -0,0 +1,11 @@ +#!/usr/bin/python +Import ('env') + +sources = env.Glob('*.c') + +incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' +incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' +incs += ' #/intern/guardedalloc ../../gpu' +incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern' + +env.BlenderLib ( 'bf_editors_metaball', sources, Split(incs), [], libtype=['core'], priority=[45] ) diff --git a/source/blender/editors/metaball/editmball.c b/source/blender/editors/metaball/editmball.c new file mode 100644 index 00000000000..b9bb219783f --- /dev/null +++ b/source/blender/editors/metaball/editmball.c @@ -0,0 +1,683 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <math.h> +#include <string.h> + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "MEM_guardedalloc.h" + +#include "BLI_blenlib.h" +#include "BLI_arithb.h" +#include "BLI_rand.h" + +#include "DNA_meta_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_view3d_types.h" +#include "DNA_windowmanager_types.h" +#include "DNA_userdef_types.h" + +#include "RNA_define.h" +#include "RNA_access.h" + +#include "BKE_utildefines.h" +#include "BKE_depsgraph.h" +#include "BKE_object.h" +#include "BKE_context.h" + +#include "ED_screen.h" +#include "ED_view3d.h" +#include "ED_transform.h" +#include "ED_util.h" + +#include "WM_api.h" +#include "WM_types.h" + +/* This function is used to free all MetaElems from MetaBall */ +void free_editMball(Object *obedit) +{ +} + +/* This function is called, when MetaBall Object is + * switched from object mode to edit mode */ +void make_editMball(Object *obedit) +{ + MetaBall *mb = (MetaBall*)obedit->data; + MetaElem *ml;/*, *newml;*/ + + ml= mb->elems.first; + + while(ml) { + if(ml->flag & SELECT) mb->lastelem = ml; + ml= ml->next; + } + + mb->editelems = &mb->elems; +} + +/* This function is called, when MetaBall Object switched from + * edit mode to object mode. List od MetaElements is copied + * from object->data->edit_elems to to object->data->elems. */ +void load_editMball(Object *obedit) +{ + MetaBall *mb = (MetaBall*)obedit->data; + + mb->editelems= NULL; + mb->lastelem= NULL; +} + +/* Add metaelem primitive to metaball object (which is in edit mode) */ +MetaElem *add_metaball_primitive(bContext *C, int type, int newname) +{ + Scene *scene= CTX_data_scene(C); + View3D *v3d= CTX_wm_view3d(C); + RegionView3D *rv3d = CTX_wm_region_view3d(C); + Object *obedit= CTX_data_edit_object(C); + MetaBall *mball = (MetaBall*)obedit->data; + MetaElem *ml; + float *curs, mat[3][3], cent[3], imat[3][3], cmat[3][3]; + + if(!obedit) return NULL; + + /* Deselect all existing metaelems */ + ml= mball->editelems->first; + while(ml) { + ml->flag &= ~SELECT; + ml= ml->next; + } + + Mat3CpyMat4(mat, obedit->obmat); + if(v3d) { + curs= give_cursor(scene, v3d); + VECCOPY(cent, curs); + } + else + cent[0]= cent[1]= cent[2]= 0.0f; + + cent[0]-= obedit->obmat[3][0]; + cent[1]-= obedit->obmat[3][1]; + cent[2]-= obedit->obmat[3][2]; + + if (rv3d) { + if (!(newname) || U.flag & USER_ADD_VIEWALIGNED || !rv3d) + Mat3CpyMat4(imat, rv3d->viewmat); + else + Mat3One(imat); + Mat3MulVecfl(imat, cent); + Mat3MulMat3(cmat, imat, mat); + Mat3Inv(imat,cmat); + Mat3MulVecfl(imat, cent); + } + else + Mat3One(imat); + + ml= MEM_callocN(sizeof(MetaElem), "metaelem"); + + ml->x= cent[0]; + ml->y= cent[1]; + ml->z= cent[2]; + ml->quat[0]= 1.0; + ml->quat[1]= 0.0; + ml->quat[2]= 0.0; + ml->quat[3]= 0.0; + ml->rad= 2.0; + ml->s= 2.0; + ml->flag= SELECT | MB_SCALE_RAD; + + switch(type) { + case MB_BALL: + ml->type = MB_BALL; + ml->expx= ml->expy= ml->expz= 1.0; + break; + case MB_TUBE: + ml->type = MB_TUBE; + ml->expx= ml->expy= ml->expz= 1.0; + break; + case MB_PLANE: + ml->type = MB_PLANE; + ml->expx= ml->expy= ml->expz= 1.0; + break; + case MB_ELIPSOID: + ml->type = MB_ELIPSOID; + ml->expx= 1.2f; + ml->expy= 0.8f; + ml->expz= 1.0; + break; + case MB_CUBE: + ml->type = MB_CUBE; + ml->expx= ml->expy= ml->expz= 1.0; + break; + default: + break; + } + + mball->lastelem= ml; + + return ml; +} + +/***************************** Select/Deselect operator *****************************/ + +/* Select or deselect all MetaElements */ +static int select_deselect_all_metaelems_exec(bContext *C, wmOperator *op) +{ + //Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + MetaBall *mb = (MetaBall*)obedit->data; + MetaElem *ml; + int any_sel= 0; + + /* Is any metaelem selected? */ + ml= mb->editelems->first; + if(ml) { + while(ml) { + if(ml->flag & SELECT) break; + ml= ml->next; + } + if(ml) any_sel= 1; + + ml= mb->editelems->first; + while(ml) { + if(any_sel) ml->flag &= ~SELECT; + else ml->flag |= SELECT; + ml= ml->next; + } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + //DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + } + + return OPERATOR_FINISHED; +} + +void MBALL_OT_select_deselect_all_metaelems(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select/Deselect All"; + ot->idname= "MBALL_OT_select_deselect_all_metaelems"; + + /* callback functions */ + ot->exec= select_deselect_all_metaelems_exec; + ot->poll= ED_operator_editmball; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************************** Select inverse operator *****************************/ + +/* Invert metaball selection */ +static int select_inverse_metaelems_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + MetaBall *mb = (MetaBall*)obedit->data; + MetaElem *ml; + + ml= mb->editelems->first; + if(ml) { + while(ml) { + if(ml->flag & SELECT) + ml->flag &= ~SELECT; + else + ml->flag |= SELECT; + ml= ml->next; + } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + } + + return OPERATOR_FINISHED; +} + +void MBALL_OT_select_inverse_metaelems(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Inverse"; + ot->idname= "MBALL_OT_select_inverse_metaelems"; + + /* callback functions */ + ot->exec= select_inverse_metaelems_exec; + ot->poll= ED_operator_editmball; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************************** Select random operator *****************************/ + +/* Random metaball selection */ +static int select_random_metaelems_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + MetaBall *mb = (MetaBall*)obedit->data; + MetaElem *ml; + float percent= RNA_float_get(op->ptr, "percent"); + + if(percent == 0.0) + return OPERATOR_CANCELLED; + + ml= mb->editelems->first; + BLI_srand( BLI_rand() ); /* Random seed */ + + /* Stupid version of random selection. Should be improved. */ + while(ml) { + if(BLI_frand() < percent) + ml->flag |= SELECT; + else + ml->flag &= ~SELECT; + ml= ml->next; + } + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + + +void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Random..."; + ot->idname= "MBALL_OT_select_random_metaelems"; + + /* callback functions */ + ot->exec= select_random_metaelems_exec; + ot->invoke= WM_operator_props_popup; + ot->poll= ED_operator_editmball; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_float_percentage(ot->srna, "percent", 0.5f, 0.0f, 1.0f, "Percent", "Percentage of metaelems to select randomly.", 0.0001f, 1.0f); +} + +/***************************** Duplicate operator *****************************/ + +/* Duplicate selected MetaElements */ +static int duplicate_metaelems_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + MetaBall *mb = (MetaBall*)obedit->data; + MetaElem *ml, *newml; + + ml= mb->editelems->last; + if(ml) { + while(ml) { + if(ml->flag & SELECT) { + newml= MEM_dupallocN(ml); + BLI_addtail(mb->editelems, newml); + mb->lastelem= newml; + ml->flag &= ~SELECT; + } + ml= ml->prev; + } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + } + + return OPERATOR_FINISHED; +} + +static int duplicate_metaelems_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + int retv= duplicate_metaelems_exec(C, op); + + if (retv == OPERATOR_FINISHED) { + RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); + WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); + } + + return retv; +} + + +void MBALL_OT_duplicate_metaelems(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Duplicate"; + ot->idname= "MBALL_OT_duplicate_metaelems"; + + /* callback functions */ + ot->exec= duplicate_metaelems_exec; + ot->invoke= duplicate_metaelems_invoke; + ot->poll= ED_operator_editmball; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* to give to transform */ + RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX); +} + +/***************************** Delete operator *****************************/ + +/* Delete all selected MetaElems (not MetaBall) */ +static int delete_metaelems_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + MetaBall *mb= (MetaBall*)obedit->data; + MetaElem *ml, *next; + + ml= mb->editelems->first; + if(ml) { + while(ml) { + next= ml->next; + if(ml->flag & SELECT) { + if(mb->lastelem==ml) mb->lastelem= NULL; + BLI_remlink(mb->editelems, ml); + MEM_freeN(ml); + } + ml= next; + } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + } + + return OPERATOR_FINISHED; +} + +void MBALL_OT_delete_metaelems(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Delete"; + ot->idname= "MBALL_OT_delete_metaelems"; + + /* callback functions */ + ot->exec= delete_metaelems_exec; + ot->poll= ED_operator_editmball; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/***************************** Hide operator *****************************/ + +/* Hide selected MetaElems */ +static int hide_metaelems_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + MetaBall *mb= (MetaBall*)obedit->data; + MetaElem *ml; + int hide_unselected= RNA_boolean_get(op->ptr, "unselected"); + + ml= mb->editelems->first; + + if(ml) { + /* Hide unselected metaelems */ + if(hide_unselected) { + while(ml){ + if(!(ml->flag & SELECT)) + ml->flag |= MB_HIDE; + ml= ml->next; + } + /* Hide selected metaelems */ + } else { + while(ml){ + if(ml->flag & SELECT) + ml->flag |= MB_HIDE; + ml= ml->next; + } + } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + } + + return OPERATOR_FINISHED; +} + +void MBALL_OT_hide_metaelems(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Hide"; + ot->idname= "MBALL_OT_hide_metaelems"; + + /* callback functions */ + ot->exec= hide_metaelems_exec; + ot->poll= ED_operator_editmball; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* props */ + RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected."); +} + +/***************************** Unhide operator *****************************/ + +/* Unhide all edited MetaElems */ +static int reveal_metaelems_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + MetaBall *mb= (MetaBall*)obedit->data; + MetaElem *ml; + + ml= mb->editelems->first; + + if(ml) { + while(ml) { + ml->flag &= ~MB_HIDE; + ml= ml->next; + } + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + } + + return OPERATOR_FINISHED; +} + +void MBALL_OT_reveal_metaelems(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Reveal"; + ot->idname= "MBALL_OT_reveal_metaelems"; + + /* callback functions */ + ot->exec= reveal_metaelems_exec; + ot->poll= ED_operator_editmball; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* Select MetaElement with mouse click (user can select radius circle or + * stiffness circle) */ +void mouse_mball(bContext *C, short mval[2], int extend) +{ + static MetaElem *startelem=NULL; + Object *obedit= CTX_data_edit_object(C); + ViewContext vc; + MetaBall *mb = (MetaBall*)obedit->data; + MetaElem *ml, *act=NULL; + int a, hits; + unsigned int buffer[4*MAXPICKBUF]; + rcti rect; + + view3d_set_viewcontext(C, &vc); + + rect.xmin= mval[0]-12; + rect.xmax= mval[0]+12; + rect.ymin= mval[1]-12; + rect.ymax= mval[1]+12; + + hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect); + + /* does startelem exist? */ + ml= mb->editelems->first; + while(ml) { + if(ml==startelem) break; + ml= ml->next; + } + + if(ml==NULL) startelem= mb->editelems->first; + + if(hits>0) { + ml= startelem; + while(ml) { + for(a=0; a<hits; a++) { + /* index converted for gl stuff */ + if(ml->selcol1==buffer[ 4 * a + 3 ]){ + ml->flag |= MB_SCALE_RAD; + act= ml; + } + if(ml->selcol2==buffer[ 4 * a + 3 ]){ + ml->flag &= ~MB_SCALE_RAD; + act= ml; + } + } + if(act) break; + ml= ml->next; + if(ml==NULL) ml= mb->editelems->first; + if(ml==startelem) break; + } + + /* When some metaelem was found, then it is neccessary to select or + * deselet it. */ + if(act) { + if(extend==0) { + /* Deselect all existing metaelems */ + ml= mb->editelems->first; + while(ml) { + ml->flag &= ~SELECT; + ml= ml->next; + } + /* Select only metaelem clicked on */ + act->flag |= SELECT; + } + else { + if(act->flag & SELECT) + act->flag &= ~SELECT; + else + act->flag |= SELECT; + } + mb->lastelem= act; + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + } + } +} + + +/* ************* undo for MetaBalls ************* */ + +/* free all MetaElems from ListBase */ +static void freeMetaElemlist(ListBase *lb) +{ + MetaElem *ml, *next; + + if(lb==NULL) return; + + ml= lb->first; + while(ml){ + next= ml->next; + BLI_remlink(lb, ml); + MEM_freeN(ml); + ml= next; + } + + lb->first= lb->last= NULL; +} + + +static void undoMball_to_editMball(void *lbu, void *lbe) +{ + ListBase *lb= lbu; + ListBase *editelems= lbe; + MetaElem *ml, *newml; + + freeMetaElemlist(editelems); + + /* copy 'undo' MetaElems to 'edit' MetaElems */ + ml= lb->first; + while(ml){ + newml= MEM_dupallocN(ml); + BLI_addtail(editelems, newml); + ml= ml->next; + } + +} + +static void *editMball_to_undoMball(void *lbe) +{ + ListBase *editelems= lbe; + ListBase *lb; + MetaElem *ml, *newml; + + /* allocate memory for undo ListBase */ + lb= MEM_callocN(sizeof(ListBase), "listbase undo"); + lb->first= lb->last= NULL; + + /* copy contents of current ListBase to the undo ListBase */ + ml= editelems->first; + while(ml){ + newml= MEM_dupallocN(ml); + BLI_addtail(lb, newml); + ml= ml->next; + } + + return lb; +} + +/* free undo ListBase of MetaElems */ +static void free_undoMball(void *lbv) +{ + ListBase *lb= lbv; + + freeMetaElemlist(lb); + MEM_freeN(lb); +} + +ListBase *metaball_get_editelems(Object *ob) +{ + if(ob && ob->type==OB_MBALL) { + struct MetaBall *mb= (struct MetaBall*)ob->data; + return mb->editelems; + } + return NULL; +} + + +static void *get_data(bContext *C) +{ + Object *obedit= CTX_data_edit_object(C); + return metaball_get_editelems(obedit); +} + +/* this is undo system for MetaBalls */ +void undo_push_mball(bContext *C, char *name) +{ + undo_editmode_push(C, name, get_data, free_undoMball, undoMball_to_editMball, editMball_to_undoMball, NULL); +} + diff --git a/source/blender/editors/metaball/mball_intern.h b/source/blender/editors/metaball/mball_intern.h new file mode 100644 index 00000000000..8cf749733dd --- /dev/null +++ b/source/blender/editors/metaball/mball_intern.h @@ -0,0 +1,47 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2008 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef ED_MBALL_INTERN_H +#define ED_MBALL_INTERN_H + +#include "DNA_object_types.h" + +#include "DNA_windowmanager_types.h" + +void MBALL_OT_hide_metaelems(struct wmOperatorType *ot); +void MBALL_OT_reveal_metaelems(struct wmOperatorType *ot); + +void MBALL_OT_delete_metaelems(struct wmOperatorType *ot); +void MBALL_OT_duplicate_metaelems(struct wmOperatorType *ot); + +void MBALL_OT_select_deselect_all_metaelems(struct wmOperatorType *ot); +void MBALL_OT_select_inverse_metaelems(struct wmOperatorType *ot); +void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot); + +#endif + diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c new file mode 100644 index 00000000000..38593af372f --- /dev/null +++ b/source/blender/editors/metaball/mball_ops.c @@ -0,0 +1,68 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2008 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "WM_api.h" +#include "WM_types.h" + +#include "RNA_access.h" + +#include "DNA_listBase.h" +#include "DNA_windowmanager_types.h" + +#include "mball_intern.h" + +void ED_operatortypes_metaball(void) +{ + WM_operatortype_append(MBALL_OT_delete_metaelems); + WM_operatortype_append(MBALL_OT_duplicate_metaelems); + + WM_operatortype_append(MBALL_OT_hide_metaelems); + WM_operatortype_append(MBALL_OT_reveal_metaelems); + + WM_operatortype_append(MBALL_OT_select_deselect_all_metaelems); + WM_operatortype_append(MBALL_OT_select_inverse_metaelems); + WM_operatortype_append(MBALL_OT_select_random_metaelems); +} + +void ED_keymap_metaball(wmWindowManager *wm) +{ + ListBase *keymap= WM_keymap_listbase(wm, "Metaball", 0, 0); + + WM_keymap_add_item(keymap, "OBJECT_OT_metaball_add", AKEY, KM_PRESS, KM_SHIFT, 0); + + WM_keymap_add_item(keymap, "MBALL_OT_reveal_metaelems", HKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, 0, 0); + RNA_enum_set(WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1); + + WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", XKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "MBALL_OT_duplicate_metaelems", DKEY, KM_PRESS, KM_SHIFT, 0); + + WM_keymap_add_item(keymap, "MBALL_OT_select_deselect_all_metaelems", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "MBALL_OT_select_inverse_metaelems", IKEY, KM_PRESS, KM_CTRL, 0); +} + diff --git a/source/blender/editors/object/editconstraint.c b/source/blender/editors/object/editconstraint.c index 437beda324b..9e8205e58ab 100644 --- a/source/blender/editors/object/editconstraint.c +++ b/source/blender/editors/object/editconstraint.c @@ -462,6 +462,58 @@ void object_test_constraints (Object *owner) /* ********************** CONSTRAINT-SPECIFIC STUFF ********************* */ +/* ---------- Distance-Dependent Constraints ---------- */ +/* StretchTo, Limit Distance */ + +static int stretchto_reset_exec (bContext *C, wmOperator *op) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_StretchToConstraint); + + /* just set original length to 0.0, which will cause a reset on next recalc */ + RNA_float_set(&ptr, "original_length", 0.0f); + + WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL); + return OPERATOR_FINISHED; +} + +void CONSTRAINT_OT_stretchto_reset (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Reset Original Length"; + ot->idname= "CONSTRAINT_OT_stretchto_reset"; + ot->description= "Reset original length of bone for Stretch To Constraint."; + + ot->exec= stretchto_reset_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + + +static int limitdistance_reset_exec (bContext *C, wmOperator *op) +{ + PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_LimitDistanceConstraint); + + /* just set distance to 0.0, which will cause a reset on next recalc */ + RNA_float_set(&ptr, "distance", 0.0f); + + WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL); + return OPERATOR_FINISHED; +} + +void CONSTRAINT_OT_limitdistance_reset (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Reset Distance"; + ot->idname= "CONSTRAINT_OT_limitdistance_reset"; + ot->description= "Reset limiting distance for Limit Distance Constraint."; + + ot->exec= limitdistance_reset_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + /* ------------- Child-Of Constraint ------------------ */ /* ChildOf Constraint - set inverse callback */ diff --git a/source/blender/editors/object/editkey.c b/source/blender/editors/object/editkey.c index f38c03fb284..82194a4c3b4 100644 --- a/source/blender/editors/object/editkey.c +++ b/source/blender/editors/object/editkey.c @@ -164,14 +164,20 @@ static KeyBlock *add_keyblock(Scene *scene, Key *key) kb= MEM_callocN(sizeof(KeyBlock), "Keyblock"); BLI_addtail(&key->block, kb); kb->type= KEY_CARDINAL; + tot= BLI_countlist(&key->block); if(tot==1) strcpy(kb->name, "Basis"); else sprintf(kb->name, "Key %d", tot-1); + + // XXX this is old anim system stuff? (i.e. the 'index' of the shapekey) kb->adrcode= tot-1; key->totkey++; if(key->totkey==1) key->refkey= kb; + kb->slidermin= 0.0f; + kb->slidermax= 1.0f; + // XXX kb->pos is the confusing old horizontal-line RVK crap in old IPO Editor... if(key->type == KEY_RELATIVE) kb->pos= curpos+0.1; diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 916a33ba1c8..780fa526b33 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -115,6 +115,7 @@ #include "ED_curve.h" #include "ED_particle.h" #include "ED_mesh.h" +#include "ED_mball.h" #include "ED_object.h" #include "ED_screen.h" #include "ED_transform.h" @@ -138,10 +139,10 @@ /* ************* XXX **************** */ static void error() {} -static void waitcursor() {} -static int pupmenu() {return 0;} -static int pupmenu_col() {return 0;} -static int okee() {return 0;} +static void waitcursor(int val) {} +static int pupmenu(const char *msg) {return 0;} +static int pupmenu_col(const char *msg, int val) {return 0;} +static int okee(const char *msg) {return 0;} /* port over here */ static bContext *C; @@ -539,6 +540,78 @@ void OBJECT_OT_surface_add(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", prop_surface_types, 0, "Primitive", ""); } +static EnumPropertyItem prop_metaball_types[]= { + {MB_BALL, "MBALL_BALL", ICON_META_BALL, "Meta Ball", ""}, + {MB_TUBE, "MBALL_TUBE", ICON_META_TUBE, "Meta Tube", ""}, + {MB_PLANE, "MBALL_PLANE", ICON_META_PLANE, "Meta Plane", ""}, + {MB_CUBE, "MBALL_CUBE", ICON_META_CUBE, "Meta Cube", ""}, + {MB_ELIPSOID, "MBALL_ELLIPSOID", ICON_META_ELLIPSOID, "Meta Ellipsoid", ""}, + {0, NULL, 0, NULL, NULL} +}; + +static int object_metaball_add_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + MetaBall *mball; + MetaElem *elem; + int newob= 0; + + if(obedit==NULL || obedit->type!=OB_MBALL) { + object_add_type(C, OB_MBALL); + ED_object_enter_editmode(C, 0); + newob = 1; + } + else DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); + + obedit= CTX_data_edit_object(C); + elem= (MetaElem*)add_metaball_primitive(C, RNA_enum_get(op->ptr, "type"), newob); + mball= (MetaBall*)obedit->data; + BLI_addtail(mball->editelems, elem); + + /* userdef */ + if (newob && (U.flag & USER_ADD_EDITMODE)==0) { + ED_object_exit_editmode(C, EM_FREEDATA); + } + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + Object *obedit= CTX_data_edit_object(C); + uiPopupMenu *pup; + uiLayout *layout; + + pup= uiPupMenuBegin(C, op->type->name, 0); + layout= uiPupMenuLayout(pup); + if(!obedit || obedit->type == OB_MBALL) + uiItemsEnumO(layout, op->type->idname, "type"); + else + uiItemsEnumO(layout, "OBJECT_OT_metaball_add", "type"); + uiPupMenuEnd(C, pup); + + return OPERATOR_CANCELLED; +} + +void OBJECT_OT_metaball_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Metaball"; + ot->description= "Add an metaball object to the scene."; + ot->idname= "OBJECT_OT_metaball_add"; + + /* api callbacks */ + ot->invoke= object_metaball_add_invoke; + ot->exec= object_metaball_add_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "type", prop_metaball_types, 0, "Primitive", ""); +} static int object_add_text_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); @@ -617,7 +690,6 @@ void OBJECT_OT_armature_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } - static int object_primitive_add_invoke(bContext *C, wmOperator *op, wmEvent *event) { uiPopupMenu *pup= uiPupMenuBegin(C, "Add Object", 0); @@ -626,7 +698,7 @@ static int object_primitive_add_invoke(bContext *C, wmOperator *op, wmEvent *eve uiItemMenuEnumO(layout, "Mesh", ICON_OUTLINER_OB_MESH, "OBJECT_OT_mesh_add", "type"); uiItemMenuEnumO(layout, "Curve", ICON_OUTLINER_OB_CURVE, "OBJECT_OT_curve_add", "type"); uiItemMenuEnumO(layout, "Surface", ICON_OUTLINER_OB_SURFACE, "OBJECT_OT_surface_add", "type"); - uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_META, "OBJECT_OT_object_add", "type", OB_MBALL); + uiItemMenuEnumO(layout, NULL, ICON_OUTLINER_OB_META, "OBJECT_OT_metaball_add", "type"); uiItemO(layout, "Text", ICON_OUTLINER_OB_FONT, "OBJECT_OT_text_add"); uiItemS(layout); uiItemO(layout, "Armature", ICON_OUTLINER_OB_ARMATURE, "OBJECT_OT_armature_add"); @@ -2661,68 +2733,128 @@ void make_vertex_parent(Scene *scene, Object *obedit, View3D *v3d) DAG_scene_sort(scene); } -static Object *group_objects_menu(Group *group) + +/* ******************** make proxy operator *********************** */ + +/* present menu listing the possible objects within the group to proxify */ +static void proxy_group_objects_menu (bContext *C, wmOperator *op, Object *ob, Group *group) { + uiPopupMenu *pup; + uiLayout *layout; GroupObject *go; - int len= 0; - short a, nr; - char *str; - - for(go= group->gobject.first; go; go= go->next) { - if(go->ob) - len++; + int len=0; + + /* check if there are any objects within the group to assign for */ + for (go= group->gobject.first; go; go= go->next) { + if (go->ob) len++; } - if(len==0) return NULL; + if (len==0) return; - str= MEM_callocN(40+32*len, "menu"); + /* now create the menu to draw */ + pup= uiPupMenuBegin(C, "Make Proxy For:", 0); + layout= uiPupMenuLayout(pup); - strcpy(str, "Make Proxy for: %t"); - a= strlen(str); - for(nr=1, go= group->gobject.first; go; go= go->next, nr++) { - a+= sprintf(str+a, "|%s %%x%d", go->ob->id.name+2, nr); + for (go= group->gobject.first; go; go= go->next) { + if (go->ob) { + PointerRNA props_ptr; + + /* create operator properties, and assign the relevant pointers to that, + * and add a menu entry which uses these props + */ + WM_operator_properties_create(&props_ptr, op->idname); + RNA_string_set(&props_ptr, "object", go->ob->id.name+2); + RNA_string_set(&props_ptr, "group_object", go->ob->id.name+2); + uiItemFullO(layout, go->ob->id.name+2, 0, op->idname, props_ptr.data, WM_OP_EXEC_REGION_WIN); + } } - a= pupmenu_col(str, 20); - MEM_freeN(str); - if(a>0) { - go= BLI_findlink(&group->gobject, a-1); - return go->ob; - } - return NULL; + /* display the menu, and be done */ + uiPupMenuEnd(C, pup); } - -/* adds empty object to become local replacement data of a library-linked object */ -void make_proxy(Scene *scene) +/* set the object to proxify */ +static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt) { - Object *ob= OBACT; - Object *gob= NULL; - - if(scene->id.lib) return; - if(ob==NULL) return; - + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); - if(ob->dup_group && ob->dup_group->id.lib) { - gob= ob; + /* sanity checks */ + if (!scene || scene->id.lib || !ob) + return OPERATOR_CANCELLED; + + /* Get object to work on - use a menu if we need to... */ + if (ob->dup_group && ob->dup_group->id.lib) { /* gives menu with list of objects in group */ - ob= group_objects_menu(ob->dup_group); + proxy_group_objects_menu(C, op, ob, ob->dup_group); } - else if(ob->id.lib) { - if(okee("Make Proxy Object")==0) - return; + else if (ob->id.lib) { + uiPopupMenu *pup= uiPupMenuBegin(C, "OK?", ICON_QUESTION); + uiLayout *layout= uiPupMenuLayout(pup); + PointerRNA props_ptr; + + /* create operator properties, and assign the relevant pointers to that, + * and add a menu entry which uses these props + */ + WM_operator_properties_create(&props_ptr, op->idname); + RNA_string_set(&props_ptr, "object", ob->id.name+2); + uiItemFullO(layout, op->type->name, 0, op->idname, props_ptr.data, WM_OP_EXEC_REGION_WIN); + + /* present the menu and be done... */ + uiPupMenuEnd(C, pup); } else { - error("Can only make proxy for a referenced object or group"); - return; + /* error.. cannot continue */ + BKE_report(op->reports, RPT_ERROR, "Can only make proxy for a referenced object or group"); + } + + /* this invoke just calls another instance of this operator... */ + return OPERATOR_CANCELLED; +} + +static int make_proxy_exec (bContext *C, wmOperator *op) +{ + Object *ob=NULL, *gob=NULL; + Scene *scene= CTX_data_scene(C); + char ob_name[21], gob_name[21]; + + /* get object and group object + * - firstly names + * - then pointers from context + */ + RNA_string_get(op->ptr, "object", ob_name); + RNA_string_get(op->ptr, "group_object", gob_name); + + if (gob_name[0]) { + Group *group; + GroupObject *go; + + /* active object is group object... */ + // FIXME: we should get the nominated name instead + gob= CTX_data_active_object(C); + group= gob->dup_group; + + /* find the object to affect */ + for (go= group->gobject.first; go; go= go->next) { + if ((go->ob) && strcmp(go->ob->id.name+2, gob_name)==0) { + ob= go->ob; + break; + } + } + } + else { + /* just use the active object for now */ + // FIXME: we should get the nominated name instead + ob= CTX_data_active_object(C); } - if(ob) { + if (ob) { Object *newob; Base *newbase, *oldbase= BASACT; char name[32]; + /* Add new object for the proxy */ newob= add_object(scene, OB_EMPTY); - if(gob) + if (gob) strcpy(name, gob->id.name+2); else strcpy(name, ob->id.name+2); @@ -2735,32 +2867,68 @@ void make_proxy(Scene *scene) newob->lay= newbase->lay; /* remove base, leave user count of object, it gets linked in object_make_proxy */ - if(gob==NULL) { + if (gob==NULL) { BLI_remlink(&scene->base, oldbase); MEM_freeN(oldbase); - } + } + object_make_proxy(newob, ob, gob); + /* depsgraph flushes are needed for the new data */ DAG_scene_sort(scene); DAG_object_flush_update(scene, newob, OB_RECALC); + + WM_event_add_notifier(C, NC_OBJECT, NULL); + } + else { + BKE_report(op->reports, RPT_ERROR, "No object to make proxy for"); + return OPERATOR_CANCELLED; } + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_proxy_make (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Make Proxy"; + ot->idname= "OBJECT_OT_proxy_make"; + ot->description= "Add empty object to become local replacement data of a library-linked object"; + + /* callbacks */ + ot->invoke= make_proxy_invoke; + ot->exec= make_proxy_exec; + ot->poll= ED_operator_object_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_string(ot->srna, "object", "", 19, "Proxy Object", "Name of lib-linked/grouped object to make a proxy for."); + RNA_def_string(ot->srna, "group_object", "", 19, "Group Object", "Name of group instancer (if applicable)."); } /* ******************** make parent operator *********************** */ -#define PAR_OBJECT 0 -#define PAR_ARMATURE 1 -#define PAR_BONE 2 -#define PAR_CURVE 3 -#define PAR_FOLLOW 4 -#define PAR_PATH_CONST 5 -#define PAR_LATTICE 6 -#define PAR_VERTEX 7 -#define PAR_TRIA 8 +#define PAR_OBJECT 0 +#define PAR_ARMATURE 1 +#define PAR_ARMATURE_NAME 2 +#define PAR_ARMATURE_ENVELOPE 3 +#define PAR_ARMATURE_AUTO 4 +#define PAR_BONE 5 +#define PAR_CURVE 6 +#define PAR_FOLLOW 7 +#define PAR_PATH_CONST 8 +#define PAR_LATTICE 9 +#define PAR_VERTEX 10 +#define PAR_TRIA 11 static EnumPropertyItem prop_make_parent_types[] = { {PAR_OBJECT, "OBJECT", 0, "Object", ""}, {PAR_ARMATURE, "ARMATURE", 0, "Armature Deform", ""}, + {PAR_ARMATURE_NAME, "ARMATURE_NAME", 0, " With Empty Groups", ""}, + {PAR_ARMATURE_AUTO, "ARMATURE_AUTO", 0, " With Automatic Weights", ""}, + {PAR_ARMATURE_ENVELOPE, "ARMATURE_ENVELOPE", 0, " With Envelope Weights", ""}, {PAR_BONE, "BONE", 0, "Bone", ""}, {PAR_CURVE, "CURVE", 0, "Curve Deform", ""}, {PAR_FOLLOW, "FOLLOW", 0, "Follow Path", ""}, @@ -2804,6 +2972,7 @@ static int parent_set_exec(bContext *C, wmOperator *op) Object *par= CTX_data_active_object(C); bPoseChannel *pchan= NULL; int partype= RNA_enum_get(op->ptr, "type"); + int pararm= ELEM4(partype, PAR_ARMATURE, PAR_ARMATURE_NAME, PAR_ARMATURE_ENVELOPE, PAR_ARMATURE_AUTO); par->recalc |= OB_RECALC_OB; @@ -2875,24 +3044,20 @@ static int parent_set_exec(bContext *C, wmOperator *op) ob->loc[0] = vec[0]; ob->loc[1] = vec[1]; } - else if(partype==PAR_ARMATURE && ob->type==OB_MESH && par->type == OB_ARMATURE) { + else if(pararm && ob->type==OB_MESH && par->type == OB_ARMATURE) { + if(partype == PAR_ARMATURE_NAME) + create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_NAME); + else if(partype == PAR_ARMATURE_ENVELOPE) + create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_ENVELOPE); + else if(partype == PAR_ARMATURE_AUTO) + create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_AUTO); - if(1) { - /* Prompt the user as to whether he wants to - * add some vertex groups based on the bones - * in the parent armature. - */ - create_vgroups_from_armature(scene, ob, par); - - /* get corrected inverse */ - ob->partype= PAROBJECT; - what_does_parent(scene, ob, &workob); - - ob->partype= PARSKEL; - } - else - what_does_parent(scene, ob, &workob); + /* get corrected inverse */ + ob->partype= PAROBJECT; + what_does_parent(scene, ob, &workob); + ob->partype= PARSKEL; + Mat4Invert(ob->parentinv, workob.obmat); } else { @@ -2903,7 +3068,7 @@ static int parent_set_exec(bContext *C, wmOperator *op) ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA; - if( ELEM3(partype, PAR_CURVE, PAR_ARMATURE, PAR_LATTICE) ) + if( ELEM(partype, PAR_CURVE, PAR_LATTICE) || pararm ) ob->partype= PARSKEL; /* note, dna define, not operator property */ else ob->partype= PAROBJECT; /* note, dna define, not operator property */ @@ -2931,6 +3096,9 @@ static int parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event) /* ob becomes parent, make the associated menus */ if(ob->type==OB_ARMATURE) { uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE); + uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE_NAME); + uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE_ENVELOPE); + uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_ARMATURE_AUTO); uiItemEnumO(layout, NULL, 0, "OBJECT_OT_parent_set", "type", PAR_BONE); } else if(ob->type==OB_CURVE) { @@ -3549,9 +3717,8 @@ void ED_object_exit_editmode(bContext *C, int flag) if(freedata) free_editLatt(obedit); } else if(obedit->type==OB_MBALL) { -// extern ListBase editelems; -// load_editMball(); -// if(freedata) BLI_freelistN(&editelems); + load_editMball(obedit); + if(freedata) free_editMball(obedit); } /* freedata only 0 now on file saves */ @@ -3583,10 +3750,11 @@ void ED_object_enter_editmode(bContext *C, int flag) if(scene->id.lib) return; if(base==NULL) return; - if(sa->spacetype==SPACE_VIEW3D) + if(sa && sa->spacetype==SPACE_VIEW3D) v3d= sa->spacedata.first; - if((v3d==NULL || (base->lay & v3d->lay))==0) return; + if(v3d && (base->lay & v3d->lay)==0) return; + else if(!v3d && (base->lay & scene->lay)==0) return; ob = base->object; @@ -3640,14 +3808,15 @@ void ED_object_enter_editmode(bContext *C, int flag) scene->obedit= ob; // XXX for context ok= 1; make_editText(ob); + WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_TEXT, scene); } else if(ob->type==OB_MBALL) { scene->obedit= ob; // XXX for context -// ok= 1; -// XXX make_editMball(); + ok= 1; + make_editMball(ob); + WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_MBALL, scene); - } else if(ob->type==OB_LATTICE) { scene->obedit= ob; // XXX for context @@ -3706,6 +3875,42 @@ void OBJECT_OT_editmode_toggle(wmOperatorType *ot) /* *************************** */ +static int posemode_exec(bContext *C, wmOperator *op) +{ + Base *base= CTX_data_active_base(C); + + if(base->object->type==OB_ARMATURE) { + if(base->object==CTX_data_edit_object(C)) { + ED_object_exit_editmode(C, EM_FREEDATA); + ED_armature_enter_posemode(C, base); + } + else if(base->object->flag & OB_POSEMODE) + ED_armature_exit_posemode(C, base); + else + ED_armature_enter_posemode(C, base); + + return OPERATOR_FINISHED; + } + + return OPERATOR_PASS_THROUGH; +} + +void OBJECT_OT_posemode_toggle(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Toggle Pose Mode"; + ot->idname= "OBJECT_OT_posemode_toggle"; + ot->description= "Enables or disables posing/selecting bones"; + + /* api callbacks */ + ot->exec= posemode_exec; + ot->poll= ED_operator_object_active; + + /* flag */ + ot->flag= OPTYPE_REGISTER; +} + +/* *********************** */ void check_editmode(int type) { @@ -6254,12 +6459,11 @@ static Base *object_add_duplicate_internal(Scene *scene, Base *base, int dupflag return basen; } -/* single object duplicate, if dupflag==0, fully linked, else it uses U.dupflag */ +/* single object duplicate, if dupflag==0, fully linked, else it uses the flags given */ /* leaves selection of base/object unaltered */ -Base *ED_object_add_duplicate(Scene *scene, Base *base, int usedupflag) +Base *ED_object_add_duplicate(Scene *scene, Base *base, int dupflag) { Base *basen; - int dupflag= usedupflag?U.dupflag:0; clear_id_newpoins(); clear_sca_new_poins(); /* sensor/contr/act */ @@ -6309,8 +6513,8 @@ static int duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event) { duplicate_exec(C, op); - RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); - WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); +// RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); +// WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index fba49caba28..17d4f5deaae 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -40,6 +40,7 @@ struct Mesh; /* object_edit.c */ void OBJECT_OT_editmode_toggle(struct wmOperatorType *ot); +void OBJECT_OT_posemode_toggle(struct wmOperatorType *ot); void OBJECT_OT_parent_set(struct wmOperatorType *ot); void OBJECT_OT_parent_clear(struct wmOperatorType *ot); void OBJECT_OT_track_set(struct wmOperatorType *ot); @@ -65,12 +66,14 @@ void OBJECT_OT_object_add(struct wmOperatorType *ot); void OBJECT_OT_duplicate(struct wmOperatorType *ot); void OBJECT_OT_delete(struct wmOperatorType *ot); void OBJECT_OT_join(struct wmOperatorType *ot); +void OBJECT_OT_proxy_make(struct wmOperatorType *ot); void OBJECT_OT_shade_smooth(struct wmOperatorType *ot); void OBJECT_OT_shade_flat(struct wmOperatorType *ot); void OBJECT_OT_mesh_add(struct wmOperatorType *ot); void OBJECT_OT_curve_add(struct wmOperatorType *ot); void OBJECT_OT_surface_add(struct wmOperatorType *ot); +void OBJECT_OT_metaball_add(wmOperatorType *ot); void OBJECT_OT_text_add(struct wmOperatorType *ot); void OBJECT_OT_armature_add(struct wmOperatorType *ot); /* only used as menu */ @@ -119,6 +122,8 @@ void CONSTRAINT_OT_delete(struct wmOperatorType *ot); void CONSTRAINT_OT_move_up(struct wmOperatorType *ot); void CONSTRAINT_OT_move_down(struct wmOperatorType *ot); +void CONSTRAINT_OT_stretchto_reset(struct wmOperatorType *ot); +void CONSTRAINT_OT_limitdistance_reset(struct wmOperatorType *ot); void CONSTRAINT_OT_childof_set_inverse(struct wmOperatorType *ot); void CONSTRAINT_OT_childof_clear_inverse(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 9971030bb66..c1509e78502 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -63,7 +63,10 @@ void ED_operatortypes_object(void) { + wmOperatorType *ot; + WM_operatortype_append(OBJECT_OT_editmode_toggle); + WM_operatortype_append(OBJECT_OT_posemode_toggle); WM_operatortype_append(OBJECT_OT_parent_set); WM_operatortype_append(OBJECT_OT_parent_clear); WM_operatortype_append(OBJECT_OT_track_set); @@ -87,6 +90,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_duplicates_make_real); WM_operatortype_append(OBJECT_OT_duplicate); WM_operatortype_append(OBJECT_OT_join); + WM_operatortype_append(OBJECT_OT_proxy_make); WM_operatortype_append(OBJECT_OT_shade_smooth); WM_operatortype_append(OBJECT_OT_shade_flat); WM_operatortype_append(GROUP_OT_group_create); @@ -102,6 +106,8 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_armature_add); WM_operatortype_append(OBJECT_OT_object_add); WM_operatortype_append(OBJECT_OT_primitive_add); + WM_operatortype_append(OBJECT_OT_mesh_add); + WM_operatortype_append(OBJECT_OT_metaball_add); WM_operatortype_append(OBJECT_OT_modifier_add); WM_operatortype_append(OBJECT_OT_modifier_remove); @@ -124,6 +130,8 @@ void ED_operatortypes_object(void) WM_operatortype_append(CONSTRAINT_OT_delete); WM_operatortype_append(CONSTRAINT_OT_move_up); WM_operatortype_append(CONSTRAINT_OT_move_down); + WM_operatortype_append(CONSTRAINT_OT_stretchto_reset); + WM_operatortype_append(CONSTRAINT_OT_limitdistance_reset); WM_operatortype_append(CONSTRAINT_OT_childof_set_inverse); WM_operatortype_append(CONSTRAINT_OT_childof_clear_inverse); @@ -141,6 +149,13 @@ void ED_operatortypes_object(void) WM_operatortype_append(LATTICE_OT_select_all_toggle); WM_operatortype_append(LATTICE_OT_make_regular); + + /* macros */ + ot= WM_operatortype_append_macro("OBJECT_OT_duplicate_move", "Add Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER); + if(ot) { + WM_operatortype_macro_define(ot, "OBJECT_OT_duplicate"); + WM_operatortype_macro_define(ot, "TFM_OT_translate"); + } } void ED_keymap_object(wmWindowManager *wm) @@ -149,6 +164,7 @@ void ED_keymap_object(wmWindowManager *wm) /* Note: this keymap works disregarding mode */ WM_keymap_add_item(keymap, "OBJECT_OT_editmode_toggle", TABKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "OBJECT_OT_posemode_toggle", TABKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "OBJECT_OT_center_set", CKEY, KM_PRESS, KM_ALT|KM_SHIFT|KM_CTRL, 0); /* Note: this keymap gets disabled in non-objectmode, */ @@ -178,13 +194,14 @@ void ED_keymap_object(wmWindowManager *wm) WM_keymap_verify_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "OBJECT_OT_primitive_add", AKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_item(keymap, "OBJECT_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "OBJECT_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_duplicate", DKEY, KM_PRESS, KM_ALT, 0)->ptr, "linked", 1); WM_keymap_add_item(keymap, "OBJECT_OT_join", JKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "OBJECT_OT_proxy_make", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); // XXX this should probably be in screen instead... here for testing purposes in the meantime... - Aligorith WM_keymap_verify_item(keymap, "ANIM_OT_insert_keyframe_menu", IKEY, KM_PRESS, 0, 0); - WM_keymap_verify_item(keymap, "ANIM_OT_delete_keyframe_old", IKEY, KM_PRESS, KM_ALT, 0); + WM_keymap_verify_item(keymap, "ANIM_OT_delete_keyframe_v3d", IKEY, KM_PRESS, KM_ALT, 0); WM_keymap_verify_item(keymap, "GROUP_OT_group_create", GKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_verify_item(keymap, "GROUP_OT_objects_remove", GKEY, KM_PRESS, KM_CTRL|KM_ALT, 0); diff --git a/source/blender/editors/physics/ed_fluidsim.c b/source/blender/editors/physics/ed_fluidsim.c index a8862eb17de..907d3f99f77 100644 --- a/source/blender/editors/physics/ed_fluidsim.c +++ b/source/blender/editors/physics/ed_fluidsim.c @@ -100,7 +100,7 @@ /* from header info.c */ static int start_progress_bar(void) {return 0;}; static void end_progress_bar(void) {}; -static void waitcursor() {}; +static void waitcursor(int val) {}; static int progress_bar(float done, char *busy_info) {return 0;} static int pupmenu() {return 0;} /* XXX */ diff --git a/source/blender/editors/physics/ed_pointcache.c b/source/blender/editors/physics/ed_pointcache.c index 4bf6612df67..5d0a6d21fac 100644 --- a/source/blender/editors/physics/ed_pointcache.c +++ b/source/blender/editors/physics/ed_pointcache.c @@ -146,6 +146,113 @@ void PTCACHE_OT_free_bake_all(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } +/**************************** softbody **********************************/ +static int ptcache_bake_softbody_poll(bContext *C) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + SoftBody *sb = ob->soft; + + if(!scene || !ob || ob->id.lib || !sb) + return 0; + + return 1; +} + +static int ptcache_bake_softbody_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + SoftBody *sb = ob->soft; + PTCacheID pid; + PTCacheBaker baker; + + BKE_ptcache_id_from_softbody(&pid, ob, sb); + + baker.scene = scene; + baker.pid = &pid; + baker.bake = RNA_boolean_get(op->ptr, "bake"); + baker.render = 0; + baker.anim_init = 0; + baker.quick_step = 1; + baker.break_test = cache_break_test; + baker.break_data = NULL; + baker.progressbar = (void (*)(void *, int))WM_timecursor; + baker.progresscontext = CTX_wm_window(C); + + BKE_ptcache_make_cache(&baker); + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} +static int ptcache_free_bake_softbody_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + SoftBody *sb = ob->soft; + PTCacheID pid; + + BKE_ptcache_id_from_softbody(&pid, ob, sb); + pid.cache->flag &= ~PTCACHE_BAKED; + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} +void PTCACHE_OT_cache_softbody(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Bake Softbody"; + ot->idname= "PTCACHE_OT_cache_softbody"; + + /* api callbacks */ + ot->exec= ptcache_bake_softbody_exec; + ot->poll= ptcache_bake_softbody_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_boolean(ot->srna, "bake", 0, "Bake", ""); +} +void PTCACHE_OT_free_bake_softbody(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Free SoftBody Bake"; + ot->idname= "PTCACHE_OT_free_bake_softbody"; + + /* api callbacks */ + ot->exec= ptcache_free_bake_softbody_exec; + ot->poll= ptcache_bake_softbody_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} +static int ptcache_bake_from_softbody_cache_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_active_object(C); + SoftBody *sb = ob->soft; + PTCacheID pid; + + BKE_ptcache_id_from_softbody(&pid, ob, sb); + pid.cache->flag |= PTCACHE_BAKED; + + return OPERATOR_FINISHED; +} +void PTCACHE_OT_bake_from_softbody_cache(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Bake From Cache"; + ot->idname= "PTCACHE_OT_bake_from_softbody_cache"; + + /* api callbacks */ + ot->exec= ptcache_bake_from_softbody_cache_exec; + ot->poll= ptcache_bake_softbody_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + /**************************** cloth **********************************/ static int ptcache_bake_cloth_poll(bContext *C) { @@ -371,6 +478,9 @@ void ED_operatortypes_pointcache(void) WM_operatortype_append(PTCACHE_OT_cache_cloth); WM_operatortype_append(PTCACHE_OT_free_bake_cloth); WM_operatortype_append(PTCACHE_OT_bake_from_cloth_cache); + WM_operatortype_append(PTCACHE_OT_cache_softbody); + WM_operatortype_append(PTCACHE_OT_free_bake_softbody); + WM_operatortype_append(PTCACHE_OT_bake_from_softbody_cache); } //void ED_keymap_pointcache(wmWindowManager *wm) diff --git a/source/blender/editors/physics/editparticle.c b/source/blender/editors/physics/editparticle.c index 54578755e27..499162ecdb8 100644 --- a/source/blender/editors/physics/editparticle.c +++ b/source/blender/editors/physics/editparticle.c @@ -271,6 +271,7 @@ typedef struct PEData { float smoothfac; float weightfac; float growfac; + int totrekey; int invert; int tot; @@ -1748,7 +1749,6 @@ static void rekey_particle(PEData *data, int pa_index) ParticleSystem *psys= data->psys; ParticleData *pa= &psys->particles[pa_index]; ParticleEdit *edit= psys->edit; - ParticleEditSettings *pset= PE_settings(data->scene); ParticleKey state; HairKey *key, *new_keys; ParticleEditKey *ekey; @@ -1757,19 +1757,19 @@ static void rekey_particle(PEData *data, int pa_index) pa->flag |= PARS_REKEY; - key= new_keys= MEM_callocN(pset->totrekey * sizeof(HairKey),"Hair re-key keys"); + key= new_keys= MEM_callocN(data->totrekey * sizeof(HairKey),"Hair re-key keys"); /* root and tip stay the same */ VECCOPY(key->co, pa->hair->co); - VECCOPY((key + pset->totrekey - 1)->co, (pa->hair + pa->totkey - 1)->co); + VECCOPY((key + data->totrekey - 1)->co, (pa->hair + pa->totkey - 1)->co); sta= key->time= pa->hair->time; - end= (key + pset->totrekey - 1)->time= (pa->hair + pa->totkey - 1)->time; - dval= (end - sta) / (float)(pset->totrekey - 1); + end= (key + data->totrekey - 1)->time= (pa->hair + pa->totkey - 1)->time; + dval= (end - sta) / (float)(data->totrekey - 1); /* interpolate new keys from old ones */ - for(k=1,key++; k<pset->totrekey-1; k++,key++) { - state.time= (float)k / (float)(pset->totrekey-1); + for(k=1,key++; k<data->totrekey-1; k++,key++) { + state.time= (float)k / (float)(data->totrekey-1); psys_get_particle_on_path(data->scene, data->ob, psys, pa_index, &state, 0); VECCOPY(key->co, state.co); key->time= sta + k * dval; @@ -1780,7 +1780,7 @@ static void rekey_particle(PEData *data, int pa_index) MEM_freeN(pa->hair); pa->hair= new_keys; - pa->totkey=pset->totrekey; + pa->totkey=data->totrekey; if(edit->keys[pa_index]) MEM_freeN(edit->keys[pa_index]); @@ -1798,14 +1798,11 @@ static void rekey_particle(PEData *data, int pa_index) static int rekey_exec(bContext *C, wmOperator *op) { PEData data; - ParticleEditSettings *pset; PE_set_data(C, &data); - pset= PE_settings(data.scene); - pset->totrekey= RNA_int_get(op->ptr, "keys"); - - data.dval= 1.0f / (float)(pset->totrekey-1); + data.dval= 1.0f / (float)(data.totrekey-1); + data.totrekey= RNA_int_get(op->ptr, "keys"); foreach_selected_particle(&data, rekey_particle); diff --git a/source/blender/editors/preview/previewrender.c b/source/blender/editors/preview/previewrender.c index b542b362ae0..c5a741b11ed 100644 --- a/source/blender/editors/preview/previewrender.c +++ b/source/blender/editors/preview/previewrender.c @@ -892,7 +892,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs /* handle results */ if(sp->pr_method==PR_ICON_RENDER) { if(sp->pr_rect) - RE_ResultGet32(re, sp->pr_rect); + RE_ResultGet32(re, (unsigned int *)sp->pr_rect); } else { /* validate owner */ @@ -963,7 +963,7 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, i } /* rect should be allocated, sizex/sizy pixels, 32 bits */ -void ED_preview_iconrender(Scene *scene, ID *id, int *rect, int sizex, int sizey) +void ED_preview_iconrender(Scene *scene, ID *id, unsigned int *rect, int sizex, int sizey) { ShaderPreview *sp; short stop=0, do_update=0; @@ -975,7 +975,7 @@ void ED_preview_iconrender(Scene *scene, ID *id, int *rect, int sizex, int sizey sp->sizex= sizex; sp->sizey= sizey; sp->pr_method= PR_ICON_RENDER; - sp->pr_rect= rect; + sp->pr_rect= (int *)rect; /* shouldnt pr_rect be unsigned int also? - Campbell */ sp->id = id; shader_preview_startjob(sp, &stop, &do_update); diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index cdb4322d7f2..79ba11a5c55 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -330,7 +330,7 @@ void ED_region_do_draw(bContext *C, ARegion *ar) glClear(GL_COLOR_BUFFER_BIT); UI_ThemeColor(TH_TEXT); - BLF_draw_default(20, 6, 0.0f, ar->headerstr); + BLF_draw_default(20, 8, 0.0f, ar->headerstr); } else if(at->draw) { at->draw(C, ar); @@ -910,13 +910,6 @@ void area_copy_data(ScrArea *sa1, ScrArea *sa2, int swap_space) ARegion *newar= BKE_area_region_copy(st, ar); BLI_addtail(&sa1->regionbase, newar); } - -#ifndef DISABLE_PYTHON - /* scripts */ - BPY_free_scriptlink(&sa1->scriptlink); - sa1->scriptlink= sa2->scriptlink; - BPY_copy_scriptlink(&sa1->scriptlink); /* copies internal pointers */ -#endif } /* *********** Space switching code *********** */ @@ -1063,7 +1056,7 @@ static char *windowtype_pup(void) "|Video Sequence Editor %x8" //143 "|Timeline %x15" //163 - "|Audio Window %x11" //163 + // "|Audio Window %x11" //163 "|Text Editor %x9" //179 "|%l" //192 @@ -1080,7 +1073,7 @@ static char *windowtype_pup(void) "|%l" //293 - "|Scripts Window %x14"//313 + // "|Scripts Window %x14"//313 "|Console %x18" ); } @@ -1092,7 +1085,7 @@ static void spacefunc(struct bContext *C, void *arg1, void *arg2) } /* returns offset for next button in header */ -int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) +int ED_area_header_switchbutton(const bContext *C, uiBlock *block, int yco) { ScrArea *sa= CTX_wm_area(C); uiBut *but; @@ -1105,9 +1098,18 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) "Click for menu of available types."); uiButSetFunc(but, spacefunc, NULL, NULL); - xco += XIC + 14; + return xco + XIC + 14; +} + +int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) +{ + ScrArea *sa= CTX_wm_area(C); + int xco= 8; + xco= ED_area_header_switchbutton(C, block, yco); + uiBlockSetEmboss(block, UI_EMBOSSN); + if (sa->flag & HEADER_NO_PULLDOWN) { uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, 0, ICON_DISCLOSURE_TRI_RIGHT, @@ -1122,16 +1124,15 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) &(sa->flag), 0, 0, 0, 0, "Hide pulldown menus"); } - xco+=XIC; - + uiBlockSetEmboss(block, UI_EMBOSS); - return xco; + return xco + XIC; } /************************ standard UI regions ************************/ -void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *context) +void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *context, int contextnr) { ScrArea *sa= CTX_wm_area(C); uiStyle *style= U.uistyles.first; @@ -1141,7 +1142,10 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex View2D *v2d= &ar->v2d; View2DScrollers *scrollers; float col[3]; - int xco, yco, x, y, miny=0, w, em, header, triangle, open; + int xco, yco, x, y, miny=0, w, em, header, triangle, open, newcontext= 0; + + if(contextnr >= 0) + newcontext= UI_view2d_tab_set(v2d, contextnr); if(vertical) { w= v2d->cur.xmax - v2d->cur.xmin; @@ -1241,22 +1245,27 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex /* before setting the view */ if(vertical) { - v2d->keepofs |= V2D_LOCKOFS_X; - v2d->keepofs &= ~V2D_LOCKOFS_Y; + v2d->keepofs |= V2D_LOCKOFS_X|V2D_KEEPOFS_Y; + v2d->keepofs &= ~(V2D_LOCKOFS_Y|V2D_KEEPOFS_X); // don't jump back when panels close or hide - y= MAX2(-y, -v2d->cur.ymin); + if(!newcontext) + y= MAX2(-y, -v2d->cur.ymin); + else + y= -y; } else { - v2d->keepofs &= ~V2D_LOCKOFS_X; - v2d->keepofs |= V2D_LOCKOFS_Y; - + v2d->keepofs |= V2D_LOCKOFS_Y|V2D_KEEPOFS_X; + v2d->keepofs &= ~(V2D_LOCKOFS_X|V2D_KEEPOFS_Y); + // don't jump back when panels close or hide - x= MAX2(x, v2d->cur.xmax); + if(!newcontext) + x= MAX2(x, v2d->cur.xmax); y= -y; } - UI_view2d_totRect_set(v2d, x, y); + // +V2D_SCROLL_HEIGHT is workaround to set the actual height + UI_view2d_totRect_set(v2d, x+V2D_SCROLL_WIDTH, y+V2D_SCROLL_HEIGHT); /* set the view */ UI_view2d_view_ortho(C, v2d); @@ -1280,6 +1289,8 @@ void ED_region_panels_init(wmWindowManager *wm, ARegion *ar) // XXX quick hacks for files saved with 2.5 already (i.e. the builtin defaults file) // scrollbars for button regions ar->v2d.scroll |= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM); + ar->v2d.keepzoom |= V2D_KEEPZOOM; + // correctly initialised User-Prefs? if(!(ar->v2d.align & V2D_ALIGN_NO_POS_Y)) ar->v2d.flag &= ~V2D_IS_INITIALISED; diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c index 19750833b4d..3842dd3d62f 100644 --- a/source/blender/editors/screen/screen_context.c +++ b/source/blender/editors/screen/screen_context.c @@ -50,7 +50,8 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult "scene", "selected_objects", "selected_bases", "selected_editable_objects", "selected_editable_bases" "active_base", "active_object", "edit_object", - "sculpt_object", "vpaint_object", "wpaint_object", NULL}; + "sculpt_object", "vertex_paint_object", "weight_paint_object", + "texture_paint_object", "brush", "particle_edit_object", NULL}; CTX_data_dir_set(result, dir); return 1; @@ -93,7 +94,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult } else if(CTX_data_equals(member, "active_base")) { if(scene->basact) - CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, &scene->basact); + CTX_data_pointer_set(result, &scene->id, &RNA_UnknownType, scene->basact); return 1; } @@ -116,19 +117,31 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult return 1; } - else if(CTX_data_equals(member, "vpaint_object")) { + else if(CTX_data_equals(member, "vertex_paint_object")) { if(G.f & G_VERTEXPAINT && scene->basact) CTX_data_id_pointer_set(result, &scene->basact->object->id); return 1; } - else if(CTX_data_equals(member, "wpaint_object")) { + else if(CTX_data_equals(member, "weight_paint_object")) { if(G.f & G_WEIGHTPAINT && scene->basact) CTX_data_id_pointer_set(result, &scene->basact->object->id); return 1; } - + else if(CTX_data_equals(member, "texture_paint_object")) { + if(G.f & G_TEXTUREPAINT && scene->basact) + CTX_data_id_pointer_set(result, &scene->basact->object->id); + + return 1; + } + else if(CTX_data_equals(member, "particle_edit_object")) { + if(G.f & G_PARTICLEEDIT && scene->basact) + CTX_data_id_pointer_set(result, &scene->basact->object->id); + + return 1; + } + return 0; } diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index e7a61514010..926768c98ab 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -54,6 +54,7 @@ #include "ED_screen.h" #include "ED_screen_types.h" +/* XXX actually should be not here... solve later */ #include "wm_subwindow.h" #include "screen_intern.h" /* own module include */ @@ -404,7 +405,7 @@ ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac /* empty screen, with 1 dummy area without spacedata */ /* uses window size */ -bScreen *screen_add(wmWindow *win, Scene *scene, char *name) +bScreen *ED_screen_add(wmWindow *win, Scene *scene, char *name) { bScreen *sc; ScrVert *sv1, *sv2, *sv3, *sv4; @@ -465,7 +466,6 @@ static void screen_copy(bScreen *to, bScreen *from) sa->spacedata.first= sa->spacedata.last= NULL; sa->regionbase.first= sa->regionbase.last= NULL; sa->actionzones.first= sa->actionzones.last= NULL; - sa->scriptlink.totscript= 0; area_copy_data(sa, saf, 0); } @@ -603,21 +603,6 @@ void select_connected_scredge(bScreen *sc, ScrEdge *edge) } } -/* helper call for below, correct buttons view */ -static void screen_test_scale_region(ListBase *regionbase, float facx, float facy) -{ - ARegion *ar; - - for(ar= regionbase->first; ar; ar= ar->next) { - if(ar->regiontype==RGN_TYPE_WINDOW) { - ar->v2d.cur.xmin *= facx; - ar->v2d.cur.xmax *= facx; - ar->v2d.cur.ymin *= facy; - ar->v2d.cur.ymax *= facy; - } - } -} - /* test if screen vertices should be scaled */ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey) { @@ -668,19 +653,6 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey) CLAMP(sv->vec.y, 0, winsizey); } - - /* keep buttons view2d same size */ - for(sa= sc->areabase.first; sa; sa= sa->next) { - SpaceLink *sl; - - if(sa->spacetype==SPACE_BUTS) - screen_test_scale_region(&sa->regionbase, facx, facy); - - for(sl= sa->spacedata.first; sl; sl= sl->next) - if(sl->spacetype==SPACE_BUTS) - screen_test_scale_region(&sl->regionbase, facx, facy); - } - } /* test for collapsed areas. This could happen in some blender version... */ @@ -948,7 +920,7 @@ bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc) if(sc->full != SCREENNORMAL) return NULL; /* XXX handle this case! */ /* make new empty screen: */ - newsc= screen_add(win, sc->scene, sc->id.name+2); + newsc= ED_screen_add(win, sc->scene, sc->id.name+2); /* copy all data */ screen_copy(newsc, sc); /* set in window */ @@ -1369,8 +1341,6 @@ void ED_screen_set_scene(bContext *C, Scene *scene) ED_update_for_newframe(C, 1); -// set_radglobal(); - /* complete redraw */ WM_event_add_notifier(C, NC_WINDOW, NULL); @@ -1435,7 +1405,7 @@ void ed_screen_fullarea(bContext *C, ScrArea *sa) oldscreen->full = SCREENFULL; - sc= screen_add(CTX_wm_window(C), CTX_data_scene(C), "temp"); + sc= ED_screen_add(CTX_wm_window(C), CTX_data_scene(C), "temp"); sc->full = SCREENFULL; // XXX /* timer */ @@ -1507,7 +1477,7 @@ void ED_screen_animation_timer(bContext *C, int redraws, int enable) screen->animtimer= WM_event_add_window_timer(win, TIMER0, (1.0/FPS)); sad->ar= CTX_wm_region(C); sad->redraws= redraws; - sad->reverse= (enable < 0); + sad->flag= (enable < 0) ? ANIMPLAY_FLAG_REVERSE : 0; screen->animtimer->customdata= sad; } diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h index a0804f3e633..2b3a816f8de 100644 --- a/source/blender/editors/screen/screen_intern.h +++ b/source/blender/editors/screen/screen_intern.h @@ -36,7 +36,6 @@ struct Scene; void area_copy_data (ScrArea *sa1, ScrArea *sa2, int swap_space); /* screen_edit.c */ -bScreen *screen_add(struct wmWindow *win, struct Scene *scene, char *name); ScrEdge *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2); ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac); int screen_area_join(bContext *C, bScreen* scr, ScrArea *sa1, ScrArea *sa2); diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index b6204b25b6d..57fd96c8b39 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -31,6 +31,7 @@ #include "BLI_arithb.h" #include "BLI_blenlib.h" #include "BLI_editVert.h" +#include "BLI_dlrbTree.h" #include "DNA_armature_types.h" #include "DNA_image_types.h" @@ -39,6 +40,7 @@ #include "DNA_mesh_types.h" #include "DNA_curve_types.h" #include "DNA_scene_types.h" +#include "DNA_meta_types.h" #include "BKE_blender.h" #include "BKE_colortools.h" @@ -64,6 +66,7 @@ #include "ED_mesh.h" #include "ED_object.h" #include "ED_screen_types.h" +#include "ED_keyframes_draw.h" #include "RE_pipeline.h" #include "IMB_imbuf.h" @@ -75,6 +78,8 @@ #include "UI_interface.h" #include "UI_resources.h" +#include "wm_window.h" + #include "screen_intern.h" /* own module include */ #define KM_MODAL_CANCEL 1 @@ -165,11 +170,11 @@ int ED_operator_buttons_active(bContext *C) int ED_operator_node_active(bContext *C) { - if(ed_spacetype_test(C, SPACE_NODE)) { - SpaceNode *snode= (SpaceNode *)CTX_wm_space_data(C); - if(snode->edittree) - return 1; - } + SpaceNode *snode= CTX_wm_space_node(C); + + if(snode && snode->edittree) + return 1; + return 0; } @@ -300,6 +305,14 @@ int ED_operator_editlattice(bContext *C) return 0; } +int ED_operator_editmball(bContext *C) +{ + Object *obedit= CTX_data_edit_object(C); + if(obedit && obedit->type==OB_MBALL) + return NULL != ((MetaBall *)obedit->data)->editelems; + return 0; +} + /* *************************** action zone operator ************************** */ /* operator state vars used: @@ -493,7 +506,7 @@ static int actionzone_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -void SCREEN_OT_actionzone(wmOperatorType *ot) +static void SCREEN_OT_actionzone(wmOperatorType *ot) { /* identifiers */ ot->name= "Handle area action zones"; @@ -659,7 +672,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event) newwin= WM_window_open(C, &rect); /* allocs new screen and adds to newly created window, using window size */ - newsc= screen_add(newwin, CTX_data_scene(C), sc->id.name+2); + newsc= ED_screen_add(newwin, CTX_data_scene(C), sc->id.name+2); newwin->screen= newsc; /* copy area to new screen */ @@ -912,7 +925,7 @@ static int area_move_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -void SCREEN_OT_area_move(wmOperatorType *ot) +static void SCREEN_OT_area_move(wmOperatorType *ot) { /* identifiers */ ot->name= "Move area edges"; @@ -1228,7 +1241,7 @@ static EnumPropertyItem prop_direction_items[] = { {'v', "VERTICAL", 0, "Vertical", ""}, {0, NULL, 0, NULL, NULL}}; -void SCREEN_OT_area_split(wmOperatorType *ot) +static void SCREEN_OT_area_split(wmOperatorType *ot) { ot->name = "Split area"; ot->idname = "SCREEN_OT_area_split"; @@ -1362,7 +1375,6 @@ static void SCREEN_OT_region_scale(wmOperatorType *ot) /* ************** frame change operator ***************************** */ - /* function to be called outside UI context, or for redo */ static int frame_offset_exec(bContext *C, wmOperator *op) { @@ -1377,7 +1389,7 @@ static int frame_offset_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_frame_offset(wmOperatorType *ot) +static void SCREEN_OT_frame_offset(wmOperatorType *ot) { ot->name = "Frame Offset"; ot->idname = "SCREEN_OT_frame_offset"; @@ -1391,6 +1403,124 @@ void SCREEN_OT_frame_offset(wmOperatorType *ot) RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX); } + +/* function to be called outside UI context, or for redo */ +static int frame_jump_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + + if (RNA_boolean_get(op->ptr, "end")) + CFRA= PEFRA; + else + CFRA= PSFRA; + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} + +static void SCREEN_OT_frame_jump(wmOperatorType *ot) +{ + ot->name = "Jump to Endpoint"; + ot->idname = "SCREEN_OT_frame_jump"; + + ot->exec= frame_jump_exec; + + ot->poll= ED_operator_screenactive; + ot->flag= 0; + + /* rna */ + RNA_def_boolean(ot->srna, "end", 0, "Last Frame", "Jump to the last frame of the frame range."); +} + + +/* ************** jump to keyframe operator ***************************** */ + +/* helper function - find actkeycolumn that occurs on cframe, or the nearest one if not found */ +// TODO: make this an API func? +static ActKeyColumn *cfra_find_nearest_next_ak (ActKeyColumn *ak, float cframe, short next) +{ + ActKeyColumn *akn= NULL; + + /* sanity checks */ + if (ak == NULL) + return NULL; + + /* check if this is a match, or whether it is in some subtree */ + if (cframe < ak->cfra) + akn= cfra_find_nearest_next_ak(ak->left, cframe, next); + else if (cframe > ak->cfra) + akn= cfra_find_nearest_next_ak(ak->right, cframe, next); + + /* if no match found (or found match), just use the current one */ + if (akn == NULL) + return ak; + else + return akn; +} + +/* function to be called outside UI context, or for redo */ +static int keyframe_jump_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + DLRBT_Tree keys; + ActKeyColumn *ak; + short next= RNA_boolean_get(op->ptr, "next"); + + /* sanity checks */ + if (scene == NULL) + return OPERATOR_CANCELLED; + + /* init binarytree-list for getting keyframes */ + BLI_dlrbTree_init(&keys); + + /* populate tree with keyframe nodes */ + if (scene && scene->adt) + scene_to_keylist(NULL, scene, &keys, NULL); + if (ob && ob->adt) + ob_to_keylist(NULL, ob, &keys, NULL); + + /* build linked-list for searching */ + BLI_dlrbTree_linkedlist_sync(&keys); + + /* find nearest keyframe in the right direction */ + ak= cfra_find_nearest_next_ak(keys.root, (float)scene->r.cfra, next); + + /* set the new frame (if keyframe found) */ + if (ak) { + if (next && ak->next) + scene->r.cfra= (int)ak->next->cfra; + else if (!next && ak->prev) + scene->r.cfra= (int)ak->prev->cfra; + else { + printf("ERROR: no suitable keyframe found. Using %f as new frame \n", ak->cfra); + scene->r.cfra= (int)ak->cfra; // XXX + } + } + + /* free temp stuff */ + BLI_dlrbTree_free(&keys); + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, CTX_data_scene(C)); + + return OPERATOR_FINISHED; +} + +static void SCREEN_OT_keyframe_jump(wmOperatorType *ot) +{ + ot->name = "Jump to Keyframe"; + ot->idname = "SCREEN_OT_keyframe_jump"; + + ot->exec= keyframe_jump_exec; + + ot->poll= ED_operator_screenactive; + ot->flag= 0; + + /* rna */ + RNA_def_boolean(ot->srna, "next", 1, "Next Keyframe", ""); +} + /* ************** switch screen operator ***************************** */ @@ -1433,7 +1563,7 @@ static int screen_set_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void SCREEN_OT_screen_set(wmOperatorType *ot) +static void SCREEN_OT_screen_set(wmOperatorType *ot) { ot->name = "Set Screen"; ot->idname = "SCREEN_OT_screen_set"; @@ -1456,7 +1586,7 @@ static int screen_full_area_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_screen_full_area(wmOperatorType *ot) +static void SCREEN_OT_screen_full_area(wmOperatorType *ot) { ot->name = "Toggle Make Area Fullscreen"; ot->idname = "SCREEN_OT_screen_full_area"; @@ -1728,7 +1858,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event) } /* Operator for joining two areas (space types) */ -void SCREEN_OT_area_join(wmOperatorType *ot) +static void SCREEN_OT_area_join(wmOperatorType *ot) { /* identifiers */ ot->name= "Join area"; @@ -1761,7 +1891,7 @@ static int repeat_last_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void SCREEN_OT_repeat_last(wmOperatorType *ot) +static void SCREEN_OT_repeat_last(wmOperatorType *ot) { /* identifiers */ ot->name= "Repeat Last"; @@ -1813,7 +1943,7 @@ static int repeat_history_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_repeat_history(wmOperatorType *ot) +static void SCREEN_OT_repeat_history(wmOperatorType *ot) { /* identifiers */ ot->name= "Repeat History"; @@ -1846,7 +1976,7 @@ static int redo_last_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_CANCELLED; } -void SCREEN_OT_redo_last(wmOperatorType *ot) +static void SCREEN_OT_redo_last(wmOperatorType *ot) { /* identifiers */ ot->name= "Redo Last"; @@ -1889,7 +2019,7 @@ static int region_split_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_region_split(wmOperatorType *ot) +static void SCREEN_OT_region_split(wmOperatorType *ot) { /* identifiers */ ot->name= "Split Region"; @@ -1978,7 +2108,7 @@ static int region_foursplit_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCREEN_OT_region_foursplit(wmOperatorType *ot) +static void SCREEN_OT_region_foursplit(wmOperatorType *ot) { /* identifiers */ ot->name= "Split Region in 4 Parts"; @@ -2016,7 +2146,7 @@ static int region_flip_exec(bContext *C, wmOperator *op) } -void SCREEN_OT_region_flip(wmOperatorType *ot) +static void SCREEN_OT_region_flip(wmOperatorType *ot) { /* identifiers */ ot->name= "Flip Region"; @@ -2090,39 +2220,50 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event) if(scene->audio.flag & AUDIO_SYNC) { int step = floor(wt->duration * FPS); - if (sad->reverse) // XXX does this option work with audio? + if (sad->flag & ANIMPLAY_FLAG_REVERSE) // XXX does this option work with audio? scene->r.cfra -= step; else scene->r.cfra += step; wt->duration -= ((float)step)/FPS; } else { - if (sad->reverse) + if (sad->flag & ANIMPLAY_FLAG_REVERSE) scene->r.cfra--; else scene->r.cfra++; } - if (sad->reverse) { - /* jump back to end */ + /* reset 'jumped' flag before checking if we need to jump... */ + sad->flag &= ~ANIMPLAY_FLAG_JUMPED; + + if (sad->flag & ANIMPLAY_FLAG_REVERSE) { + /* jump back to end? */ if (scene->r.psfra) { - if(scene->r.cfra < scene->r.psfra) + if (scene->r.cfra < scene->r.psfra) { scene->r.cfra= scene->r.pefra; + sad->flag |= ANIMPLAY_FLAG_JUMPED; + } } else { - if(scene->r.cfra < scene->r.sfra) + if (scene->r.cfra < scene->r.sfra) { scene->r.cfra= scene->r.efra; + sad->flag |= ANIMPLAY_FLAG_JUMPED; + } } } else { - /* jump back to start */ + /* jump back to start? */ if (scene->r.psfra) { - if(scene->r.cfra > scene->r.pefra) + if (scene->r.cfra > scene->r.pefra) { scene->r.cfra= scene->r.psfra; + sad->flag |= ANIMPLAY_FLAG_JUMPED; + } } else { - if(scene->r.cfra > scene->r.efra) + if (scene->r.cfra > scene->r.efra) { scene->r.cfra= scene->r.sfra; + sad->flag |= ANIMPLAY_FLAG_JUMPED; + } } } @@ -2162,6 +2303,10 @@ static void SCREEN_OT_animation_step(wmOperatorType *ot) /* ****************** anim player, starts or ends timer ***************** */ +/* helper for screen_animation_play() - only to be used for TimeLine */ +// NOTE: defined in time_header.c for now... +extern ARegion *time_top_left_3dwindow(bScreen *screen); + /* toggle operator */ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event) { @@ -2171,22 +2316,39 @@ static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event) ED_screen_animation_timer(C, 0, 0); } else { + ScrArea *sa= CTX_wm_area(C); int mode= (RNA_boolean_get(op->ptr, "reverse")) ? -1 : 1; - ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, mode); - - if(screen->animtimer) { - wmTimer *wt= screen->animtimer; - ScreenAnimData *sad= wt->customdata; + /* timeline gets special treatment since it has it's own menu for determining redraws */ + if ((sa) && (sa->spacetype == SPACE_TIME)) { + SpaceTime *stime= (SpaceTime *)sa->spacedata.first; + + ED_screen_animation_timer(C, stime->redraws, mode); - sad->ar= CTX_wm_region(C); + /* update region if TIME_REGION was set, to leftmost 3d window */ + if(screen->animtimer && (stime->redraws & TIME_REGION)) { + wmTimer *wt= screen->animtimer; + ScreenAnimData *sad= wt->customdata; + + sad->ar= time_top_left_3dwindow(screen); + } + } + else { + ED_screen_animation_timer(C, TIME_REGION|TIME_ALL_3D_WIN, mode); + + if(screen->animtimer) { + wmTimer *wt= screen->animtimer; + ScreenAnimData *sad= wt->customdata; + + sad->ar= CTX_wm_region(C); + } } } return OPERATOR_FINISHED; } -void SCREEN_OT_animation_play(wmOperatorType *ot) +static void SCREEN_OT_animation_play(wmOperatorType *ot) { /* identifiers */ ot->name= "Animation player"; @@ -2235,7 +2397,7 @@ static int border_select_do(bContext *C, wmOperator *op) return 1; } -void SCREEN_OT_border_select(wmOperatorType *ot) +static void SCREEN_OT_border_select(wmOperatorType *ot) { /* identifiers */ ot->name= "Border select"; @@ -2362,13 +2524,36 @@ static ScrArea *find_empty_image_area(bContext *C) } #endif // XXX not used -static void screen_set_image_output(bContext *C) +/* new window uses x,y to set position */ +static void screen_set_image_output(bContext *C, int mx, int my) { Scene *scene= CTX_data_scene(C); ScrArea *sa; SpaceImage *sima; - if(scene->r.displaymode==R_OUTPUT_SCREEN) { + if(scene->r.displaymode==R_OUTPUT_WINDOW) { + rcti rect; + int sizex, sizey; + + sizex= 10 + (scene->r.xsch*scene->r.size)/100; + sizey= 40 + (scene->r.ysch*scene->r.size)/100; + + /* arbitrary... miniature image window views don't make much sense */ + if(sizex < 320) sizex= 320; + if(sizey < 256) sizey= 256; + + /* XXX some magic to calculate postition */ + rect.xmin= mx + CTX_wm_window(C)->posx - sizex/2; + rect.ymin= my + CTX_wm_window(C)->posy - sizey/2; + rect.xmax= rect.xmin + sizex; + rect.ymax= rect.ymin + sizey; + + /* changes context! */ + WM_window_open_temp(C, &rect, WM_WINDOW_RENDER); + + sa= CTX_wm_area(C); + } + else if(scene->r.displaymode==R_OUTPUT_SCREEN) { /* this function returns with changed context */ ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_IMAGE); sa= CTX_wm_area(C); @@ -2428,7 +2613,7 @@ static int screen_render_exec(bContext *C, wmOperator *op) } RE_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break); - if(RNA_boolean_get(op->ptr, "anim")) + if(RNA_boolean_get(op->ptr, "animation")) RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->frame_step); else RE_BlenderFrame(re, scene, scene->r.cfra); @@ -2701,13 +2886,13 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) // store spare /* ensure at least 1 area shows result */ - screen_set_image_output(C); + screen_set_image_output(C, event->x, event->y); /* job custom data */ rj= MEM_callocN(sizeof(RenderJob), "render job"); rj->scene= scene; rj->win= CTX_wm_window(C); - rj->anim= RNA_boolean_get(op->ptr, "anim"); + rj->anim= RNA_boolean_get(op->ptr, "animation"); rj->iuser.scene= scene; rj->iuser.ok= 1; @@ -2749,7 +2934,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) /* contextual render, using current scene, view3d? */ -void SCREEN_OT_render(wmOperatorType *ot) +static void SCREEN_OT_render(wmOperatorType *ot) { /* identifiers */ ot->name= "Render"; @@ -2763,7 +2948,7 @@ void SCREEN_OT_render(wmOperatorType *ot) ot->poll= ED_operator_screenactive; RNA_def_int(ot->srna, "layers", 0, 0, INT_MAX, "Layers", "", 0, INT_MAX); - RNA_def_boolean(ot->srna, "anim", 0, "Animation", ""); + RNA_def_boolean(ot->srna, "animation", 0, "Animation", ""); } /* *********************** cancel render viewer *************** */ @@ -2773,7 +2958,12 @@ static int render_view_cancel_exec(bContext *C, wmOperator *unused) ScrArea *sa= CTX_wm_area(C); SpaceImage *sima= sa->spacedata.first; - if(sima->flag & SI_PREVSPACE) { + /* test if we have a temp screen in front */ + if(CTX_wm_window(C)->screen->full==SCREENTEMP) { + wm_window_lower(CTX_wm_window(C)); + } + /* determine if render already shows */ + else if(sima->flag & SI_PREVSPACE) { sima->flag &= ~SI_PREVSPACE; if(sima->flag & SI_FULLWINDOW) { @@ -2791,7 +2981,7 @@ static int render_view_cancel_exec(bContext *C, wmOperator *unused) return OPERATOR_FINISHED; } -void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) +static void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) { /* identifiers */ ot->name= "Cancel Render View"; @@ -2804,12 +2994,16 @@ void SCREEN_OT_render_view_cancel(struct wmOperatorType *ot) /* *********************** show render viewer *************** */ -static int render_view_show_exec(bContext *C, wmOperator *unused) +static int render_view_show_invoke(bContext *C, wmOperator *unused, wmEvent *event) { ScrArea *sa= find_area_showing_r_result(C); - + + /* test if we have a temp screen in front */ + if(CTX_wm_window(C)->screen->full==SCREENTEMP) { + wm_window_lower(CTX_wm_window(C)); + } /* determine if render already shows */ - if(sa) { + else if(sa) { SpaceImage *sima= sa->spacedata.first; if(sima->flag & SI_PREVSPACE) { @@ -2826,20 +3020,58 @@ static int render_view_show_exec(bContext *C, wmOperator *unused) } } else { - screen_set_image_output(C); + screen_set_image_output(C, event->x, event->y); } return OPERATOR_FINISHED; } -void SCREEN_OT_render_view_show(struct wmOperatorType *ot) +static void SCREEN_OT_render_view_show(struct wmOperatorType *ot) { /* identifiers */ ot->name= "Show/Hide Render View"; ot->idname= "SCREEN_OT_render_view_show"; /* api callbacks */ - ot->exec= render_view_show_exec; + ot->invoke= render_view_show_invoke; + ot->poll= ED_operator_screenactive; +} + +/* *********** show user pref window ****** */ + +static int userpref_show_invoke(bContext *C, wmOperator *unused, wmEvent *event) +{ + ScrArea *sa; + rcti rect; + int sizex, sizey; + + sizex= 800; + sizey= 480; + + /* some magic to calculate postition */ + rect.xmin= event->x + CTX_wm_window(C)->posx - sizex/2; + rect.ymin= event->y + CTX_wm_window(C)->posy - sizey/2; + rect.xmax= rect.xmin + sizex; + rect.ymax= rect.ymin + sizey; + + /* changes context! */ + WM_window_open_temp(C, &rect, WM_WINDOW_USERPREFS); + + sa= CTX_wm_area(C); + + + return OPERATOR_FINISHED; +} + + +static void SCREEN_OT_userpref_show(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Show/Hide User Preferences"; + ot->idname= "SCREEN_OT_userpref_show"; + + /* api callbacks */ + ot->invoke= userpref_show_invoke; ot->poll= ED_operator_screenactive; } @@ -2870,9 +3102,13 @@ void ED_operatortypes_screen(void) WM_operatortype_append(SCREEN_OT_screen_full_area); WM_operatortype_append(SCREEN_OT_screenshot); WM_operatortype_append(SCREEN_OT_screencast); + WM_operatortype_append(SCREEN_OT_userpref_show); /*frame changes*/ WM_operatortype_append(SCREEN_OT_frame_offset); + WM_operatortype_append(SCREEN_OT_frame_jump); + WM_operatortype_append(SCREEN_OT_keyframe_jump); + WM_operatortype_append(SCREEN_OT_animation_step); WM_operatortype_append(SCREEN_OT_animation_play); @@ -2940,7 +3176,6 @@ void ED_keymap_screen(wmWindowManager *wm) RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_screen_set", LEFTARROWKEY, KM_PRESS, KM_CTRL, 0)->ptr, "delta", -1); WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", UPARROWKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", DOWNARROWKEY, KM_PRESS, KM_CTRL, 0); - WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", SPACEKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SCREEN_OT_screenshot", F3KEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SCREEN_OT_screencast", F3KEY, KM_PRESS, KM_ALT, 0); @@ -2968,9 +3203,13 @@ void ED_keymap_screen(wmWindowManager *wm) /* render */ WM_keymap_add_item(keymap, "SCREEN_OT_render", F12KEY, KM_PRESS, 0, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_render", F12KEY, KM_PRESS, KM_CTRL, 0)->ptr, "animation", 1); WM_keymap_add_item(keymap, "SCREEN_OT_render_view_cancel", ESCKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SCREEN_OT_render_view_show", F11KEY, KM_PRESS, 0, 0); + /* user prefs */ + WM_keymap_add_item(keymap, "SCREEN_OT_userpref_show", UKEY, KM_PRESS, KM_ALT, 0); + /* Anim Playback ------------------------------------------------ */ keymap= WM_keymap_listbase(wm, "Frames", 0, 0); @@ -2980,6 +3219,12 @@ void ED_keymap_screen(wmWindowManager *wm) RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -1); RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", 1); + WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1); + + WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", PAGEUPKEY, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", PAGEDOWNKEY, KM_PRESS, KM_CTRL, 0)->ptr, "next", 0); + /* play (forward and backwards) */ WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "reverse", 1); diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c index 81da74217ec..2ae2712d02d 100644 --- a/source/blender/editors/screen/screendump.c +++ b/source/blender/editors/screen/screendump.c @@ -173,7 +173,7 @@ void SCREEN_OT_screenshot(wmOperatorType *ot) ot->flag= 0; - RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE); RNA_def_boolean(ot->srna, "full", 1, "Full Screen", ""); } @@ -242,7 +242,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update) if(sj->dumprect) { if(mh) { - mh->append_movie(&rd, cfra, sj->dumprect, sj->dumpsx, sj->dumpsy); + mh->append_movie(&rd, cfra, (int *)sj->dumprect, sj->dumpsx, sj->dumpsy); printf("Append frame %d\n", cfra); } else { diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 8d401d4f387..1b33f340d5e 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -4387,10 +4387,9 @@ static int image_paint_poll(bContext *C) return 1; } else { - ScrArea *sa= CTX_wm_area(C); - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); - if(sa && sa->spacetype==SPACE_IMAGE) { + if(sima) { ARegion *ar= CTX_wm_region(C); if((sima->flag & SI_DRAWTOOL) && ar->regiontype==RGN_TYPE_WINDOW) @@ -4507,7 +4506,7 @@ static int paint_init(bContext *C, wmOperator *op) view3d_set_viewcontext(C, &pop->vc); } else { - pop->s.sima= (SpaceImage*)CTX_wm_space_data(C); + pop->s.sima= CTX_wm_space_image(C); pop->s.v2d= &CTX_wm_region(C)->v2d; } @@ -4815,7 +4814,7 @@ static int get_imapaint_zoom(bContext *C, float *zoomx, float *zoomy) RegionView3D *rv3d= CTX_wm_region_view3d(C); if(!rv3d) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); ED_space_image_zoom(sima, ar, zoomx, zoomy); diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index c5aea5ae077..812c41f430e 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -1088,7 +1088,7 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */ Mesh *me; me= get_mesh(ob); - if(ob->id.lib || me==NULL) return OPERATOR_CANCELLED; + if(ob->id.lib || me==NULL) return OPERATOR_PASS_THROUGH; if(me && me->totface>=MAXINDEX) { error("Maximum number of faces: %d", MAXINDEX-1); @@ -1465,7 +1465,7 @@ static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event) // XXX if(multires_level1_test()) return; me= get_mesh(ob); - if(me==NULL || me->totface==0) return OPERATOR_CANCELLED; + if(me==NULL || me->totface==0) return OPERATOR_PASS_THROUGH; /* if nothing was added yet, we make dverts and a vertex deform group */ if (!me->dvert) @@ -1585,7 +1585,7 @@ static int set_vpaint(bContext *C, wmOperator *op) /* toggle */ if(me==NULL || object_data_is_libdata(ob)) { G.f &= ~G_VERTEXPAINT; - return OPERATOR_FINISHED; + return OPERATOR_PASS_THROUGH; } if(me && me->totface>=MAXINDEX) { @@ -1821,7 +1821,7 @@ static int vpaint_invoke(bContext *C, wmOperator *op, wmEvent *event) /* context checks could be a poll() */ me= get_mesh(ob); - if(me==NULL || me->totface==0) return OPERATOR_CANCELLED; + if(me==NULL || me->totface==0) return OPERATOR_PASS_THROUGH; if(me->mcol==NULL) make_vertexcol(CTX_data_scene(C), 0); if(me->mcol==NULL) return OPERATOR_CANCELLED; diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 2fd5b9bbd93..6e86748adae 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -52,6 +52,7 @@ #include "DNA_camera_types.h" #include "DNA_curve_types.h" #include "DNA_object_types.h" +#include "DNA_particle_types.h" #include "DNA_screen_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" @@ -59,6 +60,7 @@ #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" +#include "DNA_meta_types.h" #include "DNA_userdef_types.h" #include "DNA_gpencil_types.h" #include "DNA_windowmanager_types.h" @@ -519,6 +521,22 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar) strcpy(name, "Materials"); } break; + case ANIMTYPE_FILLPARTD: /* object particles (dopesheet) expand widget */ + { + Object *ob = (Object *)ale->data; + + group = 4; + indent = 1; + special = ICON_PARTICLE_DATA; + + if (FILTER_PART_OBJC(ob)) + expand = ICON_TRIA_DOWN; + else + expand = ICON_TRIA_RIGHT; + + strcpy(name, "Particles"); + } + break; case ANIMTYPE_DSMAT: /* single material (dopesheet) expand widget */ @@ -619,6 +637,39 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar) strcpy(name, wo->id.name+2); } break; + case ANIMTYPE_DSPART: /* particle (dopesheet) expand widget */ + { + ParticleSettings *part= (ParticleSettings*)ale->data; + + group = 0; + indent = 0; + special = ICON_PARTICLE_DATA; + offset = 21; + + if (FILTER_PART_OBJD(part)) + expand = ICON_TRIA_DOWN; + else + expand = ICON_TRIA_RIGHT; + + strcpy(name, part->id.name+2); + } + break; + case ANIMTYPE_DSMBALL: /* metaball (dopesheet) expand widget */ + { + MetaBall *mb = (MetaBall *)ale->data; + + group = 4; + indent = 1; + special = ICON_META_DATA; + + if (FILTER_MBALL_OBJD(mb)) + expand = ICON_TRIA_DOWN; + else + expand = ICON_TRIA_RIGHT; + + strcpy(name, mb->id.name+2); + } + break; case ANIMTYPE_GROUP: /* action group */ @@ -671,8 +722,8 @@ void draw_channel_names(bAnimContext *ac, SpaceAction *saction, ARegion *ar) grp= fcu->grp; if (ale->id) { - /* special exception for materials */ - if (GS(ale->id->name) == ID_MA) { + /* special exception for materials and particles */ + if (ELEM(GS(ale->id->name),ID_MA,ID_PA)) { offset= 21; indent= 1; } @@ -1083,6 +1134,7 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar) case ANIMTYPE_FILLACTD: case ANIMTYPE_FILLMATD: + case ANIMTYPE_FILLPARTD: case ANIMTYPE_DSSKEY: case ANIMTYPE_DSWOR: { diff --git a/source/blender/editors/space_action/action_header.c b/source/blender/editors/space_action/action_header.c index f5c85d4d983..d3929a22342 100644 --- a/source/blender/editors/space_action/action_header.c +++ b/source/blender/editors/space_action/action_header.c @@ -77,7 +77,7 @@ static void act_viewmenu(bContext *C, uiLayout *layout, void *arg_unused) { bScreen *sc= CTX_wm_screen(C); ScrArea *sa= CTX_wm_area(C); - SpaceAction *sact= (SpaceAction*)CTX_wm_space_data(C); + SpaceAction *sact= CTX_wm_space_action(C); PointerRNA spaceptr; /* retrieve state */ @@ -167,6 +167,7 @@ static void act_edit_transformmenu(bContext *C, uiLayout *layout, void *arg_unus static void act_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "ACT_OT_snap", "type", ACTKEYS_SNAP_CFRA); uiItemEnumO(layout, NULL, 0, "ACT_OT_snap", "type", ACTKEYS_SNAP_NEAREST_FRAME); uiItemEnumO(layout, NULL, 0, "ACT_OT_snap", "type", ACTKEYS_SNAP_NEAREST_SECOND); @@ -175,6 +176,7 @@ static void act_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused) static void act_edit_mirrormenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "ACT_OT_mirror", "type", ACTKEYS_MIRROR_CFRA); uiItemEnumO(layout, NULL, 0, "ACT_OT_mirror", "type", ACTKEYS_MIRROR_YAXIS); uiItemEnumO(layout, NULL, 0, "ACT_OT_mirror", "type", ACTKEYS_MIRROR_XAXIS); @@ -183,6 +185,7 @@ static void act_edit_mirrormenu(bContext *C, uiLayout *layout, void *arg_unused) static void act_edit_handlesmenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "ACT_OT_handle_type", "type", HD_FREE); uiItemEnumO(layout, NULL, 0, "ACT_OT_handle_type", "type", HD_AUTO); uiItemEnumO(layout, NULL, 0, "ACT_OT_handle_type", "type", HD_VECT); @@ -192,6 +195,7 @@ static void act_edit_handlesmenu(bContext *C, uiLayout *layout, void *arg_unused static void act_edit_ipomenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "ACT_OT_interpolation_type", "type", BEZT_IPO_CONST); uiItemEnumO(layout, NULL, 0, "ACT_OT_interpolation_type", "type", BEZT_IPO_LIN); uiItemEnumO(layout, NULL, 0, "ACT_OT_interpolation_type", "type", BEZT_IPO_BEZ); @@ -199,6 +203,7 @@ static void act_edit_ipomenu(bContext *C, uiLayout *layout, void *arg_unused) static void act_edit_expomenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "ACT_OT_extrapolation_type", "type", FCURVE_EXTRAPOLATE_CONSTANT); uiItemEnumO(layout, NULL, 0, "ACT_OT_extrapolation_type", "type", FCURVE_EXTRAPOLATE_LINEAR); } @@ -248,7 +253,7 @@ static void do_action_buttons(bContext *C, void *arg, int event) static void saction_idpoin_handle(bContext *C, ID *id, int event) { - SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C); + SpaceAction *saction= CTX_wm_space_action(C); Object *obact= CTX_data_active_object(C); printf("actedit do id: \n"); @@ -296,7 +301,7 @@ static void saction_idpoin_handle(bContext *C, ID *id, int event) void action_header_buttons(const bContext *C, ARegion *ar) { ScrArea *sa= CTX_wm_area(C); - SpaceAction *saction= (SpaceAction *)CTX_wm_space_data(C); + SpaceAction *saction= CTX_wm_space_action(C); bAnimContext ac; uiBlock *block; int xco, yco= 3, xmax; @@ -381,13 +386,12 @@ void action_header_buttons(const bContext *C, ARegion *ar) uiDefIconButBitI(block, TOGN, ADS_FILTER_NOLAM, B_REDR, ICON_LAMP_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display Lamps"); uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCAM, B_REDR, ICON_CAMERA_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display Cameras"); uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCUR, B_REDR, ICON_CURVE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display Curves"); + uiDefIconButBitI(block, TOGN, ADS_FILTER_NOMBA, B_REDR, ICON_META_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display MetaBalls"); + uiDefIconButBitI(block, TOGN, ADS_FILTER_NOPART, B_REDR, ICON_PARTICLE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(saction->ads.filterflag), 0, 0, 0, 0, "Display Particles"); uiBlockEndAlign(block); xco += 30; } - else if (saction->mode == SACTCONT_ACTION) { // not too appropriate for shapekeys atm... - /* NAME ETC */ - //uiClearButLock(); - + else if (saction->mode == SACTCONT_ACTION) { /* NAME ETC */ xco= uiDefIDPoinButs(block, CTX_data_main(C), NULL, (ID*)saction->action, ID_AC, &saction->pin, xco, yco, saction_idpoin_handle, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_ADD_NEW|UI_ID_DELETE|UI_ID_FAKE_USER|UI_ID_ALONE|UI_ID_PIN); @@ -395,14 +399,6 @@ void action_header_buttons(const bContext *C, ARegion *ar) xco += 8; } - /* COPY PASTE */ - uiBlockBeginAlign(block); - uiDefIconButO(block, BUT, "ACT_OT_copy", WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco,yco,XIC,YIC, "Copies the selected keyframes to the buffer."); - xco += XIC; - uiDefIconButO(block, BUT, "ACT_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEDOWN, xco,yco,XIC,YIC, "Pastes the keyframes from the buffer into the selected channels."); - uiBlockEndAlign(block); - xco += (XIC + 8); - /* draw AUTOSNAP */ if (saction->mode != SACTCONT_GPENCIL) { if (saction->flag & SACTION_DRAWTIME) { @@ -421,12 +417,13 @@ void action_header_buttons(const bContext *C, ARegion *ar) xco += (70 + 8); } - /* draw LOCK */ - // XXX this feature is probably not relevant anymore! - //uiDefIconButS(block, ICONTOG, B_LOCK, ICON_UNLOCKED, xco, yco, XIC, YIC, - // &(saction->lock), 0, 0, 0, 0, - // "Updates other affected window spaces automatically " - // "to reflect changes in real time"); + /* COPY PASTE */ + uiBlockBeginAlign(block); + uiDefIconButO(block, BUT, "ACT_OT_copy", WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco,yco,XIC,YIC, "Copies the selected keyframes to the buffer."); + xco += XIC; + uiDefIconButO(block, BUT, "ACT_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEDOWN, xco,yco,XIC,YIC, "Pastes the keyframes from the buffer into the selected channels."); + uiBlockEndAlign(block); + xco += (XIC + 8); } /* always as last */ diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index 0b06499693c..55e035cfced 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -165,7 +165,7 @@ static void action_main_area_init(wmWindowManager *wm, ARegion *ar) static void action_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ - SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C); + SpaceAction *saction= CTX_wm_space_action(C); bAnimContext ac; View2D *v2d= &ar->v2d; View2DGrid *grid; @@ -228,7 +228,7 @@ static void action_channel_area_init(wmWindowManager *wm, ARegion *ar) static void action_channel_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ - SpaceAction *saction= (SpaceAction*)CTX_wm_space_data(C); + SpaceAction *saction= CTX_wm_space_action(C); bAnimContext ac; View2D *v2d= &ar->v2d; View2DScrollers *scrollers; diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index b427742077a..5c33b648947 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -51,6 +51,7 @@ #include "ED_sculpt.h" #include "ED_space_api.h" #include "ED_uvedit.h" +#include "ED_mball.h" /* only call once on startup, storage is global in BKE kernel listbase */ void ED_spacetypes_init(void) @@ -93,6 +94,7 @@ void ED_spacetypes_init(void) ED_operatortypes_marker(); ED_operatortypes_pointcache(); ED_operatortypes_fluid(); + ED_operatortypes_metaball(); ED_operatortypes_boids(); ui_view2d_operatortypes(); @@ -120,6 +122,7 @@ void ED_spacetypes_keymap(wmWindowManager *wm) ED_keymap_curve(wm); ED_keymap_armature(wm); ED_keymap_particle(wm); + ED_keymap_metaball(wm); ED_marker_keymap(wm); UI_view2d_keymap(wm); diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c index 9048565b01f..614017cc4c6 100644 --- a/source/blender/editors/space_buttons/buttons_context.c +++ b/source/blender/editors/space_buttons/buttons_context.c @@ -31,6 +31,7 @@ #include "MEM_guardedalloc.h" #include "DNA_armature_types.h" +#include "DNA_brush_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" #include "DNA_modifier_types.h" @@ -45,6 +46,7 @@ #include "BLI_listbase.h" #include "BKE_context.h" +#include "BKE_global.h" #include "BKE_material.h" #include "BKE_modifier.h" #include "BKE_particle.h" @@ -65,7 +67,7 @@ typedef struct ButsContextPath { PointerRNA ptr[8]; int len; - int worldtex; + int flag; } ButsContextPath; static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type) @@ -302,10 +304,48 @@ static int buttons_context_path_particle(ButsContextPath *path) return 0; } +static int buttons_context_path_brush(ButsContextPath *path) +{ + Scene *scene; + ToolSettings *ts; + Brush *br= NULL; + PointerRNA *ptr= &path->ptr[path->len-1]; + + /* if we already have a (pinned) brush, we're done */ + if(RNA_struct_is_a(ptr->type, &RNA_Brush)) { + return 1; + } + /* if we have a scene, use the toolsettings brushes */ + else if(buttons_context_path_scene(path)) { + scene= path->ptr[path->len-1].data; + ts= scene->toolsettings; + + if(G.f & G_SCULPTMODE) + br= ts->sculpt->brush; + else if(G.f & G_VERTEXPAINT) + br= ts->vpaint->brush; + else if(G.f & G_WEIGHTPAINT) + br= ts->wpaint->brush; + else if(G.f & G_TEXTUREPAINT) + br= ts->imapaint.brush; + + if(br) { + RNA_id_pointer_create(&br->id, &path->ptr[path->len]); + path->len++; + + return 1; + } + } + + /* no path to a world possible */ + return 0; +} + static int buttons_context_path_texture(ButsContextPath *path) { Material *ma; Lamp *la; + Brush *br; World *wo; MTex *mtex; Tex *tex; @@ -315,8 +355,21 @@ static int buttons_context_path_texture(ButsContextPath *path) if(RNA_struct_is_a(ptr->type, &RNA_Texture)) { return 1; } + /* try brush */ + else if((path->flag & SB_BRUSH_TEX) && buttons_context_path_brush(path)) { + br= path->ptr[path->len-1].data; + + if(br) { + mtex= br->mtex[(int)br->texact]; + tex= (mtex)? mtex->tex: NULL; + + RNA_id_pointer_create(&tex->id, &path->ptr[path->len]); + path->len++; + return 1; + } + } /* try world */ - else if(path->worldtex && buttons_context_path_world(path)) { + else if((path->flag & SB_WORLD_TEX) && buttons_context_path_world(path)) { wo= path->ptr[path->len-1].data; if(wo) { @@ -354,46 +407,21 @@ static int buttons_context_path_texture(ButsContextPath *path) return 1; } } - /* TODO: material nodes, brush */ + /* TODO: material nodes */ - /* no path to a particle system possible */ + /* no path to a texture possible */ return 0; } -static int buttons_context_path_game(ButsContextPath *path) -{ - /* XXX temporary context. Using material slot instead of ob->game_data */ - Object *ob; - PointerRNA *ptr= &path->ptr[path->len-1]; - Material *ma; - - /* if we already have a (pinned) material, we're done */ - if(RNA_struct_is_a(ptr->type, &RNA_Material)) { - return 1; - } - /* if we have an object, use the object material slot */ - else if(buttons_context_path_object(path)) { - ob= path->ptr[path->len-1].data; - if(ob && ob->type && (ob->type<OB_LAMP)) { - ma= give_current_material(ob, ob->actcol); - RNA_id_pointer_create(&ma->id, &path->ptr[path->len]); - path->len++; - return 1; - } - } - - /* no path to a material possible */ - return 0; -} -static int buttons_context_path(const bContext *C, ButsContextPath *path, int mainb, int worldtex) +static int buttons_context_path(const bContext *C, ButsContextPath *path, int mainb, int flag) { - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); + SpaceButs *sbuts= CTX_wm_space_buts(C); ID *id; int found; memset(path, 0, sizeof(*path)); - path->worldtex= worldtex; + path->flag= flag; /* if some ID datablock is pinned, set the root pointer */ if(sbuts->pinid) { @@ -430,9 +458,6 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma case BCONTEXT_DATA: found= buttons_context_path_data(path, -1); break; - case BCONTEXT_GAME: - found= buttons_context_path_game(path); - break; case BCONTEXT_PARTICLE: found= buttons_context_path_particle(path); break; @@ -459,18 +484,18 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts) { ButsContextPath *path; PointerRNA *ptr; - int a, worldtex, flag= 0; + int a, pflag, flag= 0; if(!sbuts->path) sbuts->path= MEM_callocN(sizeof(ButsContextPath), "ButsContextPath"); path= sbuts->path; - worldtex= (sbuts->flag & SB_WORLD_TEX); + pflag= (sbuts->flag & (SB_WORLD_TEX|SB_BRUSH_TEX)); /* for each context, see if we can compute a valid path to it, if * this is the case, we know we have to display the button */ for(a=0; a<BCONTEXT_TOT; a++) { - if(buttons_context_path(C, path, a, worldtex)) { + if(buttons_context_path(C, path, a, pflag)) { flag |= (1<<a); /* setting icon for data context */ @@ -485,6 +510,11 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts) } } + /* always try to use the tab that was explicitly + * set to the user, so that once that context comes + * back, the tab is activated again */ + sbuts->mainb= sbuts->mainbuser; + /* in case something becomes invalid, change */ if((flag & (1 << sbuts->mainb)) == 0) { if(flag & BCONTEXT_OBJECT) { @@ -500,7 +530,7 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts) } } - buttons_context_path(C, path, sbuts->mainb, worldtex); + buttons_context_path(C, path, sbuts->mainb, pflag); if(!(flag & (1 << sbuts->mainb))) { if(flag & (1 << BCONTEXT_OBJECT)) @@ -516,7 +546,7 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts) int buttons_context(const bContext *C, const char *member, bContextDataResult *result) { - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); + SpaceButs *sbuts= CTX_wm_space_buts(C); ButsContextPath *path= sbuts?sbuts->path:NULL; if(!path) @@ -526,9 +556,9 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r if(CTX_data_dir(member)) { static const char *dir[] = { "world", "object", "mesh", "armature", "lattice", "curve", - "meta_ball", "lamp", "camera", "material", "material_slot", "game", + "meta_ball", "lamp", "camera", "material", "material_slot", "texture", "texture_slot", "bone", "edit_bone", "particle_system", - "cloth", "soft_body", "fluid", "collision", NULL}; + "cloth", "soft_body", "fluid", "collision", "brush", NULL}; CTX_data_dir_set(result, dir); return 1; @@ -671,6 +701,10 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r return 1; } } + else if(CTX_data_equals(member, "brush")) { + set_pointer_type(path, result, &RNA_Brush); + return 1; + } return 0; } @@ -679,7 +713,7 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r static void pin_cb(bContext *C, void *arg1, void *arg2) { - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); + SpaceButs *sbuts= CTX_wm_space_buts(C); ButsContextPath *path= sbuts->path; PointerRNA *ptr; int a; @@ -704,7 +738,7 @@ static void pin_cb(bContext *C, void *arg1, void *arg2) void buttons_context_draw(const bContext *C, uiLayout *layout) { - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); + SpaceButs *sbuts= CTX_wm_space_buts(C); ButsContextPath *path= sbuts->path; uiLayout *row; uiBlock *block; diff --git a/source/blender/editors/space_buttons/buttons_header.c b/source/blender/editors/space_buttons/buttons_header.c index e569ed324cd..a1041bc5106 100644 --- a/source/blender/editors/space_buttons/buttons_header.c +++ b/source/blender/editors/space_buttons/buttons_header.c @@ -60,66 +60,17 @@ #include "buttons_intern.h" -/* ************************ header area region *********************** */ - -static void do_viewmenu(bContext *C, void *arg, int event) -{ - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); - ScrArea *sa= CTX_wm_area(C); - - switch(event) { - case 1: - case 2: - sbuts->align= event; - sbuts->re_align= 1; - break; - } - - ED_area_tag_redraw(sa); -} - -static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused) -{ - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); - ScrArea *sa= CTX_wm_area(C); - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "dummy_viewmenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_viewmenu, NULL); - - if (sbuts->align == 1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Horizontal", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Horizontal", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - - if (sbuts->align == 2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Vertical", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Vertical", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - - if(sa->headertype==HEADERTOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); - uiEndBlock(C, block); - - return block; -} - #define B_CONTEXT_SWITCH 101 #define B_BUTSPREVIEW 102 -#define B_NEWFRAME 103 static void do_buttons_buttons(bContext *C, void *arg, int event) { - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); + SpaceButs *sbuts= CTX_wm_space_buts(C); + + if(!sbuts) /* window type switch */ + return; switch(event) { - case B_NEWFRAME: - WM_event_add_notifier(C, NC_SCENE|ND_FRAME, NULL); - break; case B_CONTEXT_SWITCH: case B_BUTSPREVIEW: ED_area_tag_redraw(CTX_wm_area(C)); @@ -133,12 +84,13 @@ static void do_buttons_buttons(bContext *C, void *arg, int event) sbuts->preview= 1; break; } + + sbuts->mainbuser= sbuts->mainb; } void buttons_header_buttons(const bContext *C, ARegion *ar) { - ScrArea *sa= CTX_wm_area(C); - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); + SpaceButs *sbuts= CTX_wm_space_buts(C); uiBlock *block; int xco, yco= 3; @@ -147,17 +99,7 @@ void buttons_header_buttons(const bContext *C, ARegion *ar) block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS); uiBlockSetHandleFunc(block, do_buttons_buttons, NULL); - xco= ED_area_header_standardbuttons(C, block, yco); - - if((sa->flag & HEADER_NO_PULLDOWN)==0) { - int xmax; - - xmax= GetButStringLength("View"); - uiDefPulldownBut(block, dummy_viewmenu, CTX_wm_area(C), - "View", xco, yco, xmax-3, 20, ""); - - xco+=xmax; - } + xco= ED_area_header_switchbutton(C, block, yco); uiBlockSetEmboss(block, UI_EMBOSS); @@ -166,30 +108,28 @@ void buttons_header_buttons(const bContext *C, ARegion *ar) // Default panels uiBlockBeginAlign(block); if(sbuts->pathflag & (1<<BCONTEXT_SCENE)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_SCENE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_SCENE, 0, 0, "Scene"); + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_SCENE, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_SCENE, 0, 0, "Scene"); if(sbuts->pathflag & (1<<BCONTEXT_WORLD)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_WORLD, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_WORLD, 0, 0, "World"); + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_WORLD, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_WORLD, 0, 0, "World"); if(sbuts->pathflag & (1<<BCONTEXT_OBJECT)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_OBJECT_DATA, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_OBJECT, 0, 0, "Object"); + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_OBJECT_DATA, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_OBJECT, 0, 0, "Object"); if(sbuts->pathflag & (1<<BCONTEXT_CONSTRAINT)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_CONSTRAINT, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_CONSTRAINT, 0, 0, "Constraint"); + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_CONSTRAINT, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_CONSTRAINT, 0, 0, "Constraint"); if(sbuts->pathflag & (1<<BCONTEXT_DATA)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, sbuts->dataicon, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_DATA, 0, 0, "Object Data"); + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, sbuts->dataicon, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_DATA, 0, 0, "Object Data"); if(sbuts->pathflag & (1<<BCONTEXT_MODIFIER)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MODIFIER, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MODIFIER, 0, 0, "Modifier"); + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MODIFIER, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_MODIFIER, 0, 0, "Modifier"); if(sbuts->pathflag & (1<<BCONTEXT_BONE)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_BONE_DATA, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_BONE, 0, 0, "Bone"); + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_BONE_DATA, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_BONE, 0, 0, "Bone"); if(sbuts->pathflag & (1<<BCONTEXT_MATERIAL)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MATERIAL, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_MATERIAL, 0, 0, "Material"); + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_MATERIAL, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_MATERIAL, 0, 0, "Material"); if(sbuts->pathflag & (1<<BCONTEXT_TEXTURE)) - uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_TEXTURE, 0, 0, "Texture"); + uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_TEXTURE, 0, 0, "Texture"); if(sbuts->pathflag & (1<<BCONTEXT_PARTICLE)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PARTICLES, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PARTICLE, 0, 0, "Particles"); + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PARTICLES, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_PARTICLE, 0, 0, "Particles"); if(sbuts->pathflag & (1<<BCONTEXT_PHYSICS)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PHYSICS, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_PHYSICS, 0, 0, "Physics"); - if(sbuts->pathflag & (1<<BCONTEXT_GAME)) - uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_GAME, xco+=XIC, yco, XIC, YIC, &(sbuts->mainb), 0.0, (float)BCONTEXT_GAME, 0, 0, "Game"); - xco+= XIC; + uiDefIconButS(block, ROW, B_CONTEXT_SWITCH, ICON_PHYSICS, xco+=BUTS_UI_UNIT, yco, BUTS_UI_UNIT, BUTS_UI_UNIT, &(sbuts->mainb), 0.0, (float)BCONTEXT_PHYSICS, 0, 0, "Physics"); + xco+= BUTS_UI_UNIT; uiBlockEndAlign(block); diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h index adae52c1ce7..8ed17ab1fa8 100644 --- a/source/blender/editors/space_buttons/buttons_intern.h +++ b/source/blender/editors/space_buttons/buttons_intern.h @@ -49,6 +49,9 @@ struct wmOperatorType; #define BUTS_SENS_STATE 512 #define BUTS_ACT_STATE 1024 +#define BUTS_HEADERY (HEADERY*1.2) +#define BUTS_UI_UNIT (UI_UNIT_Y*1.2) + /* internal exports only */ /* buttons_header.c */ @@ -86,5 +89,8 @@ void PARTICLE_OT_target_move_down(struct wmOperatorType *ot); void SCENE_OT_render_layer_add(struct wmOperatorType *ot); void SCENE_OT_render_layer_remove(struct wmOperatorType *ot); +void BUTTONS_OT_file_browse(struct wmOperatorType *ot); +void BUTTONS_OT_toolbox(struct wmOperatorType *ot); + #endif /* ED_BUTTONS_INTERN_H */ diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c index b4348c2db9a..4e9715538a0 100644 --- a/source/blender/editors/space_buttons/buttons_ops.c +++ b/source/blender/editors/space_buttons/buttons_ops.c @@ -38,6 +38,8 @@ #include "DNA_node_types.h" #include "DNA_texture_types.h" #include "DNA_scene_types.h" +#include "DNA_screen_types.h" +#include "DNA_space_types.h" #include "DNA_world_types.h" #include "BKE_context.h" @@ -70,6 +72,9 @@ #include "RNA_access.h" #include "RNA_define.h" +#include "UI_interface.h" +#include "UI_resources.h" + #include "buttons_intern.h" // own include @@ -905,3 +910,103 @@ void SCENE_OT_render_layer_remove(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } +/********************** toolbox operator *********************/ + +static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + bScreen *sc= CTX_wm_screen(C); + SpaceButs *sbuts= CTX_wm_space_buts(C); + PointerRNA ptr; + uiPopupMenu *pup; + uiLayout *layout; + + RNA_pointer_create(&sc->id, &RNA_SpaceButtonsWindow, sbuts, &ptr); + + pup= uiPupMenuBegin(C, "Align", 0); + layout= uiPupMenuLayout(pup); + uiItemsEnumR(layout, &ptr, "align"); + uiPupMenuEnd(C, pup); + + return OPERATOR_CANCELLED; +} + +void BUTTONS_OT_toolbox(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Toolbox"; + ot->idname= "BUTTONS_OT_toolbox"; + + /* api callbacks */ + ot->invoke= toolbox_invoke; +} + +/********************** filebrowse operator *********************/ + +typedef struct FileBrowseOp { + PointerRNA ptr; + PropertyRNA *prop; +} FileBrowseOp; + +static int file_browse_exec(bContext *C, wmOperator *op) +{ + FileBrowseOp *fbo= op->customdata; + char *str; + + str= RNA_string_get_alloc(op->ptr, "filename", 0, 0); + RNA_property_string_set(&fbo->ptr, fbo->prop, str); + RNA_property_update(C, &fbo->ptr, fbo->prop); + MEM_freeN(str); + + MEM_freeN(op->customdata); + return OPERATOR_FINISHED; +} + +static int file_browse_cancel(bContext *C, wmOperator *op) +{ + MEM_freeN(op->customdata); + op->customdata= NULL; + + return OPERATOR_CANCELLED; +} + +static int file_browse_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + PointerRNA ptr; + PropertyRNA *prop; + FileBrowseOp *fbo; + char *str; + + uiFileBrowseContextProperty(C, &ptr, &prop); + + if(!prop) + return OPERATOR_CANCELLED; + + fbo= MEM_callocN(sizeof(FileBrowseOp), "FileBrowseOp"); + fbo->ptr= ptr; + fbo->prop= prop; + op->customdata= fbo; + + str= RNA_property_string_get_alloc(&ptr, prop, 0, 0); + RNA_string_set(op->ptr, "filename", str); + MEM_freeN(str); + + WM_event_add_fileselect(C, op); + + return OPERATOR_RUNNING_MODAL; +} + +void BUTTONS_OT_file_browse(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "File Browse"; + ot->idname= "BUTTONS_OT_file_browse"; + + /* api callbacks */ + ot->invoke= file_browse_invoke; + ot->exec= file_browse_exec; + ot->cancel= file_browse_cancel; + + /* properties */ + WM_operator_properties_filesel(ot, 0); +} + diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index 72c479b2877..71f8642afd4 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -70,7 +70,6 @@ static SpaceLink *buttons_new(const bContext *C) sbuts= MEM_callocN(sizeof(SpaceButs), "initbuts"); sbuts->spacetype= SPACE_BUTS; - sbuts->scaflag= BUTS_SENS_LINK|BUTS_SENS_ACT|BUTS_CONT_ACT|BUTS_ACT_ACT|BUTS_ACT_LINK; sbuts->align= BUT_AUTO; /* header */ @@ -139,41 +138,44 @@ static SpaceLink *buttons_duplicate(SpaceLink *sl) /* add handlers, stuff you only do once or on area/region changes */ static void buttons_main_area_init(wmWindowManager *wm, ARegion *ar) { + ListBase *keymap; + ED_region_panels_init(wm, ar); + + keymap= WM_keymap_listbase(wm, "Buttons Generic", SPACE_BUTS, 0); + WM_event_add_keymap_handler(&ar->handlers, keymap); } static void buttons_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); + SpaceButs *sbuts= CTX_wm_space_buts(C); int vertical= (sbuts->align == BUT_VERTICAL); buttons_context_compute(C, sbuts); if(sbuts->mainb == BCONTEXT_SCENE) - ED_region_panels(C, ar, vertical, "scene"); + ED_region_panels(C, ar, vertical, "scene", sbuts->mainb); else if(sbuts->mainb == BCONTEXT_WORLD) - ED_region_panels(C, ar, vertical, "world"); + ED_region_panels(C, ar, vertical, "world", sbuts->mainb); else if(sbuts->mainb == BCONTEXT_OBJECT) - ED_region_panels(C, ar, vertical, "object"); + ED_region_panels(C, ar, vertical, "object", sbuts->mainb); else if(sbuts->mainb == BCONTEXT_DATA) - ED_region_panels(C, ar, vertical, "data"); + ED_region_panels(C, ar, vertical, "data", sbuts->mainb); else if(sbuts->mainb == BCONTEXT_MATERIAL) - ED_region_panels(C, ar, vertical, "material"); + ED_region_panels(C, ar, vertical, "material", sbuts->mainb); else if(sbuts->mainb == BCONTEXT_TEXTURE) - ED_region_panels(C, ar, vertical, "texture"); + ED_region_panels(C, ar, vertical, "texture", sbuts->mainb); else if(sbuts->mainb == BCONTEXT_PARTICLE) - ED_region_panels(C, ar, vertical, "particle"); + ED_region_panels(C, ar, vertical, "particle", sbuts->mainb); else if(sbuts->mainb == BCONTEXT_PHYSICS) - ED_region_panels(C, ar, vertical, "physics"); + ED_region_panels(C, ar, vertical, "physics", sbuts->mainb); else if(sbuts->mainb == BCONTEXT_BONE) - ED_region_panels(C, ar, vertical, "bone"); + ED_region_panels(C, ar, vertical, "bone", sbuts->mainb); else if(sbuts->mainb == BCONTEXT_MODIFIER) - ED_region_panels(C, ar, vertical, "modifier"); + ED_region_panels(C, ar, vertical, "modifier", sbuts->mainb); else if (sbuts->mainb == BCONTEXT_CONSTRAINT) - ED_region_panels(C, ar, vertical, "constraint"); - else if (sbuts->mainb == BCONTEXT_GAME) - ED_region_panels(C, ar, vertical, "game"); + ED_region_panels(C, ar, vertical, "constraint", sbuts->mainb); sbuts->re_align= 0; sbuts->mainbo= sbuts->mainb; @@ -205,11 +207,16 @@ void buttons_operatortypes(void) WM_operatortype_append(SCENE_OT_render_layer_add); WM_operatortype_append(SCENE_OT_render_layer_remove); + + WM_operatortype_append(BUTTONS_OT_toolbox); + WM_operatortype_append(BUTTONS_OT_file_browse); } void buttons_keymap(struct wmWindowManager *wm) { + ListBase *keymap= WM_keymap_listbase(wm, "Buttons Generic", SPACE_BUTS, 0); + WM_keymap_add_item(keymap, "BUTTONS_OT_toolbox", RIGHTMOUSE, KM_PRESS, 0, 0); } //#define PY_HEADER @@ -261,7 +268,7 @@ static void buttons_context_area_init(wmWindowManager *wm, ARegion *ar) static void buttons_context_area_draw(const bContext *C, ARegion *ar) { - SpaceButs *sbuts= (SpaceButs*)CTX_wm_space_data(C); + SpaceButs *sbuts= CTX_wm_space_buts(C); uiStyle *style= U.uistyles.first; uiBlock *block; uiLayout *layout; @@ -313,6 +320,7 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn) switch(wmn->data) { case ND_FRAME: case ND_MODE: + case ND_RENDER_OPTIONS: ED_area_tag_redraw(sa); break; @@ -394,7 +402,7 @@ void ED_spacetype_buttons(void) /* regions: header */ art= MEM_callocN(sizeof(ARegionType), "spacetype buttons region"); art->regionid = RGN_TYPE_HEADER; - art->minsizey= HEADERY; + art->minsizey= BUTS_HEADERY; art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES; art->init= buttons_header_area_init; diff --git a/source/blender/editors/space_console/console_draw.c b/source/blender/editors/space_console/console_draw.c index 68cb1cc4a01..4f225bb8fcb 100644 --- a/source/blender/editors/space_console/console_draw.c +++ b/source/blender/editors/space_console/console_draw.c @@ -59,7 +59,7 @@ #include "UI_interface.h" #include "UI_resources.h" -//#include "console_intern.h" +#include "console_intern.h" static void console_font_begin(SpaceConsole *sc) { diff --git a/source/blender/editors/space_console/console_intern.h b/source/blender/editors/space_console/console_intern.h index 3c6eeb63505..6d002efcc8e 100644 --- a/source/blender/editors/space_console/console_intern.h +++ b/source/blender/editors/space_console/console_intern.h @@ -33,9 +33,7 @@ struct ConsoleLine; struct wmOperatorType; struct ReportList; - -/* TODO, make into a pref */ -#define CONSOLE_SCROLLBACK_LIMIT 128 +struct bContext; /* console_draw.c */ void console_text_main(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports); @@ -45,10 +43,10 @@ void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, struct Repo /* console_ops.c */ void console_history_free(SpaceConsole *sc, ConsoleLine *cl); void console_scrollback_free(SpaceConsole *sc, ConsoleLine *cl); -ConsoleLine *console_history_add_str(const bContext *C, char *str, int own); -ConsoleLine *console_scrollback_add_str(const bContext *C, char *str, int own); +ConsoleLine *console_history_add_str(const struct bContext *C, char *str, int own); +ConsoleLine *console_scrollback_add_str(const struct bContext *C, char *str, int own); -ConsoleLine *console_history_verify(const bContext *C); +ConsoleLine *console_history_verify(const struct bContext *C); int console_report_mask(SpaceConsole *sc); @@ -62,8 +60,11 @@ void CONSOLE_OT_scrollback_append(wmOperatorType *ot); void CONSOLE_OT_clear(wmOperatorType *ot); void CONSOLE_OT_history_cycle(wmOperatorType *ot); +void CONSOLE_OT_copy(wmOperatorType *ot); +void CONSOLE_OT_paste(wmOperatorType *ot); void CONSOLE_OT_zoom(wmOperatorType *ot); + /* console_report.c */ void CONSOLE_OT_select_pick(wmOperatorType *ot); /* report selection */ void CONSOLE_OT_select_all_toggle(wmOperatorType *ot); diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c index ca6e3983eac..fa9055f2d8d 100644 --- a/source/blender/editors/space_console/console_ops.c +++ b/source/blender/editors/space_console/console_ops.c @@ -37,9 +37,11 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" #include "BLI_blenlib.h" +#include "BLI_dynstr.h" #include "PIL_time.h" #include "BKE_utildefines.h" @@ -79,10 +81,28 @@ void console_scrollback_free(SpaceConsole *sc, ConsoleLine *cl) void console_scrollback_limit(SpaceConsole *sc) { int tot; - for(tot= BLI_countlist(&sc->scrollback); tot > CONSOLE_SCROLLBACK_LIMIT; tot--) + + if (U.scrollback < 32) U.scrollback= 128; // XXX - save in user defaults + + for(tot= BLI_countlist(&sc->scrollback); tot > U.scrollback; tot--) console_scrollback_free(sc, sc->scrollback.first); } +static ConsoleLine * console_history_find(SpaceConsole *sc, const char *str, ConsoleLine *cl_ignore) +{ + ConsoleLine *cl; + + for(cl= sc->history.last; cl; cl= cl->prev) { + if (cl==cl_ignore) + continue; + + if(strcmp(str, cl->line)==0) + return cl; + } + + return NULL; +} + /* return 0 if no change made, clamps the range */ static int console_line_cursor_set(ConsoleLine *cl, int cursor) { @@ -185,6 +205,11 @@ static int console_line_insert(ConsoleLine *ci, char *str) { int len = strlen(str); + if(len>0 && str[len-1]=='\n') {/* stop new lines being pasted at the end of lines */ + str[len-1]= '\0'; + len--; + } + if(len==0) return 0; @@ -471,11 +496,23 @@ void CONSOLE_OT_history_cycle(wmOperatorType *ot) static int history_append_exec(bContext *C, wmOperator *op) { ConsoleLine *ci= console_history_verify(C); - - char *str= RNA_string_get_alloc(op->ptr, "text", NULL, 0); /* own this text in the new line, dont free */ int cursor= RNA_int_get(op->ptr, "current_character"); - + short rem_dupes= RNA_boolean_get(op->ptr, "remove_duplicates"); + + if(rem_dupes) { + SpaceConsole *sc= CTX_wm_space_console(C); + ConsoleLine *cl; + + while((cl= console_history_find(sc, ci->line, ci))) + console_history_free(sc, cl); + + if(strcmp(str, ci->line)==0) { + MEM_freeN(str); + return OPERATOR_FINISHED; + } + } + ci= console_history_add_str(C, str, 1); /* own the string */ console_line_cursor_set(ci, cursor); @@ -500,6 +537,7 @@ void CONSOLE_OT_history_append(wmOperatorType *ot) /* properties */ RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position."); RNA_def_int(ot->srna, "current_character", 0, 0, INT_MAX, "Cursor", "The index of the cursor.", 0, 10000); + RNA_def_boolean(ot->srna, "remove_duplicates", 0, "Remove Duplicates", "Remove duplicate items in the history"); } @@ -548,6 +586,80 @@ void CONSOLE_OT_scrollback_append(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", console_line_type_items, CONSOLE_LINE_OUTPUT, "Type", "Console output type."); } + +static int copy_exec(bContext *C, wmOperator *op) +{ + SpaceConsole *sc= CTX_wm_space_console(C); + + DynStr *buf_dyn= BLI_dynstr_new(); + char *buf_str; + + ConsoleLine *cl; + + for(cl= sc->scrollback.first; cl; cl= cl->next) { + BLI_dynstr_append(buf_dyn, cl->line); + BLI_dynstr_append(buf_dyn, "\n"); + } + + buf_str= BLI_dynstr_get_cstring(buf_dyn); + BLI_dynstr_free(buf_dyn); + + WM_clipboard_text_set(buf_str, 0); + + MEM_freeN(buf_str); + return OPERATOR_FINISHED; +} + +void CONSOLE_OT_copy(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy to Clipboard"; + ot->idname= "CONSOLE_OT_copy"; + + /* api callbacks */ + ot->poll= console_edit_poll; + ot->exec= copy_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER; + + /* properties */ +} + +static int paste_exec(bContext *C, wmOperator *op) +{ + ConsoleLine *ci= console_history_verify(C); + + char *buf_str= WM_clipboard_text_get(0); + + if(buf_str==NULL) + return OPERATOR_CANCELLED; + + console_line_insert(ci, buf_str); /* TODO - Multiline copy?? */ + + MEM_freeN(buf_str); + + ED_area_tag_redraw(CTX_wm_area(C)); + + return OPERATOR_FINISHED; +} + +void CONSOLE_OT_paste(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Paste from Clipboard"; + ot->idname= "CONSOLE_OT_paste"; + + /* api callbacks */ + ot->poll= console_edit_poll; + ot->exec= paste_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER; + + /* properties */ +} + static int zoom_exec(bContext *C, wmOperator *op) { SpaceConsole *sc= CTX_wm_space_console(C); diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c index 763be0392dc..a763e7ce153 100644 --- a/source/blender/editors/space_console/space_console.c +++ b/source/blender/editors/space_console/space_console.c @@ -100,12 +100,12 @@ static SpaceLink *console_new(const bContext *C) ar->v2d.scroll |= (V2D_SCROLL_RIGHT); ar->v2d.align |= V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y; /* align bottom left */ ar->v2d.keepofs |= V2D_LOCKOFS_X; - ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT); + ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT); ar->v2d.keeptot= V2D_KEEPTOT_BOUNDS; ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f; /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */ - //ar->v2d.keepzoom= (V2D_KEEPASPECT|V2D_KEEPZOOM); + //ar->v2d.keepzoom= (V2D_KEEPASPECT|V2D_LIMITZOOM); return (SpaceLink *)sconsole; } @@ -171,7 +171,7 @@ static void console_main_area_draw(const bContext *C, ARegion *ar) console_scrollback_add_str(C, "Cursor: Left/Right Home/End", 0); console_scrollback_add_str(C, "Remove: Backspace/Delete", 0); console_scrollback_add_str(C, "Execute: Enter", 0); - console_scrollback_add_str(C, "Autocomplete: Ctrl+Enter", 0); + console_scrollback_add_str(C, "Autocomplete: Ctrl+Space", 0); console_scrollback_add_str(C, "Ctrl +/- Wheel: Zoom", 0); console_scrollback_add_str(C, "Builtin Modules: bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.ui", 0); } @@ -214,6 +214,8 @@ void console_operatortypes(void) WM_operatortype_append(CONSOLE_OT_clear); WM_operatortype_append(CONSOLE_OT_history_cycle); + WM_operatortype_append(CONSOLE_OT_copy); + WM_operatortype_append(CONSOLE_OT_paste); WM_operatortype_append(CONSOLE_OT_zoom); @@ -277,8 +279,10 @@ void console_keymap(struct wmWindowManager *wm) #ifndef DISABLE_PYTHON WM_keymap_add_item(keymap, "CONSOLE_OT_exec", RETKEY, KM_PRESS, 0, 0); /* python operator - space_text.py */ + WM_keymap_add_item(keymap, "CONSOLE_OT_exec", PADENTER, KM_PRESS, 0, 0); + //WM_keymap_add_item(keymap, "CONSOLE_OT_autocomplete", TABKEY, KM_PRESS, 0, 0); /* python operator - space_text.py */ - WM_keymap_add_item(keymap, "CONSOLE_OT_autocomplete", RETKEY, KM_PRESS, KM_CTRL, 0); /* python operator - space_text.py */ + WM_keymap_add_item(keymap, "CONSOLE_OT_autocomplete", SPACEKEY, KM_PRESS, KM_CTRL, 0); /* python operator - space_text.py */ #endif /* report selection */ @@ -290,14 +294,12 @@ void console_keymap(struct wmWindowManager *wm) WM_keymap_add_item(keymap, "CONSOLE_OT_report_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CONSOLE_OT_report_delete", DELKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CONSOLE_OT_report_copy", CKEY, KM_PRESS, KM_CTRL, 0); - - - - - + + WM_keymap_add_item(keymap, "CONSOLE_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "CONSOLE_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0); RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", " "); /* fake tabs */ - WM_keymap_add_item(keymap, "CONSOLE_OT_insert", KM_TEXTINPUT, KM_PRESS, KM_ANY, 0); // last! + WM_keymap_add_item(keymap, "CONSOLE_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last! } /****************** header region ******************/ diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c index 339ebe27fcd..5a07c6a7550 100644 --- a/source/blender/editors/space_file/file_draw.c +++ b/source/blender/editors/space_file/file_draw.c @@ -81,6 +81,7 @@ /* ui geometry */ #define IMASEL_BUTTONS_HEIGHT 40 +#define IMASEL_BUTTONS_MARGIN 6 #define TILE_BORDER_X 8 #define TILE_BORDER_Y 8 @@ -134,8 +135,8 @@ void file_draw_buttons(const bContext *C, ARegion *ar) /* Button layout. */ const short min_x = 10; const short max_x = ar->winx - 10; - const short line2_y = ar->winy - IMASEL_BUTTONS_HEIGHT - 12; - const short line1_y = line2_y + IMASEL_BUTTONS_HEIGHT/2 + 4; + const short line1_y = IMASEL_BUTTONS_HEIGHT/2 + IMASEL_BUTTONS_MARGIN*2; + const short line2_y = IMASEL_BUTTONS_MARGIN; const short input_minw = 20; const short btn_h = UI_UNIT_Y; const short btn_fn_w = UI_UNIT_X; @@ -153,7 +154,7 @@ void file_draw_buttons(const bContext *C, ARegion *ar) uiBut* but; uiBlock* block; - SpaceFile* sfile = (SpaceFile*) CTX_wm_space_data(C); + SpaceFile* sfile = CTX_wm_space_file(C); FileSelectParams* params = ED_fileselect_get_params(sfile); /* Initialize UI block. */ @@ -345,7 +346,7 @@ static void file_draw_string(short sx, short sy, const char* string, float width void file_calc_previews(const bContext *C, ARegion *ar) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); View2D *v2d= &ar->v2d; ED_fileselect_init_layout(sfile, ar); @@ -354,7 +355,7 @@ void file_calc_previews(const bContext *C, ARegion *ar) void file_draw_previews(const bContext *C, ARegion *ar) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); FileSelectParams* params= ED_fileselect_get_params(sfile); FileLayout* layout= ED_fileselect_get_layout(sfile, ar); View2D *v2d= &ar->v2d; @@ -495,16 +496,43 @@ void file_draw_previews(const bContext *C, ARegion *ar) uiSetRoundBox(0); } +static void renamebutton_cb(bContext *C, void *arg1, char *oldname) +{ + char newname[FILE_MAX+12]; + char orgname[FILE_MAX+12]; + char filename[FILE_MAX+12]; + SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + ARegion* ar = CTX_wm_region(C); + + struct direntry *file = (struct direntry *)arg1; + + BLI_make_file_string(G.sce, orgname, sfile->params->dir, oldname); + BLI_strncpy(filename, file->relname, sizeof(filename)); + BLI_make_file_string(G.sce, newname, sfile->params->dir, filename); + + if( strcmp(orgname, newname) != 0 ) { + if (!BLI_exists(newname)) { + BLI_rename(orgname, newname); + /* to make sure we show what is on disk */ + filelist_free(sfile->files); + } else { + BLI_strncpy(file->relname, oldname, strlen(oldname)+1); + } + + ED_region_tag_redraw(ar); + } +} void file_draw_list(const bContext *C, ARegion *ar) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); FileSelectParams* params = ED_fileselect_get_params(sfile); FileLayout* layout= ED_fileselect_get_layout(sfile, ar); View2D *v2d= &ar->v2d; struct FileList* files = sfile->files; struct direntry *file; int numfiles; + int numfiles_layout; int colorid = 0; short sx, sy; int offset; @@ -543,23 +571,27 @@ void file_draw_list(const bContext *C, ARegion *ar) sx = ar->v2d.cur.xmin + layout->tile_border_x; sy = ar->v2d.cur.ymax - layout->tile_border_y; + + numfiles_layout = ED_fileselect_layout_numfiles(layout, ar); - for (i=offset; (i < numfiles); ++i) + for (i=offset; (i < numfiles) && (i<offset+numfiles_layout); ++i) { ED_fileselect_layout_tilepos(layout, i, &sx, &sy); sx += v2d->tot.xmin+2; sy = v2d->tot.ymax - sy; file = filelist_file(files, i); - - if (params->active_file == i) { - if (file->flags & ACTIVE) colorid= TH_HILITE; - else colorid = TH_BACK; - draw_tile(sx-2, sy-3, layout->tile_w+2, sfile->layout->tile_h+layout->tile_border_y, colorid,20); - } else if (file->flags & ACTIVE) { - colorid = TH_HILITE; - draw_tile(sx-2, sy-3, layout->tile_w+2, sfile->layout->tile_h+layout->tile_border_y, colorid,0); - } + + if (!(file->flags & EDITING)) { + if (params->active_file == i) { + if (file->flags & ACTIVE) colorid= TH_HILITE; + else colorid = TH_BACK; + draw_tile(sx-2, sy-3, layout->tile_w+2, sfile->layout->tile_h+layout->tile_border_y, colorid,20); + } else if (file->flags & ACTIVE) { + colorid = TH_HILITE; + draw_tile(sx-2, sy-3, layout->tile_w+2, sfile->layout->tile_h+layout->tile_border_y, colorid,0); + } + } spos = sx; file_draw_icon(spos, sy-3, get_file_icon(file), ICON_DEFAULT_WIDTH, ICON_DEFAULT_WIDTH); @@ -568,7 +600,19 @@ void file_draw_list(const bContext *C, ARegion *ar) UI_ThemeColor4(TH_TEXT); sw = file_string_width(file->relname); - file_draw_string(spos, sy, file->relname, sw, layout->tile_h, FILE_SHORTEN_END); + if (file->flags & EDITING) { + uiBlock *block = uiBeginBlock(C, ar, "FileName", UI_EMBOSS); + uiBut *but = uiDefBut(block, TEX, 1, "", spos, sy-layout->tile_h-3, + layout->column_widths[COLUMN_NAME], layout->tile_h, file->relname, 1.0f, (float)FILE_MAX,0,0,""); + uiButSetRenameFunc(but, renamebutton_cb, file); + if ( 0 == uiButActiveOnly(C, block, but)) { + file->flags &= ~EDITING; + } + uiEndBlock(C, block); + uiDrawBlock(C, block); + } else { + file_draw_string(spos, sy, file->relname, sw, layout->tile_h, FILE_SHORTEN_END); + } spos += layout->column_widths[COLUMN_NAME] + 12; if (params->display == FILE_SHOWSHORT) { if (!(file->type & S_IFDIR)) { diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h index dce56e05d6b..9f1e4ad0e25 100644 --- a/source/blender/editors/space_file/file_intern.h +++ b/source/blender/editors/space_file/file_intern.h @@ -70,6 +70,7 @@ void FILE_OT_refresh(struct wmOperatorType *ot); void FILE_OT_bookmark_toggle(struct wmOperatorType *ot); void FILE_OT_filenum(struct wmOperatorType *ot); void FILE_OT_delete(struct wmOperatorType *ot); +void FILE_OT_rename(struct wmOperatorType *ot); int file_exec(bContext *C, struct wmOperator *unused); int file_cancel_exec(bContext *C, struct wmOperator *unused); diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 0bc2e310810..9c73956d375 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -105,12 +105,18 @@ static void file_deselect_all(SpaceFile* sfile) } } -static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short val) +typedef enum FileSelect { FILE_SELECT_DIR = 1, + FILE_SELECT_FILE = 2 } FileSelect; + + +static FileSelect file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short val) { int first_file = -1; int last_file = -1; int act_file; short selecting = (val == LEFTMOUSE); + FileSelect retval = FILE_SELECT_FILE; + FileSelectParams *params = ED_fileselect_get_params(sfile); // FileLayout *layout = ED_fileselect_get_layout(sfile, ar); @@ -137,35 +143,33 @@ static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short v params->active_file = last_file; if(file && S_ISDIR(file->type)) { - /* the path is too long! */ - if (strlen(params->dir) + strlen(file->relname) >= FILE_MAX ) + /* the path is too long and we are not going up! */ + if (strcmp(file->relname, "..") && strlen(params->dir) + strlen(file->relname) >= FILE_MAX ) { // XXX error("Path too long, cannot enter this directory"); } else { - BLI_cleanup_dir(G.sce, params->dir); - strcat(params->dir, file->relname); - BLI_add_slash(params->dir); - params->file[0] = '\0'; + if (strcmp(file->relname, "..")==0) { + /* avoids /../../ */ + BLI_parent_dir(params->dir); + } else { + BLI_cleanup_dir(G.sce, params->dir); + strcat(params->dir, file->relname); + BLI_add_slash(params->dir); + } + file_change_dir(sfile); + retval = FILE_SELECT_DIR; } } else if (file) { if (file->relname) { BLI_strncpy(params->file, file->relname, FILE_MAXFILE); - /* XXX - if(event==MIDDLEMOUSE && filelist_gettype(sfile->files)) - imasel_execute(sfile); - */ } } - /* XXX - if(BIF_filelist_gettype(sfile->files)==FILE_MAIN) { - active_imasel_object(sfile); - } - */ } + return retval; } @@ -173,7 +177,7 @@ static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short v static int file_border_select_exec(bContext *C, wmOperator *op) { ARegion *ar= CTX_wm_region(C); - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); short val; rcti rect; @@ -185,8 +189,11 @@ static int file_border_select_exec(bContext *C, wmOperator *op) BLI_isect_rcti(&(ar->v2d.mask), &rect, &rect); - file_select(sfile, ar, &rect, val ); - WM_event_add_notifier(C, NC_WINDOW, NULL); + if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, val )) { + WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL); + } else { + WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL); + } return OPERATOR_FINISHED; } @@ -214,21 +221,31 @@ void FILE_OT_select_border(wmOperatorType *ot) static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event) { ARegion *ar= CTX_wm_region(C); - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); short val; rcti rect; + if(ar->regiontype != RGN_TYPE_WINDOW) + return OPERATOR_CANCELLED; + rect.xmin = rect.xmax = event->x - ar->winrct.xmin; rect.ymin = rect.ymax = event->y - ar->winrct.ymin; val = event->val; - if (BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin)) { + if(!BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin)) + return OPERATOR_CANCELLED; - /* single select, deselect all selected first */ - file_deselect_all(sfile); - file_select(sfile, ar, &rect, val ); + /* single select, deselect all selected first */ + file_deselect_all(sfile); + + if (FILE_SELECT_DIR == file_select(sfile, ar, &rect, val )) + WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL); + else WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL); - } + + WM_event_add_mousemove(C); /* for directory changes */ + WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL); + return OPERATOR_FINISHED; } @@ -249,7 +266,7 @@ void FILE_OT_select(wmOperatorType *ot) static int file_select_all_invoke(bContext *C, wmOperator *op, wmEvent *event) { ScrArea *sa= CTX_wm_area(C); - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); int numfiles = filelist_numfiles(sfile->files); int i; int select = 1; @@ -294,7 +311,7 @@ void FILE_OT_select_all_toggle(wmOperatorType *ot) static int bookmark_select_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); if(RNA_struct_find_property(op->ptr, "dir")) { char entry[256]; @@ -304,9 +321,8 @@ static int bookmark_select_invoke(bContext *C, wmOperator *op, wmEvent *event) BLI_strncpy(params->dir, entry, sizeof(params->dir)); BLI_cleanup_dir(G.sce, params->dir); file_change_dir(sfile); - params->file[0] = '\0'; - WM_event_add_notifier(C, NC_FILE|ND_PARAMS, NULL); + WM_event_add_notifier(C, NC_FILE|ND_FILELIST, NULL); } return OPERATOR_FINISHED; @@ -328,7 +344,7 @@ void FILE_OT_select_bookmark(wmOperatorType *ot) static int bookmark_add_invoke(bContext *C, wmOperator *op, wmEvent *event) { ScrArea *sa= CTX_wm_area(C); - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); struct FSMenu* fsmenu = fsmenu_get(); struct FileSelectParams* params= ED_fileselect_get_params(sfile); @@ -393,7 +409,7 @@ void FILE_OT_delete_bookmark(wmOperatorType *ot) static int loadimages_invoke(bContext *C, wmOperator *op, wmEvent *event) { ScrArea *sa= CTX_wm_area(C); - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); if (sfile->files) { filelist_loadimage_timer(sfile->files); if (filelist_changed(sfile->files)) { @@ -420,31 +436,41 @@ void FILE_OT_loadimages(wmOperatorType *ot) int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my) { FileSelectParams* params; - int numfiles, actfile; + int numfiles, actfile, origfile; if(sfile==NULL || sfile->files==NULL) return 0; - + numfiles = filelist_numfiles(sfile->files); params = ED_fileselect_get_params(sfile); - actfile = find_file_mouse(sfile, ar, mx , my, 0); - - if (params && (actfile >= 0) && (actfile < numfiles) ) { - params->active_file=actfile; - return 1; - } - params->active_file= -1; - return 0; + origfile= params->active_file; + + mx -= ar->winrct.xmin; + my -= ar->winrct.ymin; + + if(BLI_in_rcti(&ar->v2d.mask, mx, my)) { + actfile = find_file_mouse(sfile, ar, mx , my, 0); + + if((actfile >= 0) && (actfile < numfiles)) + params->active_file=actfile; + else + params->active_file= -1; + } + else + params->active_file= -1; + + return (params->active_file != origfile); } static int file_highlight_invoke(bContext *C, wmOperator *op, wmEvent *event) { ARegion *ar= CTX_wm_region(C); - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); - - if( file_hilight_set(sfile, ar, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin)) { - ED_area_tag_redraw(CTX_wm_area(C)); - } + SpaceFile *sfile= CTX_wm_space_file(C); + + if(!file_hilight_set(sfile, ar, event->x, event->y)) + return OPERATOR_CANCELLED; + + ED_area_tag_redraw(CTX_wm_area(C)); return OPERATOR_FINISHED; } @@ -462,7 +488,7 @@ void FILE_OT_highlight(struct wmOperatorType *ot) int file_cancel_exec(bContext *C, wmOperator *unused) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); folderlist_free(sfile->folders_prev); folderlist_free(sfile->folders_next); @@ -487,7 +513,7 @@ void FILE_OT_cancel(struct wmOperatorType *ot) /* sends events now, so things get handled on windowqueue level */ int file_exec(bContext *C, wmOperator *unused) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); char name[FILE_MAX]; if(sfile->op) { @@ -554,7 +580,7 @@ void FILE_OT_exec(struct wmOperatorType *ot) int file_parent_exec(bContext *C, wmOperator *unused) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); if(sfile->params) { if (BLI_has_parent(sfile->params->dir)) { @@ -584,7 +610,7 @@ void FILE_OT_parent(struct wmOperatorType *ot) int file_refresh_exec(bContext *C, wmOperator *unused) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); file_change_dir(sfile); @@ -607,7 +633,7 @@ void FILE_OT_previous(struct wmOperatorType *ot) int file_previous_exec(bContext *C, wmOperator *unused) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); if(sfile->params) { if (!sfile->folders_next) @@ -637,7 +663,7 @@ void FILE_OT_next(struct wmOperatorType *ot) int file_next_exec(bContext *C, wmOperator *unused) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); if(sfile->params) { if (!sfile->folders_next) sfile->folders_next = folderlist_new(); @@ -661,7 +687,7 @@ int file_directory_new_exec(bContext *C, wmOperator *unused) char tmpdir[FILE_MAXFILE]; int i = 1; - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); if(sfile->params) { @@ -690,6 +716,7 @@ void FILE_OT_directory_new(struct wmOperatorType *ot) /* identifiers */ ot->name= "Create New Directory"; ot->idname= "FILE_OT_directory_new"; + ot->description= "Create a new directory"; /* api callbacks */ ot->invoke= WM_operator_confirm; @@ -701,7 +728,7 @@ int file_directory_exec(bContext *C, wmOperator *unused) { char tmpstr[FILE_MAX]; - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); if(sfile->params) { @@ -736,7 +763,7 @@ int file_directory_exec(bContext *C, wmOperator *unused) int file_filename_exec(bContext *C, wmOperator *unused) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); if(sfile->params) { if (file_select_match(sfile, sfile->params->file)) @@ -763,7 +790,7 @@ void FILE_OT_refresh(struct wmOperatorType *ot) int file_hidedot_exec(bContext *C, wmOperator *unused) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); if(sfile->params) { sfile->params->flag ^= FILE_HIDE_DOT; @@ -844,7 +871,7 @@ void FILE_OT_bookmark_toggle(struct wmOperatorType *ot) int file_filenum_exec(bContext *C, wmOperator *op) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); int inc = RNA_int_get(op->ptr, "increment"); if(sfile->params && (inc != 0)) { @@ -870,13 +897,44 @@ void FILE_OT_filenum(struct wmOperatorType *ot) RNA_def_int(ot->srna, "increment", 1, 0, 100, "Increment", "", 0,100); } +int file_rename_exec(bContext *C, wmOperator *op) +{ + ScrArea *sa= CTX_wm_area(C); + SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + + if(sfile->params) { + int idx = sfile->params->active_file; + int numfiles = filelist_numfiles(sfile->files); + if ( (0<=idx) && (idx<numfiles) ) { + struct direntry *file= filelist_file(sfile->files, idx); + file->flags |= EDITING; + } + ED_area_tag_redraw(sa); + } + + return OPERATOR_FINISHED; + +} + +void FILE_OT_rename(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Rename File or Directory"; + ot->idname= "FILE_OT_rename"; + + /* api callbacks */ + ot->exec= file_rename_exec; + ot->poll= ED_operator_file_active; /* <- important, handler is on window level */ + +} + int file_delete_poll(bContext *C) { int poll = ED_operator_file_active(C); - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); struct direntry* file; - if (sfile->params) { + if (sfile && sfile->params) { if (sfile->params->active_file < 0) { poll= 0; } else { @@ -893,7 +951,7 @@ int file_delete_poll(bContext *C) int file_delete_exec(bContext *C, wmOperator *op) { char str[FILE_MAX]; - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); struct direntry* file; diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c index 96366b9f82b..f3c18859fb0 100644 --- a/source/blender/editors/space_file/file_panels.c +++ b/source/blender/editors/space_file/file_panels.c @@ -44,94 +44,150 @@ #include "UI_resources.h" #include "UI_view2d.h" +#include "WM_api.h" +#include "WM_types.h" + #include "file_intern.h" #include "fsmenu.h" #include <string.h> -static void do_file_panel_events(bContext *C, void *arg, int event) +static void file_panel_cb(bContext *C, void *arg_entry, void *arg_unused) { + PointerRNA ptr; + char *entry= (char*)arg_entry; + WM_operator_properties_create(&ptr, "FILE_OT_select_bookmark"); + RNA_string_set(&ptr, "dir", entry); + WM_operator_name_call(C, "FILE_OT_select_bookmark", WM_OP_INVOKE_REGION_WIN, &ptr); + WM_operator_properties_free(&ptr); } -static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory category, int icon, int allow_delete) +static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory category, short *nr, int icon, int allow_delete) { + SpaceFile *sfile= CTX_wm_space_file(C); uiBlock *block; + uiBut *but; + uiLayout *box, *col; struct FSMenu* fsmenu = fsmenu_get(); - int nentries = fsmenu_get_nentries(fsmenu, category); - int i; + char *curdir= (sfile->params)? sfile->params->dir: ""; + int i, nentries = fsmenu_get_nentries(fsmenu, category); + + /* reset each time */ + *nr= -1; + + /* hide if no entries */ + if(nentries == 0) + return; + /* layout */ uiLayoutSetAlignment(pa->layout, UI_LAYOUT_ALIGN_LEFT); - block= uiLayoutFreeBlock(pa->layout); - uiBlockSetHandleFunc(block, do_file_panel_events, NULL); - uiBlockSetEmboss(block, UI_EMBOSSP); - uiBlockBeginAlign(block); + block= uiLayoutGetBlock(pa->layout); + box= uiLayoutBox(pa->layout); + col= uiLayoutColumn(box, 1); + for (i=0; i< nentries;++i) { char dir[FILE_MAX]; char temp[FILE_MAX]; - uiLayout* layout = uiLayoutRow(pa->layout, UI_LAYOUT_ALIGN_LEFT); + uiLayout* layout = uiLayoutRow(col, 0); char *entry = fsmenu_get_entry(fsmenu, category, i); + /* set this list item as active if we have a match */ + if(strcmp(curdir, entry) == 0) + *nr= i; + /* create nice bookmark name, shows last directory in the full path currently */ BLI_strncpy(temp, entry, FILE_MAX); BLI_add_slash(temp); BLI_getlastdir(temp, dir, FILE_MAX); BLI_del_slash(dir); - /* operator shows the short bookmark name, should eventually have tooltip */ - uiItemStringO(layout, dir, icon, "FILE_OT_select_bookmark", "dir", entry); - if (allow_delete && fsmenu_can_save(fsmenu, category, i) ) + if(dir[0] == 0) + BLI_strncpy(dir, entry, FILE_MAX); + + /* create list item */ + but= uiDefIconTextButS(block, LISTROW, 0, icon, dir, 0,0,UI_UNIT_X*10,UI_UNIT_Y, nr, 0, i, 0, 0, entry); + uiButSetFunc(but, file_panel_cb, entry, NULL); + uiButSetFlag(but, UI_ICON_LEFT|UI_TEXT_LEFT); + + /* create delete button */ + if(allow_delete && fsmenu_can_save(fsmenu, category, i)) { + uiBlockSetEmboss(block, UI_EMBOSSN); uiItemIntO(layout, "", ICON_X, "FILE_OT_delete_bookmark", "index", i); + uiBlockSetEmboss(block, UI_EMBOSS); + } } - uiBlockEndAlign(block); } static void file_panel_system(const bContext *C, Panel *pa) { - file_panel_category(C, pa, FS_CATEGORY_SYSTEM, ICON_DISK_DRIVE, 0); + SpaceFile *sfile= CTX_wm_space_file(C); + + if(sfile) + file_panel_category(C, pa, FS_CATEGORY_SYSTEM, &sfile->systemnr, ICON_DISK_DRIVE, 0); } static void file_panel_bookmarks(const bContext *C, Panel *pa) { - file_panel_category(C, pa, FS_CATEGORY_BOOKMARKS, ICON_BOOKMARKS, 1); -} + SpaceFile *sfile= CTX_wm_space_file(C); + uiLayout *row; + + if(sfile) { + row= uiLayoutRow(pa->layout, 0); + uiItemO(row, "Add", ICON_ZOOMIN, "file.add_bookmark"); + uiItemL(row, NULL, 0); + file_panel_category(C, pa, FS_CATEGORY_BOOKMARKS, &sfile->bookmarknr, ICON_BOOKMARKS, 1); + } +} static void file_panel_recent(const bContext *C, Panel *pa) { - file_panel_category(C, pa, FS_CATEGORY_RECENT, ICON_FILE_FOLDER, 0); + SpaceFile *sfile= CTX_wm_space_file(C); + + if(sfile) + file_panel_category(C, pa, FS_CATEGORY_RECENT, &sfile->recentnr, ICON_FILE_FOLDER, 0); } -static void file_panel_operator(const bContext *C, Panel *pa) +static int file_panel_operator_poll(const bContext *C, PanelType *pt) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); - struct wmOperator *op = sfile ? sfile->op : NULL; - uiBlock *block; - int sy; + SpaceFile *sfile= CTX_wm_space_file(C); + return (sfile && sfile->op); +} - block= uiLayoutFreeBlock(pa->layout); - uiBlockSetHandleFunc(block, do_file_panel_events, NULL); +static void file_panel_operator_header(const bContext *C, Panel *pa) +{ + SpaceFile *sfile= CTX_wm_space_file(C); + wmOperator *op= sfile->op; - sy= 0; - if (op) { - uiBlockBeginAlign(block); - RNA_STRUCT_BEGIN(op->ptr, prop) { - if(strcmp(RNA_property_identifier(prop), "rna_type") == 0) - continue; - if(strcmp(RNA_property_identifier(prop), "filename") == 0) - continue; + BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname)); +} - uiItemFullR(pa->layout, NULL, 0, op->ptr, prop, -1, 0, 0, 0, 0); - } - RNA_STRUCT_END; - uiBlockEndAlign(block); +static void file_panel_operator(const bContext *C, Panel *pa) +{ + SpaceFile *sfile= CTX_wm_space_file(C); + wmOperator *op= sfile->op; + int empty= 1; + + RNA_STRUCT_BEGIN(op->ptr, prop) { + if(strcmp(RNA_property_identifier(prop), "rna_type") == 0) + continue; + if(strcmp(RNA_property_identifier(prop), "filename") == 0) + continue; + if(strcmp(RNA_property_identifier(prop), "display") == 0) + continue; + if(strncmp(RNA_property_identifier(prop), "filter", 6) == 0) + continue; + + uiItemFullR(pa->layout, NULL, 0, op->ptr, prop, -1, 0, 0, 0, 0); + empty= 0; } - uiBlockLayoutResolve(C, block, NULL, &sy); - uiEndBlock(C, block); - uiDrawBlock(C, block); -} + RNA_STRUCT_END; + if(empty) + uiItemL(pa->layout, "No properties.", 0); +} void file_panels_register(ARegionType *art) { @@ -158,6 +214,8 @@ void file_panels_register(ARegionType *art) pt= MEM_callocN(sizeof(PanelType), "spacetype file operator properties"); strcpy(pt->idname, "FILE_PT_operator"); strcpy(pt->label, "Operator"); + pt->poll= file_panel_operator_poll; + pt->draw_header= file_panel_operator_header; pt->draw= file_panel_operator; BLI_addtail(&art->paneltypes, pt); } diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c index 6e442c654ca..7ebc8c4338f 100644 --- a/source/blender/editors/space_file/filelist.c +++ b/source/blender/editors/space_file/filelist.c @@ -113,7 +113,6 @@ typedef struct FileList int numfiles; int numfiltered; char dir[FILE_MAX]; - int has_func; short prv_w; short prv_h; short hide_dot; @@ -698,7 +697,6 @@ struct direntry * filelist_file(struct FileList* filelist, int index) return &filelist->filelist[fidx]; } - int filelist_find(struct FileList* filelist, char *file) { int index = -1; @@ -905,9 +903,6 @@ void filelist_swapselect(struct FileList* filelist) void filelist_sort(struct FileList* filelist, short sort) { - struct direntry *file; - int num;/* , act= 0; */ - switch(sort) { case FILE_SORT_ALPHA: qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_name); @@ -922,9 +917,5 @@ void filelist_sort(struct FileList* filelist, short sort) qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_extension); } - file= filelist->filelist; - for(num=0; num<filelist->numfiles; num++, file++) { - file->flags &= ~HILITE; - } filelist_filter(filelist); } diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index 72f97898891..8ee7d3515b5 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -73,6 +73,8 @@ #include "BIF_gl.h" #include "BIF_glutil.h" +#include "RNA_access.h" + #include "UI_interface.h" #include "UI_resources.h" #include "UI_view2d.h" @@ -95,43 +97,71 @@ static int fnmatch(const char *pattern, const char *string, int flags) FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile) { if (!sfile->params) { - ED_fileselect_set_params(sfile, "", NULL, "/", 0, FILE_SHORTDISPLAY, 0, FILE_SORT_ALPHA); + ED_fileselect_set_params(sfile); } return sfile->params; } -short ED_fileselect_set_params(SpaceFile *sfile, const char *title, const char *last_dir, const char *path, - short flag, short display, short filter, short sort) +short ED_fileselect_set_params(SpaceFile *sfile) { char name[FILE_MAX], dir[FILE_MAX], file[FILE_MAX]; FileSelectParams *params; + wmOperator *op = sfile->op; + /* create new parameters if necessary */ if (!sfile->params) { sfile->params= MEM_callocN(sizeof(FileSelectParams), "fileselparams"); + /* set path to most recently opened .blend */ + BLI_strncpy(sfile->params->dir, G.sce, sizeof(sfile->params->dir)); + BLI_split_dirfile(G.sce, dir, file); + BLI_strncpy(sfile->params->file, file, sizeof(sfile->params->file)); + BLI_make_file_string(G.sce, sfile->params->dir, dir, ""); /* XXX needed ? - also solve G.sce */ } params = sfile->params; - params->flag = flag; - params->display = display; - params->filter = filter; - params->sort = sort; - - BLI_strncpy(params->title, title, sizeof(params->title)); - - if(last_dir){ - BLI_strncpy(params->dir, last_dir, sizeof(params->dir)); - } - else { - BLI_strncpy(name, path, sizeof(name)); - BLI_convertstringcode(name, G.sce); - - BLI_split_dirfile(name, dir, file); - BLI_strncpy(params->file, file, sizeof(params->file)); - BLI_strncpy(params->dir, dir, sizeof(params->dir)); - BLI_make_file_string(G.sce, params->dir, dir, ""); /* XXX needed ? - also solve G.sce */ + /* set the parameters from the operator, if it exists */ + if (op) { + BLI_strncpy(params->title, op->type->name, sizeof(params->title)); + params->filter = 0; + params->filter |= RNA_boolean_get(op->ptr, "filter_blender") ? BLENDERFILE : 0; + params->filter |= RNA_boolean_get(op->ptr, "filter_image") ? IMAGEFILE : 0; + params->filter |= RNA_boolean_get(op->ptr, "filter_movie") ? MOVIEFILE : 0; + params->filter |= RNA_boolean_get(op->ptr, "filter_text") ? TEXTFILE : 0; + params->filter |= RNA_boolean_get(op->ptr, "filter_python") ? PYSCRIPTFILE : 0; + params->filter |= RNA_boolean_get(op->ptr, "filter_font") ? FTFONTFILE : 0; + params->filter |= RNA_boolean_get(op->ptr, "filter_sound") ? SOUNDFILE : 0; + params->filter |= RNA_boolean_get(op->ptr, "filter_text") ? TEXTFILE : 0; + params->filter |= RNA_boolean_get(op->ptr, "filter_folder") ? FOLDERFILE : 0; + if (params->filter != 0) + params->flag |= FILE_FILTER; + + params->flag |= FILE_HIDE_DOT; + + if(params->filter & (IMAGEFILE|MOVIEFILE)) + params->display= FILE_IMGDISPLAY; + else + params->display= FILE_SHORTDISPLAY; + + /* if operator has path set, use it, otherwise keep the last */ + if (RNA_property_is_set(op->ptr, "filename")) { + RNA_string_get(op->ptr, "filename", name); + BLI_convertstringcode(name, G.sce); + BLI_split_dirfile(name, dir, file); + BLI_strncpy(params->file, file, sizeof(params->file)); + BLI_make_file_string(G.sce, params->dir, dir, ""); /* XXX needed ? - also solve G.sce */ + } + } else { + /* default values, if no operator */ + params->flag |= FILE_HIDE_DOT; + params->display = FILE_SHORTDISPLAY; + params->filter = 0; + params->sort = FILE_SORT_ALPHA; } + /* new params, refresh file list */ + if(sfile->files) filelist_free(sfile->files); + return 1; } @@ -141,6 +171,20 @@ void ED_fileselect_reset_params(SpaceFile *sfile) sfile->params->title[0] = '\0'; } +int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar) +{ + int numfiles; + + if (layout->flag & FILE_LAYOUT_HOR) { + short width = ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*layout->tile_border_x; + numfiles = width/layout->tile_w + 1; + } else { + short height = ar->v2d.cur.ymax - ar->v2d.cur.ymin - 2*layout->tile_border_y; + numfiles = height/layout->tile_h + 1; + } + + return layout->columns*layout->rows; +} int ED_fileselect_layout_offset(FileLayout* layout, int x, int y) { @@ -153,8 +197,8 @@ int ED_fileselect_layout_offset(FileLayout* layout, int x, int y) offsetx = (x)/(layout->tile_w + 2*layout->tile_border_x); offsety = (y)/(layout->tile_h + 2*layout->tile_border_y); - if (offsetx > layout->columns-1) offsetx = -1 ; - if (offsety > layout->rows-1) offsety = -1 ; + if (offsetx > layout->columns-1) return -1 ; + if (offsety > layout->rows-1) return -1 ; if (layout->flag & FILE_LAYOUT_HOR) active_file = layout->rows*offsetx + offsety; @@ -227,68 +271,78 @@ static void column_widths(struct FileList* files, struct FileLayout* layout) void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar) { - FileSelectParams* params = ED_fileselect_get_params(sfile); + FileSelectParams *params = ED_fileselect_get_params(sfile); + FileLayout *layout=0; View2D *v2d= &ar->v2d; int maxlen = 0; - int numfiles = filelist_numfiles(sfile->files); - int textheight = file_font_pointsize(); + int numfiles; + int textheight; if (sfile->layout == 0) { sfile->layout = MEM_callocN(sizeof(struct FileLayout), "file_layout"); - } + sfile->layout->dirty = 1; + } + + if (!sfile->layout->dirty) return; + + numfiles = filelist_numfiles(sfile->files); + textheight = file_font_pointsize(); + layout = sfile->layout; + if (params->display == FILE_IMGDISPLAY) { - sfile->layout->prv_w = 96; - sfile->layout->prv_h = 96; - sfile->layout->tile_border_x = 6; - sfile->layout->tile_border_y = 6; - sfile->layout->prv_border_x = 6; - sfile->layout->prv_border_y = 6; - sfile->layout->tile_w = sfile->layout->prv_w + 2*sfile->layout->prv_border_x; - sfile->layout->tile_h = sfile->layout->prv_h + 2*sfile->layout->prv_border_y + textheight; - sfile->layout->width= (v2d->cur.xmax - v2d->cur.xmin - 2*sfile->layout->tile_border_x); - sfile->layout->columns= sfile->layout->width / (sfile->layout->tile_w + 2*sfile->layout->tile_border_x); - if(sfile->layout->columns > 0) - sfile->layout->rows= numfiles/sfile->layout->columns + 1; // XXX dirty, modulo is zero + layout->prv_w = 96; + layout->prv_h = 96; + layout->tile_border_x = 6; + layout->tile_border_y = 6; + layout->prv_border_x = 6; + layout->prv_border_y = 6; + layout->tile_w = layout->prv_w + 2*layout->prv_border_x; + layout->tile_h = layout->prv_h + 2*layout->prv_border_y + textheight; + layout->width= (v2d->cur.xmax - v2d->cur.xmin - 2*layout->tile_border_x); + layout->columns= layout->width / (layout->tile_w + 2*layout->tile_border_x); + if(layout->columns > 0) + layout->rows= numfiles/layout->columns + 1; // XXX dirty, modulo is zero else { - sfile->layout->columns = 1; - sfile->layout->rows= numfiles + 1; // XXX dirty, modulo is zero + layout->columns = 1; + layout->rows= numfiles + 1; // XXX dirty, modulo is zero } - sfile->layout->height= sfile->layout->rows*(sfile->layout->tile_h+2*sfile->layout->tile_border_y) + sfile->layout->tile_border_y*2; - sfile->layout->flag = FILE_LAYOUT_VER; + layout->height= sfile->layout->rows*(layout->tile_h+2*layout->tile_border_y) + layout->tile_border_y*2; + layout->flag = FILE_LAYOUT_VER; } else { - sfile->layout->prv_w = 0; - sfile->layout->prv_h = 0; - sfile->layout->tile_border_x = 8; - sfile->layout->tile_border_y = 2; - sfile->layout->prv_border_x = 0; - sfile->layout->prv_border_y = 0; - sfile->layout->tile_h = textheight*3/2; - sfile->layout->height= v2d->cur.ymax - v2d->cur.ymin; - sfile->layout->rows = sfile->layout->height / (sfile->layout->tile_h + 2*sfile->layout->tile_border_y);; + layout->prv_w = 0; + layout->prv_h = 0; + layout->tile_border_x = 8; + layout->tile_border_y = 2; + layout->prv_border_x = 0; + layout->prv_border_y = 0; + layout->tile_h = textheight*3/2; + layout->height= v2d->cur.ymax - v2d->cur.ymin - 2*layout->tile_border_y; + layout->rows = layout->height / (layout->tile_h + 2*layout->tile_border_y); - column_widths(sfile->files, sfile->layout); + column_widths(sfile->files, layout); if (params->display == FILE_SHORTDISPLAY) { - maxlen = sfile->layout->column_widths[COLUMN_NAME] + - sfile->layout->column_widths[COLUMN_SIZE]; + maxlen = layout->column_widths[COLUMN_NAME] + + layout->column_widths[COLUMN_SIZE]; maxlen += 20+2*10; // for icon and space between columns } else { - maxlen = sfile->layout->column_widths[COLUMN_NAME] + - sfile->layout->column_widths[COLUMN_DATE] + - sfile->layout->column_widths[COLUMN_TIME] + - sfile->layout->column_widths[COLUMN_SIZE]; + maxlen = layout->column_widths[COLUMN_NAME] + + layout->column_widths[COLUMN_DATE] + + layout->column_widths[COLUMN_TIME] + + layout->column_widths[COLUMN_SIZE]; /* XXX add mode1, mode2, mode3, owner columns for non-windows platforms */ maxlen += 20+4*10; // for icon and space between columns } - sfile->layout->tile_w = maxlen + 40; - if(sfile->layout->rows > 0) - sfile->layout->columns = numfiles/sfile->layout->rows + 1; // XXX dirty, modulo is zero + layout->tile_w = maxlen + 40; + if(layout->rows > 0) + layout->columns = numfiles/layout->rows + 1; // XXX dirty, modulo is zero else { - sfile->layout->rows = 1; - sfile->layout->columns = numfiles + 1; // XXX dirty, modulo is zero + layout->rows = 1; + layout->columns = numfiles + 1; // XXX dirty, modulo is zero } - sfile->layout->width = sfile->layout->columns * (sfile->layout->tile_w + 2*sfile->layout->tile_border_x) + sfile->layout->tile_border_x*2; - sfile->layout->flag = FILE_LAYOUT_HOR; - } + layout->width = sfile->layout->columns * (layout->tile_w + 2*layout->tile_border_x) + layout->tile_border_x*2; + layout->flag = FILE_LAYOUT_HOR; + } + layout->dirty= 0; } FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar) @@ -341,7 +395,7 @@ int file_select_match(struct SpaceFile *sfile, const char *pattern) void autocomplete_directory(struct bContext *C, char *str, void *arg_v) { char tmp[FILE_MAX]; - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); /* search if str matches the beginning of name */ if(str[0] && sfile->files) { diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c index a87ad4c4fd8..b45b57c6be9 100644 --- a/source/blender/editors/space_file/fsmenu.c +++ b/source/blender/editors/space_file/fsmenu.c @@ -34,9 +34,12 @@ #include "MEM_guardedalloc.h" +#include "DNA_space_types.h" /* FILE_MAX */ + #include "BLI_blenlib.h" #include "BLI_linklist.h" #include "BLI_dynstr.h" +#include "BLI_string.h" #ifdef WIN32 #include <windows.h> /* need to include windows.h so _WIN32_IE is defined */ @@ -48,11 +51,17 @@ #endif #ifdef __APPLE__ +/* XXX BIG WARNING: carbon.h can not be included in blender code, it conflicts with struct ID */ +#define ID ID_ #include <CoreServices/CoreServices.h> #include "BKE_utildefines.h" #endif +#ifdef __linux__ +#include <mntent.h> +#endif + #include "fsmenu.h" /* include ourselves */ @@ -245,7 +254,7 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) FSMenuCategory category = FS_CATEGORY_BOOKMARKS; FILE *fp; - #ifdef WIN32 +#ifdef WIN32 /* Add the drive names to the listing */ { __int64 tmp; @@ -272,8 +281,7 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) SHGetSpecialFolderPath(0, folder, CSIDL_DESKTOPDIRECTORY, 0); fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, folder, 1, 0); } -#endif - +#else #ifdef __APPLE__ { OSErr err=noErr; @@ -293,6 +301,61 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, (char *)path, 1, 0); } } +#else + /* unix */ + { + char dir[FILE_MAXDIR]; + char *home= BLI_gethome(); + + if(home) { + BLI_snprintf(dir, FILE_MAXDIR, "%s/", home); + fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, dir, 1, 0); + BLI_snprintf(dir, FILE_MAXDIR, "%s/Desktop/", home); + if (BLI_exists(dir)) { + fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, dir, 1, 0); + } + } + + { + int found= 0; +#ifdef __linux__ + /* loop over mount points */ + struct mntent *mnt; + FILE *fp; + int len; + + fp = setmntent (MOUNTED, "r"); + if (fp == NULL) { + fprintf(stderr, "could not get a list of mounted filesystemts\n"); + } + else { + while ((mnt = getmntent (fp))) { + /* not sure if this is right, but seems to give the relevant mnts */ + if(strncmp(mnt->mnt_fsname, "/dev", 4)) + continue; + + len= strlen(mnt->mnt_dir); + if(len && mnt->mnt_dir[len-1] != '/') { + BLI_snprintf(dir, FILE_MAXDIR, "%s/", mnt->mnt_dir); + fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, dir, 1, 0); + } + else + fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, mnt->mnt_dir, 1, 0); + + found= 1; + } + if (endmntent (fp) == 0) { + fprintf(stderr, "could not close the list of mounted filesystemts\n"); + } + } +#endif + + /* fallback */ + if(!found) + fsmenu_insert_entry(fsmenu, FS_CATEGORY_SYSTEM, "/", 1, 0); + } + } +#endif #endif fp = fopen(filename, "r"); @@ -310,7 +373,9 @@ void fsmenu_read_file(struct FSMenu* fsmenu, const char *filename) if (line[len-1] == '\n') { line[len-1] = '\0'; } - fsmenu_insert_entry(fsmenu, category, line, 0, 1); + if (BLI_exist(line)) { + fsmenu_insert_entry(fsmenu, category, line, 0, 1); + } } } } diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index 5af79eb2800..ea640eab090 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -106,7 +106,7 @@ static SpaceLink *file_new(const bContext *C) ar->regiontype= RGN_TYPE_WINDOW; ar->v2d.scroll = (V2D_SCROLL_RIGHT | V2D_SCROLL_BOTTOM); ar->v2d.align = (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y); - ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT); + ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT); ar->v2d.keeptot= V2D_KEEPTOT_STRICT; ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f; @@ -153,6 +153,7 @@ static void file_free(SpaceLink *sl) /* spacetype; init callback, area size changes, screen set, etc */ static void file_init(struct wmWindowManager *wm, ScrArea *sa) { + printf("file_init\n"); } @@ -183,7 +184,7 @@ static SpaceLink *file_duplicate(SpaceLink *sl) static void file_refresh(const bContext *C, ScrArea *sa) { - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); FileSelectParams *params = ED_fileselect_get_params(sfile); if (!sfile->folders_prev) @@ -194,12 +195,15 @@ static void file_refresh(const bContext *C, ScrArea *sa) params->active_file = -1; // added this so it opens nicer (ton) } filelist_hidedot(sfile->files, params->flag & FILE_HIDE_DOT); + filelist_setfilter(sfile->files, params->flag & FILE_FILTER ? params->filter : 0); if (filelist_empty(sfile->files)) { filelist_readdir(sfile->files); } - filelist_setfilter(sfile->files, params->flag & FILE_FILTER ? params->filter : 0); if(params->sort!=FILE_SORT_NONE) filelist_sort(sfile->files, params->sort); + + if (sfile->layout) sfile->layout->dirty= 1; + } static void file_listener(ScrArea *sa, wmNotifier *wmn) @@ -241,10 +245,27 @@ static void file_main_area_init(wmWindowManager *wm, ARegion *ar) } +static void file_main_area_listener(ARegion *ar, wmNotifier *wmn) +{ + /* context changes */ + switch(wmn->category) { + case NC_FILE: + switch (wmn->data) { + case ND_FILELIST: + ED_region_tag_redraw(ar); + break; + case ND_PARAMS: + ED_region_tag_redraw(ar); + break; + } + break; + } +} + static void file_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ - SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); + SpaceFile *sfile= CTX_wm_space_file(C); FileSelectParams *params = ED_fileselect_get_params(sfile); FileLayout *layout=NULL; @@ -252,6 +273,10 @@ static void file_main_area_draw(const bContext *C, ARegion *ar) View2DScrollers *scrollers; float col[3]; + /* Needed, because filelist is not initialized on loading */ + if (!sfile->files || filelist_empty(sfile->files)) + file_refresh(C, NULL); + layout = ED_fileselect_get_layout(sfile, ar); /* clear and setup matrix */ @@ -282,7 +307,7 @@ static void file_main_area_draw(const bContext *C, ARegion *ar) /* on first read, find active file */ if (params->active_file == -1) { wmEvent *event= CTX_wm_window(C)->eventstate; - file_hilight_set(sfile, ar, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin); + file_hilight_set(sfile, ar, event->x, event->y); } if (params->display == FILE_IMGDISPLAY) { @@ -323,6 +348,7 @@ void file_operatortypes(void) WM_operatortype_append(FILE_OT_filenum); WM_operatortype_append(FILE_OT_directory_new); WM_operatortype_append(FILE_OT_delete); + WM_operatortype_append(FILE_OT_rename); } /* NOTE: do not add .blend file reading on this level */ @@ -337,7 +363,7 @@ void file_keymap(struct wmWindowManager *wm) WM_keymap_add_item(keymap, "FILE_OT_hidedot", HKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_previous", BACKSPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_next", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0); - /* WM_keymap_add_item(keymap, "FILE_OT_directory_new", IKEY, KM_PRESS, 0, 0); */ /* XXX needs button */ + WM_keymap_add_item(keymap, "FILE_OT_directory_new", IKEY, KM_PRESS, 0, 0); /* XXX needs button */ WM_keymap_add_item(keymap, "FILE_OT_delete", XKEY, KM_PRESS, 0, 0); /* keys for main area */ @@ -345,6 +371,7 @@ void file_keymap(struct wmWindowManager *wm) WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_select_border", BKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "FILE_OT_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "FILE_OT_highlight", MOUSEMOVE, KM_ANY, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_loadimages", TIMER1, KM_ANY, KM_ANY, 0); kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0); @@ -391,7 +418,7 @@ static void file_channel_area_init(wmWindowManager *wm, ARegion *ar) static void file_channel_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL, -1); } static void file_channel_area_listener(ARegion *ar, wmNotifier *wmn) @@ -444,10 +471,19 @@ static void file_ui_area_draw(const bContext *C, ARegion *ar) UI_view2d_view_restore(C); } -//static void file_main_area_listener(ARegion *ar, wmNotifier *wmn) -//{ +static void file_ui_area_listener(ARegion *ar, wmNotifier *wmn) +{ /* context changes */ -//} + switch(wmn->category) { + case NC_FILE: + switch (wmn->data) { + case ND_FILELIST: + ED_region_tag_redraw(ar); + break; + } + break; + } +} /* only called once, from space/spacetypes.c */ void ED_spacetype_file(void) @@ -471,7 +507,7 @@ void ED_spacetype_file(void) art->regionid = RGN_TYPE_WINDOW; art->init= file_main_area_init; art->draw= file_main_area_draw; - // art->listener= file_main_area_listener; + art->listener= file_main_area_listener; art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D; BLI_addhead(&st->regiontypes, art); @@ -490,6 +526,7 @@ void ED_spacetype_file(void) art->regionid = RGN_TYPE_UI; art->minsizey= 60; art->keymapflag= ED_KEYMAP_UI; + art->listener= file_ui_area_listener; art->init= file_ui_area_init; art->draw= file_ui_area_draw; BLI_addhead(&st->regiontypes, art); @@ -498,7 +535,7 @@ void ED_spacetype_file(void) art= MEM_callocN(sizeof(ARegionType), "spacetype file region"); art->regionid = RGN_TYPE_CHANNELS; art->minsizex= 240; - art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D; + art->keymapflag= ED_KEYMAP_UI; art->listener= file_channel_area_listener; art->init= file_channel_area_init; art->draw= file_channel_area_draw; diff --git a/source/blender/editors/space_file/writeimage.c b/source/blender/editors/space_file/writeimage.c index ac15ed93ad0..994f38320f2 100644 --- a/source/blender/editors/space_file/writeimage.c +++ b/source/blender/editors/space_file/writeimage.c @@ -53,7 +53,7 @@ /* XXX */ static void error() {} -static void waitcursor() {} +static void waitcursor(int val) {} static void activate_fileselect() {} static int saveover() {return 0;} /* XXX */ diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index 0e48d56ac90..82babb70c53 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -242,7 +242,7 @@ static void driver_update_flags_cb (bContext *C, void *fcu_v, void *dummy_v) /* drivers panel poll */ static int graph_panel_drivers_poll(const bContext *C, PanelType *pt) { - SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C); + SpaceIpo *sipo= CTX_wm_space_graph(C); if(sipo->mode != SIPO_MODE_DRIVERS) return 0; diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c index f8f613223db..f6915c4db01 100644 --- a/source/blender/editors/space_graph/graph_draw.c +++ b/source/blender/editors/space_graph/graph_draw.c @@ -51,7 +51,9 @@ #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" +#include "DNA_meta_types.h" #include "DNA_object_types.h" +#include "DNA_particle_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" @@ -722,24 +724,6 @@ static void draw_fcurve_curve_bezts (FCurve *fcu, View2D *v2d, View2DGrid *grid) glEnd(); } -#if 0 -static void draw_ipokey(SpaceIpo *sipo, ARegion *ar) -{ - View2D *v2d= &ar->v2d; - IpoKey *ik; - - glBegin(GL_LINES); - for (ik= sipo->ipokey.first; ik; ik= ik->next) { - if (ik->flag & SELECT) glColor3ub(0xFF, 0xFF, 0x99); - else glColor3ub(0xAA, 0xAA, 0x55); - - glVertex2f(ik->val, v2d->cur.ymin); - glVertex2f(ik->val, v2d->cur.ymax); - } - glEnd(); -} -#endif - /* Public Curve-Drawing API ---------------- */ /* Draw the 'ghost' F-Curves (i.e. snapshots of the curve) */ @@ -854,26 +838,30 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri glDisable(GL_BLEND); } - /* 2) draw handles and vertices as appropriate based on active */ - if (fcurve_needs_draw_fmodifier_controls(fcu, fcm)) { - /* only draw controls if this is the active modifier */ - if ((fcu->flag & FCURVE_ACTIVE) && (fcm)) { - switch (fcm->type) { - case FMODIFIER_TYPE_ENVELOPE: /* envelope */ - draw_fcurve_modifier_controls_envelope(fcu, fcm, &ar->v2d); - break; + /* 2) draw handles and vertices as appropriate based on active + * - if the option to only show controls if the F-Curve is selected is enabled, we must obey this + */ + if (!(sipo->flag & SIPO_SELCUVERTSONLY) || (fcu->flag & FCURVE_SELECTED)) { + if (fcurve_needs_draw_fmodifier_controls(fcu, fcm)) { + /* only draw controls if this is the active modifier */ + if ((fcu->flag & FCURVE_ACTIVE) && (fcm)) { + switch (fcm->type) { + case FMODIFIER_TYPE_ENVELOPE: /* envelope */ + draw_fcurve_modifier_controls_envelope(fcu, fcm, &ar->v2d); + break; + } } } - } - else if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) { - if (fcu->bezt) { - /* only draw handles/vertices on keyframes */ - draw_fcurve_handles(sipo, ar, fcu); - draw_fcurve_vertices(sipo, ar, fcu); - } - else { - /* samples: should we only draw two indicators at either end as indicators? */ - draw_fcurve_samples(sipo, ar, fcu); + else if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) { + if (fcu->bezt) { + /* only draw handles/vertices on keyframes */ + draw_fcurve_handles(sipo, ar, fcu); + draw_fcurve_vertices(sipo, ar, fcu); + } + else { + /* samples: should we only draw two indicators at either end as indicators? */ + draw_fcurve_samples(sipo, ar, fcu); + } } } @@ -1038,6 +1026,22 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) strcpy(name, "Materials"); } break; + case ANIMTYPE_FILLPARTD: /* object particles (dopesheet) expand widget */ + { + Object *ob = (Object *)ale->data; + + group = 4; + indent = 1; + special = ICON_PARTICLE_DATA; + + if (FILTER_PART_OBJC(ob)) + expand = ICON_TRIA_DOWN; + else + expand = ICON_TRIA_RIGHT; + + strcpy(name, "Particles"); + } + break; case ANIMTYPE_DSMAT: /* single material (dopesheet) expand widget */ @@ -1138,6 +1142,39 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) strcpy(name, wo->id.name+2); } break; + case ANIMTYPE_DSPART: /* particle (dopesheet) expand widget */ + { + ParticleSettings *part= (ParticleSettings*)ale->data; + + group = 0; + indent = 0; + special = ICON_PARTICLE_DATA; + offset = 21; + + if (FILTER_PART_OBJD(part)) + expand = ICON_TRIA_DOWN; + else + expand = ICON_TRIA_RIGHT; + + strcpy(name, part->id.name+2); + } + break; + case ANIMTYPE_DSMBALL: /* metaball (dopesheet) expand widget */ + { + MetaBall *mb = (MetaBall *)ale->data; + + group = 4; + indent = 1; + special = ICON_META_DATA; + + if (FILTER_MBALL_OBJD(mb)) + expand = ICON_TRIA_DOWN; + else + expand = ICON_TRIA_RIGHT; + + strcpy(name, mb->id.name+2); + } + break; case ANIMTYPE_GROUP: /* action group */ @@ -1196,8 +1233,8 @@ void graph_draw_channel_names(bAnimContext *ac, SpaceIpo *sipo, ARegion *ar) grp= fcu->grp; if (ale->id) { - /* special exception for materials */ - if (GS(ale->id->name) == ID_MA) { + /* special exception for materials and particles */ + if (ELEM(GS(ale->id->name),ID_MA,ID_PA)) { offset= 21; indent= 1; } diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index 24c7a0c5c23..37389b32b3a 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -1386,7 +1386,7 @@ static int graphkeys_euler_filter_exec (bContext *C, wmOperator *op) */ /* step 1: extract only the rotation f-curves */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { diff --git a/source/blender/editors/space_graph/graph_header.c b/source/blender/editors/space_graph/graph_header.c index eeede3ae95b..2c9017db649 100644 --- a/source/blender/editors/space_graph/graph_header.c +++ b/source/blender/editors/space_graph/graph_header.c @@ -69,7 +69,7 @@ static void graph_viewmenu(bContext *C, uiLayout *layout, void *arg_unused) { bScreen *sc= CTX_wm_screen(C); ScrArea *sa= CTX_wm_area(C); - SpaceIpo *sipo= (SpaceIpo*)CTX_wm_space_data(C); + SpaceIpo *sipo= CTX_wm_space_graph(C); PointerRNA spaceptr; /* retrieve state */ @@ -87,6 +87,7 @@ static void graph_viewmenu(bContext *C, uiLayout *layout, void *arg_unused) else uiItemO(layout, "Show Handles", ICON_CHECKBOX_HLT, "GRAPH_OT_handles_view_toggle"); + uiItemR(layout, NULL, 0, &spaceptr, "only_selected_curves_handles", 0, 0, 0); uiItemR(layout, NULL, 0, &spaceptr, "automerge_keyframes", 0, 0, 0); if (sipo->flag & SIPO_DRAWTIME) @@ -157,6 +158,7 @@ static void graph_edit_transformmenu(bContext *C, uiLayout *layout, void *arg_un static void graph_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "GRAPH_OT_snap", "type", GRAPHKEYS_SNAP_CFRA); uiItemEnumO(layout, NULL, 0, "GRAPH_OT_snap", "type", GRAPHKEYS_SNAP_NEAREST_FRAME); uiItemEnumO(layout, NULL, 0, "GRAPH_OT_snap", "type", GRAPHKEYS_SNAP_NEAREST_SECOND); @@ -165,6 +167,7 @@ static void graph_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused) static void graph_edit_mirrormenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "GRAPH_OT_mirror", "type", GRAPHKEYS_MIRROR_CFRA); uiItemEnumO(layout, NULL, 0, "GRAPH_OT_mirror", "type", GRAPHKEYS_MIRROR_YAXIS); uiItemEnumO(layout, NULL, 0, "GRAPH_OT_mirror", "type", GRAPHKEYS_MIRROR_XAXIS); @@ -173,6 +176,7 @@ static void graph_edit_mirrormenu(bContext *C, uiLayout *layout, void *arg_unuse static void graph_edit_handlesmenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "GRAPH_OT_handle_type", "type", HD_FREE); uiItemEnumO(layout, NULL, 0, "GRAPH_OT_handle_type", "type", HD_AUTO); uiItemEnumO(layout, NULL, 0, "GRAPH_OT_handle_type", "type", HD_VECT); @@ -182,6 +186,7 @@ static void graph_edit_handlesmenu(bContext *C, uiLayout *layout, void *arg_unus static void graph_edit_ipomenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "GRAPH_OT_interpolation_type", "type", BEZT_IPO_CONST); uiItemEnumO(layout, NULL, 0, "GRAPH_OT_interpolation_type", "type", BEZT_IPO_LIN); uiItemEnumO(layout, NULL, 0, "GRAPH_OT_interpolation_type", "type", BEZT_IPO_BEZ); @@ -189,6 +194,7 @@ static void graph_edit_ipomenu(bContext *C, uiLayout *layout, void *arg_unused) static void graph_edit_expomenu(bContext *C, uiLayout *layout, void *arg_unused) { + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT); // xxx? uiItemEnumO(layout, NULL, 0, "GRAPH_OT_extrapolation_type", "type", FCURVE_EXTRAPOLATE_CONSTANT); uiItemEnumO(layout, NULL, 0, "GRAPH_OT_extrapolation_type", "type", FCURVE_EXTRAPOLATE_LINEAR); } @@ -251,7 +257,7 @@ static void do_graph_buttons(bContext *C, void *arg, int event) void graph_header_buttons(const bContext *C, ARegion *ar) { ScrArea *sa= CTX_wm_area(C); - SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C); + SpaceIpo *sipo= CTX_wm_space_graph(C); uiBlock *block; int xco, yco= 3; @@ -304,21 +310,16 @@ void graph_header_buttons(const bContext *C, ARegion *ar) uiDefIconButBitI(block, TOGN, ADS_FILTER_NOLAM, B_REDR, ICON_LAMP_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display Lamps"); uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCAM, B_REDR, ICON_CAMERA_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display Cameras"); uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCUR, B_REDR, ICON_CURVE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display Curves"); + uiDefIconButBitI(block, TOGN, ADS_FILTER_NOMBA, B_REDR, ICON_META_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display MetaBalls"); + uiDefIconButBitI(block, TOGN, ADS_FILTER_NOPART, B_REDR, ICON_PARTICLE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(sipo->ads->filterflag), 0, 0, 0, 0, "Display Particles"); uiBlockEndAlign(block); - xco += 15; + xco += 30; } else { // XXX this case shouldn't happen at all... for now, just pad out same amount of space - xco += 6*XIC + 15; + xco += 10*XIC + 30; } - /* copy + paste */ - uiBlockBeginAlign(block); - uiDefIconButO(block, BUT, "GRAPH_OT_copy", WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco+=XIC,yco,XIC,YIC, "Copies the selected keyframes from the selected channel(s) to the buffer"); - uiDefIconButO(block, BUT, "GRAPH_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEDOWN, xco+=XIC,yco,XIC,YIC, "Pastes the keyframes from the buffer"); - uiBlockEndAlign(block); - xco += (XIC + 8); - /* auto-snap selector */ if (sipo->flag & SIPO_DRAWTIME) { uiDefButS(block, MENU, B_REDR, @@ -334,6 +335,13 @@ void graph_header_buttons(const bContext *C, ARegion *ar) } xco += 98; + /* copy + paste */ + uiBlockBeginAlign(block); + uiDefIconButO(block, BUT, "GRAPH_OT_copy", WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco+=XIC,yco,XIC,YIC, "Copies the selected keyframes from the selected channel(s) to the buffer"); + uiDefIconButO(block, BUT, "GRAPH_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEDOWN, xco+=XIC,yco,XIC,YIC, "Pastes the keyframes from the buffer"); + uiBlockEndAlign(block); + xco += (XIC + 8); + /* ghost curves */ // XXX these icons need to be changed if (sipo->ghostCurves.first) diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c index 68f4db555f8..fc4c05915c9 100644 --- a/source/blender/editors/space_graph/graph_ops.c +++ b/source/blender/editors/space_graph/graph_ops.c @@ -68,7 +68,7 @@ static int view_toggle_handles_exec (bContext *C, wmOperator *op) { - SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C); + SpaceIpo *sipo= CTX_wm_space_graph(C); ARegion *ar= CTX_wm_region(C); if (sipo == NULL) diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c index c4885d095ed..43f35862315 100644 --- a/source/blender/editors/space_graph/graph_select.c +++ b/source/blender/editors/space_graph/graph_select.c @@ -567,8 +567,13 @@ static short findnearest_fcurve_vert (bAnimContext *ac, int mval[2], FCurve **fc *fcurve= 0; *bezt= 0; - /* get curves to search through */ + /* get curves to search through + * - if the option to only show keyframes that belong to selected F-Curves is enabled, + * include the 'only selected' flag... + */ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + if (sipo->flag & SIPO_SELCUVERTSONLY) + filter |= ANIMFILTER_SEL; ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -718,7 +723,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s else { BeztEditFunc select_cb; BeztEditData bed; - + /* initialise keyframe editing data */ memset(&bed, 0, sizeof(BeztEditData)); diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c index c36d790f0be..0390586951b 100644 --- a/source/blender/editors/space_graph/space_graph.c +++ b/source/blender/editors/space_graph/space_graph.c @@ -69,20 +69,20 @@ ARegion *graph_has_buttons_region(ScrArea *sa) ARegion *ar, *arnew; for (ar= sa->regionbase.first; ar; ar= ar->next) { - if(ar->regiontype==RGN_TYPE_UI) + if (ar->regiontype==RGN_TYPE_UI) return ar; } - /* add subdiv level; after main window */ + /* add subdiv level; after main */ for (ar= sa->regionbase.first; ar; ar= ar->next) { - if(ar->regiontype==RGN_TYPE_WINDOW) + if (ar->regiontype==RGN_TYPE_WINDOW) break; } /* is error! */ - if(ar==NULL) return NULL; + if (ar==NULL) return NULL; - arnew= MEM_callocN(sizeof(ARegion), "buttons for nla"); + arnew= MEM_callocN(sizeof(ARegion), "buttons for graph"); BLI_insertlinkafter(&sa->regionbase, ar, arnew); arnew->regiontype= RGN_TYPE_UI; @@ -217,7 +217,7 @@ static void graph_main_area_init(wmWindowManager *wm, ARegion *ar) static void graph_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ - SpaceIpo *sipo= (SpaceIpo*)CTX_wm_space_data(C); + SpaceIpo *sipo= CTX_wm_space_graph(C); bAnimContext ac; View2D *v2d= &ar->v2d; View2DGrid *grid; @@ -294,7 +294,7 @@ static void graph_channel_area_init(wmWindowManager *wm, ARegion *ar) static void graph_channel_area_draw(const bContext *C, ARegion *ar) { - SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C); + SpaceIpo *sipo= CTX_wm_space_graph(C); bAnimContext ac; View2D *v2d= &ar->v2d; View2DScrollers *scrollers; @@ -362,7 +362,7 @@ static void graph_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void graph_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL, -1); } static void graph_region_listener(ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index 2294c9e73ce..4dcaa96caf7 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -127,7 +127,7 @@ static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block static void do_image_panel_events(bContext *C, void *arg, int event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); switch(event) { @@ -234,7 +234,7 @@ static void image_transform_but_attr(SpaceImage *sima, int *imx, int *imy, int * /* is used for both read and write... */ static void image_editvertex_buts(const bContext *C, uiBlock *block) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Object *obedit= CTX_data_edit_object(C); static float ocent[2]; float cent[2]= {0.0, 0.0}; @@ -347,7 +347,7 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block) /* is used for both read and write... */ static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); static float ocent[2]; int imx= 256, imy= 256; int step, digits; @@ -386,7 +386,7 @@ static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block #if 0 static void image_panel_view_properties(const bContext *C, Panel *pa) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); Object *obedit= CTX_data_edit_object(C); uiBlock *block; @@ -448,7 +448,7 @@ void brush_buttons(const bContext *C, uiBlock *block, short fromsima, int evt_del, int evt_keepdata, int evt_texbrowse, int evt_texdel) { -// SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); +// SpaceImage *sima= CTX_wm_space_image(C); ToolSettings *settings= CTX_data_tool_settings(C); Brush *brush= settings->imapaint.brush; ID *id; @@ -565,14 +565,14 @@ void brush_buttons(const bContext *C, uiBlock *block, short fromsima, static int image_panel_paint_poll(const bContext *C, PanelType *pt) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); return (sima->image && (sima->flag & SI_DRAWTOOL)); } static void image_panel_paintcolor(const bContext *C, Panel *pa) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ToolSettings *settings= CTX_data_tool_settings(C); Brush *brush= settings->imapaint.brush; uiBlock *block; @@ -591,7 +591,7 @@ static void image_panel_paintcolor(const bContext *C, Panel *pa) static void image_panel_paint(const bContext *C, Panel *pa) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); uiBlock *block; if(!sima->image || (sima->flag & SI_DRAWTOOL)==0) @@ -605,7 +605,7 @@ static void image_panel_paint(const bContext *C, Panel *pa) static void image_panel_curves_reset(bContext *C, void *cumap_v, void *ibuf_v) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); CurveMapping *cumap = cumap_v; int a; @@ -625,7 +625,7 @@ static void image_panel_curves_reset(bContext *C, void *cumap_v, void *ibuf_v) static void image_panel_curves(const bContext *C, Panel *pa) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ImBuf *ibuf; uiBlock *block; uiBut *bt; @@ -1201,7 +1201,7 @@ void ED_image_uiblock_panel(const bContext *C, uiBlock *block, Image **ima_pp, I short redraw, short imagechanged) { Scene *scene= CTX_data_scene(C); - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Image *ima= *ima_pp; uiBut *but; char str[128], *strp; @@ -1397,7 +1397,7 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser static void image_panel_properties(const bContext *C, Panel *pa) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); uiBlock *block; block= uiLayoutFreeBlock(pa->layout); diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index da1f050cfd3..ff25a2635d2 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -150,8 +150,11 @@ static void draw_render_info(Image *ima, ARegion *ar) /* clear header rect */ UI_GetThemeColor3fv(TH_BACK, colf); - glColor3f(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glColor4f(colf[0]+0.1f, colf[1]+0.1f, colf[2]+0.1f, 0.5f); glRecti(rect.xmin, rect.ymin, rect.xmax, rect.ymax+1); + glDisable(GL_BLEND); UI_ThemeColor(TH_TEXT_HI); diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c index e4cd5c77703..3e15ae1f1f5 100644 --- a/source/blender/editors/space_image/image_header.c +++ b/source/blender/editors/space_image/image_header.c @@ -417,7 +417,7 @@ static void do_image_buttons(bContext *C, void *arg, int event) static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Object *obedit= CTX_data_edit_object(C); uiPopupMenu *pup; uiLayout *layout; diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index fd37020c3b4..d9f02a35142 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -109,7 +109,7 @@ static void sima_zoom_set_factor(SpaceImage *sima, ARegion *ar, float zoomfac) static int space_image_poll(bContext *C) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); if(sima && sima->spacetype==SPACE_IMAGE) if(ED_space_image_buffer(sima)) return 1; @@ -119,7 +119,7 @@ static int space_image_poll(bContext *C) static int space_image_file_exists_poll(bContext *C) { if(space_image_poll(C)) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ImBuf *ibuf= ED_space_image_buffer(sima); if(ibuf && BLI_exists(ibuf->name) && BLI_is_writable(ibuf->name)) @@ -131,10 +131,10 @@ static int space_image_file_exists_poll(bContext *C) int space_image_main_area_poll(bContext *C) { - SpaceLink *slink= CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); // XXX ARegion *ar= CTX_wm_region(C); - if(slink && (slink->spacetype == SPACE_IMAGE)) + if(sima) return 1; // XXX (ar && ar->type->regionid == RGN_TYPE_WINDOW); return 0; @@ -149,7 +149,7 @@ typedef struct ViewPanData { static void view_pan_init(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ViewPanData *vpd; op->customdata= vpd= MEM_callocN(sizeof(ViewPanData), "ImageViewPanData"); @@ -165,7 +165,7 @@ static void view_pan_init(bContext *C, wmOperator *op, wmEvent *event) static void view_pan_exit(bContext *C, wmOperator *op, int cancel) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ViewPanData *vpd= op->customdata; if(cancel) { @@ -180,7 +180,7 @@ static void view_pan_exit(bContext *C, wmOperator *op, int cancel) static int view_pan_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); float offset[2]; RNA_float_get_array(op->ptr, "offset", offset); @@ -209,7 +209,7 @@ static int view_pan_invoke(bContext *C, wmOperator *op, wmEvent *event) static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ViewPanData *vpd= op->customdata; float offset[2]; @@ -269,7 +269,7 @@ typedef struct ViewZoomData { static void view_zoom_init(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ViewZoomData *vpd; op->customdata= vpd= MEM_callocN(sizeof(ViewZoomData), "ImageViewZoomData"); @@ -284,7 +284,7 @@ static void view_zoom_init(bContext *C, wmOperator *op, wmEvent *event) static void view_zoom_exit(bContext *C, wmOperator *op, int cancel) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ViewZoomData *vpd= op->customdata; if(cancel) { @@ -298,7 +298,7 @@ static void view_zoom_exit(bContext *C, wmOperator *op, int cancel) static int view_zoom_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); sima_zoom_set_factor(sima, ar, RNA_float_get(op->ptr, "factor")); @@ -325,7 +325,7 @@ static int view_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event) static int view_zoom_modal(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); ViewZoomData *vpd= op->customdata; float factor; @@ -392,7 +392,7 @@ static int view_all_exec(bContext *C, wmOperator *op) int width, height; /* retrieve state */ - sima= (SpaceImage*)CTX_wm_space_data(C); + sima= CTX_wm_space_image(C); ar= CTX_wm_region(C); scene= (Scene*)CTX_data_scene(C); obedit= CTX_data_edit_object(C); @@ -449,7 +449,7 @@ static int view_selected_exec(bContext *C, wmOperator *op) int width, height; /* retrieve state */ - sima= (SpaceImage*)CTX_wm_space_data(C); + sima= CTX_wm_space_image(C); ar= CTX_wm_region(C); scene= (Scene*)CTX_data_scene(C); obedit= CTX_data_edit_object(C); @@ -493,7 +493,7 @@ void IMAGE_OT_view_selected(wmOperatorType *ot) static int view_zoom_in_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); sima_zoom_set_factor(sima, ar, 1.25f); @@ -516,7 +516,7 @@ void IMAGE_OT_view_zoom_in(wmOperatorType *ot) static int view_zoom_out_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); sima_zoom_set_factor(sima, ar, 0.8f); @@ -541,7 +541,7 @@ void IMAGE_OT_view_zoom_out(wmOperatorType *ot) static int view_zoom_ratio_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); sima_zoom_set(sima, ar, RNA_float_get(op->ptr, "ratio")); @@ -616,7 +616,7 @@ static void image_filesel(bContext *C, wmOperator *op, const char *path) static int open_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); Image *ima= NULL; @@ -636,7 +636,7 @@ static int open_exec(bContext *C, wmOperator *op) static int open_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); char *path= (sima->image)? sima->image->name: U.textudir; if(RNA_property_is_set(op->ptr, "filename")) @@ -662,14 +662,14 @@ void IMAGE_OT_open(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to open."); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE); } /******************** replace image operator ********************/ static int replace_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); char str[FILE_MAX]; if(!sima->image) @@ -686,7 +686,7 @@ static int replace_exec(bContext *C, wmOperator *op) static int replace_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); char *path= (sima->image)? sima->image->name: U.textudir; if(!sima->image) @@ -715,7 +715,7 @@ void IMAGE_OT_replace(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to replace current image with."); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE); } /******************** save image as operator ********************/ @@ -791,7 +791,7 @@ static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOpera static int save_as_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); Image *ima = ED_space_image(sima); char str[FILE_MAX]; @@ -809,7 +809,7 @@ static int save_as_exec(bContext *C, wmOperator *op) static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Image *ima = ED_space_image(sima); ImBuf *ibuf= ED_space_image_buffer(sima); Scene *scene= CTX_data_scene(C); @@ -859,15 +859,15 @@ void IMAGE_OT_save_as(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path to save image to."); RNA_def_enum(ot->srna, "file_type", image_file_type_items, R_PNG, "File Type", "File type to save image as."); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE); } /******************** save image operator ********************/ static int save_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Image *ima = ED_space_image(sima); ImBuf *ibuf= ED_space_image_buffer(sima); Scene *scene= CTX_data_scene(C); @@ -916,7 +916,7 @@ void IMAGE_OT_save(wmOperatorType *ot) static int save_sequence_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ImBuf *ibuf; int tot= 0; char di[FILE_MAX], fi[FILE_MAX]; @@ -995,7 +995,7 @@ static int reload_exec(bContext *C, wmOperator *op) SpaceImage *sima; /* retrieve state */ - sima= (SpaceImage*)CTX_wm_space_data(C); + sima= CTX_wm_space_image(C); if(!sima->image) return OPERATOR_CANCELLED; @@ -1037,7 +1037,7 @@ static int new_exec(bContext *C, wmOperator *op) int width, height, floatbuf, uvtestgrid; /* retrieve state */ - sima= (SpaceImage*)CTX_wm_space_data(C); + sima= CTX_wm_space_image(C); scene= (Scene*)CTX_data_scene(C); obedit= CTX_data_edit_object(C); @@ -1102,7 +1102,7 @@ static int pack_test(bContext *C, wmOperator *op) static int pack_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Image *ima= ED_space_image(sima); ImBuf *ibuf= ED_space_image_buffer(sima); int as_png= RNA_boolean_get(op->ptr, "as_png"); @@ -1125,7 +1125,7 @@ static int pack_exec(bContext *C, wmOperator *op) static int pack_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ImBuf *ibuf= ED_space_image_buffer(sima); uiPopupMenu *pup; uiLayout *layout; @@ -1311,7 +1311,7 @@ typedef struct ImageSampleInfo { static void sample_draw(const bContext *C, ARegion *ar, void *arg_info) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ImBuf *ibuf= ED_space_image_buffer(sima); ImageSampleInfo *info= arg_info; @@ -1324,7 +1324,7 @@ static void sample_draw(const bContext *C, ARegion *ar, void *arg_info) static void sample_apply(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); ImBuf *ibuf= ED_space_image_buffer(sima); ImageSampleInfo *info= op->customdata; @@ -1439,7 +1439,7 @@ static void sample_exit(bContext *C, wmOperator *op) static int sample_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ARegion *ar= CTX_wm_region(C); ImBuf *ibuf= ED_space_image_buffer(sima); ImageSampleInfo *info; @@ -1532,7 +1532,7 @@ typedef struct RecordCompositeData { int record_composite_apply(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); RecordCompositeData *rcd= op->customdata; Scene *scene= CTX_data_scene(C); ImBuf *ibuf; @@ -1560,7 +1560,7 @@ int record_composite_apply(bContext *C, wmOperator *op) static int record_composite_init(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); RecordCompositeData *rcd; @@ -1582,7 +1582,7 @@ static int record_composite_init(bContext *C, wmOperator *op) static void record_composite_exit(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); RecordCompositeData *rcd= op->customdata; scene->r.cfra= rcd->old_cfra; diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 512053490f9..f74b5dd3bbf 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -247,7 +247,7 @@ void image_keymap(struct wmWindowManager *wm) static void image_refresh(const bContext *C, ScrArea *sa) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Object *obedit= CTX_data_edit_object(C); Image *ima; @@ -305,7 +305,7 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn) static int image_context(const bContext *C, const char *member, bContextDataResult *result) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); if(CTX_data_dir(member)) { static const char *dir[] = {"edit_image", NULL}; @@ -415,7 +415,7 @@ static void image_main_area_init(wmWindowManager *wm, ARegion *ar) static void image_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Object *obedit= CTX_data_edit_object(C); Scene *scene= CTX_data_scene(C); View2D *v2d= &ar->v2d; @@ -486,7 +486,7 @@ static void image_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void image_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL, -1); } static void image_buttons_area_listener(ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c index 56f925a2e81..640c968742c 100644 --- a/source/blender/editors/space_info/info_ops.c +++ b/source/blender/editors/space_info/info_ops.c @@ -330,7 +330,7 @@ void FILE_OT_find_missing_files(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to open."); + WM_operator_properties_filesel(ot, 0); } #if 0 diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c index 60d8b17668e..fe5bbf04af1 100644 --- a/source/blender/editors/space_info/space_info.c +++ b/source/blender/editors/space_info/space_info.c @@ -120,7 +120,7 @@ static void info_main_area_init(wmWindowManager *wm, ARegion *ar) static void info_main_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL, -1); } void info_operatortypes(void) diff --git a/source/blender/editors/space_logic/logic_buttons.c b/source/blender/editors/space_logic/logic_buttons.c index db6922f304c..58c1eddb6c1 100644 --- a/source/blender/editors/space_logic/logic_buttons.c +++ b/source/blender/editors/space_logic/logic_buttons.c @@ -80,7 +80,7 @@ static void do_logic_panel_events(bContext *C, void *arg, int event) static void logic_panel_properties(const bContext *C, Panel *pa) { -// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C); +// SpaceLogic *slogic= CTX_wm_space_logic(C); uiBlock *block; block= uiLayoutFreeBlock(pa->layout); @@ -90,7 +90,7 @@ static void logic_panel_properties(const bContext *C, Panel *pa) static void logic_panel_view_properties(const bContext *C, Panel *pa) { - // SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C); + // SpaceLogic *slogic= CTX_wm_space_logic(C); uiBlock *block; block= uiLayoutFreeBlock(pa->layout); @@ -101,8 +101,9 @@ static void logic_panel_view_properties(const bContext *C, Panel *pa) void logic_buttons_register(ARegionType *art) { - PanelType *pt; #if 0 + PanelType *pt; + pt= MEM_callocN(sizeof(PanelType), "spacetype logic panel properties"); strcpy(pt->idname, "LOGIC_PT_properties"); strcpy(pt->label, "Logic Properties"); diff --git a/source/blender/editors/space_logic/logic_header.c b/source/blender/editors/space_logic/logic_header.c index d0e905728be..9444e3893d1 100644 --- a/source/blender/editors/space_logic/logic_header.c +++ b/source/blender/editors/space_logic/logic_header.c @@ -63,12 +63,12 @@ static void do_logic_buttons(bContext *C, void *arg, int event) { -// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C); +// SpaceLogic *slogic= CTX_wm_space_logic(C); } static uiBlock *logic_addmenu(bContext *C, ARegion *ar, void *arg_unused) { -// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C); +// SpaceLogic *slogic= CTX_wm_space_logic(C); uiBlock *block; short yco= 0, menuwidth=120; @@ -87,7 +87,7 @@ static uiBlock *logic_addmenu(bContext *C, ARegion *ar, void *arg_unused) void logic_header_buttons(const bContext *C, ARegion *ar) { ScrArea *sa= CTX_wm_area(C); -// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C); +// SpaceLogic *slogic= CTX_wm_space_logic(C); uiBlock *block; short xco, yco= 3; diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index ab4574d5940..274f5f47e43 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -2134,7 +2134,10 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh glRects(xco, yco-ysize, xco+width, yco); uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); - uiDefIDPoinBut(block, test_meshpoin_but, ID_ME, 1, "ME:", xco+40, yco-44, (width-80), 19, &(eoa->me), "replace the existing mesh with this one"); + uiDefIDPoinBut(block, test_meshpoin_but, ID_ME, 1, "ME:", xco+40, yco-44, (width-80)/2, 19, &(eoa->me), "replace the existing, when left blank 'Phys' will remake the existing physics mesh"); + + uiDefButBitS(block, TOGN, ACT_EDOB_REPLACE_MESH_NOGFX, 0, "Gfx", xco+40 + (width-80)/2, yco-44, (width-80)/4, 19, &eoa->flag, 0, 0, 0, 0, "Replace the display mesh"); + uiDefButBitS(block, TOG, ACT_EDOB_REPLACE_MESH_PHYS, 0, "Phys", xco+40 + (width-80)/2 +(width-80)/4, yco-44, (width-80)/4, 19, &eoa->flag, 0, 0, 0, 0, "Replace the physics mesh (triangle bounds only. compound shapes not supported)"); } else if(eoa->type==ACT_EDOB_TRACK_TO) { ysize= 48; @@ -2751,7 +2754,7 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh static void do_sensor_menu(bContext *C, void *arg, int event) { - SpaceLogic *slogic= (SpaceLogic *)CTX_wm_space_data(C); + SpaceLogic *slogic= CTX_wm_space_logic(C); ID **idar; Object *ob; bSensor *sens; @@ -2800,7 +2803,7 @@ static uiBlock *sensor_menu(bContext *C, ARegion *ar, void *arg_unused) static void do_controller_menu(bContext *C, void *arg, int event) { - SpaceLogic *slogic= (SpaceLogic *)CTX_wm_space_data(C); + SpaceLogic *slogic= CTX_wm_space_logic(C); ID **idar; Object *ob; bController *cont; @@ -2849,7 +2852,7 @@ static uiBlock *controller_menu(bContext *C, ARegion *ar, void *arg_unused) static void do_actuator_menu(bContext *C, void *arg, int event) { - SpaceLogic *slogic= (SpaceLogic *)CTX_wm_space_data(C); + SpaceLogic *slogic= CTX_wm_space_logic(C); ID **idar; Object *ob; bActuator *act; @@ -3011,7 +3014,7 @@ static int is_sensor_linked(uiBlock *block, bSensor *sens) void logic_buttons(bContext *C, ARegion *ar) { - SpaceLogic *slogic= (SpaceLogic *)CTX_wm_space_data(C); + SpaceLogic *slogic= CTX_wm_space_logic(C); Object *ob= CTX_data_active_object(C); ID **idar; bSensor *sens; diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c index a593cfd1e7f..703b408aae6 100644 --- a/source/blender/editors/space_logic/space_logic.c +++ b/source/blender/editors/space_logic/space_logic.c @@ -142,7 +142,7 @@ static SpaceLink *logic_new(const bContext *C) ar->v2d.maxzoom= 1.21f; ar->v2d.scroll= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM); - ar->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT; + ar->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT; ar->v2d.keeptot= 0; @@ -188,7 +188,7 @@ void logic_keymap(struct wmWindowManager *wm) static void logic_refresh(const bContext *C, ScrArea *sa) { -// SpaceLogic *slogic= (SpaceImage*)CTX_wm_space_data(C); +// SpaceLogic *slogic= CTX_wm_space_logic(C); // Object *obedit= CTX_data_edit_object(C); } @@ -215,7 +215,7 @@ static void logic_listener(ARegion *ar, wmNotifier *wmn) static int logic_context(const bContext *C, const char *member, bContextDataResult *result) { -// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C); +// SpaceLogic *slogic= CTX_wm_space_logic(C); return 0; @@ -239,7 +239,7 @@ static void logic_main_area_init(wmWindowManager *wm, ARegion *ar) static void logic_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ -// SpaceLogic *slogic= (SpaceLogic*)CTX_wm_space_data(C); +// SpaceLogic *slogic= CTX_wm_space_logic(C); View2D *v2d= &ar->v2d; View2DScrollers *scrollers; float col[3]; @@ -279,7 +279,7 @@ static void logic_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void logic_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL, -1); } /************************* header region **************************/ diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c index a74037d1ace..7184737e0ba 100644 --- a/source/blender/editors/space_nla/nla_buttons.c +++ b/source/blender/editors/space_nla/nla_buttons.c @@ -100,7 +100,7 @@ static void do_nla_region_buttons(bContext *C, void *arg, int event) WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_TRANSFORM, NULL); } -static int nla_panel_context(const bContext *C, PointerRNA *nlt_ptr, PointerRNA *strip_ptr) +static int nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA *nlt_ptr, PointerRNA *strip_ptr) { bAnimContext ac; bAnimListElem *ale= NULL; @@ -121,8 +121,13 @@ static int nla_panel_context(const bContext *C, PointerRNA *nlt_ptr, PointerRNA for (ale= anim_data.first; ale; ale= ale->next) { if (ale->type == ANIMTYPE_NLATRACK) { NlaTrack *nlt= (NlaTrack *)ale->data; + AnimData *adt= ale->adt; /* found it, now set the pointers */ + if (adt_ptr) { + /* AnimData pointer */ + RNA_pointer_create(ale->id, &RNA_AnimData, adt, adt_ptr); + } if (nlt_ptr) { /* NLA-Track pointer */ RNA_pointer_create(ale->id, &RNA_NlaTrack, nlt, nlt_ptr); @@ -151,16 +156,22 @@ static int nla_panel_poll(const bContext *C, PanelType *pt) } #endif +static int nla_animdata_panel_poll(const bContext *C, PanelType *pt) +{ + PointerRNA ptr; + return (nla_panel_context(C, &ptr, NULL, NULL) && (ptr.data != NULL)); +} + static int nla_track_panel_poll(const bContext *C, PanelType *pt) { PointerRNA ptr; - return (nla_panel_context(C, &ptr, NULL) && (ptr.data != NULL)); + return (nla_panel_context(C, NULL, &ptr, NULL) && (ptr.data != NULL)); } static int nla_strip_panel_poll(const bContext *C, PanelType *pt) { PointerRNA ptr; - return (nla_panel_context(C, NULL, &ptr) && (ptr.data != NULL)); + return (nla_panel_context(C, NULL, NULL, &ptr) && (ptr.data != NULL)); } static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *pt) @@ -168,7 +179,7 @@ static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *pt) PointerRNA ptr; NlaStrip *strip; - if (!nla_panel_context(C, NULL, &ptr)) + if (!nla_panel_context(C, NULL, NULL, &ptr)) return 0; if (ptr.data == NULL) return 0; @@ -179,6 +190,41 @@ static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *pt) /* -------------- */ +/* active AnimData */ +static void nla_panel_animdata (const bContext *C, Panel *pa) +{ + PointerRNA adt_ptr; + AnimData *adt; + uiLayout *layout= pa->layout; + uiLayout *row; + uiBlock *block; + + /* check context and also validity of pointer */ + if (!nla_panel_context(C, &adt_ptr, NULL, NULL)) + return; + adt= adt_ptr.data; + + block= uiLayoutGetBlock(layout); + uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL); + + /* Active Action Properties ------------------------------------- */ + /* action */ + row= uiLayoutRow(layout, 1); + uiItemR(row, NULL, 0, &adt_ptr, "action", 0, 0, 0); + + /* extrapolation */ + row= uiLayoutRow(layout, 1); + uiItemR(row, NULL, 0, &adt_ptr, "action_extrapolation", 0, 0, 0); + + /* blending */ + row= uiLayoutRow(layout, 1); + uiItemR(row, NULL, 0, &adt_ptr, "action_blending", 0, 0, 0); + + /* influence */ + row= uiLayoutRow(layout, 1); + uiItemR(row, NULL, 0, &adt_ptr, "action_influence", 0, 0, 0); +} + /* active NLA-Track */ static void nla_panel_track (const bContext *C, Panel *pa) { @@ -188,9 +234,9 @@ static void nla_panel_track (const bContext *C, Panel *pa) uiBlock *block; /* check context and also validity of pointer */ - if (!nla_panel_context(C, &nlt_ptr, NULL)) + if (!nla_panel_context(C, NULL, &nlt_ptr, NULL)) return; - + block= uiLayoutGetBlock(layout); uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL); @@ -207,7 +253,7 @@ static void nla_panel_properties(const bContext *C, Panel *pa) uiLayout *column, *row, *subcol; uiBlock *block; - if (!nla_panel_context(C, NULL, &strip_ptr)) + if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) return; block= uiLayoutGetBlock(layout); @@ -263,7 +309,7 @@ static void nla_panel_actclip(const bContext *C, Panel *pa) uiBlock *block; /* check context and also validity of pointer */ - if (!nla_panel_context(C, NULL, &strip_ptr)) + if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) return; block= uiLayoutGetBlock(layout); @@ -298,7 +344,7 @@ static void nla_panel_evaluation(const bContext *C, Panel *pa) uiBlock *block; /* check context and also validity of pointer */ - if (!nla_panel_context(C, NULL, &strip_ptr)) + if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) return; block= uiLayoutGetBlock(layout); @@ -330,7 +376,7 @@ static void nla_panel_modifiers(const bContext *C, Panel *pa) uiBlock *block; /* check context and also validity of pointer */ - if (!nla_panel_context(C, NULL, &strip_ptr)) + if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) return; strip= strip_ptr.data; @@ -362,6 +408,14 @@ void nla_buttons_register(ARegionType *art) { PanelType *pt; + pt= MEM_callocN(sizeof(PanelType), "spacetype nla panel animdata"); + strcpy(pt->idname, "NLA_PT_animdata"); + strcpy(pt->label, "Animation Data"); + pt->draw= nla_panel_animdata; + pt->poll= nla_animdata_panel_poll; + pt->flag= PNL_DEFAULT_CLOSED; + BLI_addtail(&art->paneltypes, pt); + pt= MEM_callocN(sizeof(PanelType), "spacetype nla panel track"); strcpy(pt->idname, "NLA_PT_track"); strcpy(pt->label, "Active Track"); diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c index 1ab348eb28e..ab918519ec0 100644 --- a/source/blender/editors/space_nla/nla_channels.c +++ b/source/blender/editors/space_nla/nla_channels.c @@ -38,12 +38,14 @@ #include "DNA_camera_types.h" #include "DNA_curve_types.h" #include "DNA_object_types.h" +#include "DNA_particle_types.h" #include "DNA_screen_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" +#include "DNA_meta_types.h" #include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" #include "DNA_world_types.h" @@ -116,6 +118,7 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho case ANIMTYPE_SCENE: { Scene *sce= (Scene *)ale->data; + AnimData *adt= ale->data; if (x < 16) { /* toggle expand */ @@ -123,6 +126,12 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho notifierFlags |= ND_ANIMCHAN_EDIT; } + else if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + + notifierFlags |= ND_ANIMCHAN_EDIT; + } else { /* set selection status */ if (selectmode == SELECT_INVERT) { @@ -143,12 +152,19 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho Scene *sce= (Scene *)ads->source; Base *base= (Base *)ale->data; Object *ob= base->object; + AnimData *adt= ale->adt; if (x < 16) { /* toggle expand */ ob->nlaflag ^= OB_ADS_COLLAPSED; // XXX notifierFlags |= ND_ANIMCHAN_EDIT; } + else if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + + notifierFlags |= ND_ANIMCHAN_EDIT; + } else if (nlaedit_is_tweakmode_on(ac) == 0) { /* set selection status */ if (selectmode == SELECT_INVERT) { @@ -185,46 +201,139 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho notifierFlags |= ND_ANIMCHAN_EDIT; } break; + case ANIMTYPE_FILLPARTD: + { + Object *ob= (Object *)ale->data; + ob->nlaflag ^= OB_ADS_SHOWPARTS; // XXX + notifierFlags |= ND_ANIMCHAN_EDIT; + } + break; case ANIMTYPE_DSMAT: { Material *ma= (Material *)ale->data; - ma->flag ^= MA_DS_EXPAND; + AnimData *adt= ale->adt; + + if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + } + else { + /* toggle expand */ + ma->flag ^= MA_DS_EXPAND; + } notifierFlags |= ND_ANIMCHAN_EDIT; } break; case ANIMTYPE_DSLAM: { Lamp *la= (Lamp *)ale->data; - la->flag ^= LA_DS_EXPAND; + AnimData *adt= ale->adt; + + if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + } + else { + /* toggle expand */ + la->flag ^= LA_DS_EXPAND; + } notifierFlags |= ND_ANIMCHAN_EDIT; } break; case ANIMTYPE_DSCAM: { Camera *ca= (Camera *)ale->data; - ca->flag ^= CAM_DS_EXPAND; + AnimData *adt= ale->adt; + + if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + } + else { + /* toggle expand */ + ca->flag ^= CAM_DS_EXPAND; + } notifierFlags |= ND_ANIMCHAN_EDIT; } break; case ANIMTYPE_DSCUR: { Curve *cu= (Curve *)ale->data; - cu->flag ^= CU_DS_EXPAND; + AnimData *adt= ale->adt; + + if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + } + else { + /* toggle expand */ + cu->flag ^= CU_DS_EXPAND; + } notifierFlags |= ND_ANIMCHAN_EDIT; } break; case ANIMTYPE_DSSKEY: { Key *key= (Key *)ale->data; - key->flag ^= KEYBLOCK_DS_EXPAND; + AnimData *adt= ale->adt; + + if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + } + else { + /* toggle expand */ + key->flag ^= KEYBLOCK_DS_EXPAND; + } notifierFlags |= ND_ANIMCHAN_EDIT; } break; case ANIMTYPE_DSWOR: { World *wo= (World *)ale->data; - wo->flag ^= WO_DS_EXPAND; + AnimData *adt= ale->adt; + + if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + } + else { + /* toggle expand */ + wo->flag ^= WO_DS_EXPAND; + } + notifierFlags |= ND_ANIMCHAN_EDIT; + } + break; + case ANIMTYPE_DSPART: + { + ParticleSettings *part= (ParticleSettings *)ale->data; + AnimData *adt= ale->adt; + + if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + } + else { + /* toggle expand */ + part->flag ^= PART_DS_EXPAND; + } + notifierFlags |= ND_ANIMCHAN_EDIT; + } + break; + case ANIMTYPE_DSMBALL: + { + MetaBall *mb= (MetaBall *)ale->data; + AnimData *adt= ale->adt; + + if ( (adt) && (x >= (NLACHANNEL_NAMEWIDTH-NLACHANNEL_BUTTON_WIDTH)) ) { + /* toggle mute */ + adt->flag ^= ADT_NLA_EVAL_OFF; + } + else { + /* toggle expand */ + mb->flag2 ^= MB_DS_EXPAND; + } notifierFlags |= ND_ANIMCHAN_EDIT; } break; @@ -232,13 +341,13 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho case ANIMTYPE_NLATRACK: { NlaTrack *nlt= (NlaTrack *)ale->data; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; short offset; /* offset for start of channel (on LHS of channel-list) */ if (ale->id) { - /* special exception for materials */ - if (GS(ale->id->name) == ID_MA) + /* special exception for materials and particles */ + if (ELEM(GS(ale->id->name),ID_MA,ID_PA)) offset= 21 + NLACHANNEL_BUTTON_WIDTH; else offset= 14; @@ -416,7 +525,7 @@ static int nlaedit_add_tracks_exec (bContext *C, wmOperator *op) /* add tracks... */ for (ale= anim_data.first; ale; ale= ale->next) { NlaTrack *nlt= (NlaTrack *)ale->data; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; /* check if just adding a new track above this one, * or whether we're adding a new one to the top of the stack that this one belongs to @@ -482,7 +591,7 @@ static int nlaedit_delete_tracks_exec (bContext *C, wmOperator *op) /* delete tracks */ for (ale= anim_data.first; ale; ale= ale->next) { NlaTrack *nlt= (NlaTrack *)ale->data; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; /* call delete on this track - deletes all strips too */ free_nlatrack(&adt->nla_tracks, nlt); diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c index 9e60651081f..a7a854a7277 100644 --- a/source/blender/editors/space_nla/nla_draw.c +++ b/source/blender/editors/space_nla/nla_draw.c @@ -46,6 +46,8 @@ #include "DNA_key_types.h" #include "DNA_lamp_types.h" #include "DNA_material_types.h" +#include "DNA_meta_types.h" +#include "DNA_particle_types.h" #include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" #include "DNA_world_types.h" @@ -252,10 +254,9 @@ static void nla_draw_strip_curves (NlaStrip *strip, View2D *v2d, float yminc, fl // XXX nasty hacked color for now... which looks quite bad too... glColor3f(0.7f, 0.7f, 0.7f); - /* draw with AA'd line, 2 units thick (it's either 1 or 2 px) */ + /* draw with AA'd line */ glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); - glLineWidth(2.0f); /* influence -------------------------- */ if (strip->flag & NLASTRIP_FLAG_USR_INFLUENCE) { @@ -302,11 +303,10 @@ static void nla_draw_strip_curves (NlaStrip *strip, View2D *v2d, float yminc, fl /* turn off AA'd lines */ glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); - glLineWidth(1.0f); } /* main call for drawing a single NLA-strip */ -static void nla_draw_strip (AnimData *adt, NlaTrack *nlt, NlaStrip *strip, View2D *v2d, float yminc, float ymaxc) +static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStrip *strip, View2D *v2d, float yminc, float ymaxc) { float color[3]; @@ -373,8 +373,11 @@ static void nla_draw_strip (AnimData *adt, NlaTrack *nlt, NlaStrip *strip, View2 gl_round_box_shade(GL_POLYGON, strip->start, yminc, strip->end, ymaxc, 0.0, 0.5, 0.1); - /* draw strip's control 'curves' */ - nla_draw_strip_curves(strip, v2d, yminc, ymaxc); + /* draw strip's control 'curves' + * - only if user hasn't hidden them... + */ + if ((snla->flag & SNLA_NOSTRIPCURVES) == 0) + nla_draw_strip_curves(strip, v2d, yminc, ymaxc); /* draw strip outline * - color used here is to indicate active vs non-active @@ -518,7 +521,7 @@ void draw_nla_main_data (bAnimContext *ac, SpaceNla *snla, ARegion *ar) switch (ale->type) { case ANIMTYPE_NLATRACK: { - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; NlaTrack *nlt= (NlaTrack *)ale->data; NlaStrip *strip; int index; @@ -527,7 +530,7 @@ void draw_nla_main_data (bAnimContext *ac, SpaceNla *snla, ARegion *ar) for (strip=nlt->strips.first, index=1; strip; strip=strip->next, index++) { if (BKE_nlastrip_within_bounds(strip, v2d->cur.xmin, v2d->cur.xmax)) { /* draw the visualisation of the strip */ - nla_draw_strip(adt, nlt, strip, v2d, yminc, ymaxc); + nla_draw_strip(snla, adt, nlt, strip, v2d, yminc, ymaxc); /* add the text for this strip to the cache */ nla_draw_strip_text(nlt, strip, index, v2d, yminc, ymaxc); @@ -538,7 +541,7 @@ void draw_nla_main_data (bAnimContext *ac, SpaceNla *snla, ARegion *ar) case ANIMTYPE_NLAACTION: { - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; float color[4]; /* just draw a semi-shaded rect spanning the width of the viewable area if there's data, @@ -636,6 +639,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) case ANIMTYPE_SCENE: /* scene */ { Scene *sce= (Scene *)ale->data; + AnimData *adt= ale->adt; group= 4; indent= 0; @@ -647,6 +651,14 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) expand= ICON_TRIA_DOWN; else expand= ICON_TRIA_RIGHT; + + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } sel = SEL_SCEC(sce); strcpy(name, sce->id.name+2); @@ -656,6 +668,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) { Base *base= (Base *)ale->data; Object *ob= base->object; + AnimData *adt= ale->adt; group= 4; indent= 0; @@ -672,6 +685,14 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) else expand= ICON_TRIA_RIGHT; + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } + sel = SEL_OBJC(base); strcpy(name, ob->id.name+2); } @@ -692,11 +713,28 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) strcpy(name, "Materials"); } break; + case ANIMTYPE_FILLPARTD: /* object particles (dopesheet) expand widget */ + { + Object *ob = (Object *)ale->data; + + group = 4; + indent = 1; + special = ICON_PARTICLE_DATA; + + if (FILTER_PART_OBJC(ob)) + expand = ICON_TRIA_DOWN; + else + expand = ICON_TRIA_RIGHT; + + strcpy(name, "Particles"); + } + break; case ANIMTYPE_DSMAT: /* single material (dopesheet) expand widget */ { Material *ma = (Material *)ale->data; + AnimData *adt= ale->adt; group = 0; indent = 0; @@ -707,6 +745,14 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) expand = ICON_TRIA_DOWN; else expand = ICON_TRIA_RIGHT; + + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } strcpy(name, ma->id.name+2); } @@ -714,6 +760,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) case ANIMTYPE_DSLAM: /* lamp (dopesheet) expand widget */ { Lamp *la = (Lamp *)ale->data; + AnimData *adt= ale->adt; group = 4; indent = 1; @@ -723,6 +770,14 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) expand = ICON_TRIA_DOWN; else expand = ICON_TRIA_RIGHT; + + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } strcpy(name, la->id.name+2); } @@ -730,6 +785,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) case ANIMTYPE_DSCAM: /* camera (dopesheet) expand widget */ { Camera *ca = (Camera *)ale->data; + AnimData *adt= ale->adt; group = 4; indent = 1; @@ -739,6 +795,14 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) expand = ICON_TRIA_DOWN; else expand = ICON_TRIA_RIGHT; + + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } strcpy(name, ca->id.name+2); } @@ -746,6 +810,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) case ANIMTYPE_DSCUR: /* curve (dopesheet) expand widget */ { Curve *cu = (Curve *)ale->data; + AnimData *adt= ale->adt; group = 4; indent = 1; @@ -755,6 +820,14 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) expand = ICON_TRIA_DOWN; else expand = ICON_TRIA_RIGHT; + + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } strcpy(name, cu->id.name+2); } @@ -762,16 +835,25 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) case ANIMTYPE_DSSKEY: /* shapekeys (dopesheet) expand widget */ { Key *key= (Key *)ale->data; + AnimData *adt= ale->adt; group = 4; indent = 1; - special = ICON_SHAPEKEY_DATA; // XXX + special = ICON_SHAPEKEY_DATA; if (FILTER_SKE_OBJD(key)) expand = ICON_TRIA_DOWN; else expand = ICON_TRIA_RIGHT; + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } + //sel = SEL_OBJC(base); strcpy(name, "Shape Keys"); } @@ -779,6 +861,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) case ANIMTYPE_DSWOR: /* world (dopesheet) expand widget */ { World *wo= (World *)ale->data; + AnimData *adt= ale->adt; group = 4; indent = 1; @@ -788,10 +871,69 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) expand = ICON_TRIA_DOWN; else expand = ICON_TRIA_RIGHT; + + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } strcpy(name, wo->id.name+2); } break; + case ANIMTYPE_DSPART: /* particle (dopesheet) expand widget */ + { + ParticleSettings *part= (ParticleSettings*)ale->data; + AnimData *adt= ale->adt; + + group = 0; + indent = 0; + special = ICON_PARTICLE_DATA; + offset = 21; + + if (FILTER_PART_OBJD(part)) + expand = ICON_TRIA_DOWN; + else + expand = ICON_TRIA_RIGHT; + + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } + + strcpy(name, part->id.name+2); + } + break; + case ANIMTYPE_DSMBALL: /* metaball (dopesheet) expand widget */ + { + MetaBall *mb = (MetaBall *)ale->data; + AnimData *adt= ale->adt; + + group = 4; + indent = 1; + special = ICON_META_DATA; + + if (FILTER_MBALL_OBJD(mb)) + expand = ICON_TRIA_DOWN; + else + expand = ICON_TRIA_RIGHT; + + /* NLA evaluation on/off button */ + if (adt) { + if (adt->flag & ADT_NLA_EVAL_OFF) + mute = ICON_MUTE_IPO_ON; + else + mute = ICON_MUTE_IPO_OFF; + } + + strcpy(name, mb->id.name+2); + } + break; case ANIMTYPE_NLATRACK: /* NLA Track */ { @@ -800,8 +942,8 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) indent= 0; if (ale->id) { - /* special exception for materials */ - if (GS(ale->id->name) == ID_MA) { + /* special exception for materials and particles */ + if (ELEM(GS(ale->id->name),ID_MA,ID_PA)) { offset= 21; indent= 1; } @@ -845,8 +987,8 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) group = 5; if (ale->id) { - /* special exception for materials */ - if (GS(ale->id->name) == ID_MA) { + /* special exception for materials and particles */ + if (ELEM(GS(ale->id->name),ID_MA,ID_PA)) { offset= 21; indent= 1; } @@ -897,7 +1039,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) } else if (group == 5) { /* Action Line */ - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; // TODO: if tweaking some action, use the same color as for the tweaked track (quick hack done for now) if (adt && (adt->flag & ADT_NLA_EDIT_ON)) { @@ -983,7 +1125,7 @@ void draw_nla_channel_list (bAnimContext *ac, SpaceNla *snla, ARegion *ar) /* draw NLA-action line 'status-icons' - only when there's an action */ if ((ale->type == ANIMTYPE_NLAACTION) && (ale->data)) { - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; offset += 16; diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 01871d3d9d5..d476852ef2d 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -78,6 +78,28 @@ #include "nla_private.h" // FIXME... maybe this shouldn't be included? /* *********************************************** */ +/* Utilities exported to other places... */ + +/* Perform validation for blending/extend settings */ +void ED_nla_postop_refresh (bAnimContext *ac) +{ + ListBase anim_data = {NULL, NULL}; + bAnimListElem *ale; + short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA | ANIMFILTER_FOREDIT); + + /* get blocks to work on */ + ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); + + for (ale= anim_data.first; ale; ale= ale->next) { + /* performing auto-blending, extend-mode validation, etc. */ + BKE_nla_validate_state(ale->data); + } + + /* free temp memory */ + BLI_freelistN(&anim_data); +} + +/* *********************************************** */ /* 'Special' Editing */ /* ******************** Tweak-Mode Operators ***************************** */ @@ -290,7 +312,7 @@ static int nlaedit_add_actionclip_exec (bContext *C, wmOperator *op) /* for every active track, try to add strip to free space in track or to the top of the stack if no space */ for (ale= anim_data.first; ale; ale= ale->next) { NlaTrack *nlt= (NlaTrack *)ale->data; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; NlaStrip *strip= NULL; /* create a new strip, and offset it to start on the current frame */ @@ -315,6 +337,9 @@ static int nlaedit_add_actionclip_exec (bContext *C, wmOperator *op) /* free temp data */ BLI_freelistN(&anim_data); + /* refresh auto strip properties */ + ED_nla_postop_refresh(&ac); + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); @@ -366,7 +391,7 @@ static int nlaedit_add_transition_exec (bContext *C, wmOperator *op) /* for each track, find pairs of strips to add transitions to */ for (ale= anim_data.first; ale; ale= ale->next) { NlaTrack *nlt= (NlaTrack *)ale->data; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; NlaStrip *s1, *s2; /* get initial pair of strips */ @@ -427,6 +452,9 @@ static int nlaedit_add_transition_exec (bContext *C, wmOperator *op) /* was anything added? */ if (done) { + /* refresh auto strip properties */ + ED_nla_postop_refresh(&ac); + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); @@ -477,7 +505,7 @@ static int nlaedit_add_meta_exec (bContext *C, wmOperator *op) /* for each track, find pairs of strips to add transitions to */ for (ale= anim_data.first; ale; ale= ale->next) { NlaTrack *nlt= (NlaTrack *)ale->data; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; NlaStrip *strip; /* create meta-strips from the continuous chains of selected strips */ @@ -596,7 +624,7 @@ static int nlaedit_duplicate_exec (bContext *C, wmOperator *op) */ for (ale= anim_data.last; ale; ale= ale->prev) { NlaTrack *nlt= (NlaTrack *)ale->data; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; NlaStrip *strip, *nstrip, *next; NlaTrack *track; @@ -633,6 +661,9 @@ static int nlaedit_duplicate_exec (bContext *C, wmOperator *op) BLI_freelistN(&anim_data); if (done) { + /* refresh auto strip properties */ + ED_nla_postop_refresh(&ac); + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); @@ -718,6 +749,9 @@ static int nlaedit_delete_exec (bContext *C, wmOperator *op) /* free temp data */ BLI_freelistN(&anim_data); + /* refresh auto strip properties */ + ED_nla_postop_refresh(&ac); + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); @@ -832,7 +866,7 @@ static int nlaedit_split_exec (bContext *C, wmOperator *op) /* for each NLA-Track, split all selected strips into two strips */ for (ale= anim_data.first; ale; ale= ale->next) { NlaTrack *nlt= (NlaTrack *)ale->data; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; NlaStrip *strip, *next; for (strip= nlt->strips.first; strip; strip= next) { @@ -860,6 +894,9 @@ static int nlaedit_split_exec (bContext *C, wmOperator *op) /* free temp data */ BLI_freelistN(&anim_data); + /* refresh auto strip properties */ + ED_nla_postop_refresh(&ac); + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); @@ -993,6 +1030,9 @@ static int nlaedit_move_up_exec (bContext *C, wmOperator *op) /* free temp data */ BLI_freelistN(&anim_data); + /* refresh auto strip properties */ + ED_nla_postop_refresh(&ac); + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); @@ -1064,6 +1104,9 @@ static int nlaedit_move_down_exec (bContext *C, wmOperator *op) /* free temp data */ BLI_freelistN(&anim_data); + /* refresh auto strip properties */ + ED_nla_postop_refresh(&ac); + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); @@ -1222,6 +1265,9 @@ static int nlaedit_clear_scale_exec (bContext *C, wmOperator *op) /* free temp data */ BLI_freelistN(&anim_data); + /* refresh auto strip properties */ + ED_nla_postop_refresh(&ac); + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); @@ -1283,7 +1329,7 @@ static int nlaedit_snap_exec (bContext *C, wmOperator *op) /* since we may add tracks, perform this in reverse order */ for (ale= anim_data.last; ale; ale= ale->prev) { ListBase tmp_strips = {NULL, NULL}; - AnimData *adt= BKE_animdata_from_id(ale->id); + AnimData *adt= ale->adt; NlaTrack *nlt= (NlaTrack *)ale->data; NlaStrip *strip, *stripn; NlaTrack *track; @@ -1360,6 +1406,9 @@ static int nlaedit_snap_exec (bContext *C, wmOperator *op) /* free temp data */ BLI_freelistN(&anim_data); + /* refresh auto strip properties */ + ED_nla_postop_refresh(&ac); + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA_EDIT, NULL); diff --git a/source/blender/editors/space_nla/nla_header.c b/source/blender/editors/space_nla/nla_header.c index e997a096bce..04c2db08bda 100644 --- a/source/blender/editors/space_nla/nla_header.c +++ b/source/blender/editors/space_nla/nla_header.c @@ -21,7 +21,7 @@ * All rights reserved. * * - * Contributor(s): Blender Foundation + * Contributor(s): Blender Foundation, Joshua Leung * * ***** END GPL LICENSE BLOCK ***** */ @@ -83,7 +83,7 @@ static void nla_viewmenu(bContext *C, uiLayout *layout, void *arg_unused) { bScreen *sc= CTX_wm_screen(C); ScrArea *sa= CTX_wm_area(C); - SpaceNla *snla= (SpaceNla*)CTX_wm_space_data(C); + SpaceNla *snla= CTX_wm_space_nla(C); PointerRNA spaceptr; /* retrieve state */ @@ -100,7 +100,9 @@ static void nla_viewmenu(bContext *C, uiLayout *layout, void *arg_unused) uiItemO(layout, "Show Frames", 0, "ANIM_OT_time_toggle"); else uiItemO(layout, "Show Seconds", 0, "ANIM_OT_time_toggle"); - + + uiItemR(layout, NULL, 0, &spaceptr, "show_strip_curves", 0, 0, 0); + uiItemS(layout); uiItemS(layout); @@ -211,7 +213,7 @@ static void do_nla_buttons(bContext *C, void *arg, int event) void nla_header_buttons(const bContext *C, ARegion *ar) { - SpaceNla *snla= (SpaceNla *)CTX_wm_space_data(C); + SpaceNla *snla= CTX_wm_space_nla(C); ScrArea *sa= CTX_wm_area(C); uiBlock *block; int xco, yco= 3; @@ -259,12 +261,14 @@ void nla_header_buttons(const bContext *C, ARegion *ar) uiDefIconButBitI(block, TOGN, ADS_FILTER_NOLAM, B_REDR, ICON_LAMP_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Lamps"); uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCAM, B_REDR, ICON_CAMERA_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Cameras"); uiDefIconButBitI(block, TOGN, ADS_FILTER_NOCUR, B_REDR, ICON_CURVE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Curves"); + uiDefIconButBitI(block, TOGN, ADS_FILTER_NOMBA, B_REDR, ICON_META_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display MetaBalls"); + uiDefIconButBitI(block, TOGN, ADS_FILTER_NOPART, B_REDR, ICON_PARTICLE_DATA, (short)(xco+=XIC),yco,XIC,YIC, &(snla->ads->filterflag), 0, 0, 0, 0, "Display Particles"); uiBlockEndAlign(block); xco += 15; } else { // XXX this case shouldn't happen at all... for now, just pad out same amount of space - xco += 7*XIC + 15; + xco += 10*XIC + 15; } xco += (XIC + 8); diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c index 923208f3b35..6f377aabd4e 100644 --- a/source/blender/editors/space_nla/space_nla.c +++ b/source/blender/editors/space_nla/space_nla.c @@ -223,7 +223,7 @@ static void nla_channel_area_init(wmWindowManager *wm, ARegion *ar) /* draw entirely, view changes should be handled here */ static void nla_channel_area_draw(const bContext *C, ARegion *ar) { - SpaceNla *snla= (SpaceNla*)CTX_wm_space_data(C); + SpaceNla *snla= CTX_wm_space_nla(C); bAnimContext ac; View2D *v2d= &ar->v2d; View2DScrollers *scrollers; @@ -268,7 +268,7 @@ static void nla_main_area_init(wmWindowManager *wm, ARegion *ar) static void nla_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ - SpaceNla *snla= (SpaceNla*)CTX_wm_space_data(C); + SpaceNla *snla= CTX_wm_space_nla(C); bAnimContext ac; View2D *v2d= &ar->v2d; View2DGrid *grid; @@ -364,7 +364,7 @@ static void nla_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void nla_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL, -1); } static void nla_region_listener(ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index f2e2486075b..70e2167c1e4 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -473,7 +473,7 @@ static void socket_vector_menu_cb(bContext *C, void *node_v, void *ntree_v) /* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */ static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *socket_v) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ScrArea *sa= CTX_wm_area(C); bNode *node; bNodeSocket *sock= socket_v; @@ -577,7 +577,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) static void do_node_internal_buttons(bContext *C, void *node_v, int event) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); if(event==B_NODE_EXEC) { if(snode->treetype==NTREE_SHADER) { @@ -1050,7 +1050,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d) { float col[3]; View2DScrollers *scrollers; - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); UI_GetThemeColor3fv(TH_BACK, col); glClearColor(col[0], col[1], col[2], 0); diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 0384965e49e..fe68a56dea5 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -1089,7 +1089,7 @@ typedef struct NodeSizeWidget { static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); bNode *node= editnode_get_active(snode->edittree); NodeSizeWidget *nsw= op->customdata; @@ -1132,7 +1132,7 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event) static int node_resize_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); bNode *node= editnode_get_active(snode->edittree); @@ -1691,7 +1691,7 @@ void node_mute(SpaceNode *snode) int node_duplicate_exec(bContext *C, wmOperator *op) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ntreeCopyTree(snode->edittree, 1); /* 1 == internally selected nodes */ @@ -1833,7 +1833,7 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeSocket *tsock, bNodeL /* in_out = starting socket */ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); NodeLinkDrag *nldrag= op->customdata; bNode *tnode, *node; @@ -1970,7 +1970,7 @@ static int node_link_init(SpaceNode *snode, NodeLinkDrag *nldrag) static int node_link_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); NodeLinkDrag *nldrag= MEM_callocN(sizeof(NodeLinkDrag), "drag link op customdata"); @@ -2166,7 +2166,7 @@ static int cut_links_intersect(bNodeLink *link, float mcoords[][2], int tot) static int cut_links_exec(bContext *C, wmOperator *op) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); float mcoords[256][2]; int i= 0; @@ -2573,7 +2573,7 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt) static int node_delete_selection_exec(bContext *C, wmOperator *op) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); node_delete(snode); diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c index 8c48d4b54e1..367242d1262 100644 --- a/source/blender/editors/space_node/node_header.c +++ b/source/blender/editors/space_node/node_header.c @@ -67,7 +67,7 @@ static void do_node_selectmenu(bContext *C, void *arg, int event) { ScrArea *curarea= CTX_wm_area(C); - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); /* functions in editnode.c assume there's a tree */ if(snode->nodetree==NULL) @@ -124,7 +124,7 @@ static uiBlock *node_selectmenu(bContext *C, ARegion *ar, void *arg_unused) void do_node_addmenu(bContext *C, void *arg, int event) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); bNode *node; /* store selection in temp test flag */ @@ -144,7 +144,7 @@ void do_node_addmenu(bContext *C, void *arg, int event) static void node_make_addmenu(bContext *C, int nodeclass, uiBlock *block) { Main *bmain= CTX_data_main(C); - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); bNodeTree *ntree; int tot= 0, a; short yco= 0, menuwidth=120; @@ -393,7 +393,7 @@ static uiBlock *node_add_dynamicmenu(bContext *C, ARegion *ar, void *arg_unused) static uiBlock *node_addmenu(bContext *C, ARegion *ar, void *arg_unused) { ScrArea *curarea= CTX_wm_area(C); - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); uiBlock *block; short yco= 0, menuwidth=120; @@ -449,7 +449,7 @@ static uiBlock *node_addmenu(bContext *C, ARegion *ar, void *arg_unused) static void do_node_nodemenu(bContext *C, void *arg, int event) { ScrArea *curarea= CTX_wm_area(C); - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); int fromlib=0; /* functions in editnode.c assume there's a tree */ @@ -514,7 +514,7 @@ static void do_node_nodemenu(bContext *C, void *arg, int event) static uiBlock *node_nodemenu(bContext *C, ARegion *ar, void *arg_unused) { ScrArea *curarea= CTX_wm_area(C); - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); uiBlock *block; short yco= 0, menuwidth=120; @@ -574,7 +574,7 @@ static uiBlock *node_nodemenu(bContext *C, ARegion *ar, void *arg_unused) static void do_node_viewmenu(bContext *C, void *arg, int event) { -// SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); +// SpaceNode *snode= CTX_wm_space_node(C); // ARegion *ar= CTX_wm_region(C); ScrArea *sa= CTX_wm_area(C); @@ -598,7 +598,7 @@ static void do_node_viewmenu(bContext *C, void *arg, int event) static uiBlock *node_viewmenu(bContext *C, ARegion *ar, void *arg_unused) { ScrArea *curarea= CTX_wm_area(C); - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); uiBlock *block; short yco= 0, menuwidth=120; @@ -641,7 +641,7 @@ static void do_node_buttons(bContext *C, void *arg, int event) { // NODE_FIX_ME : instead of using "current material/texture/scene", node editor can also pin context? // note: scene context better not gets overridden, that'll clash too much (ton) - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); Scene *scene= CTX_data_scene(C); Material *ma; Tex *tx; @@ -687,7 +687,7 @@ static void do_node_buttons(bContext *C, void *arg, int event) void node_header_buttons(const bContext *C, ARegion *ar) { ScrArea *sa= CTX_wm_area(C); - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); Scene *scene= CTX_data_scene(C); uiBlock *block; short xco, yco= 3; diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 450b17e69bb..73becc1ebe8 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -107,7 +107,7 @@ static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short static int node_select_exec(bContext *C, wmOperator *op) { // XXX wmWindow *window= CTX_wm_window(C); - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); int select_type; short mval[2]; @@ -232,7 +232,7 @@ static EnumPropertyItem prop_select_types[] = { static int node_borderselect_exec(bContext *C, wmOperator *op) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); bNode *node; rcti rect; diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c index f05a24ef05a..8d805490942 100644 --- a/source/blender/editors/space_node/node_state.c +++ b/source/blender/editors/space_node/node_state.c @@ -140,7 +140,7 @@ static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, short *mval) static int node_toggle_visibility_exec(bContext *C, wmOperator *op) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); ARegion *ar= CTX_wm_region(C); short mval[2]; @@ -187,7 +187,7 @@ static int node_fit_all_exec(bContext *C, wmOperator *op) { ScrArea *sa= CTX_wm_area(C); ARegion *ar= CTX_wm_region(C); - SpaceNode *snode= (SpaceNode *)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); snode_home(sa, ar, snode); ED_region_tag_redraw(ar); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 7c6667a83f2..25e1b368ccb 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -81,6 +81,7 @@ static SpaceLink *node_new(const bContext *C) ar->regiontype= RGN_TYPE_HEADER; ar->alignment= RGN_ALIGN_BOTTOM; +#if 0 /* channels */ ar= MEM_callocN(sizeof(ARegion), "nodetree area for node"); @@ -89,6 +90,7 @@ static SpaceLink *node_new(const bContext *C) ar->alignment= RGN_ALIGN_LEFT; //ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM); +#endif /* main area */ ar= MEM_callocN(sizeof(ARegion), "main area for node"); @@ -116,7 +118,7 @@ static SpaceLink *node_new(const bContext *C) ar->v2d.maxzoom= 1.21f; ar->v2d.scroll= (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM); - ar->v2d.keepzoom= V2D_KEEPZOOM|V2D_KEEPASPECT; + ar->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT; ar->v2d.keeptot= 0; return (SpaceLink *)snode; @@ -189,6 +191,7 @@ static SpaceLink *node_duplicate(SpaceLink *sl) return (SpaceLink *)snoden; } +#if 0 static void node_channel_area_init(wmWindowManager *wm, ARegion *ar) { UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy); @@ -217,6 +220,7 @@ static void node_channel_area_draw(const bContext *C, ARegion *ar) UI_view2d_scrollers_draw(C, v2d, scrollers); UI_view2d_scrollers_free(scrollers); } +#endif /* Initialise main area, setting handlers. */ static void node_main_area_init(wmWindowManager *wm, ARegion *ar) @@ -281,7 +285,7 @@ static void node_region_listener(ARegion *ar, wmNotifier *wmn) static int node_context(const bContext *C, const char *member, bContextDataResult *result) { - SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C); + SpaceNode *snode= CTX_wm_space_node(C); if(CTX_data_dir(member)) { static const char *dir[] = {"selected_nodes", NULL}; @@ -341,6 +345,7 @@ void ED_spacetype_node(void) BLI_addhead(&st->regiontypes, art); +#if 0 /* regions: channels */ art= MEM_callocN(sizeof(ARegionType), "spacetype node region"); art->regionid = RGN_TYPE_CHANNELS; @@ -351,6 +356,7 @@ void ED_spacetype_node(void) art->draw= node_channel_area_draw; BLI_addhead(&st->regiontypes, art); +#endif BKE_spacetype_register(st); diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 40324a5a65f..84dea679767 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -82,6 +82,8 @@ #include "BKE_sequence.h" #include "BKE_utildefines.h" +#include "ED_armature.h" +#include "ED_object.h" #include "ED_screen.h" #include "ED_util.h" #include "ED_types.h" @@ -103,7 +105,9 @@ #include "ED_armature.h" #include "ED_keyframing.h" #include "ED_object.h" +#include "ED_particle.h" #include "ED_screen.h" +#include "ED_view3d.h" #include "outliner_intern.h" @@ -129,18 +133,15 @@ /* ************* XXX **************** */ -static void BIF_undo_push() {} -static void BIF_preview_changed() {} static void error() {} -static int pupmenu() {return 0;} /* ********************************** */ /* ******************** PROTOTYPES ***************** */ -static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty); -static void outliner_do_object_operation(Scene *scene, SpaceOops *soops, ListBase *lb, - void (*operation_cb)(TreeElement *, TreeStoreElem *, TreeStoreElem *)); +static void outliner_draw_tree_element(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty); +static void outliner_do_object_operation(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb, + void (*operation_cb)(bContext *C, Scene *scene, TreeElement *, TreeStoreElem *, TreeStoreElem *)); /* ******************** PERSISTANT DATA ***************** */ @@ -552,16 +553,6 @@ static void outliner_add_scene_contents(SpaceOops *soops, ListBase *lb, Scene *s } outliner_add_element(soops, lb, sce->world, te, 0, 0); - - if(sce->scriptlink.scripts) { - int a= 0; - tenla= outliner_add_element(soops, lb, sce, te, TSE_SCRIPT_BASE, 0); - tenla->name= "Scripts"; - for (a=0; a<sce->scriptlink.totscript; a++) { - outliner_add_element(soops, &tenla->subtree, sce->scriptlink.scripts[a], tenla, 0, 0); - } - } - } static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv, @@ -570,7 +561,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i TreeElement *te; TreeStoreElem *tselem; ID *id= idv; - int a; + int a = 0; if(ELEM3(type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM)) { id= ((PointerRNA*)idv)->id.data; @@ -768,15 +759,6 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i ten->directdata= defgroup; } } - if(ob->scriptlink.scripts) { - TreeElement *tenla= outliner_add_element(soops, &te->subtree, ob, te, TSE_SCRIPT_BASE, 0); - int a= 0; - - tenla->name= "Scripts"; - for (a=0; a<ob->scriptlink.totscript; a++) { /* ** */ - outliner_add_element(soops, &tenla->subtree, ob->scriptlink.scripts[a], te, 0, 0); - } - } if(ob->dup_group) outliner_add_element(soops, &te->subtree, ob->dup_group, te, 0, 0); @@ -1141,6 +1123,46 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i } } } + else if(type == TSE_KEYMAP) { + wmKeyMap *km= (wmKeyMap *)idv; + wmKeymapItem *kmi; + char opname[OP_MAX_TYPENAME]; + + te->directdata= idv; + te->name= km->nameid; + + if(!(tselem->flag & TSE_CLOSED)) { + a= 0; + + for (kmi= km->keymap.first; kmi; kmi= kmi->next, a++) { + const char *key= WM_key_event_string(kmi->type); + + if(key[0]) { + wmOperatorType *ot= NULL; + + if(kmi->propvalue); + else ot= WM_operatortype_find(kmi->idname, 0); + + if(ot || kmi->propvalue) { + TreeElement *ten= outliner_add_element(soops, &te->subtree, kmi, te, TSE_KEYMAP_ITEM, a); + + ten->directdata= kmi; + + if(kmi->propvalue) { + ten->name= "Modal map, not yet"; + } + else { + WM_operator_py_idname(opname, ot->idname); + ten->name= BLI_strdup(opname); + ten->flag |= TE_FREE_NAME; + } + } + } + } + } + else + te->flag |= TE_LAZY_CLOSED; + } return te; } @@ -1394,6 +1416,14 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops) tselem->flag &= ~TSE_CLOSED; } } + else if(soops->outlinevis==SO_KEYMAP) { + wmWindowManager *wm= mainvar->wm.first; + wmKeyMap *km; + + for(km= wm->keymaps.first; km; km= km->next) { + ten= outliner_add_element(soops, &soops->tree, (void*)km, NULL, TSE_KEYMAP, 0); + } + } else { ten= outliner_add_element(soops, &soops->tree, OBACT, NULL, 0, 0); if(ten) ten->directdata= BASACT; @@ -1448,9 +1478,8 @@ static void outliner_set_flag(SpaceOops *soops, ListBase *lb, short flag, short /* --- */ -void object_toggle_visibility_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { - Scene *scene= NULL; // XXX Base *base= (Base *)te->directdata; if(base==NULL) base= object_in_scene((Object *)tselem->id, scene); @@ -1461,13 +1490,12 @@ void object_toggle_visibility_cb(TreeElement *te, TreeStoreElem *tsep, TreeStore static int outliner_toggle_visibility_exec(bContext *C, wmOperator *op) { - SpaceOops *soops= (SpaceOops *)CTX_wm_space_data(C); + SpaceOops *soops= CTX_wm_space_outliner(C); Scene *scene= CTX_data_scene(C); ARegion *ar= CTX_wm_region(C); - outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_visibility_cb); + outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_visibility_cb); - // XXX need proper notifiers here instead ED_region_tag_redraw(ar); return OPERATOR_FINISHED; @@ -1489,9 +1517,8 @@ void OUTLINER_OT_visibility_toggle(wmOperatorType *ot) /* --- */ -static void object_toggle_selectability_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +static void object_toggle_selectability_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { - Scene *scene= NULL; // XXX Base *base= (Base *)te->directdata; if(base==NULL) base= object_in_scene((Object *)tselem->id, scene); @@ -1502,13 +1529,12 @@ static void object_toggle_selectability_cb(TreeElement *te, TreeStoreElem *tsep, static int outliner_toggle_selectability_exec(bContext *C, wmOperator *op) { - SpaceOops *soops= (SpaceOops *)CTX_wm_space_data(C); + SpaceOops *soops= CTX_wm_space_outliner(C); Scene *scene= CTX_data_scene(C); ARegion *ar= CTX_wm_region(C); - outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_selectability_cb); + outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_selectability_cb); - // XXX need proper notifiers here instead ED_region_tag_redraw(ar); return OPERATOR_FINISHED; @@ -1530,9 +1556,8 @@ void OUTLINER_OT_selectability_toggle(wmOperatorType *ot) /* --- */ -void object_toggle_renderability_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +void object_toggle_renderability_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { - Scene *scene= NULL; // XXX Base *base= (Base *)te->directdata; if(base==NULL) base= object_in_scene((Object *)tselem->id, scene); @@ -1543,13 +1568,12 @@ void object_toggle_renderability_cb(TreeElement *te, TreeStoreElem *tsep, TreeSt static int outliner_toggle_renderability_exec(bContext *C, wmOperator *op) { - SpaceOops *soops= (SpaceOops *)CTX_wm_space_data(C); + SpaceOops *soops= CTX_wm_space_outliner(C); Scene *scene= CTX_data_scene(C); ARegion *ar= CTX_wm_region(C); - outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_renderability_cb); + outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_renderability_cb); - // XXX need proper notifiers here instead ED_region_tag_redraw(ar); return OPERATOR_FINISHED; @@ -1573,7 +1597,7 @@ void OUTLINER_OT_renderability_toggle(wmOperatorType *ot) static int outliner_toggle_expanded_exec(bContext *C, wmOperator *op) { - SpaceOops *soops= (SpaceOops *)CTX_wm_space_data(C); + SpaceOops *soops= CTX_wm_space_outliner(C); ARegion *ar= CTX_wm_region(C); if (outliner_has_one_flag(soops, &soops->tree, TSE_CLOSED, 1)) @@ -1581,7 +1605,6 @@ static int outliner_toggle_expanded_exec(bContext *C, wmOperator *op) else outliner_set_flag(soops, &soops->tree, TSE_CLOSED, 1); - // XXX need proper notifiers here instead ED_region_tag_redraw(ar); return OPERATOR_FINISHED; @@ -1605,7 +1628,7 @@ void OUTLINER_OT_expanded_toggle(wmOperatorType *ot) static int outliner_toggle_selected_exec(bContext *C, wmOperator *op) { - SpaceOops *soops= (SpaceOops *)CTX_wm_space_data(C); + SpaceOops *soops= CTX_wm_space_outliner(C); ARegion *ar= CTX_wm_region(C); if (outliner_has_one_flag(soops, &soops->tree, TSE_SELECTED, 1)) @@ -1615,7 +1638,6 @@ static int outliner_toggle_selected_exec(bContext *C, wmOperator *op) soops->storeflag |= SO_TREESTORE_REDRAW; - // XXX need proper notifiers here instead ED_region_tag_redraw(ar); return OPERATOR_FINISHED; @@ -1659,7 +1681,7 @@ static void outliner_openclose_level(SpaceOops *soops, ListBase *lb, int curleve static int outliner_one_level_exec(bContext *C, wmOperator *op) { - SpaceOops *soops= (SpaceOops *)CTX_wm_space_data(C); + SpaceOops *soops= CTX_wm_space_outliner(C); ARegion *ar= CTX_wm_region(C); int add= RNA_boolean_get(op->ptr, "open"); int level; @@ -1673,7 +1695,6 @@ static int outliner_one_level_exec(bContext *C, wmOperator *op) if(level) outliner_openclose_level(soops, &soops->tree, 1, level-1, 0); } - // XXX need proper notifiers here instead ED_region_tag_redraw(ar); return OPERATOR_FINISHED; @@ -1751,7 +1772,7 @@ void outliner_page_up_down(Scene *scene, ARegion *ar, SpaceOops *soops, int up) /* **** do clicks on items ******* */ -static int tree_element_active_renderlayer(TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_renderlayer(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set) { Scene *sce; @@ -1762,6 +1783,7 @@ static int tree_element_active_renderlayer(TreeElement *te, TreeStoreElem *tsele if(set) { sce->r.actlay= tselem->nr; + WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, sce); } else { return sce->r.actlay==tselem->nr; @@ -1769,13 +1791,12 @@ static int tree_element_active_renderlayer(TreeElement *te, TreeStoreElem *tsele return 0; } -static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te) +static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set) { TreeStoreElem *tselem= TREESTORE(te); Scene *sce; Base *base; Object *ob= NULL; - int shift= 0; // XXX /* if id is not object, we search back */ if(te->idcode==ID_OB) ob= (Object *)tselem->id; @@ -1794,7 +1815,7 @@ static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops for(base= FIRSTBASE; base; base= base->next) if(base->object==ob) break; if(base) { - if(shift) { + if(set==2) { /* swap select */ if(base->flag & SELECT) ED_base_object_select(base, BA_DESELECT); @@ -1814,11 +1835,14 @@ static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops ED_base_object_activate(C, base); /* adds notifier */ } -// XXX if(ob!=obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); -// else countall(); /* exit_editmode calls f() */ + if(ob!=scene->obedit) + ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); + + WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene); + } -static int tree_element_active_material(Scene *scene, SpaceOops *soops, TreeElement *te, int set) +static int tree_element_active_material(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set) { TreeElement *tes; Object *ob; @@ -1853,13 +1877,12 @@ static int tree_element_active_material(Scene *scene, SpaceOops *soops, TreeElem } } if(set) { -// XXX extern_set_butspace(F5KEY, 0); // force shading buttons - BIF_preview_changed(ID_MA); + WM_event_add_notifier(C, NC_MATERIAL|ND_SHADING, NULL); } return 0; } -static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeElement *te, int set) +static int tree_element_active_texture(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set) { TreeElement *tep; TreeStoreElem *tselem, *tselemp; @@ -1883,7 +1906,7 @@ static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeEleme if(set) { if(sbuts) { // XXX sbuts->tabo= TAB_SHADING_TEX; // hack from header_buttonswin.c - sbuts->texfrom= 1; + // XXX sbuts->texfrom= 1; } // XXX extern_set_butspace(F6KEY, 0); // force shading buttons texture wrld->texact= te->index; @@ -1897,7 +1920,7 @@ static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeEleme if(set) { if(sbuts) { // XXX sbuts->tabo= TAB_SHADING_TEX; // hack from header_buttonswin.c - sbuts->texfrom= 2; + // XXX sbuts->texfrom= 2; } // XXX extern_set_butspace(F6KEY, 0); // force shading buttons texture la->texact= te->index; @@ -1913,7 +1936,7 @@ static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeEleme if(set) { if(sbuts) { //sbuts->tabo= TAB_SHADING_TEX; // hack from header_buttonswin.c - sbuts->texfrom= 0; + // XXX sbuts->texfrom= 0; } // XXX extern_set_butspace(F6KEY, 0); // force shading buttons texture ma->texact= (char)te->index; @@ -1930,7 +1953,7 @@ static int tree_element_active_texture(Scene *scene, SpaceOops *soops, TreeEleme } -static int tree_element_active_lamp(Scene *scene, SpaceOops *soops, TreeElement *te, int set) +static int tree_element_active_lamp(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set) { Object *ob; @@ -1940,14 +1963,13 @@ static int tree_element_active_lamp(Scene *scene, SpaceOops *soops, TreeElement if(set) { // XXX extern_set_butspace(F5KEY, 0); - BIF_preview_changed(ID_LA); } else return 1; return 0; } -static int tree_element_active_world(Scene *scene, SpaceOops *soops, TreeElement *te, int set) +static int tree_element_active_world(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set) { TreeElement *tep; TreeStoreElem *tselem=NULL; @@ -1961,7 +1983,7 @@ static int tree_element_active_world(Scene *scene, SpaceOops *soops, TreeElement if(set) { // make new scene active if(sce && scene != sce) { - // XXX ED_screen_set_scene(C, sce); + ED_screen_set_scene(C, sce); } } @@ -1976,7 +1998,7 @@ static int tree_element_active_world(Scene *scene, SpaceOops *soops, TreeElement return 0; } -static int tree_element_active_defgroup(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_defgroup(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) { Object *ob; @@ -1985,6 +2007,7 @@ static int tree_element_active_defgroup(Scene *scene, TreeElement *te, TreeStore if(set) { ob->actdef= te->index+1; DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob); } else { if(ob==OBACT) @@ -1993,13 +2016,14 @@ static int tree_element_active_defgroup(Scene *scene, TreeElement *te, TreeStore return 0; } -static int tree_element_active_posegroup(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_posegroup(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) { Object *ob= (Object *)tselem->id; if(set) { if (ob->pose) { ob->pose->active_group= te->index+1; + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob); } } else { @@ -2010,7 +2034,7 @@ static int tree_element_active_posegroup(Scene *scene, TreeElement *te, TreeStor return 0; } -static int tree_element_active_posechannel(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_posechannel(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) { Object *ob= (Object *)tselem->id; bPoseChannel *pchan= te->directdata; @@ -2018,10 +2042,16 @@ static int tree_element_active_posechannel(Scene *scene, TreeElement *te, TreeSt if(set) { if(!(pchan->bone->flag & BONE_HIDDEN_P)) { -// XXX if(G.qual & LR_SHIFTKEY) deselectall_posearmature(ob, 2, 0); // 2 = clear active tag -// else deselectall_posearmature(ob, 0, 0); // 0 = deselect - pchan->bone->flag |= BONE_SELECTED|BONE_ACTIVE; + if(set==2) ED_pose_deselectall(ob, 2, 0); // 2 = clear active tag + else ED_pose_deselectall(ob, 0, 0); // 0 = deselect + + if(set==2 && (pchan->bone->flag & BONE_SELECTED)) + pchan->bone->flag &= ~(BONE_SELECTED|BONE_ACTIVE); + else + pchan->bone->flag |= BONE_SELECTED|BONE_ACTIVE; + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, ob); + } } else { @@ -2032,17 +2062,22 @@ static int tree_element_active_posechannel(Scene *scene, TreeElement *te, TreeSt return 0; } -static int tree_element_active_bone(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_bone(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) { bArmature *arm= (bArmature *)tselem->id; Bone *bone= te->directdata; if(set) { if(!(bone->flag & BONE_HIDDEN_P)) { -// XXX if(G.qual & LR_SHIFTKEY) deselectall_posearmature(OBACT, 2, 0); // 2 is clear active tag -// else deselectall_posearmature(OBACT, 0, 0); - bone->flag |= BONE_SELECTED|BONE_ACTIVE; + if(set==2) ED_pose_deselectall(OBACT, 2, 0); // 2 is clear active tag + else ED_pose_deselectall(OBACT, 0, 0); + if(set==2 && (bone->flag & BONE_SELECTED)) + bone->flag &= ~(BONE_SELECTED|BONE_ACTIVE); + else + bone->flag |= BONE_SELECTED|BONE_ACTIVE; + + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, OBACT); } } else { @@ -2057,21 +2092,21 @@ static int tree_element_active_bone(Scene *scene, TreeElement *te, TreeStoreElem /* ebones only draw in editmode armature */ -static int tree_element_active_ebone(TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_ebone(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) { EditBone *ebone= te->directdata; -// int shift= 0; // XXX if(set) { if(!(ebone->flag & BONE_HIDDEN_A)) { -// XXX if(shift) deselectall_armature(2, 0); // only clear active tag -// else deselectall_armature(0, 0); // deselect + if(set==2) ED_armature_deselectall(scene->obedit, 2, 0); // only clear active tag + else ED_armature_deselectall(scene->obedit, 0, 0); // deselect ebone->flag |= BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL|BONE_ACTIVE; // flush to parent? if(ebone->parent && (ebone->flag & BONE_CONNECTED)) ebone->parent->flag |= BONE_TIPSEL; + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, scene->obedit); } } else { @@ -2080,70 +2115,84 @@ static int tree_element_active_ebone(TreeElement *te, TreeStoreElem *tselem, int return 0; } -static int tree_element_active_modifier(TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_modifier(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set) { if(set) { + Object *ob= (Object *)tselem->id; + + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + // XXX extern_set_butspace(F9KEY, 0); } return 0; } -static int tree_element_active_psys(TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_psys(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) { if(set) { -// Object *ob= (Object *)tselem->id; -// ParticleSystem *psys= te->directdata; + Object *ob= (Object *)tselem->id; + ParticleSystem *psys= te->directdata; + + PE_change_act_psys(scene, ob, psys); + WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob); -// XXX PE_change_act_psys(ob, psys); // XXX extern_set_butspace(F7KEY, 0); } return 0; } -static int tree_element_active_constraint(TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_constraint(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set) { if(set) { + Object *ob= (Object *)tselem->id; + + WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob); // XXX extern_set_butspace(F7KEY, 0); } return 0; } -static int tree_element_active_text(Scene *scene, SpaceOops *soops, TreeElement *te, int set) +static int tree_element_active_text(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set) { // XXX removed return 0; } /* generic call for ID data check or make/check active in UI */ -static int tree_element_active(Scene *scene, SpaceOops *soops, TreeElement *te, int set) +static int tree_element_active(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set) { switch(te->idcode) { case ID_MA: - return tree_element_active_material(scene, soops, te, set); + return tree_element_active_material(C, scene, soops, te, set); case ID_WO: - return tree_element_active_world(scene, soops, te, set); + return tree_element_active_world(C, scene, soops, te, set); case ID_LA: - return tree_element_active_lamp(scene, soops, te, set); + return tree_element_active_lamp(C, scene, soops, te, set); case ID_TE: - return tree_element_active_texture(scene, soops, te, set); + return tree_element_active_texture(C, scene, soops, te, set); case ID_TXT: - return tree_element_active_text(scene, soops, te, set); + return tree_element_active_text(C, scene, soops, te, set); } return 0; } -static int tree_element_active_pose(TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_pose(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) { Object *ob= (Object *)tselem->id; + Base *base= object_in_scene(ob, scene); if(set) { -// XXX if(obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); -// if(ob->flag & OB_POSEMODE) exit_posemode(); -// else enter_posemode(); + if(scene->obedit) + ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); + + if(ob->flag & OB_POSEMODE) + ED_armature_exit_posemode(C, base); + else + ED_armature_enter_posemode(C, base); } else { if(ob->flag & OB_POSEMODE) return 1; @@ -2151,7 +2200,7 @@ static int tree_element_active_pose(TreeElement *te, TreeStoreElem *tselem, int return 0; } -static int tree_element_active_sequence(TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_sequence(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set) { Sequence *seq= (Sequence*) te->directdata; @@ -2165,7 +2214,7 @@ static int tree_element_active_sequence(TreeElement *te, TreeStoreElem *tselem, return(0); } -static int tree_element_active_sequence_dup(Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) +static int tree_element_active_sequence_dup(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set) { Sequence *seq, *p; Editing *ed= seq_give_editing(scene, FALSE); @@ -2192,6 +2241,21 @@ static int tree_element_active_sequence_dup(Scene *scene, TreeElement *te, TreeS return(0); } +static int tree_element_active_keymap_item(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set) +{ + wmKeymapItem *kmi= te->directdata; + + if(set==0) { + if(kmi->inactive) return 0; + return 1; + } + else { + kmi->inactive= !kmi->inactive; + } + return 0; +} + + /* generic call for non-id data to make/check active in UI */ /* Context can be NULL when set==0 */ static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, TreeStoreElem *tselem, int set) @@ -2199,59 +2263,56 @@ static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops *soops, switch(tselem->type) { case TSE_DEFGROUP: - return tree_element_active_defgroup(scene, te, tselem, set); + return tree_element_active_defgroup(C, scene, te, tselem, set); case TSE_BONE: - return tree_element_active_bone(scene, te, tselem, set); + return tree_element_active_bone(C, scene, te, tselem, set); case TSE_EBONE: - return tree_element_active_ebone(te, tselem, set); + return tree_element_active_ebone(C, scene, te, tselem, set); case TSE_MODIFIER: - return tree_element_active_modifier(te, tselem, set); + return tree_element_active_modifier(C, te, tselem, set); case TSE_LINKED_OB: - if(set) tree_element_set_active_object(C, scene, soops, te); + if(set) tree_element_set_active_object(C, scene, soops, te, set); else if(tselem->id==(ID *)OBACT) return 1; break; case TSE_LINKED_PSYS: - return tree_element_active_psys(te, tselem, set); - break; + return tree_element_active_psys(C, scene, te, tselem, set); case TSE_POSE_BASE: - return tree_element_active_pose(te, tselem, set); - break; + return tree_element_active_pose(C, scene, te, tselem, set); case TSE_POSE_CHANNEL: - return tree_element_active_posechannel(scene, te, tselem, set); + return tree_element_active_posechannel(C, scene, te, tselem, set); case TSE_CONSTRAINT: - return tree_element_active_constraint(te, tselem, set); + return tree_element_active_constraint(C, te, tselem, set); case TSE_R_LAYER: - return tree_element_active_renderlayer(te, tselem, set); + return tree_element_active_renderlayer(C, te, tselem, set); case TSE_POSEGRP: - return tree_element_active_posegroup(scene, te, tselem, set); + return tree_element_active_posegroup(C, scene, te, tselem, set); case TSE_SEQUENCE: - return tree_element_active_sequence(te, tselem, set); - break; + return tree_element_active_sequence(C, te, tselem, set); case TSE_SEQUENCE_DUP: - return tree_element_active_sequence_dup(scene, te, tselem, set); - break; + return tree_element_active_sequence_dup(C, scene, te, tselem, set); + case TSE_KEYMAP_ITEM: + return tree_element_active_keymap_item(C, te, tselem, set); + } return 0; } -static int do_outliner_mouse_event(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, short event, float *mval) +static int do_outliner_item_activate(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int extend, float *mval) { - int shift= 0, ctrl= 0; // XXX if(mval[1]>te->ys && mval[1]<te->ys+OL_H) { TreeStoreElem *tselem= TREESTORE(te); int openclose= 0; - /* open close icon, three things to check */ - if(event==RETKEY || event==PADENTER) openclose= 1; // enter opens/closes always - else if((te->flag & TE_ICONROW)==0) { // hidden icon, no open/close - if( mval[0]>te->xs && mval[0]<te->xs+OL_X) openclose= 1; + /* open close icon */ + if((te->flag & TE_ICONROW)==0) { // hidden icon, no open/close + if( mval[0]>te->xs && mval[0]<te->xs+OL_X) + openclose= 1; } if(openclose) { - /* all below close/open? */ - if(shift) { + if(extend) { tselem->flag &= ~TSE_CLOSED; outliner_set_flag(soops, &te->subtree, TSE_CLOSED, !outliner_has_one_flag(soops, &te->subtree, TSE_CLOSED, 1)); } @@ -2260,95 +2321,66 @@ static int do_outliner_mouse_event(bContext *C, Scene *scene, ARegion *ar, Space else tselem->flag |= TSE_CLOSED; } - + return 1; } /* name and first icon */ else if(mval[0]>te->xs && mval[0]<te->xend) { - /* activate a name button? */ - if(event==LEFTMOUSE) { + /* always makes active object */ + if(tselem->type!=TSE_SEQUENCE && tselem->type!=TSE_SEQ_STRIP && tselem->type!=TSE_SEQUENCE_DUP) + tree_element_set_active_object(C, scene, soops, te, 1 + (extend!=0 && tselem->type==0)); - if (ctrl) { - if(ELEM10(tselem->type, TSE_ANIM_DATA, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_POSEGRP_BASE, TSE_R_LAYER_BASE, TSE_R_PASS)) - error("Cannot edit builtin name"); - else if(ELEM3(tselem->type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP)) - error("Cannot edit sequence name"); - else if(tselem->id->lib) { -// XXX error_libdata(); - } else if(te->idcode == ID_LI && te->parent) { - error("Cannot edit the path of an indirectly linked library"); - } else { - tselem->flag |= TSE_TEXTBUT; + if(tselem->type==0) { // the lib blocks + /* editmode? */ + if(te->idcode==ID_SCE) { + if(scene!=(Scene *)tselem->id) { + ED_screen_set_scene(C, (Scene *)tselem->id); } - } else { - /* always makes active object */ - if(tselem->type!=TSE_SEQUENCE && tselem->type!=TSE_SEQ_STRIP && tselem->type!=TSE_SEQUENCE_DUP) - tree_element_set_active_object(C, scene, soops, te); - - if(tselem->type==0) { // the lib blocks - /* editmode? */ - if(te->idcode==ID_SCE) { - if(scene!=(Scene *)tselem->id) { - ED_screen_set_scene(C, (Scene *)tselem->id); - } - } - else if(ELEM5(te->idcode, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR)) { -// XXX if(obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); -// else { -// enter_editmode(EM_WAITCURSOR); -// extern_set_butspace(F9KEY, 0); -// } - } else { // rest of types - tree_element_active(scene, soops, te, 1); - } - - } - else tree_element_type_active(C, scene, soops, te, tselem, 1); } - } - else if(event==RIGHTMOUSE) { - /* select object that's clicked on and popup context menu */ - if (!(tselem->flag & TSE_SELECTED)) { - - if ( outliner_has_one_flag(soops, &soops->tree, TSE_SELECTED, 1) ) - outliner_set_flag(soops, &soops->tree, TSE_SELECTED, 0); - - tselem->flag |= TSE_SELECTED; - /* redraw, same as outliner_select function */ - soops->storeflag |= SO_TREESTORE_REDRAW; -// XXX screen_swapbuffers(); + else if(ELEM5(te->idcode, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR)) { + Object *obedit= CTX_data_edit_object(C); + if(obedit) + ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); + else { + ED_object_enter_editmode(C, EM_WAITCURSOR); + // XXX extern_set_butspace(F9KEY, 0); + } + } else { // rest of types + tree_element_active(C, scene, soops, te, 1); } - outliner_operation_menu(scene, ar, soops); } + else tree_element_type_active(C, scene, soops, te, tselem, 1+(extend!=0)); + return 1; } } for(te= te->subtree.first; te; te= te->next) { - if(do_outliner_mouse_event(C, scene, ar, soops, te, event, mval)) return 1; + if(do_outliner_item_activate(C, scene, ar, soops, te, extend, mval)) return 1; } return 0; } /* event can enterkey, then it opens/closes */ -static int outliner_activate_click(bContext *C, wmOperator *op, wmEvent *event) +static int outliner_item_activate(bContext *C, wmOperator *op, wmEvent *event) { Scene *scene= CTX_data_scene(C); ARegion *ar= CTX_wm_region(C); - SpaceOops *soops= (SpaceOops*)CTX_wm_space_data(C); + SpaceOops *soops= CTX_wm_space_outliner(C); TreeElement *te; float fmval[2]; + int extend= RNA_boolean_get(op->ptr, "extend"); UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, fmval, fmval+1); for(te= soops->tree.first; te; te= te->next) { - if(do_outliner_mouse_event(C, scene, ar, soops, te, event->type, fmval)) break; + if(do_outliner_item_activate(C, scene, ar, soops, te, extend, fmval)) break; } if(te) { - BIF_undo_push("Outliner click event"); + ED_undo_push(C, "Outliner click event"); } else { short selecting= -1; @@ -2361,24 +2393,148 @@ static int outliner_activate_click(bContext *C, wmOperator *op, wmEvent *event) /* select relevant row */ outliner_select(soops, &soops->tree, &row, &selecting); - // XXX old flag found in old code, do we still use this? - //soops->storeflag |= SO_TREESTORE_REDRAW; + soops->storeflag |= SO_TREESTORE_REDRAW; - BIF_undo_push("Outliner selection event"); + ED_undo_push(C, "Outliner selection event"); } - // XXX need proper notifiers here instead ED_region_tag_redraw(ar); return OPERATOR_FINISHED; } -void OUTLINER_OT_activate_click(wmOperatorType *ot) +void OUTLINER_OT_item_activate(wmOperatorType *ot) +{ + ot->name= "Activate Item"; + ot->idname= "OUTLINER_OT_item_activate"; + + ot->invoke= outliner_item_activate; + + ot->poll= ED_operator_outliner_active; + + RNA_def_boolean(ot->srna, "extend", 1, "Extend", "Extend selection for activation."); +} + +/* *********** */ + +static int do_outliner_item_openclose(bContext *C, SpaceOops *soops, TreeElement *te, int all, float *mval) +{ + + if(mval[1]>te->ys && mval[1]<te->ys+OL_H) { + TreeStoreElem *tselem= TREESTORE(te); + + /* all below close/open? */ + if(all) { + tselem->flag &= ~TSE_CLOSED; + outliner_set_flag(soops, &te->subtree, TSE_CLOSED, !outliner_has_one_flag(soops, &te->subtree, TSE_CLOSED, 1)); + } + else { + if(tselem->flag & TSE_CLOSED) tselem->flag &= ~TSE_CLOSED; + else tselem->flag |= TSE_CLOSED; + } + + return 1; + } + + for(te= te->subtree.first; te; te= te->next) { + if(do_outliner_item_openclose(C, soops, te, all, mval)) + return 1; + } + return 0; + +} + +/* event can enterkey, then it opens/closes */ +static int outliner_item_openclose(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar= CTX_wm_region(C); + SpaceOops *soops= CTX_wm_space_outliner(C); + TreeElement *te; + float fmval[2]; + int all= RNA_boolean_get(op->ptr, "all"); + + UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, fmval, fmval+1); + + for(te= soops->tree.first; te; te= te->next) { + if(do_outliner_item_openclose(C, soops, te, all, fmval)) + break; + } + + ED_region_tag_redraw(ar); + + return OPERATOR_FINISHED; +} + +void OUTLINER_OT_item_openclose(wmOperatorType *ot) +{ + ot->name= "Open/Close Item"; + ot->idname= "OUTLINER_OT_item_openclose"; + + ot->invoke= outliner_item_openclose; + + ot->poll= ED_operator_outliner_active; + + RNA_def_boolean(ot->srna, "all", 1, "All", "Close or open all items."); + +} + + +/* ********************************************** */ + +static int do_outliner_item_rename(bContext *C, ARegion *ar, SpaceOops *soops, TreeElement *te, float *mval) +{ + + if(mval[1]>te->ys && mval[1]<te->ys+OL_H) { + TreeStoreElem *tselem= TREESTORE(te); + + /* name and first icon */ + if(mval[0]>te->xs && mval[0]<te->xend) { + + if(ELEM10(tselem->type, TSE_ANIM_DATA, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_POSEGRP_BASE, TSE_R_LAYER_BASE, TSE_R_PASS)) + error("Cannot edit builtin name"); + else if(ELEM3(tselem->type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP)) + error("Cannot edit sequence name"); + else if(tselem->id->lib) { + // XXX error_libdata(); + } else if(te->idcode == ID_LI && te->parent) { + error("Cannot edit the path of an indirectly linked library"); + } else { + tselem->flag |= TSE_TEXTBUT; + ED_region_tag_redraw(ar); + } + } + return 1; + } + + for(te= te->subtree.first; te; te= te->next) { + if(do_outliner_item_rename(C, ar, soops, te, mval)) return 1; + } + return 0; +} + +static int outliner_item_rename(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar= CTX_wm_region(C); + SpaceOops *soops= CTX_wm_space_outliner(C); + TreeElement *te; + float fmval[2]; + + UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, fmval, fmval+1); + + for(te= soops->tree.first; te; te= te->next) { + if(do_outliner_item_rename(C, ar, soops, te, fmval)) break; + } + + return OPERATOR_FINISHED; +} + + +void OUTLINER_OT_item_rename(wmOperatorType *ot) { - ot->name= "Activate Click"; - ot->idname= "OUTLINER_OT_activate_click"; + ot->name= "Rename Item"; + ot->idname= "OUTLINER_OT_item_rename"; - ot->invoke= outliner_activate_click; + ot->invoke= outliner_item_rename; ot->poll= ED_operator_outliner_active; } @@ -2437,7 +2593,7 @@ static TreeElement *outliner_find_id(SpaceOops *soops, ListBase *lb, ID *id) static int outliner_show_active_exec(bContext *C, wmOperator *op) { - SpaceOops *so= (SpaceOops *)CTX_wm_space_data(C); + SpaceOops *so= CTX_wm_space_outliner(C); Scene *scene= CTX_data_scene(C); ARegion *ar= CTX_wm_region(C); View2D *v2d= &ar->v2d; @@ -2466,7 +2622,6 @@ static int outliner_show_active_exec(bContext *C, wmOperator *op) so->storeflag |= SO_TREESTORE_REDRAW; } - // XXX need proper notifiers here instead ED_region_tag_redraw(ar); return OPERATOR_FINISHED; @@ -2668,14 +2823,13 @@ static void tree_element_show_hierarchy(Scene *scene, SpaceOops *soops, ListBase /* show entire object level hierarchy */ static int outliner_show_hierarchy_exec(bContext *C, wmOperator *op) { - SpaceOops *soops= (SpaceOops *)CTX_wm_space_data(C); + SpaceOops *soops= CTX_wm_space_outliner(C); ARegion *ar= CTX_wm_region(C); Scene *scene= CTX_data_scene(C); /* recursively open/close levels */ tree_element_show_hierarchy(scene, soops, &soops->tree); - // XXX need proper notifiers here instead ED_region_tag_redraw(ar); return OPERATOR_FINISHED; @@ -2752,13 +2906,10 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb, tselem= TREESTORE(te); if(tselem->flag & TSE_SELECTED) { if(tselem->type) { - if(tselem->type==TSE_SEQUENCE) - *datalevel= TSE_SEQUENCE; - else if(tselem->type==TSE_SEQ_STRIP) - *datalevel= TSE_SEQ_STRIP; - else if(tselem->type==TSE_SEQUENCE_DUP) - *datalevel= TSE_SEQUENCE_DUP; - else if(*datalevel!=tselem->type) *datalevel= -1; + if(*datalevel==0) + *datalevel= tselem->type; + else if(*datalevel!=tselem->type) + *datalevel= -1; } else { int idcode= GS(tselem->id->name); @@ -2788,7 +2939,7 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb, } } -static void unlink_material_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +static void unlink_material_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { Material **matar=NULL; int a, totcol=0; @@ -2822,7 +2973,7 @@ static void unlink_material_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreEl } } -static void unlink_texture_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +static void unlink_texture_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { MTex **mtex= NULL; int a; @@ -2851,7 +3002,7 @@ static void unlink_texture_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreEle } } -static void unlink_group_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +static void unlink_group_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { Group *group= (Group *)tselem->id; @@ -2867,8 +3018,8 @@ static void unlink_group_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem } } -static void outliner_do_libdata_operation(SpaceOops *soops, ListBase *lb, - void (*operation_cb)(TreeElement *, TreeStoreElem *, TreeStoreElem *)) +static void outliner_do_libdata_operation(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb, + void (*operation_cb)(bContext *C, Scene *scene, TreeElement *, TreeStoreElem *, TreeStoreElem *)) { TreeElement *te; TreeStoreElem *tselem; @@ -2878,20 +3029,19 @@ static void outliner_do_libdata_operation(SpaceOops *soops, ListBase *lb, if(tselem->flag & TSE_SELECTED) { if(tselem->type==0) { TreeStoreElem *tsep= TREESTORE(te->parent); - operation_cb(te, tsep, tselem); + operation_cb(C, scene, te, tsep, tselem); } } if((tselem->flag & TSE_CLOSED)==0) { - outliner_do_libdata_operation(soops, &te->subtree, operation_cb); + outliner_do_libdata_operation(C, scene, soops, &te->subtree, operation_cb); } } } /* */ -static void object_select_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +static void object_select_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { - Scene *scene= NULL; // XXX Base *base= (Base *)te->directdata; if(base==NULL) base= object_in_scene((Object *)tselem->id, scene); @@ -2901,9 +3051,8 @@ static void object_select_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem } } -static void object_deselect_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +static void object_deselect_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { - Scene *scene= NULL; Base *base= (Base *)te->directdata; if(base==NULL) base= object_in_scene((Object *)tselem->id, scene); @@ -2913,28 +3062,31 @@ static void object_deselect_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreEl } } -static void object_delete_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { - Scene *scene= NULL; Base *base= (Base *)te->directdata; - if(base==NULL) base= object_in_scene((Object *)tselem->id, scene); + if(base==NULL) + base= object_in_scene((Object *)tselem->id, scene); if(base) { // check also library later -// XXX if(obedit==base->object) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); + if(scene->obedit==base->object) + ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); if(base==BASACT) { - G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE); -// XXX setcursor_space(SPACE_VIEW3D, CURSOR_STD); + ED_view3d_exit_paint_modes(C); } -// XXX free_and_unlink_base(base); + ED_base_object_free_and_unlink(scene, base); te->directdata= NULL; tselem->id= NULL; } + + WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene); + } -static void id_local_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +static void id_local_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { if(tselem->id->lib && (tselem->id->flag & LIB_EXTERN)) { tselem->id->lib= NULL; @@ -2943,9 +3095,8 @@ static void id_local_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tse } } -static void group_linkobs2scene_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) +static void group_linkobs2scene_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem) { - Scene *scene= NULL; Group *group= (Group *)tselem->id; GroupObject *gob; Base *base; @@ -2968,8 +3119,8 @@ static void group_linkobs2scene_cb(TreeElement *te, TreeStoreElem *tsep, TreeSto } } -static void outliner_do_object_operation(Scene *scene, SpaceOops *soops, ListBase *lb, - void (*operation_cb)(TreeElement *, TreeStoreElem *, TreeStoreElem *)) +static void outliner_do_object_operation(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb, + void (*operation_cb)(bContext *C, Scene *scene, TreeElement *, TreeStoreElem *, TreeStoreElem *)) { TreeElement *te; TreeStoreElem *tselem; @@ -2981,18 +3132,20 @@ static void outliner_do_object_operation(Scene *scene, SpaceOops *soops, ListBas // when objects selected in other scenes... dunno if that should be allowed Scene *sce= (Scene *)outliner_search_back(soops, te, ID_SCE); if(sce && scene != sce) { -// XXX ED_screen_set_scene(C, sce); + ED_screen_set_scene(C, sce); } - operation_cb(te, NULL, tselem); + operation_cb(C, scene, te, NULL, tselem); } } if((tselem->flag & TSE_CLOSED)==0) { - outliner_do_object_operation(scene, soops, &te->subtree, operation_cb); + outliner_do_object_operation(C, scene, soops, &te->subtree, operation_cb); } } } +/* ******************************************** */ + static void pchan_cb(int event, TreeElement *te, TreeStoreElem *tselem) { bPoseChannel *pchan= (bPoseChannel *)te->directdata; @@ -3068,145 +3221,387 @@ static void outliner_do_data_operation(SpaceOops *soops, int type, int event, Li } } -void outliner_del(Scene *scene, ARegion *ar, SpaceOops *soops) +void outliner_del(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops) +{ + + if(soops->outlinevis==SO_SEQUENCE) + ;// del_seq(); + else { + outliner_do_object_operation(C, scene, soops, &soops->tree, object_delete_cb); + DAG_scene_sort(scene); + ED_undo_push(C, "Delete Objects"); + } +} + +/* **************************************** */ + +static EnumPropertyItem prop_object_op_types[] = { + {1, "SELECT", 0, "Select", ""}, + {2, "DESELECT", 0, "Deselect", ""}, + {4, "DELETE", 0, "Delete", ""}, + {6, "TOGVIS", 0, "Toggle Visible", ""}, + {7, "TOGSEL", 0, "Toggle Selectable", ""}, + {8, "TOGREN", 0, "Toggle Renderable", ""}, + {0, NULL, 0, NULL, NULL} +}; + +static int outliner_object_operation_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + SpaceOops *soops= CTX_wm_space_outliner(C); + int event; + char *str; + + /* check for invalid states */ + if (soops == NULL) + return OPERATOR_CANCELLED; + + event= RNA_enum_get(op->ptr, "type"); + + if(event==1) { + Scene *sce= scene; // to be able to delete, scenes are set... + outliner_do_object_operation(C, scene, soops, &soops->tree, object_select_cb); + if(scene != sce) { + ED_screen_set_scene(C, sce); + } + + str= "Select Objects"; + } + else if(event==2) { + outliner_do_object_operation(C, scene, soops, &soops->tree, object_deselect_cb); + str= "Deselect Objects"; + } + else if(event==4) { + outliner_do_object_operation(C, scene, soops, &soops->tree, object_delete_cb); + DAG_scene_sort(scene); + str= "Delete Objects"; + } + else if(event==5) { /* disabled, see above (ton) */ + outliner_do_object_operation(C, scene, soops, &soops->tree, id_local_cb); + str= "Localized Objects"; + } + else if(event==6) { + outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_visibility_cb); + str= "Toggle Visibility"; + } + else if(event==7) { + outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_selectability_cb); + str= "Toggle Selectability"; + } + else if(event==8) { + outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_renderability_cb); + str= "Toggle Renderability"; + } + + WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene); + + ED_undo_push(C, str); + + return OPERATOR_FINISHED; +} + + +void OUTLINER_OT_object_operation(wmOperatorType *ot) { + /* identifiers */ + ot->name= "Outliner Object Operation"; + ot->idname= "OUTLINER_OT_object_operation"; + ot->description= ""; -// XXX if(soops->outlinevis==SO_SEQUENCE) -// del_seq(); -// else { -// outliner_do_object_operation(scene, soops, &soops->tree, object_delete_cb); -// DAG_scene_sort(scene); -// BIF_undo_push("Delete Objects"); -// } + /* callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= outliner_object_operation_exec; + ot->poll= ED_operator_outliner_active; + + ot->flag= 0; + + RNA_def_enum(ot->srna, "type", prop_object_op_types, 0, "Object Operation", ""); } +/* **************************************** */ -void outliner_operation_menu(Scene *scene, ARegion *ar, SpaceOops *soops) +static EnumPropertyItem prop_group_op_types[] = { + {1, "UNLINK", 0, "Unlink", ""}, + {2, "LOCAL", 0, "Make Local", ""}, + {3, "LINK", 0, "Link Group Objects to Scene", ""}, + {0, NULL, 0, NULL, NULL} +}; + +static int outliner_group_operation_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); + SpaceOops *soops= CTX_wm_space_outliner(C); + int event; + + /* check for invalid states */ + if (soops == NULL) + return OPERATOR_CANCELLED; + + event= RNA_enum_get(op->ptr, "type"); + + if(event==1) { + outliner_do_libdata_operation(C, scene, soops, &soops->tree, unlink_group_cb); + ED_undo_push(C, "Unlink group"); + } + else if(event==2) { + outliner_do_libdata_operation(C, scene, soops, &soops->tree, id_local_cb); + ED_undo_push(C, "Localized Data"); + } + else if(event==3) { + outliner_do_libdata_operation(C, scene, soops, &soops->tree, group_linkobs2scene_cb); + ED_undo_push(C, "Link Group Objects to Scene"); + } + + + WM_event_add_notifier(C, NC_GROUP, NULL); + + return OPERATOR_FINISHED; +} + + +void OUTLINER_OT_group_operation(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Outliner Group Operation"; + ot->idname= "OUTLINER_OT_group_operation"; + ot->description= ""; + + /* callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= outliner_group_operation_exec; + ot->poll= ED_operator_outliner_active; + + ot->flag= 0; + + RNA_def_enum(ot->srna, "type", prop_group_op_types, 0, "Group Operation", ""); +} + +/* **************************************** */ + +static EnumPropertyItem prop_id_op_types[] = { + {1, "UNLINK", 0, "Unlink", ""}, + {2, "LOCAL", 0, "Make Local", ""}, + {0, NULL, 0, NULL, NULL} +}; + +static int outliner_id_operation_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + SpaceOops *soops= CTX_wm_space_outliner(C); int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0; + int event; + + /* check for invalid states */ + if (soops == NULL) + return OPERATOR_CANCELLED; set_operation_types(soops, &soops->tree, &scenelevel, &objectlevel, &idlevel, &datalevel); - if(scenelevel) { - if(objectlevel || datalevel || idlevel) error("Mixed selection"); - else pupmenu("Scene Operations%t|Delete"); + event= RNA_enum_get(op->ptr, "type"); + + if(event==1) { + switch(idlevel) { + case ID_MA: + outliner_do_libdata_operation(C, scene, soops, &soops->tree, unlink_material_cb); + ED_undo_push(C, "Unlink material"); + break; + case ID_TE: + outliner_do_libdata_operation(C, scene, soops, &soops->tree, unlink_texture_cb); + ED_undo_push(C, "Unlink texture"); + break; + default: + BKE_report(op->reports, RPT_WARNING, "Not Yet"); + } + } + else if(event==2) { + outliner_do_libdata_operation(C, scene, soops, &soops->tree, id_local_cb); + ED_undo_push(C, "Localized Data"); } - else if(objectlevel) { - short event= pupmenu("Select%x1|Deselect%x2|Delete%x4|Toggle Visible%x6|Toggle Selectable%x7|Toggle Renderable%x8"); /* make local: does not work... it doesn't set lib_extern flags... so data gets lost */ + + /* wrong notifier still... */ + WM_event_add_notifier(C, NC_OBJECT, NULL); + + return OPERATOR_FINISHED; +} + + +void OUTLINER_OT_id_operation(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Outliner ID data Operation"; + ot->idname= "OUTLINER_OT_id_operation"; + ot->description= ""; + + /* callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= outliner_id_operation_exec; + ot->poll= ED_operator_outliner_active; + + ot->flag= 0; + + RNA_def_enum(ot->srna, "type", prop_id_op_types, 0, "ID data Operation", ""); +} + +/* **************************************** */ + +static EnumPropertyItem prop_data_op_types[] = { + {1, "SELECT", 0, "Select", ""}, + {2, "DESELECT", 0, "Deselect", ""}, + {3, "HIDE", 0, "Hide", ""}, + {4, "UNHIDE", 0, "Unhide", ""}, + {0, NULL, 0, NULL, NULL} +}; + +static int outliner_data_operation_exec(bContext *C, wmOperator *op) +{ + SpaceOops *soops= CTX_wm_space_outliner(C); + int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0; + int event; + + /* check for invalid states */ + if (soops == NULL) + return OPERATOR_CANCELLED; + + event= RNA_enum_get(op->ptr, "type"); + set_operation_types(soops, &soops->tree, &scenelevel, &objectlevel, &idlevel, &datalevel); + + if(datalevel==TSE_POSE_CHANNEL) { if(event>0) { - char *str=""; - - if(event==1) { - Scene *sce= scene; // to be able to delete, scenes are set... - outliner_do_object_operation(scene, soops, &soops->tree, object_select_cb); - if(scene != sce) { -// XXX ED_screen_set_scene(C, sce); - } - - str= "Select Objects"; - } - else if(event==2) { - outliner_do_object_operation(scene, soops, &soops->tree, object_deselect_cb); - str= "Deselect Objects"; - } - else if(event==4) { - outliner_do_object_operation(scene, soops, &soops->tree, object_delete_cb); - DAG_scene_sort(scene); - str= "Delete Objects"; - } - else if(event==5) { /* disabled, see above (ton) */ - outliner_do_object_operation(scene, soops, &soops->tree, id_local_cb); - str= "Localized Objects"; - } - else if(event==6) { - outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_visibility_cb); - str= "Toggle Visibility"; - } - else if(event==7) { - outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_selectability_cb); - str= "Toggle Selectability"; - } - else if(event==8) { - outliner_do_object_operation(scene, soops, &soops->tree, object_toggle_renderability_cb); - str= "Toggle Renderability"; - } - - BIF_undo_push(str); + outliner_do_data_operation(soops, datalevel, event, &soops->tree, pchan_cb); + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL); + ED_undo_push(C, "PoseChannel operation"); } } - else if(idlevel) { - if(idlevel==-1 || datalevel) error("Mixed selection"); - else { - short event; - if (idlevel==ID_GR) - event = pupmenu("Unlink %x1|Make Local %x2|Link Group Objects to Scene%x3"); - else - event = pupmenu("Unlink %x1|Make Local %x2"); + else if(datalevel==TSE_BONE) { + if(event>0) { + outliner_do_data_operation(soops, datalevel, event, &soops->tree, bone_cb); + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL); + ED_undo_push(C, "Bone operation"); + } + } + else if(datalevel==TSE_EBONE) { + if(event>0) { + outliner_do_data_operation(soops, datalevel, event, &soops->tree, ebone_cb); + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL); + ED_undo_push(C, "EditBone operation"); + } + } + else if(datalevel==TSE_SEQUENCE) { + if(event>0) { + outliner_do_data_operation(soops, datalevel, event, &soops->tree, sequence_cb); + } + } + + return OPERATOR_FINISHED; +} + + +void OUTLINER_OT_data_operation(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Outliner Data Operation"; + ot->idname= "OUTLINER_OT_data_operation"; + ot->description= ""; + + /* callbacks */ + ot->invoke= WM_menu_invoke; + ot->exec= outliner_data_operation_exec; + ot->poll= ED_operator_outliner_active; + + ot->flag= 0; + + RNA_def_enum(ot->srna, "type", prop_data_op_types, 0, "Data Operation", ""); +} + + +/* ******************** */ + + +static int do_outliner_operation_event(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, wmEvent *event, float *mval) +{ + + if(mval[1]>te->ys && mval[1]<te->ys+OL_H) { + int scenelevel=0, objectlevel=0, idlevel=0, datalevel=0; + TreeStoreElem *tselem= TREESTORE(te); + + /* select object that's clicked on and popup context menu */ + if (!(tselem->flag & TSE_SELECTED)) { + if ( outliner_has_one_flag(soops, &soops->tree, TSE_SELECTED, 1) ) + outliner_set_flag(soops, &soops->tree, TSE_SELECTED, 0); - if(event==1) { - switch(idlevel) { - case ID_MA: - outliner_do_libdata_operation(soops, &soops->tree, unlink_material_cb); - BIF_undo_push("Unlink material"); - break; - case ID_TE: - outliner_do_libdata_operation(soops, &soops->tree, unlink_texture_cb); - BIF_undo_push("Unlink texture"); - break; - case ID_GR: - outliner_do_libdata_operation(soops, &soops->tree, unlink_group_cb); - BIF_undo_push("Unlink group"); - break; - default: - error("Not yet..."); - } - } - else if(event==2) { - outliner_do_libdata_operation(soops, &soops->tree, id_local_cb); - BIF_undo_push("Localized Data"); + tselem->flag |= TSE_SELECTED; + /* redraw, same as outliner_select function */ + soops->storeflag |= SO_TREESTORE_REDRAW; + ED_region_tag_redraw(ar); + } + + set_operation_types(soops, &soops->tree, &scenelevel, &objectlevel, &idlevel, &datalevel); + + if(scenelevel) { + //if(objectlevel || datalevel || idlevel) error("Mixed selection"); + //else pupmenu("Scene Operations%t|Delete"); + } + else if(objectlevel) { + WM_operator_name_call(C, "OUTLINER_OT_object_operation", WM_OP_INVOKE_REGION_WIN, NULL); + } + else if(idlevel) { + if(idlevel==-1 || datalevel) error("Mixed selection"); + else { + if (idlevel==ID_GR) + WM_operator_name_call(C, "OUTLINER_OT_group_operation", WM_OP_INVOKE_REGION_WIN, NULL); + else + WM_operator_name_call(C, "OUTLINER_OT_id_operation", WM_OP_INVOKE_REGION_WIN, NULL); } - else if(event==3 && idlevel==ID_GR) { - outliner_do_libdata_operation(soops, &soops->tree, group_linkobs2scene_cb); - BIF_undo_push("Link Group Objects to Scene"); + } + else if(datalevel) { + if(datalevel==-1) error("Mixed selection"); + else { + WM_operator_name_call(C, "OUTLINER_OT_data_operation", WM_OP_INVOKE_REGION_WIN, NULL); } } + + return 1; } - else if(datalevel) { - if(datalevel==-1) error("Mixed selection"); - else { - if(datalevel==TSE_POSE_CHANNEL) { - short event= pupmenu("PoseChannel Operations%t|Select%x1|Deselect%x2|Hide%x3|Unhide%x4"); - if(event>0) { - outliner_do_data_operation(soops, datalevel, event, &soops->tree, pchan_cb); - BIF_undo_push("PoseChannel operation"); - } - } - else if(datalevel==TSE_BONE) { - short event= pupmenu("Bone Operations%t|Select%x1|Deselect%x2|Hide%x3|Unhide%x4"); - if(event>0) { - outliner_do_data_operation(soops, datalevel, event, &soops->tree, bone_cb); - BIF_undo_push("Bone operation"); - } - } - else if(datalevel==TSE_EBONE) { - short event= pupmenu("EditBone Operations%t|Select%x1|Deselect%x2|Hide%x3|Unhide%x4"); - if(event>0) { - outliner_do_data_operation(soops, datalevel, event, &soops->tree, ebone_cb); - BIF_undo_push("EditBone operation"); - } - } - else if(datalevel==TSE_SEQUENCE) { - short event= pupmenu("Sequence Operations %t|Select %x1"); - if(event>0) { - outliner_do_data_operation(soops, datalevel, event, &soops->tree, sequence_cb); - } - } + + for(te= te->subtree.first; te; te= te->next) { + if(do_outliner_operation_event(C, scene, ar, soops, te, event, mval)) + return 1; + } + return 0; +} - } + +static int outliner_operation(bContext *C, wmOperator *op, wmEvent *event) +{ + Scene *scene= CTX_data_scene(C); + ARegion *ar= CTX_wm_region(C); + SpaceOops *soops= CTX_wm_space_outliner(C); + TreeElement *te; + float fmval[2]; + + UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, fmval, fmval+1); + + for(te= soops->tree.first; te; te= te->next) { + if(do_outliner_operation_event(C, scene, ar, soops, te, event, fmval)) break; } + + return OPERATOR_FINISHED; } +/* Menu only! Calls other operators */ +void OUTLINER_OT_operation(wmOperatorType *ot) +{ + ot->name= "Execute Operation"; + ot->idname= "OUTLINER_OT_operation"; + + ot->invoke= outliner_operation; + + ot->poll= ED_operator_outliner_active; +} + + + /* ***************** ANIMATO OPERATIONS ********************************** */ /* KeyingSet and Driver Creation - Helper functions */ @@ -3215,7 +3610,7 @@ static int ed_operator_outliner_datablocks_active(bContext *C) { ScrArea *sa= CTX_wm_area(C); if ((sa) && (sa->spacetype==SPACE_OUTLINER)) { - SpaceOops *so= (SpaceOops *)CTX_wm_space_data(C); + SpaceOops *so= CTX_wm_space_outliner(C); return (so->outlinevis == SO_DATABLOCKS); } return 0; @@ -3428,7 +3823,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m static int outliner_drivers_addsel_exec(bContext *C, wmOperator *op) { - SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); + SpaceOops *soutliner= CTX_wm_space_outliner(C); /* check for invalid states */ if (soutliner == NULL) @@ -3463,7 +3858,7 @@ void OUTLINER_OT_drivers_add(wmOperatorType *ot) static int outliner_drivers_deletesel_exec(bContext *C, wmOperator *op) { - SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); + SpaceOops *soutliner= CTX_wm_space_outliner(C); /* check for invalid states */ if (soutliner == NULL) @@ -3598,7 +3993,7 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa static int outliner_keyingset_additems_exec(bContext *C, wmOperator *op) { - SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); + SpaceOops *soutliner= CTX_wm_space_outliner(C); Scene *scene= CTX_data_scene(C); KeyingSet *ks= verify_active_keyingset(scene, 1); @@ -3638,7 +4033,7 @@ void OUTLINER_OT_keyingset_add_selected(wmOperatorType *ot) static int outliner_keyingset_removeitems_exec(bContext *C, wmOperator *op) { - SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); + SpaceOops *soutliner= CTX_wm_space_outliner(C); Scene *scene= CTX_data_scene(C); KeyingSet *ks= verify_active_keyingset(scene, 1); @@ -3897,7 +4292,7 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen } } -static void outliner_draw_iconrow(Scene *scene, SpaceOops *soops, ListBase *lb, int level, int *offsx, int ys) +static void outliner_draw_iconrow(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb, int level, int *offsx, int ys) { TreeElement *te; TreeStoreElem *tselem; @@ -3914,7 +4309,7 @@ static void outliner_draw_iconrow(Scene *scene, SpaceOops *soops, ListBase *lb, if(tselem->type==0) { if(te->idcode==ID_OB) active= (OBACT==(Object *)tselem->id); else if(scene->obedit && scene->obedit->data==tselem->id) active= 1; // XXX use context? - else active= tree_element_active(scene, soops, te, 0); + else active= tree_element_active(C, scene, soops, te, 0); } else active= tree_element_type_active(NULL, scene, soops, te, tselem, 0); @@ -3936,12 +4331,12 @@ static void outliner_draw_iconrow(Scene *scene, SpaceOops *soops, ListBase *lb, /* this tree element always has same amount of branches, so dont draw */ if(tselem->type!=TSE_R_LAYER) - outliner_draw_iconrow(scene, soops, &te->subtree, level+1, offsx, ys); + outliner_draw_iconrow(C, scene, soops, &te->subtree, level+1, offsx, ys); } } -static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty) +static void outliner_draw_tree_element(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty) { TreeElement *ten; TreeStoreElem *tselem; @@ -3979,12 +4374,12 @@ static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soo } } -// XXX context? else if(obedit && obedit->data==tselem->id) { -// glColor4ub(255, 255, 255, 100); -// active= 2; -// } + else if(scene->obedit && scene->obedit->data==tselem->id) { + glColor4ub(255, 255, 255, 100); + active= 2; + } else { - if(tree_element_active(scene, soops, te, 0)) { + if(tree_element_active(C, scene, soops, te, 0)) { glColor4ub(220, 220, 255, 100); active= 2; } @@ -4063,7 +4458,7 @@ static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soo glEnable(GL_BLEND); glPixelTransferf(GL_ALPHA_SCALE, 0.5); - outliner_draw_iconrow(scene, soops, &te->subtree, 0, &tempx, *starty+2); + outliner_draw_iconrow(C, scene, soops, &te->subtree, 0, &tempx, *starty+2); glPixelTransferf(GL_ALPHA_SCALE, 1.0); glDisable(GL_BLEND); @@ -4080,7 +4475,7 @@ static void outliner_draw_tree_element(Scene *scene, ARegion *ar, SpaceOops *soo if((tselem->flag & TSE_CLOSED)==0) { for(ten= te->subtree.first; ten; ten= ten->next) { - outliner_draw_tree_element(scene, ar, soops, ten, startx+OL_X, starty); + outliner_draw_tree_element(C, scene, ar, soops, ten, startx+OL_X, starty); } } } @@ -4159,20 +4554,12 @@ static void outliner_draw_selection(ARegion *ar, SpaceOops *soops, ListBase *lb, } -static void outliner_draw_tree(Scene *scene, ARegion *ar, SpaceOops *soops) +static void outliner_draw_tree(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops) { TreeElement *te; int starty, startx; float col[4]; - -#if 0 // XXX was #ifdef INTERNATIONAL - /* Maybe the INTERNATIONAL was really for check about freetype2 ? - * anyway I think that we can remove this now - Diego - */ - FTF_SetFontSize('l'); - BIF_SetScale(1.0); -#endif - + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // only once if (ELEM(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF)) { @@ -4199,7 +4586,7 @@ static void outliner_draw_tree(Scene *scene, ARegion *ar, SpaceOops *soops) starty= (int)ar->v2d.tot.ymax-OL_H; startx= 0; for(te= soops->tree.first; te; te= te->next) { - outliner_draw_tree_element(scene, ar, soops, te, startx, &starty); + outliner_draw_tree_element(C, scene, ar, soops, te, startx, &starty); } } @@ -4274,6 +4661,7 @@ static void restrictbutton_view_cb(bContext *C, void *poin, void *poin2) } } } + WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene); } @@ -4295,16 +4683,18 @@ static void restrictbutton_sel_cb(bContext *C, void *poin, void *poin2) } } } + WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene); } static void restrictbutton_rend_cb(bContext *C, void *poin, void *poin2) { + WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, poin); } static void restrictbutton_r_lay_cb(bContext *C, void *poin, void *poin2) { - /* XXX redraws */ + WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, poin); } static void restrictbutton_modifier_cb(bContext *C, void *poin, void *poin2) @@ -4315,26 +4705,40 @@ static void restrictbutton_modifier_cb(bContext *C, void *poin, void *poin2) DAG_object_flush_update(scene, ob, OB_RECALC_DATA); object_handle_update(scene, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob); } static void restrictbutton_bone_cb(bContext *C, void *poin, void *poin2) { - /* XXX redraws */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL); } -static void namebutton_cb(bContext *C, void *tep, void *oldnamep) +static void namebutton_cb(bContext *C, void *tsep, char *oldname) { - SpaceOops *soops= NULL; // XXXcurarea->spacedata.first; - Scene *scene= NULL; // XXX + SpaceOops *soops= CTX_wm_space_outliner(C); + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); TreeStore *ts= soops->treestore; - TreeElement *te= tep; + TreeStoreElem *tselem= tsep; - if(ts && te) { - TreeStoreElem *tselem= TREESTORE(te); + if(ts && tselem) { + TreeElement *te= outliner_find_tse(soops, tselem); if(tselem->type==0) { test_idbutton(tselem->id->name+2); // library.c, unique name and alpha sort + switch(GS(tselem->id->name)) { + case ID_MA: + WM_event_add_notifier(C, NC_MATERIAL, NULL); break; + case ID_TE: + WM_event_add_notifier(C, NC_TEXTURE, NULL); break; + case ID_IM: + WM_event_add_notifier(C, NC_IMAGE, NULL); break; + case ID_SCE: + WM_event_add_notifier(C, NC_SCENE, NULL); break; + default: + WM_event_add_notifier(C, NC_MATERIAL, NULL); break; + } /* Check the library target exists */ if (te->idcode == ID_LI) { char expanded[FILE_MAXDIR + FILE_MAXFILE]; @@ -4362,8 +4766,9 @@ static void namebutton_cb(bContext *C, void *tep, void *oldnamep) /* restore bone name */ BLI_strncpy(newname, ebone->name, 32); - BLI_strncpy(ebone->name, oldnamep, 32); -// XXX armature_bone_rename(obedit->data, oldnamep, newname); + BLI_strncpy(ebone->name, oldname, 32); + ED_armature_bone_rename(obedit->data, oldname, newname); + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, OBACT); } } break; @@ -4375,13 +4780,14 @@ static void namebutton_cb(bContext *C, void *tep, void *oldnamep) char newname[32]; // always make current object active - tree_element_set_active_object(C, scene, soops, te); + tree_element_set_active_object(C, scene, soops, te, 1); ob= OBACT; /* restore bone name */ BLI_strncpy(newname, bone->name, 32); - BLI_strncpy(bone->name, oldnamep, 32); -// XXX armature_bone_rename(ob->data, oldnamep, newname); + BLI_strncpy(bone->name, oldname, 32); + ED_armature_bone_rename(ob->data, oldname, newname); + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); } break; case TSE_POSE_CHANNEL: @@ -4391,13 +4797,14 @@ static void namebutton_cb(bContext *C, void *tep, void *oldnamep) char newname[32]; // always make current object active - tree_element_set_active_object(C, scene, soops, te); + tree_element_set_active_object(C, scene, soops, te, 1); ob= OBACT; /* restore bone name */ BLI_strncpy(newname, pchan->name, 32); - BLI_strncpy(pchan->name, oldnamep, 32); -// XXX armature_bone_rename(ob->data, oldnamep, newname); + BLI_strncpy(pchan->name, oldname, 32); + ED_armature_bone_rename(ob->data, oldname, newname); + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); } break; case TSE_POSEGRP: @@ -4406,6 +4813,7 @@ static void namebutton_cb(bContext *C, void *tep, void *oldnamep) bActionGroup *grp= te->directdata; BLI_uniquename(&ob->pose->agroups, grp, "Group", '.', offsetof(bActionGroup, name), 32); + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob); } break; case TSE_R_LAYER: @@ -4421,7 +4829,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar TreeElement *te; TreeStoreElem *tselem; Object *ob = NULL; - + for(te= lb->first; te; te= te->next) { tselem= TREESTORE(te); if(te->ys >= ar->v2d.cur.ymin && te->ys <= ar->v2d.cur.ymax) { @@ -4440,7 +4848,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_RENDER, 0, ICON_RESTRICT_RENDER_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow renderability"); - uiButSetFunc(bt, restrictbutton_rend_cb, NULL, NULL); + uiButSetFunc(bt, restrictbutton_rend_cb, scene, ob); uiBlockSetEmboss(block, UI_EMBOSS); } @@ -4450,7 +4858,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar bt= uiDefIconButBitI(block, ICONTOGN, SCE_LAY_DISABLE, 0, ICON_CHECKBOX_HLT-1, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer"); - uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL); + uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL); uiBlockSetEmboss(block, UI_EMBOSS); } @@ -4461,13 +4869,13 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar /* NOTE: tselem->nr is short! */ bt= uiDefIconButBitI(block, ICONTOG, tselem->nr, 0, ICON_CHECKBOX_HLT-1, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass"); - uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL); + uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL); layflag++; /* is lay_xor */ if(ELEM6(tselem->nr, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_RADIO)) bt= uiDefIconButBitI(block, TOG, tselem->nr, 0, (*layflag & tselem->nr)?ICON_DOT:ICON_BLANK1, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined"); - uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL); + uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL); uiBlockSetEmboss(block, UI_EMBOSS); } @@ -4556,7 +4964,242 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa } } -static void outliner_buttons(uiBlock *block, ARegion *ar, SpaceOops *soops, ListBase *lb) +static void operator_call_cb(struct bContext *C, void *arg_kmi, void *arg2) +{ + wmOperatorType *ot= arg2; + wmKeymapItem *kmi= arg_kmi; + + if(ot) + BLI_strncpy(kmi->idname, ot->idname, OP_MAX_TYPENAME); +} + +static void operator_search_cb(const struct bContext *C, void *arg_kmi, char *str, uiSearchItems *items) +{ + wmOperatorType *ot = WM_operatortype_first(); + + for(; ot; ot= ot->next) { + + if(BLI_strcasestr(ot->idname, str)) { + char name[OP_MAX_TYPENAME]; + + /* display name for menu */ + WM_operator_py_idname(name, ot->idname); + + if(0==uiSearchItemAdd(items, name, ot, 0)) + break; + } + } +} + +/* operator Search browse menu, open */ +static uiBlock *operator_search_menu(bContext *C, ARegion *ar, void *arg_kmi) +{ + static char search[OP_MAX_TYPENAME]; + wmEvent event; + wmWindow *win= CTX_wm_window(C); + wmKeymapItem *kmi= arg_kmi; + wmOperatorType *ot= WM_operatortype_find(kmi->idname, 0); + uiBlock *block; + uiBut *but; + + /* clear initial search string, then all items show */ + search[0]= 0; + + block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS); + uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1); + + /* fake button, it holds space for search items */ + uiDefBut(block, LABEL, 0, "", 10, 15, 150, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL); + + but= uiDefSearchBut(block, search, 0, ICON_VIEWZOOM, 256, 10, 0, 150, 19, ""); + uiButSetSearchFunc(but, operator_search_cb, arg_kmi, operator_call_cb, ot); + + uiBoundsBlock(block, 6); + uiBlockSetDirection(block, UI_DOWN); + uiEndBlock(C, block); + + event= *(win->eventstate); /* XXX huh huh? make api call */ + event.type= EVT_BUT_OPEN; + event.val= KM_PRESS; + event.customdata= but; + event.customdatafree= FALSE; + wm_event_add(win, &event); + + return block; +} + +#define OL_KM_KEYBOARD 0 +#define OL_KM_MOUSE 1 +#define OL_KM_TWEAK 2 +#define OL_KM_SPECIALS 3 + +static short keymap_menu_type(short type) +{ + if(ISKEYBOARD(type)) return OL_KM_KEYBOARD; + if(WM_key_event_is_tweak(type)) return OL_KM_TWEAK; + if(type >= LEFTMOUSE && type <= WHEELOUTMOUSE) return OL_KM_MOUSE; +// return OL_KM_SPECIALS; + return 0; +} + +static char *keymap_type_menu(void) +{ + static char string[500]; + static char formatstr[] = "|%s %%x%d"; + char *str= string; + + str += sprintf(str, "Event Type %%t"); + + str += sprintf(str, formatstr, "Keyboard", OL_KM_KEYBOARD); + str += sprintf(str, formatstr, "Mouse", OL_KM_MOUSE); + str += sprintf(str, formatstr, "Tweak", OL_KM_TWEAK); +// str += sprintf(str, formatstr, "Specials", OL_KM_SPECIALS); + + return string; +} + +static char *keymap_mouse_menu(void) +{ + static char string[500]; + static char formatstr[] = "|%s %%x%d"; + char *str= string; + + str += sprintf(str, "Mouse Event %%t"); + + str += sprintf(str, formatstr, "Left Mouse", LEFTMOUSE); + str += sprintf(str, formatstr, "Middle Mouse", MIDDLEMOUSE); + str += sprintf(str, formatstr, "Right Mouse", RIGHTMOUSE); + str += sprintf(str, formatstr, "Action Mouse", ACTIONMOUSE); + str += sprintf(str, formatstr, "Select Mouse", SELECTMOUSE); + str += sprintf(str, formatstr, "Mouse Move", MOUSEMOVE); + str += sprintf(str, formatstr, "Wheel Up", WHEELUPMOUSE); + str += sprintf(str, formatstr, "Wheel Down", WHEELDOWNMOUSE); + str += sprintf(str, formatstr, "Wheel In", WHEELINMOUSE); + str += sprintf(str, formatstr, "Wheel Out", WHEELOUTMOUSE); + + return string; +} + +static char *keymap_tweak_menu(void) +{ + static char string[500]; + static char formatstr[] = "|%s %%x%d"; + char *str= string; + + str += sprintf(str, "Tweak Event %%t"); + + str += sprintf(str, formatstr, "Left Mouse", EVT_TWEAK_L); + str += sprintf(str, formatstr, "Middle Mouse", EVT_TWEAK_M); + str += sprintf(str, formatstr, "Right Mouse", EVT_TWEAK_R); + str += sprintf(str, formatstr, "Action Mouse", EVT_TWEAK_A); + str += sprintf(str, formatstr, "Select Mouse", EVT_TWEAK_S); + + return string; +} + +static void keymap_type_cb(bContext *C, void *kmi_v, void *unused_v) +{ + wmKeymapItem *kmi= kmi_v; + short maptype= keymap_menu_type(kmi->type); + + if(maptype!=kmi->maptype) { + switch(kmi->maptype) { + case OL_KM_KEYBOARD: + kmi->type= AKEY; + kmi->val= KM_PRESS; + break; + case OL_KM_MOUSE: + kmi->type= LEFTMOUSE; + kmi->val= KM_PRESS; + break; + case OL_KM_TWEAK: + kmi->type= EVT_TWEAK_L; + kmi->val= KM_ANY; + break; + case OL_KM_SPECIALS: + kmi->type= AKEY; + kmi->val= KM_PRESS; + } + ED_region_tag_redraw(CTX_wm_region(C)); + } +} + +static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soops, ListBase *lb) +{ + TreeElement *te; + TreeStoreElem *tselem; + + uiBlockSetEmboss(block, UI_EMBOSST); + + for(te= lb->first; te; te= te->next) { + tselem= TREESTORE(te); + if(te->ys >= ar->v2d.cur.ymin && te->ys <= ar->v2d.cur.ymax) { + uiBut *but; + char *str; + int xstart= 240; + int butw1= 20; /* operator */ + int butw2= 90; /* event type, menus */ + int butw3= 43; /* modifiers */ + + if(tselem->type == TSE_KEYMAP_ITEM) { + wmKeymapItem *kmi= te->directdata; + + /* modal map? */ + if(kmi->propvalue); + else { + uiDefBlockBut(block, operator_search_menu, kmi, "", xstart, (int)te->ys+1, butw1, OL_H-1, "Assign new Operator"); + } + xstart+= butw1+10; + + /* map type button */ + kmi->maptype= keymap_menu_type(kmi->type); + + str= keymap_type_menu(); + but= uiDefButS(block, MENU, 0, str, xstart, (int)te->ys+1, butw2, OL_H-1, &kmi->maptype, 0, 0, 0, 0, "Event type"); + uiButSetFunc(but, keymap_type_cb, kmi, NULL); + xstart+= butw2+5; + + /* edit actual event */ + switch(kmi->maptype) { + case OL_KM_KEYBOARD: + uiDefKeyevtButS(block, 0, "", xstart, (int)te->ys+1, butw2, OL_H-1, &kmi->type, "Key code"); + xstart+= butw2+5; + break; + case OL_KM_MOUSE: + str= keymap_mouse_menu(); + uiDefButS(block, MENU, 0, str, xstart,(int)te->ys+1, butw2, OL_H-1, &kmi->type, 0, 0, 0, 0, "Mouse button"); + xstart+= butw2+5; + break; + case OL_KM_TWEAK: + str= keymap_tweak_menu(); + uiDefButS(block, MENU, 0, str, xstart, (int)te->ys+1, butw2, OL_H-1, &kmi->type, 0, 0, 0, 0, "Tweak gesture"); + xstart+= butw2+5; + break; + } + + /* modifiers */ + uiBlockBeginAlign(block); + uiDefButS(block, OPTION, 0, "Shift", xstart, (int)te->ys+1, butw3+5, OL_H-1, &kmi->shift, 0, 0, 0, 0, "Modifier"); xstart+= butw3+5; + uiDefButS(block, OPTION, 0, "Ctrl", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->ctrl, 0, 0, 0, 0, "Modifier"); xstart+= butw3; + uiDefButS(block, OPTION, 0, "Alt", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->alt, 0, 0, 0, 0, "Modifier"); xstart+= butw3; + uiDefButS(block, OPTION, 0, "Cmd", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->oskey, 0, 0, 0, 0, "Modifier"); xstart+= butw3; + xstart+= 5; + uiBlockEndAlign(block); + + /* rna property */ + if(kmi->ptr && kmi->ptr->data) + uiDefBut(block, LABEL, 0, "(RNA property)", xstart, (int)te->ys+1, butw2, OL_H-1, &kmi->oskey, 0, 0, 0, 0, ""); xstart+= butw2; + + + } + } + + if((tselem->flag & TSE_CLOSED)==0) outliner_draw_keymapbuts(block, ar, soops, &te->subtree); + } +} + + +static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, SpaceOops *soops, ListBase *lb) { uiBut *bt; TreeElement *te; @@ -4568,6 +5211,7 @@ static void outliner_buttons(uiBlock *block, ARegion *ar, SpaceOops *soops, List if(te->ys >= ar->v2d.cur.ymin && te->ys <= ar->v2d.cur.ymax) { if(tselem->flag & TSE_TEXTBUT) { + /* If we add support to rename Sequence. * need change this. */ @@ -4582,17 +5226,15 @@ static void outliner_buttons(uiBlock *block, ARegion *ar, SpaceOops *soops, List if(dx<50) dx= 50; bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", (short)te->xs+2*OL_X-4, (short)te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len-1, 0, 0, ""); - uiButSetFunc(bt, namebutton_cb, te, NULL); - - // signal for button to open -// XXX addqueue(curarea->win, BUT_ACTIVATE, OL_NAMEBUTTON); + uiButSetRenameFunc(bt, namebutton_cb, tselem); - /* otherwise keeps open on ESC */ - tselem->flag &= ~TSE_TEXTBUT; + /* returns false if button got removed */ + if( 0 == uiButActiveOnly(C, block, bt) ) + tselem->flag &= ~TSE_TEXTBUT; } } - if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(block, ar, soops, &te->subtree); + if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(C, block, ar, soops, &te->subtree); } } @@ -4602,7 +5244,7 @@ void draw_outliner(const bContext *C) Scene *scene= CTX_data_scene(C); ARegion *ar= CTX_wm_region(C); View2D *v2d= &ar->v2d; - SpaceOops *soops= (SpaceOops*)CTX_wm_space_data(C); + SpaceOops *soops= CTX_wm_space_outliner(C); uiBlock *block; int sizey= 0, sizex= 0, sizex_rna= 0; @@ -4611,7 +5253,7 @@ void draw_outliner(const bContext *C) /* get extents of data */ outliner_height(soops, &soops->tree, &sizey); - if (ELEM(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF)) { + if (ELEM3(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF, SO_KEYMAP)) { /* RNA has two columns: * - column 1 is (max_width + OL_RNA_COL_SPACEX) or * (OL_RNA_COL_X), whichever is wider... @@ -4646,17 +5288,20 @@ void draw_outliner(const bContext *C) /* draw outliner stuff (background and hierachy lines) */ outliner_back(ar, soops); - outliner_draw_tree(scene, ar, soops); + outliner_draw_tree((bContext *)C, scene, ar, soops); /* draw icons and names */ block= uiBeginBlock(C, ar, "outliner buttons", UI_EMBOSS); - outliner_buttons(block, ar, soops, &soops->tree); + outliner_buttons(C, block, ar, soops, &soops->tree); if(ELEM(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF)) { /* draw rna buttons */ outliner_draw_rnacols(ar, soops, sizex_rna); outliner_draw_rnabuts(block, scene, ar, soops, sizex_rna, &soops->tree); } + else if(soops->outlinevis == SO_KEYMAP) { + outliner_draw_keymapbuts(block, ar, soops, &soops->tree); + } else if (!(soops->flag & SO_HIDE_RESTRICTCOLS)) { /* draw restriction columns */ outliner_draw_restrictcols(ar, soops); diff --git a/source/blender/editors/space_outliner/outliner_header.c b/source/blender/editors/space_outliner/outliner_header.c index fe2f054899c..0c7859ed4e2 100644 --- a/source/blender/editors/space_outliner/outliner_header.c +++ b/source/blender/editors/space_outliner/outliner_header.c @@ -209,7 +209,7 @@ void outliner_header_buttons(const bContext *C, ARegion *ar) { ScrArea *sa= CTX_wm_area(C); Scene *scene= CTX_data_scene(C); - SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); + SpaceOops *soutliner= CTX_wm_space_outliner(C); uiBlock *block; int xco, yco= 3, xmax; @@ -233,9 +233,9 @@ void outliner_header_buttons(const bContext *C, ARegion *ar) /* data selector*/ if(G.main->library.first) - uiDefButS(block, MENU, B_REDR, "Outliner Display%t|Libraries %x7|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, ""); + uiDefButS(block, MENU, B_REDR, "Outliner Display%t|Libraries %x7|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12||Key Maps %x13", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, ""); else - uiDefButS(block, MENU, B_REDR, "Outliner Display%t|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, ""); + uiDefButS(block, MENU, B_REDR, "Outliner Display%t|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4|Sequence %x10|Datablocks %x11|User Preferences %x12||Key Maps %x13", xco, yco, 120, 20, &soutliner->outlinevis, 0, 0, 0, 0, ""); xco += 120; /* KeyingSet editing buttons */ diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index 69f88fbcca7..4f9a0f686b9 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -95,6 +95,8 @@ typedef struct TreeElement { #define TSE_RNA_PROPERTY 31 #define TSE_RNA_ARRAY_ELEM 32 #define TSE_NLA_TRACK 33 +#define TSE_KEYMAP 34 +#define TSE_KEYMAP_ITEM 35 /* outliner search flags */ #define OL_FIND 0 @@ -115,11 +117,17 @@ void outliner_header_buttons(const struct bContext *C, struct ARegion *ar); /* outliner.c */ void outliner_free_tree(struct ListBase *lb); -void outliner_operation_menu(struct Scene *scene, struct ARegion *ar, struct SpaceOops *soops); void outliner_select(struct SpaceOops *soops, struct ListBase *lb, int *index, short *selecting); void draw_outliner(const struct bContext *C); -void OUTLINER_OT_activate_click(struct wmOperatorType *ot); +void OUTLINER_OT_item_activate(struct wmOperatorType *ot); +void OUTLINER_OT_item_openclose(struct wmOperatorType *ot); +void OUTLINER_OT_item_rename(struct wmOperatorType *ot); +void OUTLINER_OT_operation(struct wmOperatorType *ot); +void OUTLINER_OT_object_operation(struct wmOperatorType *ot); +void OUTLINER_OT_group_operation(struct wmOperatorType *ot); +void OUTLINER_OT_id_operation(struct wmOperatorType *ot); +void OUTLINER_OT_data_operation(struct wmOperatorType *ot); void OUTLINER_OT_show_one_level(struct wmOperatorType *ot); void OUTLINER_OT_show_active(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c index 6fddd16c174..2e11eb379b4 100644 --- a/source/blender/editors/space_outliner/outliner_ops.c +++ b/source/blender/editors/space_outliner/outliner_ops.c @@ -47,8 +47,15 @@ void outliner_operatortypes(void) { - WM_operatortype_append(OUTLINER_OT_activate_click); - + WM_operatortype_append(OUTLINER_OT_item_activate); + WM_operatortype_append(OUTLINER_OT_item_openclose); + WM_operatortype_append(OUTLINER_OT_item_rename); + WM_operatortype_append(OUTLINER_OT_operation); + WM_operatortype_append(OUTLINER_OT_object_operation); + WM_operatortype_append(OUTLINER_OT_group_operation); + WM_operatortype_append(OUTLINER_OT_id_operation); + WM_operatortype_append(OUTLINER_OT_data_operation); + WM_operatortype_append(OUTLINER_OT_show_one_level); WM_operatortype_append(OUTLINER_OT_show_active); WM_operatortype_append(OUTLINER_OT_show_hierarchy); @@ -71,12 +78,19 @@ void outliner_keymap(wmWindowManager *wm) { ListBase *keymap= WM_keymap_listbase(wm, "Outliner", SPACE_OUTLINER, 0); - WM_keymap_verify_item(keymap, "OUTLINER_OT_activate_click", LEFTMOUSE, KM_PRESS, 0, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "extend", 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); - WM_keymap_verify_item(keymap, "OUTLINER_OT_show_hierarchy", HOMEKEY, KM_PRESS, 0, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, 0, 0)->ptr, "all", 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "all", 1); + + WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "OUTLINER_OT_operation", RIGHTMOUSE, KM_PRESS, 0, 0); + + WM_keymap_add_item(keymap, "OUTLINER_OT_show_hierarchy", HOMEKEY, KM_PRESS, 0, 0); - WM_keymap_verify_item(keymap, "OUTLINER_OT_show_active", PERIODKEY, KM_PRESS, 0, 0); - WM_keymap_verify_item(keymap, "OUTLINER_OT_show_active", PADPERIOD, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "OUTLINER_OT_show_active", PERIODKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "OUTLINER_OT_show_active", PADPERIOD, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADPLUSKEY, KM_PRESS, 0, 0); /* open */ RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADMINUS, KM_PRESS, 0, 0)->ptr, "open", 0); /* close */ diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 4ddb586beb4..f57445a32f1 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -120,6 +120,7 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn) case ND_MODE: case ND_KEYINGSET: case ND_FRAME: + case ND_RENDER_OPTIONS: ED_region_tag_redraw(ar); break; } @@ -217,7 +218,7 @@ static SpaceLink *outliner_new(const bContext *C) ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM_O); ar->v2d.align = (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y); - ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_KEEPZOOM|V2D_KEEPASPECT); + ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT); ar->v2d.keeptot= V2D_KEEPTOT_STRICT; ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f; diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index f6cf6de4b00..99a13c8d9e0 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -97,7 +97,6 @@ /* avoid passing multiple args and be more verbose */ #define SEQPROP_STARTFRAME 1<<0 #define SEQPROP_ENDFRAME 1<<1 -#define SEQPROP_FILENAME 1<<2 static void sequencer_generic_props__internal(wmOperatorType *ot, int flag) { @@ -111,9 +110,6 @@ static void sequencer_generic_props__internal(wmOperatorType *ot, int flag) RNA_def_int(ot->srna, "channel", 1, 1, MAXSEQ, "Channel", "Channel to place this strip into", 1, MAXSEQ); - if(flag & SEQPROP_FILENAME) - RNA_def_string(ot->srna, "filename", "", FILE_MAX, "Scene Name", "full path to load the strip data from"); - RNA_def_boolean(ot->srna, "replace_sel", 1, "Replace Selection", "replace the current selection"); } @@ -312,8 +308,9 @@ void SEQUENCER_OT_movie_strip_add(struct wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_FILENAME); - RNA_def_boolean(ot->srna, "sound", FALSE, "Sound", "Load hd sound with the movie"); // XXX need to impliment this + WM_operator_properties_filesel(ot, FOLDERFILE|MOVIEFILE); + sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME); + RNA_def_boolean(ot->srna, "sound", TRUE, "Sound", "Load hd sound with the movie"); // XXX need to impliment this } @@ -417,8 +414,9 @@ void SEQUENCER_OT_sound_strip_add(struct wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_FILENAME); - RNA_def_boolean(ot->srna, "hd", FALSE, "HD Sound", "Load the sound as streaming audio"); // XXX need to impliment this + WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE); + sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME); + RNA_def_boolean(ot->srna, "cache", FALSE, "Cache", "Load the sound as streaming audio"); // XXX need to impliment this } /* add image operator */ @@ -512,7 +510,8 @@ void SEQUENCER_OT_image_strip_add(struct wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_FILENAME); + WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE); + sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME); RNA_def_collection_runtime(ot->srna, "files", &RNA_OperatorFileListElement, "Files", ""); } @@ -646,7 +645,8 @@ void SEQUENCER_OT_effect_strip_add(struct wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_ENDFRAME|SEQPROP_FILENAME); + WM_operator_properties_filesel(ot, 0); + sequencer_generic_props__internal(ot, SEQPROP_STARTFRAME|SEQPROP_ENDFRAME); RNA_def_enum(ot->srna, "type", sequencer_prop_effect_types, SEQ_CROSS, "Type", "Sequencer effect type"); RNA_def_float_vector(ot->srna, "color", 3, NULL, 0.0f, 1.0f, "Color", "Initialize the strip with this color (only used when type='COLOR')", 0.0f, 1.0f); } diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 868897b76ac..036c0769c1e 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -95,7 +95,7 @@ //static int _last_seq_init=0; /* XXX */ static void error() {} -static void waitcursor() {} +static void waitcursor(int val) {} static void activate_fileselect() {} static int pupmenu() {return 0;} static int okee() {return 0;} @@ -1694,7 +1694,7 @@ static int sequencer_refresh_all_exec(bContext *C, wmOperator *op) if(ed==NULL) return OPERATOR_CANCELLED; - free_imbuf_seq(&ed->seqbase); + free_imbuf_seq(&ed->seqbase, FALSE); ED_area_tag_redraw(CTX_wm_area(C)); diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c index f561fb2ac43..74f22b86b75 100644 --- a/source/blender/editors/space_sequencer/sequencer_ops.c +++ b/source/blender/editors/space_sequencer/sequencer_ops.c @@ -123,7 +123,7 @@ void sequencer_keymap(wmWindowManager *wm) RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_unmute", HKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "unselected", 1); WM_keymap_add_item(keymap, "SEQUENCER_OT_lock", LKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_item(keymap, "SEQUENCER_OT_unlock", HKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0); + WM_keymap_add_item(keymap, "SEQUENCER_OT_unlock", LKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_reload", RKEY, KM_PRESS, KM_ALT, 0); diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c index c7c92b71861..084416f3a60 100644 --- a/source/blender/editors/space_sequencer/space_sequencer.c +++ b/source/blender/editors/space_sequencer/space_sequencer.c @@ -234,7 +234,7 @@ static void sequencer_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void sequencer_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL, -1); } static void sequencer_buttons_area_listener(ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index c260fe05093..a9c0d3ff76b 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -372,7 +372,7 @@ static void text_properties_area_init(wmWindowManager *wm, ARegion *ar) static void text_properties_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL, -1); } /********************* registration ********************/ diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index e6d97071ef5..4c9f47ed170 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -231,7 +231,7 @@ void TEXT_OT_open(wmOperatorType *ot) ot->poll= text_new_poll; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to open."); + WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE|PYSCRIPTFILE); } /******************* reload operator *********************/ @@ -280,17 +280,10 @@ static void text_unlink(Main *bmain, Text *text) * disabled it will leave invalid pointers in files! */ #ifndef DISABLE_PYTHON - // XXX BPY_clear_bad_scriptlinks(text); // XXX BPY_free_pyconstraint_links(text); // XXX free_text_controllers(text); // XXX free_dome_warp_text(text); - /* check if this text was used as script link: - * this check function unsets the pointers and returns how many - * script links used this Text */ - if(0) // XXX BPY_text_check_all_scriptlinks (text)) - ; // XXX notifier: allqueue(REDRAWBUTSSCRIPT, 0); - /* equivalently for pynodes: */ if(0) // XXX nodeDynamicUnlinkText ((ID*)text)) ; // XXX notifier: allqueue(REDRAWNODE, 0); @@ -505,7 +498,7 @@ void TEXT_OT_save_as(wmOperatorType *ot) ot->poll= text_edit_poll; /* properties */ - RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path to save image to."); + WM_operator_properties_filesel(ot, FOLDERFILE|TEXTFILE|PYSCRIPTFILE); } /******************* run script operator *********************/ diff --git a/source/blender/editors/space_text/text_python.c b/source/blender/editors/space_text/text_python.c index b606f8cb141..4400747a731 100644 --- a/source/blender/editors/space_text/text_python.c +++ b/source/blender/editors/space_text/text_python.c @@ -353,7 +353,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val) } if(draw) - ; // XXX redraw_alltext(); + {}; // XXX redraw_alltext(); return swallow; } @@ -536,7 +536,7 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val) } if(draw) - ; // XXX redraw_alltext(); + {}; // XXX redraw_alltext(); return swallow; } diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c index c4ca4d8522f..8445f1b47e7 100644 --- a/source/blender/editors/space_time/space_time.c +++ b/source/blender/editors/space_time/space_time.c @@ -29,6 +29,7 @@ #include <string.h> #include <stdio.h> +#include "DNA_object_types.h" #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" @@ -37,11 +38,14 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_dlrbTree.h" #include "BKE_context.h" #include "BKE_global.h" #include "BKE_screen.h" +#include "BKE_utildefines.h" +#include "ED_keyframes_draw.h" #include "ED_space_api.h" #include "ED_screen.h" #include "ED_util.h" @@ -106,6 +110,95 @@ static void time_draw_sfra_efra(const bContext *C, SpaceTime *stime, ARegion *ar fdrawline((float)PEFRA, v2d->cur.ymin, (float)PEFRA, v2d->cur.ymax); } +/* helper function - find actkeycolumn that occurs on cframe, or the nearest one if not found */ +static ActKeyColumn *time_cfra_find_ak (ActKeyColumn *ak, float cframe) +{ + ActKeyColumn *akn= NULL; + + /* sanity checks */ + if (ak == NULL) + return NULL; + + /* check if this is a match, or whether it is in some subtree */ + if (cframe < ak->cfra) + akn= time_cfra_find_ak(ak->left, cframe); + else if (cframe > ak->cfra) + akn= time_cfra_find_ak(ak->right, cframe); + + /* if no match found (or found match), just use the current one */ + if (akn == NULL) + return ak; + else + return akn; +} + +/* helper for time_draw_keyframes() */ +static void time_draw_idblock_keyframes(View2D *v2d, ID *id) +{ + DLRBT_Tree keys; + ActKeyColumn *ak; + + /* init binarytree-list for getting keyframes */ + BLI_dlrbTree_init(&keys); + + /* populate tree with keyframe nodes */ + switch (GS(id->name)) { + case ID_SCE: + scene_to_keylist(NULL, (Scene *)id, &keys, NULL); + break; + case ID_OB: + ob_to_keylist(NULL, (Object *)id, &keys, NULL); + break; + } + + /* build linked-list for searching */ + BLI_dlrbTree_linkedlist_sync(&keys); + + /* start drawing keyframes + * - we use the binary-search capabilities of the tree to only start from + * the first visible keyframe (last one can then be easily checked) + * - draw within a single GL block to be faster + */ + glBegin(GL_LINES); + for ( ak=time_cfra_find_ak(keys.root, v2d->cur.xmin); + (ak) && (ak->cfra <= v2d->cur.xmax); + ak=ak->next ) + { + glVertex2f(ak->cfra, v2d->cur.ymin); + glVertex2f(ak->cfra, v2d->cur.ymax); + } + glEnd(); // GL_LINES + + /* free temp stuff */ + BLI_dlrbTree_free(&keys); +} + +/* draw keyframe lines for timeline */ +static void time_draw_keyframes(const bContext *C, SpaceTime *stime, ARegion *ar) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + View2D *v2d= &ar->v2d; + + /* draw scene keyframes first + * - only if we're not only showing the + */ + if ((scene) && (stime->flag & TIME_ONLYACTSEL)==0) { + /* set draw color */ + glColor3ub(0xDD, 0xA7, 0x00); + time_draw_idblock_keyframes(v2d, (ID *)scene); + } + + /* draw active object's keyframes */ + if (ob) { + /* set draw color */ + glColor3ub(0xDD, 0xD7, 0x00); + time_draw_idblock_keyframes(v2d, (ID *)ob); + } +} + +/* ---------------- */ + /* add handlers, stuff you only do once or on area/region changes */ static void time_main_area_init(wmWindowManager *wm, ARegion *ar) { @@ -118,11 +211,10 @@ static void time_main_area_init(wmWindowManager *wm, ARegion *ar) WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); } - static void time_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ - SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C); + SpaceTime *stime= CTX_wm_space_time(C); View2D *v2d= &ar->v2d; View2DGrid *grid; View2DScrollers *scrollers; @@ -144,7 +236,10 @@ static void time_main_area_draw(const bContext *C, ARegion *ar) grid= UI_view2d_grid_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy); UI_view2d_grid_draw(C, v2d, grid, (V2D_VERTICAL_LINES|V2D_VERTICAL_AXIS)); UI_view2d_grid_free(grid); - + + /* keyframes */ + time_draw_keyframes(C, stime, ar); + /* current frame */ time_draw_cfra_time(C, stime, ar); @@ -327,7 +422,7 @@ void ED_spacetype_time(void) art= MEM_callocN(sizeof(ARegionType), "spacetype time region"); art->regionid = RGN_TYPE_HEADER; art->minsizey= HEADERY; - art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D; + art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES; art->init= time_header_area_init; art->draw= time_header_area_draw; diff --git a/source/blender/editors/space_time/time_header.c b/source/blender/editors/space_time/time_header.c index 9ffce53e572..b4e3c087360 100644 --- a/source/blender/editors/space_time/time_header.c +++ b/source/blender/editors/space_time/time_header.c @@ -53,6 +53,8 @@ #include "WM_api.h" #include "WM_types.h" +#include "RNA_access.h" + #include "BIF_gl.h" #include "BIF_glutil.h" @@ -67,7 +69,8 @@ /* ************************ header time area region *********************** */ -static ARegion *time_top_left_3dwindow(bScreen *screen) +/* exported for use in screen_ops.c */ +ARegion *time_top_left_3dwindow(bScreen *screen) { ARegion *aret= NULL; ScrArea *sa; @@ -94,7 +97,7 @@ static void do_time_redrawmenu(bContext *C, void *arg, int event) if(event < 1001) { bScreen *screen= CTX_wm_screen(C); - SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C); + SpaceTime *stime= CTX_wm_space_time(C); stime->redraws ^= event; @@ -108,22 +111,15 @@ static void do_time_redrawmenu(bContext *C, void *arg, int event) sad->ar= time_top_left_3dwindow(screen); } } - else { - if(event==1001) { -// button(&CTX_data_scene(C)->r.frs_sec,1,120,"FPS:"); - } - } } static uiBlock *time_redrawmenu(bContext *C, ARegion *ar, void *arg_unused) { ScrArea *curarea= CTX_wm_area(C); - SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C); - Scene *scene= CTX_data_scene(C); + SpaceTime *stime= CTX_wm_space_time(C); uiBlock *block; short yco= 0, menuwidth=120, icon; - char str[32]; block= uiBeginBlock(C, ar, "header time_redrawmenu", UI_EMBOSSP); uiBlockSetButmFunc(block, do_time_redrawmenu, NULL); @@ -155,16 +151,10 @@ static uiBlock *time_redrawmenu(bContext *C, ARegion *ar, void *arg_unused) uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - sprintf(str, "Set Frames/Sec (%d/%f)", scene->r.frs_sec, scene->r.frs_sec_base); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1001, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - if(stime->redraws & TIME_CONTINUE_PHYSICS) icon= ICON_CHECKBOX_HLT; else icon= ICON_CHECKBOX_DEHLT; uiDefIconTextBut(block, BUTM, 1, icon, "Continue Physics", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, TIME_CONTINUE_PHYSICS, "During playblack, continue physics simulations regardless of the frame number"); - if(curarea->headertype==HEADERTOP) { uiBlockSetDirection(block, UI_DOWN); } @@ -182,7 +172,7 @@ static uiBlock *time_redrawmenu(bContext *C, ARegion *ar, void *arg_unused) static void do_time_viewmenu(bContext *C, void *arg, int event) { ScrArea *curarea= CTX_wm_area(C); - SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C); + SpaceTime *stime= CTX_wm_space_time(C); View2D *v2d= UI_view2d_fromcontext_rwin(C); Scene *scene= CTX_data_scene(C); int first; @@ -215,12 +205,6 @@ static void do_time_viewmenu(bContext *C, void *arg, int event) case 7: //nextprev_marker(-1); break; - case 8: - //nextprev_timeline_key(1); - break; - case 9: - //nextprev_timeline_key(-1); - break; case 10: //timeline_frame_to_center(); break; @@ -240,7 +224,7 @@ static void do_time_viewmenu(bContext *C, void *arg, int event) static uiBlock *time_viewmenu(bContext *C, ARegion *ar, void *arg_unused) { ScrArea *curarea= CTX_wm_area(C); - SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C); + SpaceTime *stime= CTX_wm_space_time(C); View2D *v2d= UI_view2d_fromcontext_rwin(C); uiBlock *block; short yco= 0, menuwidth=120; @@ -371,16 +355,10 @@ static uiBlock *time_framemenu(bContext *C, ARegion *ar, void *arg_unused) #define B_REDRAWALL 750 -#define B_TL_REW 751 #define B_TL_PLAY 752 #define B_TL_RPLAY 760 -#define B_TL_FF 753 -#define B_TL_PREVKEY 754 -#define B_TL_NEXTKEY 755 #define B_TL_STOP 756 #define B_TL_PREVIEWON 757 -#define B_TL_INSERTKEY 758 -#define B_TL_DELETEKEY 759 #define B_FLIPINFOMENU 0 #define B_NEWFRAME 0 @@ -389,8 +367,6 @@ static uiBlock *time_framemenu(bContext *C, ARegion *ar, void *arg_unused) void do_time_buttons(bContext *C, void *arg, int event) { - bScreen *screen= CTX_wm_screen(C); - SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C); Scene *scene= CTX_data_scene(C); switch(event) { @@ -400,53 +376,6 @@ void do_time_buttons(bContext *C, void *arg, int event) case B_NEWFRAME: WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); break; - case B_TL_REW: - scene->r.cfra= PSFRA; - WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); - //update_for_newframe(); - break; - case B_TL_PLAY: - ED_screen_animation_timer(C, stime->redraws, 1); - - /* update region if TIME_REGION was set, to leftmost 3d window */ - if(screen->animtimer && (stime->redraws & TIME_REGION)) { - wmTimer *wt= screen->animtimer; - ScreenAnimData *sad= wt->customdata; - - sad->ar= time_top_left_3dwindow(screen); - } - - break; - case B_TL_RPLAY: - ED_screen_animation_timer(C, stime->redraws, -1); - - /* update region if TIME_REGION was set, to leftmost 3d window */ - if(screen->animtimer && (stime->redraws & TIME_REGION)) { - wmTimer *wt= screen->animtimer; - ScreenAnimData *sad= wt->customdata; - - sad->ar= time_top_left_3dwindow(screen); - } - - break; - case B_TL_STOP: - ED_screen_animation_timer(C, 0, 0); - break; - case B_TL_FF: - /* end frame */ - scene->r.cfra= PEFRA; - WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); - //update_for_newframe(); - break; - case B_TL_PREVKEY: - /* previous keyframe */ - //nextprev_timeline_key(-1); - break; - case B_TL_NEXTKEY: - /* next keyframe */ - //nextprev_timeline_key(1); - break; - case B_TL_PREVIEWON: if (scene->r.psfra) { /* turn on preview range */ @@ -461,17 +390,6 @@ void do_time_buttons(bContext *C, void *arg, int event) //BIF_undo_push("Set anim-preview range"); WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene); break; - - case B_TL_INSERTKEY: - /* insert keyframe */ - //common_insertkey(); - //allqueue(REDRAWTIME, 1); - break; - case B_TL_DELETEKEY: - /* delete keyframe */ - //common_deletekey(); - //allqueue(REDRAWTIME, 1); - break; } } @@ -479,9 +397,11 @@ void do_time_buttons(bContext *C, void *arg, int event) void time_header_buttons(const bContext *C, ARegion *ar) { ScrArea *sa= CTX_wm_area(C); - SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C); + SpaceTime *stime= CTX_wm_space_time(C); Scene *scene= CTX_data_scene(C); + wmTimer *animtimer= CTX_wm_screen(C)->animtimer; uiBlock *block; + uiBut *but; int xco, yco= 3; char *menustr= NULL; @@ -547,7 +467,7 @@ void time_header_buttons(const bContext *C, ARegion *ar) } uiBlockEndAlign(block); - xco += (short)(4.5 * XIC + 16); + xco += (short)(4.5 * XIC); /* MINAFRAMEF not MINFRAMEF, since MINAFRAMEF allows to set current frame negative * to facilitate easier keyframing in some situations @@ -557,75 +477,86 @@ void time_header_buttons(const bContext *C, ARegion *ar) &(scene->r.cfra), MINAFRAMEF, MAXFRAMEF, 0, 0, "Displays Current Frame of animation"); - xco += (short)(3.5 * XIC + 16); + xco += (short)(3.5 * XIC); + + uiBlockBeginAlign(block); + + but= uiDefIconButO(block, BUT, "SCREEN_OT_frame_jump", WM_OP_INVOKE_REGION_WIN, ICON_REW, xco,yco,XIC,YIC, "Skip to Start frame (Shift DownArrow)"); + RNA_boolean_set(uiButGetOperatorPtrRNA(but), "end", 0); + xco+= XIC; - uiDefIconBut(block, BUT, B_TL_REW, ICON_REW, - xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to Start frame (Shift DownArrow)"); - xco+= XIC+4; - uiDefIconBut(block, BUT, B_TL_PREVKEY, ICON_PREV_KEYFRAME, - xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to previous keyframe (Ctrl PageDown)"); - xco+= XIC+4; + but= uiDefIconButO(block, BUT, "SCREEN_OT_keyframe_jump", WM_OP_INVOKE_REGION_WIN, ICON_PREV_KEYFRAME, xco,yco,XIC,YIC, "Skip to previous keyframe (Ctrl PageDown)"); + RNA_boolean_set(uiButGetOperatorPtrRNA(but), "next", 0); + xco+= XIC; - if(CTX_wm_screen(C)->animtimer) { - /* pause button is drawn centered between the two other buttons for now (saves drawing 2 buttons, or having position changes) */ - xco+= XIC/2 + 2; + if (animtimer) { + /* pause button 2*size to keep buttons in place */ + but=uiDefIconButO(block, BUT, "SCREEN_OT_animation_play", WM_OP_INVOKE_REGION_WIN, ICON_PAUSE, xco,yco,XIC*2,YIC, "Stop Playing Timeline"); - uiDefIconBut(block, BUT, B_TL_STOP, ICON_PAUSE, - xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Stop Playing Timeline"); - - xco+= XIC/2 + 2; + xco+= XIC; } else { - // FIXME: the icon for this is crap - uiDefIconBut(block, BUT, B_TL_RPLAY, ICON_REW/*ICON_PLAY*/, - xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Play Timeline in Reverse"); - - xco+= XIC+4; + but=uiDefIconButO(block, BUT, "SCREEN_OT_animation_play", WM_OP_INVOKE_REGION_WIN, ICON_PLAY_REVERSE, xco,yco,XIC,YIC, "Play Timeline in Reverse"); + RNA_boolean_set(uiButGetOperatorPtrRNA(but), "reverse", 1); + xco+= XIC; - uiDefIconBut(block, BUT, B_TL_PLAY, ICON_PLAY, - xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Play Timeline "); + but=uiDefIconButO(block, BUT, "SCREEN_OT_animation_play", WM_OP_INVOKE_REGION_WIN, ICON_PLAY, xco,yco,XIC,YIC, "Play Timeline"); + RNA_boolean_set(uiButGetOperatorPtrRNA(but), "reverse", 0); } - xco+= XIC+4; + xco+= XIC; - uiDefIconBut(block, BUT, B_TL_NEXTKEY, ICON_NEXT_KEYFRAME, - xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to next keyframe (Ctrl PageUp)"); - xco+= XIC+4; - uiDefIconBut(block, BUT, B_TL_FF, ICON_FF, - xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to End frame (Shift UpArrow)"); - xco+= XIC+8; + but= uiDefIconButO(block, BUT, "SCREEN_OT_keyframe_jump", WM_OP_INVOKE_REGION_WIN, ICON_NEXT_KEYFRAME, xco,yco,XIC,YIC, "Skip to next keyframe (Ctrl PageUp)"); + RNA_boolean_set(uiButGetOperatorPtrRNA(but), "next", 1); + xco+= XIC; + + but= uiDefIconButO(block, BUT, "SCREEN_OT_frame_jump", WM_OP_INVOKE_REGION_WIN, ICON_FF, xco,yco,XIC,YIC, "Skip to End frame (Shift UpArrow)"); + RNA_boolean_set(uiButGetOperatorPtrRNA(but), "end", 1); + xco+= XIC; + uiBlockEndAlign(block); + + xco+= 1.5*XIC; uiBlockBeginAlign(block); - uiDefIconButBitS(block, TOG, AUTOKEY_ON, B_REDRAWALL, ICON_REC, - xco, yco, XIC, YIC, &(scene->toolsettings->autokey_mode), 0, 0, 0, 0, "Automatic keyframe insertion for Objects and Bones"); - xco+= XIC; - if (IS_AUTOKEY_ON(scene)) { - uiDefButS(block, MENU, B_REDRAWALL, - "Auto-Keying Mode %t|Add/Replace Keys%x3|Replace Keys %x5", - xco, yco, (int)5.5*XIC, YIC, &(scene->toolsettings->autokey_mode), 0, 1, 0, 0, - "Mode of automatic keyframe insertion for Objects and Bones"); - xco+= (6*XIC); + uiDefIconButBitS(block, TOG, AUTOKEY_ON, B_REDRAWALL, ICON_REC, + xco, yco, XIC, YIC, &(scene->toolsettings->autokey_mode), 0, 0, 0, 0, "Automatic keyframe insertion for Objects and Bones"); + xco+= XIC; + + if (IS_AUTOKEY_ON(scene)) { + uiDefButS(block, MENU, B_REDRAWALL, + "Auto-Keying Mode %t|Add/Replace Keys%x3|Replace Keys %x5", + xco, yco, (int)5.5*XIC, YIC, &(scene->toolsettings->autokey_mode), 0, 1, 0, 0, + "Mode of automatic keyframe insertion for Objects and Bones"); + xco+= (5.5*XIC); + + if (animtimer) { + uiDefButBitS(block, TOG, ANIMRECORD_FLAG_WITHNLA, B_REDRAWALL, "Layered", + xco,yco, XIC*2.5, YIC, + &(scene->toolsettings->autokey_flag),0, 1, 0, 0, + "Add a new NLA Track + Strip for every loop/pass made over the animation to allow non-destructive tweaking."); + xco+= (3*XIC); } + } + else + xco+= 6; + uiBlockEndAlign(block); - xco+= 16; - - menustr= ANIM_build_keyingsets_menu(&scene->keyingsets, 0); uiDefButI(block, MENU, B_DIFF, menustr, xco, yco, (int)5.5*XIC, YIC, &(scene->active_keyingset), 0, 1, 0, 0, "Active Keying Set (i.e. set of channels to Insert Keyframes for)"); MEM_freeN(menustr); - xco+= (6*XIC); + xco+= (5.5*XIC); uiBlockBeginAlign(block); - uiDefIconButO(block, BUT, "ANIM_OT_delete_keyframe", WM_OP_INVOKE_REGION_WIN, ICON_KEY_DEHLT, xco,yco,XIC,YIC, "Delete Keyframes for the Active Keying Set (Alt-I)"); - xco += XIC; - uiDefIconButO(block, BUT, "ANIM_OT_insert_keyframe", WM_OP_INVOKE_REGION_WIN, ICON_KEY_HLT, xco,yco,XIC,YIC, "Insert Keyframes for the Active Keying Set (I)"); - xco += XIC; + uiDefIconButO(block, BUT, "ANIM_OT_delete_keyframe", WM_OP_INVOKE_REGION_WIN, ICON_KEY_DEHLT, xco,yco,XIC,YIC, "Delete Keyframes for the Active Keying Set (Alt-I)"); + xco += XIC; + uiDefIconButO(block, BUT, "ANIM_OT_insert_keyframe", WM_OP_INVOKE_REGION_WIN, ICON_KEY_HLT, xco,yco,XIC,YIC, "Insert Keyframes for the Active Keying Set (I)"); + xco += XIC; uiBlockEndAlign(block); - xco+= 16; + xco+= XIC; uiDefIconButBitI(block, TOG, TIME_WITH_SEQ_AUDIO, B_DIFF, ICON_SPEAKER, xco, yco, XIC, YIC, &(stime->redraws), 0, 0, 0, 0, "Play back and sync with audio from Sequence Editor"); diff --git a/source/blender/editors/space_view3d/Makefile b/source/blender/editors/space_view3d/Makefile index 5e6f8a6c426..07102157854 100644 --- a/source/blender/editors/space_view3d/Makefile +++ b/source/blender/editors/space_view3d/Makefile @@ -52,7 +52,7 @@ CPPFLAGS += -I../../makesrna CPPFLAGS += -I../../render/extern/include CPPFLAGS += -I../../blenfont CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include - +CPPFLAGS += -I$(NAN_SMOKE)/include # own include CPPFLAGS += -I../include diff --git a/source/blender/editors/space_view3d/SConscript b/source/blender/editors/space_view3d/SConscript index b90ac30cd41..b6cb91609af 100644 --- a/source/blender/editors/space_view3d/SConscript +++ b/source/blender/editors/space_view3d/SConscript @@ -7,7 +7,8 @@ defs = [] incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' incs += ' ../../render/extern/include #/intern/guardedalloc' -incs += ' ../../gpu ../../makesrna ../../blenfont ../../bmesh ' +incs += ' ../../gpu ../../makesrna ../../blenfont ../../bmesh' +incs += ' #/intern/smoke/extern' if env['WITH_BF_GAMEENGINE']: defs.append('GAMEBLENDER=1') diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index b698b404825..5a9790390b7 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -2154,12 +2154,12 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec /* only draw framenum if several consecutive highlighted points don't occur on same point */ if (a == 0) { - sprintf(str, " %d\n", (a+sfra)); + sprintf(str, "%d", (a+sfra)); view3d_object_text_draw_add(fp[0], fp[1], fp[2], str, 0); } else if ((a > stepsize) && (a < len-stepsize)) { if ((VecEqual(fp, fp-(stepsize*3))==0) || (VecEqual(fp, fp+(stepsize*3))==0)) { - sprintf(str, " %d\n", (a+sfra)); + sprintf(str, "%d", (a+sfra)); view3d_object_text_draw_add(fp[0], fp[1], fp[2], str, 0); } } @@ -2201,7 +2201,7 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec if (ak->cfra == (a+sfra)) { char str[32]; - sprintf(str, " %d\n", (a+sfra)); + sprintf(str, "%d", (a+sfra)); view3d_object_text_draw_add(fp[0], fp[1], fp[2], str, 0); } } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 122a1965af6..43dacd28ca0 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -59,6 +59,7 @@ #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "DNA_smoke_types.h" #include "DNA_userdef_types.h" #include "DNA_view3d_types.h" #include "DNA_world_types.h" @@ -88,9 +89,12 @@ #include "BKE_object.h" #include "BKE_particle.h" #include "BKE_property.h" +#include "BKE_smoke.h" #include "BKE_utildefines.h" #include "BKE_tessmesh.h" +#include "smoke_API.h" + #include "BIF_gl.h" #include "BIF_glutil.h" @@ -124,11 +128,6 @@ (((vd->drawtype==OB_SOLID) && (dt>=OB_SOLID) && (vd->flag2 & V3D_SOLID_TEX) && (vd->flag & V3D_ZBUF_SELECT)) == 0) \ ) - -/* pretty stupid */ -/* editmball.c */ -extern ListBase editelems; - static void draw_bounding_volume(Scene *scene, Object *ob); static void drawcube_size(float size); @@ -4433,7 +4432,7 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, if(ml==NULL) return 1; /* in case solid draw, reset wire colors */ - if(mb->editelems && (ob->flag & SELECT)) { + if(ob->flag & SELECT) { if(ob==OBACT) UI_ThemeColor(TH_ACTIVE); else UI_ThemeColor(TH_SELECT); } @@ -4935,6 +4934,7 @@ void drawRBpivot(bRigidBodyJointConstraint *data) void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) { static int warning_recursive= 0; + ModifierData *md = NULL; Object *ob; Curve *cu; RegionView3D *rv3d= ar->regiondata; @@ -5330,6 +5330,356 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if(col) cpack(col); } + /* draw code for smoke */ + if(md = modifiers_findByType(ob, eModifierType_Smoke)) + { + SmokeModifierData *smd = (SmokeModifierData *)md; + + // draw collision objects + if((smd->type & MOD_SMOKE_TYPE_COLL) && smd->coll) + { + SmokeCollSettings *scs = smd->coll; + /* + if(scs->points) + { + size_t i; + + wmLoadMatrix(rv3d->viewmat); + + if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); + glDepthMask(GL_FALSE); + glEnable(GL_BLEND); + + + // glPointSize(3.0); + bglBegin(GL_POINTS); + + for(i = 0; i < scs->numpoints; i++) + { + bglVertex3fv(&scs->points[3*i]); + } + + bglEnd(); + glPointSize(1.0); + + wmMultMatrix(ob->obmat); + glDisable(GL_BLEND); + glDepthMask(GL_TRUE); + if(col) cpack(col); + + } + */ + } + + // only draw domains + if(smd->domain && smd->domain->fluid) + { + int x, y, z, i; + float viewnormal[3]; + int mainaxis[3] = {0,0,0}; + float align = 0, signed_align = 0; + int max_textures = 0, counter_textures = 0; + float *buffer = NULL; + int res[3]; + float bigfactor = 1.0; + int big = smd->domain->flags & MOD_SMOKE_HIGHRES; + int new = 0; + + // GUI sent redraw event + if(smd->domain->flags & MOD_SMOKE_VIEW_REDRAWNICE) + { + new = 1; + smd->domain->flags &= ~MOD_SMOKE_VIEW_REDRAWNICE; + } + + if(!big) + { + res[0] = smd->domain->res[0]; + res[1] = smd->domain->res[1]; + res[2] = smd->domain->res[2]; + } + else + { + smoke_get_bigres(smd->domain->fluid, res); + bigfactor = 1.0 / smd->domain->amplify; + } + + wmLoadMatrix(rv3d->viewmat); + + if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); /* for visibility, also while wpaint */ + glDepthMask(GL_FALSE); + glEnable(GL_BLEND); + + // get view vector + VECCOPY(viewnormal, rv3d->viewinv[2]); + Normalize(viewnormal); + for(i = 0; i < 3; i++) + { + if(ABS(viewnormal[i]) > align) + { + mainaxis[0] = i; + align = ABS(viewnormal[i]); + signed_align = viewnormal[i]; + } + } + mainaxis[1] = (mainaxis[0] + 1) % 3; + mainaxis[2] = (mainaxis[0] + 2) % 3; + + if(!smd->domain->bind) + { + smd->domain->bind = MEM_callocN(sizeof(GLuint)*256, "Smoke_bind"); + if(big) + smd->domain->viewsettings |= MOD_SMOKE_VIEW_CHANGETOBIG; + new = 3; + } + + // check if view axis / mode has been changed + if(smd->domain->viewsettings) + { + if(big) + { + if(!(smd->domain->viewsettings & MOD_SMOKE_VIEW_BIG)) + new = 2; + else if(!(smd->domain->viewsettings & MOD_SMOKE_VIEW_CHANGETOBIG)) + new = 1; + + smd->domain->viewsettings |= MOD_SMOKE_VIEW_CHANGETOBIG; + } + else + { + if(!(smd->domain->viewsettings & MOD_SMOKE_VIEW_SMALL)) + new = 2; + else if(smd->domain->viewsettings & MOD_SMOKE_VIEW_CHANGETOBIG) + new = 1; + + smd->domain->viewsettings &= ~MOD_SMOKE_VIEW_CHANGETOBIG; + } + + if(!new) + { + if((mainaxis[0] == 0) && !(smd->domain->viewsettings & MOD_SMOKE_VIEW_X)) + new = 1; + else if((mainaxis[0] == 1) && !(smd->domain->viewsettings & MOD_SMOKE_VIEW_Y)) + new = 1; + else if((mainaxis[0] == 2) && !(smd->domain->viewsettings & MOD_SMOKE_VIEW_Z)) + new = 1; + + // printf("check axis\n"); + } + } + else + new = 3; + + if(new > 1) + { + float light[3] = {0.0,0.0,2.0}; // TODO: take real LAMP coordinates - dg + Base *base_tmp = NULL; + + for(base_tmp = scene->base.first; base_tmp; base_tmp= base_tmp->next) + { + if(base_tmp->object->type == OB_LAMP) + { + Lamp *la = (Lamp *)base_tmp->object->data; + + if(la->type == LA_LOCAL) + { + VECCOPY(light, base_tmp->object->obmat[3]); + break; + } + } + } + + if(!big && !(smd->domain->viewsettings & MOD_SMOKE_VIEW_SMALL)) + { + smoke_prepare_View(smd, light); + // printf("prepared View!\n"); + } + else if(big && !(smd->domain->viewsettings & MOD_SMOKE_VIEW_BIG)) + { + smoke_prepare_bigView(smd, light); + // printf("prepared bigView!\n"); + } + } + + // printf("big: %d, new: %d\n", big, new); + + // only create buffer if we need to create new textures + if(new) + buffer = MEM_mallocN(sizeof(float)*res[mainaxis[1]]*res[mainaxis[2]]*4, "SmokeDrawBuffer"); + + if(buffer || smd->domain->viewsettings) + { + int mod_texture = 0; + + // printf("if(buffer || smd->domain->viewsettings)\n"); + + max_textures = (res[mainaxis[0]] > 256) ? 256 : res[mainaxis[0]]; + + if(!smd->domain->viewsettings) // new frame or new start + { + smd->domain->max_textures = max_textures; + glGenTextures(smd->domain->max_textures, (GLuint *)smd->domain->bind); + new = 1; + // printf("glGenTextures\n"); + } + else + { + if(new) + { + // printf("glDeleteTextures\n"); + glDeleteTextures(smd->domain->max_textures, (GLuint *)smd->domain->bind); + smd->domain->max_textures = max_textures; + glGenTextures(smd->domain->max_textures, (GLuint *)smd->domain->bind); + } + } + + mod_texture = MAX3(1, smd->domain->visibility, (int)(res[mainaxis[0]] / smd->domain->max_textures )); + + // align order of billboards to be front or backview (e.g. +x or -x axis) + if(signed_align < 0) + { + z = res[mainaxis[0]] - 1; + } + else + { + z = 0; + } + + for (; signed_align > 0 ? (z < res[mainaxis[0]]) : (z >= 0); signed_align > 0 ? z++ : z--) // 2 + { + float quad[4][3]; + + if(new) + { + for (y = 0; y < res[mainaxis[1]]; y++) // 1 + { + for (x = 0; x < res[mainaxis[2]]; x++) // 0 + { + size_t index; + size_t image_index; + float tray, tvox; + + image_index = smoke_get_index2d(y, res[mainaxis[1]], x); + + if(mainaxis[0] == 0) + { + // mainaxis[1] == 1, mainaxis[2] == 2 + index = smoke_get_index(z, res[mainaxis[0]], y, res[mainaxis[1]], x); + } + else if(mainaxis[0] == 1) + { + // mainaxis[1] == 2, mainaxis[2] == 0 + index = smoke_get_index(x, res[mainaxis[2]], z, res[mainaxis[0]], y); + } + else // mainaxis[0] == 2 + { + // mainaxis[1] == 0, mainaxis[2] == 1 + index = smoke_get_index(y, res[mainaxis[1]], x, res[mainaxis[2]], z); + } + + if(!big) + { + tvox = smoke_get_tvox(smd, index); + tray = smoke_get_tray(smd, index); + } + else + { + tvox = smoke_get_bigtvox(smd, index); + tray = smoke_get_bigtray(smd, index); + } + + // fill buffer with luminance and alpha + // 1 - T_vox + buffer[image_index*4 + 3] = 1.0 - tvox; // 0 = transparent => d.h. tvox = 1 + + // L_vox = Omega * L_light * (1 - T_vox) * T_ray + buffer[image_index*4] = buffer[image_index*4 + 1] = buffer[image_index*4 + 2] = smd->domain->omega * 1.0 * tvox * tray; + } + } + } + glBindTexture(GL_TEXTURE_2D, smd->domain->bind[counter_textures]); + glEnable(GL_TEXTURE_2D); + + if(new) + { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, res[mainaxis[1]], res[mainaxis[2]], 0, GL_RGBA, GL_FLOAT, buffer); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Linear Filtering + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering + } + + if((z % mod_texture) == 0 ) + { + // botttom left + quad[3][mainaxis[0]] = smd->domain->p0[mainaxis[0]] + z * smd->domain->dx * bigfactor + smd->domain->dx * bigfactor * 0.5; + quad[3][mainaxis[1]] = smd->domain->p0[mainaxis[1]] + smd->domain->dx * bigfactor * 0.5; + quad[3][mainaxis[2]] = smd->domain->p0[mainaxis[2]] + smd->domain->dx * bigfactor * 0.5; + + // top right + quad[1][mainaxis[0]] = smd->domain->p0[mainaxis[0]] + z * smd->domain->dx * bigfactor + smd->domain->dx * bigfactor * 0.5; + quad[1][mainaxis[1]] = smd->domain->p0[mainaxis[1]] + (res[mainaxis[1]] - 1) * smd->domain->dx * bigfactor + smd->domain->dx * bigfactor * 0.5; + quad[1][mainaxis[2]] = smd->domain->p0[mainaxis[2]] + (res[mainaxis[2]] - 1) * smd->domain->dx * bigfactor + smd->domain->dx * bigfactor * 0.5; + + // top left + quad[2][mainaxis[0]] = smd->domain->p0[mainaxis[0]] + z * smd->domain->dx * bigfactor + smd->domain->dx * bigfactor * 0.5; + quad[2][mainaxis[1]] = smd->domain->p0[mainaxis[1]] + smd->domain->dx * bigfactor * 0.5; + quad[2][mainaxis[2]] = smd->domain->p0[mainaxis[2]] + (res[mainaxis[2]] - 1) * smd->domain->dx * bigfactor + smd->domain->dx * bigfactor * 0.5; + + // bottom right + quad[0][mainaxis[0]] = smd->domain->p0[mainaxis[0]] + z * smd->domain->dx * bigfactor + smd->domain->dx * bigfactor * 0.5; + quad[0][mainaxis[1]] = smd->domain->p0[mainaxis[1]] + (res[mainaxis[1]] - 1) * smd->domain->dx * bigfactor + smd->domain->dx * bigfactor * 0.5; + quad[0][mainaxis[2]] = smd->domain->p0[mainaxis[2]] + smd->domain->dx * bigfactor * 0.5; + + glBegin(GL_QUADS); // Start Drawing Quads + + glTexCoord2f(1.0f, 0.0f); + glVertex3fv(quad[0]); // Left And Up 1 Unit (Top Left) + glTexCoord2f(1.0f, 1.0f); + glVertex3fv(quad[1]); // Right And Up 1 Unit (Top Right) + glTexCoord2f(0.0f, 1.0f); + glVertex3fv(quad[2]); // Right And Down One Unit (Bottom Right) + glTexCoord2f(0.0f, 0.0f); + glVertex3fv(quad[3]); // Left And Down One Unit (Bottom Left) + + glEnd(); + } + counter_textures++; + } + } + if(buffer) + { + MEM_freeN(buffer); + buffer = NULL; + } + + // set correct flag for viewsettings + if(1) + { + // do not clear BIG/SMALL flag + smd->domain->viewsettings &= ~MOD_SMOKE_VIEW_X; + smd->domain->viewsettings &= ~MOD_SMOKE_VIEW_Y; + smd->domain->viewsettings &= ~MOD_SMOKE_VIEW_Z; + + // set what caches we have + if(big) + smd->domain->viewsettings |= MOD_SMOKE_VIEW_BIG; + else + smd->domain->viewsettings |= MOD_SMOKE_VIEW_SMALL; + + if(mainaxis[0] == 0) + smd->domain->viewsettings |= MOD_SMOKE_VIEW_X; + else if(mainaxis[0] == 1) + smd->domain->viewsettings |= MOD_SMOKE_VIEW_Y; + else if(mainaxis[0] == 2) + smd->domain->viewsettings |= MOD_SMOKE_VIEW_Z; + } + + wmMultMatrix(ob->obmat); + glDisable(GL_BLEND); + glDepthMask(GL_TRUE); + if(col) cpack(col); + } + } + { bConstraint *con; for(con=ob->constraints.first; con; con= con->next) diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 2b162f9574d..e1f0b537241 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -280,7 +280,7 @@ static void view3d_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype) /* copy last mode, then we can re-init the region maps */ rv3d->lastmode= stype; - + keymap= WM_keymap_listbase(wm, "Object Mode", 0, 0); if(ELEM(stype, 0, NS_MODE_OBJECT)) WM_event_add_keymap_handler(&ar->handlers, keymap); @@ -305,6 +305,12 @@ static void view3d_modal_keymaps(wmWindowManager *wm, ARegion *ar, int stype) else WM_event_remove_keymap_handler(&ar->handlers, keymap); + keymap= WM_keymap_listbase(wm, "Metaball", 0, 0); + if(stype==NS_EDITMODE_MBALL) + WM_event_add_keymap_handler(&ar->handlers, keymap); + else + WM_event_remove_keymap_handler(&ar->handlers, keymap); + keymap= WM_keymap_listbase(wm, "Lattice", 0, 0); if(stype==NS_EDITMODE_LATTICE) WM_event_add_keymap_handler(&ar->handlers, keymap); @@ -532,7 +538,7 @@ static void view3d_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void view3d_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL, -1); } static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn) @@ -589,7 +595,7 @@ static void view3d_tools_area_init(wmWindowManager *wm, ARegion *ar) static void view3d_tools_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, view3d_context_string(C)); + ED_region_panels(C, ar, 1, view3d_context_string(C), -1); } static int view3d_context(const bContext *C, const char *member, bContextDataResult *result) diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c index ba95f3dbd07..f64954af6c3 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.c +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -1000,74 +1000,6 @@ static void view3d_panel_transform_spaces(const bContext *C, Panel *pa) } #endif // XXX not used -static void weight_paint_buttons(Scene *scene, uiBlock *block) -{ - VPaint *wpaint= scene->toolsettings->wpaint; - Object *ob; - ob= OBACT; - - if(ob==NULL || ob->type!=OB_MESH) return; - - /* XXX - uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI, B_REDR, "Weight:",10,170,225,19, &wpaint->weight, 0, 1, 10, 0, "Sets the current vertex group's bone deformation strength"); - - uiDefBut(block, BUT, B_WEIGHT0_0 , "0", 10,150,45,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, BUT, B_WEIGHT1_4 , "1/4", 55,150,45,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, BUT, B_WEIGHT1_2 , "1/2", 100,150,45,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, BUT, B_WEIGHT3_4 , "3/4", 145,150,45,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, BUT, B_WEIGHT1_0 , "1", 190,150,45,19, 0, 0, 0, 0, 0, ""); - - uiDefButF(block, NUMSLI, B_NOP, "Opacity ", 10,130,225,19, &wpaint->a, 0.0, 1.0, 0, 0, "The amount of pressure on the brush"); - - uiDefBut(block, BUT, B_OPA1_8 , "1/8", 10,110,45,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, BUT, B_OPA1_4 , "1/4", 55,110,45,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, BUT, B_OPA1_2 , "1/2", 100,110,45,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, BUT, B_OPA3_4 , "3/4", 145,110,45,19, 0, 0, 0, 0, 0, ""); - uiDefBut(block, BUT, B_OPA1_0 , "1", 190,110,45,19, 0, 0, 0, 0, 0, ""); - - uiDefButF(block, NUMSLI, B_NOP, "Size ", 10,90,225,19, &wpaint->size, 2.0, 64.0, 0, 0, "The size of the brush"); - - uiBlockBeginAlign(block); - uiDefButS(block, ROW, B_NOP, "Mix", 250,170,60,17, &wpaint->mode, 1.0, 0.0, 0, 0, "Mix the vertex colors"); - uiDefButS(block, ROW, B_NOP, "Add", 250,152,60,17, &wpaint->mode, 1.0, 1.0, 0, 0, "Add the vertex colors"); - uiDefButS(block, ROW, B_NOP, "Sub", 250,134,60,17, &wpaint->mode, 1.0, 2.0, 0, 0, "Subtract from the vertex color"); - uiDefButS(block, ROW, B_NOP, "Mul", 250,116,60,17, &wpaint->mode, 1.0, 3.0, 0, 0, "Multiply the vertex color"); - uiDefButS(block, ROW, B_NOP, "Blur", 250, 98,60,17, &wpaint->mode, 1.0, 4.0, 0, 0, "Blur the weight with surrounding values"); - uiDefButS(block, ROW, B_NOP, "Lighter", 250, 80,60,17, &wpaint->mode, 1.0, 5.0, 0, 0, "Paint over darker areas only"); - uiDefButS(block, ROW, B_NOP, "Darker", 250, 62,60,17, &wpaint->mode, 1.0, 6.0, 0, 0, "Paint over lighter areas only"); - uiBlockEndAlign(block); - */ - - /* draw options same as below */ - uiBlockBeginAlign(block); - if (FACESEL_PAINT_TEST) { - Mesh *me= ob->data; - uiDefButBitI(block, TOG, ME_DRAWFACES, B_REDR, "Faces", 10,45,60,19, &me->drawflag, 0, 0, 0, 0, "Displays all faces as shades"); - uiDefButBitI(block,TOG, ME_DRAWEDGES, B_REDR,"Edges",70,45,60,19, &me->drawflag, 2.0, 0, 0, 0, "Displays edges of visible faces"); - uiDefButBitI(block,TOG, ME_HIDDENEDGES, B_REDR,"Hidden Edges",130,45,100,19, &me->drawflag, 2.0, 1.0, 0, 0, "Displays edges of hidden faces"); - } else{ - uiDefButBitC(block, TOG, OB_DRAWWIRE, B_REDR, "Wire", 10,45,75,19, &ob->dtx, 0, 0, 0, 0, "Displays the active object's wireframe in shaded drawing modes"); - } - uiBlockEndAlign(block); - - uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, VP_AREA, 0, "All Faces", 10,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Paint on all faces inside brush (otherwise only on face under mouse cursor)"); - uiDefButBitS(block, TOG, VP_SOFT, 0, "Vert Dist", 70,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Use distances to vertices (instead of all vertices of face)"); - uiDefButBitS(block, TOGN, VP_HARD, 0, "Soft", 130,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Use a soft brush"); - uiDefButBitS(block, TOG, VP_NORMALS, 0, "Normals", 190,20,60,19, &wpaint->flag, 0, 0, 0, 0, "Applies the vertex normal before painting"); - uiDefButBitS(block, TOG, VP_SPRAY, 0, "Spray", 250,20,55,19, &wpaint->flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse"); - uiBlockEndAlign(block); - - if(ob) { - uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, VP_ONLYVGROUP, B_REDR, "Vgroup", 10,0,100,19, &wpaint->flag, 0, 0, 0, 0, "Only paint on vertices in the selected vertex group."); - uiDefButBitS(block, TOG, VP_MIRROR_X, B_REDR, "X-Mirror", 110,0,100,19, &wpaint->flag, 0, 0, 0, 0, "Mirrored Paint, applying on mirrored Weight Group name"); - uiDefBut(block, BUT, B_CLR_WPAINT, "Clear", 210,0,100,19, NULL, 0, 0, 0, 0, "Removes reference to this deform group from all vertices"); - uiBlockEndAlign(block); - } -} - static void brush_idpoin_handle(bContext *C, ID *id, int event) { Brush **br = current_brush_source(CTX_data_scene(C)); @@ -1153,23 +1085,6 @@ static void view3d_panel_object(const bContext *C, Panel *pa) else if(ob->flag & OB_POSEMODE) { v3d_posearmature_buts(block, v3d, ob, lim); } - else if(G.f & G_WEIGHTPAINT) { - BLI_strncpy(pa->drawname, "Weight Paint Properties", sizeof(pa->drawname)); - weight_paint_buttons(scene, block); - } - else if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT)) { - static float hsv[3], old[3]; // used as temp mem for picker - Brush **br = current_brush_source(scene); - - BLI_strncpy(pa->drawname, "Paint Properties", sizeof(pa->drawname)); - if(br && *br) - /* 'f' is for floating panel */ - uiBlockPickerButtons(block, (*br)->rgb, hsv, old, hexcol, 'f', B_REDR); - } - else if(G.f & G_PARTICLEEDIT){ - BLI_strncpy(pa->drawname, "Particle Edit Properties", sizeof(pa->drawname)); -// XXX particle_edit_buttons(block); - } else { BoundBox *bb = NULL; @@ -1255,133 +1170,6 @@ static void view3d_panel_object(const bContext *C, Panel *pa) } } -#if 0 // XXX not used anymore -static void view3d_panel_background(const bContext *C, Panel *pa) -{ - View3D *v3d= CTX_wm_view3d(C); - uiBlock *block; - - block= uiLayoutFreeBlock(pa->layout); - uiBlockSetHandleFunc(block, do_view3d_region_buttons, NULL); - - if(v3d->flag & V3D_DISPBGPIC) { - if(v3d->bgpic==NULL) { - v3d->bgpic= MEM_callocN(sizeof(BGpic), "bgpic"); - v3d->bgpic->size= 5.0; - v3d->bgpic->blend= 0.5; - v3d->bgpic->iuser.fie_ima= 2; - v3d->bgpic->iuser.ok= 1; - } - } - - if(!(v3d->flag & V3D_DISPBGPIC)) { - uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use Background Image", 10, 180, 150, 20, &v3d->flag, 0, 0, 0, 0, "Display an image in the background of this 3D View"); - uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, ""); - } - else { - uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use", 10, 225, 50, 20, &v3d->flag, 0, 0, 0, 0, "Display an image in the background of this 3D View"); - uiDefButF(block, NUMSLI, B_REDR, "Blend:", 60, 225, 150, 20, &v3d->bgpic->blend, 0.0,1.0, 0, 0, "Set the transparency of the background image"); - uiDefButF(block, NUM, B_REDR, "Size:", 210, 225, 100, 20, &v3d->bgpic->size, 0.1, 250.0*v3d->grid, 100, 0, "Set the size (width) of the background image"); - - uiDefButF(block, NUM, B_REDR, "X Offset:", 10, 205, 150, 20, &v3d->bgpic->xof, -250.0*v3d->grid,250.0*v3d->grid, 10, 2, "Set the horizontal offset of the background image"); - uiDefButF(block, NUM, B_REDR, "Y Offset:", 160, 205, 150, 20, &v3d->bgpic->yof, -250.0*v3d->grid,250.0*v3d->grid, 10, 2, "Set the vertical offset of the background image"); - - ED_image_uiblock_panel(C, block, &v3d->bgpic->ima, &v3d->bgpic->iuser, B_REDR, B_REDR); - uiBlockEndAlign(block); - } -} - - -static void view3d_panel_properties(const bContext *C, Panel *pa) -{ - ScrArea *sa= CTX_wm_area(C); - ARegion *arlast; - Scene *scene= CTX_data_scene(C); - View3D *v3d= CTX_wm_view3d(C); - RegionView3D *rv3d; - uiBlock *block; - float *curs; - - block= uiLayoutFreeBlock(pa->layout); - uiBlockSetHandleFunc(block, do_view3d_region_buttons, NULL); - - uiDefBut(block, LABEL, 1, "Grid:", 10, 220, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); - uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_REDR, "Spacing:", 10, 200, 140, 19, &v3d->grid, 0.001, 100.0, 10, 0, "Set the distance between grid lines"); - uiDefButS(block, NUM, B_REDR, "Lines:", 10, 180, 140, 19, &v3d->gridlines, 0.0, 100.0, 100, 0, "Set the number of grid lines in perspective view"); - uiDefButS(block, NUM, B_REDR, "Divisions:", 10, 160, 140, 19, &v3d->gridsubdiv, 1.0, 100.0, 100, 0, "Set the number of grid lines"); - uiBlockEndAlign(block); - - uiDefBut(block, LABEL, 1, "3D Display:", 160, 220, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); - uiDefButBitS(block, TOG, V3D_SHOW_FLOOR, B_REDR, "Grid Floor",160, 200, 150, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the grid floor in free camera mode"); - uiDefButBitS(block, TOG, V3D_SHOW_X, B_REDR, "X Axis", 160, 176, 48, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the X Axis line"); - uiDefButBitS(block, TOG, V3D_SHOW_Y, B_REDR, "Y Axis", 212, 176, 48, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the Y Axis line"); - uiDefButBitS(block, TOG, V3D_SHOW_Z, B_REDR, "Z Axis", 262, 176, 48, 19, &v3d->gridflag, 0, 0, 0, 0, "Show the Z Axis line"); - - uiDefBut(block, LABEL, 1, "View Camera:", 10, 140, 140, 19, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefButF(block, NUM, B_REDR, "Lens:", 10, 120, 140, 19, &v3d->lens, 10.0, 120.0, 100, 0, "The lens angle in perspective view"); - uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_REDR, "Clip Start:", 10, 96, 140, 19, &v3d->near, v3d->grid/100.0, 100.0, 10, 0, "Set the beginning of the range in which 3D objects are displayed (perspective view)"); - uiDefButF(block, NUM, B_REDR, "Clip End:", 10, 76, 140, 19, &v3d->far, 1.0, 10000.0*v3d->grid, 100, 0, "Set the end of the range in which 3D objects are displayed (perspective view)"); - uiBlockEndAlign(block); - - uiDefBut(block, LABEL, 1, "3D Cursor:", 160, 150, 140, 19, NULL, 0.0, 0.0, 0, 0, ""); - - uiBlockBeginAlign(block); - curs= give_cursor(scene, v3d); - uiDefButF(block, NUM, B_REDR, "X:", 160, 130, 150, 22, curs, -10000.0*v3d->grid, 10000.0*v3d->grid, 10, 0, "X co-ordinate of the 3D cursor"); - uiDefButF(block, NUM, B_REDR, "Y:", 160, 108, 150, 22, curs+1, -10000.0*v3d->grid, 10000.0*v3d->grid, 10, 0, "Y co-ordinate of the 3D cursor"); - uiDefButF(block, NUM, B_REDR, "Z:", 160, 86, 150, 22, curs+2, -10000.0*v3d->grid, 10000.0*v3d->grid, 10, 0, "Z co-ordinate of the 3D cursor"); - uiBlockEndAlign(block); - - uiDefBut(block, LABEL, 1, "Display:", 10, 50, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); - uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, V3D_SELECT_OUTLINE, B_REDR, "Outline Selected", 10, 30, 140, 19, &v3d->flag, 0, 0, 0, 0, "Highlight selected objects with an outline, in Solid, Shaded or Textured viewport shading modes"); - uiDefButBitS(block, TOG, V3D_DRAW_CENTERS, B_REDR, "All Object Centers", 10, 10, 140, 19, &v3d->flag, 0, 0, 0, 0, "Draw the center points on all objects"); - uiDefButBitS(block, TOGN, V3D_HIDE_HELPLINES, B_REDR, "Relationship Lines", 10, -10, 140, 19, &v3d->flag, 0, 0, 0, 0, "Draw dashed lines indicating Parent, Constraint, or Hook relationships"); - uiDefButBitS(block, TOG, V3D_SOLID_TEX, B_REDR, "Solid Tex", 10, -30, 140, 19, &v3d->flag2, 0, 0, 0, 0, "Display textures in Solid draw type (Shift T)"); - uiBlockEndAlign(block); - - uiDefBut(block, LABEL, 1, "View Locking:", 160, 60, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); - uiBlockBeginAlign(block); - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_REDR, "Object:", 160, 40, 150, 19, &v3d->ob_centre, "Lock view to center to this Object"); - uiDefBut(block, TEX, B_REDR, "Bone:", 160, 20, 150, 19, v3d->ob_centre_bone, 1, 31, 0, 0, "If view locked to Object, use this Bone to lock to view to"); - uiBlockEndAlign(block); - - /* last region is always 3d... a bit weak */ - arlast= sa->regionbase.last; - uiBlockBeginAlign(block); - if(arlast->alignment==RGN_ALIGN_QSPLIT) { - arlast= arlast->prev; - rv3d= arlast->regiondata; - - uiDefButO(block, BUT, "SCREEN_OT_region_foursplit", WM_OP_EXEC_REGION_WIN, "End 4-Split View", 160, -10, 150, 19, "Join the 3D View"); - uiDefButBitS(block, TOG, RV3D_LOCKED, B_RV3D_LOCKED, "Lock", 160, -30, 50, 19, &rv3d->viewlock, 0, 0, 0, 0, ""); - uiDefButBitS(block, TOG, RV3D_BOXVIEW, B_RV3D_BOXVIEW, "Box", 210, -30, 50, 19, &rv3d->viewlock, 0, 0, 0, 0, ""); - uiDefButBitS(block, TOG, RV3D_BOXCLIP, B_RV3D_BOXCLIP, "Clip", 260, -30, 50, 19, &rv3d->viewlock, 0, 0, 0, 0, ""); - } - else - uiDefButO(block, BUT, "SCREEN_OT_region_foursplit", WM_OP_EXEC_REGION_WIN, "4-Split View", 160, -10, 150, 19, "Split 3D View in 4 parts"); - - uiBlockEndAlign(block); - - -// XXX -// uiDefBut(block, LABEL, 1, "Keyframe Display:", 160, -2, 150, 19, NULL, 0.0, 0.0, 0, 0, ""); -// uiBlockBeginAlign(block); -// uiDefButBitS(block, TOG, ANIMFILTER_ACTIVE, B_REDR, "Active",160, -22, 50, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes for active element only (i.e. active bone or active material)"); -// uiDefButBitS(block, TOG, ANIMFILTER_MUTED, B_REDR, "Muted",210, -22, 50, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes in muted channels"); -// uiDefButBitS(block, TOG, ANIMFILTER_LOCAL, B_REDR, "Local",260, -22, 50, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes directly connected to datablock"); -// if ((v3d->keyflags & ANIMFILTER_LOCAL)==0) { -// uiDefButBitS(block, TOGN, ANIMFILTER_NOMAT, B_REDR, "Material",160, -42, 75, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes for any available Materials"); -// uiDefButBitS(block, TOGN, ANIMFILTER_NOSKEY, B_REDR, "ShapeKey",235, -42, 75, 19, &v3d->keyflags, 0, 0, 0, 0, "Show keyframes for any available Shape Keys"); -// } - uiBlockEndAlign(block); -} -#endif // XXX not used anymore - #if 0 static void view3d_panel_preview(bContext *C, ARegion *ar, short cntrl) // VIEW3D_HANDLER_PREVIEW { @@ -1632,13 +1420,6 @@ void view3d_buttons_register(ARegionType *art) pt->draw= view3d_panel_properties; BLI_addtail(&art->paneltypes, pt); - - pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel background"); - strcpy(pt->idname, "VIEW3D_PT_background"); - strcpy(pt->label, "Background Image"); - pt->draw= view3d_panel_background; - BLI_addtail(&art->paneltypes, pt); - pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel transform spaces"); strcpy(pt->idname, "VIEW3D_PT_transform spaces"); strcpy(pt->label, "Transform Orientations"); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index d80a26e50f8..5e6bfe89165 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2085,10 +2085,6 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar) // addafterqueue(ar->win, BACKBUFDRAW, 1); //} } - -#ifndef DISABLE_PYTHON - /* XXX here was scriptlink */ -#endif } diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 3c80b650cf3..acb3a2257dc 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -560,7 +560,7 @@ void VIEW3D_OT_viewrotate(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_BLOCKING; + ot->flag= OPTYPE_BLOCKING; } /* ************************ viewmove ******************************** */ @@ -644,7 +644,7 @@ void VIEW3D_OT_viewmove(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_BLOCKING; + ot->flag= OPTYPE_BLOCKING; } /* ************************ viewzoom ******************************** */ @@ -844,7 +844,7 @@ void VIEW3D_OT_zoom(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_BLOCKING; + ot->flag= OPTYPE_BLOCKING; RNA_def_int(ot->srna, "delta", 0, INT_MIN, INT_MAX, "Delta", "", INT_MIN, INT_MAX); } @@ -925,7 +925,7 @@ void VIEW3D_OT_view_all(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER; + ot->flag= 0; RNA_def_boolean(ot->srna, "center", 0, "Center", ""); } @@ -1064,7 +1064,7 @@ void VIEW3D_OT_view_center(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER; + ot->flag= 0; } /* ********************* Set render border operator ****************** */ @@ -1149,7 +1149,7 @@ void VIEW3D_OT_render_border(wmOperatorType *ot) } /* ********************* Border Zoom operator ****************** */ -static int view3d_border_zoom_exec(bContext *C, wmOperator *op) +static int view3d_zoom_border_exec(bContext *C, wmOperator *op) { ARegion *ar= CTX_wm_region(C); View3D *v3d = CTX_wm_view3d(C); @@ -1285,7 +1285,7 @@ static int view3d_border_zoom_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int view3d_border_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event) +static int view3d_zoom_border_invoke(bContext *C, wmOperator *op, wmEvent *event) { RegionView3D *rv3d= CTX_wm_region_view3d(C); @@ -1305,14 +1305,14 @@ void VIEW3D_OT_zoom_border(wmOperatorType *ot) ot->idname= "VIEW3D_OT_zoom_border"; /* api callbacks */ - ot->invoke= view3d_border_zoom_invoke; - ot->exec= view3d_border_zoom_exec; + ot->invoke= view3d_zoom_border_invoke; + ot->exec= view3d_zoom_border_exec; ot->modal= WM_border_select_modal; ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER; + ot->flag= 0; /* rna */ RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX); @@ -1477,7 +1477,7 @@ void VIEW3D_OT_viewnumpad(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER; + ot->flag= 0; RNA_def_enum(ot->srna, "type", prop_view_items, 0, "View", "The Type of view"); } @@ -1546,7 +1546,7 @@ void VIEW3D_OT_view_orbit(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER; + ot->flag= 0; RNA_def_enum(ot->srna, "type", prop_view_orbit_items, 0, "Orbit", "Direction of View Orbit"); } @@ -1596,7 +1596,7 @@ void VIEW3D_OT_view_pan(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER; + ot->flag= 0; RNA_def_enum(ot->srna, "type", prop_view_pan_items, 0, "Pan", "Direction of View Pan"); } @@ -1628,7 +1628,7 @@ void VIEW3D_OT_view_persportho(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER; + ot->flag= 0; } @@ -1730,7 +1730,7 @@ void VIEW3D_OT_clip_border(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER; + ot->flag= 0; /* rna */ RNA_def_int(ot->srna, "xmin", 0, INT_MIN, INT_MAX, "X Min", "", INT_MIN, INT_MAX); @@ -1783,7 +1783,7 @@ void VIEW3D_OT_drawtype(wmOperatorType *ot) ot->poll= ED_operator_view3d_active; /* flags */ - ot->flag= OPTYPE_REGISTER; + ot->flag= 0; /* rna XXX should become enum */ RNA_def_int(ot->srna, "draw_type", 0, INT_MIN, INT_MAX, "Draw Type", "", INT_MIN, INT_MAX); diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 550e5faff52..2bc9b96281e 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -206,7 +206,7 @@ static void handle_view3d_lock(bContext *C) { Scene *scene= CTX_data_scene(C); ScrArea *sa= CTX_wm_area(C); - View3D *v3d= (View3D *)CTX_wm_space_data(C); + View3D *v3d= CTX_wm_view3d(C); if (v3d != NULL && sa != NULL) { if(v3d->localview==0 && v3d->scenelock && sa->spacetype==SPACE_VIEW3D) { @@ -1070,58 +1070,14 @@ static void view3d_select_curvemenu(bContext *C, uiLayout *layout, void *arg_unu #endif } -void do_view3d_select_metaballmenu(bContext *C, void *arg, int event) +static void view3d_select_metaballmenu(bContext *C, uiLayout *layout, void *arg_unused) { -#if 0 - - switch(event) { - case 0: /* border select */ - borderselect(); - break; - case 2: /* Select/Deselect all */ - deselectall_mball(); - break; - case 3: /* Inverse */ - selectinverse_mball(); - break; - case 4: /* Select Random */ - selectrandom_mball(); - break; - } -#endif -} - - -static uiBlock *view3d_select_metaballmenu(bContext *C, ARegion *ar, void *arg_unused) -{ - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_select_metaballmenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_select_metaballmenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); - - if(ar->alignment==RGN_ALIGN_TOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); - return block; + uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border"); + uiItemS(layout); + uiItemO(layout, NULL, 0, "MBALL_OT_select_deselect_all_metaelems"); + uiItemO(layout, NULL, 0, "MBALL_OT_select_inverse_metaelems"); + uiItemS(layout); + uiItemO(layout, NULL, 0, "MBALL_OT_select_random_metaelems"); } static void view3d_select_latticemenu(bContext *C, uiLayout *layout, void *arg_unused) @@ -2094,16 +2050,16 @@ static void view3d_edit_objectmenu(bContext *C, uiLayout *layout, void *arg_unus // TODO: these operators may get renamed uiItemO(layout, NULL, 0, "ANIM_OT_insert_keyframe_menu"); - uiItemO(layout, NULL, 0, "ANIM_OT_delete_keyframe_old"); + uiItemO(layout, NULL, 0, "ANIM_OT_delete_keyframe_v3d"); uiItemS(layout); uiItemO(layout, NULL, 0, "OBJECT_OT_duplicate"); uiItemBooleanO(layout, "Duplicate Linked", 0, "OBJECT_OT_duplicate", "linked", 1); uiItemO(layout, NULL, 0, "OBJECT_OT_delete"); - + + uiItemO(layout, NULL, 0, "OBJECT_OT_proxy_make"); #if 0 - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Proxy|Ctrl Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, ""); uiDefIconTextBlockBut(block, view3d_edit_object_makelinksmenu, NULL, ICON_RIGHTARROW_THIN, "Make Links", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_object_singleusermenu, NULL, ICON_RIGHTARROW_THIN, "Make Single User", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_object_makelocalmenu, NULL, ICON_RIGHTARROW_THIN, "Make Local", 0, yco-=20, 120, 19, ""); @@ -2558,112 +2514,41 @@ static void view3d_edit_curvemenu(bContext *C, uiLayout *layout, void *arg_unuse uiItemMenuF(layout, "Show/Hide Control Points", 0, view3d_edit_curve_showhidemenu); } -static void do_view3d_edit_mball_showhidemenu(bContext *C, void *arg, int event) +static void view3d_edit_metaball_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused) { -#if 0 - switch(event) { - case 10: /* show hidden control points */ - reveal_mball(); - break; - case 11: /* hide selected control points */ - hide_mball(0); - break; - case 12: /* hide selected control points */ - hide_mball(1); - break; - } -#endif + uiItemO(layout, NULL, 0, "MBALL_OT_hide_metaelems"); + uiItemO(layout, NULL, 0, "MBALL_OT_reveal_metaelems"); + uiItemBooleanO(layout, "Hide Unselected", 0, "MBALL_OT_hide_metaelems", "unselected", 1); } -static uiBlock *view3d_edit_mball_showhidemenu(bContext *C, ARegion *ar, void *arg_unused) -{ - uiBlock *block; - short yco = 20, menuwidth = 120; - - block= uiBeginBlock(C, ar, "view3d_edit_mball_showhidemenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_edit_mball_showhidemenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Unselected|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, ""); - - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - return block; -} -static void do_view3d_edit_metaballmenu(bContext *C, void *arg, int event) +static void view3d_edit_metaballmenu(bContext *C, uiLayout *layout, void *arg_unused) { -#if 0 Scene *scene= CTX_data_scene(C); - ScrArea *sa= CTX_wm_area(C); - View3D *v3d= sa->spacedata.first; + ToolSettings *ts= CTX_data_tool_settings(C); + PointerRNA tsptr; - switch(event) { - case 1: /* undo */ - BIF_undo(); - break; - case 2: /* redo */ - BIF_redo(); - break; - case 3: /* duplicate */ - duplicate_context_selected(); - break; - case 4: /* delete */ - delete_context_selected(); - break; - case 5: /* Shear */ - initTransform(TFM_SHEAR, CTX_NONE); - Transform(); - break; - case 6: /* Warp */ - initTransform(TFM_WARP, CTX_NONE); - Transform(); - break; - case 7: /* Transform Properties */ - add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, 0); - break; - } -#endif -} + RNA_pointer_create(&scene->id, &RNA_ToolSettings, ts, &tsptr); -static uiBlock *view3d_edit_metaballmenu(bContext *C, ARegion *ar, void *arg_unused) -{ - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_edit_metaballmenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_edit_metaballmenu, NULL); + uiItemO(layout, "Undo Editing", 0, "ED_OT_undo"); + uiItemO(layout, "Redo Editing", 0, "ED_OT_redo"); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|Ctrl Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Shift Ctrl Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); -// XXX uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, ""); + uiItemS(layout); - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu); - uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, ""); - uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, ""); - uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, ""); - // XXX uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, ""); + uiItemS(layout); - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiItemO(layout, NULL, 0, "MBALL_OT_delete_metaelems"); + uiItemO(layout, NULL, 0, "MBALL_OT_duplicate_metaelems"); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBlockBut(block, view3d_edit_mball_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Hide MetaElems", 0, yco-=20, 120, 19, ""); - - if(ar->alignment==RGN_ALIGN_TOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); - return block; + uiItemS(layout); + + uiItemR(layout, NULL, 0, &tsptr, "proportional_editing", 0, 0, 0); // |O + uiItemMenuEnumR(layout, NULL, 0, &tsptr, "proportional_editing_falloff"); // |Shift O + + uiItemS(layout); + + uiItemMenuF(layout, "Show/Hide Control Points", 0, view3d_edit_metaball_showhidemenu); } static void view3d_edit_text_charsmenu(bContext *C, uiLayout *layout, void *arg_unused) @@ -2739,91 +2624,42 @@ static void view3d_edit_latticemenu(bContext *C, uiLayout *layout, void *arg_unu uiItemMenuEnumR(layout, NULL, 0, &tsptr, "proportional_editing_falloff"); // |Shift O } -void do_view3d_edit_armature_parentmenu(bContext *C, void *arg, int event) -{ -#if 0 - switch(event) { - case 1: - make_bone_parent(); - break; - case 2: - clear_bone_parent(); - break; - } -#endif -} -static uiBlock *view3d_edit_armature_parentmenu(bContext *C, ARegion *ar, void *arg_unused) +static void view3d_edit_armature_parentmenu(bContext *C, uiLayout *layout, void *arg_unused) { - uiBlock *block; - short yco = 20, menuwidth = 120; - - block= uiBeginBlock(C, ar, "view3d_edit_armature_parentmenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_edit_armature_parentmenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Parent...|Ctrl P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Parent...|Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - return block; + uiItemO(layout, NULL, 0, "ARMATURE_OT_parent_set"); + uiItemO(layout, NULL, 0, "ARMATURE_OT_parent_clear"); } -void do_view3d_edit_armature_rollmenu(bContext *C, void *arg, int event) +static void view3d_edit_armature_rollmenu(bContext *C, uiLayout *layout, void *arg_unused) { -#if 0 - if (event == 1 || event == 2) - /* set roll based on aligning z-axis */ - auto_align_armature(event); - else if (event == 3) { - /* interactively set bone roll */ - initTransform(TFM_BONE_ROLL, CTX_NONE); - Transform(); - } -#endif + /* 0 = 'Global', 1 = 'Cursor' */ + // TODO: keep these in sync... + uiItemEnumO(layout, "Clear Roll (Z-Axis Up)", 0, "ARMATURE_OT_calculate_roll", "type", 0); + uiItemEnumO(layout, "Roll to Cursor", 0, "ARMATURE_OT_calculate_roll", "type", 1); + + uiItemS(layout); + + uiItemEnumO(layout, "Set Roll", 0, "TFM_OT_transform", "mode", TFM_BONE_ROLL); } -static uiBlock *view3d_edit_armature_rollmenu(bContext *C, ARegion *ar, void *arg_unused) +static void view3d_edit_armature_settingsmenu(bContext *C, uiLayout *layout, void *arg_unused) { - uiBlock *block; - short yco = 20, menuwidth = 120; - - block= uiBeginBlock(C, ar, "view3d_edit_armature_rollmenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_edit_armature_rollmenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Roll (Z-Axis Up)|Ctrl N, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Roll to Cursor|Ctrl N, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Roll|Ctrl R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); - - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - return block; + uiItemEnumO(layout, "Toggle a Setting", 0, "ARMATURE_OT_flags_set", "mode", 2); + uiItemEnumO(layout, "Enable a Setting", 0, "ARMATURE_OT_flags_set", "mode", 1); + uiItemEnumO(layout, "Disable a Setting", 0, "ARMATURE_OT_flags_set", "mode", 0); } +#if 0 static void do_view3d_edit_armaturemenu(bContext *C, void *arg, int event) { -#if 0 static short numcuts= 2; switch(event) { case 0: /* Undo Editing */ remake_editArmature(); break; - case 1: /* transformation properties */ -// XXX mainqenter(NKEY, 1); - break; - case 3: /* extrude */ - extrude_armature(0); - break; - case 4: /* duplicate */ - duplicate_context_selected(); - break; - case 5: /* delete */ - delete_context_selected(); - break; + case 6: /* Shear */ initTransform(TFM_SHEAR, CTX_NONE); Transform(); @@ -2831,178 +2667,67 @@ static void do_view3d_edit_armaturemenu(bContext *C, void *arg, int event) case 7: /* Warp */ initTransform(TFM_WARP, CTX_NONE); Transform(); - case 10: /* forked! */ - extrude_armature(1); - break; - case 12: /* subdivide */ - subdivide_armature(1); - break; - case 13: /* flip left and right names */ - armature_flip_names(); - break; - case 15: /* subdivide multi */ - if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return; - waitcursor(1); - subdivide_armature(numcuts); - break; - case 16: /* Alt-S transform (BoneSize) */ - initTransform(TFM_BONESIZE, CTX_NONE); - Transform(); - break; - case 17: /* move to layer */ - pose_movetolayer(); - break; - case 18: /* merge bones */ - merge_armature(); - break; - case 19: /* auto-extensions */ - case 20: - case 21: - armature_autoside_names(event-19); - break; - case 22: /* separate */ - separate_armature(); - break; case 23: /* bone sketching panel */ add_blockhandler(curarea, VIEW3D_HANDLER_BONESKETCH, UI_PNL_UNSTOW); break; } - -#endif } - - -#ifndef DISABLE_PYTHON -static void do_view3d_scripts_armaturemenu(bContext *C, void *arg, int event) -{ -#if 0 - BPY_menu_do_python(PYMENU_ARMATURE, event); - #endif -} - -static uiBlock *view3d_scripts_armaturemenu(bContext *C, ARegion *ar, void *arg_unused) -{ - uiBlock *block; -// XXX BPyMenu *pym; -// int i= 0; -// short yco = 20, menuwidth = 120; - - block= uiBeginBlock(C, ar, "view3d_scripts_armaturemenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_scripts_armaturemenu, NULL); - - /* note that we acount for the N previous entries with i+20: */ -// for (pym = BPyMenuTable[PYMENU_ARMATURE]; pym; pym = pym->next, i++) { -// -// uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, -// NULL, 0.0, 0.0, 1, i, -// pym->tooltip?pym->tooltip:pym->filename); -// } - - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - - return block; -} -#endif /* DISABLE_PYTHON */ -static void do_view3d_armature_settingsmenu(bContext *C, void *arg, int event) -{ -// XXX setflag_armature(event); -} - -static uiBlock *view3d_armature_settingsmenu(bContext *C, ARegion *ar, void *arg_unused) -{ - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_armature_settingsmenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_armature_settingsmenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Toggle a Setting|Shift W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Enable a Setting|Ctrl Shift W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disable a Setting|Alt W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, ""); - - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - - return block; -} - -static uiBlock *view3d_edit_armaturemenu(bContext *C, ARegion *ar, void *arg_unused) +static void view3d_edit_armaturemenu(bContext *C, uiLayout *layout, void *arg_unused) { Object *obedit = CTX_data_edit_object(C); bArmature *arm= obedit->data; - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_edit_armaturemenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_edit_armaturemenu, NULL); +#if 0 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Bone Sketching|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, ""); uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, ""); - // XXX uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, ""); - uiDefIconTextBlockBut(block, view3d_edit_armature_rollmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Roll", 0, yco-=20, 120, 19, ""); +#endif + uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu); + uiItemMenuF(layout, "Bone Roll", 0, view3d_edit_armature_rollmenu); + + if (arm->drawtype == ARM_ENVELOPE) + uiItemEnumO(layout, "Scale Envelope Distance", 0, "TFM_OT_transform", "mode", TFM_BONESIZE); + else + uiItemEnumO(layout, "Scale B-Bone Width", 0, "TFM_OT_transform", "mode", TFM_BONESIZE); - if (arm->drawtype==ARM_ENVELOPE) - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale Envelope Distance|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, ""); - else if (arm->drawtype==ARM_B_BONE) - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale B-Bone Width|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, ""); + uiItemS(layout); - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); + uiItemO(layout, "Extrude", 0, "ARMATURE_OT_extrude"); if (arm->flag & ARM_MIRROR_EDIT) - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude Forked|Shift E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge|Alt M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill Between Joints|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); + uiItemBooleanO(layout, "Extrude Forked", 0, "ARMATURE_OT_extrude", "forked", 1); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|Ctrl Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, ""); + uiItemO(layout, NULL, 0, "ARMATURE_OT_duplicate"); + uiItemO(layout, NULL, 0, "ARMATURE_OT_merge"); + uiItemO(layout, NULL, 0, "ARMATURE_OT_fill"); + uiItemO(layout, NULL, 0, "ARMATURE_OT_delete"); + uiItemO(layout, NULL, 0, "ARMATURE_OT_separate"); - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiItemS(layout); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Multi|W, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Left & Right Names|W, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Left-Right|W, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Front-Back|W, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Top-Bottom|W, 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, ""); + uiItemO(layout, NULL, 0, "ARMATURE_OT_subdivide_simple"); + uiItemO(layout, NULL, 0, "ARMATURE_OT_subdivide_multi"); - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiItemEnumO(layout, "AutoName Left/Right", 0, "ARMATURE_OT_autoside_names", "axis", 0); + uiItemEnumO(layout, "AutoName Front/Back", 0, "ARMATURE_OT_autoside_names", "axis", 1); + uiItemEnumO(layout, "AutoName Top/Bottom", 0, "ARMATURE_OT_autoside_names", "axis", 2); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Switch Armature Layers|Shift M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Bone To Layer|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiItemO(layout, "Flip Left/Right Names", 0, "ARMATURE_OT_flip_names"); - uiDefIconTextBlockBut(block, view3d_edit_armature_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, ""); - uiDefIconTextBlockBut(block, view3d_armature_settingsmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Settings", 0, yco-=20, 120, 19, ""); + uiItemS(layout); -#ifndef DISABLE_PYTHON - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiItemO(layout, NULL, 0, "ARMATURE_OT_armature_layers"); + uiItemO(layout, NULL, 0, "ARMATURE_OT_bone_layers"); - uiDefIconTextBlockBut(block, view3d_scripts_armaturemenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, ""); -#endif - if(ar->alignment==RGN_ALIGN_TOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); + uiItemS(layout); - return block; + uiItemMenuF(layout, "Parent", 0, view3d_edit_armature_parentmenu); + + uiItemS(layout); + + uiItemMenuF(layout, "Bone Settings ", 0, view3d_edit_armature_settingsmenu); } @@ -3052,38 +2777,12 @@ static void view3d_pose_armature_groupmenu(bContext *C, uiLayout *layout, void * uiItemO(layout, "Remove Active Group", 0, "POSE_OT_group_remove"); } -#if 0 -static void do_view3d_pose_armature_motionpathsmenu(bContext *C, void *arg, int event) +static void view3d_pose_armature_motionpathsmenu(bContext *C, uiLayout *layout, void *arg_unused) { - switch(event) { - - case 1: - pose_calculate_path(OBACT); - break; - case 2: - pose_clear_paths(OBACT); - break; - } + uiItemO(layout, NULL, 0, "POSE_OT_paths_calculate"); + uiItemO(layout, NULL, 0, "POSE_OT_paths_clear"); } - -static uiBlock *view3d_pose_armature_motionpathsmenu(bContext *C, ARegion *ar, void *arg_unused) -{ - uiBlock *block; - short yco = 20, menuwidth = 120; - - block= uiBeginBlock(C, ar, "view3d_pose_armature_motionpathsmenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_pose_armature_motionpathsmenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Calculate Paths|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear All Paths|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - - uiBlockSetDirection(block, UI_RIGHT); - uiTextBoundsBlock(block, 60); - return block; -} -#endif - static void view3d_pose_armature_poselibmenu(bContext *C, uiLayout *layout, void *arg_unused) { uiItemO(layout, NULL, 0, "POSELIB_OT_browse_interactive"); @@ -3095,6 +2794,13 @@ static void view3d_pose_armature_poselibmenu(bContext *C, uiLayout *layout, void uiItemO(layout, NULL, 0, "POSELIB_OT_pose_remove"); } +static void view3d_pose_armature_settingsmenu(bContext *C, uiLayout *layout, void *arg_unused) +{ + uiItemEnumO(layout, "Toggle a Setting", 0, "POSE_OT_flags_set", "mode", 2); + uiItemEnumO(layout, "Enable a Setting", 0, "POSE_OT_flags_set", "mode", 1); + uiItemEnumO(layout, "Disable a Setting", 0, "POSE_OT_flags_set", "mode", 0); +} + #if 0 static void do_view3d_pose_armaturemenu(bContext *C, void *arg, int event) { @@ -3102,81 +2808,42 @@ static void do_view3d_pose_armaturemenu(bContext *C, void *arg, int event) ob=OBACT; switch(event) { - case 0: /* transform properties */ -// XXX mainqenter(NKEY, 1); - break; - case 1: /* copy current pose */ - copy_posebuf(); - break; - case 2: /* paste pose */ - paste_posebuf(0); - break; - case 3: /* paste flipped pose */ - paste_posebuf(1); - break; - case 4: /* insert keyframe */ - common_insertkey(); - break; case 5: pose_copy_menu(); break; - case 9: - pose_flip_names(); - break; - case 13: - if(ob && (ob->flag & OB_POSEMODE)) { - bArmature *arm= ob->data; - if( (arm->drawtype == ARM_B_BONE) || (arm->drawtype == ARM_ENVELOPE)) { - initTransform(TFM_BONESIZE, CTX_NONE); - Transform(); - break; - } - } - break; - case 14: /* move bone to layer / change armature layer */ - pose_movetolayer(); - break; case 15: pose_relax(); break; - case 16: /* auto-extensions for bones */ - case 17: - case 18: - pose_autoside_names(event-16); - break; - case 19: /* assign pose as restpose */ - apply_armature_pose2bones(); - break; - case 20: /* delete keyframe */ - common_deletekey(); - break; } } #endif static void view3d_pose_armaturemenu(bContext *C, uiLayout *layout, void *arg_unused) -{ +{ + Object *ob = CTX_data_active_object(C); + bArmature *arm= ob->data; + #if 0 // XXX to be ported, using uiItemMenuF(layout, "<Name>", 0, view3d_pose_armature_<category>menu); uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, ""); - // ... clear transfrom sub-menu was here.... - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale Envelope Distance|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, ""); #endif + if ( (arm) && ((arm->drawtype == ARM_B_BONE) || (arm->drawtype == ARM_ENVELOPE)) ) + uiItemEnumO(layout, "Scale Envelope Distance", 0, "TFM_OT_transform", "mode", TFM_BONESIZE); uiItemMenuF(layout, "Clear Transform", 0, view3d_pose_armature_transformmenu); uiItemS(layout); // TODO: these operators may get renamed uiItemO(layout, NULL, 0, "ANIM_OT_insert_keyframe_menu"); - uiItemO(layout, NULL, 0, "ANIM_OT_delete_keyframe_old"); + uiItemO(layout, NULL, 0, "ANIM_OT_delete_keyframe_v3d"); uiItemS(layout); #if 0 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Relax Pose|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Pose as Restpose|Ctrl A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); #endif + uiItemO(layout, NULL, 0, "POSE_OT_apply"); + + uiItemS(layout); uiItemO(layout, "Copy Current Pose", 0, "POSE_OT_copy"); uiItemO(layout, "Paste Pose", 0, "POSE_OT_paste"); @@ -3185,7 +2852,7 @@ static void view3d_pose_armaturemenu(bContext *C, uiLayout *layout, void *arg_un uiItemS(layout); uiItemMenuF(layout, "Pose Library", 0, view3d_pose_armature_poselibmenu); - //uiItemMenuF(layout, "Motion Paths", 0, view3d_pose_armature_motionpathsmenu); + uiItemMenuF(layout, "Motion Paths", 0, view3d_pose_armature_motionpathsmenu); uiItemMenuF(layout, "Bone Groups", 0, view3d_pose_armature_groupmenu); uiItemS(layout); @@ -3195,26 +2862,24 @@ static void view3d_pose_armaturemenu(bContext *C, uiLayout *layout, void *arg_un uiItemS(layout); - uiItemMenuF(layout, "Show/Hide Bones", 0, view3d_pose_armature_showhidemenu); + uiItemEnumO(layout, "AutoName Left/Right", 0, "POSE_OT_autoside_names", "axis", 0); + uiItemEnumO(layout, "AutoName Front/Back", 0, "POSE_OT_autoside_names", "axis", 1); + uiItemEnumO(layout, "AutoName Top/Bottom", 0, "POSE_OT_autoside_names", "axis", 2); -#if 0 - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Left-Right|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Front-Back|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "AutoName Top-Bottom|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, ""); + uiItemO(layout, "Flip Left/Right Names", 0, "POSE_OT_flip_names"); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip L/R Names|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Attributes...|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiItemS(layout); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Switch Armature Layers|Shift M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Bone To Layer|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, ""); + uiItemO(layout, NULL, 0, "POSE_OT_armature_layers"); + uiItemO(layout, NULL, 0, "POSE_OT_bone_layers"); - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiItemS(layout); - // ... show/hide bones was here - uiDefIconTextBlockBut(block, view3d_armature_settingsmenu, - NULL, ICON_RIGHTARROW_THIN, "Bone Settings", 0, yco-=20, 120, 19, ""); + uiItemMenuF(layout, "Show/Hide Bones", 0, view3d_pose_armature_showhidemenu); + uiItemMenuF(layout, "Bone Settings", 0, view3d_pose_armature_settingsmenu); + +#if 0 + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Attributes...|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); #endif } @@ -4112,7 +3777,7 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o } else if (ob && ob->type == OB_FONT) { xmax= 0; } else if (ob && ob->type == OB_MBALL) { - uiDefPulldownBut(block, view3d_select_metaballmenu, NULL, "Select", xco,yco, xmax-3, 20, ""); + uiDefMenuBut(block, view3d_select_metaballmenu, NULL, "Select", xco,yco, xmax-3, 20, ""); } else if (ob && ob->type == OB_LATTICE) { uiDefMenuBut(block, view3d_select_latticemenu, NULL, "Select", xco, yco, xmax-3, 20, ""); } else if (ob && ob->type == OB_ARMATURE) { @@ -4154,7 +3819,7 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o xco+= xmax; } else if (ob && ob->type == OB_MBALL) { xmax= GetButStringLength("Metaball"); - uiDefPulldownBut(block, view3d_edit_metaballmenu, NULL, "Metaball", xco,yco, xmax-3, 20, ""); + uiDefMenuBut(block, view3d_edit_metaballmenu, NULL, "Metaball", xco,yco, xmax-3, 20, ""); xco+= xmax; } else if (ob && ob->type == OB_LATTICE) { xmax= GetButStringLength("Lattice"); @@ -4162,7 +3827,7 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o xco+= xmax; } else if (ob && ob->type == OB_ARMATURE) { xmax= GetButStringLength("Armature"); - uiDefPulldownBut(block, view3d_edit_armaturemenu, NULL, "Armature", xco,yco, xmax-3, 20, ""); + uiDefMenuBut(block, view3d_edit_armaturemenu, NULL, "Armature", xco,yco, xmax-3, 20, ""); xco+= xmax; } diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 2eb1a505a19..d0c0a63eb1a 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -83,6 +83,7 @@ #include "ED_types.h" #include "ED_util.h" #include "ED_retopo.h" +#include "ED_mball.h" #include "UI_interface.h" #include "UI_resources.h" @@ -127,7 +128,7 @@ void view3d_get_transformation(ViewContext *vc, Object *ob, bglMats *mats) float cpy[4][4]; int i, j; - Mat4MulMat4(cpy, vc->rv3d->viewmat, ob->obmat); + Mat4MulMat4(cpy, ob->obmat, vc->rv3d->viewmat); for(i = 0; i < 4; ++i) { for(j = 0; j < 4; ++j) { @@ -1377,9 +1378,10 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) do_nurbs_box_select(&vc, &rect, val==LEFTMOUSE); } else if(obedit->type==OB_MBALL) { + MetaBall *mb = (MetaBall*)obedit->data; hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect); - ml= NULL; // XXX editelems.first; + ml= mb->editelems->first; while(ml) { for(a=0; a<hits; a++) { @@ -1589,6 +1591,8 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event) mouse_lattice(C, event->mval, extend); else if(ELEM(obedit->type, OB_CURVE, OB_SURF)) mouse_nurb(C, event->mval, extend); + else if(obedit->type==OB_MBALL) + mouse_mball(C, event->mval, extend); } else if(G.f & G_PARTICLEEDIT) diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c index 89a6d659d67..67d8bc3e5ee 100644 --- a/source/blender/editors/space_view3d/view3d_toolbar.c +++ b/source/blender/editors/space_view3d/view3d_toolbar.c @@ -109,7 +109,7 @@ static void redo_cb(bContext *C, void *arg_op, void *arg2) int retval; printf("operator redo %s\n", lastop->type->name); - ED_undo_pop(C); + ED_undo_pop_op(C, lastop); retval= WM_operator_repeat(C, lastop); if((retval & OPERATOR_FINISHED)==0) { printf("operator redo failed %s\n", lastop->type->name); @@ -118,11 +118,25 @@ static void redo_cb(bContext *C, void *arg_op, void *arg2) } } +static void view3d_panel_operator_redo_buts(const bContext *C, Panel *pa, wmOperator *op) +{ + wmWindowManager *wm= CTX_wm_manager(C); + PointerRNA ptr; + + if(!op->properties) { + IDPropertyTemplate val = {0}; + op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties"); + } + + RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr); + uiDefAutoButsRNA(C, pa->layout, &ptr, 1); + +} + static void view3d_panel_operator_redo(const bContext *C, Panel *pa) { wmWindowManager *wm= CTX_wm_manager(C); wmOperator *op; - PointerRNA ptr; uiBlock *block; block= uiLayoutGetBlock(pa->layout); @@ -139,13 +153,13 @@ static void view3d_panel_operator_redo(const bContext *C, Panel *pa) uiBlockSetFunc(block, redo_cb, op, NULL); - if(!op->properties) { - IDPropertyTemplate val = {0}; - op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties"); + if(op->macro.first) { + for(op= op->macro.first; op; op= op->next) + view3d_panel_operator_redo_buts(C, pa, op); + } + else { + view3d_panel_operator_redo_buts(C, pa, op); } - - RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr); - uiDefAutoButsRNA(C, pa->layout, &ptr, 1); } /* ******************* */ @@ -175,12 +189,12 @@ char *view3d_context_string(const bContext *C) else { Object *ob = CTX_data_active_object(C); - if(ob && (ob->flag & OB_POSEMODE)) return "posemode"; - else if (G.f & G_SCULPTMODE) return "sculptmode"; - else if (G.f & G_WEIGHTPAINT) return "weightpaint"; - else if (G.f & G_VERTEXPAINT) return "vertexpaint"; - else if (G.f & G_TEXTUREPAINT) return "texturepaint"; - else if(G.f & G_PARTICLEEDIT) return "particlemode"; + if(ob && (ob->flag & OB_POSEMODE)) return "pose_mode"; + else if (G.f & G_SCULPTMODE) return "sculpt_mode"; + else if (G.f & G_WEIGHTPAINT) return "weight_paint"; + else if (G.f & G_VERTEXPAINT) return "vertex_paint"; + else if (G.f & G_TEXTUREPAINT) return "texture_paint"; + else if(G.f & G_PARTICLEEDIT) return "particle_mode"; } return "objectmode"; diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index cb20b3dc93e..20e0a79f0c7 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -1425,7 +1425,7 @@ static void RestoreState(bContext *C) } /* maybe we need this defined somewhere else */ -extern void StartKetsjiShell(struct bContext *C,int always_use_expand_framing); +extern void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int always_use_expand_framing); #endif // GAMEBLENDER == 1 @@ -1433,13 +1433,40 @@ static int game_engine_exec(bContext *C, wmOperator *unused) { #if GAMEBLENDER == 1 Scene *startscene = CTX_data_scene(C); + bScreen *sc= CTX_wm_screen(C); + ScrArea *sa, *prevsa= CTX_wm_area(C); + ARegion *ar, *prevar= CTX_wm_region(C); + + sa= prevsa; + if(sa->spacetype != SPACE_VIEW3D) { + for(sa=sc->areabase.first; sa; sa= sa->next) + if(sa->spacetype==SPACE_VIEW3D) + break; + } + + if(!sa) + return OPERATOR_CANCELLED; + + for(ar=sa->regionbase.first; ar; ar=ar->next) + if(ar->regiontype == RGN_TYPE_WINDOW) + break; + + if(!ar) + return OPERATOR_CANCELLED; + // bad context switch .. + CTX_wm_area_set(C, sa); + CTX_wm_region_set(C, ar); + view3d_operator_needs_opengl(C); SaveState(C); - StartKetsjiShell(C, 1); + StartKetsjiShell(C, ar, 1); RestoreState(C); + CTX_wm_region_set(C, prevar); + CTX_wm_area_set(C, prevsa); + //XXX restore_all_scene_cfra(scene_cfra_store); set_scene_bg(startscene); //XXX scene_update_for_newframe(G.scene, G.scene->lay); @@ -1461,7 +1488,7 @@ void VIEW3D_OT_game_start(wmOperatorType *ot) /* api callbacks */ ot->exec= game_engine_exec; - ot->poll= ED_operator_view3d_active; + //ot->poll= ED_operator_view3d_active; } /* ************************************** */ diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 35915c96f3c..510193fdade 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -93,6 +93,7 @@ //#include "BSE_view.h" #include "ED_image.h" +#include "ED_keyframing.h" #include "ED_screen.h" #include "ED_space_api.h" #include "ED_markers.h" @@ -298,6 +299,10 @@ static void viewRedrawForce(bContext *C, TransInfo *t) { /* Do we need more refined tags? */ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL); + + /* for realtime animation record - send notifiers recognised by animation editors */ + if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) + WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, NULL); } else if (t->spacetype == SPACE_ACTION) { //SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first; @@ -1947,7 +1952,7 @@ int handleEventWarp(TransInfo *t, wmEvent *event) { int status = 0; - if (event->type == MIDDLEMOUSE && event->val) + if (event->type == MIDDLEMOUSE && event->val==KM_PRESS) { // Use customData pointer to signal warp direction if (t->customData == 0) @@ -2081,7 +2086,7 @@ int handleEventShear(TransInfo *t, wmEvent *event) { int status = 0; - if (event->type == MIDDLEMOUSE && event->val) + if (event->type == MIDDLEMOUSE && event->val==KM_PRESS) { // Use customData pointer to signal Shear direction if (t->customData == 0) @@ -3514,7 +3519,7 @@ void initBevel(TransInfo *t) int handleEventBevel(TransInfo *t, wmEvent *event) { - if (event->val) { + if (event->val==KM_PRESS) { if(!G.editBMesh) return 0; switch (event->type) { diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 623c6bb24c3..783d98e4c6f 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -1219,8 +1219,7 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t) static void createTransMBallVerts(bContext *C, TransInfo *t) { - // TRANSFORM_FIX_ME -#if 0 + MetaBall *mb = (MetaBall*)t->obedit->data; MetaElem *ml; TransData *td; TransDataExtension *tx; @@ -1229,7 +1228,7 @@ static void createTransMBallVerts(bContext *C, TransInfo *t) int propmode = t->flag & T_PROP_EDIT; /* count totals */ - for(ml= editelems.first; ml; ml= ml->next) { + for(ml= mb->editelems->first; ml; ml= ml->next) { if(ml->flag & SELECT) countsel++; if(propmode) count++; } @@ -1246,7 +1245,7 @@ static void createTransMBallVerts(bContext *C, TransInfo *t) Mat3CpyMat4(mtx, t->obedit->obmat); Mat3Inv(smtx, mtx); - for(ml= editelems.first; ml; ml= ml->next) { + for(ml= mb->editelems->first; ml; ml= ml->next) { if(propmode || (ml->flag & SELECT)) { td->loc= &ml->x; VECCOPY(td->iloc, td->loc); @@ -1287,7 +1286,6 @@ static void createTransMBallVerts(bContext *C, TransInfo *t) tx++; } } -#endif } /* ********************* curve/surface ********* */ @@ -2451,7 +2449,7 @@ static void UVsToTransData(SpaceImage *sima, TransData *td, TransData2D *td2d, f static void createTransUVs(bContext *C, TransInfo *t) { - SpaceImage *sima = (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima = CTX_wm_space_image(C); Image *ima = CTX_data_edit_image(C); Scene *scene = CTX_data_scene(C); TransData *td = NULL; @@ -4680,34 +4678,34 @@ void special_aftertrans_update(TransInfo *t) SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first; Scene *scene; bAnimContext ac; - + /* initialise relevant anim-context 'context' data from TransInfo data */ /* NOTE: sync this with the code in ANIM_animdata_get_context() */ memset(&ac, 0, sizeof(bAnimContext)); - + scene= ac.scene= t->scene; ob= ac.obact= OBACT; ac.sa= t->sa; ac.ar= t->ar; ac.spacetype= (t->sa)? t->sa->spacetype : 0; ac.regiontype= (t->ar)? t->ar->regiontype : 0; - + if (ANIM_animdata_context_getdata(&ac) == 0) return; - + if (ac.datatype == ANIMCONT_DOPESHEET) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); - + /* get channels to work on */ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* these should all be ipo-blocks */ for (ale= anim_data.first; ale; ale= ale->next) { AnimData *adt= ANIM_nla_mapping_get(&ac, ale); FCurve *fcu= (FCurve *)ale->key_data; - + if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 && ((cancelled == 0) || (duplicate)) ) { @@ -4720,7 +4718,7 @@ void special_aftertrans_update(TransInfo *t) posttrans_fcurve_clean(fcu); } } - + /* free temp memory */ BLI_freelistN(&anim_data); } @@ -4729,13 +4727,13 @@ void special_aftertrans_update(TransInfo *t) // fixme... some of this stuff is not good if (ob) { ob->ctime= -1234567.0f; - + if (ob->pose || ob_get_key(ob)) DAG_object_flush_update(scene, ob, OB_RECALC); else DAG_object_flush_update(scene, ob, OB_RECALC_OB); } - + /* Do curve cleanups? */ if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 && ((cancelled == 0) || (duplicate)) ) @@ -4747,7 +4745,7 @@ void special_aftertrans_update(TransInfo *t) #if 0 // XXX old animation system /* fix up the Ipocurves and redraw stuff */ Key *key= (Key *)ac.data; - + if (key->ipo) { if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 && ((cancelled == 0) || (duplicate)) ) @@ -4756,7 +4754,7 @@ void special_aftertrans_update(TransInfo *t) } } #endif // XXX old animation system - + DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA); } #if 0 // XXX future of this is still not clear @@ -4766,23 +4764,23 @@ void special_aftertrans_update(TransInfo *t) { bScreen *sc= (bScreen *)ac.data; ScrArea *sa; - + /* BAD... we need to loop over all screen areas for current screen... * - sync this with actdata_filter_gpencil() in editaction.c */ for (sa= sc->areabase.first; sa; sa= sa->next) { bGPdata *gpd= gpencil_data_getactive(sa); - + if (gpd) posttrans_gpd_clean(gpd); } } } #endif // XXX future of this is still not clear - + /* make sure all F-Curves are set correctly */ ANIM_editkeyframes_refresh(&ac); - + /* clear flag that was set for time-slide drawing */ saction->flag &= ~SACTION_MOVING; } @@ -4790,35 +4788,34 @@ void special_aftertrans_update(TransInfo *t) SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first; Scene *scene; bAnimContext ac; - + /* initialise relevant anim-context 'context' data from TransInfo data */ /* NOTE: sync this with the code in ANIM_animdata_get_context() */ memset(&ac, 0, sizeof(bAnimContext)); - + scene= ac.scene= t->scene; ob= ac.obact= OBACT; ac.sa= t->sa; ac.ar= t->ar; ac.spacetype= (t->sa)? t->sa->spacetype : 0; ac.regiontype= (t->ar)? t->ar->regiontype : 0; - + if (ANIM_animdata_context_getdata(&ac) == 0) return; - + if (ac.datatype) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_CURVEVISIBLE); - + /* get channels to work on */ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - - /* these should all be ipo-blocks */ + for (ale= anim_data.first; ale; ale= ale->next) { AnimData *adt= ANIM_nla_mapping_get(&ac, ale); FCurve *fcu= (FCurve *)ale->key_data; - + if ( (sipo->flag & SIPO_NOTRANSKEYCULL)==0 && ((cancelled == 0) || (duplicate)) ) { @@ -4831,58 +4828,57 @@ void special_aftertrans_update(TransInfo *t) posttrans_fcurve_clean(fcu); } } - + /* free temp memory */ BLI_freelistN(&anim_data); } - + /* make sure all F-Curves are set correctly */ ANIM_editkeyframes_refresh(&ac); } else if (t->spacetype == SPACE_NLA) { Scene *scene; bAnimContext ac; - + /* initialise relevant anim-context 'context' data from TransInfo data */ /* NOTE: sync this with the code in ANIM_animdata_get_context() */ memset(&ac, 0, sizeof(bAnimContext)); - + scene= ac.scene= t->scene; ob= ac.obact= OBACT; ac.sa= t->sa; ac.ar= t->ar; ac.spacetype= (t->sa)? t->sa->spacetype : 0; ac.regiontype= (t->ar)? t->ar->regiontype : 0; - + if (ANIM_animdata_context_getdata(&ac) == 0) return; - + if (ac.datatype) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NLATRACKS); - + /* get channels to work on */ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + for (ale= anim_data.first; ale; ale= ale->next) { NlaTrack *nlt= (NlaTrack *)ale->data; - + /* make sure strips are in order again */ BKE_nlatrack_sort_strips(nlt); - + /* remove the temp metas */ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1); } - + /* free temp memory */ BLI_freelistN(&anim_data); + + /* perform after-transfrom validation */ + ED_nla_postop_refresh(&ac); } - - // XXX check on the calls below... we need some of these sanity checks - //synchronize_action_strips(); - //ANIM_editkeyframes_refresh(&ac); } else if (t->obedit) { // TRANSFORM_FIX_ME diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 14128c42981..fe3e7b08685 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -93,6 +93,7 @@ #include "ED_markers.h" #include "ED_mesh.h" #include "ED_retopo.h" +#include "ED_screen_types.h" #include "ED_space_api.h" #include "ED_uvedit.h" #include "ED_view3d.h" @@ -272,21 +273,71 @@ static void editbmesh_apply_to_mirror(TransInfo *t) */ static void animedit_refresh_id_tags (ID *id) { - AnimData *adt= BKE_animdata_from_id(id); - - /* tag AnimData for refresh so that other views will update in realtime with these changes */ - if (adt) - adt->recalc |= ADT_RECALC_ANIM; + if (id) { + AnimData *adt= BKE_animdata_from_id(id); - /* if ID-block is Object, set recalc flags */ - // TODO: this should probably go through the depsgraph instead... but for now, let's be lazy - switch (GS(id->name)) { - case ID_OB: - { - Object *ob= (Object *)id; - ob->recalc |= OB_RECALC; + /* tag AnimData for refresh so that other views will update in realtime with these changes */ + if (adt) + adt->recalc |= ADT_RECALC_ANIM; + + /* if ID-block is Object, set recalc flags */ + // TODO: this should probably go through the depsgraph instead... but for now, let's be lazy + switch (GS(id->name)) { + case ID_OB: + { + Object *ob= (Object *)id; + ob->recalc |= OB_RECALC; + } + break; + } + } +} + +/* for the realtime animation recording feature, handle overlapping data */ +static void animrecord_check_state (Scene *scene, ID *id, wmTimer *animtimer) +{ + ScreenAnimData *sad= (animtimer) ? animtimer->customdata : NULL; + + /* sanity checks */ + if ELEM3(NULL, scene, id, sad) + return; + + /* check if we need a new strip if: + * - if animtimer is running + * - we're not only keying for available channels + * - the option to add new actions for each round is not enabled + */ + if (IS_AUTOKEY_FLAG(INSERTAVAIL)==0 && (scene->toolsettings->autokey_flag & ANIMRECORD_FLAG_WITHNLA)) { + /* if playback has just looped around, we need to add a new NLA track+strip to allow a clean pass to occur */ + if ((sad) && (sad->flag & ANIMPLAY_FLAG_JUMPED)) { + AnimData *adt= BKE_animdata_from_id(id); + + /* perform push-down manually with some differences + * NOTE: BKE_nla_action_pushdown() sync warning... + */ + if ((adt->action) && !(adt->flag & ADT_NLA_EDIT_ON)) { + float astart, aend; + + /* only push down if action is more than 1-2 frames long */ + calc_action_range(adt->action, &astart, &aend, 1); + if (aend > astart+2.0f) { + NlaStrip *strip= add_nlastrip_to_stack(adt, adt->action); + + /* clear reference to action now that we've pushed it onto the stack */ + adt->action->id.us--; + adt->action= NULL; + + /* adjust blending + extend so that they will behave correctly */ + strip->extendmode= NLASTRIP_EXTEND_NOTHING; + strip->flag &= ~(NLASTRIP_FLAG_AUTO_BLENDS|NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_ACTIVE); + + /* also, adjust the AnimData's action extend mode to be on + * 'nothing' so that previous result still play + */ + adt->act_extendmode= NLASTRIP_EXTEND_NOTHING; + } + } } - break; } } @@ -308,7 +359,7 @@ void recalcData(TransInfo *t) flushTransSeq(t); } else if (t->spacetype == SPACE_ACTION) { - Scene *scene; + Scene *scene= t->scene; bAnimContext ac; ListBase anim_data = {NULL, NULL}; @@ -319,7 +370,7 @@ void recalcData(TransInfo *t) /* NOTE: sync this with the code in ANIM_animdata_get_context() */ memset(&ac, 0, sizeof(bAnimContext)); - scene= ac.scene= t->scene; + ac.scene= t->scene; ac.obact= OBACT; ac.sa= t->sa; ac.ar= t->ar; @@ -716,9 +767,10 @@ void recalcData(TransInfo *t) * (i.e. uneditable animation values) */ // TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes? - // TODO: maybe the ob->adt check isn't really needed? makes it too difficult to use... - if (/*(ob->adt) && */(t->animtimer) && IS_AUTOKEY_ON(t->scene)) { + if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) { short targetless_ik= (t->flag & T_AUTOIK); // XXX this currently doesn't work, since flags aren't set yet! + + animrecord_check_state(t->scene, &ob->id, t->animtimer); autokeyframe_pose_cb_func(t->scene, (View3D *)t->view, ob, t->mode, targetless_ik); } @@ -746,8 +798,8 @@ void recalcData(TransInfo *t) * (i.e. uneditable animation values) */ // TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes? - // TODO: maybe the ob->adt check isn't really needed? makes it too difficult to use... - if (/*(ob->adt) && */(t->animtimer) && IS_AUTOKEY_ON(t->scene)) { + if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) { + animrecord_check_state(t->scene, &ob->id, t->animtimer); autokeyframe_ob_cb_func(t->scene, (View3D *)t->view, ob, t->mode); } } diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index ae8aacb3477..6bd0a8c8d42 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -317,7 +317,7 @@ int handleMouseInput(TransInfo *t, MouseInput *mi, wmEvent *event) { case LEFTSHIFTKEY: case RIGHTSHIFTKEY: - if (event->val) + if (event->val==KM_PRESS) { t->modifiers |= MOD_PRECISION; /* shift is modifier for higher precision transform diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index 4a27a7864b7..b999053bc1f 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -304,11 +304,10 @@ int calc_manipulator_stats(const bContext *C) } } else if(obedit->type==OB_MBALL) { - /* editmball.c */ - ListBase editelems= {NULL, NULL}; /* XXX */ + MetaBall *mb = (MetaBall*)obedit->data; MetaElem *ml, *ml_sel=NULL; - ml= editelems.first; + ml= mb->editelems->first; while(ml) { if(ml->flag & SELECT) { calc_tw_center(scene, &ml->x); diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c index 8484ad78bc4..17a1e0b6cdb 100644 --- a/source/blender/editors/util/editmode_undo.c +++ b/source/blender/editors/util/editmode_undo.c @@ -297,6 +297,21 @@ static void undo_number(bContext *C, int nr) undo_editmode_step(C, 0); } +void undo_editmode_name(bContext *C, const char *undoname) +{ + UndoElem *uel; + + for(uel= undobase.last; uel; uel= uel->prev) { + if(strcmp(undoname, uel->name)==0) + break; + } + if(uel && uel->prev) { + curundo= uel->prev; + undo_editmode_step(C, 0); + } +} + + /* ************** for interaction with menu/pullown */ void undo_editmode_menu(bContext *C) diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index 6f742d70440..435f2c7ecf4 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -71,10 +71,11 @@ #include "UI_interface.h" #include "UI_resources.h" +#include "util_intern.h" + /* ***************** generic undo system ********************* */ /* ********* XXX **************** */ -static void undo_push_mball() {} static void sound_initialize_sounds() {} /* ********* XXX **************** */ @@ -82,7 +83,7 @@ void ED_undo_push(bContext *C, char *str) { wmWindowManager *wm= CTX_wm_manager(C); Object *obedit= CTX_data_edit_object(C); - + if(obedit) { if (U.undosteps == 0) return; @@ -93,7 +94,7 @@ void ED_undo_push(bContext *C, char *str) else if (obedit->type==OB_FONT) undo_push_font(C, str); else if (obedit->type==OB_MBALL) - undo_push_mball(str); + undo_push_mball(C, str); else if (obedit->type==OB_LATTICE) undo_push_lattice(C, str); else if (obedit->type==OB_ARMATURE) @@ -115,13 +116,7 @@ void ED_undo_push(bContext *C, char *str) } } -void ED_undo_push_op(bContext *C, wmOperator *op) -{ - /* in future, get undo string info? */ - ED_undo_push(C, op->type->name); -} - -static int ed_undo_step(bContext *C, int step) +static int ed_undo_step(bContext *C, int step, const char *undoname) { Object *obedit= CTX_data_edit_object(C); ScrArea *sa= CTX_wm_area(C); @@ -141,8 +136,12 @@ static int ed_undo_step(bContext *C, int step) ED_text_undo_step(C, step); } else if(obedit) { - if ELEM7(obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) - undo_editmode_step(C, step); + if ELEM7(obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) { + if(undoname) + undo_editmode_name(C, undoname); + else + undo_editmode_step(C, step); + } } else { int do_glob_undo= 0; @@ -164,7 +163,10 @@ static int ed_undo_step(bContext *C, int step) #ifndef DISABLE_PYTHON // XXX BPY_scripts_clear_pyobjects(); #endif - BKE_undo_step(C, step); + if(undoname) + BKE_undo_name(C, undoname); + else + BKE_undo_step(C, step); sound_initialize_sounds(); } @@ -178,22 +180,35 @@ static int ed_undo_step(bContext *C, int step) void ED_undo_pop(bContext *C) { - ed_undo_step(C, 1); + ed_undo_step(C, 1, NULL); } void ED_undo_redo(bContext *C) { - ed_undo_step(C, -1); + ed_undo_step(C, -1, NULL); +} + +void ED_undo_push_op(bContext *C, wmOperator *op) +{ + /* in future, get undo string info? */ + ED_undo_push(C, op->type->name); +} + +void ED_undo_pop_op(bContext *C, wmOperator *op) +{ + /* search back a couple of undo's, in case something else added pushes */ + ed_undo_step(C, 0, op->type->name); } static int ed_undo_exec(bContext *C, wmOperator *op) { /* "last operator" should disappear, later we can tie ths with undo stack nicer */ WM_operator_stack_clear(C); - return ed_undo_step(C, 1); + return ed_undo_step(C, 1, NULL); } + static int ed_redo_exec(bContext *C, wmOperator *op) { - return ed_undo_step(C, -1); + return ed_undo_step(C, -1, NULL); } void ED_undo_menu(bContext *C) diff --git a/source/blender/editors/util/util_intern.h b/source/blender/editors/util/util_intern.h index 37e6c5c25e1..8a0787dde3f 100644 --- a/source/blender/editors/util/util_intern.h +++ b/source/blender/editors/util/util_intern.h @@ -33,6 +33,7 @@ /* editmode_undo.c */ void undo_editmode_clear(void); +void undo_editmode_name(bContext *C, const char *undoname); #endif /* ED_UTIL_INTERN_H */ diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index f2d2d3edb8d..4a15b617360 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -1363,7 +1363,7 @@ static int stitch_exec(bContext *C, wmOperator *op) MTexPoly *tf; MLoopUV *luv; - sima= (SpaceImage*)CTX_wm_space_data(C); + sima= CTX_wm_space_image(C); scene= CTX_data_scene(C); obedit= CTX_data_edit_object(C); em= ((Mesh*)obedit->data)->edit_btmesh; @@ -1669,7 +1669,7 @@ static int sticky_select(float *limit, int hitv[4], int v, float *hituv[4], floa static int mouse_select(bContext *C, float co[2], int extend, int loop) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); ToolSettings *ts= CTX_data_tool_settings(C); Object *obedit= CTX_data_edit_object(C); @@ -2042,7 +2042,7 @@ void UV_OT_select_loop(wmOperatorType *ot) static int select_linked_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); ToolSettings *ts= CTX_data_tool_settings(C); Object *obedit= CTX_data_edit_object(C); @@ -2282,7 +2282,7 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje static int border_select_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); ToolSettings *ts= CTX_data_tool_settings(C); Object *obedit= CTX_data_edit_object(C); @@ -2438,7 +2438,7 @@ static void select_uv_inside_ellipse(BMEditMesh *em, SpaceImage *sima, int circle_select_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh; @@ -2529,7 +2529,7 @@ static int snap_cursor_to_selection(Scene *scene, Image *ima, Object *obedit, Vi static int snap_cursor_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); Image *ima= CTX_data_edit_image(C); @@ -2733,7 +2733,7 @@ static int snap_uvs_to_pixels(SpaceImage *sima, Scene *scene, Object *obedit) static int snap_selection_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); Image *ima= CTX_data_edit_image(C); @@ -2883,7 +2883,7 @@ void UV_OT_select_pinned(wmOperatorType *ot) static int hide_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ToolSettings *ts= CTX_data_tool_settings(C); Object *obedit= CTX_data_edit_object(C); Scene *scene = CTX_data_scene(C); @@ -2953,7 +2953,7 @@ void UV_OT_hide(wmOperatorType *ot) static int reveal_exec(bContext *C, wmOperator *op) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); ToolSettings *ts= CTX_data_tool_settings(C); Object *obedit= CTX_data_edit_object(C); Scene *scene = CTX_data_scene(C); @@ -3077,7 +3077,7 @@ static int set_tile_exec(bContext *C, wmOperator *op) static int set_tile_invoke(bContext *C, wmOperator *op, wmEvent *event) { - SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C); + SpaceImage *sima= CTX_wm_space_image(C); Image *ima= CTX_data_edit_image(C); ARegion *ar= CTX_wm_region(C); float fx, fy; diff --git a/source/blender/imbuf/intern/IMB_targa.h b/source/blender/imbuf/intern/IMB_targa.h index 956bc512b97..7759e4bc772 100644 --- a/source/blender/imbuf/intern/IMB_targa.h +++ b/source/blender/imbuf/intern/IMB_targa.h @@ -41,7 +41,7 @@ struct ImBuf; int imb_is_a_targa(void *buf); -struct ImBuf *imb_loadtarga(unsigned char *mem, int flags); +struct ImBuf *imb_loadtarga(unsigned char *mem, int size, int flags); short imb_savetarga(struct ImBuf * ibuf, char *name, int flags); #endif diff --git a/source/blender/imbuf/intern/iris.c b/source/blender/imbuf/intern/iris.c index aa3015812fc..7b8c383ddb9 100644 --- a/source/blender/imbuf/intern/iris.c +++ b/source/blender/imbuf/intern/iris.c @@ -104,7 +104,9 @@ static int writetab(FILE *outf, unsigned int *tab, int len); static void readtab(FILE *inf, unsigned int *tab, int len); static void expandrow(unsigned char *optr, unsigned char *iptr, int z); +static void expandrow2(float *optr, unsigned char *iptr, int z); static void interleaverow(unsigned char *lptr, unsigned char *cptr, int z, int n); +static void interleaverow2(float *lptr, unsigned char *cptr, int z, int n); static int compressrow(unsigned char *lbuf, unsigned char *rlebuf, int z, int cnt); static void lumrow(unsigned char *rgbptr, unsigned char *lumptr, int n); @@ -233,6 +235,7 @@ static void test_endian_zbuf(struct ImBuf *ibuf) struct ImBuf *imb_loadiris(unsigned char *mem, int flags) { unsigned int *base, *lptr = NULL; + float *fbase, *fptr = NULL; unsigned int *zbase, *zptr; unsigned char *rledat; unsigned int *starttab, *lengthtab; @@ -242,7 +245,6 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) int xsize, ysize, zsize; int bpp, rle, cur, badorder; ImBuf * ibuf; - uchar * rect; /*printf("new iris\n");*/ @@ -257,8 +259,8 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) rle = ISRLE(image.type); bpp = BPP(image.type); - if(bpp != 1 ) { - fprintf(stderr,"longimagedata: image must have 1 byte per pix chan\n"); + if(bpp != 1 && bpp != 2) { + fprintf(stderr,"longimagedata: image must have 1 or 2 byte per pix chan\n"); return(0); } @@ -273,6 +275,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) } if (rle) { + tablen = ysize*zsize*sizeof(int); starttab = (unsigned int *)malloc(tablen); lengthtab = (unsigned int *)malloc(tablen); @@ -280,7 +283,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) readtab(inf,starttab,tablen); readtab(inf,lengthtab,tablen); - + /* check data order */ cur = 0; badorder = 0; @@ -295,99 +298,201 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int flags) if(badorder) break; } - - ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0); - if (ibuf->depth > 32) ibuf->depth = 32; - base = ibuf->rect; - zbase = (unsigned int *)ibuf->zbuf; - - if (badorder) { - for(z=0; z<zsize; z++) { + + if (bpp == 1) { + + ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0); + if (ibuf->depth > 32) ibuf->depth = 32; + base = ibuf->rect; + zbase = (unsigned int *)ibuf->zbuf; + + if (badorder) { + for(z=0; z<zsize; z++) { + lptr = base; + for(y=0; y<ysize; y++) { + file_offset = starttab[y+z*ysize]; + + rledat = file_data + file_offset; + file_offset += lengthtab[y+z*ysize]; + + expandrow((uchar *)lptr, rledat, 3-z); + lptr += xsize; + } + } + } else { lptr = base; + zptr = zbase; for(y=0; y<ysize; y++) { - file_offset = starttab[y+z*ysize]; - - rledat = file_data + file_offset; - file_offset += lengthtab[y+z*ysize]; - - expandrow((uchar *)lptr, rledat, 3-z); + + for(z=0; z<zsize; z++) { + + file_offset = starttab[y+z*ysize]; + + rledat = file_data + file_offset; + file_offset += lengthtab[y+z*ysize]; + + if(z<4) expandrow((uchar *)lptr, rledat, 3-z); + else if(z<8) expandrow((uchar *)zptr, rledat, 7-z); + } lptr += xsize; + zptr += xsize; } } - } - else { - lptr = base; - zptr = zbase; - for(y=0; y<ysize; y++) { + + } else { /* bpp == 2 */ + + ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0); + + fbase = ibuf->rect_float; + + if (badorder) { for(z=0; z<zsize; z++) { - - file_offset = starttab[y+z*ysize]; + fptr = fbase; + for(y=0; y<ysize; y++) { + file_offset = starttab[y+z*ysize]; + + rledat = file_data + file_offset; + file_offset += lengthtab[y+z*ysize]; + + expandrow2(fptr, rledat, 3-z); + fptr += xsize * 4; + } + } + } else { + fptr = fbase; - rledat = file_data + file_offset; - file_offset += lengthtab[y+z*ysize]; - - if(z<4) expandrow((uchar *)lptr, rledat, 3-z); - else if(z<8) expandrow((uchar *)zptr, rledat, 7-z); + for(y=0; y<ysize; y++) { + + for(z=0; z<zsize; z++) { + + file_offset = starttab[y+z*ysize]; + + rledat = file_data + file_offset; + file_offset += lengthtab[y+z*ysize]; + + expandrow2(fptr, rledat, 3-z); + + } + fptr += xsize * 4; } - lptr += xsize; - zptr += xsize; } } free(starttab); - free(lengthtab); - } - else { - - ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0); - if (ibuf->depth > 32) ibuf->depth = 32; + free(lengthtab); - base = ibuf->rect; - zbase = (unsigned int *)ibuf->zbuf; - - file_offset = 512; - rledat = file_data + file_offset; - - for(z = 0; z < zsize; z++) { + } else { + if (bpp == 1) { + + ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0); + if (ibuf->depth > 32) ibuf->depth = 32; + + base = ibuf->rect; + zbase = (unsigned int *)ibuf->zbuf; - if(z<4) lptr = base; - else if(z<8) lptr= zbase; + file_offset = 512; + rledat = file_data + file_offset; - for(y = 0; y < ysize; y++) { + for(z = 0; z < zsize; z++) { + + if(z<4) lptr = base; + else if(z<8) lptr= zbase; + + for(y = 0; y < ysize; y++) { - interleaverow((uchar *)lptr, rledat, 3-z, xsize); - rledat += xsize; + interleaverow((uchar *)lptr, rledat, 3-z, xsize); + rledat += xsize; + + lptr += xsize; + } + } + + } else { /* bpp == 2 */ + + ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0); + + fbase = ibuf->rect_float; + + file_offset = 512; + rledat = file_data + file_offset; + + for(z = 0; z < zsize; z++) { + + fptr = fbase; - lptr += xsize; + for(y = 0; y < ysize; y++) { + + interleaverow2(fptr, rledat, 3-z, xsize); + rledat += xsize * 2; + + fptr += xsize * 4; + } } + } } - if (image.zsize == 1){ - rect = (uchar *) ibuf->rect; - for (x = ibuf->x * ibuf->y; x > 0; x--) { - rect[0] = 255; - rect[1] = rect[2] = rect[3]; - rect += 4; + + if (bpp == 1) { + uchar * rect; + + if (image.zsize == 1){ + rect = (uchar *) ibuf->rect; + for (x = ibuf->x * ibuf->y; x > 0; x--) { + rect[0] = 255; + rect[1] = rect[2] = rect[3]; + rect += 4; + } + } else if (image.zsize == 2){ + /* grayscale with alpha */ + rect = (uchar *) ibuf->rect; + for (x = ibuf->x * ibuf->y; x > 0; x--) { + rect[0] = rect[2]; + rect[1] = rect[2] = rect[3]; + rect += 4; + } + } else if (image.zsize == 3){ + /* add alpha */ + rect = (uchar *) ibuf->rect; + for (x = ibuf->x * ibuf->y; x > 0; x--) { + rect[0] = 255; + rect += 4; + } } - } else if (image.zsize == 2){ - /* grayscale with alpha */ - rect = (uchar *) ibuf->rect; - for (x = ibuf->x * ibuf->y; x > 0; x--) { - rect[0] = rect[2]; - rect[1] = rect[2] = rect[3]; - rect += 4; + + } else { /* bpp == 2 */ + + if (image.zsize == 1){ + fbase = ibuf->rect_float; + for (x = ibuf->x * ibuf->y; x > 0; x--) { + fbase[0] = 1; + fbase[1] = fbase[2] = fbase[3]; + fbase += 4; + } + } else if (image.zsize == 2){ + /* grayscale with alpha */ + fbase = ibuf->rect_float; + for (x = ibuf->x * ibuf->y; x > 0; x--) { + fbase[0] = fbase[2]; + fbase[1] = fbase[2] = fbase[3]; + fbase += 4; + } + } else if (image.zsize == 3){ + /* add alpha */ + fbase = ibuf->rect_float; + for (x = ibuf->x * ibuf->y; x > 0; x--) { + fbase[0] = 1; + fbase += 4; + } } - } else if (image.zsize == 3){ - /* add alpha */ - rect = (uchar *) ibuf->rect; - for (x = ibuf->x * ibuf->y; x > 0; x--) { - rect[0] = 255; - rect += 4; + + if (flags & IB_rect) { + IMB_rect_from_float(ibuf); } + } - + ibuf->ftype = IMAGIC; if (flags & IB_ttob) IMB_flipy(ibuf); @@ -412,6 +517,71 @@ static void interleaverow(unsigned char *lptr, unsigned char *cptr, int z, int n } } +static void interleaverow2(float *lptr, unsigned char *cptr, int z, int n) +{ + lptr += z; + while(n--) { + *lptr = ((cptr[0]<<8) | (cptr[1]<<0)) / (float)0xFFFF; + cptr += 2; + lptr += 4; + } +} + +static void expandrow2(float *optr, unsigned char *iptr, int z) +{ + unsigned short pixel, count; + float pixel_f; + + optr += z; + while(1) { + pixel = (iptr[0]<<8) | (iptr[1]<<0); + iptr += 2; + + if ( !(count = (pixel & 0x7f)) ) + return; + if(pixel & 0x80) { + while(count>=8) { + optr[0*4] = ((iptr[0]<<8) | (iptr[1]<<0))/(float)0xFFFF; + optr[1*4] = ((iptr[2]<<8) | (iptr[3]<<0))/(float)0xFFFF; + optr[2*4] = ((iptr[4]<<8) | (iptr[5]<<0))/(float)0xFFFF; + optr[3*4] = ((iptr[6]<<8) | (iptr[7]<<0))/(float)0xFFFF; + optr[4*4] = ((iptr[8]<<8) | (iptr[9]<<0))/(float)0xFFFF; + optr[5*4] = ((iptr[10]<<8) | (iptr[11]<<0))/(float)0xFFFF; + optr[6*4] = ((iptr[12]<<8) | (iptr[13]<<0))/(float)0xFFFF; + optr[7*4] = ((iptr[14]<<8) | (iptr[15]<<0))/(float)0xFFFF; + optr += 8*4; + iptr += 8*2; + count -= 8; + } + while(count--) { + *optr = ((iptr[0]<<8) | (iptr[1]<<0))/(float)0xFFFF; + iptr+=2; + optr+=4; + } + } else { + pixel_f = ((iptr[0]<<8) | (iptr[1]<<0))/(float)0xFFFF; + iptr += 2; + + while(count>=8) { + optr[0*4] = pixel_f; + optr[1*4] = pixel_f; + optr[2*4] = pixel_f; + optr[3*4] = pixel_f; + optr[4*4] = pixel_f; + optr[5*4] = pixel_f; + optr[6*4] = pixel_f; + optr[7*4] = pixel_f; + optr += 8*4; + count -= 8; + } + while(count--) { + *optr = pixel_f; + optr+=4; + } + } + } +} + static void expandrow(unsigned char *optr, unsigned char *iptr, int z) { unsigned char pixel, count; diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c index 1a6ab104bcf..4104a8db65c 100644 --- a/source/blender/imbuf/intern/readimage.c +++ b/source/blender/imbuf/intern/readimage.c @@ -143,7 +143,7 @@ ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags) { ibuf = imb_bmp_decode((uchar *)mem, size, flags); if (ibuf) return(ibuf); - ibuf = imb_loadtarga((uchar *)mem, flags); + ibuf = imb_loadtarga((uchar *)mem, size, flags); if (ibuf) return(ibuf); ibuf = imb_loaddpx((uchar *)mem, size, flags); @@ -229,7 +229,7 @@ struct ImBuf *IMB_loadiffmem(int *mem, int flags) { } } - ibuf = imb_loadtarga((uchar *) mem,flags); + ibuf = imb_loadtarga((uchar *) mem,maxlen,flags); if (ibuf) return(ibuf); if (IB_verbose) fprintf(stderr,"Unknown fileformat\n"); diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c index 303e5685503..c89bc6a632f 100644 --- a/source/blender/imbuf/intern/targa.c +++ b/source/blender/imbuf/intern/targa.c @@ -289,7 +289,10 @@ short imb_savetarga(struct ImBuf * ibuf, char *name, int flags) fildes = fopen(name,"wb"); if (!fildes) return 0; - if (fwrite(buf, 1, 18,fildes) != 18) return (0); + if (fwrite(buf, 1, 18,fildes) != 18) { + fclose(fildes); + return (0); + } if (ibuf->cmap){ for (i = 0 ; i<ibuf->maxcol ; i++){ @@ -365,8 +368,24 @@ int imb_is_a_targa(void *buf) { return checktarga(&tga, buf); } -static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int psize) +static void complete_partial_load(struct ImBuf *ibuf, unsigned int *rect) { + int size = (ibuf->x * ibuf->y) - (rect - ibuf->rect); + if(size) { + printf("decodetarga: incomplete file, %.1f%% missing\n", 100*((float)size / (ibuf->x * ibuf->y))); + + /* not essential but makes displaying partially rendered TGA's less ugly */ + memset(rect, 0, size); + } + else { + /* shouldnt happen */ + printf("decodetarga: incomplete file, all pixels written\n"); + } +} + +static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int mem_size, int psize) +{ + unsigned char *mem_end = mem+mem_size; int count, col, size; unsigned int *rect; uchar * cp = (uchar *) &col; @@ -380,9 +399,13 @@ static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int psize) /* set alpha */ cp[0] = 0xff; cp[1] = cp[2] = 0; - + while(size > 0){ count = *mem++; + + if(mem>mem_end) + goto partial_load; + if (count >= 128) { /*if (count == 128) printf("TARGA: 128 in file !\n");*/ count -= 127; @@ -452,15 +475,28 @@ static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int psize) } *rect++ = col; count --; + + if(mem>mem_end) + goto partial_load; } + + if(mem>mem_end) + goto partial_load; } } } - if (size) printf("decodetarga: count would overwrite %d pixels\n", -size); + if (size) { + printf("decodetarga: count would overwrite %d pixels\n", -size); + } + return; + +partial_load: + complete_partial_load(ibuf, rect); } -static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int psize) +static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int mem_size, int psize) { + unsigned char *mem_end = mem+mem_size; int col,size; unsigned int *rect; uchar * cp = (uchar *) &col; @@ -476,6 +512,9 @@ static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int psize) cp[1] = cp[2] = 0; while(size > 0){ + if(mem>mem_end) + goto partial_load; + if (psize & 2){ if (psize & 1){ /* order = bgra */ @@ -505,10 +544,14 @@ static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int psize) *rect++ = col; size--; } + return; + +partial_load: + complete_partial_load(ibuf, rect); } -struct ImBuf *imb_loadtarga(unsigned char *mem, int flags) +struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags) { TARGA tga; struct ImBuf * ibuf; @@ -579,18 +622,18 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int flags) case 1: case 2: case 3: - if (tga.pixsize <= 8) ldtarga(ibuf,mem,0); - else if (tga.pixsize <= 16) ldtarga(ibuf,mem,1); - else if (tga.pixsize <= 24) ldtarga(ibuf,mem,2); - else if (tga.pixsize <= 32) ldtarga(ibuf,mem,3); + if (tga.pixsize <= 8) ldtarga(ibuf,mem,mem_size,0); + else if (tga.pixsize <= 16) ldtarga(ibuf,mem,mem_size,1); + else if (tga.pixsize <= 24) ldtarga(ibuf,mem,mem_size,2); + else if (tga.pixsize <= 32) ldtarga(ibuf,mem,mem_size,3); break; case 9: case 10: case 11: - if (tga.pixsize <= 8) decodetarga(ibuf,mem,0); - else if (tga.pixsize <= 16) decodetarga(ibuf,mem,1); - else if (tga.pixsize <= 24) decodetarga(ibuf,mem,2); - else if (tga.pixsize <= 32) decodetarga(ibuf,mem,3); + if (tga.pixsize <= 8) decodetarga(ibuf,mem,mem_size,0); + else if (tga.pixsize <= 16) decodetarga(ibuf,mem,mem_size,1); + else if (tga.pixsize <= 24) decodetarga(ibuf,mem,mem_size,2); + else if (tga.pixsize <= 32) decodetarga(ibuf,mem,mem_size,3); break; } diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index ffd5d3431af..26434583118 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -401,8 +401,6 @@ int imb_get_anim_type(char * name) { if (ib_stat(name,&st) == -1) return(0); if (((st.st_mode) & S_IFMT) != S_IFREG) return(0); - if (isavi(name)) return (ANIM_AVI); - if (ismovie(name)) return (ANIM_MOVIE); # ifdef WITH_QUICKTIME if (isqtime(name)) return (ANIM_QTIME); @@ -410,6 +408,7 @@ int imb_get_anim_type(char * name) { # ifdef WITH_FFMPEG if (isffmpeg(name)) return (ANIM_FFMPEG); # endif + if (isavi(name)) return (ANIM_AVI); #endif #ifdef WITH_REDCODE if (isredcode(name)) return (ANIM_REDCODE); diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 4eddebc5b67..6f097ea3882 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -299,8 +299,10 @@ typedef enum DOPESHEET_FILTERFLAG { /* general filtering */ ADS_FILTER_ONLYSEL = (1<<0), /* only include channels relating to selected data */ + /* temporary (runtime flags) */ ADS_FILTER_ONLYDRIVERS = (1<<1), /* for 'Drivers' editor - only include Driver data from AnimData */ ADS_FILTER_ONLYNLA = (1<<2), /* for 'NLA' editor - only include NLA data from AnimData */ + ADS_FILTER_SELEDIT = (1<<3), /* for Graph Editor - used to indicate whether to include a filtering flag or not */ /* datatype-based filtering */ ADS_FILTER_NOSHAPEKEYS = (1<<6), @@ -310,12 +312,14 @@ typedef enum DOPESHEET_FILTERFLAG { ADS_FILTER_NOCUR = (1<<13), ADS_FILTER_NOWOR = (1<<14), ADS_FILTER_NOSCE = (1<<15), + ADS_FILTER_NOPART = (1<<16), + ADS_FILTER_NOMBA = (1<<17), /* NLA-specific filters */ ADS_FILTER_NLA_NOACT = (1<<20), /* if the AnimData block has no NLA data, don't include to just show Action-line */ /* combination filters (some only used at runtime) */ - ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR), + ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR|ADS_FILTER_NOPART), } DOPESHEET_FILTERFLAG; /* DopeSheet general flags */ diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index f713b4a8acc..c3f668ff622 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -405,6 +405,10 @@ typedef struct FreeCamera { /* editObjectActuator->flag */ #define ACT_TRACK_3D 1 +/* editObjectActuator->flag for replace mesh actuator */ +#define ACT_EDOB_REPLACE_MESH_NOGFX 2 /* use for replace mesh actuator */ +#define ACT_EDOB_REPLACE_MESH_PHYS 4 + /* SceneActuator->type */ #define ACT_SCENE_RESTART 0 #define ACT_SCENE_SET 1 diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index cb1cd9e3ed8..f75ed273164 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -457,10 +457,14 @@ typedef struct NlaStrip { float blendin, blendout; /* strip blending length (only used when there are no F-Curves) */ short blendmode; /* strip blending mode (layer-based mixing) */ + short extendmode; /* strip extrapolation mode (time-based mixing) */ + short pad1; - short flag; /* settings */ short type; /* type of NLA strip */ + + int flag; /* settings */ + int pad2; } NlaStrip; /* NLA Strip Blending Mode */ @@ -498,21 +502,23 @@ typedef enum eNlaStrip_Flag { NLASTRIP_FLAG_USR_INFLUENCE = (1<<5), NLASTRIP_FLAG_USR_TIME = (1<<6), + /* NLA strip length is synced to the length of the referenced action */ + NLASTRIP_FLAG_SYNC_LENGTH = (1<<9), + /* playback flags (may be overriden by F-Curves) */ /* NLA strip blendin/out values are set automatically based on overlaps */ NLASTRIP_FLAG_AUTO_BLENDS = (1<<10), /* NLA strip is played back in reverse order */ NLASTRIP_FLAG_REVERSE = (1<<11), /* NLA strip is muted (i.e. doesn't contribute in any way) */ - // TODO: this overlaps a lot with the functionality in track NLASTRIP_FLAG_MUTED = (1<<12), - /* NLA strip length is synced to the length of the referenced action */ - NLASTRIP_FLAG_SYNC_LENGTH = (1<<13), + /* NLA Strip is played back in 'ping-pong' style */ + NLASTRIP_FLAG_MIRROR = (1<<13), /* temporary editing flags */ /* NLA-Strip is really just a temporary meta used to facilitate easier transform code */ - NLASTRIP_FLAG_TEMP_META = (1<<14), - NLASTRIP_FLAG_EDIT_TOUCHED = (1<<15), + NLASTRIP_FLAG_TEMP_META = (1<<30), + NLASTRIP_FLAG_EDIT_TOUCHED = (1<<31), } eNlaStrip_Flag; /* NLA Strip Type */ @@ -625,6 +631,8 @@ typedef enum eKSP_TemplateTypes { KSP_TEMPLATE_PCHAN = (1<<1), /* #pch - selected posechannel */ KSP_TEMPLATE_CONSTRAINT = (1<<2), /* #con - active only */ KSP_TEMPLATE_NODE = (1<<3), /* #nod - selected node */ + + KSP_TEMPLATE_PCHAN_ROT = (1<<16), /* modify rotation paths based on rotation mode of Pose Channel */ } eKSP_TemplateTypes; /* ---------------- */ @@ -728,8 +736,13 @@ typedef struct AnimData { ListBase overrides; /* temp storage (AnimOverride) of values for settings that are animated (but the value hasn't been keyframed) */ /* settings for animation evaluation */ - int flag; /* user-defined settings */ - int recalc; /* depsgraph recalculation flags */ + int flag; /* user-defined settings */ + int recalc; /* depsgraph recalculation flags */ + + /* settings for active action evaluation (based on NLA strip settings) */ + short act_blendmode; /* accumulation mode for active action */ + short act_extendmode; /* extrapolation mode for active action */ + float act_influence; /* influence for active action */ } AnimData; /* Animation Data settings (mostly for NLA) */ diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h index 93a974c1180..f88d3b68ebf 100644 --- a/source/blender/makesdna/DNA_brush_types.h +++ b/source/blender/makesdna/DNA_brush_types.h @@ -111,6 +111,7 @@ typedef struct Brush { #define SCULPT_TOOL_FLATTEN 7 #define SCULPT_TOOL_CLAY 8 +/* ImagePaintSettings.tool */ #define PAINT_TOOL_DRAW 0 #define PAINT_TOOL_SOFTEN 1 #define PAINT_TOOL_SMEAR 2 diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h index 8ba7fa8b58d..3d839570e17 100644 --- a/source/blender/makesdna/DNA_camera_types.h +++ b/source/blender/makesdna/DNA_camera_types.h @@ -32,7 +32,6 @@ #define DNA_CAMERA_TYPES_H #include "DNA_ID.h" -#include "DNA_scriptlink_types.h" #ifdef __cplusplus extern "C" { @@ -61,7 +60,6 @@ typedef struct Camera { struct Ipo *ipo; // XXX depreceated... old animation system - ScriptLink scriptlink; struct Object *dof_ob; } Camera; diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h index a1059038777..78c8d1a5607 100644 --- a/source/blender/makesdna/DNA_lamp_types.h +++ b/source/blender/makesdna/DNA_lamp_types.h @@ -32,7 +32,6 @@ #define DNA_LAMP_TYPES_H #include "DNA_ID.h" -#include "DNA_scriptlink_types.h" #ifndef MAX_MTEX #define MAX_MTEX 18 @@ -110,8 +109,6 @@ typedef struct Lamp { /* preview */ struct PreviewImage *preview; - - ScriptLink scriptlink; } Lamp; /* **************** LAMP ********************* */ diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index a2ead6fc33d..5b566a244b4 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -32,7 +32,6 @@ #define DNA_MATERIAL_TYPES_H #include "DNA_ID.h" -#include "DNA_scriptlink_types.h" #include "DNA_listBase.h" #ifndef MAX_MTEX @@ -134,8 +133,6 @@ typedef struct Material { /* yafray: absorption color, dispersion parameters and material preset menu */ float YF_ar, YF_ag, YF_ab, YF_dscale, YF_dpwr; int YF_dsmp, YF_preset, YF_djit; - - ScriptLink scriptlink; ListBase gpumaterial; /* runtime */ } Material; @@ -151,6 +148,7 @@ typedef struct Material { #define MA_TYPE_SURFACE 0 #define MA_TYPE_HALO 1 #define MA_TYPE_VOLUME 2 +#define MA_TYPE_WIRE 3 /* flag */ /* for render */ @@ -162,7 +160,7 @@ typedef struct Material { #define MA_TRACEBLE 1 #define MA_SHADOW 2 #define MA_SHLESS 4 -#define MA_WIRE 8 +#define MA_WIRE 8 /* deprecated */ #define MA_VERTEXCOL 16 #define MA_HALO_SOFT 16 #define MA_HALO 32 /* deprecated */ diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h index 862f3ca184b..8b61405b851 100644 --- a/source/blender/makesdna/DNA_meta_types.h +++ b/source/blender/makesdna/DNA_meta_types.h @@ -35,6 +35,7 @@ #include "DNA_ID.h" struct BoundBox; +struct AnimData; struct Ipo; struct Material; @@ -48,7 +49,9 @@ typedef struct MetaElem { short type, flag, selcol1, selcol2; float x, y, z; /* Position of center of MetaElem */ float quat[4]; /* Rotation of MetaElem */ - float expx, expy, expz; /* dimension parameters, used for some types like cubes */ + float expx; /* dimension parameters, used for some types like cubes */ + float expy; + float expz; float rad; /* radius of the meta element */ float rad2; /* temp field, used only while processing */ float s; /* stiffness, how much of the element to fill */ @@ -60,18 +63,20 @@ typedef struct MetaElem { typedef struct MetaBall { ID id; + struct AnimData *adt; struct BoundBox *bb; ListBase elems; ListBase disp; ListBase *editelems; /* not saved in files, note we use pointer for editmode check */ - struct Ipo *ipo; + struct Ipo *ipo; // XXX... depreceated (old animation system) /* material of the mother ball will define the material used of all others */ struct Material **mat; - short flag, totcol; + char flag, flag2; /* flag is enum for updates, flag2 is bitflags for settings */ + short totcol; int texflag; /* used to store MB_AUTOSPACE */ /* texture space, copied as one block in editobject.c */ @@ -85,8 +90,10 @@ typedef struct MetaBall { mother ball changes will effect other objects thresholds, but these may also have their own thresh as an offset */ float thresh; - - + + /* used in editmode */ + /*ListBase edit_elems;*/ + MetaElem *lastelem; } MetaBall; /* **************** METABALL ********************* */ @@ -100,6 +107,10 @@ typedef struct MetaBall { #define MB_UPDATE_FAST 2 #define MB_UPDATE_NEVER 3 +/* mb->flag2 */ +#define MB_DS_EXPAND (1<<0) + + /* ml->type */ #define MB_BALL 0 #define MB_TUBEX 1 /* depercated */ diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index ab053c136ea..3f504848d77 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -41,6 +41,7 @@ typedef enum ModifierType { eModifierType_SimpleDeform, eModifierType_Multires, eModifierType_Surface, + eModifierType_Smoke, NUM_MODIFIER_TYPES } ModifierType; @@ -237,6 +238,23 @@ typedef struct BMeshModifierData { int type; } BMeshModifierData; + +/* Smoke modifier flags */ +#define MOD_SMOKE_TYPE_DOMAIN (1 << 0) +#define MOD_SMOKE_TYPE_FLOW (1 << 1) +#define MOD_SMOKE_TYPE_COLL (1 << 2) + +typedef struct SmokeModifierData { + ModifierData modifier; + + struct SmokeDomainSettings *domain; + struct SmokeFlowSettings *flow; /* inflow, outflow, smoke objects */ + struct SmokeCollSettings *coll; /* collision objects */ + float time; + int type; /* domain, inflow, outflow, ... */ + struct PointCache *point_cache; /* definition is in DNA_object_force.h */ +} SmokeModifierData; + typedef struct DisplaceModifierData { ModifierData modifier; diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h index 6cf20cc25a2..b5b33610bfe 100644 --- a/source/blender/makesdna/DNA_object_force.h +++ b/source/blender/makesdna/DNA_object_force.h @@ -89,10 +89,15 @@ typedef struct PointCache { int endframe; /* simulation end frame */ int editframe; /* frame being edited (runtime only) */ int last_exact; /* last exact frame that's cached */ - int xdata_type; /* type of extra data */ + + /* for external cache files */ + int totpoint; /* number of cached points */ + int index, rt; /* modifier stack index */ + char name[64]; char prev_name[64]; char info[64]; + char path[240]; /* file path */ struct ListBase mem_cache; } PointCache; @@ -160,12 +165,17 @@ typedef struct SoftBody { int totpoint, totspring; struct BodyPoint *bpoint; /* not saved in file */ struct BodySpring *bspring; /* not saved in file */ - float pad; + char pad; + char msg_lock; + short msg_value; /* part of UI: */ /* general options */ float nodemass; /* softbody mass of *vertex* */ + char namedVG_Mass[32]; /* along with it introduce mass painting + starting to fix old bug .. nastyness that VG are indexes + rather find them by name tag to find it -> jow20090613 */ float grav; /* softbody amount of gravitaion to apply */ float mediafrict; /* friction to env */ float rklimit; /* error limit for ODE solver */ @@ -178,13 +188,18 @@ typedef struct SoftBody { float maxgoal; float defgoal; /* default goal for vertices without vgroup */ short vertgroup; /* index starting at 1 */ + char namedVG_Softgoal[32]; /* starting to fix old bug .. nastyness that VG are indexes + rather find them by name tag to find it -> jow20090613 */ short fuzzyness; /* */ /* springs */ float inspring; /* softbody inner springs */ float infrict; /* softbody inner springs friction */ - + char namedVG_Spring_K[32]; /* along with it introduce Spring_K painting + starting to fix old bug .. nastyness that VG are indexes + rather find them by name tag to find it -> jow20090613 */ + /* baking */ int sfra, efra; int interval; @@ -267,6 +282,7 @@ typedef struct SoftBody { #define PTCACHE_DISK_CACHE 64 #define PTCACHE_QUICK_CACHE 128 #define PTCACHE_FRAMES_SKIPPED 256 +#define PTCACHE_EXTERNAL 512 /* PTCACHE_OUTDATED + PTCACHE_FRAMES_SKIPPED */ #define PTCACHE_REDO_NEEDED 258 @@ -285,7 +301,7 @@ typedef struct SoftBody { #define OB_SB_FACECOLL 1024 #define OB_SB_EDGECOLL 2048 #define OB_SB_COLLFINAL 4096 -//#define OB_SB_PROTECT_CACHE 8192 +#define OB_SB_BIG_UI 8192 #define OB_SB_AERO_ANGLE 16384 /* sb->solverflags */ diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 93980e58f8c..fa594417a17 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -35,7 +35,6 @@ #include "DNA_listBase.h" #include "DNA_ID.h" -#include "DNA_scriptlink_types.h" #ifdef __cplusplus extern "C" { @@ -172,7 +171,6 @@ typedef struct Object { float empty_drawsize; float dupfacesca; /* dupliface scale */ - ScriptLink scriptlink; ListBase prop; ListBase sensors; ListBase controllers; @@ -489,6 +487,8 @@ extern Object workob; #define OB_ADS_SHOWCONS (1<<12) /* object's material channels */ #define OB_ADS_SHOWMATS (1<<13) + /* object's marticle channels */ +#define OB_ADS_SHOWPARTS (1<<14) /* ob->protectflag */ #define OB_LOCK_LOCX 1 diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h index 2d8a186d3f4..b71d390db5a 100644 --- a/source/blender/makesdna/DNA_particle_types.h +++ b/source/blender/makesdna/DNA_particle_types.h @@ -233,13 +233,6 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in struct KDTree *tree; /* used for interactions with self and other systems */ }ParticleSystem; -/* general particle maximums */ -/* no special why's, just seem reasonable */ -/* changing these (atleast upwards) should not cause any major problems */ -#define MAX_PARTS 100000 /* real particles/system */ -#define MAX_PART_CHILDREN 10000 /* child particles/real particles */ -#define MAX_BOIDNEIGHBOURS 10 /* neigbours considered/boid */ - /* part->type */ /* hair is allways baked static in object/geometry space */ /* other types (normal particles) are in global space and not static baked */ @@ -253,7 +246,8 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in #define PART_REACT_MULTIPLE 2 #define PART_LOOP 4 -//#define PART_LOOP_INSTANT 8 + /* for dopesheet */ +#define PART_DS_EXPAND 8 #define PART_HAIR_GEOMETRY 16 diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 60176dd5e6e..752f756401c 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -36,7 +36,6 @@ extern "C" { #include "DNA_brush_types.h" #include "DNA_vec_types.h" #include "DNA_listBase.h" -#include "DNA_scriptlink_types.h" #include "DNA_ID.h" struct Object; @@ -435,7 +434,7 @@ typedef struct ImagePaintSettings { short flag, tool; /* for projection painting only */ - short seam_bleed,normal_angle; + short seam_bleed, normal_angle; void *paintcursor; /* wm handle */ } ImagePaintSettings; @@ -571,7 +570,7 @@ typedef struct ToolSettings { float clean_thresh; /* Auto-Keying Mode */ - short autokey_mode, pad2; /* defines in DNA_userdef_types.h */ + short autokey_mode, autokey_flag; /* defines in DNA_userdef_types.h */ /* Retopo */ char retopo_mode; @@ -660,8 +659,6 @@ typedef struct Scene { struct RenderData r; struct AudioData audio; /* DEPRECATED 2.5 */ - ScriptLink scriptlink; - ListBase markers; ListBase transform_spaces; @@ -963,11 +960,10 @@ typedef enum SculptFlags { SCULPT_LOCK_Z = 256 } SculptFlags; -/* toolsettings->imagepaint_flag */ +/* ImagePaintSettings.flag */ #define IMAGEPAINT_DRAWING 1 #define IMAGEPAINT_DRAW_TOOL 2 #define IMAGEPAINT_DRAW_TOOL_DRAWING 4 - /* projection painting only */ #define IMAGEPAINT_PROJECT_DISABLE 8 /* Non projection 3D painting */ #define IMAGEPAINT_PROJECT_XRAY 16 diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index 1be75e97735..e51da0c0818 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -31,7 +31,6 @@ #include "DNA_view2d_types.h" #include "DNA_vec_types.h" -#include "DNA_scriptlink_types.h" #include "DNA_ID.h" struct SpaceType; @@ -125,8 +124,6 @@ typedef struct ScrArea { short pad; short do_refresh; /* private, for spacetype refresh callback */ short cursor, flag; - - ScriptLink scriptlink; struct SpaceType *type; /* callbacks for this space type */ @@ -189,6 +186,8 @@ typedef struct ARegion { #define SCREENNORMAL 0 #define SCREENFULL 1 #define SCREENAUTOPLAY 2 +#define SCREENTEMP 3 + /* Panel->snap - for snapping to screen edges */ #define PNL_SNAP_NONE 0 diff --git a/source/blender/makesdna/DNA_scriptlink_types.h b/source/blender/makesdna/DNA_scriptlink_types.h deleted file mode 100644 index 9b50eb91a20..00000000000 --- a/source/blender/makesdna/DNA_scriptlink_types.h +++ /dev/null @@ -1,79 +0,0 @@ -/** - * blenlib/DNA_object_types.h (mar-2001 nzc) - * - * Scriptlink is hard-coded in object for some reason. - * - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -#ifndef DNA_SCRIPTLINK_TYPES_H -#define DNA_SCRIPTLINK_TYPES_H - -#ifdef __cplusplus -extern "C" { -#endif - -struct ID; - -typedef struct ScriptLink { - struct ID **scripts; - short *flag; - - short actscript, totscript; - int pad; -} ScriptLink; - -/* **************** SCRIPTLINKS ********************* */ - -#define SCRIPT_FRAMECHANGED 1 -#define SCRIPT_ONLOAD 2 -#define SCRIPT_REDRAW 4 -#define SCRIPT_ONSAVE 8 -#define SCRIPT_RENDER 16 -/* POSTRENDER is not meant for the UI, it simply calls the - * RENDER script links for clean-up actions */ -#define SCRIPT_POSTRENDER 32 - -#define SCRIPT_OBJECTUPDATE 64 -#define SCRIPT_OBDATAUPDATE 128 - -/* **************** SPACE HANDLERS ********************* */ -/* these are special scriptlinks that can be assigned to - * a given space in a given ScrArea to: - * - (EVENT type) handle events sent to that space; - * - (EVENT_ALL type): handle release events, too; - * - (DRAW type) draw on the space after its own drawing function finishes. - */ -#define SPACEHANDLER_VIEW3D_DRAW 1 -#define SPACEHANDLER_VIEW3D_EVENT 2 -#define SPACEHANDLER_VIEW3D_EVENT_ALL 3 - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index 39e72c34adf..422e1b07ed7 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -147,7 +147,7 @@ typedef struct Sequence { Strip *strip; - struct Ipo *ipo; + struct Ipo *ipo; // xxx depreceated... old animation system struct Scene *scene; struct anim *anim; float facf0, facf1; diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h new file mode 100644 index 00000000000..c3efc5e04dd --- /dev/null +++ b/source/blender/makesdna/DNA_smoke_types.h @@ -0,0 +1,118 @@ +/** +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* The Original Code is Copyright (C) 2006 by NaN Holding BV. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): Daniel Genrich (Genscher) +* +* ***** END GPL LICENSE BLOCK ***** +*/ +#ifndef DNA_SMOKE_TYPES_H +#define DNA_SMOKE_TYPES_H + +/* flags */ +#define MOD_SMOKE_HIGHRES (1<<1) +/* noise */ +#define MOD_SMOKE_NOISEWAVE (1<<0) +#define MOD_SMOKE_NOISEFFT (1<<1) +#define MOD_SMOKE_NOISECURL (1<<2) +/* viewsettings */ +#define MOD_SMOKE_VIEW_X (1<<0) +#define MOD_SMOKE_VIEW_Y (1<<1) +#define MOD_SMOKE_VIEW_Z (1<<2) +#define MOD_SMOKE_VIEW_SMALL (1<<3) +#define MOD_SMOKE_VIEW_BIG (1<<4) +#define MOD_SMOKE_VIEW_CHANGETOBIG (1<<5) +#define MOD_SMOKE_VIEW_REDRAWNICE (1<<6) +#define MOD_SMOKE_VIEW_REDRAWALL (1<<7) + +typedef struct SmokeDomainSettings { + struct SmokeModifierData *smd; /* for fast RNA access */ + struct FLUID_3D *fluid; + struct Group *fluid_group; + struct Group *eff_group; // effector group for e.g. wind force + struct Group *coll_group; // collision objects group + unsigned int *bind; + float *tvox; + float *tray; + float *tvoxbig; + float *traybig; + float p0[3]; /* start point of BB */ + float p1[3]; /* end point of BB */ + float dx; /* edge length of one cell */ + float firstframe; + float lastframe; + float omega; /* smoke color - from 0 to 1 */ + float temp; /* fluid temperature */ + float tempAmb; /* ambient temperature */ + float alpha; + float beta; + int res[3]; /* domain resolution */ + int amplify; /* wavelet amplification */ + int maxres; /* longest axis on the BB gets this resolution assigned */ + int flags; /* show up-res or low res, etc */ + int visibility; /* how many billboards to show (every 2nd, 3rd, 4th,..) */ + int viewsettings; + int max_textures; + short noise; /* noise type: wave, curl, anisotropic */ + short pad2; + int pad; + int pad3; +} SmokeDomainSettings; + + +/* inflow / outflow */ + +/* type */ +#define MOD_SMOKE_FLOW_TYPE_OUTFLOW (1<<1) + +typedef struct SmokeFlowSettings { + struct SmokeModifierData *smd; /* for fast RNA access */ + struct ParticleSystem *psys; + float density; + float temp; /* delta temperature (temp - ambient temp) */ + float velocity[3]; /* UNUSED, velocity taken from particles */ + float vgrp_heat_scale[2]; /* min and max scaling for vgroup_heat */ + short vgroup_flow; /* where inflow/outflow happens - red=1=action */ + short vgroup_density; + short vgroup_heat; + short type; /* inflow =0 or outflow = 1 */ + int pad; +} SmokeFlowSettings; + +/* collision objects (filled with smoke) */ +typedef struct SmokeCollSettings { + struct SmokeModifierData *smd; /* for fast RNA access */ + struct BVHTree *bvhtree; /* bounding volume hierarchy for this cloth object */ + float *points; + float *points_old; + float *vel; + float mat[4][4]; + float mat_old[4][4]; + int numpoints; + int numverts; // check if mesh changed + short type; // static = 0, rigid = 1, dynamic = 2 + short pad; + int pad2; +} SmokeCollSettings; + +#endif diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 61931085707..d24d9af4177 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -94,7 +94,7 @@ typedef struct SpaceIpo { float blockscale; short blockhandler[8]; - View2D v2d; /* depricated, copied to region */ + View2D v2d; /* deprecated, copied to region */ struct bDopeSheet *ads; /* settings for filtering animation data (NOTE: we use a pointer due to code-linking issues) */ @@ -116,24 +116,12 @@ typedef struct SpaceButs { struct RenderInfo *ri; - short cursens, curact; - short align, preview; /* align for panels, preview is signal to refresh */ - View2D v2d; /* depricated, copied to region */ + View2D v2d; /* deprecated, copied to region */ - short mainb, menunr; /* texnr and menunr have to remain shorts */ - short pin, mainbo; - void *lockpoin; - - short texnr; - char texfrom, showgroup; - - short modeltype; - short scriptblock; - short scaflag; - short re_align; - - short oldkeypress; /* for keeping track of the sub tab key cycling */ - char flag, texact; + short mainb, mainbo, mainbuser; /* context tabs */ + short re_align, align; /* align for panels */ + short preview; /* preview is signal to refresh */ + char flag, pad[3]; void *path; /* runtime */ int pathflag, dataicon; /* runtime */ @@ -148,7 +136,7 @@ typedef struct SpaceSeq { short blockhandler[8]; - View2D v2d; /* depricated, copied to region */ + View2D v2d; /* deprecated, copied to region */ float xof, yof; /* offset for drawing the image preview */ short mainb; @@ -212,6 +200,8 @@ typedef struct SpaceFile { struct FileLayout *layout; + short recentnr, bookmarknr; + short systemnr, pad2; } SpaceFile; typedef struct SpaceOops { @@ -222,7 +212,7 @@ typedef struct SpaceOops { short blockhandler[8]; - View2D v2d; /* depricated, copied to region */ + View2D v2d; /* deprecated, copied to region */ ListBase tree; struct TreeStore *treestore; @@ -277,7 +267,7 @@ typedef struct SpaceNla { int pad; struct bDopeSheet *ads; - View2D v2d; /* depricated, copied to region */ + View2D v2d; /* deprecated, copied to region */ } SpaceNla; typedef struct SpaceText { @@ -349,7 +339,7 @@ typedef struct SpaceTime { int spacetype; float blockscale; - View2D v2d; /* depricated, copied to region */ + View2D v2d; /* deprecated, copied to region */ int flag, redraws; @@ -363,7 +353,7 @@ typedef struct SpaceNode { short blockhandler[8]; - View2D v2d; /* depricated, copied to region */ + View2D v2d; /* deprecated, copied to region */ struct ID *id, *from; /* context, no need to save in file? well... pinning... */ short flag, menunr; /* menunr: browse id block in header */ @@ -412,7 +402,7 @@ typedef struct SpaceImaSel { short blockhandler[8]; - View2D v2d; /* depricated, copied to region */ + View2D v2d; /* deprecated, copied to region */ struct FileList *files; @@ -580,7 +570,6 @@ typedef struct SpaceConsole { #define BCONTEXT_TEXTURE 5 #define BCONTEXT_PARTICLE 6 #define BCONTEXT_PHYSICS 7 -#define BCONTEXT_GAME 8 #define BCONTEXT_BONE 9 #define BCONTEXT_MODIFIER 10 #define BCONTEXT_CONSTRAINT 12 @@ -590,6 +579,7 @@ typedef struct SpaceConsole { #define SB_PRV_OSA 1 #define SB_PIN_CONTEXT 2 #define SB_WORLD_TEX 4 +#define SB_BRUSH_TEX 8 /* sbuts->align */ #define BUT_FREE 0 @@ -654,7 +644,8 @@ enum FileSortTypeE { #define FILE_BOOKMARKS 512 /* files in filesel list: 2=ACTIVE */ -#define HILITE 1 +#define EDITING 1 +#define ACTIVE 2 #define BLENDERFILE 4 #define PSXFILE 8 #define IMAGEFILE 16 @@ -720,6 +711,8 @@ enum FileSortTypeE { #define SIPO_NOHANDLES (1<<2) #define SIPO_NODRAWCFRANUM (1<<3) #define SIPO_DRAWTIME (1<<4) +#define SIPO_SELCUVERTSONLY (1<<5) +#define SIPO_DRAWNAMES (1<<6) /* SpaceIpo->mode (Graph Editor Mode) */ enum { @@ -761,6 +754,7 @@ enum { #define SO_SEQUENCE 10 #define SO_DATABLOCKS 11 #define SO_USERDEF 12 +#define SO_KEYMAP 13 /* SpaceOops->storeflag */ #define SO_TREESTORE_CLEANUP 1 @@ -812,6 +806,7 @@ enum { #define SNLA_DRAWTIME (1<<2) #define SNLA_NOTRANSKEYCULL (1<<3) #define SNLA_NODRAWCFRANUM (1<<4) +#define SNLA_NOSTRIPCURVES (1<<5) /* time->flag */ /* show timing in frames instead of in seconds */ diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h index 0760825670d..7325181ee14 100644 --- a/source/blender/makesdna/DNA_texture_types.h +++ b/source/blender/makesdna/DNA_texture_types.h @@ -256,8 +256,8 @@ typedef struct TexMapping { #define TEX_FILTER_MIN 8192 /* texfilter */ -// TXF_DEFAULT -> blender's old texture filtering method -#define TXF_DEFAULT 0 +// TXF_BOX -> blender's old texture filtering method +#define TXF_BOX 0 #define TXF_EWA 1 #define TXF_FELINE 2 #define TXF_AREA 3 diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index d8a943e1656..f61b4b2904d 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -293,7 +293,7 @@ typedef struct UserDef { short userpref, viewzoom; int mixbufsize; - int pad1; + int scrollback; /* console scrollback limit */ int dpi; /* range 48-128? */ short encoding; short transopts; @@ -404,9 +404,12 @@ extern UserDef U; /* from blenkernel blender.c */ #define AUTOKEY_MODE_EDITKEYS 5 /* Auto-Keying flag */ + /* U.autokey_flag */ #define AUTOKEY_FLAG_INSERTAVAIL (1<<0) #define AUTOKEY_FLAG_INSERTNEEDED (1<<1) #define AUTOKEY_FLAG_AUTOMATKEY (1<<2) + /* toolsettings->autokey_flag */ +#define ANIMRECORD_FLAG_WITHNLA (1<<10) /* transopts */ diff --git a/source/blender/makesdna/DNA_view2d_types.h b/source/blender/makesdna/DNA_view2d_types.h index dd73d691b62..bc019ef8121 100644 --- a/source/blender/makesdna/DNA_view2d_types.h +++ b/source/blender/makesdna/DNA_view2d_types.h @@ -59,15 +59,21 @@ typedef struct View2D { short around; /* pivot point for transforms (rotate and scale) */ float cursor[2]; /* only used in the UV view for now (for 2D-cursor) */ + + float *tab_offset; /* different offset per tab, for buttons */ + int tab_num; /* number of tabs stored */ + int tab_cur; /* current tab */ } View2D; /* ---------------------------------- */ /* view zooming restrictions, per axis (v2d->keepzoom) */ /* zoom is clamped to lie within limits set by minzoom and maxzoom */ -#define V2D_KEEPZOOM 0x0001 +#define V2D_LIMITZOOM 0x0001 /* aspect ratio is maintained on view resize */ #define V2D_KEEPASPECT 0x0002 + /* zoom is kept when the window resizes */ +#define V2D_KEEPZOOM 0x0004 /* zooming on x-axis is not allowed */ #define V2D_LOCKZOOM_X 0x0100 /* zooming on y-axis is not allowed */ @@ -78,6 +84,10 @@ typedef struct View2D { #define V2D_LOCKOFS_X (1<<1) /* panning on y-axis is not allowed */ #define V2D_LOCKOFS_Y (1<<2) + /* on resize, keep the x offset */ +#define V2D_KEEPOFS_X (1<<3) + /* on resize, keep the y offset */ +#define V2D_KEEPOFS_Y (1<<4) /* view extent restrictions (v2d->keeptot) */ /* 'cur' view can be out of extents of 'tot' */ diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index 895bc943e9f..b6a2b4c0544 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -171,6 +171,18 @@ typedef struct wmWindow { # # +typedef struct wmOperatorTypeMacro { + struct wmOperatorTypeMacro *next, *prev; + + /* operator id */ + char idname[MAX_ID_NAME]; + /* rna pointer to access properties, like keymap */ + struct PointerRNA *ptr; + +} wmOperatorTypeMacro; + +# +# typedef struct wmOperatorType { struct wmOperatorType *next, *prev; @@ -202,6 +214,9 @@ typedef struct wmOperatorType { /* rna for properties */ struct StructRNA *srna; + /* struct wmOperatorTypeMacro */ + ListBase macro; + short flag; /* pointer to modal keymap, do not free! */ @@ -227,6 +242,10 @@ typedef struct wmKeymapItem { short keymodifier; /* rawkey modifier */ short propvalue; /* if used, the item is from modal map */ + + short inactive; /* if set, deactivated item */ + short maptype; /* keymap editor */ + short pad2, pad3; } wmKeymapItem; @@ -259,9 +278,13 @@ typedef struct wmOperator { /* runtime */ wmOperatorType *type; /* operator type definition from idname */ void *customdata; /* custom storage, only while operator runs */ + struct PointerRNA *ptr; /* rna pointer to access properties */ struct ReportList *reports; /* errors and warnings storage */ + ListBase macro; /* list of operators, can be a tree */ + struct wmOperator *opm; /* current running macro, not saved */ + } wmOperator; /* operator type exec(), invoke() modal(), return values */ diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h index 31f0727cf73..64ff23dd1a8 100644 --- a/source/blender/makesdna/DNA_world_types.h +++ b/source/blender/makesdna/DNA_world_types.h @@ -32,7 +32,6 @@ #define DNA_WORLD_TYPES_H #include "DNA_ID.h" -#include "DNA_scriptlink_types.h" struct AnimData; struct Ipo; @@ -72,12 +71,12 @@ typedef struct World { /** * Gravitation constant for the game world */ - float gravity; // moved to scene->gamedata in 2.5 + float gravity; // XXX moved to scene->gamedata in 2.5 /** * Radius of the activity bubble, in Manhattan length. Objects * outside the box are activity-culled. */ - float activityBoxRadius; // moved to scene->gamedata in 2.5 + float activityBoxRadius; // XXX moved to scene->gamedata in 2.5 short skytype; /** @@ -90,9 +89,9 @@ typedef struct World { * bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling */ short mode; // partially moved to scene->gamedata in 2.5 - short occlusionRes; /* resolution of occlusion Z buffer in pixel */ // moved to scene->gamedata in 2.5 - short physicsEngine; /* here it's aligned */ // moved to scene->gamedata in 2.5 - short ticrate, maxlogicstep, physubstep, maxphystep; // moved to scene->gamedata in 2.5 + short occlusionRes; /* resolution of occlusion Z buffer in pixel */ // XXX moved to scene->gamedata in 2.5 + short physicsEngine; /* here it's aligned */ // XXX moved to scene->gamedata in 2.5 + short ticrate, maxlogicstep, physubstep, maxphystep; // XXX moved to scene->gamedata in 2.5 float misi, miststa, mistdist, misthi; @@ -124,8 +123,6 @@ typedef struct World { /* previews */ struct PreviewImage *preview; - ScriptLink scriptlink; - } World; /* **************** WORLD ********************* */ diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c index ffd164baaaf..cae28f163ed 100644 --- a/source/blender/makesdna/intern/makesdna.c +++ b/source/blender/makesdna/intern/makesdna.c @@ -76,7 +76,6 @@ char *includefiles[] = { "DNA_ID.h", "DNA_ipo_types.h", "DNA_key_types.h", - "DNA_scriptlink_types.h", "DNA_text_types.h", "DNA_packedFile_types.h", "DNA_camera_types.h", @@ -133,6 +132,7 @@ char *includefiles[] = { "DNA_windowmanager_types.h", "DNA_anim_types.h", "DNA_boid_types.h", + "DNA_smoke_types.h", // empty string to indicate end of includefiles "" @@ -485,15 +485,18 @@ static void *read_file_data(char *filename, int *len_r) data= MEM_mallocN(*len_r, "read_file_data"); if (!data) { *len_r= -1; + fclose(fp); return NULL; } if (fread(data, *len_r, 1, fp)!=1) { *len_r= -1; MEM_freeN(data); + fclose(fp); return NULL; } - + + fclose(fp); return data; } @@ -1105,7 +1108,6 @@ int main(int argc, char ** argv) #include "DNA_ID.h" #include "DNA_ipo_types.h" #include "DNA_key_types.h" -#include "DNA_scriptlink_types.h" #include "DNA_text_types.h" #include "DNA_packedFile_types.h" #include "DNA_camera_types.h" @@ -1156,4 +1158,5 @@ int main(int argc, char ** argv) #include "DNA_windowmanager_types.h" #include "DNA_anim_types.h" #include "DNA_boid_types.h" +#include "DNA_smoke_types.h" /* end of list */ diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 50ae05c8544..1b3175d7f55 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -221,6 +221,7 @@ extern StructRNA RNA_ID; extern StructRNA RNA_IDProperty; extern StructRNA RNA_IDPropertyGroup; extern StructRNA RNA_Image; +extern StructRNA RNA_ImagePaint; extern StructRNA RNA_ImageSequence; extern StructRNA RNA_ImageTexture; extern StructRNA RNA_ImageUser; @@ -338,7 +339,6 @@ extern StructRNA RNA_SceneRenderData; extern StructRNA RNA_SceneRenderLayer; extern StructRNA RNA_SceneSequence; extern StructRNA RNA_Screen; -extern StructRNA RNA_ScriptLink; extern StructRNA RNA_Sculpt; extern StructRNA RNA_Sensor; extern StructRNA RNA_Sequence; @@ -378,6 +378,7 @@ extern StructRNA RNA_ShapeKeyPoint; extern StructRNA RNA_ShrinkwrapConstraint; extern StructRNA RNA_ShrinkwrapModifier; extern StructRNA RNA_SimpleDeformModifier; +extern StructRNA RNA_SmokeModifier; extern StructRNA RNA_SmoothModifier; extern StructRNA RNA_SoftBodyModifier; extern StructRNA RNA_SoftBodySettings; @@ -478,7 +479,7 @@ extern StructRNA RNA_UserPreferencesLanguage; extern StructRNA RNA_UserPreferencesSystem; extern StructRNA RNA_UserPreferencesView; extern StructRNA RNA_UserSolidLight; -extern StructRNA RNA_VPaint; +extern StructRNA RNA_VertexPaint; extern StructRNA RNA_VectorFont; extern StructRNA RNA_VertexGroup; extern StructRNA RNA_VertexGroupElement; @@ -717,6 +718,7 @@ int RNA_string_length(PointerRNA *ptr, const char *name); void RNA_string_set(PointerRNA *ptr, const char *name, const char *value); PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name); +void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_value); void RNA_pointer_add(PointerRNA *ptr, const char *name); void RNA_collection_begin(PointerRNA *ptr, const char *name, CollectionPropertyIterator *iter); diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index 2592a1340ec..78e65e8fc06 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -41,6 +41,9 @@ extern EnumPropertyItem beztriple_interpolation_mode_items[]; extern EnumPropertyItem fmodifier_type_items[]; +extern EnumPropertyItem nla_mode_extend_items[]; +extern EnumPropertyItem nla_mode_blend_items[]; + extern EnumPropertyItem event_value_items[]; extern EnumPropertyItem event_type_items[]; diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index 243551b527e..a1e98ae8a17 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -85,6 +85,11 @@ typedef enum PropertyFlag { * for pointers and collections. */ PROP_EDITABLE = 1, + /* this property is editable even if it is lib linked, + * meaning it will get lost on reload, but it's useful + * for editing. */ + PROP_LIB_EXCEPTION = 65536, + /* animateable means the property can be driven by some * other input, be it animation curves, expressions, .. * properties are animateable by default except for pointers diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript index c0234d4b3e9..be5c3fcdfdf 100644 --- a/source/blender/makesrna/SConscript +++ b/source/blender/makesrna/SConscript @@ -34,4 +34,7 @@ if env['WITH_BF_QUICKTIME']: if env['WITH_BF_LCMS']: defs.append('WITH_LCMS') +if env['WITH_BF_GAMEENGINE']: + defs.append('GAMEBLENDER=1') + env.BlenderLib ( 'bf_rna', objs, Split(incs), defines=defs, libtype=['core'], priority = [195] ) diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript index 7f6870f617c..11504ec8391 100644 --- a/source/blender/makesrna/intern/SConscript +++ b/source/blender/makesrna/intern/SConscript @@ -56,6 +56,9 @@ if env['WITH_BF_QUICKTIME']: if env['WITH_BF_LCMS']: defs.append('WITH_LCMS') +if env['WITH_BF_GAMEENGINE']: + defs.append('GAMEBLENDER=1') + makesrna_tool.Append(CPPDEFINES=defs) makesrna_tool.Append (CPPPATH = Split(incs)) diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 81c4642f4d5..b5fc4d2e463 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -1938,9 +1938,10 @@ RNAProcessItem PROCESS_ITEMS[]= { {"rna_render.c", NULL, RNA_def_render}, {"rna_scene.c", NULL, RNA_def_scene}, {"rna_screen.c", NULL, RNA_def_screen}, - {"rna_scriptlink.c", NULL, RNA_def_scriptlink}, + {"rna_sculpt_paint.c", NULL, RNA_def_sculpt_paint}, {"rna_sensor.c", NULL, RNA_def_sensor}, {"rna_sequence.c", NULL, RNA_def_sequence}, + {"rna_smoke.c", NULL, RNA_def_smoke}, {"rna_space.c", NULL, RNA_def_space}, {"rna_text.c", NULL, RNA_def_text}, {"rna_timeline.c", NULL, RNA_def_timeline_marker}, @@ -1948,7 +1949,6 @@ RNAProcessItem PROCESS_ITEMS[]= { {"rna_ui.c", "rna_ui_api.c", RNA_def_ui}, {"rna_userdef.c", NULL, RNA_def_userdef}, {"rna_vfont.c", NULL, RNA_def_vfont}, - {"rna_vpaint.c", NULL, RNA_def_vpaint}, {"rna_wm.c", "rna_wm_api.c", RNA_def_wm}, {"rna_world.c", NULL, RNA_def_world}, {NULL, NULL}}; diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index 7d8bab8bee8..cf3d59f78a0 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -67,7 +67,6 @@ short RNA_type_to_ID_code(StructRNA *type) if(RNA_struct_is_a(type, &RNA_Curve)) return ID_CU; if(RNA_struct_is_a(type, &RNA_Group)) return ID_GR; if(RNA_struct_is_a(type, &RNA_Image)) return ID_IM; - //if(RNA_struct_is_a(type, &RNA_Ipo)) return case ID_IP; if(RNA_struct_is_a(type, &RNA_Key)) return ID_KE; if(RNA_struct_is_a(type, &RNA_Lamp)) return ID_LA; if(RNA_struct_is_a(type, &RNA_Library)) return ID_LI; @@ -100,7 +99,6 @@ StructRNA *ID_code_to_RNA_type(short idcode) case ID_CU: return &RNA_Curve; case ID_GR: return &RNA_Group; case ID_IM: return &RNA_Image; - //case ID_IP: return &RNA_Ipo; case ID_KE: return &RNA_Key; case ID_LA: return &RNA_Lamp; case ID_LI: return &RNA_Library; diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index d9d4852a72c..b0db6ae9de5 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -752,7 +752,7 @@ int RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop) id= ptr->id.data; - return (flag & PROP_EDITABLE) && (!id || !id->lib); + return (flag & PROP_EDITABLE) && (!id || !id->lib || (flag & PROP_LIB_EXCEPTION)); } int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop) @@ -2524,6 +2524,18 @@ PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name) } } +void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_value) +{ + PropertyRNA *prop= RNA_struct_find_property(ptr, name); + + if(prop) { + RNA_property_pointer_set(ptr, prop, ptr_value); + } + else { + printf("RNA_pointer_set: %s.%s not found.\n", ptr->type->identifier, name); + } +} + void RNA_pointer_add(PointerRNA *ptr, const char *name) { PropertyRNA *prop= RNA_struct_find_property(ptr, name); diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c index 3469d716853..e334e2b5e90 100644 --- a/source/blender/makesrna/intern/rna_animation.c +++ b/source/blender/makesrna/intern/rna_animation.c @@ -26,6 +26,7 @@ #include "RNA_define.h" #include "RNA_types.h" +#include "RNA_enum_types.h" #include "rna_internal.h" @@ -37,6 +38,17 @@ #ifdef RNA_RUNTIME +static int rna_AnimData_action_editable(PointerRNA *ptr) +{ + AnimData *adt= (AnimData *)ptr->data; + + /* active action is only editable when it is not a tweaking strip */ + if ((adt->flag & ADT_NLA_EDIT_ON) || (adt->actstrip) || (adt->tmpact)) + return 0; + else + return 1; +} + static void rna_ksPath_RnaPath_get(PointerRNA *ptr, char *value) { KS_Path *ksp= (KS_Path *)ptr->data; @@ -187,9 +199,27 @@ void rna_def_animdata(BlenderRNA *brna) RNA_def_property_struct_type(prop, "NlaTrack"); RNA_def_property_ui_text(prop, "NLA Tracks", "NLA Tracks (i.e. Animation Layers)."); - /* Action */ + /* Active Action */ prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE); - RNA_def_property_ui_text(prop, "Action", "Active Action for this datablock."); + RNA_def_property_ui_text(prop, "Action", "Active Action for this datablock."); + RNA_def_property_editable_func(prop, "rna_AnimData_action_editable"); + + /* Active Action Settings */ + prop= RNA_def_property(srna, "action_extrapolation", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "act_extendmode"); + RNA_def_property_enum_items(prop, nla_mode_extend_items); + RNA_def_property_ui_text(prop, "Action Extrapolation", "Action to take for gaps past the Active Action's range (when evaluating with NLA)."); + + prop= RNA_def_property(srna, "action_blending", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "act_blendmode"); + RNA_def_property_enum_items(prop, nla_mode_blend_items); + RNA_def_property_ui_text(prop, "Action Blending", "Method used for combining Active Action's result with result of NLA stack."); + + prop= RNA_def_property(srna, "action_influence", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "act_influence"); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Action Influence", "Amount the Active Action contributes to the result of the NLA stack."); /* Drivers */ prop= RNA_def_property(srna, "drivers", PROP_COLLECTION, PROP_NONE); @@ -197,7 +227,10 @@ void rna_def_animdata(BlenderRNA *brna) RNA_def_property_struct_type(prop, "FCurve"); RNA_def_property_ui_text(prop, "Drivers", "The Drivers/Expressions for this datablock."); - /* Settings */ + /* General Settings */ + prop= RNA_def_property(srna, "nla_enabled", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ADT_NLA_EVAL_OFF); + RNA_def_property_ui_text(prop, "NLA Evaluation Enabled", "NLA stack is evaluated when evaluating this block."); } /* --- */ diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c index d98c7235c35..cf20e92b289 100644 --- a/source/blender/makesrna/intern/rna_armature.c +++ b/source/blender/makesrna/intern/rna_armature.c @@ -157,6 +157,19 @@ static void rna_EditBone_name_set(PointerRNA *ptr, const char *value) ED_armature_bone_rename(arm, oldname, newname); } +static void rna_Bone_name_set(PointerRNA *ptr, const char *value) +{ + bArmature *arm= (bArmature*)ptr->id.data; + Bone *bone= (Bone*)ptr->data; + char oldname[32], newname[32]; + + /* need to be on the stack */ + BLI_strncpy(newname, value, 32); + BLI_strncpy(oldname, bone->name, 32); + + ED_armature_bone_rename(arm, oldname, newname); +} + static void rna_EditBone_layer_get(PointerRNA *ptr, int values[16]) { EditBone *data= (EditBone*)(ptr->data); @@ -320,6 +333,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone) RNA_def_property_ui_text(prop, "Name", ""); RNA_def_struct_name_property(srna, prop); if(editbone) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_EditBone_name_set"); + else RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Bone_name_set"); RNA_def_property_update(prop, 0, "rna_Armature_redraw_data"); /* flags */ @@ -573,6 +587,7 @@ void rna_def_armature(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Visible Layers", "Armature layer visibility."); RNA_def_property_boolean_funcs(prop, NULL, "rna_Armature_layer_set"); RNA_def_property_update(prop, NC_OBJECT|ND_POSE, NULL); + RNA_def_property_flag(prop, PROP_LIB_EXCEPTION); /* layer protection */ prop= RNA_def_property(srna, "layer_protection", PROP_BOOLEAN, PROP_NONE); @@ -585,7 +600,7 @@ void rna_def_armature(BlenderRNA *brna) prop= RNA_def_property(srna, "rest_position", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_RESTPOS); RNA_def_property_ui_text(prop, "Rest Position", "Show Armature in Rest Position. No posing possible."); - RNA_def_property_update(prop, 0, "rna_Armature_redraw_data"); + RNA_def_property_update(prop, 0, "rna_Armature_update_data"); prop= RNA_def_property(srna, "draw_axes", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DRAWAXES); @@ -600,7 +615,7 @@ void rna_def_armature(BlenderRNA *brna) prop= RNA_def_property(srna, "delay_deform", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DELAYDEFORM); RNA_def_property_ui_text(prop, "Delay Deform", "Don't deform children when manipulating bones in Pose Mode"); - RNA_def_property_update(prop, 0, "rna_Armature_redraw_data"); + RNA_def_property_update(prop, 0, "rna_Armature_update_data"); prop= RNA_def_property(srna, "x_axis_mirror", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_MIRROR_EDIT); diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index 8089d2e8b38..2bb4333365b 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -46,29 +46,32 @@ static void rna_Brush_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *p static PointerRNA rna_Brush_active_texture_get(PointerRNA *ptr) { - Brush *brush= (Brush*)ptr->data; - return rna_pointer_inherit_refine(ptr, &RNA_TextureSlot, brush->mtex[(int)brush->texact]); + Brush *br= (Brush*)ptr->data; + Tex *tex; + + tex= (br->mtex[(int)br->texact])? br->mtex[(int)br->texact]->tex: NULL; + return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex); } -static void rna_Brush_active_texture_index_set(PointerRNA *ptr, int value) +static void rna_Brush_active_texture_set(PointerRNA *ptr, PointerRNA value) { - Brush *brush= (Brush*)ptr->data; - int act= brush->texact; - - if(value == act || value < 0 || value >= MAX_MTEX) - return; - - /* auto create/free mtex on activate/deactive, so we can edit - * the texture pointer in the buttons UI. */ - if(brush->mtex[act] && !brush->mtex[act]->tex) { - MEM_freeN(brush->mtex[act]); - brush->mtex[act]= NULL; + Brush *br= (Brush*)ptr->data; + int act= br->texact; + + if(br->mtex[act] && br->mtex[act]->tex) + id_us_min(&br->mtex[act]->tex->id); + + if(value.data) { + if(!br->mtex[act]) + br->mtex[act]= add_mtex(); + + br->mtex[act]->tex= value.data; + id_us_plus(&br->mtex[act]->tex->id); + } + else if(br->mtex[act]) { + MEM_freeN(br->mtex[act]); + br->mtex[act]= NULL; } - - brush->texact= value; - - if(!brush->mtex[value]) - brush->mtex[value]= add_mtex(); } static float rna_Brush_rotation_get(PointerRNA *ptr) @@ -179,7 +182,7 @@ void rna_def_brush(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_TORUS); RNA_def_property_ui_text(prop, "Wrap", "Enable torus wrapping while painting."); - prop= RNA_def_property(srna, "alpha_pressure", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "opacity_pressure", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_ALPHA_PRESSURE); RNA_def_property_ui_text(prop, "Opacity Pressure", "Enable tablet pressure sensitivity for opacity."); @@ -224,7 +227,8 @@ void rna_def_brush(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Curve", "Editable falloff curve."); /* texture */ - rna_def_mtex_common(srna, "rna_Brush_mtex_begin", "rna_Brush_active_texture_get", "rna_Brush_active_texture_index_set", "TextureSlot"); + rna_def_mtex_common(srna, "rna_Brush_mtex_begin", "rna_Brush_active_texture_get", + "rna_Brush_active_texture_set", "TextureSlot"); /* clone tool */ prop= RNA_def_property(srna, "clone_image", PROP_POINTER, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c index d84d6f159d8..d08e59c11dc 100644 --- a/source/blender/makesrna/intern/rna_constraint.c +++ b/source/blender/makesrna/intern/rna_constraint.c @@ -141,7 +141,21 @@ StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr) static char *rna_Constraint_path(PointerRNA *ptr) { - return BLI_sprintfN("constraints[%s]", ((bConstraint*)ptr->data)->name); + Object *ob= ptr->id.data; + bConstraint *con= ptr->data; + bPoseChannel *pchan= get_active_posechannel(ob); + ListBase *actlist= get_active_constraints(ob); + short inList = 0; + + /* check if constraint is in the given list */ + if (actlist) + inList= (BLI_findindex(actlist, con) != -1); + + /* if constraint is in the list, the list is for the active bone... */ + if ((inList) && (actlist != &ob->constraints) && (pchan)) + return BLI_sprintfN("pose.pose_channels[\"%s\"].constraints[\"%s\"]", pchan->name, con->name); + else + return BLI_sprintfN("constraints[\"%s\"]", con->name); } static void rna_Constraint_update(bContext *C, PointerRNA *ptr) @@ -906,6 +920,11 @@ static void rna_def_constraint_stretch_to(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Target", "Target Object"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update"); + + prop= RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "subtarget"); + RNA_def_property_ui_text(prop, "Sub-Target", ""); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update"); prop= RNA_def_property(srna, "volume", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "volmode"); diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index faf6c3a1f75..92b4dead516 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -33,6 +33,8 @@ #include "DNA_material_types.h" #include "DNA_scene_types.h" +#include "BKE_font.h" + EnumPropertyItem beztriple_handle_type_items[] = { {HD_FREE, "FREE", 0, "Free", ""}, {HD_AUTO, "AUTO", 0, "Auto", ""}, @@ -52,6 +54,10 @@ EnumPropertyItem beztriple_interpolation_mode_items[] = { #include "DNA_object_types.h" #include "BKE_curve.h" +#include "BKE_depsgraph.h" + +#include "WM_api.h" +#include "WM_types.h" StructRNA *rna_Curve_refine(PointerRNA *ptr) { @@ -142,6 +148,15 @@ static void rna_BPoint_array_begin(CollectionPropertyIterator *iter, PointerRNA rna_iterator_array_begin(iter, (void*)nu->bp, sizeof(BPoint*), nu->pntsv>0 ? nu->pntsu*nu->pntsv : nu->pntsu, 0, NULL); } +static void rna_Curve_update(bContext *C, PointerRNA *ptr) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, scene); +} + #else static void rna_def_bpoint(BlenderRNA *brna) @@ -157,32 +172,38 @@ static void rna_def_bpoint(BlenderRNA *brna) prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "f1", 0); RNA_def_property_ui_text(prop, "Selected", "Selection status"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "hide", 0); RNA_def_property_ui_text(prop, "Hidden", "Visibility status"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); /* Vector value */ prop= RNA_def_property(srna, "point", PROP_FLOAT, PROP_VECTOR); RNA_def_property_array(prop, 4); RNA_def_property_float_sdna(prop, NULL, "vec"); RNA_def_property_ui_text(prop, "Point", "Point coordinates"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); /* Number values */ prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "alfa"); /*RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ RNA_def_property_ui_text(prop, "Tilt", "Tilt in 3d View"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.01f, 100.0f); RNA_def_property_ui_text(prop, "Weight", "Softbody goal weight"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "bevel_radius", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "radius"); /*RNA_def_property_range(prop, 0.0f, 1.0f);*/ RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Bevel Radius", "Radius for bevelling"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); } static void rna_def_beztriple(BlenderRNA *brna) @@ -198,67 +219,80 @@ static void rna_def_beztriple(BlenderRNA *brna) prop= RNA_def_property(srna, "selected_handle1", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "f1", 0); RNA_def_property_ui_text(prop, "Handle 1 selected", "Handle 1 selection status"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "selected_handle2", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "f3", 0); RNA_def_property_ui_text(prop, "Handle 2 selected", "Handle 2 selection status"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "selected_control_point", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "f2", 0); RNA_def_property_ui_text(prop, "Control Point selected", "Control point selection status"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "hide", 0); RNA_def_property_ui_text(prop, "Hidden", "Visibility status"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); /* Enums */ prop= RNA_def_property(srna, "handle1_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "h1"); RNA_def_property_enum_items(prop, beztriple_handle_type_items); RNA_def_property_ui_text(prop, "Handle 1 Type", "Handle types"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "handle2_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "h2"); RNA_def_property_enum_items(prop, beztriple_handle_type_items); RNA_def_property_ui_text(prop, "Handle 2 Type", "Handle types"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "ipo"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_enum_items(prop, beztriple_interpolation_mode_items); RNA_def_property_ui_text(prop, "Interpolation", "(For F-Curves Only) Interpolation to use for segment of curve starting from current BezTriple."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); /* Vector values */ prop= RNA_def_property(srna, "handle1", PROP_FLOAT, PROP_VECTOR); RNA_def_property_array(prop, 3); RNA_def_property_float_funcs(prop, "rna_BezTriple_handle1_get", "rna_BezTriple_handle1_set", NULL); RNA_def_property_ui_text(prop, "Handle 1", "Coordinates of the first handle"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "control_point", PROP_FLOAT, PROP_VECTOR); RNA_def_property_array(prop, 3); RNA_def_property_float_funcs(prop, "rna_BezTriple_ctrlpoint_get", "rna_BezTriple_ctrlpoint_set", NULL); RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "handle2", PROP_FLOAT, PROP_VECTOR); RNA_def_property_array(prop, 3); RNA_def_property_float_funcs(prop, "rna_BezTriple_handle2_get", "rna_BezTriple_handle2_set", NULL); RNA_def_property_ui_text(prop, "Handle 2", "Coordinates of the second handle"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); /* Number values */ prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "alfa"); /*RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ RNA_def_property_ui_text(prop, "Tilt", "Tilt in 3d View"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.01f, 100.0f); RNA_def_property_ui_text(prop, "Weight", "Softbody goal weight"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "bevel_radius", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "radius"); /*RNA_def_property_range(prop, 0.0f, 1.0f);*/ RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Bevel Radius", "Radius for bevelling"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); } static void rna_def_path(BlenderRNA *brna, StructRNA *srna) @@ -270,23 +304,28 @@ static void rna_def_path(BlenderRNA *brna, StructRNA *srna) RNA_def_property_int_sdna(prop, NULL, "pathlen"); RNA_def_property_range(prop, 1, 32767); RNA_def_property_ui_text(prop, "Path Length", "If no speed IPO was set, the length of path in frames."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); /* flags */ prop= RNA_def_property(srna, "path", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_PATH); RNA_def_property_ui_text(prop, "Path", "Enable the curve to become a translation path."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "follow", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FOLLOW); RNA_def_property_ui_text(prop, "Follow", "Make curve path children to rotate along the path."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "stretch", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_STRETCH); RNA_def_property_ui_text(prop, "Stretch", "Option for curve-deform: makes deformed child to stretch along entire path."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "offset_path_distance", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_OFFS_PATHDIST); RNA_def_property_ui_text(prop, "Offset Path Distance", "Children will use TimeOffs value as path distance offset."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); } static void rna_def_nurbs(BlenderRNA *brna, StructRNA *srna) @@ -297,10 +336,12 @@ static void rna_def_nurbs(BlenderRNA *brna, StructRNA *srna) prop= RNA_def_property(srna, "uv_orco", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO); RNA_def_property_ui_text(prop, "UV Orco", "Forces to use UV coordinates for texture mapping 'orco'."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "vertex_normal_flip", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CU_NOPUNOFLIP); RNA_def_property_ui_text(prop, "Vertex Normal Flip", "Flip vertex normals towards the camera during render"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); } static void rna_def_font(BlenderRNA *brna, StructRNA *srna) @@ -319,52 +360,62 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna) prop= RNA_def_property(srna, "spacemode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, prop_align_items); RNA_def_property_ui_text(prop, "Text Align", "Text align from the object center."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); /* number values */ prop= RNA_def_property(srna, "text_size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "fsize"); RNA_def_property_range(prop, 0.1f, 10.0f); RNA_def_property_ui_text(prop, "Font size", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "line_dist", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "linedist"); RNA_def_property_range(prop, 0.0f, 10.0f); RNA_def_property_ui_text(prop, "Distance between lines of text", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "word_spacing", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "wordspace"); RNA_def_property_range(prop, 0.0f, 10.0f); RNA_def_property_ui_text(prop, "Spacing between words", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "spacing", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "spacing"); RNA_def_property_range(prop, 0.0f, 10.0f); RNA_def_property_ui_text(prop, "Global spacing between characters", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "shear", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "shear"); RNA_def_property_range(prop, -1.0f, 1.0f); RNA_def_property_ui_text(prop, "Shear", "Italic angle of the characters"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "x_offset", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "xof"); RNA_def_property_range(prop, -50.0f, 50.0f); RNA_def_property_ui_text(prop, "X Offset", "Horizontal offset from the object center"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "y_offset", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "yof"); RNA_def_property_range(prop, -50.0f, 50.0f); RNA_def_property_ui_text(prop, "Y Offset", "Vertical offset from the object center"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "ul_position", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "ulpos"); RNA_def_property_range(prop, -0.2f, 0.8f); RNA_def_property_ui_text(prop, "Underline position", "Vertical position of underline"); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "ul_height", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "ulheight"); RNA_def_property_range(prop, -0.2f, 0.8f); RNA_def_property_ui_text(prop, "Underline thickness", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "active_textbox", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "actbox"); @@ -375,6 +426,7 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna) prop= RNA_def_property(srna, "family", PROP_STRING, PROP_NONE); RNA_def_property_string_maxlength(prop, 21); RNA_def_property_ui_text(prop, "Family", "Blender uses font from selfmade objects."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "str", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "str"); @@ -388,14 +440,17 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna) RNA_def_property_pointer_sdna(prop, NULL, "textoncurve"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Text on Curve", "Curve deforming text object."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "font", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "vfont"); RNA_def_property_ui_text(prop, "Font", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "textbox", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "tb"); RNA_def_property_ui_text(prop, "Textbox", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "edit_format", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "curinfo"); @@ -420,21 +475,25 @@ static void rna_def_textbox(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "x"); RNA_def_property_range(prop, -50.0f, 50.0f); RNA_def_property_ui_text(prop, "Textbox X Offset", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "y", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "y"); RNA_def_property_range(prop, -50.0f, 50.0f); RNA_def_property_ui_text(prop, "Textbox Y Offset", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "w"); RNA_def_property_range(prop, 0.0f, 50.0f); RNA_def_property_ui_text(prop, "Textbox Width", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "h"); RNA_def_property_range(prop, 0.0f, 50.0f); RNA_def_property_ui_text(prop, "Textbox Height", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); } static void rna_def_charinfo(BlenderRNA *brna) @@ -450,22 +509,27 @@ static void rna_def_charinfo(BlenderRNA *brna) prop= RNA_def_property(srna, "style", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_STYLE); RNA_def_property_ui_text(prop, "Style", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "bold", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_BOLD); RNA_def_property_ui_text(prop, "Bold", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "italic", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_ITALIC); RNA_def_property_ui_text(prop, "Italic", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "underline", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UNDERLINE); RNA_def_property_ui_text(prop, "Underline", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "wrap", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_WRAP); RNA_def_property_ui_text(prop, "Wrap", ""); + RNA_def_property_update(prop, 0, "rna_Curve_update"); } static void rna_def_surface(BlenderRNA *brna) @@ -523,31 +587,37 @@ static void rna_def_curve(BlenderRNA *brna) RNA_def_property_range(prop, 0, 32); RNA_def_property_ui_range(prop, 0, 32, 1.0, 0); RNA_def_property_ui_text(prop, "Bevel Resolution", "Bevel resolution when depth is non-zero and no specific bevel object has been defined."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "width", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "width"); RNA_def_property_ui_range(prop, 0, 2.0, 0.1, 0); RNA_def_property_ui_text(prop, "Width", "Scale the original width (1.0) based on given factor."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "extrude", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "ext1"); RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 0); RNA_def_property_ui_text(prop, "Extrude", "Amount of curve extrusion when not using a bevel object."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "bevel_depth", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "ext2"); RNA_def_property_ui_range(prop, 0, 100.0, 0.1, 0); RNA_def_property_ui_text(prop, "Bevel Depth", "Bevel depth when not using a bevel object."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "resolution_u", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "resolu"); RNA_def_property_ui_range(prop, 1, 1024, 1, 0); RNA_def_property_ui_text(prop, "Resolution U", "Surface resolution in U direction."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "resolution_v", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "resolv"); RNA_def_property_ui_range(prop, 1, 1024, 1, 0); RNA_def_property_ui_text(prop, "Resolution V", "Surface resolution in V direction."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "render_resolution_u", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "resolu_ren"); @@ -563,34 +633,41 @@ static void rna_def_curve(BlenderRNA *brna) prop= RNA_def_property(srna, "eval_time", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "ctime"); RNA_def_property_ui_text(prop, "Evaluation Time", "Parametric position along the length of the curve that Objects 'following' it should be at."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); /* pointers */ prop= RNA_def_property(srna, "bevel_object", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "bevobj"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Bevel Object", "Curve object name that defines the bevel shape."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "taper_object", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "taperobj"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Taper Object", "Curve object name that defines the taper (width)."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); /* Flags */ prop= RNA_def_property(srna, "curve_2d", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CU_3D); RNA_def_property_ui_text(prop, "2D Curve", "Define curve in two dimensions only. Note that fill only works when this is enabled."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "front", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FRONT); RNA_def_property_ui_text(prop, "Front", "Draw filled front for extruded/beveled curves."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "back", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_BACK); RNA_def_property_ui_text(prop, "Back", "Draw filled back for extruded/beveled curves."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); prop= RNA_def_property(srna, "retopo", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_RETOPO); RNA_def_property_ui_text(prop, "Retopo", "Turn on the re-topology tool."); + RNA_def_property_update(prop, 0, "rna_Curve_update"); } static void rna_def_curve_nurb(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c index 2530f452393..42c6f74b6ec 100644 --- a/source/blender/makesrna/intern/rna_define.c +++ b/source/blender/makesrna/intern/rna_define.c @@ -723,7 +723,7 @@ void RNA_def_struct_nested(BlenderRNA *brna, StructRNA *srna, const char *struct break; if(!srnafrom) { - fprintf(stderr, "RNA_def_struct_nested: struct %s not found.\n", structname); + fprintf(stderr, "RNA_def_struct_nested: struct %s not found for %s.\n", structname, srna->identifier); DefRNA.error= 1; } @@ -2326,9 +2326,12 @@ void RNA_enum_items_add(EnumPropertyItem **items, int *totitem, EnumPropertyItem void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, EnumPropertyItem *item, int value) { - for(; item->identifier; item++) - if(item->value == value) + for(; item->identifier; item++) { + if(item->value == value) { RNA_enum_item_add(items, totitem, item); + break; // break on first match - does this break anything? (is quick hack to get object->parent_type working ok for armature/lattice) + } + } } void RNA_enum_item_end(EnumPropertyItem **items, int *totitem) diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 8bc1fcaf926..99f527f8875 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -151,9 +151,10 @@ void RNA_def_render(struct BlenderRNA *brna); void RNA_def_rna(struct BlenderRNA *brna); void RNA_def_scene(struct BlenderRNA *brna); void RNA_def_screen(struct BlenderRNA *brna); -void RNA_def_scriptlink(struct BlenderRNA *brna); +void RNA_def_sculpt_paint(struct BlenderRNA *brna); void RNA_def_sensor(struct BlenderRNA *brna); void RNA_def_sequence(struct BlenderRNA *brna); +void RNA_def_smoke(struct BlenderRNA *brna); void RNA_def_space(struct BlenderRNA *brna); void RNA_def_text(struct BlenderRNA *brna); void RNA_def_texture(struct BlenderRNA *brna); @@ -162,7 +163,6 @@ void RNA_def_sound(struct BlenderRNA *brna); void RNA_def_ui(struct BlenderRNA *brna); void RNA_def_userdef(struct BlenderRNA *brna); void RNA_def_vfont(struct BlenderRNA *brna); -void RNA_def_vpaint(struct BlenderRNA *brna); void RNA_def_wm(struct BlenderRNA *brna); void RNA_def_world(struct BlenderRNA *brna); diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c index 7297ee8cb97..216a1d05079 100644 --- a/source/blender/makesrna/intern/rna_key.c +++ b/source/blender/makesrna/intern/rna_key.c @@ -47,6 +47,21 @@ #include "WM_api.h" #include "WM_types.h" +static void rna_ShapeKey_value_set(PointerRNA *ptr, float value) +{ + KeyBlock *data= (KeyBlock*)ptr->data; + CLAMP(value, data->slidermin, data->slidermax); + data->curval= value; +} + +static void rna_ShapeKey_value_range(PointerRNA *ptr, float *min, float *max) +{ + KeyBlock *data= (KeyBlock*)ptr->data; + + *min= data->slidermin; + *max= data->slidermax; +} + static Key *rna_ShapeKey_find_key(ID *id) { switch(GS(id->name)) { @@ -345,6 +360,7 @@ static void rna_def_keyblock(BlenderRNA *brna) /* for now, this is editable directly, as users can set this even if they're not animating them (to test results) */ prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "curval"); + RNA_def_property_float_funcs(prop, NULL, "rna_ShapeKey_value_set", "rna_ShapeKey_value_range"); RNA_def_property_ui_text(prop, "Value", "Value of shape key at the current frame."); RNA_def_property_update(prop, 0, "rna_Key_update_data"); @@ -380,6 +396,7 @@ static void rna_def_keyblock(BlenderRNA *brna) prop= RNA_def_property(srna, "slider_max", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "slidermax"); RNA_def_property_range(prop, -10.0f, 10.0f); + RNA_def_property_float_default(prop, 1.0f); RNA_def_property_ui_text(prop, "Slider Max", "Maximum for slider."); prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c index fe14870cf6f..299bd37496b 100644 --- a/source/blender/makesrna/intern/rna_lamp.c +++ b/source/blender/makesrna/intern/rna_lamp.c @@ -64,30 +64,33 @@ static void rna_Lamp_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *pt static PointerRNA rna_Lamp_active_texture_get(PointerRNA *ptr) { Lamp *la= (Lamp*)ptr->data; - return rna_pointer_inherit_refine(ptr, &RNA_TextureSlot, la->mtex[(int)la->texact]); + Tex *tex; + + tex= (la->mtex[(int)la->texact])? la->mtex[(int)la->texact]->tex: NULL; + return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex); } -static void rna_Lamp_active_texture_index_set(PointerRNA *ptr, int value) +static void rna_Lamp_active_texture_set(PointerRNA *ptr, PointerRNA value) { Lamp *la= (Lamp*)ptr->data; int act= la->texact; - if(value == act || value < 0 || value >= MAX_MTEX) - return; + if(la->mtex[act] && la->mtex[act]->tex) + id_us_min(&la->mtex[act]->tex->id); - /* auto create/free mtex on activate/deactive, so we can edit - * the texture pointer in the buttons UI. */ - if(la->mtex[act] && !la->mtex[act]->tex) { + if(value.data) { + if(!la->mtex[act]) { + la->mtex[act]= add_mtex(); + la->mtex[act]->texco= TEXCO_GLOB; + } + + la->mtex[act]->tex= value.data; + id_us_plus(&la->mtex[act]->tex->id); + } + else if(la->mtex[act]) { MEM_freeN(la->mtex[act]); la->mtex[act]= NULL; } - - la->texact= value; - - if(!la->mtex[value]) { - la->mtex[value]= add_mtex(); - la->mtex[value]->texco= TEXCO_GLOB; - } } static StructRNA* rna_Lamp_refine(struct PointerRNA *ptr) @@ -349,13 +352,8 @@ static void rna_def_lamp(BlenderRNA *brna) RNA_def_property_update(prop, NC_LAMP|ND_LIGHTING, NULL); /* textures */ - rna_def_mtex_common(srna, "rna_Lamp_mtex_begin", "rna_Lamp_active_texture_get", "rna_Lamp_active_texture_index_set", "LampTextureSlot"); - - /* script link */ - prop= RNA_def_property(srna, "script_link", PROP_POINTER, PROP_NEVER_NULL); - RNA_def_property_pointer_sdna(prop, NULL, "scriptlink"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Script Link", "Scripts linked to this lamp."); + rna_def_mtex_common(srna, "rna_Lamp_mtex_begin", "rna_Lamp_active_texture_get", + "rna_Lamp_active_texture_set", "LampTextureSlot"); } static void rna_def_lamp_falloff(StructRNA *srna) diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index fd54dd959b2..87efe6c39c0 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -85,28 +85,31 @@ static void rna_Material_mtex_begin(CollectionPropertyIterator *iter, PointerRNA static PointerRNA rna_Material_active_texture_get(PointerRNA *ptr) { Material *ma= (Material*)ptr->data; - return rna_pointer_inherit_refine(ptr, &RNA_TextureSlot, ma->mtex[(int)ma->texact]); + Tex *tex; + + tex= (ma->mtex[(int)ma->texact])? ma->mtex[(int)ma->texact]->tex: NULL; + return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex); } -static void rna_Material_active_texture_index_set(PointerRNA *ptr, int value) +static void rna_Material_active_texture_set(PointerRNA *ptr, PointerRNA value) { Material *ma= (Material*)ptr->data; int act= ma->texact; - if(value == act || value < 0 || value >= MAX_MTEX) - return; + if(ma->mtex[act] && ma->mtex[act]->tex) + id_us_min(&ma->mtex[act]->tex->id); - /* auto create/free mtex on activate/deactive, so we can edit - * the texture pointer in the buttons UI. */ - if(ma->mtex[act] && !ma->mtex[act]->tex) { + if(value.data) { + if(!ma->mtex[act]) + ma->mtex[act]= add_mtex(); + + ma->mtex[act]->tex= value.data; + id_us_plus(&ma->mtex[act]->tex->id); + } + else if(ma->mtex[act]) { MEM_freeN(ma->mtex[act]); ma->mtex[act]= NULL; } - - ma->texact= value; - - if(!ma->mtex[value]) - ma->mtex[value]= add_mtex(); } static void rna_MaterialStrand_start_size_range(PointerRNA *ptr, float *min, float *max) @@ -166,6 +169,28 @@ static void rna_MaterialTextureSlot_enabled_set(PointerRNA *ptr, int value) } } +static void rna_Material_use_diffuse_ramp_set(PointerRNA *ptr, int value) +{ + Material *ma= (Material*)ptr->data; + + if(value) ma->mode |= MA_RAMP_COL; + else ma->mode &= ~MA_RAMP_COL; + + if((ma->mode & MA_RAMP_COL) && ma->ramp_col == NULL) + ma->ramp_col= add_colorband(0); +} + +static void rna_Material_use_specular_ramp_set(PointerRNA *ptr, int value) +{ + Material *ma= (Material*)ptr->data; + + if(value) ma->mode |= MA_RAMP_SPEC; + else ma->mode &= ~MA_RAMP_SPEC; + + if((ma->mode & MA_RAMP_SPEC) && ma->ramp_spec == NULL) + ma->ramp_spec= add_colorband(0); +} + #else static void rna_def_material_mtex(BlenderRNA *brna) @@ -452,6 +477,32 @@ static void rna_def_material_mtex(BlenderRNA *brna) static void rna_def_material_colors(StructRNA *srna) { PropertyRNA *prop; + + static EnumPropertyItem prop_ramp_blend_diffuse_items[] = { + {MA_RAMP_BLEND, "MIX", 0, "Mix", ""}, + {MA_RAMP_ADD, "ADD", 0, "Add", ""}, + {MA_RAMP_MULT, "MULTIPLY", 0, "Multiply", ""}, + {MA_RAMP_SUB, "SUBTRACT", 0, "Subtract", ""}, + {MA_RAMP_SCREEN, "SCREEN", 0, "Screen", ""}, + {MA_RAMP_DIV, "DIVIDE", 0, "Divide", ""}, + {MA_RAMP_DIFF, "DIFFERENCE", 0, "Difference", ""}, + {MA_RAMP_DARK, "DARKEN", 0, "Darken", ""}, + {MA_RAMP_LIGHT, "LIGHTEN", 0, "Lighten", ""}, + {MA_RAMP_OVERLAY, "OVERLAY", 0, "Overlay", ""}, + {MA_RAMP_DODGE, "DODGE", 0, "Dodge", ""}, + {MA_RAMP_BURN, "BURN", 0, "Burn", ""}, + {MA_RAMP_HUE, "HUE", 0, "Hue", ""}, + {MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""}, + {MA_RAMP_VAL, "VALUE", 0, "Value", ""}, + {MA_RAMP_COLOR, "COLOR", 0, "Color", ""}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem prop_ramp_input_items[] = { + {MA_RAMP_IN_SHADER, "SHADER", 0, "Shader", ""}, + {MA_RAMP_IN_ENERGY, "ENERGY", 0, "Energy", ""}, + {MA_RAMP_IN_NOR, "NORMAL", 0, "Normal", ""}, + {MA_RAMP_IN_RESULT, "RESULT", 0, "Result", ""}, + {0, NULL, 0, NULL, NULL}}; prop= RNA_def_property(srna, "diffuse_color", PROP_FLOAT, PROP_COLOR); RNA_def_property_float_sdna(prop, NULL, "r"); @@ -477,15 +528,52 @@ static void rna_def_material_colors(StructRNA *srna) RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL); /* Color bands */ + prop= RNA_def_property(srna, "use_diffuse_ramp", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAMP_COL); + RNA_def_property_boolean_funcs(prop, NULL, "rna_Material_use_diffuse_ramp_set"); + RNA_def_property_ui_text(prop, "Use Diffuse Ramp", "Toggle diffuse ramp operations."); + RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL); + prop= RNA_def_property(srna, "diffuse_ramp", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "ramp_col"); RNA_def_property_struct_type(prop, "ColorRamp"); RNA_def_property_ui_text(prop, "Diffuse Ramp", "Color ramp used to affect diffuse shading."); + prop= RNA_def_property(srna, "use_specular_ramp", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAMP_SPEC); + RNA_def_property_boolean_funcs(prop, NULL, "rna_Material_use_specular_ramp_set"); + RNA_def_property_ui_text(prop, "Use Specular Ramp", "Toggle specular ramp operations."); + RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL); + prop= RNA_def_property(srna, "specular_ramp", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "ramp_spec"); RNA_def_property_struct_type(prop, "ColorRamp"); RNA_def_property_ui_text(prop, "Specular Ramp", "Color ramp used to affect specular shading."); + + prop= RNA_def_property(srna, "diffuse_ramp_blend", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "rampblend_col"); + RNA_def_property_enum_items(prop, prop_ramp_blend_diffuse_items); + RNA_def_property_ui_text(prop, "Diffuse Ramp Blend", ""); + RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL); + + prop= RNA_def_property(srna, "specular_ramp_blend", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "rampblend_spec"); + RNA_def_property_enum_items(prop, prop_ramp_blend_diffuse_items); + RNA_def_property_ui_text(prop, "Diffuse Ramp Blend", ""); + RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL); + + prop= RNA_def_property(srna, "diffuse_ramp_input", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "rampin_col"); + RNA_def_property_enum_items(prop, prop_ramp_input_items); + RNA_def_property_ui_text(prop, "Diffuse Ramp Input", ""); + RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL); + + prop= RNA_def_property(srna, "specular_ramp_input", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "rampin_spec"); + RNA_def_property_enum_items(prop, prop_ramp_input_items); + RNA_def_property_ui_text(prop, "Specular Ramp Input", ""); + RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL); + } static void rna_def_material_diffuse(StructRNA *srna) @@ -553,8 +641,8 @@ static void rna_def_material_raymirror(BlenderRNA *brna) PropertyRNA *prop; static EnumPropertyItem prop_fadeto_mir_items[] = { - {MA_RAYMIR_FADETOSKY, "FADE_TO_SKY", 0, "Fade to Sky Color", ""}, - {MA_RAYMIR_FADETOMAT, "FADE_TO_MATERIAL", 0, "Fade to Material Color", ""}, + {MA_RAYMIR_FADETOSKY, "FADE_TO_SKY", 0, "Sky", ""}, + {MA_RAYMIR_FADETOMAT, "FADE_TO_MATERIAL", 0, "Material", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "MaterialRaytraceMirror", NULL); @@ -912,7 +1000,7 @@ void rna_def_material_specularity(StructRNA *srna) { PropertyRNA *prop; - static EnumPropertyItem prop_spec_shader_items[] = { + static EnumPropertyItem prop_specular_shader_items[] = { {MA_SPEC_COOKTORR, "COOKTORR", 0, "CookTorr", ""}, {MA_SPEC_PHONG, "PHONG", 0, "Phong", ""}, {MA_SPEC_BLINN, "BLINN", 0, "Blinn", ""}, @@ -920,9 +1008,9 @@ void rna_def_material_specularity(StructRNA *srna) {MA_SPEC_WARDISO, "WARDISO", 0, "WardIso", ""}, {0, NULL, 0, NULL, NULL}}; - prop= RNA_def_property(srna, "spec_shader", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "specular_shader", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "spec_shader"); - RNA_def_property_enum_items(prop, prop_spec_shader_items); + RNA_def_property_enum_items(prop, prop_specular_shader_items); RNA_def_property_ui_text(prop, "Specular Shader Model", ""); RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL); @@ -1042,7 +1130,8 @@ void RNA_def_material(BlenderRNA *brna) static EnumPropertyItem prop_type_items[] = { {MA_TYPE_SURFACE, "SURFACE", 0, "Surface", "Render object as a surface."}, - {MA_TYPE_VOLUME, "VOLUME", 0, "Volume", "Render object as a volume."}, + {MA_TYPE_WIRE, "WIRE", 0, "Wire", "Render the edges of faces as wires (not supported in ray tracing)."}, + // {MA_TYPE_VOLUME, "VOLUME", 0, "Volume", "Render object as a volume."}, {MA_TYPE_HALO, "HALO", 0, "Halo", "Render object as halo particles."}, {0, NULL, 0, NULL, NULL}}; @@ -1128,9 +1217,9 @@ void RNA_def_material(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Shadeless", "Makes this material insensitive to light or shadow."); RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL); - prop= RNA_def_property(srna, "wireframe", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_WIRE); - RNA_def_property_ui_text(prop, "Wireframe", "Render the edges of faces as wires (not supported in ray tracing)."); + prop= RNA_def_property(srna, "z_transparency", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_ZTRA); + RNA_def_property_ui_text(prop, "Z Transparency", "Enable alpha buffer for transparent faces."); RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL); prop= RNA_def_property(srna, "vertex_color_light", PROP_BOOLEAN, PROP_NONE); @@ -1241,12 +1330,8 @@ void RNA_def_material(BlenderRNA *brna) /* common */ rna_def_animdata_common(srna); - rna_def_mtex_common(srna, "rna_Material_mtex_begin", "rna_Material_active_texture_get", "rna_Material_active_texture_index_set", "MaterialTextureSlot"); - - prop= RNA_def_property(srna, "script_link", PROP_POINTER, PROP_NEVER_NULL); - RNA_def_property_pointer_sdna(prop, NULL, "scriptlink"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Script Link", "Scripts linked to this material."); + rna_def_mtex_common(srna, "rna_Material_mtex_begin", "rna_Material_active_texture_get", + "rna_Material_active_texture_set", "MaterialTextureSlot"); rna_def_material_colors(srna); rna_def_material_diffuse(srna); @@ -1272,14 +1357,13 @@ void rna_def_mtex_common(StructRNA *srna, const char *begin, const char *activeg RNA_def_property_ui_text(prop, "Textures", "Texture slots defining the mapping and influence of textures."); prop= RNA_def_property(srna, "active_texture", PROP_POINTER, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_struct_type(prop, structname); - RNA_def_property_pointer_funcs(prop, activeget, NULL, NULL); + RNA_def_property_struct_type(prop, "Texture"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_pointer_funcs(prop, activeget, activeset, NULL); RNA_def_property_ui_text(prop, "Active Texture", "Active texture slot being displayed."); prop= RNA_def_property(srna, "active_texture_index", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "texact"); - RNA_def_property_int_funcs(prop, NULL, activeset, NULL); RNA_def_property_range(prop, 0, MAX_MTEX-1); RNA_def_property_ui_text(prop, "Active Texture Index", "Index of active texture slot."); } diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 518c72280cc..33b95aa53a1 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -43,6 +43,7 @@ #include "DNA_scene_types.h" #include "BLI_editVert.h" +#include "BLI_arithb.h" #include "BKE_customdata.h" #include "BKE_depsgraph.h" @@ -115,6 +116,17 @@ static void rna_MEdge_crease_set(PointerRNA *ptr, float value) medge->crease= (char)(CLAMPIS(value*255.0f, 0, 255)); } +static void rna_MeshFace_normal_get(PointerRNA *ptr, float *values) +{ + Mesh *me= (Mesh*)ptr->id.data; + MFace *mface= (MFace*)ptr->data; + + if(mface->v4) + CalcNormFloat4(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co, me->mvert[mface->v4].co, values); + else + CalcNormFloat(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co, values); +} + /* notice red and blue are swapped */ static void rna_MeshColor_color1_get(PointerRNA *ptr, float *values) { @@ -854,6 +866,13 @@ static void rna_def_mface(BlenderRNA *brna) prop= RNA_def_property(srna, "smooth", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SMOOTH); RNA_def_property_ui_text(prop, "Smooth", ""); + + prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_VECTOR); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, -1.0f, 1.0f); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_float_funcs(prop, "rna_MeshFace_normal_get", NULL, NULL); + RNA_def_property_ui_text(prop, "face normal", "local space unit length normal vector for this face"); } static void rna_def_mtexpoly(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c index 5f95336af2d..e142bc4b2aa 100644 --- a/source/blender/makesrna/intern/rna_meta.c +++ b/source/blender/makesrna/intern/rna_meta.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * Contributor(s): Blender Foundation (2008), Juho Vepsäläinen + * Contributor(s): Blender Foundation (2008), Juho Vepsalainen, Jiri Hnidek * * ***** END GPL LICENSE BLOCK ***** */ @@ -34,12 +34,48 @@ #ifdef RNA_RUNTIME +#include "DNA_scene_types.h" +#include "DNA_object_types.h" + +#include "BKE_mball.h" +#include "BKE_depsgraph.h" + +#include "WM_types.h" +#include "WM_api.h" + static int rna_Meta_texspace_editable(PointerRNA *ptr) { MetaBall *mb= (MetaBall*)ptr->data; return (mb->texflag & AUTOSPACE)? 0: PROP_EDITABLE; } +static void rna_MetaBall_update_data(bContext *C, PointerRNA *ptr) +{ + Scene *scene= CTX_data_scene(C); + Object *active_object = CTX_data_active_object(C); + Object *obedit= CTX_data_edit_object(C); + + if(obedit) { + copy_mball_properties(scene, obedit); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + } + else if(active_object) { + copy_mball_properties(scene, active_object); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, active_object); + DAG_object_flush_update(scene, active_object, OB_RECALC_DATA); + } +} + +static void rna_MetaElem_update_data(bContext *C, PointerRNA *ptr) +{ + Scene *scene= CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, obedit); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); +} + #else void rna_def_metaelement(BlenderRNA *brna) @@ -47,11 +83,11 @@ void rna_def_metaelement(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; static EnumPropertyItem prop_type_items[] = { - {MB_BALL, "BALL", 0, "Ball", ""}, - {MB_TUBE, "TUBE", 0, "Tube", ""}, - {MB_PLANE, "PLANE", 0, "Plane", ""}, - {MB_ELIPSOID, "ELLIPSOID", 0, "Ellipsoid", ""}, // NOTE: typo at original definition! - {MB_CUBE, "CUBE", 0, "Cube", ""}, + {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""}, + {MB_TUBE, "TUBE", ICON_META_TUBE, "Tube", ""}, + {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""}, + {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""}, // NOTE: typo at original definition! + {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "MetaElement", NULL); @@ -61,43 +97,61 @@ void rna_def_metaelement(BlenderRNA *brna) /* enums */ prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Type", "Metaball types."); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); /* number values */ prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR); RNA_def_property_float_sdna(prop, NULL, "x"); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Location", ""); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ROTATION); RNA_def_property_float_sdna(prop, NULL, "quat"); RNA_def_property_ui_text(prop, "Rotation", ""); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_UNSIGNED); RNA_def_property_float_sdna(prop, NULL, "rad"); RNA_def_property_ui_text(prop, "Radius", ""); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); - prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "sizex", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "expx"); RNA_def_property_range(prop, 0.0f, 20.0f); - RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Size", "Size of element, use of components depends on element type."); + RNA_def_property_ui_text(prop, "Size X", "Size of element, use of components depends on element type."); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); + + prop= RNA_def_property(srna, "sizey", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "expy"); + RNA_def_property_range(prop, 0.0f, 20.0f); + RNA_def_property_ui_text(prop, "Size Y", "Size of element, use of components depends on element type."); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); + + prop= RNA_def_property(srna, "sizez", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "expz"); + RNA_def_property_range(prop, 0.0f, 20.0f); + RNA_def_property_ui_text(prop, "Size Z", "Size of element, use of components depends on element type."); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); prop= RNA_def_property(srna, "stiffness", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "s"); RNA_def_property_range(prop, 0.0f, 10.0f); RNA_def_property_ui_text(prop, "Stiffness", "Stiffness defines how much of the element to fill."); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); /* flags */ prop= RNA_def_property(srna, "negative", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", MB_NEGATIVE); RNA_def_property_ui_text(prop, "Negative", "Set metaball as negative one."); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", MB_HIDE); RNA_def_property_ui_text(prop, "Hide", "Hide element."); + RNA_def_property_update(prop, 0, "rna_MetaElem_update_data"); } void rna_def_metaball(BlenderRNA *brna) @@ -106,7 +160,7 @@ void rna_def_metaball(BlenderRNA *brna) PropertyRNA *prop; static EnumPropertyItem prop_update_items[] = { {MB_UPDATE_ALWAYS, "UPDATE_ALWAYS", 0, "Always", "While editing, update metaball always."}, - {MB_UPDATE_HALFRES, "HALFRES", 0, "Half Resolution", "While editing, update metaball in half resolution."}, + {MB_UPDATE_HALFRES, "HALFRES", 0, "Half", "While editing, update metaball in half resolution."}, {MB_UPDATE_FAST, "FAST", 0, "Fast", "While editing, update metaball without polygonization."}, {MB_UPDATE_NEVER, "NEVER", 0, "Never", "While editing, don't update metaball at all."}, {0, NULL, 0, NULL, NULL}}; @@ -120,29 +174,40 @@ void rna_def_metaball(BlenderRNA *brna) RNA_def_property_struct_type(prop, "MetaElement"); RNA_def_property_ui_text(prop, "Elements", "Meta elements."); + prop= RNA_def_property(srna, "last_selected_element", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "lastelem"); + RNA_def_property_ui_text(prop, "Last selected element.", "Last selected element."); + /* enums */ prop= RNA_def_property(srna, "flag", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, prop_update_items); RNA_def_property_ui_text(prop, "Update", "Metaball edit update behavior."); + RNA_def_property_update(prop, 0, "rna_MetaBall_update_data"); /* number values */ prop= RNA_def_property(srna, "wire_size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "wiresize"); RNA_def_property_range(prop, 0.050f, 1.0f); RNA_def_property_ui_text(prop, "Wire Size", "Polygonization resolution in the 3D viewport."); + RNA_def_property_update(prop, 0, "rna_MetaBall_update_data"); prop= RNA_def_property(srna, "render_size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rendersize"); RNA_def_property_range(prop, 0.050f, 1.0f); RNA_def_property_ui_text(prop, "Render Size", "Polygonization resolution in rendering."); + RNA_def_property_update(prop, 0, "rna_MetaBall_update_data"); prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "thresh"); RNA_def_property_range(prop, 0.0f, 5.0f); RNA_def_property_ui_text(prop, "Threshold", "Influence of meta elements."); + RNA_def_property_update(prop, 0, "rna_MetaBall_update_data"); /* materials, textures */ rna_def_texmat_common(srna, "rna_Meta_texspace_editable"); + + /* anim */ + rna_def_animdata_common(srna); } void RNA_def_meta(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index b3dfc6a8dd6..9771e83468b 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -34,9 +34,11 @@ #include "DNA_armature_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" +#include "DNA_object_force.h" #include "DNA_scene_types.h" #include "BKE_bmesh.h" /* For BevelModifierData */ +#include "BKE_smoke.h" /* For smokeModifier_free & smokeModifier_createType */ #include "WM_types.h" @@ -60,14 +62,15 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""}, {eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, "Mesh Deform", ""}, {eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""}, - {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multires", ""}, + {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""}, {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""}, {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""}, {eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MOD_SHRINKWRAP, "Shrinkwrap", ""}, {eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MOD_SIMPLEDEFORM, "Simple Deform", ""}, + {eModifierType_Smoke, "SMOKE", 0, "Smoke", ""}, {eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, "Smooth", ""}, {eModifierType_Softbody, "SOFTBODY", ICON_MOD_SOFT, "Soft Body", ""}, - {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subsurf", ""}, + {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""}, {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, {eModifierType_Wave, "WAVE", ICON_MOD_WAVE, "Wave", ""}, @@ -151,6 +154,8 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr) return &RNA_MultiresModifier; case eModifierType_Surface: return &RNA_SurfaceModifier; + case eModifierType_Smoke: + return &RNA_SmokeModifier; default: return &RNA_Modifier; } @@ -172,6 +177,23 @@ static void rna_Modifier_dependency_update(bContext *C, PointerRNA *ptr) DAG_scene_sort(CTX_data_scene(C)); } +static void rna_Smoke_set_type(bContext *C, PointerRNA *ptr) +{ + SmokeModifierData *smd= (SmokeModifierData *)ptr->data; + Object *ob= (Object*)ptr->id.data; + + smokeModifier_free(smd); // XXX TODO: completely free all 3 pointers + smokeModifier_createType(smd); // create regarding of selected type + // particle_system_slot_add_exec(C, NULL); + // particle_system_slot_remove_exec(C, NULL); + + if(smd->type == MOD_SMOKE_TYPE_DOMAIN) + ob->dt = OB_WIRE; + + // update dependancy since a domain - other type switch could have happened + rna_Modifier_dependency_update(C, ptr); +} + static void rna_ExplodeModifier_vgroup_get(PointerRNA *ptr, char *value) { ExplodeModifierData *emd= (ExplodeModifierData*)ptr->data; @@ -311,6 +333,11 @@ static void rna_CurveModifier_object_set(PointerRNA *ptr, PointerRNA value) modifier_object_set(&((CurveModifierData*)ptr->data)->object, OB_CURVE, value); } +static void rna_CastModifier_object_set(PointerRNA *ptr, PointerRNA value) +{ + modifier_object_set(&((CastModifierData*)ptr->data)->object, OB_MESH, value); +} + static void rna_ArmatureModifier_object_set(PointerRNA *ptr, PointerRNA value) { modifier_object_set(&((ArmatureModifierData*)ptr->data)->object, OB_ARMATURE, value); @@ -357,6 +384,12 @@ static PointerRNA rna_SoftBodyModifier_settings_get(PointerRNA *ptr) return rna_pointer_inherit_refine(ptr, &RNA_SoftBodySettings, ob->soft); } +static PointerRNA rna_SoftBodyModifier_point_cache_get(PointerRNA *ptr) +{ + Object *ob= (Object*)ptr->id.data; + return rna_pointer_inherit_refine(ptr, &RNA_PointCache, ob->soft->pointcache); +} + static PointerRNA rna_CollisionModifier_settings_get(PointerRNA *ptr) { Object *ob= (Object*)ptr->id.data; @@ -857,6 +890,11 @@ static void rna_def_modifier_softbody(BlenderRNA *brna) RNA_def_property_struct_type(prop, "SoftBodySettings"); RNA_def_property_pointer_funcs(prop, "rna_SoftBodyModifier_settings_get", NULL, NULL); RNA_def_property_ui_text(prop, "Soft Body Settings", ""); + + prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NEVER_NULL); + RNA_def_property_struct_type(prop, "PointCache"); + RNA_def_property_pointer_funcs(prop, "rna_SoftBodyModifier_point_cache_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Soft Body Point Cache", ""); } static void rna_def_modifier_boolean(BlenderRNA *brna) @@ -1203,6 +1241,12 @@ static void rna_def_modifier_cast(BlenderRNA *brna) RNA_def_property_enum_items(prop, prop_cast_type_items); RNA_def_property_ui_text(prop, "Cast Type", ""); RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE); + RNA_def_property_ui_text(prop, "Object", "Control object: if available, its location determines the center of the effect"); + RNA_def_property_pointer_funcs(prop, NULL, "rna_CastModifier_object_set", NULL); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "x", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_X); @@ -1219,6 +1263,16 @@ static void rna_def_modifier_cast(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Z", ""); RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update"); + prop= RNA_def_property(srna, "from_radius", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_SIZE_FROM_RADIUS); + RNA_def_property_ui_text(prop, "From Radius", "Use radius as size of projection shape (0 = auto)"); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "use_transform", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_CAST_USE_OB_TRANSFORM); + RNA_def_property_ui_text(prop, "Use transform", "Use object transform to control projection shape"); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_update"); + prop= RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "fac"); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); @@ -1445,6 +1499,41 @@ static void rna_def_modifier_cloth(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Point Cache", ""); } +static void rna_def_modifier_smoke(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem prop_smoke_type_items[] = { + {0, "NONE", 0, "None", ""}, + {MOD_SMOKE_TYPE_DOMAIN, "TYPE_DOMAIN", 0, "Domain", ""}, + {MOD_SMOKE_TYPE_FLOW, "TYPE_FLOW", 0, "Flow", "Inflow/Outflow"}, + {MOD_SMOKE_TYPE_COLL, "TYPE_COLL", 0, "Collision", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "SmokeModifier", "Modifier"); + RNA_def_struct_ui_text(srna, "Smoke Modifier", "Smoke simulation modifier."); + RNA_def_struct_sdna(srna, "SmokeModifierData"); + + prop= RNA_def_property(srna, "domain_settings", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "domain"); + RNA_def_property_ui_text(prop, "Domain Settings", ""); + + prop= RNA_def_property(srna, "flow_settings", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "flow"); + RNA_def_property_ui_text(prop, "Flow Settings", ""); + + prop= RNA_def_property(srna, "coll_settings", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "coll"); + RNA_def_property_ui_text(prop, "Collision Settings", ""); + + prop= RNA_def_property(srna, "smoke_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); + RNA_def_property_enum_items(prop, prop_smoke_type_items); + RNA_def_property_ui_text(prop, "Type", ""); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_set_type"); +} + static void rna_def_modifier_collision(BlenderRNA *brna) { StructRNA *srna; @@ -1742,7 +1831,6 @@ static void rna_def_modifier_surface(BlenderRNA *brna) RNA_def_struct_sdna(srna, "SurfaceModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_PHYSICS); } - void RNA_def_modifier(BlenderRNA *brna) { StructRNA *srna; @@ -1826,6 +1914,7 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_simpledeform(brna); rna_def_modifier_multires(brna); rna_def_modifier_surface(brna); + rna_def_modifier_smoke(brna); } #endif diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c index 8b1ea23df1c..a9b289f314b 100644 --- a/source/blender/makesrna/intern/rna_nla.c +++ b/source/blender/makesrna/intern/rna_nla.c @@ -243,6 +243,19 @@ static void rna_NlaStrip_animated_time_set(PointerRNA *ptr, int value) #else +/* enum defines exported for rna_animation.c */ +EnumPropertyItem nla_mode_blend_items[] = { + {NLASTRIP_MODE_REPLACE, "REPLACE", 0, "Replace", "Result strip replaces the accumulated results by amount specified by influence."}, + {NLASTRIP_MODE_ADD, "ADD", 0, "Add", "Weighted result of strip is added to the accumlated results."}, + {NLASTRIP_MODE_SUBTRACT, "SUBTRACT", 0, "Subtract", "Weighted result of strip is removed from the accumlated results."}, + {NLASTRIP_MODE_MULTIPLY, "MULITPLY", 0, "Multiply", "Weighted result of strip is multiplied with the accumlated results."}, + {0, NULL, 0, NULL, NULL}}; +EnumPropertyItem nla_mode_extend_items[] = { + {NLASTRIP_EXTEND_NOTHING, "NOTHING", 0, "Nothing", "Strip has no influence past its extents."}, + {NLASTRIP_EXTEND_HOLD, "HOLD", 0, "Hold", "Hold the first frame if no previous strips in track, and always hold last frame."}, + {NLASTRIP_EXTEND_HOLD_FORWARD, "HOLD_FORWARD", 0, "Hold Forward", "Only hold last frame."}, + {0, NULL, 0, NULL, NULL}}; + void rna_def_nlastrip(BlenderRNA *brna) { StructRNA *srna; @@ -254,17 +267,6 @@ void rna_def_nlastrip(BlenderRNA *brna) {NLASTRIP_TYPE_TRANSITION, "TRANSITION", 0, "Transition", "NLA Strip 'transitions' between adjacent strips."}, {NLASTRIP_TYPE_META, "META", 0, "Meta", "NLA Strip acts as a container for adjacent strips."}, {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem prop_mode_blend_items[] = { - {NLASTRIP_MODE_REPLACE, "REPLACE", 0, "Replace", "Result strip replaces the accumulated results by amount specified by influence."}, - {NLASTRIP_MODE_ADD, "ADD", 0, "Add", "Weighted result of strip is added to the accumlated results."}, - {NLASTRIP_MODE_SUBTRACT, "SUBTRACT", 0, "Subtract", "Weighted result of strip is removed from the accumlated results."}, - {NLASTRIP_MODE_MULTIPLY, "MULITPLY", 0, "Multiply", "Weighted result of strip is multiplied with the accumlated results."}, - {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem prop_mode_extend_items[] = { - {NLASTRIP_EXTEND_NOTHING, "NOTHING", 0, "Nothing", "Strip has no influence past its extents."}, - {NLASTRIP_EXTEND_HOLD, "HOLD", 0, "Hold", "Hold the first frame if no previous strips in track, and always hold last frame."}, - {NLASTRIP_EXTEND_HOLD_FORWARD, "HOLD_FORWARD", 0, "Hold Forward", "Only hold last frame."}, - {0, NULL, 0, NULL, NULL}}; /* struct definition */ srna= RNA_def_struct(brna, "NlaStrip", NULL); @@ -286,12 +288,12 @@ void rna_def_nlastrip(BlenderRNA *brna) prop= RNA_def_property(srna, "extrapolation", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "extendmode"); - RNA_def_property_enum_items(prop, prop_mode_extend_items); + RNA_def_property_enum_items(prop, nla_mode_extend_items); RNA_def_property_ui_text(prop, "Extrapolation", "Action to take for gaps past the strip extents."); prop= RNA_def_property(srna, "blending", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "blendmode"); - RNA_def_property_enum_items(prop, prop_mode_blend_items); + RNA_def_property_enum_items(prop, nla_mode_blend_items); RNA_def_property_ui_text(prop, "Blending", "Method used for combining strip's result with accumulated result."); /* Strip extents */ diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 29bb3a9b323..7e26cb00394 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -44,7 +44,7 @@ static EnumPropertyItem parent_type_items[] = { {PAROBJECT, "OBJECT", 0, "Object", ""}, {PARCURVE, "CURVE", 0, "Curve", ""}, - //{PARKEY, "KEY", 0, "Key", ""}, + {PARKEY, "KEY", 0, "Key", ""}, {PARSKEL, "ARMATURE", 0, "Armature", ""}, {PARSKEL, "LATTICE", 0, "Lattice", ""}, // PARSKEL reuse will give issues {PARVERT1, "VERTEX", 0, "Vertex", ""}, @@ -57,6 +57,7 @@ static EnumPropertyItem parent_type_items[] = { #include "DNA_key_types.h" #include "BKE_armature.h" +#include "BKE_bullet.h" #include "BKE_context.h" #include "BKE_curve.h" #include "BKE_depsgraph.h" @@ -199,9 +200,9 @@ static EnumPropertyItem *rna_Object_parent_type_itemf(bContext *C, PointerRNA *p if(par->type == OB_CURVE) RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARCURVE); else if(par->type == OB_LATTICE) - RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARSKEL); + RNA_enum_items_add_value(&item, &totitem, &parent_type_items[4], PARSKEL); // special hack: prevents this overriding others else if(par->type == OB_ARMATURE) { - RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARSKEL); + RNA_enum_items_add_value(&item, &totitem, &parent_type_items[3], PARSKEL); // special hack: prevents this being overrided RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARBONE); } else if(par->type == OB_MESH) { @@ -377,7 +378,17 @@ static void rna_Object_active_material_index_range(PointerRNA *ptr, int *min, in static PointerRNA rna_Object_active_material_get(PointerRNA *ptr) { Object *ob= (Object*)ptr->id.data; - return rna_pointer_inherit_refine(ptr, &RNA_MaterialSlot, ob->mat+ob->actcol); + Material *ma; + + ma= (ob->totcol)? give_current_material(ob, ob->actcol): NULL; + return rna_pointer_inherit_refine(ptr, &RNA_Material, ma); +} + +static void rna_Object_active_material_set(PointerRNA *ptr, PointerRNA value) +{ + Object *ob= (Object*)ptr->id.data; + + assign_material(ob, value.data, ob->actcol); } static void rna_Object_active_particle_system_index_range(PointerRNA *ptr, int *min, int *max) @@ -400,15 +411,6 @@ static void rna_Object_active_particle_system_index_set(struct PointerRNA *ptr, psys_set_current_num(ob, value); } -#if 0 -static void rna_Object_active_material_set(PointerRNA *ptr, PointerRNA value) -{ - Object *ob= (Object*)ptr->id.data; - - assign_material(ob, value.data, ob->actcol); -} -#endif - static PointerRNA rna_MaterialSlot_material_get(PointerRNA *ptr) { Object *ob= (Object*)ptr->id.data; @@ -478,6 +480,86 @@ static void rna_MaterialSlot_name_get(PointerRNA *ptr, char *str) strcpy(str, ""); } +/* why does this have to be so complicated?, can't all this crap be + * moved to in BGE conversion function? - Campbell * + * + * logic from check_body_type() + * */ +static int rna_GameObjectSettings_physics_type_get(PointerRNA *ptr) +{ + Object *ob= (Object*)ptr->id.data; + + /* determine the body_type setting based on flags */ + if (!(ob->gameflag & OB_COLLISION)) { + if (ob->gameflag & OB_OCCLUDER) { + ob->body_type = OB_BODY_TYPE_OCCLUDER; + } else { + ob->body_type = OB_BODY_TYPE_NO_COLLISION; + } + } else if (ob->gameflag & OB_SENSOR) { + ob->body_type = OB_BODY_TYPE_SENSOR; + } else if (!(ob->gameflag & OB_DYNAMIC)) { + ob->body_type = OB_BODY_TYPE_STATIC; + } else if (!(ob->gameflag & (OB_RIGID_BODY|OB_SOFT_BODY))) { + ob->body_type = OB_BODY_TYPE_DYNAMIC; + } else if (ob->gameflag & OB_RIGID_BODY) { + ob->body_type = OB_BODY_TYPE_RIGID; + } else { + ob->body_type = OB_BODY_TYPE_SOFT; + /* create the structure here because we display soft body buttons in the main panel */ + if (!ob->bsoft) + ob->bsoft = bsbNew(); + } + + return ob->body_type; +} + +static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value) +{ + Object *ob= (Object*)ptr->id.data; + ob->body_type= value; + + switch (ob->body_type) { + case OB_BODY_TYPE_SENSOR: + ob->gameflag |= OB_SENSOR|OB_COLLISION|OB_GHOST; + ob->gameflag &= ~(OB_OCCLUDER|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE); + break; + case OB_BODY_TYPE_OCCLUDER: + ob->gameflag |= OB_OCCLUDER; + ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC); + break; + case OB_BODY_TYPE_NO_COLLISION: + ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC); + break; + case OB_BODY_TYPE_STATIC: + ob->gameflag |= OB_COLLISION; + ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR); + break; + case OB_BODY_TYPE_DYNAMIC: + ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_ACTOR; + ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR); + break; + case OB_BODY_TYPE_RIGID: + ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_RIGID_BODY|OB_ACTOR; + ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR); + break; + default: + case OB_BODY_TYPE_SOFT: + ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_SOFT_BODY|OB_ACTOR; + ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR); + + /* assume triangle mesh, if no bounds chosen for soft body */ + if ((ob->gameflag & OB_BOUNDS) && (ob->boundtype<OB_BOUND_POLYH)) + { + ob->boundtype=OB_BOUND_POLYH; + } + /* create a BulletSoftBody structure if not already existing */ + if (!ob->bsoft) + ob->bsoft = bsbNew(); + break; + } +} + static PointerRNA rna_Object_active_particle_system_get(PointerRNA *ptr) { Object *ob= (Object*)ptr->id.data; @@ -666,11 +748,13 @@ static void rna_def_object_game_settings(BlenderRNA *brna) PropertyRNA *prop; static EnumPropertyItem body_type_items[] = { - {OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", ""}, - {OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", ""}, - {OB_BODY_TYPE_DYNAMIC, "DYNAMIC", 0, "Dynamic", ""}, - {OB_BODY_TYPE_RIGID, "RIGID_BODY", 0, "Rigid Body", ""}, - {OB_BODY_TYPE_SOFT, "SOFT_BODY", 0, "Soft Body", ""}, + {OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", "Disable colision for this object"}, + {OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", "Stationary object"}, + {OB_BODY_TYPE_DYNAMIC, "DYNAMIC", 0, "Dynamic", "Linear physics"}, + {OB_BODY_TYPE_RIGID, "RIGID_BODY", 0, "Rigid Body", "Linear and angular physics"}, + {OB_BODY_TYPE_SOFT, "SOFT_BODY", 0, "Soft Body", "Soft body"}, + {OB_BODY_TYPE_OCCLUDER, "OCCLUDE", 0, "Occlude", "Occluder for optimizing scene rendering"}, + {OB_BODY_TYPE_SENSOR, "SENSOR", 0, "Sensor", "Collision Sensor, detects static and dynamic objects but not the other collision sensor objects"}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem collision_bounds_items[] = { @@ -725,7 +809,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "physics_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "body_type"); RNA_def_property_enum_items(prop, body_type_items); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); // this controls various gameflags + RNA_def_property_enum_funcs(prop, "rna_GameObjectSettings_physics_type_get", "rna_GameObjectSettings_physics_type_set", NULL); RNA_def_property_ui_text(prop, "Physics Type", "Selects the type of physical representation."); prop= RNA_def_property(srna, "actor", PROP_BOOLEAN, PROP_NONE); @@ -1027,9 +1111,11 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Materials", "Material slots in the object."); prop= RNA_def_property(srna, "active_material", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "MaterialSlot"); - RNA_def_property_pointer_funcs(prop, "rna_Object_active_material_get", NULL, NULL); + RNA_def_property_struct_type(prop, "Material"); + RNA_def_property_pointer_funcs(prop, "rna_Object_active_material_get", "rna_Object_active_material_set", NULL); + RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Active Material", "Active material being displayed."); + RNA_def_property_update(prop, NC_OBJECT|ND_SHADING, "rna_Object_update"); prop= RNA_def_property(srna, "active_material_index", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "actcol"); @@ -1309,12 +1395,6 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Time Offset Add Parent", "Add the parents time offset value"); RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update"); - /* script link */ - - prop= RNA_def_property(srna, "script_link", PROP_POINTER, PROP_NEVER_NULL); - RNA_def_property_pointer_sdna(prop, NULL, "scriptlink"); - RNA_def_property_ui_text(prop, "Script Link", "Scripts linked to this object."); - /* drawing */ prop= RNA_def_property(srna, "max_draw_type", PROP_ENUM, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 9d65c9be78a..1bb341b4c9d 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -34,6 +34,8 @@ #ifdef RNA_RUNTIME +#include "MEM_guardedalloc.h" + #include "BKE_customdata.h" #include "BKE_DerivedMesh.h" @@ -61,6 +63,25 @@ Mesh *rna_Object_create_render_mesh(Object *ob, Scene *scene) DM_to_mesh(dm, me); dm->release(dm); + + { /* update the material */ + short i, *totcol =give_totcolp(ob); + + /* free the current material list */ + if(me->mat) + MEM_freeN((void *)me->mat); + + me->mat= (Material **)MEM_callocN(sizeof(void *)*(*totcol), "matarray"); + + for(i=0; i<*totcol; i++) { + Material *mat= give_current_material(ob, i+1); + if(mat) { + me->mat[i]= mat; + mat->id.us++; + } + } + } + return me; } diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index 2ec8d9ea41e..e229afedc62 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -105,6 +105,7 @@ static void rna_Cache_toggle_disk_cache(bContext *C, PointerRNA *ptr) static void rna_Cache_idname_change(bContext *C, PointerRNA *ptr) { + Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); PointCache *cache = (PointCache*)ptr->data; PTCacheID *pid = NULL, *pid2= NULL; @@ -119,33 +120,50 @@ static void rna_Cache_idname_change(bContext *C, PointerRNA *ptr) BKE_ptcache_ids_from_object(&pidlist, ob); - for(pid=pidlist.first; pid; pid=pid->next) { - if(pid->cache==cache) - pid2 = pid; - else if(strcmp(cache->name, "") && strcmp(cache->name,pid->cache->name)==0) { - /*TODO: report "name exists" to user */ - strcpy(cache->name, cache->prev_name); - new_name = 0; + if(cache->flag & PTCACHE_EXTERNAL) { + for(pid=pidlist.first; pid; pid=pid->next) { + if(pid->cache==cache) + break; } + + if(!pid) + return; + + cache->flag |= (PTCACHE_BAKED|PTCACHE_DISK_CACHE|PTCACHE_SIMULATION_VALID); + cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED); + + BKE_ptcache_load_external(pid); + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); } + else { + for(pid=pidlist.first; pid; pid=pid->next) { + if(pid->cache==cache) + pid2 = pid; + else if(strcmp(cache->name, "") && strcmp(cache->name,pid->cache->name)==0) { + /*TODO: report "name exists" to user */ + strcpy(cache->name, cache->prev_name); + new_name = 0; + } + } - if(new_name) { - if(pid2 && cache->flag & PTCACHE_DISK_CACHE) { - strcpy(name, cache->name); - strcpy(cache->name, cache->prev_name); + if(new_name) { + if(pid2 && cache->flag & PTCACHE_DISK_CACHE) { + strcpy(name, cache->name); + strcpy(cache->name, cache->prev_name); - cache->flag &= ~PTCACHE_DISK_CACHE; + cache->flag &= ~PTCACHE_DISK_CACHE; - BKE_ptcache_toggle_disk_cache(pid2); + BKE_ptcache_toggle_disk_cache(pid2); - strcpy(cache->name, name); + strcpy(cache->name, name); - cache->flag |= PTCACHE_DISK_CACHE; + cache->flag |= PTCACHE_DISK_CACHE; - BKE_ptcache_toggle_disk_cache(pid2); - } + BKE_ptcache_toggle_disk_cache(pid2); + } - strcpy(cache->prev_name, cache->name); + strcpy(cache->prev_name, cache->name); + } } BLI_freelistN(&pidlist); @@ -153,91 +171,91 @@ static void rna_Cache_idname_change(bContext *C, PointerRNA *ptr) static int rna_SoftBodySettings_use_edges_get(PointerRNA *ptr) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); return (((data->softflag) & OB_SB_EDGES) != 0); } static void rna_SoftBodySettings_use_edges_set(PointerRNA *ptr, int value) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); if(value) data->softflag |= OB_SB_EDGES; else data->softflag &= ~OB_SB_EDGES; } static int rna_SoftBodySettings_use_goal_get(PointerRNA *ptr) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); return (((data->softflag) & OB_SB_GOAL) != 0); } static void rna_SoftBodySettings_use_goal_set(PointerRNA *ptr, int value) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); if(value) data->softflag |= OB_SB_GOAL; else data->softflag &= ~OB_SB_GOAL; } static int rna_SoftBodySettings_stiff_quads_get(PointerRNA *ptr) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); return (((data->softflag) & OB_SB_QUADS) != 0); } static void rna_SoftBodySettings_stiff_quads_set(PointerRNA *ptr, int value) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); if(value) data->softflag |= OB_SB_QUADS; else data->softflag &= ~OB_SB_QUADS; } static int rna_SoftBodySettings_self_collision_get(PointerRNA *ptr) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); return (((data->softflag) & OB_SB_SELF) != 0); } static void rna_SoftBodySettings_self_collision_set(PointerRNA *ptr, int value) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); if(value) data->softflag |= OB_SB_SELF; else data->softflag &= ~OB_SB_SELF; } static int rna_SoftBodySettings_new_aero_get(PointerRNA *ptr) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); return (((data->softflag) & OB_SB_AERO_ANGLE) != 0); } static void rna_SoftBodySettings_new_aero_set(PointerRNA *ptr, int value) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); if(value) data->softflag |= OB_SB_AERO_ANGLE; else data->softflag &= ~OB_SB_AERO_ANGLE; } static int rna_SoftBodySettings_face_collision_get(PointerRNA *ptr) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); return (((data->softflag) & OB_SB_FACECOLL) != 0); } static void rna_SoftBodySettings_face_collision_set(PointerRNA *ptr, int value) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); if(value) data->softflag |= OB_SB_FACECOLL; else data->softflag &= ~OB_SB_FACECOLL; } static int rna_SoftBodySettings_edge_collision_get(PointerRNA *ptr) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); return (((data->softflag) & OB_SB_EDGECOLL) != 0); } static void rna_SoftBodySettings_edge_collision_set(PointerRNA *ptr, int value) { - Object *data= (Object*)(ptr->data); + Object *data= (Object*)(ptr->id.data); if(value) data->softflag |= OB_SB_EDGECOLL; else data->softflag &= ~OB_SB_EDGECOLL; } @@ -365,11 +383,16 @@ static void rna_def_pointcache(BlenderRNA *brna) RNA_def_property_ui_text(prop, "End", "Frame on which the simulation stops."); prop= RNA_def_property(srna, "step", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "step"); RNA_def_property_range(prop, 1, 20); RNA_def_property_ui_text(prop, "Cache Step", "Number of frames between cached frames."); RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change"); + prop= RNA_def_property(srna, "index", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "index"); + RNA_def_property_range(prop, -1, 100); + RNA_def_property_ui_text(prop, "Cache Index", "Index number of cache files."); + RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change"); + /* flags */ prop= RNA_def_property(srna, "baked", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKED); @@ -398,6 +421,11 @@ static void rna_def_pointcache(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Name", "Cache name"); RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change"); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH); + RNA_def_property_string_sdna(prop, NULL, "path"); + RNA_def_property_ui_text(prop, "File Path", "Cache file path."); + RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change"); + prop= RNA_def_property(srna, "quick_cache", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_QUICK_CACHE); RNA_def_property_ui_text(prop, "Quick Cache", "Update simulation with cache steps"); @@ -407,6 +435,11 @@ static void rna_def_pointcache(BlenderRNA *brna) RNA_def_property_string_sdna(prop, NULL, "info"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Cache Info", "Info on current cache status."); + + prop= RNA_def_property(srna, "external", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_EXTERNAL); + RNA_def_property_ui_text(prop, "External", "Read cache from an external location"); + RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change"); } static void rna_def_collision(BlenderRNA *brna) @@ -682,10 +715,68 @@ static void rna_def_field(BlenderRNA *brna) static void rna_def_game_softbody(BlenderRNA *brna) { StructRNA *srna; + PropertyRNA *prop; srna= RNA_def_struct(brna, "GameSoftBodySettings", NULL); RNA_def_struct_sdna(srna, "BulletSoftBody"); RNA_def_struct_ui_text(srna, "Game Soft Body Settings", "Soft body simulation settings for an object in the game engine."); + + /* Floats */ + + prop= RNA_def_property(srna, "linstiff", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "linStiff"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Linear Stiffness", "Linear stiffness of the soft body links"); + + prop= RNA_def_property(srna, "dynamic_friction", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "kDF"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Friction", "Dynamic Friction"); + + prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "kMT"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Threshold", "Shape matching threshold"); + + prop= RNA_def_property(srna, "margin", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "margin"); + RNA_def_property_range(prop, 0.01f, 1.0f); + RNA_def_property_ui_text(prop, "Margin", "Collision margin for soft body. Small value makes the algorithm unstable"); + + prop= RNA_def_property(srna, "welding", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "welding"); + RNA_def_property_range(prop, 0.0f, 0.01f); + RNA_def_property_ui_text(prop, "Welding", "Welding threshold: distance between nearby vertices to be considered equal => set to 0.0 to disable welding test and speed up scene loading (ok if the mesh has no duplicates)"); + + /* Integers */ + + prop= RNA_def_property(srna, "position_iterations", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "piterations"); + RNA_def_property_range(prop, 0, 10); + RNA_def_property_ui_text(prop, "Position Iterations", "Position solver iterations"); + + prop= RNA_def_property(srna, "cluster_iterations", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "numclusteriterations"); + RNA_def_property_range(prop, 1, 128); + RNA_def_property_ui_text(prop, "Cluster Iterations", "Specify the number of cluster iterations"); + + /* Booleans */ + + prop= RNA_def_property(srna, "shape_match", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_SHAPE_MATCHING); + RNA_def_property_ui_text(prop, "Shape Match", "Enable soft body shape matching goal"); + + prop= RNA_def_property(srna, "bending_const", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_BENDING_CONSTRAINTS); + RNA_def_property_ui_text(prop, "Bending Const", "Enable bending constraints"); + + prop= RNA_def_property(srna, "enable_rs_collision", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_RS); + RNA_def_property_ui_text(prop, "Cluster Collision RS", "Enable cluster collision between soft and rigid body"); + + prop= RNA_def_property(srna, "enable_ss_collision", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_SS); + RNA_def_property_ui_text(prop, "Cluster Collision SS", "Enable cluster collision between soft and soft body"); } static void rna_def_softbody(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index f07351f0a30..3ebdd61ca50 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -150,7 +150,6 @@ static void rna_Particle_target_reset(bContext *C, PointerRNA *ptr) ParticleTarget *pt = (ParticleTarget*)ptr->data; Object *ob = (Object*)ptr->id.data; ParticleSystem *kpsys=NULL, *psys=psys_get_current(ob); - int psys_num = BLI_findindex(&ob->particlesystem, psys); if(pt->ob==ob || pt->ob==NULL) { kpsys = BLI_findlink(&ob->particlesystem, pt->psys-1); @@ -616,33 +615,65 @@ static void rna_def_particle(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Stick Object", "Object that particle sticks to when dead"); -// ParticleKey state; /* normally current global coordinates or */ -// /* in sticky object space if dead & sticky */ -// -// ParticleKey prev_state; /* previous state */ + /* Particle State & Previous State */ + prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR); + RNA_def_property_float_sdna(prop, NULL, "state.co"); + RNA_def_property_ui_text(prop, "Particle Location", ""); + + prop= RNA_def_property(srna, "velocity", PROP_FLOAT, PROP_VECTOR); + RNA_def_property_float_sdna(prop, NULL, "state.vel"); + RNA_def_property_ui_text(prop, "Particle Velocity", ""); + + prop= RNA_def_property(srna, "angular_velocity", PROP_FLOAT, PROP_VECTOR); + RNA_def_property_float_sdna(prop, NULL, "state.ave"); + RNA_def_property_ui_text(prop, "Angular Velocity", ""); + + prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ROTATION); + RNA_def_property_float_sdna(prop, NULL, "state.rot"); + RNA_def_property_ui_text(prop, "Rotation", ""); -// prop= RNA_def_property(srna, "hair", PROP_COLLECTION, PROP_NONE); -// RNA_def_property_collection_sdna(prop, NULL, "hair", "???totalHair???"); //don't know what the hair array size is -// RNA_def_property_struct_type(prop, "HairKey"); -// RNA_def_property_ui_text(prop, "Hair", ""); + prop= RNA_def_property(srna, "prev_location", PROP_FLOAT, PROP_VECTOR); + RNA_def_property_float_sdna(prop, NULL, "prev_state.co"); + RNA_def_property_ui_text(prop, "Previous Particle Location", ""); + + prop= RNA_def_property(srna, "prev_velocity", PROP_FLOAT, PROP_VECTOR); + RNA_def_property_float_sdna(prop, NULL, "prev_state.vel"); + RNA_def_property_ui_text(prop, "Previous Particle Velocity", ""); + + prop= RNA_def_property(srna, "prev_angular_velocity", PROP_FLOAT, PROP_VECTOR); + RNA_def_property_float_sdna(prop, NULL, "prev_state.ave"); + RNA_def_property_ui_text(prop, "Previous Angular Velocity", ""); + + prop= RNA_def_property(srna, "prev_rotation", PROP_FLOAT, PROP_ROTATION); + RNA_def_property_float_sdna(prop, NULL, "prev_state.rot"); + RNA_def_property_ui_text(prop, "Previous Rotation", ""); + + /* Hair & Keyed Keys */ + + prop= RNA_def_property(srna, "hair", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "hair", "totkey"); + RNA_def_property_struct_type(prop, "ParticleHairKey"); + RNA_def_property_ui_text(prop, "Hair", ""); prop= RNA_def_property(srna, "keys", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "keys", "totkey"); RNA_def_property_struct_type(prop, "ParticleKey"); RNA_def_property_ui_text(prop, "Keyed States", ""); - prop= RNA_def_property(srna, "random_rotation", PROP_FLOAT, PROP_NONE); + /* Random variables */ + + prop= RNA_def_property(srna, "random_rotation", PROP_FLOAT, PROP_ROTATION); RNA_def_property_float_sdna(prop, NULL, "r_rot"); // RNA_def_property_range(prop, lowerLimitf, upperLimitf); RNA_def_property_ui_text(prop, "Random Rotation", ""); - prop= RNA_def_property(srna, "random_a_velocity", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "random_a_velocity", PROP_FLOAT, PROP_VECTOR); RNA_def_property_float_sdna(prop, NULL, "r_ave"); // RNA_def_property_range(prop, lowerLimitf, upperLimitf); - RNA_def_property_ui_text(prop, "Random erm.. Velocity", "");//TODO: fix name + RNA_def_property_ui_text(prop, "Random Angular Velocity", ""); - prop= RNA_def_property(srna, "random_velocity", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "r_ve");//optional if prop names are the same + prop= RNA_def_property(srna, "random_velocity", PROP_FLOAT, PROP_VECTOR); + RNA_def_property_float_sdna(prop, NULL, "r_ve"); // RNA_def_property_range(prop, lowerLimitf, upperLimitf); RNA_def_property_ui_text(prop, "Random Velocity", ""); @@ -650,9 +681,10 @@ static void rna_def_particle(BlenderRNA *brna) // float fuv[4], foffset; /* coordinates on face/edge number "num" and depth along*/ // /* face normal for volume emission */ - prop= RNA_def_property(srna, "time", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "birthtime", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "time"); // RNA_def_property_range(prop, lowerLimitf, upperLimitf); - RNA_def_property_ui_text(prop, "Time", ""); + RNA_def_property_ui_text(prop, "Birth Time", ""); prop= RNA_def_property(srna, "lifetime", PROP_FLOAT, PROP_NONE); // RNA_def_property_range(prop, lowerLimitf, upperLimitf); @@ -663,11 +695,6 @@ static void rna_def_particle(BlenderRNA *brna) // RNA_def_property_range(prop, lowerLimitf, upperLimitf); RNA_def_property_ui_text(prop, "Die Time", ""); -// prop= RNA_def_property(srna, "banking_angle", PROP_FLOAT, PROP_NONE); -// RNA_def_property_float_sdna(prop, NULL, "bank"); -//// RNA_def_property_range(prop, lowerLimitf, upperLimitf); -// RNA_def_property_ui_text(prop, "Banking Angle", ""); - prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE); // RNA_def_property_range(prop, lowerLimitf, upperLimitf); RNA_def_property_ui_text(prop, "Size", ""); @@ -1133,12 +1160,14 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "draw_step", PROP_INT, PROP_NONE); RNA_def_property_range(prop, 0, 7); + RNA_def_property_ui_range(prop, 0, 10, 1, 0); RNA_def_property_ui_text(prop, "Steps", "How many steps paths are drawn with (power of 2)"); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo"); prop= RNA_def_property(srna, "render_step", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "ren_step"); RNA_def_property_range(prop, 0, 9); + RNA_def_property_ui_range(prop, 0, 20, 1, 0); RNA_def_property_ui_text(prop, "Render", "How many steps paths are rendered with (power of 2)"); prop= RNA_def_property(srna, "hair_step", PROP_INT, PROP_NONE); @@ -1206,7 +1235,8 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "billboard_uv_split", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "bb_uv_split"); - RNA_def_property_range(prop, 1, 10); + RNA_def_property_range(prop, 1, 100); + RNA_def_property_ui_range(prop, 1, 10, 1, 0); RNA_def_property_ui_text(prop, "UV Split", "Amount of rows/columns to split uv coordinates for billboards"); prop= RNA_def_property(srna, "billboard_animation", PROP_ENUM, PROP_NONE); @@ -1234,7 +1264,8 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "billboard_offset", PROP_FLOAT, PROP_VECTOR); RNA_def_property_float_sdna(prop, NULL, "bb_offset"); RNA_def_property_array(prop, 2); - RNA_def_property_range(prop, -1.0f, 1.0f); + RNA_def_property_range(prop, -100.0f, 100.0f); + RNA_def_property_ui_range(prop, -1.0, 1.0, 0.1, 3); RNA_def_property_ui_text(prop, "Billboard Offset", ""); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo"); @@ -1314,7 +1345,11 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "amount", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "totpart"); RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE); - RNA_def_property_range(prop, 0, 100000); + /* This limit is for those freaks who have the machine power to handle it. */ + /* 10M particles take around 2.2 Gb of memory / disk space in saved file and */ + /* each cached frame takes around 0.5 Gb of memory / disk space depending on cache mode. */ + RNA_def_property_range(prop, 0, 10000000); + RNA_def_property_ui_range(prop, 0, 100000, 1, 0); RNA_def_property_ui_text(prop, "Amount", "Total number of particles."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); @@ -1328,7 +1363,8 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "grid_resolution", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "grid_res"); RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE); - RNA_def_property_range(prop, 1, 100); + RNA_def_property_range(prop, 1, 46); /* ~100k particles in a cube */ + RNA_def_property_ui_range(prop, 1, 215, 1, 0); /* ~10M particles in a cube */ RNA_def_property_ui_text(prop, "Resolution", "The resolution of the particle grid."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); @@ -1341,7 +1377,8 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "object_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "obfac"); - RNA_def_property_range(prop, -1.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, -1.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Object", "Let the object give the particle a starting speed"); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); @@ -1353,7 +1390,8 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "particle_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "partfac"); - RNA_def_property_range(prop, -10.0f, 10.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, -1.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Particle", "Let the target particle give the particle a starting speed."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); @@ -1401,13 +1439,15 @@ static void rna_def_particle_settings(BlenderRNA *brna) /* physical properties */ prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0.01f, 100.0f); + RNA_def_property_range(prop, 0.001f, 100000.0f); + RNA_def_property_ui_range(prop, 0.01f, 100.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Mass", "Specify the mass of the particles"); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "particle_size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "size"); - RNA_def_property_range(prop, 0.01f, 100.0f); + RNA_def_property_range(prop, 0.001f, 100000.0f); + RNA_def_property_ui_range(prop, 0.01f, 100.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Size", "The size of the particles"); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); @@ -1466,13 +1506,15 @@ static void rna_def_particle_settings(BlenderRNA *brna) /* children */ prop= RNA_def_property(srna, "child_nbr", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "child_nbr");//optional if prop names are the same - RNA_def_property_range(prop, 0, MAX_PART_CHILDREN); + RNA_def_property_range(prop, 0, 100000); + RNA_def_property_ui_range(prop, 0, 1000, 1, 0); RNA_def_property_ui_text(prop, "Children Per Parent", "Amount of children/parent"); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child"); prop= RNA_def_property(srna, "rendered_child_nbr", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "ren_child_nbr"); - RNA_def_property_range(prop, 0, MAX_PART_CHILDREN); + RNA_def_property_range(prop, 0, 100000); + RNA_def_property_ui_range(prop, 0, 10000, 1, 0); RNA_def_property_ui_text(prop, "Rendered Children", "Amount of children/parent for rendering."); prop= RNA_def_property(srna, "virtual_parents", PROP_FLOAT, PROP_NONE); @@ -1483,7 +1525,8 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "child_size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "childsize"); - RNA_def_property_range(prop, 0.01f, 100.0f); + RNA_def_property_range(prop, 0.001f, 100000.0f); + RNA_def_property_ui_range(prop, 0.01f, 100.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Child Size", "A multiplier for the child particle size."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child"); @@ -1522,13 +1565,15 @@ static void rna_def_particle_settings(BlenderRNA *brna) /* kink */ prop= RNA_def_property(srna, "kink_amplitude", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "kink_amp"); - RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_range(prop, -100000.0f, 100000.0f); + RNA_def_property_ui_range(prop, -10.0f, 10.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Amplitude", "The amplitude of the offset."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child"); prop= RNA_def_property(srna, "kink_frequency", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "kink_freq"); - RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_range(prop, -100000.0f, 100000.0f); + RNA_def_property_ui_range(prop, -10.0f, 10.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Frequency", "The frequency of the offset (1/total length)"); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child"); @@ -1540,24 +1585,28 @@ static void rna_def_particle_settings(BlenderRNA *brna) /* rough */ prop= RNA_def_property(srna, "rough1", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_range(prop, 0.0f, 100000.0f); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Rough1", "Amount of location dependent rough."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child"); prop= RNA_def_property(srna, "rough1_size", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0.01f, 10.0f); + RNA_def_property_range(prop, 0.01f, 100000.0f); + RNA_def_property_ui_range(prop, 0.01f, 10.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Size1", "Size of location dependent rough."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child"); prop= RNA_def_property(srna, "rough2", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rough2"); - RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_range(prop, 0.0f, 100000.0f); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Rough2", "Amount of random rough."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child"); prop= RNA_def_property(srna, "rough2_size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rough2_size"); - RNA_def_property_range(prop, 0.01f, 10.0f); + RNA_def_property_range(prop, 0.01f, 100000.0f); + RNA_def_property_ui_range(prop, 0.01f, 10.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Size2", "Size of random rough."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child"); @@ -1569,7 +1618,8 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "rough_endpoint", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rough_end"); - RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_range(prop, 0.0f, 100000.0f); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Rough Endpoint", "Amount of end point rough."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo_child"); @@ -1600,13 +1650,15 @@ static void rna_def_particle_settings(BlenderRNA *brna) /* drawing stuff */ prop= RNA_def_property(srna, "line_length_tail", PROP_FLOAT, PROP_NONE); RNA_def_property_float_funcs(prop, "rna_PartSetting_linelentail_get", "rna_PartSetting_linelentail_set", NULL); - RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_range(prop, 0.0f, 100000.0f); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Back", "Length of the line's tail"); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo"); prop= RNA_def_property(srna, "line_length_head", PROP_FLOAT, PROP_NONE); RNA_def_property_float_funcs(prop, "rna_PartSetting_linelenhead_get", "rna_PartSetting_linelenhead_set", NULL); - RNA_def_property_range(prop, 0.0f, 10.0f); + RNA_def_property_range(prop, 0.0f, 100000.0f); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Head", "Length of the line's head"); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo"); @@ -1624,14 +1676,16 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "trail_count", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "trail_count"); - RNA_def_property_range(prop, 1.0f, 100.0f); + RNA_def_property_range(prop, 1, 100000); + RNA_def_property_ui_range(prop, 1, 100, 1, 0); RNA_def_property_ui_text(prop, "Trail Count", "Number of trail particles."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo"); /* keyed particles */ prop= RNA_def_property(srna, "keyed_loops", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "keyed_loops"); - RNA_def_property_range(prop, 1.0f, 100.0f); + RNA_def_property_range(prop, 1.0f, 10000.0f); + RNA_def_property_ui_range(prop, 1.0f, 100.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Loop count", "Number of times the keys are looped."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo"); @@ -1674,61 +1728,71 @@ static void rna_def_particle_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "eweight_all", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[0]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "All", "All effector's weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "eweight_spherical", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[1]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Spherical", "Spherical effector weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "eweight_vortex", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[2]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Vortex", "Vortex effector weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "eweight_magnetic", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[3]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Magnetic", "Magnetic effector weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "eweight_wind", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[4]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Wind", "Wind effector weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "eweight_curveguide", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[5]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Curve Guide", "Curve guide effector weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "eweight_texture", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[6]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Magnetic", "Texture effector weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "eweight_harmonic", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[7]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Harmonic", "Harmonic effector weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "eweight_charge", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[8]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Charge", "Charge effector weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "eweight_lennardjones", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "effector_weight[9]"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_range(prop, -200.0f, 200.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3); RNA_def_property_ui_text(prop, "Lennard-Jones", "Lennard-Jones effector weight."); RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c index 0963f2483f3..0148ce819d4 100644 --- a/source/blender/makesrna/intern/rna_pose.c +++ b/source/blender/makesrna/intern/rna_pose.c @@ -58,6 +58,11 @@ static void rna_Pose_update(bContext *C, PointerRNA *ptr) DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA); } +static char *rna_PoseChannel_path(PointerRNA *ptr) +{ + return BLI_sprintfN("pose.pose_channels[\"%s\"]", ((bPoseChannel*)ptr->data)->name); +} + static void rna_BoneGroup_color_set_set(PointerRNA *ptr, int value) { bActionGroup *grp= ptr->data; @@ -297,6 +302,7 @@ static void rna_def_pose_channel(BlenderRNA *brna) srna= RNA_def_struct(brna, "PoseChannel", NULL); RNA_def_struct_sdna(srna, "bPoseChannel"); RNA_def_struct_ui_text(srna, "Pose Channel", "Channel defining pose data for a bone in a Pose."); + RNA_def_struct_path_func(srna, "rna_PoseChannel_path"); RNA_def_struct_idproperties_func(srna, "rna_PoseChannel_idproperties"); prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 774eecba0f1..7268d560282 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -48,6 +48,41 @@ /* RenderEngine */ +static RenderEngineType internal_render_type = { + NULL, NULL, "BLENDER_RENDER", "Blender Render", RE_INTERNAL, NULL, {NULL, NULL, NULL, NULL}}; +#if GAMEBLENDER == 1 +static RenderEngineType internal_game_type = { + NULL, NULL, "BLENDER_GAME", "Blender Game", RE_INTERNAL|RE_GAME, NULL, {NULL, NULL, NULL, NULL}}; +#endif + +ListBase R_engines = {NULL, NULL}; + +void RE_engines_init() +{ + BLI_addtail(&R_engines, &internal_render_type); +#if GAMEBLENDER == 1 + BLI_addtail(&R_engines, &internal_game_type); +#endif +} + +void RE_engines_exit() +{ + RenderEngineType *type, *next; + + for(type=R_engines.first; type; type=next) { + next= type->next; + + BLI_remlink(&R_engines, type); + + if(!(type->flag & RE_INTERNAL)) { + if(type->ext.free) + type->ext.free(type->ext.data); + + MEM_freeN(type); + } + } +} + static void engine_render(RenderEngine *engine, struct Scene *scene) { PointerRNA ptr; @@ -262,10 +297,21 @@ static void rna_def_render_layer(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; + FunctionRNA *func; srna= RNA_def_struct(brna, "RenderLayer", NULL); RNA_def_struct_ui_text(srna, "Render Layer", ""); + func= RNA_def_function(srna, "rect_from_file", "RE_layer_rect_from_file"); + RNA_def_function_ui_description(func, "Copies the pixels of this renderlayer from an image file."); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + prop= RNA_def_string(func, "filename", "", 0, "Filename", "Filename to load into this render tile, must be no smaller then the renderlayer"); + RNA_def_property_flag(prop, PROP_REQUIRED); + prop= RNA_def_int(func, "x", 0, 0, INT_MAX, "Offset X", "Offset the position to copy from if the image is larger then the render layer", 0, INT_MAX); + RNA_def_property_flag(prop, PROP_REQUIRED); + prop= RNA_def_int(func, "y", 0, 0, INT_MAX, "Offset Y", "Offset the position to copy from if the image is larger then the render layer", 0, INT_MAX); + RNA_def_property_flag(prop, PROP_REQUIRED); + RNA_define_verify_sdna(0); rna_def_render_layer_common(srna, 0); diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index aeaedd6f81d..385c7f5b2b1 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -432,6 +432,19 @@ static int rna_Property_registered_optional_get(PointerRNA *ptr) return prop->flag & PROP_REGISTER_OPTIONAL; } +static int rna_BoolProperty_default_get(PointerRNA *ptr) +{ + PropertyRNA *prop= (PropertyRNA*)ptr->data; + rna_idproperty_check(&prop, ptr); + return ((BooleanPropertyRNA*)prop)->defaultvalue; +} + +static int rna_IntProperty_default_get(PointerRNA *ptr) +{ + PropertyRNA *prop= (PropertyRNA*)ptr->data; + rna_idproperty_check(&prop, ptr); + return ((IntPropertyRNA*)prop)->defaultvalue; +} static int rna_IntProperty_hard_min_get(PointerRNA *ptr) { PropertyRNA *prop= (PropertyRNA*)ptr->data; @@ -467,6 +480,12 @@ static int rna_IntProperty_step_get(PointerRNA *ptr) return ((IntPropertyRNA*)prop)->step; } +static float rna_FloatProperty_default_get(PointerRNA *ptr) +{ + PropertyRNA *prop= (PropertyRNA*)ptr->data; + rna_idproperty_check(&prop, ptr); + return ((FloatPropertyRNA*)prop)->defaultvalue; +} static float rna_FloatProperty_hard_min_get(PointerRNA *ptr) { PropertyRNA *prop= (PropertyRNA*)ptr->data; @@ -509,6 +528,19 @@ static int rna_FloatProperty_precision_get(PointerRNA *ptr) return ((FloatPropertyRNA*)prop)->precision; } +static void rna_StringProperty_default_get(PointerRNA *ptr, char *value) +{ + PropertyRNA *prop= (PropertyRNA*)ptr->data; + rna_idproperty_check(&prop, ptr); + strcpy(value, ((StringPropertyRNA*)prop)->defaultvalue); +} +static int rna_StringProperty_default_length(PointerRNA *ptr) +{ + PropertyRNA *prop= (PropertyRNA*)ptr->data; + rna_idproperty_check(&prop, ptr); + return strlen(((StringPropertyRNA*)prop)->defaultvalue); +} + static int rna_StringProperty_max_length_get(PointerRNA *ptr) { PropertyRNA *prop= (PropertyRNA*)ptr->data; @@ -516,6 +548,28 @@ static int rna_StringProperty_max_length_get(PointerRNA *ptr) return ((StringPropertyRNA*)prop)->maxlength; } +static EnumPropertyItem *rna_EnumProperty_default_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + PropertyRNA *prop= (PropertyRNA*)ptr->data; + EnumPropertyRNA *eprop; + + rna_idproperty_check(&prop, ptr); + eprop= (EnumPropertyRNA*)prop; + + if(eprop->itemf==NULL || eprop->itemf==rna_EnumProperty_default_itemf) + return eprop->item; + + return eprop->itemf(C, ptr, free); +} + +/* XXX - not sore this is needed? */ +static int rna_EnumProperty_default_get(PointerRNA *ptr) +{ + PropertyRNA *prop= (PropertyRNA*)ptr->data; + rna_idproperty_check(&prop, ptr); + return ((EnumPropertyRNA*)prop)->defaultvalue; +} + static int rna_enum_check_separator(CollectionPropertyIterator *iter, void *data) { EnumPropertyItem *item= (EnumPropertyItem*)data; @@ -816,6 +870,31 @@ static void rna_def_number_property(StructRNA *srna, PropertyType type) { PropertyRNA *prop; + prop= RNA_def_property(srna, "default", type, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Default", "Default value for this number"); + + switch(type) { + case PROP_BOOLEAN: + RNA_def_property_boolean_funcs(prop, "rna_BoolProperty_default_get", NULL); + break; + case PROP_INT: + RNA_def_property_int_funcs(prop, "rna_IntProperty_default_get", NULL, NULL); + break; + case PROP_FLOAT: + RNA_def_property_float_funcs(prop, "rna_FloatProperty_default_get", NULL, NULL); + break; + } + + +#if 0 // XXX - Variable length arrays + prop= RNA_def_property(srna, "default_array", type, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + if(type == PROP_INT) RNA_def_property_int_funcs(prop, "rna_IntProperty_default_array_get", NULL, NULL); + else RNA_def_property_float_funcs(prop, "rna_FloatProperty_default_array_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Default", "Default value for this number"); +#endif + prop= RNA_def_property(srna, "array_length", PROP_INT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_int_funcs(prop, "rna_Property_array_length_get", NULL, NULL); @@ -866,6 +945,11 @@ static void rna_def_string_property(StructRNA *srna) { PropertyRNA *prop; + prop= RNA_def_property(srna, "default", PROP_STRING, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_string_funcs(prop, "rna_StringProperty_default_get", "rna_StringProperty_default_length", NULL); + RNA_def_property_ui_text(prop, "Default", "string default value."); + prop= RNA_def_property(srna, "max_length", PROP_INT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_int_funcs(prop, "rna_StringProperty_max_length_get", NULL, NULL); @@ -876,6 +960,17 @@ static void rna_def_enum_property(BlenderRNA *brna, StructRNA *srna) { PropertyRNA *prop; + /* the itemf func is used instead, keep blender happy */ + static EnumPropertyItem default_dummy_items[] = { + {PROP_NONE, "DUMMY", 0, "Dummy", ""}, + {0, NULL, 0, NULL, NULL}}; + + prop= RNA_def_property(srna, "default", PROP_ENUM, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_enum_items(prop, default_dummy_items); + RNA_def_property_enum_funcs(prop, "rna_EnumProperty_default_get", NULL, "rna_EnumProperty_default_itemf"); + RNA_def_property_ui_text(prop, "Default", "Default value for this enum"); + prop= RNA_def_property(srna, "items", PROP_COLLECTION, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_struct_type(prop, "EnumPropertyItem"); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index bd23fc9e1f6..2066ebe18a9 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -111,10 +111,67 @@ static void rna_Scene_end_frame_set(PointerRNA *ptr, int value) data->r.efra= value; } +static int rna_Scene_use_preview_range_get(PointerRNA *ptr) +{ + Scene *data= (Scene*)ptr->data; + + /* this is simply overloaded to assume that preview-range + * start frame cannot be less than 1 when on, + * so psfra=0 means 'off' + */ + return (data->r.psfra != 0); +} + +static void rna_Scene_use_preview_range_set(PointerRNA *ptr, int value) +{ + Scene *data= (Scene*)ptr->data; + + /* if enable, copy range from render-range, otherwise just clear */ + if (value) { + data->r.psfra= data->r.sfra; + data->r.pefra= data->r.efra; + } + else + data->r.psfra= 0; +} + + +static void rna_Scene_preview_range_start_frame_set(PointerRNA *ptr, int value) +{ + Scene *data= (Scene*)ptr->data; + + /* check if enabled already */ + if (data->r.psfra == 0) { + /* set end of preview range to end frame, then clamp as per normal */ + // TODO: or just refuse to set instead? + data->r.pefra= data->r.efra; + } + + /* now set normally */ + CLAMP(value, 1, data->r.pefra); + data->r.psfra= value; +} + +static void rna_Scene_preview_range_end_frame_set(PointerRNA *ptr, int value) +{ + Scene *data= (Scene*)ptr->data; + + /* check if enabled already */ + if (data->r.psfra == 0) { + /* set start of preview range to start frame, then clamp as per normal */ + // TODO: or just refuse to set instead? + data->r.psfra= data->r.sfra; + } + + /* now set normally */ + CLAMP(value, data->r.psfra, MAXFRAME); + data->r.pefra= value; +} + static void rna_Scene_frame_update(bContext *C, PointerRNA *ptr) { //Scene *scene= ptr->id.data; - //update_for_newframe(); + //ED_update_for_newframe(C); } static int rna_SceneRenderData_threads_get(PointerRNA *ptr) @@ -232,6 +289,18 @@ static int rna_SceneRenderData_multiple_engines_get(PointerRNA *ptr) return (BLI_countlist(&R_engines) > 1); } +static int rna_SceneRenderData_use_game_engine_get(PointerRNA *ptr) +{ + RenderData *rd= (RenderData*)ptr->data; + RenderEngineType *type; + + for(type=R_engines.first; type; type=type->next) + if(strcmp(type->idname, rd->engine) == 0) + return (type->flag & RE_GAME); + + return 0; +} + static void rna_SceneRenderLayer_layer_set(PointerRNA *ptr, const int *values) { SceneRenderLayer *rl= (SceneRenderLayer*)ptr->data; @@ -254,52 +323,6 @@ static void rna_SceneRenderLayer_pass_update(bContext *C, PointerRNA *ptr) #else -static void rna_def_sculpt(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna= RNA_def_struct(brna, "Sculpt", NULL); - RNA_def_struct_nested(brna, srna, "Scene"); - RNA_def_struct_ui_text(srna, "Sculpt", ""); - - prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "Brush"); - RNA_def_property_ui_text(prop, "Brush", ""); - - prop= RNA_def_property(srna, "symmetry_x", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_X); - RNA_def_property_ui_text(prop, "Symmetry X", "Mirror brush across the X axis."); - - prop= RNA_def_property(srna, "symmetry_y", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Y); - RNA_def_property_ui_text(prop, "Symmetry Y", "Mirror brush across the Y axis."); - - prop= RNA_def_property(srna, "symmetry_z", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Z); - RNA_def_property_ui_text(prop, "Symmetry Z", "Mirror brush across the Z axis."); - - prop= RNA_def_property(srna, "lock_x", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_X); - RNA_def_property_ui_text(prop, "Lock X", "Disallow changes to the X axis of vertices."); - - prop= RNA_def_property(srna, "lock_y", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Y); - RNA_def_property_ui_text(prop, "Lock Y", "Disallow changes to the Y axis of vertices."); - - prop= RNA_def_property(srna, "lock_z", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Z); - RNA_def_property_ui_text(prop, "Lock Z", "Disallow changes to the Z axis of vertices."); - - prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_BRUSH); - RNA_def_property_ui_text(prop, "Show Brush", ""); - - prop= RNA_def_property(srna, "partial_redraw", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_FAST); - RNA_def_property_ui_text(prop, "Partial Redraw", "Optimize sculpting by only refreshing modified faces."); -} - static void rna_def_tool_settings(BlenderRNA *brna) { StructRNA *srna; @@ -339,14 +362,22 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Sculpt"); RNA_def_property_ui_text(prop, "Sculpt", ""); - prop= RNA_def_property(srna, "vpaint", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "VPaint"); + prop= RNA_def_property(srna, "vertex_paint", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "vpaint"); RNA_def_property_ui_text(prop, "Vertex Paint", ""); - prop= RNA_def_property(srna, "wpaint", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "VPaint"); + prop= RNA_def_property(srna, "weight_paint", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "wpaint"); RNA_def_property_ui_text(prop, "Weight Paint", ""); + prop= RNA_def_property(srna, "image_paint", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "imapaint"); + RNA_def_property_ui_text(prop, "Image Paint", ""); + + prop= RNA_def_property(srna, "particle_edit", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "particle"); + RNA_def_property_ui_text(prop, "Particle Edit", ""); + /* Transform */ prop= RNA_def_property(srna, "proportional_editing", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "proportional", 0); @@ -410,9 +441,6 @@ static void rna_def_tool_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "vertex_group_weight", PROP_FLOAT, PROP_PERCENTAGE); RNA_def_property_float_sdna(prop, NULL, "vgroup_weight"); RNA_def_property_ui_text(prop, "Vertex Group Weight", "Weight to assign in vertex groups."); - - /* Sculpt */ - rna_def_sculpt(brna); } void rna_def_render_layer_common(StructRNA *srna, int scene) @@ -1047,7 +1075,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) #endif static EnumPropertyItem engine_items[] = { - {0, "BLENDER", 0, "Blender", ""}, + {0, "BLENDER_RENDER", 0, "Blender Render", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "SceneRenderData", NULL); @@ -1579,23 +1607,31 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_enum_items(prop, engine_items); RNA_def_property_enum_funcs(prop, "rna_SceneRenderData_engine_get", "rna_SceneRenderData_engine_set", "rna_SceneRenderData_engine_itemf"); RNA_def_property_ui_text(prop, "Engine", "Engine to use for rendering."); + RNA_def_property_update(prop, NC_WINDOW, NULL); prop= RNA_def_property(srna, "multiple_engines", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_funcs(prop, "rna_SceneRenderData_multiple_engines_get", NULL); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Multiple Engine", "More than one rendering engine is available."); + RNA_def_property_ui_text(prop, "Multiple Engines", "More than one rendering engine is available."); + + prop= RNA_def_property(srna, "use_game_engine", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_funcs(prop, "rna_SceneRenderData_use_game_engine_get", NULL); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Use Game Engine", "Current rendering engine is a game engine."); } void RNA_def_scene(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - + + /* Struct definition */ srna= RNA_def_struct(brna, "Scene", "ID"); RNA_def_struct_ui_text(srna, "Scene", "Scene consisting objects and defining time and render related settings."); RNA_def_struct_ui_icon(srna, ICON_SCENE_DATA); RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT); - + + /* Global Settings */ prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Camera", "Active camera used for rendering the scene."); @@ -1603,24 +1639,30 @@ void RNA_def_scene(BlenderRNA *brna) prop= RNA_def_property(srna, "world", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "World", "World used for rendering the scene."); + RNA_def_property_update(prop, NC_WORLD, NULL); prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_VECTOR); RNA_def_property_float_sdna(prop, NULL, "cursor"); RNA_def_property_ui_text(prop, "Cursor Location", "3D cursor location."); RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4); - + RNA_def_property_update(prop, NC_WINDOW, NULL); + + /* Bases/Objects */ prop= RNA_def_property(srna, "objects", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "base", NULL); RNA_def_property_struct_type(prop, "Object"); RNA_def_property_ui_text(prop, "Objects", ""); RNA_def_property_collection_funcs(prop, 0, 0, 0, "rna_Scene_objects_get", 0, 0, 0, 0, 0); + /* Layers */ prop= RNA_def_property(srna, "visible_layers", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "lay", 1); RNA_def_property_array(prop, 20); RNA_def_property_ui_text(prop, "Visible Layers", "Layers visible when rendering the scene."); RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_layer_set"); - + + + /* Frame Range Stuff */ prop= RNA_def_property(srna, "current_frame", PROP_INT, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE); RNA_def_property_int_sdna(prop, NULL, "r.cfra"); @@ -1647,20 +1689,46 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "frame_step"); RNA_def_property_ui_text(prop, "Frame Step", "Number of frames to skip forward while rendering/playing back each frame"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - + + /* Preview Range (frame-range for UI playback) */ + prop=RNA_def_property(srna, "use_preview_range", PROP_BOOLEAN, PROP_NONE); /* use_preview_range is not really a separate setting in SDNA */ + RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE); + RNA_def_property_boolean_funcs(prop, "rna_Scene_use_preview_range_get", "rna_Scene_use_preview_range_set"); + RNA_def_property_ui_text(prop, "Use Preview Range", ""); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + + prop= RNA_def_property(srna, "preview_range_start_frame", PROP_INT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE); + RNA_def_property_int_sdna(prop, NULL, "r.psfra"); + RNA_def_property_int_funcs(prop, NULL, "rna_Scene_preview_range_start_frame_set", NULL); + RNA_def_property_ui_text(prop, "Preview Range Start Frame", ""); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + + prop= RNA_def_property(srna, "preview_range_end_frame", PROP_INT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATEABLE); + RNA_def_property_int_sdna(prop, NULL, "r.pefra"); + RNA_def_property_int_funcs(prop, NULL, "rna_Scene_preview_range_end_frame_set", NULL); + RNA_def_property_ui_text(prop, "Preview Range End Frame", ""); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + + /* Stamp */ prop= RNA_def_property(srna, "stamp_note", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "r.stamp_udata"); RNA_def_property_ui_text(prop, "Stamp Note", "User define note for the render stamping."); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - + + /* Nodes (Compositing) */ prop= RNA_def_property(srna, "nodetree", PROP_POINTER, PROP_NONE); RNA_def_property_ui_text(prop, "Node Tree", "Compositing node tree."); + /* Sequencer */ prop= RNA_def_property(srna, "sequence_editor", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "ed"); RNA_def_property_struct_type(prop, "SequenceEditor"); RNA_def_property_ui_text(prop, "Sequence Editor", ""); + /* Keying Sets */ + // TODO: hide the fact that active keyingset is an int? prop= RNA_def_property(srna, "keyingsets", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "keyingsets", NULL); RNA_def_property_struct_type(prop, "KeyingSet"); @@ -1669,17 +1737,20 @@ void RNA_def_scene(BlenderRNA *brna) prop= RNA_def_property(srna, "active_keyingset", PROP_INT, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Active Keying Set", "Current Keying Set index."); - + + /* Tool Settings */ prop= RNA_def_property(srna, "tool_settings", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "toolsettings"); RNA_def_property_struct_type(prop, "ToolSettings"); RNA_def_property_ui_text(prop, "Tool Settings", ""); - + + /* Render Data */ prop= RNA_def_property(srna, "render_data", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "r"); RNA_def_property_struct_type(prop, "SceneRenderData"); RNA_def_property_ui_text(prop, "Render Data", ""); - + + /* Markers */ prop= RNA_def_property(srna, "timeline_markers", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "markers", NULL); RNA_def_property_struct_type(prop, "TimelineMarker"); diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c new file mode 100644 index 00000000000..1e512d8f9bb --- /dev/null +++ b/source/blender/makesrna/intern/rna_sculpt_paint.c @@ -0,0 +1,363 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contributor(s): Campbell Barton + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <stdlib.h> + +#include "RNA_define.h" +#include "RNA_types.h" + +#include "rna_internal.h" + +#include "DNA_scene_types.h" + +#ifdef RNA_RUNTIME + +static PointerRNA rna_ParticleEdit_brush_get(PointerRNA *ptr) +{ + ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data; + ParticleBrushData *brush= NULL;; + + if(pset->brushtype != PE_BRUSH_NONE) + brush= &pset->brush[pset->brushtype]; + + return rna_pointer_inherit_refine(ptr, &RNA_ParticleBrush, brush); +} + +static PointerRNA rna_ParticleBrush_curve_get(PointerRNA *ptr) +{ + return rna_pointer_inherit_refine(ptr, &RNA_CurveMapping, NULL); +} + +#else + +static void rna_def_sculpt(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "Sculpt", NULL); + RNA_def_struct_ui_text(srna, "Sculpt", ""); + + prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Brush"); + RNA_def_property_ui_text(prop, "Brush", ""); + + prop= RNA_def_property(srna, "symmetry_x", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_X); + RNA_def_property_ui_text(prop, "Symmetry X", "Mirror brush across the X axis."); + + prop= RNA_def_property(srna, "symmetry_y", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Y); + RNA_def_property_ui_text(prop, "Symmetry Y", "Mirror brush across the Y axis."); + + prop= RNA_def_property(srna, "symmetry_z", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Z); + RNA_def_property_ui_text(prop, "Symmetry Z", "Mirror brush across the Z axis."); + + prop= RNA_def_property(srna, "lock_x", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_X); + RNA_def_property_ui_text(prop, "Lock X", "Disallow changes to the X axis of vertices."); + + prop= RNA_def_property(srna, "lock_y", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Y); + RNA_def_property_ui_text(prop, "Lock Y", "Disallow changes to the Y axis of vertices."); + + prop= RNA_def_property(srna, "lock_z", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Z); + RNA_def_property_ui_text(prop, "Lock Z", "Disallow changes to the Z axis of vertices."); + + prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_BRUSH); + RNA_def_property_ui_text(prop, "Show Brush", ""); + + prop= RNA_def_property(srna, "partial_redraw", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_FAST); + RNA_def_property_ui_text(prop, "Partial Redraw", "Optimize sculpting by only refreshing modified faces."); +} + +static void rna_def_vertex_paint(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + static EnumPropertyItem prop_mode_items[] = { + {0, "MIX", 0, "Mix", "Use mix blending mode while painting."}, + {1, "ADD", 0, "Add", "Use add blending mode while painting."}, + {2, "SUB", 0, "Subtract", "Use subtract blending mode while painting."}, + {3, "MUL", 0, "Multiply", "Use multiply blending mode while painting."}, + {4, "BLUR", 0, "Blur", "Blur the color with surrounding values"}, + {5, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting."}, + {6, "DARKEN", 0, "Darken", "Use darken blending mode while painting."}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "VertexPaint", NULL); + RNA_def_struct_sdna(srna, "VPaint"); + RNA_def_struct_ui_text(srna, "Vertex Paint", "Properties of vertex and weight paint mode."); + + prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Brush"); + RNA_def_property_ui_text(prop, "Brush", ""); + + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, prop_mode_items); + RNA_def_property_ui_text(prop, "Brush Mode", "Mode in which color is painted."); + + prop= RNA_def_property(srna, "all_faces", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_AREA); + RNA_def_property_ui_text(prop, "All Faces", "Paint on all faces inside brush."); + + prop= RNA_def_property(srna, "vertex_dist", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SOFT); + RNA_def_property_ui_text(prop, "Vertex Dist", "Use distances to vertices (instead of paint entire faces)."); + + prop= RNA_def_property(srna, "normals", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_NORMALS); + RNA_def_property_ui_text(prop, "Normals", "Applies the vertex normal before painting."); + + prop= RNA_def_property(srna, "spray", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SPRAY); + RNA_def_property_ui_text(prop, "Spray", "Keep applying paint effect while holding mouse."); + + prop= RNA_def_property(srna, "gamma", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, 0.1f, 5.0f); + RNA_def_property_ui_text(prop, "Gamma", "Vertex paint Gamma."); + + prop= RNA_def_property(srna, "mul", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, 0.1f, 50.0f); + RNA_def_property_ui_text(prop, "Mul", "Vertex paint Mul."); +} + +static void rna_def_image_paint(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem tool_items[] = { + {PAINT_TOOL_DRAW, "DRAW", 0, "Draw", ""}, + {PAINT_TOOL_SOFTEN, "SOFTEN", 0, "Soften", ""}, + {PAINT_TOOL_SMEAR, "SMEAR", 0, "Smear", ""}, + {PAINT_TOOL_CLONE, "CLONE", 0, "Clone", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "ImagePaint", NULL); + RNA_def_struct_sdna(srna, "ImagePaintSettings"); + RNA_def_struct_ui_text(srna, "Image Paint", "Properties of image and texture painting mode."); + + prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Brush"); + RNA_def_property_ui_text(prop, "Brush", ""); + + prop= RNA_def_property(srna, "tool", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, tool_items); + RNA_def_property_ui_text(prop, "Tool", ""); + + /* booleans */ + + prop= RNA_def_property(srna, "show_brush_draw", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_DRAW_TOOL); + RNA_def_property_ui_text(prop, "Show Brush Draw", "Enables brush shape while drawing."); + + prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_DRAW_TOOL_DRAWING); + RNA_def_property_ui_text(prop, "Show Brush", "Enables brush shape while not drawing."); + + prop= RNA_def_property(srna, "use_projection", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_DISABLE); + RNA_def_property_ui_text(prop, "Project Paint", "Use projection painting for improved consistency in the brush strokes."); + + prop= RNA_def_property(srna, "use_occlude", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_XRAY); + RNA_def_property_ui_text(prop, "Occlude", "Only paint onto the faces directly under the brush (slower)"); + + prop= RNA_def_property(srna, "use_backface_cull", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_BACKFACE); + RNA_def_property_ui_text(prop, "Cull", "Ignore faces pointing away from the view (faster)"); + + prop= RNA_def_property(srna, "use_normal_falloff", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_FLAT); + RNA_def_property_ui_text(prop, "Normal", "Paint most on faces pointing towards the view"); + + prop= RNA_def_property(srna, "use_stencil_layer", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_MASK); + RNA_def_property_ui_text(prop, "Stencil Layer", "Set the mask layer from the UV layer buttons"); + + prop= RNA_def_property(srna, "invert_stencil", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_MASK_INV); + RNA_def_property_ui_text(prop, "Invert", "Invert the stencil layer"); + + prop= RNA_def_property(srna, "use_clone_layer", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_CLONE); + RNA_def_property_ui_text(prop, "Clone Layer", "Use another UV layer as clone source, otherwise use 3D the cursor as the source"); + + /* integers */ + + prop= RNA_def_property(srna, "seam_bleed", PROP_INT, PROP_UNSIGNED); + RNA_def_property_ui_range(prop, 0, 8, 0, 0); + RNA_def_property_ui_text(prop, "Bleed", "Extend paint beyond the faces UVs to reduce seams (in pixels, slower)."); + + prop= RNA_def_property(srna, "normal_angle", PROP_INT, PROP_UNSIGNED); + RNA_def_property_range(prop, 0, 90); + RNA_def_property_ui_text(prop, "Angle", "Paint most on faces pointing towards the view acording to this angle."); +} + +static void rna_def_particle_edit(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem tool_items[] = { + {PE_BRUSH_NONE, "NONE", 0, "None", "Don't use any brush."}, + {PE_BRUSH_COMB, "COMB", 0, "Comb", "Comb hairs."}, + {PE_BRUSH_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth hairs."}, + {PE_BRUSH_WEIGHT, "WEIGHT", 0, "Weight", "Assign weight to hairs."}, + {PE_BRUSH_ADD, "ADD", 0, "Add", "Add hairs."}, + {PE_BRUSH_LENGTH, "LENGTH", 0, "Length", "Make hairs longer or shorter."}, + {PE_BRUSH_PUFF, "PUFF", 0, "Puff", "Make hairs stand up."}, + {PE_BRUSH_CUT, "CUT", 0, "Cut", "Cut hairs."}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem select_mode_items[] = { + {SCE_SELECT_PATH, "PATH", ICON_EDGESEL, "Path", ""}, // XXX icon + {SCE_SELECT_POINT, "POINT", ICON_VERTEXSEL, "Point", ""}, // XXX icon + {SCE_SELECT_END, "END", ICON_FACESEL, "End", "E"}, // XXX icon + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem puff_mode[] = { + {0, "ADD", 0, "Add", "Make hairs more puffy."}, + {1, "SUB", 0, "Sub", "Make hairs less puffy."}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem length_mode[] = { + {0, "GROW", 0, "Grow", "Make hairs longer."}, + {1, "SHRINK", 0, "Shrink", "Make hairs shorter."}, + {0, NULL, 0, NULL, NULL}}; + + /* edit */ + + srna= RNA_def_struct(brna, "ParticleEdit", NULL); + RNA_def_struct_sdna(srna, "ParticleEditSettings"); + RNA_def_struct_ui_text(srna, "Particle Edit", "Properties of particle editing mode."); + + prop= RNA_def_property(srna, "tool", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "brushtype"); + RNA_def_property_enum_items(prop, tool_items); + RNA_def_property_ui_text(prop, "Tool", ""); + + prop= RNA_def_property(srna, "selection_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "selectmode"); + RNA_def_property_enum_items(prop, select_mode_items); + RNA_def_property_ui_text(prop, "Selection Mode", "Particle select and display mode."); + + prop= RNA_def_property(srna, "keep_lengths", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_KEEP_LENGTHS); + RNA_def_property_ui_text(prop, "Keep Lengths", "Keep path lengths constant."); + + prop= RNA_def_property(srna, "keep_root", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_LOCK_FIRST); + RNA_def_property_ui_text(prop, "Keep Root", "Keep root keys unmodified."); + + prop= RNA_def_property(srna, "emitter_deflect", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_DEFLECT_EMITTER); + RNA_def_property_ui_text(prop, "Deflect Emitter", "Keep paths from intersecting the emitter."); + + prop= RNA_def_property(srna, "emitter_distance", PROP_FLOAT, PROP_UNSIGNED); + RNA_def_property_float_sdna(prop, NULL, "emitterdist"); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 10, 3); + RNA_def_property_ui_text(prop, "Emitter Distance", "Distance to keep particles away from the emitter."); + + prop= RNA_def_property(srna, "show_time", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_SHOW_TIME); + RNA_def_property_ui_text(prop, "Show Time", "Show time values of the baked keys."); + + prop= RNA_def_property(srna, "show_children", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_SHOW_CHILD); + RNA_def_property_ui_text(prop, "Show Children", "Show child particles."); + + prop= RNA_def_property(srna, "mirror_x", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_X_MIRROR); + RNA_def_property_ui_text(prop, "X-Axis Mirror", "Mirror operations over the X axis while editing."); + + prop= RNA_def_property(srna, "add_interpolate", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_INTERPOLATE_ADDED); + RNA_def_property_ui_text(prop, "Interpolate", "Interpolate new particles from the existing ones."); + + prop= RNA_def_property(srna, "add_keys", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "totaddkey"); + RNA_def_property_range(prop, 2, INT_MAX); + RNA_def_property_ui_range(prop, 2, 20, 10, 3); + RNA_def_property_ui_text(prop, "Keys", "How many keys to make new particles with."); + + prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "ParticleBrush"); + RNA_def_property_pointer_funcs(prop, "rna_ParticleEdit_brush_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Brush", ""); + + /* brush */ + + srna= RNA_def_struct(brna, "ParticleBrush", NULL); + RNA_def_struct_sdna(srna, "ParticleBrushData"); + RNA_def_struct_ui_text(srna, "Particle Brush", "Particle editing brush."); + + prop= RNA_def_property(srna, "size", PROP_INT, PROP_NONE); + RNA_def_property_range(prop, 1, INT_MAX); + RNA_def_property_ui_range(prop, 1, 100, 10, 3); + RNA_def_property_ui_text(prop, "Size", "Brush size."); + + prop= RNA_def_property(srna, "strength", PROP_INT, PROP_NONE); + RNA_def_property_range(prop, 1, INT_MAX); + RNA_def_property_ui_range(prop, 1, 100, 10, 3); + RNA_def_property_ui_text(prop, "Strength", "Brush strength."); + + prop= RNA_def_property(srna, "steps", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "step"); + RNA_def_property_range(prop, 1, INT_MAX); + RNA_def_property_ui_range(prop, 1, 50, 10, 3); + RNA_def_property_ui_text(prop, "Steps", "Brush steps."); + + prop= RNA_def_property(srna, "puff_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "invert"); + RNA_def_property_enum_items(prop, puff_mode); + RNA_def_property_ui_text(prop, "Puff Mode", ""); + + prop= RNA_def_property(srna, "length_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "invert"); + RNA_def_property_enum_items(prop, length_mode); + RNA_def_property_ui_text(prop, "Length Mode", ""); + + /* dummy */ + prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "CurveMapping"); + RNA_def_property_pointer_funcs(prop, "rna_ParticleBrush_curve_get", NULL, NULL); + RNA_def_property_ui_text(prop, "Curve", ""); +} + +void RNA_def_sculpt_paint(BlenderRNA *brna) +{ + rna_def_sculpt(brna); + rna_def_vertex_paint(brna); + rna_def_image_paint(brna); + rna_def_particle_edit(brna); +} + +#endif + diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c new file mode 100644 index 00000000000..cedbc992dde --- /dev/null +++ b/source/blender/makesrna/intern/rna_smoke.c @@ -0,0 +1,260 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contributor(s): Daniel Genrich + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <stdlib.h> +#include <limits.h> + +#include "RNA_define.h" +#include "RNA_types.h" + +#include "rna_internal.h" + +#include "BKE_modifier.h" +#include "BKE_smoke.h" + +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_smoke_types.h" + +#include "WM_types.h" + + +#ifdef RNA_RUNTIME + +#include "BKE_context.h" +#include "BKE_depsgraph.h" +#include "BKE_particle.h" + +#include "ED_object.h" + +static void rna_Smoke_update(bContext *C, PointerRNA *ptr) +{ + DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA); +} + +static void rna_Smoke_dependency_update(bContext *C, PointerRNA *ptr) +{ + rna_Smoke_update(C, ptr); + DAG_scene_sort(CTX_data_scene(C)); +} + +static void rna_Smoke_reset(bContext *C, PointerRNA *ptr) +{ + SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data; + + smokeModifier_reset(settings->smd); + + rna_Smoke_update(C, ptr); +} + +static void rna_Smoke_reset_dependancy(bContext *C, PointerRNA *ptr) +{ + SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data; + + smokeModifier_reset(settings->smd); + + rna_Smoke_dependency_update(C, ptr); +} + +static void rna_Smoke_redraw(bContext *C, PointerRNA *ptr) +{ + SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data; + + settings->flags |= MOD_SMOKE_VIEW_REDRAWNICE; +} + +static char *rna_SmokeDomainSettings_path(PointerRNA *ptr) +{ + SmokeDomainSettings *settings = (SmokeDomainSettings*)ptr->data; + ModifierData *md= (ModifierData *)settings->smd; + + return BLI_sprintfN("modifiers[%s].domain_settings", md->name); +} + +static char *rna_SmokeFlowSettings_path(PointerRNA *ptr) +{ + SmokeFlowSettings *settings = (SmokeFlowSettings*)ptr->data; + ModifierData *md= (ModifierData *)settings->smd; + + return BLI_sprintfN("modifiers[%s].flow_settings", md->name); +} + +static char *rna_SmokeCollSettings_path(PointerRNA *ptr) +{ + SmokeCollSettings *settings = (SmokeCollSettings*)ptr->data; + ModifierData *md= (ModifierData *)settings->smd; + + return BLI_sprintfN("modifiers[%s].coll_settings", md->name); +} + +#else + +static void rna_def_smoke_domain_settings(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem prop_noise_type_items[] = { + {MOD_SMOKE_NOISEWAVE, "NOISEWAVE", 0, "Wavelet", ""}, + /* {MOD_SMOKE_NOISEFFT, "NOISEFFT", 0, "FFT", ""}, */ + /* {MOD_SMOKE_NOISECURL, "NOISECURL", 0, "Curl", ""}, */ + {0, NULL, 0, NULL, NULL}}; + + srna = RNA_def_struct(brna, "SmokeDomainSettings", NULL); + RNA_def_struct_ui_text(srna, "Domain Settings", "Smoke domain settings."); + RNA_def_struct_sdna(srna, "SmokeDomainSettings"); + RNA_def_struct_path_func(srna, "rna_SmokeDomainSettings_path"); + + prop= RNA_def_property(srna, "maxres", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "maxres"); + RNA_def_property_range(prop, 24, 512); + RNA_def_property_ui_range(prop, 24, 512, 2, 0); + RNA_def_property_ui_text(prop, "Max Res", "Maximal resolution used in the fluid domain."); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset"); + + prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "omega"); + RNA_def_property_range(prop, 0.02, 1.0); + RNA_def_property_ui_range(prop, 0.02, 1.0, 0.02, 2); + RNA_def_property_ui_text(prop, "Color", "Smoke color (0 = black, 1 = white)."); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Smoke_redraw"); + + prop= RNA_def_property(srna, "amplify", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "amplify"); + RNA_def_property_range(prop, 1, 10); + RNA_def_property_ui_range(prop, 1, 10, 1, 0); + RNA_def_property_ui_text(prop, "Amplification", "Enhance the resolution of smoke by this factor using noise."); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset"); + + prop= RNA_def_property(srna, "highres", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGHRES); + RNA_def_property_ui_text(prop, "High res", "Show high resolution (using amplification)."); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); + + prop= RNA_def_property(srna, "noise_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "noise"); + RNA_def_property_enum_items(prop, prop_noise_type_items); + RNA_def_property_ui_text(prop, "Noise Method", "Noise method which is used for creating the high resolution"); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset"); + + prop= RNA_def_property(srna, "visibility", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "visibility"); + RNA_def_property_range(prop, 1, 15); + RNA_def_property_ui_range(prop, 1, 15, 1, 0); + RNA_def_property_ui_text(prop, "Display", "How much of the resolution should be shown during preview (every 2nd, 3rd, etc)."); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Smoke_redraw"); + + prop= RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "alpha"); + RNA_def_property_range(prop, -5.0, 5.0); + RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5); + RNA_def_property_ui_text(prop, "Gravity", "Higher value results in sinking smoke"); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL); + + prop= RNA_def_property(srna, "beta", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "beta"); + RNA_def_property_range(prop, -5.0, 5.0); + RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5); + RNA_def_property_ui_text(prop, "Heat", "Higher value results in faster rising smoke."); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL); + + prop= RNA_def_property(srna, "coll_group", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "coll_group"); + RNA_def_property_struct_type(prop, "Group"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Collision Group", "Limit collisions to this group."); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy"); + + prop= RNA_def_property(srna, "fluid_group", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "fluid_group"); + RNA_def_property_struct_type(prop, "Group"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Fluid Group", "Limit fluid objects to this group."); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy"); + + prop= RNA_def_property(srna, "eff_group", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "eff_group"); + RNA_def_property_struct_type(prop, "Group"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this group."); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy"); +} + +static void rna_def_smoke_flow_settings(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "SmokeFlowSettings", NULL); + RNA_def_struct_ui_text(srna, "Flow Settings", "Smoke flow settings."); + RNA_def_struct_sdna(srna, "SmokeFlowSettings"); + RNA_def_struct_path_func(srna, "rna_SmokeFlowSettings_path"); + + prop= RNA_def_property(srna, "density", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "density"); + RNA_def_property_range(prop, 0.001, 1); + RNA_def_property_ui_range(prop, 0.001, 1.0, 1.0, 4); + RNA_def_property_ui_text(prop, "Density", ""); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL); + + prop= RNA_def_property(srna, "temperature", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "temp"); + RNA_def_property_range(prop, -10, 10); + RNA_def_property_ui_range(prop, -10, 10, 1, 1); + RNA_def_property_ui_text(prop, "Temp. Diff.", "Temperature difference to ambientt temperature."); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL); + + prop= RNA_def_property(srna, "psys", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "psys"); + RNA_def_property_struct_type(prop, "ParticleSystem"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Particle Systems", "Particle systems emitted from the object."); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset_dependancy"); + + prop= RNA_def_property(srna, "outflow", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "type", MOD_SMOKE_FLOW_TYPE_OUTFLOW); + RNA_def_property_ui_text(prop, "Outflow", "Deletes smoke from simulation"); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL); +} + +static void rna_def_smoke_coll_settings(BlenderRNA *brna) +{ + StructRNA *srna; + + srna = RNA_def_struct(brna, "SmokeCollSettings", NULL); + RNA_def_struct_ui_text(srna, "Collision Settings", "Smoke collision settings."); + RNA_def_struct_sdna(srna, "SmokeCollSettings"); + RNA_def_struct_path_func(srna, "rna_SmokeCollSettings_path"); +} + +void RNA_def_smoke(BlenderRNA *brna) +{ + rna_def_smoke_domain_settings(brna); + rna_def_smoke_flow_settings(brna); + rna_def_smoke_coll_settings(brna); +} + +#endif + diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 461c46e09bf..793970dea49 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -239,6 +239,14 @@ StructRNA *rna_SpaceButtonsWindow_pin_id_typef(PointerRNA *ptr) return &RNA_ID; } +void rna_SpaceButtonsWindow_align_set(PointerRNA *ptr, int value) +{ + SpaceButs *sbuts= (SpaceButs*)(ptr->data); + + sbuts->align= value; + sbuts->re_align= 1; +} + /* Space Console */ static void rna_ConsoleLine_line_get(PointerRNA *ptr, char *value) { @@ -279,6 +287,22 @@ static void rna_ConsoleLine_cursor_index_range(PointerRNA *ptr, int *min, int *m *max= ci->len; } +static void rna_View3D_display_background_image_set(PointerRNA *ptr, int value) +{ + View3D *vd= (View3D*)ptr->data; + + if(value) vd->flag |= V3D_DISPBGPIC; + else vd->flag &= ~V3D_DISPBGPIC; + + if((vd->flag & V3D_DISPBGPIC) && vd->bgpic == NULL) { + vd->bgpic= MEM_callocN(sizeof(BGpic), "bgpic"); + vd->bgpic->size= 5.0; + vd->bgpic->blend= 0.5; + vd->bgpic->iuser.fie_ima= 2; + vd->bgpic->iuser.ok= 1; + } +} + #else static void rna_def_space(BlenderRNA *brna) @@ -305,8 +329,8 @@ static void rna_def_space_image_uv(BlenderRNA *brna) static EnumPropertyItem sticky_mode_items[] = { {SI_STICKY_DISABLE, "DISABLED", ICON_STICKY_UVS_DISABLE, "Disabled", "Sticky vertex selection disabled."}, - {SI_STICKY_LOC, "SHARED_LOCATION", ICON_STICKY_UVS_LOC, "SHARED_LOCATION", "Select UVs that are at the same location and share a mesh vertex."}, - {SI_STICKY_VERTEX, "SHARED_VERTEX", ICON_STICKY_UVS_VERT, "SHARED_VERTEX", "Select UVs that share mesh vertex, irrespective if they are in the same location."}, + {SI_STICKY_LOC, "SHARED_LOCATION", ICON_STICKY_UVS_LOC, "Shared Location", "Select UVs that are at the same location and share a mesh vertex."}, + {SI_STICKY_VERTEX, "SHARED_VERTEX", ICON_STICKY_UVS_VERT, "Shared Vertex", "Select UVs that share mesh vertex, irrespective if they are in the same location."}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem dt_uv_items[] = { @@ -415,6 +439,7 @@ static void rna_def_space_outliner(BlenderRNA *brna) {10, "SEQUENCE", 0, "Sequence", ""}, {11, "DATABLOCKS", 0, "Datablocks", ""}, {12, "USER_PREFERENCES", 0, "User Preferences", ""}, + {13, "KEYMAPS", 0, "Key Maps", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "SpaceOutliner", "Space"); @@ -446,29 +471,35 @@ static void rna_def_background_image(BlenderRNA *brna) prop= RNA_def_property(srna, "image", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "ima"); RNA_def_property_ui_text(prop, "Image", "Image displayed and edited in this space."); + RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, NULL); prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NEVER_NULL); RNA_def_property_pointer_sdna(prop, NULL, "iuser"); RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed."); + RNA_def_property_update(prop, NC_WINDOW, NULL); prop= RNA_def_property(srna, "x_offset", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "xof"); RNA_def_property_ui_text(prop, "X Offset", "Offsets image horizontally from the view center"); + RNA_def_property_update(prop, NC_WINDOW, NULL); prop= RNA_def_property(srna, "y_offset", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "yof"); RNA_def_property_ui_text(prop, "Y Offset", "Offsets image vertically from the view center"); + RNA_def_property_update(prop, NC_WINDOW, NULL); prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "size"); RNA_def_property_ui_text(prop, "Size", "Scaling factor for the background image."); RNA_def_property_range(prop, 0.0, FLT_MAX); + RNA_def_property_update(prop, NC_WINDOW, NULL); prop= RNA_def_property(srna, "transparency", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "blend"); RNA_def_property_ui_text(prop, "Transparency", "Amount to blend the image against the background color."); RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_update(prop, NC_WINDOW, NULL); } @@ -604,6 +635,7 @@ static void rna_def_space_3dview(BlenderRNA *brna) RNA_def_property_update(prop, NC_WINDOW, NULL); prop= RNA_def_property(srna, "display_background_image", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_funcs(prop, NULL, "rna_View3D_display_background_image_set"); RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_DISPBGPIC); RNA_def_property_ui_text(prop, "Display Background Image", "Display a reference image behind objects in the 3D View"); RNA_def_property_update(prop, NC_WINDOW, NULL); @@ -638,7 +670,18 @@ static void rna_def_space_3dview(BlenderRNA *brna) RNA_def_property_enum_items(prop, transform_orientation_items); RNA_def_property_ui_text(prop, "Transform Orientation", "The alignment of manipulator handles."); RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, NULL); + + prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, "RegionView3D", "viewlock", RV3D_LOCKED); + RNA_def_property_ui_text(prop, "Lock", "Lock View Rotation"); + prop= RNA_def_property(srna, "box_preview", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, "RegionView3D", "viewlock", RV3D_BOXVIEW); + RNA_def_property_ui_text(prop, "Box", ""); + + prop= RNA_def_property(srna, "box_clip", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, "RegionView3D", "viewlock", RV3D_BOXCLIP); + RNA_def_property_ui_text(prop, "Clip", ""); } static void rna_def_space_buttons(BlenderRNA *brna) @@ -658,28 +701,33 @@ static void rna_def_space_buttons(BlenderRNA *brna) {BCONTEXT_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture"}, {BCONTEXT_PARTICLE, "PARTICLE", ICON_PARTICLES, "Particle", "Particle"}, {BCONTEXT_PHYSICS, "PHYSICS", ICON_PHYSICS, "Physics", "Physics"}, - {BCONTEXT_GAME, "GAME", ICON_GAME, "Game", "Game"}, {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem panel_alignment_items[] = { - {1, "HORIZONTAL", 0, "Horizontal", ""}, - {2, "VERTICAL", 0, "Vertical", ""}, + static EnumPropertyItem align_items[] = { + {BUT_HORIZONTAL, "HORIZONTAL", 0, "Horizontal", ""}, + {BUT_VERTICAL, "VERTICAL", 0, "Vertical", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "SpaceButtonsWindow", "Space"); RNA_def_struct_sdna(srna, "SpaceButs"); RNA_def_struct_ui_text(srna, "Buttons Space", "Buttons Window space data"); - prop= RNA_def_property(srna, "buttons_context", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "context", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "mainb"); RNA_def_property_enum_items(prop, buttons_context_items); - RNA_def_property_ui_text(prop, "Buttons Context", "The type of active data to display and edit in the buttons window"); + RNA_def_property_ui_text(prop, "Context", "Type of active data to display and edit."); RNA_def_property_update(prop, NC_WINDOW, NULL); - prop= RNA_def_property(srna, "panel_alignment", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "align", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "align"); - RNA_def_property_enum_items(prop, panel_alignment_items); - RNA_def_property_ui_text(prop, "Panel Alignment", "Arrangement of the panels within the buttons window"); + RNA_def_property_enum_items(prop, align_items); + RNA_def_property_enum_funcs(prop, NULL, "rna_SpaceButtonsWindow_align_set", NULL); + RNA_def_property_ui_text(prop, "Align", "Arrangement of the panels."); + RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "brush_texture", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SB_BRUSH_TEX); + RNA_def_property_ui_text(prop, "Brush Texture", "Show brush textures."); RNA_def_property_update(prop, NC_WINDOW, NULL); /* pinned data */ @@ -1017,6 +1065,10 @@ static void rna_def_space_graph(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", SIPO_NOHANDLES); RNA_def_property_ui_text(prop, "Show Handles", "Show handles of Bezier control points."); + prop= RNA_def_property(srna, "only_selected_curves_handles", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SIPO_SELCUVERTSONLY); + RNA_def_property_ui_text(prop, "Only Selected Curve Keyframes", "Only keyframes of selected F-Curves are visible and editable."); + /* editing */ prop= RNA_def_property(srna, "automerge_keyframes", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NOTRANSKEYCULL); @@ -1044,6 +1096,10 @@ static void rna_def_space_nla(BlenderRNA *brna) RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SNLA_NODRAWCFRANUM); RNA_def_property_ui_text(prop, "Show Frame Number Indicator", "Show frame number beside the current frame indicator line."); + prop= RNA_def_property(srna, "show_strip_curves", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SNLA_NOSTRIPCURVES); + RNA_def_property_ui_text(prop, "Show Control Curves", "Show influence curves on strips."); + /* editing */ // TODO... autosnap, dopesheet? } @@ -1181,7 +1237,7 @@ static void rna_def_fileselect_params(BlenderRNA *brna) prop= RNA_def_property(srna, "do_filter", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FILE_FILTER); RNA_def_property_ui_text(prop, "Filter Files", "Enable filtering of files."); - RNA_def_property_update(prop, NC_FILE | ND_PARAMS, NULL); + RNA_def_property_update(prop, NC_FILE | ND_FILELIST, NULL); prop= RNA_def_property(srna, "hide_dot", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", FILE_HIDE_DOT); @@ -1198,49 +1254,49 @@ static void rna_def_fileselect_params(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "filter", IMAGEFILE); RNA_def_property_ui_text(prop, "Filter Images", "Show image files."); RNA_def_property_ui_icon(prop, ICON_FILE_IMAGE, 0); - RNA_def_property_update(prop, NC_FILE | ND_PARAMS, NULL); + RNA_def_property_update(prop, NC_FILE | ND_FILELIST, NULL); prop= RNA_def_property(srna, "filter_blender", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", BLENDERFILE); RNA_def_property_ui_text(prop, "Filter Blender", "Show .blend files."); RNA_def_property_ui_icon(prop, ICON_FILE_BLEND, 0); - RNA_def_property_update(prop, NC_FILE | ND_PARAMS, NULL); + RNA_def_property_update(prop, NC_FILE | ND_FILELIST, NULL); prop= RNA_def_property(srna, "filter_movie", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", MOVIEFILE); RNA_def_property_ui_text(prop, "Filter Movies", "Show movie files."); RNA_def_property_ui_icon(prop, ICON_FILE_MOVIE, 0); - RNA_def_property_update(prop, NC_FILE | ND_PARAMS, NULL); + RNA_def_property_update(prop, NC_FILE | ND_FILELIST, NULL); prop= RNA_def_property(srna, "filter_script", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", PYSCRIPTFILE); RNA_def_property_ui_text(prop, "Filter Script", "Show script files."); RNA_def_property_ui_icon(prop, ICON_FILE_SCRIPT, 0); - RNA_def_property_update(prop, NC_FILE | ND_PARAMS, NULL); + RNA_def_property_update(prop, NC_FILE | ND_FILELIST, NULL); prop= RNA_def_property(srna, "filter_font", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", FTFONTFILE); RNA_def_property_ui_text(prop, "Filter Fonts", "Show font files."); RNA_def_property_ui_icon(prop, ICON_FILE_FONT, 0); - RNA_def_property_update(prop, NC_FILE | ND_PARAMS, NULL); + RNA_def_property_update(prop, NC_FILE | ND_FILELIST, NULL); prop= RNA_def_property(srna, "filter_sound", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", SOUNDFILE); RNA_def_property_ui_text(prop, "Filter Sound", "Show sound files."); RNA_def_property_ui_icon(prop, ICON_FILE_SOUND, 0); - RNA_def_property_update(prop, NC_FILE | ND_PARAMS, NULL); + RNA_def_property_update(prop, NC_FILE | ND_FILELIST, NULL); prop= RNA_def_property(srna, "filter_text", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", TEXTFILE); RNA_def_property_ui_text(prop, "Filter Text", "Show text files."); RNA_def_property_ui_icon(prop, ICON_FILE_BLANK, 0); - RNA_def_property_update(prop, NC_FILE | ND_PARAMS, NULL); + RNA_def_property_update(prop, NC_FILE | ND_FILELIST, NULL); prop= RNA_def_property(srna, "filter_folder", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "filter", FOLDERFILE); RNA_def_property_ui_text(prop, "Filter Folder", "Show folders."); RNA_def_property_ui_icon(prop, ICON_FILE_FOLDER, 0); - RNA_def_property_update(prop, NC_FILE | ND_PARAMS, NULL); + RNA_def_property_update(prop, NC_FILE | ND_FILELIST, NULL); } diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c index 330d38502ce..694f980e5e9 100644 --- a/source/blender/makesrna/intern/rna_texture.c +++ b/source/blender/makesrna/intern/rna_texture.c @@ -40,7 +40,7 @@ #include "WM_types.h" static EnumPropertyItem texture_filter_items[] = { - {TXF_DEFAULT, "DEFAULT", 0, "Default", ""}, + {TXF_BOX, "BOX", 0, "Box", ""}, {TXF_EWA, "EWA", 0, "EWA", ""}, {TXF_FELINE, "FELINE", 0, "FELINE", ""}, {TXF_AREA, "AREA", 0, "Area", ""}, @@ -126,7 +126,7 @@ static void rna_ImageTexture_mipmap_set(PointerRNA *ptr, int value) else tex->imaflag &= ~TEX_MIPMAP; if((tex->imaflag & TEX_MIPMAP) && tex->texfilter == TXF_SAT) - tex->texfilter = TXF_DEFAULT; + tex->texfilter = TXF_EWA; } static EnumPropertyItem *rna_ImageTexture_filter_itemf(bContext *C, PointerRNA *ptr, int *free) @@ -135,7 +135,7 @@ static EnumPropertyItem *rna_ImageTexture_filter_itemf(bContext *C, PointerRNA * EnumPropertyItem *item= NULL; int totitem= 0; - RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_DEFAULT); + RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_BOX); RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_EWA); RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_FELINE); RNA_enum_items_add_value(&item, &totitem, texture_filter_items, TXF_AREA); @@ -1178,19 +1178,19 @@ static void rna_def_texture(BlenderRNA *brna) static EnumPropertyItem prop_type_items[] = { {0, "NONE", 0, "None", ""}, - {TEX_CLOUDS, "CLOUDS", 0, "Clouds", ""}, - {TEX_WOOD, "WOOD", 0, "Wood", ""}, - {TEX_MARBLE, "MARBLE", 0, "Marble", ""}, - {TEX_MAGIC, "MAGIC", 0, "Magic", ""}, - {TEX_BLEND, "BLEND", 0, "Blend", ""}, - {TEX_STUCCI, "STUCCI", 0, "Stucci", ""}, - {TEX_NOISE, "NOISE", 0, "Noise", ""}, - {TEX_IMAGE, "IMAGE", 0, "Image or Movie", ""}, - {TEX_PLUGIN, "PLUGIN", 0, "Plugin", ""}, - {TEX_ENVMAP, "ENVIRONMENT_MAP", 0, "Environment Map", ""}, - {TEX_MUSGRAVE, "MUSGRAVE", 0, "Musgrave", ""}, - {TEX_VORONOI, "VORONOI", 0, "Voronoi", ""}, - {TEX_DISTNOISE, "DISTORTED_NOISE", 0, "Distorted Noise", ""}, + {TEX_PLUGIN, "PLUGIN", ICON_CONSTRAINT, "Plugin", ""}, + {TEX_IMAGE, "IMAGE", ICON_RENDER_RESULT, "Image or Movie", ""}, + {TEX_ENVMAP, "ENVIRONMENT_MAP", ICON_RENDER_RESULT, "Environment Map", ""}, + {TEX_CLOUDS, "CLOUDS", ICON_TEXTURE, "Clouds", ""}, + {TEX_WOOD, "WOOD", ICON_TEXTURE, "Wood", ""}, + {TEX_MARBLE, "MARBLE", ICON_TEXTURE, "Marble", ""}, + {TEX_MAGIC, "MAGIC", ICON_TEXTURE, "Magic", ""}, + {TEX_BLEND, "BLEND", ICON_TEXTURE, "Blend", ""}, + {TEX_STUCCI, "STUCCI", ICON_TEXTURE, "Stucci", ""}, + {TEX_NOISE, "NOISE", ICON_TEXTURE, "Noise", ""}, + {TEX_MUSGRAVE, "MUSGRAVE", ICON_TEXTURE, "Musgrave", ""}, + {TEX_VORONOI, "VORONOI", ICON_TEXTURE, "Voronoi", ""}, + {TEX_DISTNOISE, "DISTORTED_NOISE", ICON_TEXTURE, "Distorted Noise", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "Texture", "ID"); @@ -1200,10 +1200,12 @@ static void rna_def_texture(BlenderRNA *brna) RNA_def_struct_refine_func(srna, "rna_Texture_refine"); prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + //RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_enum_sdna(prop, NULL, "type"); RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Type", ""); RNA_def_property_update(prop, NC_TEXTURE, NULL); - + prop= RNA_def_property(srna, "use_color_ramp", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", TEX_COLORBAND); RNA_def_property_boolean_funcs(prop, NULL, "rna_Texture_use_color_ramp_set"); diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index 21bacc76a8c..590f85fedd7 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -620,6 +620,9 @@ static void rna_def_panel(BlenderRNA *brna) prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "UILayout"); + prop= RNA_def_property(srna, "text", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "drawname"); + /* registration */ prop= RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "type->idname"); @@ -647,8 +650,8 @@ static void rna_def_panel(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "type->flag", PNL_DEFAULT_CLOSED); RNA_def_property_flag(prop, PROP_REGISTER); - prop= RNA_def_property(srna, "no_header", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "type->flag", PNL_NO_HEADER); + prop= RNA_def_property(srna, "show_header", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "type->flag", PNL_NO_HEADER); RNA_def_property_flag(prop, PROP_REGISTER); } diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index f9aa27fcdbd..f1fd11a0094 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -101,11 +101,6 @@ static PointerRNA rna_UserDef_edit_get(PointerRNA *ptr) return rna_pointer_inherit_refine(ptr, &RNA_UserPreferencesEdit, ptr->data); } -static PointerRNA rna_UserDef_autosave_get(PointerRNA *ptr) -{ - return rna_pointer_inherit_refine(ptr, &RNA_UserPreferencesAutosave, ptr->data); -} - static PointerRNA rna_UserDef_language_get(PointerRNA *ptr) { return rna_pointer_inherit_refine(ptr, &RNA_UserPreferencesLanguage, ptr->data); @@ -493,7 +488,7 @@ static void rna_def_userdef_theme_spaces_main(StructRNA *srna, int spacetype) } /* list/channels */ - if(ELEM4(spacetype, SPACE_IPO, SPACE_ACTION, SPACE_NLA, SPACE_NODE)) { + if(ELEM5(spacetype, SPACE_IPO, SPACE_ACTION, SPACE_NLA, SPACE_NODE, SPACE_FILE)) { prop= RNA_def_property(srna, "list", PROP_FLOAT, PROP_COLOR); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "List Back", ""); @@ -1721,8 +1716,8 @@ static void rna_def_userdef_edit(BlenderRNA *brna) StructRNA *srna; static EnumPropertyItem auto_key_modes[] = { - {AUTOKEY_MODE_NORMAL, "ADD_REPLACE_KEYS", 0, "Add/Replace Keys", ""}, - {AUTOKEY_MODE_EDITKEYS, "REPLACE_KEYS", 0, "Replace Keys", ""}, + {AUTOKEY_MODE_NORMAL, "ADD_REPLACE_KEYS", 0, "Add/Replace", ""}, + {AUTOKEY_MODE_EDITKEYS, "REPLACE_KEYS", 0, "Replace", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem new_interpolation_types[] = { @@ -1927,6 +1922,11 @@ static void rna_def_userdef_language(BlenderRNA *brna) RNA_def_property_range(prop, 48, 128); RNA_def_property_ui_text(prop, "DPI", "Font size and resolution for display."); RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "scrollback", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "scrollback"); + RNA_def_property_range(prop, 32, 32768); + RNA_def_property_ui_text(prop, "Scrollback", "Maximum number of lines to store for the console buffer."); /* Language Selection */ @@ -1956,55 +1956,20 @@ static void rna_def_userdef_language(BlenderRNA *brna) RNA_def_property_update(prop, NC_WINDOW, NULL); } -static void rna_def_userdef_autosave(BlenderRNA *brna) -{ - PropertyRNA *prop; - StructRNA *srna; - - /* Autosave */ - - srna= RNA_def_struct(brna, "UserPreferencesAutosave", NULL); - RNA_def_struct_sdna(srna, "UserDef"); - RNA_def_struct_nested(brna, srna, "UserPreferences"); - RNA_def_struct_ui_text(srna, "Auto Save", "Automatic backup file settings."); - - prop= RNA_def_property(srna, "save_version", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "versions"); - RNA_def_property_range(prop, 0, 32); - RNA_def_property_ui_text(prop, "Save Versions", "The number of old versions to maintain in the current directory, when manually saving."); - - prop= RNA_def_property(srna, "auto_save_temporary_files", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSAVE); - RNA_def_property_ui_text(prop, "Auto Save Temporary Files", "Automatic saving of temporary files."); - - prop= RNA_def_property(srna, "auto_save_time", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "savetime"); - RNA_def_property_range(prop, 1, 60); - RNA_def_property_ui_text(prop, "Auto Save Time", "The time (in minutes) to wait between automatic temporary saves."); - - prop= RNA_def_property(srna, "recent_files", PROP_INT, PROP_NONE); - RNA_def_property_range(prop, 0, 30); - RNA_def_property_ui_text(prop, "Recent Files", "Maximum number of recently opened files to remember."); - - prop= RNA_def_property(srna, "save_preview_images", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_SAVE_PREVIEWS); - RNA_def_property_ui_text(prop, "Save Preview Images", "Enables automatic saving of preview images in the .blend file."); -} - static void rna_def_userdef_system(BlenderRNA *brna) { PropertyRNA *prop; StructRNA *srna; static EnumPropertyItem gl_texture_clamp_items[] = { - {0, "GL_CLAMP_OFF", 0, "GL Texture Clamp Off", ""}, - {8192, "GL_CLAMP_8192", 0, "GL Texture Clamp 8192", ""}, - {4096, "GL_CLAMP_4096", 0, "GL Texture Clamp 4096", ""}, - {2048, "GL_CLAMP_2048", 0, "GL Texture Clamp 2048", ""}, - {1024, "GL_CLAMP_1024", 0, "GL Texture Clamp 1024", ""}, - {512, "GL_CLAMP_512", 0, "GL Texture Clamp 512", ""}, - {256, "GL_CLAMP_256", 0, "GL Texture Clamp 256", ""}, - {128, "GL_CLAMP_128", 0, "GL Texture Clamp 128", ""}, + {0, "GL_CLAMP_OFF", 0, "Off", ""}, + {8192, "GL_CLAMP_8192", 0, "8192", ""}, + {4096, "GL_CLAMP_4096", 0, "4096", ""}, + {2048, "GL_CLAMP_2048", 0, "2048", ""}, + {1024, "GL_CLAMP_1024", 0, "1024", ""}, + {512, "GL_CLAMP_512", 0, "512", ""}, + {256, "GL_CLAMP_256", 0, "256", ""}, + {128, "GL_CLAMP_128", 0, "128", ""}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem audio_mixing_samples_items[] = { @@ -2174,8 +2139,33 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna) prop= RNA_def_property(srna, "temporary_directory", PROP_STRING, PROP_DIRPATH); RNA_def_property_string_sdna(prop, NULL, "tempdir"); RNA_def_property_ui_text(prop, "Temporary Directory", "The directory for storing temporary save files."); + + /* Autosave */ + + prop= RNA_def_property(srna, "save_version", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "versions"); + RNA_def_property_range(prop, 0, 32); + RNA_def_property_ui_text(prop, "Save Versions", "The number of old versions to maintain in the current directory, when manually saving."); + + prop= RNA_def_property(srna, "auto_save_temporary_files", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSAVE); + RNA_def_property_ui_text(prop, "Auto Save Temporary Files", "Automatic saving of temporary files."); + + prop= RNA_def_property(srna, "auto_save_time", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "savetime"); + RNA_def_property_range(prop, 1, 60); + RNA_def_property_ui_text(prop, "Auto Save Time", "The time (in minutes) to wait between automatic temporary saves."); + + prop= RNA_def_property(srna, "recent_files", PROP_INT, PROP_NONE); + RNA_def_property_range(prop, 0, 30); + RNA_def_property_ui_text(prop, "Recent Files", "Maximum number of recently opened files to remember."); + + prop= RNA_def_property(srna, "save_preview_images", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_SAVE_PREVIEWS); + RNA_def_property_ui_text(prop, "Save Preview Images", "Enables automatic saving of preview images in the .blend file."); } + void RNA_def_userdef(BlenderRNA *brna) { StructRNA *srna; @@ -2185,10 +2175,9 @@ void RNA_def_userdef(BlenderRNA *brna) {0, "VIEW_CONTROLS", 0, "View", ""}, {1, "EDIT_METHODS", 0, "Editing", ""}, {2, "LANGUAGE_COLORS", 0, "Language", ""}, - {3, "AUTO_SAVE", 0, "Auto Save", ""}, - {4, "SYSTEM_OPENGL", 0, "System & OpenGL", ""}, - {5, "FILE_PATHS", 0, "File Paths", ""}, - {6, "THEMES", 0, "Themes", ""}, + {3, "SYSTEM_OPENGL", 0, "System", ""}, + {4, "FILE_PATHS", 0, "File", ""}, + {5, "THEMES", 0, "Themes", ""}, {0, NULL, 0, NULL, NULL}}; rna_def_userdef_dothemes(brna); @@ -2224,11 +2213,6 @@ void RNA_def_userdef(BlenderRNA *brna) RNA_def_property_pointer_funcs(prop, "rna_UserDef_edit_get", NULL, NULL); RNA_def_property_ui_text(prop, "Edit Methods", "Settings for interacting with Blender data."); - prop= RNA_def_property(srna, "autosave", PROP_POINTER, PROP_NEVER_NULL); - RNA_def_property_struct_type(prop, "UserPreferencesAutosave"); - RNA_def_property_pointer_funcs(prop, "rna_UserDef_autosave_get", NULL, NULL); - RNA_def_property_ui_text(prop, "Auto Save", "Automatic backup file settings."); - prop= RNA_def_property(srna, "language", PROP_POINTER, PROP_NEVER_NULL); RNA_def_property_struct_type(prop, "UserPreferencesLanguage"); RNA_def_property_pointer_funcs(prop, "rna_UserDef_language_get", NULL, NULL); @@ -2246,7 +2230,6 @@ void RNA_def_userdef(BlenderRNA *brna) rna_def_userdef_view(brna); rna_def_userdef_edit(brna); - rna_def_userdef_autosave(brna); rna_def_userdef_language(brna); rna_def_userdef_filepaths(brna); rna_def_userdef_system(brna); diff --git a/source/blender/makesrna/intern/rna_vpaint.c b/source/blender/makesrna/intern/rna_vpaint.c deleted file mode 100644 index bf6b70dab23..00000000000 --- a/source/blender/makesrna/intern/rna_vpaint.c +++ /dev/null @@ -1,90 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Contributor(s): Campbell Barton - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include <stdlib.h> - -#include "RNA_define.h" -#include "RNA_types.h" - -#include "rna_internal.h" - -#include "DNA_scene_types.h" - -#ifdef RNA_RUNTIME - -#else - -void RNA_def_vpaint(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - static EnumPropertyItem prop_mode_items[] = { - {0, "MIX", 0, "Mix", "Use mix blending mode while painting."}, - {1, "ADD", 0, "Add", "Use add blending mode while painting."}, - {2, "SUB", 0, "Subtract", "Use subtract blending mode while painting."}, - {3, "MUL", 0, "Multiply", "Use multiply blending mode while painting."}, - {4, "BLUR", 0, "Blur", "Blur the color with surrounding values"}, - {5, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting."}, - {6, "DARKEN", 0, "Darken", "Use darken blending mode while painting."}, - {0, NULL, 0, NULL, NULL}}; - - srna= RNA_def_struct(brna, "VPaint", NULL); - RNA_def_struct_ui_text(srna, "Vertex Paint", "Properties of the Vpaint tool."); - - prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "Brush"); - RNA_def_property_ui_text(prop, "Brush", ""); - - prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, prop_mode_items); - RNA_def_property_ui_text(prop, "Brush Mode", "The Mode in which color is painted."); - - prop= RNA_def_property(srna, "all_faces", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_AREA); - RNA_def_property_ui_text(prop, "All Faces", "Paint on all faces inside brush."); - - prop= RNA_def_property(srna, "vertex_dist", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SOFT); - RNA_def_property_ui_text(prop, "Vertex Dist", "Use distances to vertices (instead of paint entire faces)."); - - prop= RNA_def_property(srna, "normals", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_NORMALS); - RNA_def_property_ui_text(prop, "Normals", "Applies the vertex normal before painting."); - - prop= RNA_def_property(srna, "spray", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SPRAY); - RNA_def_property_ui_text(prop, "Spray", "Keep applying paint effect while holding mouse."); - - prop= RNA_def_property(srna, "gamma", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0.1f, 5.0f); - RNA_def_property_ui_text(prop, "Gamma", "Vpaint Gamma."); - - prop= RNA_def_property(srna, "mul", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0.1f, 50.0f); - RNA_def_property_ui_text(prop, "Mul", "Vpaint Mul."); - -} - -#endif - diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 9c9c256e819..4a2154bc3cf 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -40,8 +40,28 @@ EnumPropertyItem event_value_items[] = { {KM_RELEASE, "RELEASE", 0, "Release", ""}, {0, NULL, 0, NULL, NULL}}; -/* not returned: CAPSLOCKKEY, UNKNOWNKEY, COMMANDKEY, GRLESSKEY */ +/* not returned: CAPSLOCKKEY, UNKNOWNKEY, GRLESSKEY */ EnumPropertyItem event_type_items[] = { + + {LEFTMOUSE, "LEFTMOUSE", 0, "Left Mouse", ""}, + {MIDDLEMOUSE, "MIDDLEMOUSE", 0, "Middle Mouse", ""}, + {RIGHTMOUSE, "RIGHTMOUSE", 0, "Right Mouse", ""}, + {ACTIONMOUSE, "ACTIONMOUSE", 0, "Action Mouse", ""}, + {SELECTMOUSE, "SELECTMOUSE", 0, "Select Mouse", ""}, + + {MOUSEMOVE, "MOUSEMOVE", 0, "Mouse Move", ""}, + + {WHEELUPMOUSE, "WHEELUPMOUSE", 0, "Wheel Up", ""}, + {WHEELDOWNMOUSE, "WHEELDOWNMOUSE", 0, "Wheel Down", ""}, + {WHEELINMOUSE, "WHEELINMOUSE", 0, "Wheel In", ""}, + {WHEELOUTMOUSE, "WHEELOUTMOUSE", 0, "Wheel Out", ""}, + + {EVT_TWEAK_L, "EVT_TWEAK_L", 0, "Tweak Left", ""}, + {EVT_TWEAK_M, "EVT_TWEAK_M", 0, "Tweak Middle", ""}, + {EVT_TWEAK_R, "EVT_TWEAK_R", 0, "Tweak Right", ""}, + {EVT_TWEAK_A, "EVT_TWEAK_A", 0, "Tweak Action", ""}, + {EVT_TWEAK_S, "EVT_TWEAK_S", 0, "Tweak Select", ""}, + {AKEY, "A", 0, "A", ""}, {BKEY, "B", 0, "B", ""}, {CKEY, "C", 0, "C", ""}, @@ -86,6 +106,8 @@ EnumPropertyItem event_type_items[] = { {RIGHTALTKEY, "RIGHT_ALT", 0, "Right Alt", ""}, {RIGHTCTRLKEY, "RIGHT_CTRL", 0, "Right Ctrl", ""}, {RIGHTSHIFTKEY, "RIGHT_SHIFT", 0, "Right Shift", ""}, + + {COMMANDKEY, "COMMAND", 0, "Command", ""}, {ESCKEY, "ESC", 0, "Esc", ""}, {TABKEY, "TAB", 0, "Tab", ""}, diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c index c3032326a3d..f23b893539d 100644 --- a/source/blender/makesrna/intern/rna_world.c +++ b/source/blender/makesrna/intern/rna_world.c @@ -66,31 +66,33 @@ static void rna_World_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *p static PointerRNA rna_World_active_texture_get(PointerRNA *ptr) { World *wo= (World*)ptr->data; + Tex *tex; - return rna_pointer_inherit_refine(ptr, &RNA_TextureSlot, wo->mtex[(int)wo->texact]); + tex= (wo->mtex[(int)wo->texact])? wo->mtex[(int)wo->texact]->tex: NULL; + return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex); } -static void rna_World_active_texture_index_set(PointerRNA *ptr, int value) +static void rna_World_active_texture_set(PointerRNA *ptr, PointerRNA value) { World *wo= (World*)ptr->data; int act= wo->texact; - if(value == act || value < 0 || value >= MAX_MTEX) - return; - - /* auto create/free mtex on activate/deactive, so we can edit - * the texture pointer in the buttons UI. */ - if(wo->mtex[act] && !wo->mtex[act]->tex) { + if(wo->mtex[act] && wo->mtex[act]->tex) + id_us_min(&wo->mtex[act]->tex->id); + + if(value.data) { + if(!wo->mtex[act]) { + wo->mtex[act]= add_mtex(); + wo->mtex[act]->texco= TEXCO_VIEW; + } + + wo->mtex[act]->tex= value.data; + id_us_plus(&wo->mtex[act]->tex->id); + } + else if(wo->mtex[act]) { MEM_freeN(wo->mtex[act]); wo->mtex[act]= NULL; } - - wo->texact= value; - - if(!wo->mtex[value]) { - wo->mtex[value]= add_mtex(); - wo->mtex[value]->texco= TEXCO_VIEW; - } } #else @@ -218,7 +220,7 @@ static void rna_def_ambient_occlusion(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "aodist"); RNA_def_property_ui_text(prop, "Distance", "Length of rays, defines how far away other faces give occlusion effect."); - prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "falloff_strength", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "aodistfac"); RNA_def_property_ui_text(prop, "Strength", "Distance attenuation factor, the higher, the 'shorter' the shadows."); @@ -407,7 +409,8 @@ void RNA_def_world(BlenderRNA *brna) RNA_def_struct_ui_icon(srna, ICON_WORLD_DATA); rna_def_animdata_common(srna); - rna_def_mtex_common(srna, "rna_World_mtex_begin", "rna_World_active_texture_get", "rna_World_active_texture_index_set", "WorldTextureSlot"); + rna_def_mtex_common(srna, "rna_World_mtex_begin", "rna_World_active_texture_get", + "rna_World_active_texture_set", "WorldTextureSlot"); /* colors */ prop= RNA_def_property(srna, "horizon_color", PROP_FLOAT, PROP_COLOR); @@ -470,10 +473,6 @@ void RNA_def_world(BlenderRNA *brna) RNA_def_property_pointer_funcs(prop, "rna_World_stars_get", NULL, NULL); RNA_def_property_ui_text(prop, "Stars", "World stars settings."); - prop= RNA_def_property(srna, "script_link", PROP_POINTER, PROP_NEVER_NULL); - RNA_def_property_pointer_sdna(prop, NULL, "scriptlink"); - RNA_def_property_ui_text(prop, "Script Link", "Scripts linked to this object."); - rna_def_ambient_occlusion(brna); rna_def_world_mist(brna); rna_def_world_stars(brna); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c index 973d74d71ff..9aebd999b29 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c @@ -53,7 +53,7 @@ static void do_luma_matte(bNode *node, float *out, float *in) if(in[0]>c->t1) { alpha=1.0; } - else if(in[1]<c->t2){ + else if(in[0]<c->t2){ alpha=0.0; } else {/*blend */ @@ -99,7 +99,7 @@ static void node_composit_init_luma_matte(bNode *node) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); node->storage=c; - c->t1= 0.0f; + c->t1= 1.0f; c->t2= 0.0f; }; diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c index ae3e5875aae..0a46b02e886 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c @@ -65,18 +65,48 @@ static void do_mapuv(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *uvbuf, float thr for(x=0; x<sx; x++, out+=4, uv+=3, uvnext+=3, uvprev+=3) { if(x>0 && x<sx-1 && y>0 && y<sy-1) { if(uv[2]!=0.0f) { + float uv_l, uv_r; /* adaptive sampling, red (U) channel */ - dx= 0.5f*(fabs(uv[0]-uv[-3]) + fabs(uv[0]-uv[3])); - dx+= 0.25f*(fabs(uv[0]-uvprev[-3]) + fabs(uv[0]-uvnext[-3])); - dx+= 0.25f*(fabs(uv[0]-uvprev[+3]) + fabs(uv[0]-uvnext[+3])); + /* prevent alpha zero UVs to be used */ + uv_l= uv[-1]!=0.0f? fabs(uv[0]-uv[-3]) : 0.0f; + uv_r= uv[ 5]!=0.0f? fabs(uv[0]-uv[ 3]) : 0.0f; + + //dx= 0.5f*(fabs(uv[0]-uv[-3]) + fabs(uv[0]-uv[3])); + dx= 0.5f*(uv_l + uv_r); + + uv_l= uvprev[-1]!=0.0f? fabs(uv[0]-uvprev[-3]) : 0.0f; + uv_r= uvnext[-1]!=0.0f? fabs(uv[0]-uvnext[-3]) : 0.0f; + + //dx+= 0.25f*(fabs(uv[0]-uvprev[-3]) + fabs(uv[0]-uvnext[-3])); + dx+= 0.25f*(uv_l + uv_r); + + uv_l= uvprev[ 5]!=0.0f? fabs(uv[0]-uvprev[+3]) : 0.0f; + uv_r= uvnext[ 5]!=0.0f? fabs(uv[0]-uvnext[+3]) : 0.0f; + + //dx+= 0.25f*(fabs(uv[0]-uvprev[+3]) + fabs(uv[0]-uvnext[+3])); + dx+= 0.25f*(uv_l + uv_r); /* adaptive sampling, green (V) channel */ - dy= 0.5f*(fabs(uv[1]-uv[-row+1]) + fabs(uv[1]-uv[row+1])); - - dy+= 0.25f*(fabs(uv[1]-uvprev[+1-3]) + fabs(uv[1]-uvnext[+1-3])); - dy+= 0.25f*(fabs(uv[1]-uvprev[+1+3]) + fabs(uv[1]-uvnext[+1+3])); + + uv_l= uv[-row+2]!=0.0f? fabs(uv[1]-uv[-row+1]) : 0.0f; + uv_r= uv[ row+2]!=0.0f? fabs(uv[1]-uv[ row+1]) : 0.0f; + + //dy= 0.5f*(fabs(uv[1]-uv[-row+1]) + fabs(uv[1]-uv[row+1])); + dy= 0.5f*(uv_l + uv_r); + + uv_l= uvprev[-1]!=0.0f? fabs(uv[1]-uvprev[+1-3]) : 0.0f; + uv_r= uvnext[-1]!=0.0f? fabs(uv[1]-uvnext[+1-3]) : 0.0f; + + //dy+= 0.25f*(fabs(uv[1]-uvprev[+1-3]) + fabs(uv[1]-uvnext[+1-3])); + dy+= 0.25f*(uv_l + uv_r); + + uv_l= uvprev[ 5]!=0.0f? fabs(uv[1]-uvprev[+1+3]) : 0.0f; + uv_r= uvnext[ 5]!=0.0f? fabs(uv[1]-uvnext[+1+3]) : 0.0f; + + //dy+= 0.25f*(fabs(uv[1]-uvprev[+1+3]) + fabs(uv[1]-uvnext[+1+3])); + dy+= 0.25f*(uv_l + uv_r); /* UV to alpha threshold */ alpha= 1.0f - threshold*(dx+dy); diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h index c9fb5260e53..db0404c33a8 100644 --- a/source/blender/python/BPY_extern.h +++ b/source/blender/python/BPY_extern.h @@ -1,5 +1,5 @@ /* - * $Id: BPY_extern.h 21462 2009-07-09 15:40:04Z ton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -37,7 +37,6 @@ struct Text; /* defined in DNA_text_types.h */ struct ID; /* DNA_ID.h */ struct Object; /* DNA_object_types.h */ struct ChannelDriver; /* DNA_anim_types.h */ -struct ScriptLink; /* DNA_scriptlink_types.h */ struct ListBase; /* DNA_listBase.h */ struct SpaceText; /* DNA_space_types.h */ struct SpaceScript; /* DNA_space_types.h */ @@ -110,13 +109,7 @@ extern "C" { int BPY_run_script(struct Script *script); void BPY_free_compiled_text( struct Text *text ); - void BPY_clear_bad_scriptlinks( struct Text *byebye ); int BPY_has_onload_script( void ); - void BPY_do_all_scripts( short event, short anim ); - int BPY_check_all_scriptlinks( struct Text *text ); - void BPY_do_pyscript( struct ID *id, short event ); - void BPY_free_scriptlink( struct ScriptLink *slink ); - void BPY_copy_scriptlink( struct ScriptLink *scriptlink ); int BPY_is_spacehandler(struct Text *text, char spacetype); int BPY_del_spacehandler(struct Text *text, struct ScrArea *sa); @@ -145,8 +138,6 @@ extern "C" { void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */ /* void BPY_Err_Handle(struct Text *text); */ -/* void BPY_clear_bad_scriptlink(struct ID *id, struct Text *byebye); */ -/* void BPY_clear_bad_scriptlist(struct ListBase *, struct Text *byebye); */ /* int BPY_spacetext_is_pywin(struct SpaceText *st); */ #ifdef __cplusplus diff --git a/source/blender/python/epy_doc_gen.py b/source/blender/python/epy_doc_gen.py index 9f3efc916bf..8630a0c8f8e 100644 --- a/source/blender/python/epy_doc_gen.py +++ b/source/blender/python/epy_doc_gen.py @@ -69,11 +69,11 @@ def write_func(rna, ident, out, func_type): # Operators and functions work differently if func_type=='OPERATOR': rna_func_name = rna_struct.identifier - rna_func_desc = rna_struct.description + rna_func_desc = rna_struct.description.strip() items = rna_struct.properties.items() else: rna_func_name = rna.identifier - rna_func_desc = rna.description + rna_func_desc = rna.description.strip() items = rna.parameters.items() for rna_prop_identifier, rna_prop in items: @@ -94,7 +94,7 @@ def write_func(rna, ident, out, func_type): array_str = get_array_str(length) kw_type_str= "@type %s: %s%s" % (rna_prop_identifier, rna_prop_type, array_str) - kw_param_str= "@param %s: %s" % (rna_prop_identifier, rna_prop.description) + kw_param_str= "@param %s: %s" % (rna_prop_identifier, rna_prop.description.strip()) kw_param_set = False if func_type=='OPERATOR': @@ -205,7 +205,7 @@ def rna2epy(target_path): out.write(ident+ '\t"""\n') title = 'The %s Object' % rna_struct.name - description = rna_struct.description + description = rna_struct.description.strip() out.write(ident+ '\t%s\n' % title) out.write(ident+ '\t%s\n' % ('=' * len(title))) out.write(ident+ '\t\t%s\n' % description) @@ -238,7 +238,7 @@ def rna2epy(target_path): if rna_prop_identifier=='rna_type': continue - rna_desc = rna_prop.description + rna_desc = rna_prop.description.strip() if rna_desc: rna_words.update(rna_desc.split()) if not rna_desc: rna_desc = rna_prop.name @@ -503,20 +503,21 @@ def rna2epy(target_path): def op2epy(target_path): out = open(target_path, 'w') - operators = dir(bpy.ops) - operators.remove('add') - operators.remove('remove') - operators.sort() + op_mods = dir(bpy.ops) + op_mods.remove('add') + op_mods.remove('remove') - for op in operators: - - if op.startswith('__'): + for op_mod_name in sorted(op_mods): + if op_mod_name.startswith('__'): continue + + op_mod = getattr(bpy.ops, op_mod_name) - # rna = getattr(bpy.types, op).__rna__ - rna = bpy.ops.__rna__(op) - - write_func(rna, '', out, 'OPERATOR') + operators = dir(op_mod) + for op in sorted(operators): + # rna = getattr(bpy.types, op).__rna__ + rna = getattr(op_mod, op).get_rna() + write_func(rna, '', out, 'OPERATOR') out.write('\n') out.close() diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c index 71377c456f6..fe97c4d493b 100644 --- a/source/blender/python/generic/bpy_internal_import.c +++ b/source/blender/python/generic/bpy_internal_import.c @@ -111,8 +111,8 @@ PyObject *bpy_text_import( char *name, int *found ) PyObject *bpy_text_reimport( PyObject *module, int *found ) { Text *text; - char *txtname; - char *name; + const char *txtname; + const char *name; char *buf = NULL; //XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main; Main *maggie= bpy_import_main; @@ -166,7 +166,7 @@ PyObject *bpy_text_reimport( PyObject *module, int *found ) } /* make into a module */ - return PyImport_ExecCodeModule( name, text->compiled ); + return PyImport_ExecCodeModule( (char *)name, text->compiled ); } @@ -273,8 +273,8 @@ static PyObject *blender_reload( PyObject * self, PyObject * args ) return newmodule; } -PyMethodDef bpy_import_meth[] = { {"bpy_import_meth", blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"} }; -PyMethodDef bpy_reload_meth[] = { {"bpy_reload_meth", blender_reload, METH_VARARGS, "blenders reload"} }; +PyMethodDef bpy_import_meth[] = { {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"} }; +PyMethodDef bpy_reload_meth[] = { {"bpy_reload_meth", (PyCFunction)blender_reload, METH_VARARGS, "blenders reload"} }; /* Clear user modules. diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index ef2406d446c..707c5769357 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -260,10 +260,24 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc py_result = PyEval_EvalCode( text->compiled, py_dict, py_dict ); } else { - char pystring[512]; - /* TODO - look into a better way to run a file */ - sprintf(pystring, "exec(open(r'%s').read())", fn); - py_result = PyRun_String( pystring, Py_file_input, py_dict, py_dict ); +#if 0 + char *pystring; + pystring= malloc(strlen(fn) + 32); + pystring[0]= '\0'; + sprintf(pystring, "exec(open(r'%s').read())", fn); + py_result = PyRun_String( pystring, Py_file_input, py_dict, py_dict ); + free(pystring); +#else + FILE *fp= fopen(fn, "r"); + if(fp) { + py_result = PyRun_File(fp, fn, Py_file_input, py_dict, py_dict); + fclose(fp); + } + else { + PyErr_Format(PyExc_SystemError, "Python file \"%s\" could not be opened: %s", fn, strerror(errno)); + py_result= NULL; + } +#endif } if (!py_result) { diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index 240ce2030ba..034440d77ac 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -38,6 +38,7 @@ #include "MEM_guardedalloc.h" #include "BKE_report.h" +#include "BKE_utildefines.h" /* 'self' stores the operator string */ @@ -77,14 +78,14 @@ static PyObject *pyop_call( PyObject * self, PyObject * args) } - ot= WM_operatortype_find(opname, 1); + ot= WM_operatortype_find(opname, TRUE); if (ot == NULL) { PyErr_Format( PyExc_SystemError, "bpy.__ops__.call: operator \"%s\"could not be found", opname); return NULL; } - if(ot->poll && (ot->poll(C) == 0)) { + if(ot->poll && (ot->poll(C) == FALSE)) { PyErr_SetString( PyExc_SystemError, "bpy.__ops__.call: operator poll() function failed, context is incorrect"); return NULL; } @@ -94,7 +95,7 @@ static PyObject *pyop_call( PyObject * self, PyObject * args) RNA_pointer_create(NULL, ot->srna, NULL, &ptr); if(kw && PyDict_Size(kw)) - error_val= pyrna_pydict_to_props(&ptr, kw, "Converting py args to operator properties: "); + error_val= pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: "); if (error_val==0) { @@ -146,10 +147,38 @@ static PyObject *pyop_dir(PyObject *self) return list; } +static PyObject *pyop_getrna(PyObject *self, PyObject *value) +{ + wmOperatorType *ot; + PointerRNA ptr; + char *opname= _PyUnicode_AsString(value); + BPy_StructRNA *pyrna= NULL; + + if(opname==NULL) { + PyErr_SetString(PyExc_TypeError, "bpy.__ops__.get_rna() expects a string argument"); + return NULL; + } + ot= WM_operatortype_find(opname, TRUE); + if(ot==NULL) { + PyErr_Format(PyExc_KeyError, "bpy.__ops__.get_rna(\"%s\") not found", opname); + return NULL; + } + + /* type */ + //RNA_pointer_create(NULL, &RNA_Struct, ot->srna, &ptr); + + /* XXX - should call WM_operator_properties_free */ + WM_operator_properties_create(&ptr, ot->idname); + pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr); + pyrna->freeptr= TRUE; + return (PyObject *)pyrna; +} + PyObject *BPY_operator_module( void ) { static PyMethodDef pyop_call_meth = {"call", (PyCFunction) pyop_call, METH_VARARGS, NULL}; static PyMethodDef pyop_dir_meth = {"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL}; + static PyMethodDef pyop_getrna_meth = {"get_rna", (PyCFunction) pyop_getrna, METH_O, NULL}; static PyMethodDef pyop_add_meth = {"add", (PyCFunction) PYOP_wrap_add, METH_O, NULL}; static PyMethodDef pyop_remove_meth = {"remove", (PyCFunction) PYOP_wrap_remove, METH_O, NULL}; @@ -158,6 +187,7 @@ PyObject *BPY_operator_module( void ) PyModule_AddObject( submodule, "call", PyCFunction_New(&pyop_call_meth, NULL) ); PyModule_AddObject( submodule, "dir", PyCFunction_New(&pyop_dir_meth, NULL) ); + PyModule_AddObject( submodule, "get_rna", PyCFunction_New(&pyop_getrna_meth, NULL) ); PyModule_AddObject( submodule, "add", PyCFunction_New(&pyop_add_meth, NULL) ); PyModule_AddObject( submodule, "remove", PyCFunction_New(&pyop_remove_meth, NULL) ); diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index 02d721739e7..080d2e8ce6a 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -265,8 +265,8 @@ void PYTHON_OT_wrapper(wmOperatorType *ot, void *userdata) } item= PyObject_GetAttrString(py_class, PYOP_ATTR_DESCRIPTION); - ot->description= (item && PyUnicode_Check(item)) ? _PyUnicode_AsString(item):""; - Py_DECREF(item); + ot->description= (item && PyUnicode_Check(item)) ? _PyUnicode_AsString(item):"undocumented python operator"; + Py_XDECREF(item); /* api callbacks, detailed checks dont on adding */ if (PyObject_HasAttrString(py_class, "invoke")) diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 7319a269ffb..27bfb89b963 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -171,7 +171,7 @@ static PyObject *pyrna_struct_repr( BPy_StructRNA * self ) char *name; /* print name if available */ - name= RNA_struct_name_get_alloc(&self->ptr, NULL, 0); + name= RNA_struct_name_get_alloc(&self->ptr, NULL, FALSE); if(name) { pyob= PyUnicode_FromFormat( "[BPy_StructRNA \"%.200s\" -> \"%.200s\"]", RNA_struct_identifier(self->ptr.type), name); MEM_freeN(name); @@ -190,7 +190,7 @@ static PyObject *pyrna_prop_repr( BPy_PropertyRNA * self ) /* if a pointer, try to print name of pointer target too */ if(RNA_property_type(self->prop) == PROP_POINTER) { ptr= RNA_property_pointer_get(&self->ptr, self->prop); - name= RNA_struct_name_get_alloc(&ptr, NULL, 0); + name= RNA_struct_name_get_alloc(&ptr, NULL, FALSE); if(name) { pyob= PyUnicode_FromFormat( "[BPy_PropertyRNA \"%.200s\" -> \"%.200s\" -> \"%.200s\" ]", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop), name); @@ -225,7 +225,7 @@ static char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop) { EnumPropertyItem *item; char *result; - int free= 0; + int free= FALSE; RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free); if(item) { @@ -258,31 +258,31 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop) switch(RNA_property_subtype(prop)) { case PROP_VECTOR: if(len>=2 && len <= 4) { - PyObject *vec_cb= newVectorObject_cb(ret, len, mathutils_rna_array_cb_index, 0); + PyObject *vec_cb= newVectorObject_cb(ret, len, mathutils_rna_array_cb_index, FALSE); Py_DECREF(ret); /* the vector owns now */ ret= vec_cb; /* return the vector instead */ } break; case PROP_MATRIX: if(len==16) { - PyObject *mat_cb= newMatrixObject_cb(ret, 4,4, mathutils_rna_matrix_cb_index, 0); + PyObject *mat_cb= newMatrixObject_cb(ret, 4,4, mathutils_rna_matrix_cb_index, FALSE); Py_DECREF(ret); /* the matrix owns now */ ret= mat_cb; /* return the matrix instead */ } else if (len==9) { - PyObject *mat_cb= newMatrixObject_cb(ret, 3,3, mathutils_rna_matrix_cb_index, 0); + PyObject *mat_cb= newMatrixObject_cb(ret, 3,3, mathutils_rna_matrix_cb_index, FALSE); Py_DECREF(ret); /* the matrix owns now */ ret= mat_cb; /* return the matrix instead */ } break; case PROP_ROTATION: if(len==3) { /* euler */ - PyObject *eul_cb= newEulerObject_cb(ret, mathutils_rna_array_cb_index, 0); + PyObject *eul_cb= newEulerObject_cb(ret, mathutils_rna_array_cb_index, FALSE); Py_DECREF(ret); /* the matrix owns now */ ret= eul_cb; /* return the matrix instead */ } else if (len==4) { - PyObject *quat_cb= newQuaternionObject_cb(ret, mathutils_rna_array_cb_index, 0); + PyObject *quat_cb= newQuaternionObject_cb(ret, mathutils_rna_array_cb_index, FALSE); Py_DECREF(ret); /* the matrix owns now */ ret= quat_cb; /* return the matrix instead */ } @@ -325,7 +325,7 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop) ret = PyUnicode_FromString( identifier ); } else { EnumPropertyItem *item; - int free= 0; + int free= FALSE; /* don't throw error here, can't trust blender 100% to give the * right values, python code should not generate error for that */ @@ -375,9 +375,9 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop) return ret; } -/* This function is only used by operators right now - * Its used for taking keyword args and filling in property values */ -int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, const char *error_prefix) +/* This function is used by operators and converting dicts into collections. + * Its takes keyword args and fills them with property values */ +int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const char *error_prefix) { int error_val = 0; int totkw; @@ -397,20 +397,21 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, const char *error_prefi break; } - item= PyDict_GetItemString(kw, arg_name); + item= PyDict_GetItemString(kw, arg_name); /* wont set an error */ if (item == NULL) { - PyErr_Format( PyExc_TypeError, "%.200s: keyword \"%.200s\" missing", error_prefix, arg_name ? arg_name : "<UNKNOWN>"); - error_val = -1; /* pyrna_py_to_prop sets the error */ - break; - } - - if (pyrna_py_to_prop(ptr, prop, NULL, item)) { - error_val= -1; - break; + if(all_args) { + PyErr_Format( PyExc_TypeError, "%.200s: keyword \"%.200s\" missing", error_prefix, arg_name ? arg_name : "<UNKNOWN>"); + error_val = -1; /* pyrna_py_to_prop sets the error */ + break; + } + } else { + if (pyrna_py_to_prop(ptr, prop, NULL, item, error_prefix)) { + error_val= -1; + break; + } + totkw--; } - - totkw--; } RNA_STRUCT_END; @@ -458,7 +459,7 @@ PyObject *pyrna_func_to_py(BPy_StructRNA *pyrna, FunctionRNA *func) } -int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value) +int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value, const char *error_prefix) { /* XXX hard limits should be checked here */ int type = RNA_property_type(prop); @@ -483,13 +484,13 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v py_len= (int)PySequence_Length(value); } else { - PyErr_Format(PyExc_TypeError, "RNA array assignment expected a sequence instead of %.200s instance.", Py_TYPE(value)->tp_name); + PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment expected a sequence instead of %.200s instance.", error_prefix, Py_TYPE(value)->tp_name); return -1; } /* done getting the length */ if (py_len != len) { - PyErr_Format(PyExc_TypeError, "python sequence length %d did not match the RNA array length %d.", py_len, len); + PyErr_Format(PyExc_TypeError, "%.200s python sequence length %d did not match the RNA array length %d.", error_prefix, py_len, len); return -1; } @@ -511,7 +512,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v if (param_arr[i] < 0) { if(data==NULL) MEM_freeN(param_arr); - PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence is not a boolean"); + PyErr_Format(PyExc_AttributeError, "%.200s one or more of the values in the sequence is not a boolean", error_prefix); return -1; } } @@ -539,7 +540,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v if (PyErr_Occurred()) { if(data==NULL) MEM_freeN(param_arr); - PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence could not be used as an int"); + PyErr_Format(PyExc_AttributeError, "%.200s one or more of the values in the sequence could not be used as an int", error_prefix); return -1; } if(data==NULL) { @@ -573,7 +574,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v if (PyErr_Occurred()) { if(data==NULL) MEM_freeN(param_arr); - PyErr_SetString(PyExc_AttributeError, "one or more of the values in the sequence could not be used as a float"); + PyErr_Format(PyExc_AttributeError, "%.200s one or more of the values in the sequence could not be used as a float", error_prefix); return -1; } if(data==NULL) { @@ -593,7 +594,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v int param = PyObject_IsTrue( value ); if( param < 0 ) { - PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1"); + PyErr_Format(PyExc_TypeError, "%.200s expected True/False or 0/1", error_prefix); return -1; } else { if(data) *((int*)data)= param; @@ -605,7 +606,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v { int param = PyLong_AsSsize_t(value); if (PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, "expected an int type"); + PyErr_Format(PyExc_TypeError, "%.200s expected an int type", error_prefix); return -1; } else { if(data) *((int*)data)= param; @@ -617,7 +618,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v { float param = PyFloat_AsDouble(value); if (PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, "expected a float type"); + PyErr_Format(PyExc_TypeError, "%.200s expected a float type", error_prefix); return -1; } else { if(data) *((float*)data)= param; @@ -630,7 +631,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v char *param = _PyUnicode_AsString(value); if (param==NULL) { - PyErr_SetString(PyExc_TypeError, "expected a string type"); + PyErr_Format(PyExc_TypeError, "%.200s expected a string type", error_prefix); return -1; } else { if(data) *((char**)data)= param; @@ -644,7 +645,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v if (param==NULL) { char *enum_str= pyrna_enum_as_string(ptr, prop); - PyErr_Format(PyExc_TypeError, "expected a string enum type in (%.200s)", enum_str); + PyErr_Format(PyExc_TypeError, "%.200s expected a string enum type in (%.200s)", error_prefix, enum_str); MEM_freeN(enum_str); return -1; } else { @@ -654,7 +655,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v else RNA_property_enum_set(ptr, prop, val); } else { char *enum_str= pyrna_enum_as_string(ptr, prop); - PyErr_Format(PyExc_TypeError, "enum \"%.200s\" not found in (%.200s)", param, enum_str); + PyErr_Format(PyExc_TypeError, "%.200s enum \"%.200s\" not found in (%.200s)", error_prefix, param, enum_str); MEM_freeN(enum_str); return -1; } @@ -669,11 +670,11 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v if(!BPy_StructRNA_Check(value) && value != Py_None) { PointerRNA tmp; RNA_pointer_create(NULL, ptype, NULL, &tmp); - PyErr_Format(PyExc_TypeError, "expected a %.200s type", RNA_struct_identifier(tmp.type)); + PyErr_Format(PyExc_TypeError, "%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(tmp.type)); return -1; } else { BPy_StructRNA *param= (BPy_StructRNA*)value; - int raise_error= 0; + int raise_error= FALSE; if(data) { int flag = RNA_property_flag(prop); @@ -690,7 +691,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v *((void**)data)= param->ptr.data; } else { - raise_error= 1; + raise_error= TRUE; } } else { @@ -706,7 +707,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v else { PointerRNA tmp; RNA_pointer_create(NULL, ptype, NULL, &tmp); - PyErr_Format(PyExc_TypeError, "expected a %.200s type", RNA_struct_identifier(tmp.type)); + PyErr_Format(PyExc_TypeError, "%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(tmp.type)); return -1; } } @@ -714,7 +715,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v if(raise_error) { PointerRNA tmp; RNA_pointer_create(NULL, ptype, NULL, &tmp); - PyErr_Format(PyExc_TypeError, "expected a %.200s type", RNA_struct_identifier(tmp.type)); + PyErr_Format(PyExc_TypeError, "%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(tmp.type)); return -1; } } @@ -732,7 +733,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v /* convert a sequence of dict's into a collection */ if(!PySequence_Check(value)) { - PyErr_SetString(PyExc_TypeError, "expected a sequence of dicts for an RNA collection"); + PyErr_Format(PyExc_TypeError, "%.200s expected a sequence of dicts for an RNA collection", error_prefix); return -1; } @@ -740,7 +741,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v for(i=0; i<seq_len; i++) { item= PySequence_GetItem(value, i); if(item==NULL || PyDict_Check(item)==0) { - PyErr_SetString(PyExc_TypeError, "expected a sequence of dicts for an RNA collection"); + PyErr_Format(PyExc_TypeError, "%.200s expected a sequence of dicts for an RNA collection", error_prefix); Py_XDECREF(item); return -1; } @@ -753,7 +754,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v else RNA_property_collection_add(ptr, prop, &itemptr); - if(pyrna_pydict_to_props(&itemptr, item, "Converting a python list to an RNA collection")==-1) { + if(pyrna_pydict_to_props(&itemptr, item, 1, "Converting a python list to an RNA collection")==-1) { Py_DECREF(item); return -1; } @@ -763,7 +764,7 @@ int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *v break; } default: - PyErr_SetString(PyExc_AttributeError, "unknown property type (pyrna_py_to_prop)"); + PyErr_Format(PyExc_AttributeError, "%.200s unknown property type (pyrna_py_to_prop)", error_prefix); return -1; break; } @@ -1341,7 +1342,7 @@ static int pyrna_struct_setattro( BPy_StructRNA * self, PyObject *pyname, PyObje } /* pyrna_py_to_prop sets its own exceptions */ - return pyrna_py_to_prop(&self->ptr, prop, NULL, value); + return pyrna_py_to_prop(&self->ptr, prop, NULL, value, "StructRNA - Attribute (setattr):"); } static PyObject *pyrna_prop_keys(BPy_PropertyRNA *self) @@ -1465,13 +1466,13 @@ static void foreach_attr_type( BPy_PropertyRNA *self, char *attr, PropertyRNA *prop; *raw_type= -1; *attr_tot= 0; - *attr_signed= 0; + *attr_signed= FALSE; RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) { prop = RNA_struct_find_property(&itemptr, attr); *raw_type= RNA_property_raw_type(prop); *attr_tot = RNA_property_array_length(prop); - *attr_signed= (RNA_property_subtype(prop)==PROP_UNSIGNED) ? 0:1; + *attr_signed= (RNA_property_subtype(prop)==PROP_UNSIGNED) ? FALSE:TRUE; break; } RNA_PROP_END; @@ -1489,7 +1490,7 @@ static int foreach_parse_args( int target_tot; #endif - *size= *raw_type= *attr_tot= *attr_signed= 0; + *size= *raw_type= *attr_tot= *attr_signed= FALSE; if(!PyArg_ParseTuple(args, "sO", attr, seq) || (!PySequence_Check(*seq) && PyObject_CheckBuffer(*seq))) { PyErr_SetString( PyExc_TypeError, "foreach_get(attr, sequence) expects a string and a sequence" ); @@ -1569,7 +1570,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set) if(set) { /* get the array from python */ - buffer_is_compat = 0; + buffer_is_compat = FALSE; if(PyObject_CheckBuffer(seq)) { Py_buffer buf; PyObject_GetBuffer(seq, &buf, PyBUF_SIMPLE | PyBUF_FORMAT); @@ -1616,7 +1617,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set) } } else { - buffer_is_compat = 0; + buffer_is_compat = FALSE; if(PyObject_CheckBuffer(seq)) { Py_buffer buf; PyObject_GetBuffer(seq, &buf, PyBUF_SIMPLE | PyBUF_FORMAT); @@ -1867,8 +1868,12 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data) newptr= *(PointerRNA*)data; } else { - /* XXX this is missing the ID part! */ - RNA_pointer_create(NULL, type, *(void**)data, &newptr); + if(RNA_struct_is_ID(type)) { + RNA_id_pointer_create(*(void**)data, &newptr); + } else { + /* XXX this is missing the ID part! */ + RNA_pointer_create(NULL, type, *(void**)data, &newptr); + } } if (newptr.data) { @@ -1915,7 +1920,7 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw) ParameterIterator iter; PropertyRNA *pret, *parm; PyObject *ret, *item; - int i, args_len, parms_len, flag, err= 0, kw_tot= 0; + int i, args_len, parms_len, flag, err= 0, kw_tot= 0, kw_arg; const char *parm_id; void *retdata= NULL; @@ -1926,7 +1931,7 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw) } if(self_func==NULL) { - PyErr_Format(PyExc_RuntimeError, "%.200s.???(): rna function internal function is NULL, this is a bug. aborting", RNA_struct_identifier(self_ptr->type)); + PyErr_Format(PyExc_RuntimeError, "%.200s.<unknown>(): rna function internal function is NULL, this is a bug. aborting", RNA_struct_identifier(self_ptr->type)); return NULL; } @@ -1961,11 +1966,15 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw) if ((i < args_len) && (flag & PROP_REQUIRED)) { item= PyTuple_GET_ITEM(args, i); i++; + + kw_arg= FALSE; } else if (kw != NULL) { item= PyDict_GetItemString(kw, parm_id); /* borrow ref */ if(item) kw_tot++; /* make sure invalid keywords are not given */ + + kw_arg= TRUE; } if (item==NULL) { @@ -1978,10 +1987,23 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw) continue; } - err= pyrna_py_to_prop(&funcptr, parm, iter.data, item); + err= pyrna_py_to_prop(&funcptr, parm, iter.data, item, ""); + + if(err!=0) { + /* the error generated isnt that useful, so generate it again with a useful prefix + * could also write a function to prepend to error messages */ + char error_prefix[512]; + PyErr_Clear(); /* re-raise */ + + if(kw_arg==TRUE) + snprintf(error_prefix, sizeof(error_prefix), "%s.%s(): error with keyword argument \"%s\" - ", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), parm_id); + else + snprintf(error_prefix, sizeof(error_prefix), "%s.%s(): error with argument %d, \"%s\" - ", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), i, parm_id); + + pyrna_py_to_prop(&funcptr, parm, iter.data, item, error_prefix); - if(err!=0) break; + } } @@ -1996,12 +2018,12 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw) DynStr *good_args= BLI_dynstr_new(); char *arg_name, *bad_args_str, *good_args_str; - int found= 0, first=1; + int found= FALSE, first= TRUE; while (PyDict_Next(kw, &pos, &key, &value)) { arg_name= _PyUnicode_AsString(key); - found= 0; + found= FALSE; if(arg_name==NULL) { /* unlikely the argname is not a string but ignore if it is*/ PyErr_Clear(); @@ -2012,28 +2034,28 @@ static PyObject * pyrna_func_call(PyObject * self, PyObject *args, PyObject *kw) for(; iter.valid; RNA_parameter_list_next(&iter)) { parm= iter.parm; if (strcmp(arg_name, RNA_property_identifier(parm))==0) { - found= 1; + found= TRUE; break; } } RNA_parameter_list_end(&iter); - if(!found) { + if(found==FALSE) { BLI_dynstr_appendf(bad_args, first ? "%s" : ", %s", arg_name); - first= 0; + first= FALSE; } } } /* list good args */ - first= 1; + first= TRUE; RNA_parameter_list_begin(&parms, &iter); for(; iter.valid; RNA_parameter_list_next(&iter)) { parm= iter.parm; BLI_dynstr_appendf(good_args, first ? "%s" : ", %s", RNA_property_identifier(parm)); - first= 0; + first= FALSE; } RNA_parameter_list_end(&iter); @@ -2300,31 +2322,23 @@ PyObject* pyrna_srna_Subtype(StructRNA *srna) } else if ((newclass= RNA_struct_py_type_get(srna))) { Py_INCREF(newclass); } else { - StructRNA *base; - - /* for now, return the base RNA type rather then a real module */ - - /* Assume RNA_struct_py_type_get(srna) was alredy checked */ - /* subclass equivelents - class myClass(myBase): some='value' # or ... - myClass = type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'}) */ - const char *descr= RNA_struct_ui_description(srna); - PyObject *args = PyTuple_New(3); - PyObject *bases = PyTuple_New(1); + /* Assume RNA_struct_py_type_get(srna) was alredy checked */ + StructRNA *base; + PyObject *py_base= NULL; - PyObject *dict = PyDict_New(); - PyObject *item; - - - // arg 1 - //PyTuple_SET_ITEM(args, 0, PyUnicode_FromString(tp_name)); - PyTuple_SET_ITEM(args, 0, PyUnicode_FromString(RNA_struct_identifier(srna))); + + const char *idname= RNA_struct_identifier(srna); + const char *descr= RNA_struct_ui_description(srna); + + if(!descr) descr= "(no docs)"; - // arg 2 + /* get the base type */ base= RNA_struct_base(srna); if(base && base != srna) { /*/printf("debug subtype %s %p\n", RNA_struct_identifier(srna), srna); */ @@ -2336,33 +2350,7 @@ PyObject* pyrna_srna_Subtype(StructRNA *srna) Py_INCREF(py_base); } - PyTuple_SET_ITEM(bases, 0, py_base); - - PyTuple_SET_ITEM(args, 1, bases); - - // arg 3 - add an instance of the rna - if(descr) { - item= PyUnicode_FromString(descr); - PyDict_SetItemString(dict, "__doc__", item); - Py_DECREF(item); - } - - /* this isnt needed however its confusing if we get python script names in blender types, - * because the __module__ is used when printing the class */ - item= PyUnicode_FromString("bpy.types"); /* just to know its an internal type */ - PyDict_SetItemString(dict, "__module__", item); - Py_DECREF(item); - - - PyTuple_SET_ITEM(args, 2, dict); // fill with useful subclass things! - - if (PyErr_Occurred()) { - PyErr_Print(); - PyErr_Clear(); - } - - newclass = PyObject_CallObject((PyObject *)&PyType_Type, args); - Py_DECREF(args); + newclass = PyObject_CallFunction( (PyObject*)&PyType_Type, "s(N){ssss}", idname, py_base, "__module__","bpy.types", "__doc__",descr); if (newclass) { pyrna_subtype_set_rna(newclass, srna); @@ -2420,7 +2408,7 @@ PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr ) } pyrna->ptr= *ptr; - pyrna->freeptr= 0; + pyrna->freeptr= FALSE; // PyObSpit("NewStructRNA: ", (PyObject *)pyrna); @@ -2895,7 +2883,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun if(item) { Py_DECREF(item); /* no need to keep a ref, the class owns it */ - if(pyrna_py_to_prop(dummyptr, prop, NULL, item) != 0) + if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class error:") != 0) return -1; } } @@ -2910,7 +2898,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun else { Py_DECREF(item); /* no need to keep a ref, the class owns it */ - if(pyrna_py_to_prop(dummyptr, prop, NULL, item) != 0) + if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class error:") != 0) return -1; } } @@ -2995,15 +2983,19 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par } if (ret == NULL) { /* covers py_class_instance failing too */ - PyErr_Print(); /* XXX use reporting api? */ err= -1; } else { if(retdata) - err= pyrna_py_to_prop(&funcptr, pret, retdata, ret); + err= pyrna_py_to_prop(&funcptr, pret, retdata, ret, "calling class function:"); Py_DECREF(ret); } + if(err != 0) { + PyErr_Print(); + PyErr_Clear(); + } + PyGILState_Release(gilstate); return err; diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h index cea6993cce5..9138fd511b0 100644 --- a/source/blender/python/intern/bpy_rna.h +++ b/source/blender/python/intern/bpy_rna.h @@ -1,5 +1,5 @@ /** - * $Id: bpy_rna.h 21094 2009-06-23 00:09:26Z gsrb3d $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -69,8 +69,8 @@ PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr ); PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop ); /* operators also need this to set args */ -int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value); -int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, const char *error_prefix); +int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value, const char *error_prefix); +int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const char *error_prefix); PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop); /* functions for setting up new props - experemental */ diff --git a/source/blender/python/intern/bpy_scriptlink.c b/source/blender/python/intern/bpy_scriptlink.c deleted file mode 100644 index e790942aeb5..00000000000 --- a/source/blender/python/intern/bpy_scriptlink.c +++ /dev/null @@ -1,73 +0,0 @@ -/** - * $Id: - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2008 Blender Foundation. - * All rights reserved. - * - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include <string.h> - -#include "MEM_guardedalloc.h" - -#include "DNA_lamp_types.h" -#include "DNA_camera_types.h" -#include "DNA_world_types.h" -#include "DNA_scene_types.h" -#include "DNA_material_types.h" - -#include "BLI_blenlib.h" - -#include "BKE_blender.h" -#include "BKE_global.h" -#include "BKE_library.h" -#include "BKE_main.h" - - -/* only copies internal pointers, scriptlink usually is integral part of a struct */ -void BPY_copy_scriptlink( struct ScriptLink *scriptlink ) -{ - - if( scriptlink->totscript ) { - scriptlink->scripts = MEM_dupallocN(scriptlink->scripts); - scriptlink->flag = MEM_dupallocN(scriptlink->flag); - } - - return; -} - -/* not free slink itself */ -void BPY_free_scriptlink( struct ScriptLink *slink ) -{ - if( slink->totscript ) { - if( slink->flag ) { - MEM_freeN( slink->flag ); - slink->flag= NULL; - } - if( slink->scripts ) { - MEM_freeN( slink->scripts ); - slink->scripts= NULL; - } - } - - return; -} - diff --git a/source/blender/python/intern/bpy_ui.c b/source/blender/python/intern/bpy_ui.c index 64b8a33fd66..59e566b3b37 100644 --- a/source/blender/python/intern/bpy_ui.c +++ b/source/blender/python/intern/bpy_ui.c @@ -41,332 +41,9 @@ #include "UI_interface.h" #include "WM_api.h" -static PyObject *Method_pupMenuBegin( PyObject * self, PyObject * args ) -{ - PyObject *py_context; - char *title; int icon; - - if( !PyArg_ParseTuple( args, "O!si:pupMenuBegin", &PyCObject_Type, &py_context, &title, &icon)) - return NULL; - - return PyCObject_FromVoidPtr( uiPupMenuBegin(PyCObject_AsVoidPtr(py_context), title, icon), NULL ); -} - -static PyObject *Method_pupMenuEnd( PyObject * self, PyObject * args ) -{ - PyObject *py_context, *py_head; - - if( !PyArg_ParseTuple( args, "O!O!:pupMenuEnd", &PyCObject_Type, &py_context, &PyCObject_Type, &py_head)) - return NULL; - - uiPupMenuEnd(PyCObject_AsVoidPtr(py_context), PyCObject_AsVoidPtr(py_head)); - - Py_RETURN_NONE; -} - -static PyObject *Method_defButO( PyObject * self, PyObject * args ) -{ - uiBut *but; - PyObject *py_block, *py_keywords= NULL; - char *opname, *butname, *tip; - int exec, xco, yco, width, height; - - if( !PyArg_ParseTuple( args, "O!sisiiiis|O!:defButO", &PyCObject_Type, &py_block, &opname, &exec, &butname, &xco, &yco, &width, &height, &tip, &PyDict_Type, &py_keywords)) - return NULL; - - but= uiDefButO(PyCObject_AsVoidPtr(py_block), BUT, opname, exec, butname, xco, yco, width, height, tip); - - /* Optional python doctionary used to set python properties, just like how keyword args are used */ - if (py_keywords && PyDict_Size(py_keywords)) { - if (pyrna_pydict_to_props(uiButGetOperatorPtrRNA(but), py_keywords, "") == -1) - return NULL; - } - - return PyCObject_FromVoidPtr(but, NULL); -} - -static PyObject *Method_defAutoButR( PyObject * self, PyObject * args ) -{ - PyObject *py_block; - BPy_StructRNA *py_rna; - char *propname, *butname; - int index, xco, yco, width, height; - PropertyRNA *prop; - - if( !PyArg_ParseTuple( args, "O!O!sisiiii:defAutoButR", &PyCObject_Type, &py_block, &pyrna_struct_Type, &py_rna, &propname, &index, &butname, &xco, &yco, &width, &height)) - return NULL; - - // XXX This isnt that nice api, but we dont always have the rna property from python since its converted immediately into a PyObject - prop = RNA_struct_find_property(&py_rna->ptr, propname); - if (prop==NULL) { - PyErr_SetString(PyExc_ValueError, "rna property not found"); - return NULL; - } - - return PyCObject_FromVoidPtr( uiDefAutoButR(PyCObject_AsVoidPtr(py_block), &py_rna->ptr, prop, index, butname, 0, xco, yco, width, height), NULL); -} - - - -static uiBlock *py_internal_uiBlockCreateFunc(struct bContext *C, struct ARegion *ar, void *arg1) -{ - PyObject *ret, *args; - - args = Py_BuildValue("(NN)", PyCObject_FromVoidPtr(C, NULL), PyCObject_FromVoidPtr(ar, NULL)); - ret = PyObject_CallObject( (PyObject *)arg1, args ); - Py_DECREF(args); - - if (ret==NULL) { - PyErr_Print(); - return NULL; - } - if (!PyCObject_Check(ret)) { - printf("invalid return value, not a PyCObject block\n"); - return NULL; - } - - return (uiBlock *)PyCObject_AsVoidPtr(ret); -} - -static PyObject *Method_pupBlock( PyObject * self, PyObject * args ) -{ - PyObject *py_context, *py_func; - - if( !PyArg_ParseTuple( args, "O!O:pupBlock", &PyCObject_Type, &py_context, &py_func) ) - return NULL; - - if (!PyCallable_Check(py_func)) { - PyErr_SetString(PyExc_ValueError, "arg not callable"); - return NULL; - } - - uiPupBlock(PyCObject_AsVoidPtr(py_context), py_internal_uiBlockCreateFunc, (void *)py_func); - Py_RETURN_NONE; -} - -// XXX missing arg - UI_EMBOSS, do we care? -// XXX well, right now this only is to distinguish whether we have regular buttons or for pulldowns (ton) -static PyObject *Method_beginBlock( PyObject * self, PyObject * args ) -{ - PyObject *py_context, *py_ar; - char *name; - - if( !PyArg_ParseTuple( args, "O!O!s:beginBlock", &PyCObject_Type, &py_context, &PyCObject_Type, &py_ar, &name) ) - return NULL; - - return PyCObject_FromVoidPtr(uiBeginBlock(PyCObject_AsVoidPtr(py_context), PyCObject_AsVoidPtr(py_ar), name, UI_EMBOSS), NULL); -} - -static PyObject *Method_endBlock( PyObject * self, PyObject * args ) -{ - PyObject *py_context, *py_block; - - if( !PyArg_ParseTuple( args, "O!O!:endBlock", &PyCObject_Type, &py_context, &PyCObject_Type, &py_block) ) - return NULL; - - uiEndBlock(PyCObject_AsVoidPtr(py_context), PyCObject_AsVoidPtr(py_block)); - Py_RETURN_NONE; -} - -static PyObject *Method_drawBlock( PyObject * self, PyObject * args ) -{ - PyObject *py_context, *py_block; - - if( !PyArg_ParseTuple( args, "O!O!:drawBlock", &PyCObject_Type, &py_context, &PyCObject_Type, &py_block) ) - return NULL; - - uiDrawBlock(PyCObject_AsVoidPtr(py_context), PyCObject_AsVoidPtr(py_block)); - Py_RETURN_NONE; -} - -static PyObject *Method_popupBoundsBlock( PyObject * self, PyObject * args ) -{ - PyObject *py_block; - int addval, mx, my; - - if( !PyArg_ParseTuple( args, "O!iii:popupBoundsBlock", &PyCObject_Type, &py_block, &addval, &mx, &my) ) - return NULL; - - uiPopupBoundsBlock(PyCObject_AsVoidPtr(py_block), addval, mx, my); - Py_RETURN_NONE; -} - -static PyObject *Method_blockBeginAlign( PyObject * self, PyObject * args ) -{ - PyObject *py_block; - - if( !PyArg_ParseTuple( args, "O!:blockBeginAlign", &PyCObject_Type, &py_block) ) - return NULL; - - uiBlockBeginAlign(PyCObject_AsVoidPtr(py_block)); - Py_RETURN_NONE; -} - -static PyObject *Method_blockEndAlign( PyObject * self, PyObject * args ) -{ - PyObject *py_block; - - if( !PyArg_ParseTuple( args, "O!:blockEndAlign", &PyCObject_Type, &py_block)) - return NULL; - - uiBlockEndAlign(PyCObject_AsVoidPtr(py_block)); - Py_RETURN_NONE; -} - -static PyObject *Method_blockSetFlag( PyObject * self, PyObject * args ) -{ - PyObject *py_block; - int flag; /* Note new py api should not use flags, but for this low level UI api its ok. */ - - if( !PyArg_ParseTuple( args, "O!i:blockSetFlag", &PyCObject_Type, &py_block, &flag)) - return NULL; - - uiBlockSetFlag(PyCObject_AsVoidPtr(py_block), flag); - Py_RETURN_NONE; -} - -/* similar to Draw.c */ -static PyObject *Method_register( PyObject * self, PyObject * args ) -{ - PyObject *py_sl, *py_draw_func; - SpaceLink *sl; - if( !PyArg_ParseTuple( args, "O!O:register", &PyCObject_Type, &py_sl, &py_draw_func) ) - return NULL; - - sl = PyCObject_AsVoidPtr(py_sl); - - if(sl->spacetype!=SPACE_SCRIPT) { // XXX todo - add a script space when needed - PyErr_SetString(PyExc_ValueError, "can only register in a script space"); - return NULL; - } - else { - SpaceScript *scpt= (SpaceScript *)sl; - char *filename = NULL; - - if (scpt->script==NULL) { - scpt->script = MEM_callocN(sizeof(Script), "ScriptRegister"); - } - - BPY_getFileAndNum(&filename, NULL); - - if (filename) { - strncpy(scpt->script->scriptname, filename, sizeof(scpt->script->scriptname)); -#if 0 - char *dot; - dot = strchr(scpt->script->scriptname, '.'); /* remove extension */ - if (dot) - *dot= '\0'; -#endif - Py_XINCREF( py_draw_func ); - scpt->script->py_draw= (void *)py_draw_func; - } - else { - return NULL; /* BPY_getFileAndNum sets the error */ - } - - if (filename==NULL) { - return NULL; - } - } - - Py_RETURN_NONE; -} - -static PyObject *Method_registerKey( PyObject * self, PyObject * args ) -{ - PyObject *py_context; - PyObject *py_keywords= NULL; - char *keymap_name, *operator_name; - int spaceid, regionid; - int keyval, evtval, q1, q2; - - wmWindowManager *wm; - ListBase *keymap; - wmKeymapItem *km; - - if( !PyArg_ParseTuple( args, "O!iissiiii|O!:registerKey", &PyCObject_Type, &py_context, &spaceid, ®ionid, &keymap_name, &operator_name, &keyval, &evtval, &q1, &q2, &PyDict_Type, &py_keywords) ) - return NULL; - - wm= CTX_wm_manager(PyCObject_AsVoidPtr(py_context)); - - /* keymap= WM_keymap_listbase(wm, "Image Generic", SPACE_IMAGE, 0); */ - keymap= WM_keymap_listbase(wm, keymap_name, spaceid, regionid); - - km= WM_keymap_add_item(keymap, operator_name, keyval, evtval, q1, q2); - - /* Optional python doctionary used to set python properties, just like how keyword args are used */ - if (py_keywords && PyDict_Size(py_keywords)) { - if (pyrna_pydict_to_props(km->ptr, py_keywords, "Registering keybinding") == -1) - return NULL; - } - - Py_RETURN_NONE; -} - -static PyObject *Method_getRegonPtr( PyObject * self ) -{ - bContext *C= BPy_GetContext(); - - ARegion *ar = CTX_wm_region(C); - return PyCObject_FromVoidPtr(ar, NULL); -} - -static PyObject *Method_getAreaPtr( PyObject * self ) -{ - bContext *C= BPy_GetContext(); - - ScrArea *area = CTX_wm_area(C); - return PyCObject_FromVoidPtr(area, NULL); -} - -static PyObject *Method_getScreenPtr( PyObject * self ) -{ - bContext *C= BPy_GetContext(); - - bScreen *screen= CTX_wm_screen(C); - return PyCObject_FromVoidPtr(screen, NULL); -} - -static PyObject *Method_getSpacePtr( PyObject * self ) -{ - bContext *C= BPy_GetContext(); - - SpaceLink *sl= CTX_wm_space_data(C); - return PyCObject_FromVoidPtr(sl, NULL); -} - -static PyObject *Method_getWindowPtr( PyObject * self ) -{ - bContext *C= BPy_GetContext(); - - wmWindow *window= CTX_wm_window(C); - return PyCObject_FromVoidPtr(window, NULL); -} +/* Dummy Module, may want to include non RNA UI functions here, else it can be removed */ static struct PyMethodDef ui_methods[] = { - {"pupMenuBegin", (PyCFunction)Method_pupMenuBegin, METH_VARARGS, ""}, - {"pupMenuEnd", (PyCFunction)Method_pupMenuEnd, METH_VARARGS, ""}, - {"defButO", (PyCFunction)Method_defButO, METH_VARARGS, ""}, - {"defAutoButR", (PyCFunction)Method_defAutoButR, METH_VARARGS, ""}, - {"pupBlock", (PyCFunction)Method_pupBlock, METH_VARARGS, ""}, - {"beginBlock", (PyCFunction)Method_beginBlock, METH_VARARGS, ""}, - {"endBlock", (PyCFunction)Method_endBlock, METH_VARARGS, ""}, - {"drawBlock", (PyCFunction)Method_drawBlock, METH_VARARGS, ""}, - {"popupBoundsBlock", (PyCFunction)Method_popupBoundsBlock, METH_VARARGS, ""}, - {"blockBeginAlign", (PyCFunction)Method_blockBeginAlign, METH_VARARGS, ""}, - {"blockEndAlign", (PyCFunction)Method_blockEndAlign, METH_VARARGS, ""}, - {"blockSetFlag", (PyCFunction)Method_blockSetFlag, METH_VARARGS, ""}, - - {"register", (PyCFunction)Method_register, METH_VARARGS, ""}, // XXX not sure about this - registers current script with the ScriptSpace, like Draw.Register() - {"registerKey", (PyCFunction)Method_registerKey, METH_VARARGS, ""}, // XXX could have this in another place too - - - {"getRegonPtr", (PyCFunction)Method_getRegonPtr, METH_NOARGS, ""}, // XXX Nasty, we really need to improve dealing with context! - {"getAreaPtr", (PyCFunction)Method_getAreaPtr, METH_NOARGS, ""}, - {"getScreenPtr", (PyCFunction)Method_getScreenPtr, METH_NOARGS, ""}, - {"getSpacePtr", (PyCFunction)Method_getSpacePtr, METH_NOARGS, ""}, - {"getWindowPtr", (PyCFunction)Method_getWindowPtr, METH_NOARGS, ""}, - {NULL, NULL, 0, NULL} }; @@ -390,175 +67,6 @@ PyObject *BPY_ui_module( void ) submodule= Py_InitModule3( "bpy.ui", ui_methods, "" ); #endif - /* uiBlock->flag (controls) */ - mod = PyModule_New("ui"); - PyModule_AddObject( submodule, "ui", mod ); - PyModule_AddObject( mod, "BLOCK_LOOP", PyLong_FromSsize_t(UI_BLOCK_LOOP) ); - PyModule_AddObject( mod, "BLOCK_RET_1", PyLong_FromSsize_t(UI_BLOCK_RET_1) ); - PyModule_AddObject( mod, "BLOCK_NUMSELECT", PyLong_FromSsize_t(UI_BLOCK_NUMSELECT) ); - PyModule_AddObject( mod, "BLOCK_ENTER_OK", PyLong_FromSsize_t(UI_BLOCK_ENTER_OK) ); - PyModule_AddObject( mod, "BLOCK_NOSHADOW", PyLong_FromSsize_t(UI_BLOCK_NOSHADOW) ); - PyModule_AddObject( mod, "BLOCK_MOVEMOUSE_QUIT", PyLong_FromSsize_t(UI_BLOCK_MOVEMOUSE_QUIT) ); - PyModule_AddObject( mod, "BLOCK_KEEP_OPEN", PyLong_FromSsize_t(UI_BLOCK_KEEP_OPEN) ); - PyModule_AddObject( mod, "BLOCK_POPUP", PyLong_FromSsize_t(UI_BLOCK_POPUP) ); - - /* for executing operators (XXX move elsewhere) */ - mod = PyModule_New("wmTypes"); - PyModule_AddObject( submodule, "wmTypes", mod ); - PyModule_AddObject( mod, "OP_INVOKE_DEFAULT", PyLong_FromSsize_t(WM_OP_INVOKE_DEFAULT) ); - PyModule_AddObject( mod, "OP_INVOKE_REGION_WIN", PyLong_FromSsize_t(WM_OP_INVOKE_REGION_WIN) ); - PyModule_AddObject( mod, "OP_INVOKE_AREA", PyLong_FromSsize_t(WM_OP_INVOKE_AREA) ); - PyModule_AddObject( mod, "OP_INVOKE_SCREEN", PyLong_FromSsize_t(WM_OP_INVOKE_SCREEN) ); - PyModule_AddObject( mod, "OP_EXEC_DEFAULT", PyLong_FromSsize_t(WM_OP_EXEC_DEFAULT) ); - PyModule_AddObject( mod, "OP_EXEC_REGION_WIN", PyLong_FromSsize_t(WM_OP_EXEC_REGION_WIN) ); - PyModule_AddObject( mod, "OP_EXEC_AREA", PyLong_FromSsize_t(WM_OP_EXEC_AREA) ); - PyModule_AddObject( mod, "OP_EXEC_SCREEN", PyLong_FromSsize_t(WM_OP_EXEC_SCREEN) ); - - mod = PyModule_New("keyValTypes"); - PyModule_AddObject( submodule, "keyValTypes", mod ); - PyModule_AddObject( mod, "ANY", PyLong_FromSsize_t(KM_ANY) ); - PyModule_AddObject( mod, "NOTHING", PyLong_FromSsize_t(KM_NOTHING) ); - PyModule_AddObject( mod, "PRESS", PyLong_FromSsize_t(KM_PRESS) ); - PyModule_AddObject( mod, "RELEASE", PyLong_FromSsize_t(KM_RELEASE) ); - - mod = PyModule_New("keyModTypes"); - PyModule_AddObject( submodule, "keyModTypes", mod ); - PyModule_AddObject( mod, "SHIFT", PyLong_FromSsize_t(KM_SHIFT) ); - PyModule_AddObject( mod, "CTRL", PyLong_FromSsize_t(KM_CTRL) ); - PyModule_AddObject( mod, "ALT", PyLong_FromSsize_t(KM_ALT) ); - PyModule_AddObject( mod, "OSKEY", PyLong_FromSsize_t(KM_OSKEY) ); - - PyModule_AddObject( mod, "SHIFT2", PyLong_FromSsize_t(KM_SHIFT2) ); - PyModule_AddObject( mod, "CTRL2", PyLong_FromSsize_t(KM_CTRL2) ); - PyModule_AddObject( mod, "ALT2", PyLong_FromSsize_t(KM_ALT2) ); - PyModule_AddObject( mod, "OSKEY2", PyLong_FromSsize_t(KM_OSKEY2) ); - - mod = PyModule_New("keyTypes"); - PyModule_AddObject( submodule, "keyTypes", mod ); - PyModule_AddObject( mod, "A", PyLong_FromSsize_t(AKEY) ); - PyModule_AddObject( mod, "B", PyLong_FromSsize_t(BKEY) ); - PyModule_AddObject( mod, "C", PyLong_FromSsize_t(CKEY) ); - PyModule_AddObject( mod, "D", PyLong_FromSsize_t(DKEY) ); - PyModule_AddObject( mod, "E", PyLong_FromSsize_t(EKEY) ); - PyModule_AddObject( mod, "F", PyLong_FromSsize_t(FKEY) ); - PyModule_AddObject( mod, "G", PyLong_FromSsize_t(GKEY) ); - PyModule_AddObject( mod, "H", PyLong_FromSsize_t(HKEY) ); - PyModule_AddObject( mod, "I", PyLong_FromSsize_t(IKEY) ); - PyModule_AddObject( mod, "J", PyLong_FromSsize_t(JKEY) ); - PyModule_AddObject( mod, "K", PyLong_FromSsize_t(KKEY) ); - PyModule_AddObject( mod, "L", PyLong_FromSsize_t(LKEY) ); - PyModule_AddObject( mod, "M", PyLong_FromSsize_t(MKEY) ); - PyModule_AddObject( mod, "N", PyLong_FromSsize_t(NKEY) ); - PyModule_AddObject( mod, "O", PyLong_FromSsize_t(OKEY) ); - PyModule_AddObject( mod, "P", PyLong_FromSsize_t(PKEY) ); - PyModule_AddObject( mod, "Q", PyLong_FromSsize_t(QKEY) ); - PyModule_AddObject( mod, "R", PyLong_FromSsize_t(RKEY) ); - PyModule_AddObject( mod, "S", PyLong_FromSsize_t(SKEY) ); - PyModule_AddObject( mod, "T", PyLong_FromSsize_t(TKEY) ); - PyModule_AddObject( mod, "U", PyLong_FromSsize_t(UKEY) ); - PyModule_AddObject( mod, "V", PyLong_FromSsize_t(VKEY) ); - PyModule_AddObject( mod, "W", PyLong_FromSsize_t(WKEY) ); - PyModule_AddObject( mod, "X", PyLong_FromSsize_t(XKEY) ); - PyModule_AddObject( mod, "Y", PyLong_FromSsize_t(YKEY) ); - PyModule_AddObject( mod, "Z", PyLong_FromSsize_t(ZKEY) ); - PyModule_AddObject( mod, "ZERO", PyLong_FromSsize_t(ZEROKEY) ); - PyModule_AddObject( mod, "ONE", PyLong_FromSsize_t(ONEKEY) ); - PyModule_AddObject( mod, "TWO", PyLong_FromSsize_t(TWOKEY) ); - PyModule_AddObject( mod, "THREE", PyLong_FromSsize_t(THREEKEY) ); - PyModule_AddObject( mod, "FOUR", PyLong_FromSsize_t(FOURKEY) ); - PyModule_AddObject( mod, "FIVE", PyLong_FromSsize_t(FIVEKEY) ); - PyModule_AddObject( mod, "SIX", PyLong_FromSsize_t(SIXKEY) ); - PyModule_AddObject( mod, "SEVEN", PyLong_FromSsize_t(SEVENKEY) ); - PyModule_AddObject( mod, "EIGHT", PyLong_FromSsize_t(EIGHTKEY) ); - PyModule_AddObject( mod, "NINE", PyLong_FromSsize_t(NINEKEY) ); - PyModule_AddObject( mod, "CAPSLOCK", PyLong_FromSsize_t(CAPSLOCKKEY) ); - PyModule_AddObject( mod, "LEFTCTRL", PyLong_FromSsize_t(LEFTCTRLKEY) ); - PyModule_AddObject( mod, "LEFTALT", PyLong_FromSsize_t(LEFTALTKEY) ); - PyModule_AddObject( mod, "RIGHTALT", PyLong_FromSsize_t(RIGHTALTKEY) ); - PyModule_AddObject( mod, "RIGHTCTRL", PyLong_FromSsize_t(RIGHTCTRLKEY) ); - PyModule_AddObject( mod, "RIGHTSHIFT", PyLong_FromSsize_t(RIGHTSHIFTKEY) ); - PyModule_AddObject( mod, "LEFTSHIFT", PyLong_FromSsize_t(LEFTSHIFTKEY) ); - PyModule_AddObject( mod, "ESC", PyLong_FromSsize_t(ESCKEY) ); - PyModule_AddObject( mod, "TAB", PyLong_FromSsize_t(TABKEY) ); - PyModule_AddObject( mod, "RET", PyLong_FromSsize_t(RETKEY) ); - PyModule_AddObject( mod, "SPACE", PyLong_FromSsize_t(SPACEKEY) ); - PyModule_AddObject( mod, "LINEFEED", PyLong_FromSsize_t(LINEFEEDKEY) ); - PyModule_AddObject( mod, "BACKSPACE", PyLong_FromSsize_t(BACKSPACEKEY) ); - PyModule_AddObject( mod, "DEL", PyLong_FromSsize_t(DELKEY) ); - PyModule_AddObject( mod, "SEMICOLON", PyLong_FromSsize_t(SEMICOLONKEY) ); - PyModule_AddObject( mod, "PERIOD", PyLong_FromSsize_t(PERIODKEY) ); - PyModule_AddObject( mod, "COMMA", PyLong_FromSsize_t(COMMAKEY) ); - PyModule_AddObject( mod, "QUOTE", PyLong_FromSsize_t(QUOTEKEY) ); - PyModule_AddObject( mod, "ACCENTGRAVE", PyLong_FromSsize_t(ACCENTGRAVEKEY) ); - PyModule_AddObject( mod, "MINUS", PyLong_FromSsize_t(MINUSKEY) ); - PyModule_AddObject( mod, "SLASH", PyLong_FromSsize_t(SLASHKEY) ); - PyModule_AddObject( mod, "BACKSLASH", PyLong_FromSsize_t(BACKSLASHKEY) ); - PyModule_AddObject( mod, "EQUAL", PyLong_FromSsize_t(EQUALKEY) ); - PyModule_AddObject( mod, "LEFTBRACKET", PyLong_FromSsize_t(LEFTBRACKETKEY) ); - PyModule_AddObject( mod, "RIGHTBRACKET", PyLong_FromSsize_t(RIGHTBRACKETKEY) ); - PyModule_AddObject( mod, "LEFTARROW", PyLong_FromSsize_t(LEFTARROWKEY) ); - PyModule_AddObject( mod, "DOWNARROW", PyLong_FromSsize_t(DOWNARROWKEY) ); - PyModule_AddObject( mod, "RIGHTARROW", PyLong_FromSsize_t(RIGHTARROWKEY) ); - PyModule_AddObject( mod, "UPARROW", PyLong_FromSsize_t(UPARROWKEY) ); - PyModule_AddObject( mod, "PAD0", PyLong_FromSsize_t(PAD0) ); - PyModule_AddObject( mod, "PAD1", PyLong_FromSsize_t(PAD1) ); - PyModule_AddObject( mod, "PAD2", PyLong_FromSsize_t(PAD2) ); - PyModule_AddObject( mod, "PAD3", PyLong_FromSsize_t(PAD3) ); - PyModule_AddObject( mod, "PAD4", PyLong_FromSsize_t(PAD4) ); - PyModule_AddObject( mod, "PAD5", PyLong_FromSsize_t(PAD5) ); - PyModule_AddObject( mod, "PAD6", PyLong_FromSsize_t(PAD6) ); - PyModule_AddObject( mod, "PAD7", PyLong_FromSsize_t(PAD7) ); - PyModule_AddObject( mod, "PAD8", PyLong_FromSsize_t(PAD8) ); - PyModule_AddObject( mod, "PAD9", PyLong_FromSsize_t(PAD9) ); - PyModule_AddObject( mod, "PADPERIOD", PyLong_FromSsize_t(PADPERIOD) ); - PyModule_AddObject( mod, "PADSLASH", PyLong_FromSsize_t(PADSLASHKEY) ); - PyModule_AddObject( mod, "PADASTER", PyLong_FromSsize_t(PADASTERKEY) ); - PyModule_AddObject( mod, "PADMINUS", PyLong_FromSsize_t(PADMINUS) ); - PyModule_AddObject( mod, "PADENTER", PyLong_FromSsize_t(PADENTER) ); - PyModule_AddObject( mod, "PADPLUS", PyLong_FromSsize_t(PADPLUSKEY) ); - PyModule_AddObject( mod, "F1", PyLong_FromSsize_t(F1KEY) ); - PyModule_AddObject( mod, "F2", PyLong_FromSsize_t(F2KEY) ); - PyModule_AddObject( mod, "F3", PyLong_FromSsize_t(F3KEY) ); - PyModule_AddObject( mod, "F4", PyLong_FromSsize_t(F4KEY) ); - PyModule_AddObject( mod, "F5", PyLong_FromSsize_t(F5KEY) ); - PyModule_AddObject( mod, "F6", PyLong_FromSsize_t(F6KEY) ); - PyModule_AddObject( mod, "F7", PyLong_FromSsize_t(F7KEY) ); - PyModule_AddObject( mod, "F8", PyLong_FromSsize_t(F8KEY) ); - PyModule_AddObject( mod, "F9", PyLong_FromSsize_t(F9KEY) ); - PyModule_AddObject( mod, "F10", PyLong_FromSsize_t(F10KEY) ); - PyModule_AddObject( mod, "F11", PyLong_FromSsize_t(F11KEY) ); - PyModule_AddObject( mod, "F12", PyLong_FromSsize_t(F12KEY) ); - PyModule_AddObject( mod, "PAUSE", PyLong_FromSsize_t(PAUSEKEY) ); - PyModule_AddObject( mod, "INSERT", PyLong_FromSsize_t(INSERTKEY) ); - PyModule_AddObject( mod, "HOME", PyLong_FromSsize_t(HOMEKEY) ); - PyModule_AddObject( mod, "PAGEUP", PyLong_FromSsize_t(PAGEUPKEY) ); - PyModule_AddObject( mod, "PAGEDOWN", PyLong_FromSsize_t(PAGEDOWNKEY) ); - PyModule_AddObject( mod, "END", PyLong_FromSsize_t(ENDKEY) ); - PyModule_AddObject( mod, "UNKNOWN", PyLong_FromSsize_t(UNKNOWNKEY) ); - PyModule_AddObject( mod, "COMMAND", PyLong_FromSsize_t(COMMANDKEY) ); - PyModule_AddObject( mod, "GRLESS", PyLong_FromSsize_t(GRLESSKEY) ); - - mod = PyModule_New("spaceTypes"); - PyModule_AddObject( submodule, "spaceTypes", mod ); - PyModule_AddObject( mod, "EMPTY", PyLong_FromSsize_t(SPACE_EMPTY) ); - PyModule_AddObject( mod, "VIEW3D", PyLong_FromSsize_t(SPACE_VIEW3D) ); - PyModule_AddObject( mod, "IPO", PyLong_FromSsize_t(SPACE_IPO) ); - PyModule_AddObject( mod, "OUTLINER", PyLong_FromSsize_t(SPACE_OUTLINER) ); - PyModule_AddObject( mod, "BUTS", PyLong_FromSsize_t(SPACE_BUTS) ); - PyModule_AddObject( mod, "FILE", PyLong_FromSsize_t(SPACE_FILE) ); - PyModule_AddObject( mod, "IMAGE", PyLong_FromSsize_t(SPACE_IMAGE) ); - PyModule_AddObject( mod, "INFO", PyLong_FromSsize_t(SPACE_INFO) ); - PyModule_AddObject( mod, "SEQ", PyLong_FromSsize_t(SPACE_SEQ) ); - PyModule_AddObject( mod, "TEXT", PyLong_FromSsize_t(SPACE_TEXT) ); - PyModule_AddObject( mod, "IMASEL", PyLong_FromSsize_t(SPACE_IMASEL) ); - PyModule_AddObject( mod, "SOUND", PyLong_FromSsize_t(SPACE_SOUND) ); - PyModule_AddObject( mod, "ACTION", PyLong_FromSsize_t(SPACE_ACTION) ); - PyModule_AddObject( mod, "NLA", PyLong_FromSsize_t(SPACE_NLA) ); - PyModule_AddObject( mod, "SCRIPT", PyLong_FromSsize_t(SPACE_SCRIPT) ); - PyModule_AddObject( mod, "TIME", PyLong_FromSsize_t(SPACE_TIME) ); - PyModule_AddObject( mod, "NODE", PyLong_FromSsize_t(SPACE_NODE) ); - PyModule_AddObject( mod, "CONSOLE", PyLong_FromSsize_t(SPACE_CONSOLE) ); - /* INCREF since its its assumed that all these functions return the * module with a new ref like PyDict_New, since they are passed to * PyModule_AddObject which steals a ref */ @@ -566,5 +74,3 @@ PyObject *BPY_ui_module( void ) return submodule; } - - diff --git a/source/blender/python/intern/stubs.c b/source/blender/python/intern/stubs.c index 8d6b5ad9f19..94bdb6ba6ab 100644 --- a/source/blender/python/intern/stubs.c +++ b/source/blender/python/intern/stubs.c @@ -30,9 +30,7 @@ void BPY_post_start_python() {} //void BPY_run_python_script() {} //void BPY_start_python() {} -void BPY_do_all_scripts() {} void BPY_call_importloader() {} -void BPY_do_pyscript() {} void BPY_clear_script() {} //void BPY_free_compiled_text() {} void BPY_pyconstraint_eval() {} diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 643a381c54f..2df3a0a4f8b 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -39,6 +39,7 @@ struct bNodeTree; struct Image; struct NodeBlurData; struct Object; +struct ReportList; struct RenderData; struct RenderEngine; struct RenderEngineType; @@ -240,6 +241,8 @@ struct Scene *RE_GetScene(struct Render *re); /* External Engine */ +#define RE_INTERNAL 1 +#define RE_GAME 2 extern ListBase R_engines; @@ -249,6 +252,7 @@ typedef struct RenderEngineType { /* type info */ char idname[32]; char name[32]; + int flag; void (*render)(struct RenderEngine *engine, struct Scene *scene); @@ -262,6 +266,8 @@ typedef struct RenderEngine { ListBase fullresult; } RenderEngine; +void RE_layer_rect_from_file(RenderLayer *layer, struct ReportList *reports, char *filename, int x, int y); + struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h); void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result); void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result); @@ -269,7 +275,8 @@ void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result); int RE_engine_test_break(RenderEngine *engine); void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info); -void RE_engines_free(void); +void RE_engines_init(void); +void RE_engines_exit(void); #endif /* RE_PIPELINE_H */ diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index a67cc10b091..296405c963b 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -1250,7 +1250,7 @@ static void particle_curve(Render *re, ObjectRen *obr, DerivedMesh *dm, Material { HaloRen *har=0; - if(ma->mode&MA_WIRE) + if(ma->material_type == MA_TYPE_WIRE) static_particle_wire(obr, ma, loc, loc1, sd->first, sd->line); else if(ma->material_type == MA_TYPE_HALO) { har= RE_inithalo_particle(re, obr, dm, ma, loc, loc1, sd->orco, sd->uvco, sd->size, 1.0, seed); @@ -1627,7 +1627,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem path_nbr=(int)pow(2.0,(double) part->ren_step); if(path_nbr) { - if((ma->material_type != MA_TYPE_HALO) && (ma->mode & MA_WIRE)==0) { + if(!ELEM(ma->material_type, MA_TYPE_HALO, MA_TYPE_WIRE)) { sd.orco = MEM_mallocN(3*sizeof(float)*(totpart+totchild), "particle orcos"); set_object_orco(re, psys, sd.orco); } @@ -3124,7 +3124,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) } /* if wire material, and we got edges, don't do the faces */ - if(ma->mode & MA_WIRE) { + if(ma->material_type == MA_TYPE_WIRE) { end= dm->getNumEdges(dm); if(end) ok= 0; } @@ -3209,7 +3209,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) end= dm->getNumEdges(dm); mvert= dm->getVertArray(dm); ma= give_render_material(re, ob, 1); - if(end && (ma->mode & MA_WIRE)) { + if(end && (ma->material_type == MA_TYPE_WIRE)) { MEdge *medge; struct edgesort *edgetable; int totedge= 0; @@ -3834,7 +3834,7 @@ static void split_quads(ObjectRen *obr, int dir) vlr= RE_findOrAddVlak(obr, a); /* test if rendering as a quad or triangle, skip wire */ - if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->mode & MA_WIRE)==0) { + if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->material_type != MA_TYPE_WIRE)) { if(vlr->v4) { @@ -3884,7 +3884,7 @@ static void check_non_flat_quads(ObjectRen *obr) vlr= RE_findOrAddVlak(obr, a); /* test if rendering as a quad or triangle, skip wire */ - if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->mode & MA_WIRE)==0) { + if(vlr->v4 && (vlr->flag & R_STRAND)==0 && (vlr->mat->material_type != MA_TYPE_WIRE)) { /* check if quad is actually triangle */ v1= vlr->v1; diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c index 603241038da..01131f09b96 100644 --- a/source/blender/render/intern/source/imagetexture.c +++ b/source/blender/render/intern/source/imagetexture.c @@ -1342,7 +1342,7 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, b *= ff; } maxd = MAX2(b, 1e-8f); - levf = logf(maxd)*(float)M_LOG2E; + levf = ((float)M_LOG2E)*logf(maxd); curmap = 0; maxlev = 1; @@ -1503,7 +1503,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f VECCOPY(dyt, DYT); // anisotropic filtering - if (!SAT && (tex->texfilter != TXF_DEFAULT)) + if (!SAT && (tex->texfilter != TXF_BOX)) return imagewraposa_aniso(tex, ima, ibuf, texvec, dxt, dyt, texres); texres->tin= texres->ta= texres->tr= texres->tg= texres->tb= 0.0f; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 801a9729277..14df6b8ec9f 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -45,8 +45,10 @@ #include "BKE_main.h" #include "BKE_node.h" #include "BKE_object.h" +#include "BKE_report.h" #include "BKE_scene.h" #include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */ +#include "BKE_sequence.h" #include "BKE_pointcache.h" #include "MEM_guardedalloc.h" @@ -2302,6 +2304,63 @@ static void renderresult_stampinfo(Scene *scene) BKE_stamp_buf(scene, (unsigned char *)rres.rect32, rres.rectf, rres.rectx, rres.recty, 4); } +static void do_render_seq(Render * re) +{ + static int recurs_depth = 0; + struct ImBuf *ibuf; + RenderResult *rr = re->result; + int cfra = re->r.cfra; + + recurs_depth++; + + ibuf= give_ibuf_seq(re->scene, rr->rectx, rr->recty, cfra, 0, 100.0); + + recurs_depth--; + + if(ibuf) { + if(ibuf->rect_float) { + if (!rr->rectf) + rr->rectf= MEM_mallocN(4*sizeof(float)*rr->rectx*rr->recty, "render_seq rectf"); + + memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty); + + /* TSK! Since sequence render doesn't free the *rr render result, the old rect32 + can hang around when sequence render has rendered a 32 bits one before */ + if(rr->rect32) { + MEM_freeN(rr->rect32); + rr->rect32= NULL; + } + } + else if(ibuf->rect) { + if (!rr->rect32) + rr->rect32= MEM_mallocN(sizeof(int)*rr->rectx*rr->recty, "render_seq rect"); + + memcpy(rr->rect32, ibuf->rect, 4*rr->rectx*rr->recty); + + /* if (ibuf->zbuf) { */ + /* if (R.rectz) freeN(R.rectz); */ + /* R.rectz = BLI_dupallocN(ibuf->zbuf); */ + /* } */ + } + + if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */ + Editing * ed = re->scene->ed; + if (ed) { + free_imbuf_seq(&ed->seqbase, TRUE); + } + } + } + else { + /* render result is delivered empty in most cases, nevertheless we handle all cases */ + if (rr->rectf) + memset(rr->rectf, 0, 4*sizeof(float)*rr->rectx*rr->recty); + else if (rr->rect32) + memset(rr->rect32, 0, 4*rr->rectx*rr->recty); + else + rr->rect32= MEM_callocN(sizeof(int)*rr->rectx*rr->recty, "render_seq rect"); + } +} + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* main loop: doing sequence + fields + blur + 3d render + compositing */ @@ -2315,7 +2374,7 @@ static void do_render_all_options(Render *re) if((re->r.scemode & R_DOSEQ) && re->scene->ed && re->scene->ed->seqbase.first) { /* note: do_render_seq() frees rect32 when sequencer returns float images */ if(!re->test_break(re->tbh)) - ; //XXX do_render_seq(re->result, re->r.cfra); + do_render_seq(re); re->stats_draw(re->sdh, &re->i); re->display_draw(re->ddh, re->result, NULL); @@ -2783,12 +2842,6 @@ void RE_init_threadcount(Render *re) /************************** External Engines ***************************/ -static RenderEngineType internal_engine_type = { - NULL, NULL, "BlenderRenderEngine", "Blender", NULL, - NULL, NULL, NULL, NULL}; - -ListBase R_engines = {&internal_engine_type, &internal_engine_type}; - RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h) { Render *re= engine->re; @@ -2882,6 +2935,47 @@ void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info) re->i.statstr= NULL; } +/* loads in image into a result, size must match + * x/y offsets are only used on a partial copy when dimensions dont match */ +void RE_layer_rect_from_file(RenderLayer *layer, ReportList *reports, char *filename, int x, int y) +{ + ImBuf *ibuf = IMB_loadiffname(filename, IB_rect); + + if(ibuf && (ibuf->rect || ibuf->rect_float)) { + if (ibuf->x == layer->rectx && ibuf->y == layer->recty) { + if(ibuf->rect_float==NULL) + IMB_float_from_rect(ibuf); + + memcpy(layer->rectf, ibuf->rect_float, sizeof(float)*4*layer->rectx*layer->recty); + } else { + if ((ibuf->x - x >= layer->rectx) && (ibuf->y - y >= layer->recty)) { + ImBuf *ibuf_clip; + + if(ibuf->rect_float==NULL) + IMB_float_from_rect(ibuf); + + ibuf_clip = IMB_allocImBuf(layer->rectx, layer->recty, 32, IB_rectfloat, 0); + if(ibuf_clip) { + IMB_rectcpy(ibuf_clip, ibuf, 0,0, x,y, layer->rectx, layer->recty); + + memcpy(layer->rectf, ibuf_clip->rect_float, sizeof(float)*4*layer->rectx*layer->recty); + IMB_freeImBuf(ibuf_clip); + } + else { + BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to allocate clip buffer '%s'\n", filename); + } + } + else { + BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: incorrect dimensions for partial copy '%s'\n", filename); + } + } + + IMB_freeImBuf(ibuf); + } + else { + BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename); + } +} static void external_render_3d(Render *re, RenderEngineType *type) { RenderEngine engine; @@ -2924,19 +3018,3 @@ static void external_render_3d(Render *re, RenderEngineType *type) } } -void RE_engines_free() -{ - RenderEngineType *type, *next; - - for(type=R_engines.first; type; type=next) { - next= type->next; - - if(type != &internal_engine_type) { - if(type->ext.free) - type->ext.free(type->ext.data); - - MEM_freeN(type); - } - } -} - diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index df74e88e87e..010930fcb85 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -133,7 +133,7 @@ void makeraytree(Render *re) else vlr++; /* baking selected to active needs non-traceable too */ if((re->flag & R_BAKE_TRACE) || (vlr->mat->mode & MA_TRACEBLE)) { - if((vlr->mat->mode & MA_WIRE)==0) { + if(vlr->mat->material_type != MA_TYPE_WIRE) { VECCOPY(co1, vlr->v1->co); VECCOPY(co2, vlr->v2->co); VECCOPY(co3, vlr->v3->co); @@ -194,7 +194,7 @@ void makeraytree(Render *re) else vlr++; if((re->flag & R_BAKE_TRACE) || (vlr->mat->mode & MA_TRACEBLE)) - if((vlr->mat->mode & MA_WIRE)==0) + if(vlr->mat->material_type != MA_TYPE_WIRE) RE_ray_tree_add_face(re->raytree, RAY_OBJECT_SET(re, obi), vlr); } } diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c index 71cd678233d..33085b98095 100644 --- a/source/blender/render/intern/source/shadbuf.c +++ b/source/blender/render/intern/source/shadbuf.c @@ -1557,7 +1557,7 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root) ma= vlr->mat; ok= 1; if((ma->mode & MA_SHADBUF)==0) ok= 0; - if(ma->mode & MA_WIRE) ok= 0; + if(ma->material_type == MA_TYPE_WIRE) ok= 0; zspanstrand.shad_alpha= zspan.shad_alpha= ma->shad_alpha; } @@ -1589,7 +1589,7 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root) c4= testclip(hoco[3]); /* ***** NO WIRE YET */ - if(ma->mode & MA_WIRE) { + if(ma->material_type == MA_TYPE_WIRE) { if(vlr->v4) zbufclipwire(&zspan, i, a+1, vlr->ec, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4); else diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 6b1d11be6f3..c860e9ac5d1 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -617,7 +617,7 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float * /* returns not normalized, so is in viewplane coords */ calc_view_vector(view, x, y); - if(shi->mat->mode & MA_WIRE) { + if(shi->mat->material_type == MA_TYPE_WIRE) { /* wire cannot use normal for calculating shi->co, so * we reconstruct the coordinate less accurate */ if(R.r.mode & R_ORTHO) diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index f67826a9806..88f940a5856 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -61,12 +61,14 @@ extern struct Render R; static ListBase *get_lights(ShadeInput *shi) { + if(R.r.scemode & R_PREVIEWBUTS) + return &R.lights; if(shi->light_override) return &shi->light_override->gobject; - else if(shi->mat && shi->mat->group) + if(shi->mat && shi->mat->group) return &shi->mat->group->gobject; - else - return &R.lights; + + return &R.lights; } #if 0 diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index 3f7ffc5b9bb..bb491efdaba 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -1107,7 +1107,7 @@ static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *n, float *d float origf= fx *= tex->xrepeat; // TXF: omit mirror here, see comments in do_material_tex() after do_2d_mapping() call - if (tex->texfilter == TXF_DEFAULT) { + if (tex->texfilter == TXF_BOX) { if(fx>1.0f) fx -= (int)(fx); else if(fx<0.0f) fx+= 1-(int)(fx); @@ -1127,7 +1127,7 @@ static void do_2d_mapping(MTex *mtex, float *t, VlakRen *vlr, float *n, float *d float origf= fy *= tex->yrepeat; // TXF: omit mirror here, see comments in do_material_tex() after do_2d_mapping() call - if (tex->texfilter == TXF_DEFAULT) { + if (tex->texfilter == TXF_BOX) { if(fy>1.0f) fy -= (int)(fy); else if(fy<0.0f) fy+= 1-(int)(fy); @@ -1545,7 +1545,7 @@ static void texco_mapping(ShadeInput* shi, Tex* tex, MTex* mtex, float* co, floa // textures are scaled (sizeXYZ) as well as repeated. See also modification in do_2d_mapping(). // (since currently only done in osa mode, results will look incorrect without osa TODO) if (tex->extend == TEX_REPEAT && (tex->flag & TEX_REPEAT_XMIR)) { - if (tex->texfilter == TXF_DEFAULT) + if (tex->texfilter == TXF_BOX) texvec[0] -= floorf(texvec[0]); // this line equivalent to old code, same below else if (texvec[0] < 0.f || texvec[0] > 1.f) { const float tx = 0.5f*texvec[0]; @@ -1554,7 +1554,7 @@ static void texco_mapping(ShadeInput* shi, Tex* tex, MTex* mtex, float* co, floa } } if (tex->extend == TEX_REPEAT && (tex->flag & TEX_REPEAT_YMIR)) { - if (tex->texfilter == TXF_DEFAULT) + if (tex->texfilter == TXF_BOX) texvec[1] -= floorf(texvec[1]); else if (texvec[1] < 0.f || texvec[1] > 1.f) { const float ty = 0.5f*texvec[1]; @@ -2571,7 +2571,7 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL}; float *co = NULL, *dx = NULL, *dy = NULL, fact, stencilTin=1.0; float texvec[3], dxt[3], dyt[3], tempvec[3]; - int tex_nr, rgb= 0; + int i, tex_nr, rgb= 0; if (R.r.scemode & R_NO_TEX) return; tex_nr= 0; @@ -2647,21 +2647,33 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef else texvec[2]= mtex->size[2]*(mtex->ofs[2]); if(shi->osatex) { - if(mtex->projx) { - dxt[0]= mtex->size[0]*dx[mtex->projx-1]; - dyt[0]= mtex->size[0]*dy[mtex->projx-1]; - } - else dxt[0]= 0.0; - if(mtex->projy) { - dxt[1]= mtex->size[1]*dx[mtex->projy-1]; - dyt[1]= mtex->size[1]*dy[mtex->projy-1]; - } - else dxt[1]= 0.0; - if(mtex->projx) { - dxt[2]= mtex->size[2]*dx[mtex->projz-1]; - dyt[2]= mtex->size[2]*dy[mtex->projz-1]; + if (!dx) { + for(i=0;i<2;i++) { + dxt[i] = dyt[i] = 0.0; + } + } else { + if(mtex->projx) { + dxt[0]= mtex->size[0]*dx[mtex->projx-1]; + dyt[0]= mtex->size[0]*dy[mtex->projx-1]; + } else { + dxt[0]= 0.0; + dyt[0]= 0.0; + } + if(mtex->projy) { + dxt[1]= mtex->size[1]*dx[mtex->projy-1]; + dyt[1]= mtex->size[1]*dy[mtex->projy-1]; + } else { + dxt[1]= 0.0; + dyt[1]= 0.0; + } + if(mtex->projz) { + dxt[2]= mtex->size[2]*dx[mtex->projz-1]; + dyt[2]= mtex->size[2]*dy[mtex->projz-1]; + } else { + dxt[2]= 0.0; + dyt[2]= 0.0; + } } - else dxt[2]= 0.0; } /* texture */ diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index 0d8f1be8c85..4436f3aa047 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -2154,7 +2154,7 @@ void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart*, ma= vlr->mat; nofill= ma->mode & (MA_ZTRA|MA_ONLYCAST); env= (ma->mode & MA_ENV); - wire= (ma->mode & MA_WIRE); + wire= (ma->material_type == MA_TYPE_WIRE); for(zsample=0; zsample<samples; zsample++) { if(ma->mode & MA_ZINV || (zmaskpass && neg_zmask)) @@ -2341,7 +2341,7 @@ void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int c2= zbuf_shadow_project(cache, vlr->v2->index, obwinmat, vlr->v2->co, ho2); c3= zbuf_shadow_project(cache, vlr->v3->index, obwinmat, vlr->v3->co, ho3); - if((ma->mode & MA_WIRE) || (vlr->flag & R_STRAND)) { + if((ma->material_type == MA_TYPE_WIRE) || (vlr->flag & R_STRAND)) { if(vlr->v4) { c4= zbuf_shadow_project(cache, vlr->v4->index, obwinmat, vlr->v4->co, ho4); zbufclipwire(&zspan, 0, a+1, vlr->ec, ho1, ho2, ho3, ho4, c1, c2, c3, c4); @@ -2571,7 +2571,7 @@ void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(vo ma= vlr->mat; nofill= ma->mode & MA_ONLYCAST; env= (ma->mode & MA_ENV); - wire= (ma->mode & MA_WIRE); + wire= (ma->material_type == MA_TYPE_WIRE); } } else { @@ -3357,7 +3357,7 @@ static int zbuffer_abuf(RenderPart *pa, APixstr *APixbuf, ListBase *apsmbase, Re zspan= &zspans[zsample]; zspan->polygon_offset= polygon_offset; - if(ma->mode & (MA_WIRE)) { + if(ma->material_type == MA_TYPE_WIRE) { if(v4) zbufclipwire(zspan, i, zvlnr, vlr->ec, ho1, ho2, ho3, ho4, c1, c2, c3, c4); else diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 542a747d454..decd855eae0 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -51,13 +51,22 @@ void WM_init (struct bContext *C); void WM_exit (struct bContext *C); void WM_main (struct bContext *C); -struct wmWindow *WM_window_open (struct bContext *C, struct rcti *rect); +struct wmWindow *WM_window_open (struct bContext *C, struct rcti *rect); + + /* defines for 'type' WM_window_open_temp */ +#define WM_WINDOW_RENDER 0 +#define WM_WINDOW_USERPREFS 1 +#define WM_WINDOW_FILESEL 2 + +void WM_window_open_temp (struct bContext *C, struct rcti *position, int type); + + /* files */ int WM_read_homefile (struct bContext *C, struct wmOperator *op); int WM_write_homefile (struct bContext *C, struct wmOperator *op); void WM_read_file (struct bContext *C, char *name, struct ReportList *reports); -void WM_write_file (struct bContext *C, char *target, struct ReportList *reports); +void WM_write_file (struct bContext *C, char *target, int compress, struct ReportList *reports); void WM_read_autosavefile(struct bContext *C); void WM_write_autosave (struct bContext *C); @@ -87,9 +96,11 @@ wmKeyMap *WM_modalkeymap_get(struct wmWindowManager *wm, const char *nameid); void WM_modalkeymap_add_item(wmKeyMap *km, short type, short val, int modifier, short keymodifier, short value); void WM_modalkeymap_assign(wmKeyMap *km, const char *opname); +int WM_key_event_is_tweak(short type); const char *WM_key_event_string(short type); char *WM_key_event_operator_string(const struct bContext *C, const char *opname, int opcontext, struct IDProperty *properties, char *str, int len); +void WM_key_event_operator_change(const struct bContext *C, const char *opname, int opcontext, struct IDProperty *properties, short key, short modifier); /* handlers */ @@ -147,6 +158,10 @@ void WM_operatortype_append (void (*opfunc)(wmOperatorType*)); void WM_operatortype_append_ptr (void (*opfunc)(wmOperatorType*, void *), void *userdata); int WM_operatortype_remove(const char *idname); +wmOperatorType *WM_operatortype_append_macro(char *idname, char *name, int flag); +wmOperatorTypeMacro *WM_operatortype_macro_define(wmOperatorType *ot, const char *idname); + + int WM_operator_call (struct bContext *C, struct wmOperator *op); int WM_operator_repeat (struct bContext *C, struct wmOperator *op); int WM_operator_name_call (struct bContext *C, const char *opstring, int context, struct PointerRNA *properties); @@ -154,9 +169,10 @@ int WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, struct void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring); void WM_operator_properties_free(struct PointerRNA *ptr); +void WM_operator_properties_filesel(struct wmOperatorType *ot, int filter); /* operator as a python command (resultuing string must be free'd) */ -char *WM_operator_pystring(struct wmOperator *op); +char *WM_operator_pystring(struct wmOperatorType *ot, struct PointerRNA *opptr, int all_args); void WM_operator_bl_idname(char *to, const char *from); void WM_operator_py_idname(char *to, const char *from); diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 3a646c5e799..a083d589d31 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -43,6 +43,7 @@ struct wmWindowManager; #define OPTYPE_REGISTER 1 /* register operators in stack after finishing */ #define OPTYPE_UNDO 2 /* do undo push after after */ #define OPTYPE_BLOCKING 4 /* let blender grab all input from the WM (X11) */ +#define OPTYPE_MACRO 8 /* context to call operator in for WM_operator_name_call */ /* rna_ui.c contains EnumPropertyItem's of these, keep in sync */ diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index 863fb3ab4bd..406541d62ba 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -74,6 +74,12 @@ void WM_operator_free(wmOperator *op) MEM_freeN(op->reports); } + if(op->macro.first) { + wmOperator *opm; + for(opm= op->macro.first; opm; opm= opm->next) + WM_operator_free(opm); + } + MEM_freeN(op); } @@ -97,7 +103,7 @@ void wm_operator_register(bContext *C, wmOperator *op) /* Report the string representation of the operator */ - buf = WM_operator_pystring(op); + buf = WM_operator_pystring(op->type, op->ptr, 1); BKE_report(CTX_wm_reports(C), RPT_OPERATOR, buf); MEM_freeN(buf); @@ -124,7 +130,7 @@ void WM_keymap_init(bContext *C) { wmWindowManager *wm= CTX_wm_manager(C); - if(CTX_py_init_get(C) && (wm->initialized & WM_INIT_KEYMAP) == 0) { + if(wm && CTX_py_init_get(C) && (wm->initialized & WM_INIT_KEYMAP) == 0) { wm_window_keymap(wm); ED_spacetypes_keymap(wm); diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c index 79830aca12f..56a8d76d8bf 100644 --- a/source/blender/windowmanager/intern/wm_cursors.c +++ b/source/blender/windowmanager/intern/wm_cursors.c @@ -104,6 +104,13 @@ void WM_cursor_set(wmWindow *win, int curs) return; } +#ifdef _WIN32 + /* the default win32 cross cursor is barely visible, + * only 1 pixel thick, use another one instead */ + if(curs==CURSOR_EDIT) + curs= BC_CROSSCURSOR; +#endif + GHOST_SetCursorVisibility(win->ghostwin, 1); win->cursor= curs; diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 5377e351ff0..d40e6c60bfd 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -244,6 +244,23 @@ void wm_event_do_notifiers(bContext *C) /* ********************* operators ******************* */ +static int wm_operator_poll(bContext *C, wmOperatorType *ot) +{ + wmOperatorTypeMacro *otmacro; + + for(otmacro= ot->macro.first; otmacro; otmacro= otmacro->next) { + wmOperatorType *ot= WM_operatortype_find(otmacro->idname, 0); + + if(0==wm_operator_poll(C, ot)) + return 0; + } + + if(ot->poll) + return ot->poll(C); + + return 1; +} + /* if repeat is true, it doesn't register again, nor does it free */ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat) { @@ -252,7 +269,7 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat) if(op==NULL || op->type==NULL) return retval; - if(op->type->poll && op->type->poll(C)==0) + if(0==wm_operator_poll(C, op->type)) return retval; if(op->type->exec) @@ -267,7 +284,7 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat) ED_undo_push_op(C, op); if(repeat==0) { - if(op->type->flag & OPTYPE_REGISTER) + if((op->type->flag & OPTYPE_REGISTER) || (G.f & G_DEBUG)) wm_operator_register(C, op); else WM_operator_free(op); @@ -320,12 +337,32 @@ static wmOperator *wm_operator_create(wmWindowManager *wm, wmOperatorType *ot, P BKE_reports_init(op->reports, RPT_STORE); } + /* recursive filling of operator macro list */ + if(ot->macro.first) { + static wmOperator *motherop= NULL; + wmOperatorTypeMacro *otmacro; + + /* ensure all ops are in execution order in 1 list */ + if(motherop==NULL) + motherop= op; + + for(otmacro= ot->macro.first; otmacro; otmacro= otmacro->next) { + wmOperatorType *otm= WM_operatortype_find(otmacro->idname, 0); + wmOperator *opm= wm_operator_create(wm, otm, otmacro->ptr, NULL); + + BLI_addtail(&motherop->macro, opm); + opm->opm= motherop; /* pointer to mom, for modal() */ + } + + motherop= NULL; + } + return op; } static void wm_operator_print(wmOperator *op) { - char *buf = WM_operator_pystring(op); + char *buf = WM_operator_pystring(op->type, op->ptr, 1); printf("%s\n", buf); MEM_freeN(buf); } @@ -345,7 +382,7 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P wmWindowManager *wm= CTX_wm_manager(C); int retval= OPERATOR_PASS_THROUGH; - if(ot->poll==NULL || ot->poll(C)) { + if(wm_operator_poll(C, ot)) { wmOperator *op= wm_operator_create(wm, ot, properties, NULL); if((G.f & G_DEBUG) && event && event->type!=MOUSEMOVE) @@ -373,7 +410,7 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P if(ot->flag & OPTYPE_UNDO) ED_undo_push_op(C, op); - if(ot->flag & OPTYPE_REGISTER) + if((ot->flag & OPTYPE_REGISTER) || (G.f & G_DEBUG)) wm_operator_register(C, op); else WM_operator_free(op); @@ -451,7 +488,7 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe CTX_wm_region_set(C, NULL); CTX_wm_area_set(C, NULL); - retval= wm_operator_invoke(C, ot, window->eventstate, properties); + retval= wm_operator_invoke(C, ot, event, properties); CTX_wm_region_set(C, ar); CTX_wm_area_set(C, area); @@ -513,8 +550,12 @@ static void wm_handler_op_context(bContext *C, wmEventHandler *handler) for(sa= screen->areabase.first; sa; sa= sa->next) if(sa==handler->op_area) break; - if(sa==NULL) - printf("internal error: handler (%s) has invalid area\n", handler->op->type->idname); + if(sa==NULL) { + /* when changing screen layouts with running modal handlers (like render display), this + is not an error to print */ + if(handler->op==NULL) + printf("internal error: handler (%s) has invalid area\n", handler->op->type->idname); + } else { ARegion *ar; CTX_wm_area_set(C, sa); @@ -622,6 +663,8 @@ static int wm_eventmatch(wmEvent *winevent, wmKeymapItem *kmi) { int kmitype= wm_userdef_event_map(kmi->type); + if(kmi->inactive) return 0; + /* the matching rules */ if(kmitype==KM_TEXTINPUT) if(ISKEYBOARD(winevent->type)) return 1; @@ -663,7 +706,6 @@ static void wm_event_modalkeymap(wmOperator *op, wmEvent *event) event->type= EVT_MODAL_MAP; event->val= kmi->propvalue; - printf("found modal event %s %d\n", kmi->idname, kmi->propvalue); } } } @@ -714,7 +756,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand if(ot->flag & OPTYPE_UNDO) ED_undo_push_op(C, op); - if(ot->flag & OPTYPE_REGISTER) + if((ot->flag & OPTYPE_REGISTER) || (G.f & G_DEBUG)) wm_operator_register(C, op); else WM_operator_free(op); @@ -804,7 +846,6 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa case EVT_FILESELECT_OPEN: case EVT_FILESELECT_FULL_OPEN: { - short flag =0; short display =FILE_SHORTDISPLAY; short filter =0; short sort =FILE_SORT_ALPHA; char *dir= NULL; char *path= RNA_string_get_alloc(handler->op->ptr, "filename", NULL, 0); if(event->val==EVT_FILESELECT_OPEN) @@ -815,18 +856,8 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa /* settings for filebrowser, sfile is not operator owner but sends events */ sfile= (SpaceFile*)CTX_wm_space_data(C); sfile->op= handler->op; - - /* XXX for now take the settings from the existing (previous) filebrowser - should be stored in settings and passed via the operator */ - if (sfile->params) { - flag = sfile->params->flag; - filter = sfile->params->filter; - display = sfile->params->display; - sort = sfile->params->sort; - dir = sfile->params->dir; - } - ED_fileselect_set_params(sfile, handler->op->type->name, dir, path, flag, display, filter, sort); + ED_fileselect_set_params(sfile); dir = NULL; MEM_freeN(path); @@ -890,10 +921,22 @@ static int handler_boundbox_test(wmEventHandler *handler, wmEvent *event) if(handler->bblocal) { rcti rect= *handler->bblocal; BLI_translate_rcti(&rect, handler->bbwin->xmin, handler->bbwin->ymin); - return BLI_in_rcti(&rect, event->x, event->y); + + if(BLI_in_rcti(&rect, event->x, event->y)) + return 1; + else if(event->type==MOUSEMOVE && BLI_in_rcti(&rect, event->prevx, event->prevy)) + return 1; + else + return 0; + } + else { + if(BLI_in_rcti(handler->bbwin, event->x, event->y)) + return 1; + else if(event->type==MOUSEMOVE && BLI_in_rcti(handler->bbwin, event->prevx, event->prevy)) + return 1; + else + return 0; } - else - return BLI_in_rcti(handler->bbwin, event->x, event->y); } return 1; } @@ -1191,7 +1234,17 @@ void WM_event_set_handler_flag(wmEventHandler *handler, int flag) wmEventHandler *WM_event_add_modal_handler(bContext *C, ListBase *handlers, wmOperator *op) { wmEventHandler *handler= MEM_callocN(sizeof(wmEventHandler), "event modal handler"); - handler->op= op; + + /* operator was part of macro */ + if(op->opm) { + /* give the mother macro to the handler */ + handler->op= op->opm; + /* mother macro opm becomes the macro element */ + handler->op->opm= op; + } + else + handler->op= op; + handler->op_area= CTX_wm_area(C); /* means frozen screen context for modal handlers! */ handler->op_region= CTX_wm_region(C); diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 51389ef890c..ffaa315f04e 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -539,7 +539,7 @@ static void do_history(char *name, ReportList *reports) BKE_report(reports, RPT_ERROR, "Unable to make version backup"); } -void WM_write_file(bContext *C, char *target, ReportList *reports) +void WM_write_file(bContext *C, char *target, int compress, ReportList *reports) { Library *li; int writeflags, len; @@ -554,8 +554,6 @@ void WM_write_file(bContext *C, char *target, ReportList *reports) } /* send the OnSave event */ -// XXX if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript(&CTX_data_scene(C)->id, SCRIPT_ONSAVE); - for (li= G.main->library.first; li; li= li->id.next) { if (BLI_streq(li->name, target)) { BKE_report(reports, RPT_ERROR, "Cannot overwrite used library"); @@ -582,10 +580,11 @@ void WM_write_file(bContext *C, char *target, ReportList *reports) do_history(di, reports); - /* we use the UserDef to define compression flag */ - writeflags= G.fileflags & ~G_FILE_COMPRESS; - if(U.flag & USER_FILECOMPRESS) - writeflags |= G_FILE_COMPRESS; + writeflags= G.fileflags; + + /* set compression flag */ + if(compress) writeflags |= G_FILE_COMPRESS; + else writeflags &= ~G_FILE_COMPRESS; if (BLO_write_file(CTX_data_main(C), di, writeflags, reports)) { strcpy(G.sce, di); @@ -593,6 +592,9 @@ void WM_write_file(bContext *C, char *target, ReportList *reports) strcpy(G.main->name, di); /* is guaranteed current file */ G.save_over = 1; /* disable untitled.blend convention */ + + if(compress) G.fileflags |= G_FILE_COMPRESS; + else G.fileflags &= ~G_FILE_COMPRESS; writeBlog(); } @@ -603,11 +605,17 @@ void WM_write_file(bContext *C, char *target, ReportList *reports) /* operator entry */ int WM_write_homefile(bContext *C, wmOperator *op) { + wmWindow *win= CTX_wm_window(C); char tstr[FILE_MAXDIR+FILE_MAXFILE]; int write_flags; + /* check current window and close it if temp */ + if(win->screen->full == SCREENTEMP) { + wm_window_close(C, win); + } + BLI_make_file_string("/", tstr, BLI_gethome(), ".B25.blend"); - + /* force save as regular blend file */ write_flags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_LOCK | G_FILE_SIGN); diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 3d8efc018c4..7179efb186d 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -178,6 +178,7 @@ extern wchar_t *copybufinfo; // XXX copy/paste buffer stuff... extern void free_anim_copybuf(); +extern void free_posebuf(); /* called in creator.c even... tsk, split this! */ void WM_exit(bContext *C) @@ -231,6 +232,7 @@ void WM_exit(bContext *C) free_blender(); /* blender.c, does entire library and spacetypes */ // free_matcopybuf(); free_anim_copybuf(); + free_posebuf(); // free_vertexpaint(); // free_imagepaint(); @@ -239,7 +241,7 @@ void WM_exit(bContext *C) BLF_exit(); RE_FreeAllRender(); - RE_engines_free(); + RE_engines_exit(); // free_txt_data(); @@ -272,6 +274,8 @@ void WM_exit(bContext *C) RNA_exit(); + wm_ghost_exit(); + CTX_free(C); if(MEM_get_memory_blocks_in_use()!=0) { diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 6dd150a3416..0fd658dbb64 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -252,29 +252,38 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve) } } +/* stop job, free data completely */ +static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *steve) +{ + if(steve->running) { + /* signal job to end */ + steve->stop= 1; + BLI_end_threads(&steve->threads); + } + + if(steve->wt) + WM_event_remove_window_timer(steve->win, steve->wt); + if(steve->customdata) + steve->free(steve->customdata); + if(steve->run_customdata) + steve->run_free(steve->run_customdata); + + /* remove steve */ + BLI_remlink(&wm->jobs, steve); + MEM_freeN(steve); + +} + void WM_jobs_stop_all(wmWindowManager *wm) { - wmJob *steve= wm->jobs.first; + wmJob *steve; - for(; steve; steve= steve->next) { - if(steve->running) { - /* signal job to end */ - steve->stop= 1; - BLI_end_threads(&steve->threads); - } - - if(steve->wt) - WM_event_remove_window_timer(steve->win, steve->wt); - if(steve->customdata) - steve->free(steve->customdata); - if(steve->run_customdata) - steve->run_free(steve->run_customdata); - } + while((steve= wm->jobs.first)) + wm_jobs_kill_job(wm, steve); - BLI_freelistN(&wm->jobs); } -/* stops job(s) from this owner */ +/* signal job(s) from this owner to stop, timer is required to get handled */ void WM_jobs_stop(wmWindowManager *wm, void *owner) { wmJob *steve; @@ -285,6 +294,19 @@ void WM_jobs_stop(wmWindowManager *wm, void *owner) steve->stop= 1; } +/* kill job entirely, also removes timer itself */ +void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt) +{ + wmJob *steve; + + for(steve= wm->jobs.first; steve; steve= steve->next) { + if(steve->wt==wt) { + wm_jobs_kill_job(wm, steve); + return; + } + } +} + /* hardcoded to event TIMERJOBS */ static int wm_jobs_timer(bContext *C, wmOperator *op, wmEvent *evt) { diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 764b209d755..ad0dd786791 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -65,6 +65,8 @@ static void keymap_event_set(wmKeymapItem *kmi, short type, short val, int modif } else { + kmi->shift= kmi->ctrl= kmi->alt= kmi->oskey= 0; + /* defines? */ if(modifier & KM_SHIFT) kmi->shift= 1; @@ -232,7 +234,7 @@ static char *wm_keymap_item_to_string(wmKeymapItem *kmi, char *str, int len) strcat(buf, "Alt "); if(kmi->oskey) - strcat(buf, "OS "); + strcat(buf, "Cmd "); strcat(buf, WM_key_event_string(kmi->type)); BLI_strncpy(str, buf, len); @@ -240,7 +242,7 @@ static char *wm_keymap_item_to_string(wmKeymapItem *kmi, char *str, int len) return str; } -static char *wm_keymap_item_find(ListBase *handlers, const char *opname, int opcontext, IDProperty *properties, char *str, int len) +static wmKeymapItem *wm_keymap_item_find_handlers(ListBase *handlers, const char *opname, int opcontext, IDProperty *properties) { wmEventHandler *handler; wmKeymapItem *kmi; @@ -251,42 +253,73 @@ static char *wm_keymap_item_find(ListBase *handlers, const char *opname, int opc for(kmi=handler->keymap->first; kmi; kmi=kmi->next) if(strcmp(kmi->idname, opname) == 0 && WM_key_event_string(kmi->type)[0]) if(kmi->ptr && IDP_EqualsProperties(properties, kmi->ptr->data)) - return wm_keymap_item_to_string(kmi, str, len); + return kmi; return NULL; } -char *WM_key_event_operator_string(const bContext *C, const char *opname, int opcontext, IDProperty *properties, char *str, int len) +static wmKeymapItem *wm_keymap_item_find(const bContext *C, const char *opname, int opcontext, IDProperty *properties) { - char *found= NULL; + wmKeymapItem *found= NULL; /* look into multiple handler lists to find the item */ if(CTX_wm_window(C)) - if((found= wm_keymap_item_find(&CTX_wm_window(C)->handlers, opname, opcontext, properties, str, len))) - return found; - - if(CTX_wm_area(C)) - if((found= wm_keymap_item_find(&CTX_wm_area(C)->handlers, opname, opcontext, properties, str, len))) - return found; - - if(ELEM(opcontext, WM_OP_EXEC_REGION_WIN, WM_OP_INVOKE_REGION_WIN)) { - if(CTX_wm_area(C)) { - ARegion *ar= CTX_wm_area(C)->regionbase.first; - for(; ar; ar= ar->next) - if(ar->regiontype==RGN_TYPE_WINDOW) - break; - - if(ar) - if((found= wm_keymap_item_find(&ar->handlers, opname, opcontext, properties, str, len))) - return found; + found= wm_keymap_item_find_handlers(&CTX_wm_window(C)->handlers, opname, opcontext, properties); + + + if(CTX_wm_area(C) && found==NULL) + found= wm_keymap_item_find_handlers(&CTX_wm_area(C)->handlers, opname, opcontext, properties); + + if(found==NULL) { + if(ELEM(opcontext, WM_OP_EXEC_REGION_WIN, WM_OP_INVOKE_REGION_WIN)) { + if(CTX_wm_area(C)) { + ARegion *ar= CTX_wm_area(C)->regionbase.first; + for(; ar; ar= ar->next) + if(ar->regiontype==RGN_TYPE_WINDOW) + break; + + if(ar) + found= wm_keymap_item_find_handlers(&ar->handlers, opname, opcontext, properties); + } + } + else { + if(CTX_wm_region(C)) + found= wm_keymap_item_find_handlers(&CTX_wm_region(C)->handlers, opname, opcontext, properties); } } - else { - if(CTX_wm_region(C)) - if((found= wm_keymap_item_find(&CTX_wm_region(C)->handlers, opname, opcontext, properties, str, len))) - return found; + + return found; +} + +char *WM_key_event_operator_string(const bContext *C, const char *opname, int opcontext, IDProperty *properties, char *str, int len) +{ + wmKeymapItem *found= wm_keymap_item_find(C, opname, opcontext, properties); + + if(found) { + wm_keymap_item_to_string(found, str, len); + return str; } return NULL; } +/* searches context and changes keymap item, if found */ +void WM_key_event_operator_change(const bContext *C, const char *opname, int opcontext, IDProperty *properties, short key, short modifier) +{ + wmKeymapItem *found= wm_keymap_item_find(C, opname, opcontext, properties); + + if(found) { + keymap_event_set(found, key, KM_PRESS, modifier, 0); + } +} + +/* ********************* */ + +int WM_key_event_is_tweak(short type) +{ + if(type>=EVT_TWEAK_L && type<=EVT_GESTURE) + return 1; + return 0; +} + + diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 5e60207f62d..41613d0ab78 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -137,7 +137,7 @@ void WM_operatortype_append(void (*opfunc)(wmOperatorType*)) ot->name= dummy_name; } - RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:""); // XXX All ops should have a description but for now allow them not to. + RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:"(undocumented operator)"); // XXX All ops should have a description but for now allow them not to. RNA_def_struct_identifier(ot->srna, ot->idname); BLI_addtail(&global_ops, ot); } @@ -149,11 +149,139 @@ void WM_operatortype_append_ptr(void (*opfunc)(wmOperatorType*, void*), void *us ot= MEM_callocN(sizeof(wmOperatorType), "operatortype"); ot->srna= RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties"); opfunc(ot, userdata); - RNA_def_struct_ui_text(ot->srna, ot->name, "DOC_BROKEN"); /* TODO - add a discription to wmOperatorType? */ + RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:"(undocumented operator)"); RNA_def_struct_identifier(ot->srna, ot->idname); BLI_addtail(&global_ops, ot); } +/* ********************* macro operator ******************** */ + +/* macro exec only runs exec calls */ +static int wm_macro_exec(bContext *C, wmOperator *op) +{ + wmOperator *opm; + int retval= OPERATOR_FINISHED; + +// printf("macro exec %s\n", op->type->idname); + + for(opm= op->macro.first; opm; opm= opm->next) { + + if(opm->type->exec) { +// printf("macro exec %s\n", opm->type->idname); + retval= opm->type->exec(C, opm); + + if(!(retval & OPERATOR_FINISHED)) + break; + } + } +// if(opm) +// printf("macro ended not finished\n"); +// else +// printf("macro end\n"); + + return retval; +} + +static int wm_macro_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + wmOperator *opm; + int retval= OPERATOR_FINISHED; + +// printf("macro invoke %s\n", op->type->idname); + + for(opm= op->macro.first; opm; opm= opm->next) { + + if(opm->type->invoke) + retval= opm->type->invoke(C, opm, event); + else if(opm->type->exec) + retval= opm->type->exec(C, opm); + + if(!(retval & OPERATOR_FINISHED)) + break; + } + +// if(opm) +// printf("macro ended not finished\n"); +// else +// printf("macro end\n"); + + + return retval; +} + +static int wm_macro_modal(bContext *C, wmOperator *op, wmEvent *event) +{ +// printf("macro modal %s\n", op->type->idname); + + if(op->opm==NULL) + printf("macro error, calling NULL modal()\n"); + else { +// printf("macro modal %s\n", op->opm->type->idname); + return op->opm->type->modal(C, op->opm, event); + } + + return OPERATOR_FINISHED; +} + +/* Names have to be static for now */ +wmOperatorType *WM_operatortype_append_macro(char *idname, char *name, int flag) +{ + wmOperatorType *ot; + + if(WM_operatortype_exists(idname)) { + printf("Macro error: operator %s exists\n", idname); + return NULL; + } + + ot= MEM_callocN(sizeof(wmOperatorType), "operatortype"); + ot->srna= RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties"); + + ot->idname= idname; + ot->name= name; + ot->flag= OPTYPE_MACRO | flag; + + ot->exec= wm_macro_exec; + ot->invoke= wm_macro_invoke; + ot->modal= wm_macro_modal; + ot->poll= NULL; + + RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description:"(undocumented operator)"); // XXX All ops should have a description but for now allow them not to. + RNA_def_struct_identifier(ot->srna, ot->idname); + + BLI_addtail(&global_ops, ot); + + return ot; +} + +wmOperatorTypeMacro *WM_operatortype_macro_define(wmOperatorType *ot, const char *idname) +{ + wmOperatorTypeMacro *otmacro= MEM_callocN(sizeof(wmOperatorTypeMacro), "wmOperatorTypeMacro"); + + BLI_strncpy(otmacro->idname, idname, OP_MAX_TYPENAME); + + /* do this on first use, since operatordefinitions might have been not done yet */ +// otmacro->ptr= MEM_callocN(sizeof(PointerRNA), "optype macro ItemPtr"); +// WM_operator_properties_create(otmacro->ptr, idname); + + BLI_addtail(&ot->macro, otmacro); + + return otmacro; +} + +static void wm_operatortype_free_macro(wmOperatorType *ot) +{ + wmOperatorTypeMacro *otmacro; + + for(otmacro= ot->macro.first; otmacro; otmacro= otmacro->next) { + if(otmacro->ptr) { + WM_operator_properties_free(otmacro->ptr); + MEM_freeN(otmacro->ptr); + } + } + BLI_freelistN(&ot->macro); +} + + int WM_operatortype_remove(const char *idname) { wmOperatorType *ot = WM_operatortype_find(idname, 0); @@ -163,6 +291,10 @@ int WM_operatortype_remove(const char *idname) BLI_remlink(&global_ops, ot); RNA_struct_free(&BLENDER_RNA, ot->srna); + + if(ot->macro.first) + wm_operatortype_free_macro(ot); + MEM_freeN(ot); return 1; @@ -208,8 +340,12 @@ void WM_operator_bl_idname(char *to, const char *from) } /* print a string representation of the operator, with the args that it runs - * so python can run it again */ -char *WM_operator_pystring(wmOperator *op) + * so python can run it again, + * + * When calling from an existing wmOperator do. + * WM_operator_pystring(op->type, op->ptr); + */ +char *WM_operator_pystring(wmOperatorType *ot, PointerRNA *opptr, int all_args) { const char *arg_name= NULL; char idname_py[OP_MAX_TYPENAME]; @@ -219,28 +355,61 @@ char *WM_operator_pystring(wmOperator *op) /* for building the string */ DynStr *dynstr= BLI_dynstr_new(); char *cstring, *buf; - int first_iter=1; + int first_iter=1, ok= 1; + + + /* only to get the orginal props for comparisons */ + PointerRNA opptr_default; + PropertyRNA *prop_default; + char *buf_default; + if(!all_args) { + WM_operator_properties_create(&opptr_default, ot->idname); + } + - WM_operator_py_idname(idname_py, op->idname); + WM_operator_py_idname(idname_py, ot->idname); BLI_dynstr_appendf(dynstr, "bpy.ops.%s(", idname_py); - iterprop= RNA_struct_iterator_property(op->ptr->type); + iterprop= RNA_struct_iterator_property(opptr->type); - RNA_PROP_BEGIN(op->ptr, propptr, iterprop) { + RNA_PROP_BEGIN(opptr, propptr, iterprop) { prop= propptr.data; arg_name= RNA_property_identifier(prop); if (strcmp(arg_name, "rna_type")==0) continue; - buf= RNA_property_as_string(op->ptr, prop); + buf= RNA_property_as_string(opptr, prop); - BLI_dynstr_appendf(dynstr, first_iter?"%s=%s":", %s=%s", arg_name, buf); + ok= 1; + + if(!all_args) { + /* not verbose, so only add in attributes that use non-default values + * slow but good for tooltips */ + prop_default= RNA_struct_find_property(&opptr_default, arg_name); + + if(prop_default) { + buf_default= RNA_property_as_string(&opptr_default, prop_default); + + if(strcmp(buf, buf_default)==0) + ok= 0; /* values match, dont bother printing */ + + MEM_freeN(buf_default); + } + + } + if(ok) { + BLI_dynstr_appendf(dynstr, first_iter?"%s=%s":", %s=%s", arg_name, buf); + first_iter = 0; + } MEM_freeN(buf); - first_iter = 0; + } RNA_PROP_END; + if(all_args==0) + WM_operator_properties_free(&opptr_default); + BLI_dynstr_append(dynstr, ")"); cstring = BLI_dynstr_get_cstring(dynstr); @@ -320,6 +489,21 @@ int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *event) } } +/* default properties for fileselect */ +void WM_operator_properties_filesel(wmOperatorType *ot, int filter) +{ + RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "Path to file."); + + RNA_def_boolean(ot->srna, "filter_blender", (filter & BLENDERFILE), "Filter .blend files", ""); + RNA_def_boolean(ot->srna, "filter_image", (filter & IMAGEFILE), "Filter image files", ""); + RNA_def_boolean(ot->srna, "filter_movie", (filter & MOVIEFILE), "Filter movie files", ""); + RNA_def_boolean(ot->srna, "filter_python", (filter & PYSCRIPTFILE), "Filter python files", ""); + RNA_def_boolean(ot->srna, "filter_font", (filter & FTFONTFILE), "Filter font files", ""); + RNA_def_boolean(ot->srna, "filter_sound", (filter & SOUNDFILE), "Filter sound files", ""); + RNA_def_boolean(ot->srna, "filter_text", (filter & TEXTFILE), "Filter text files", ""); + RNA_def_boolean(ot->srna, "filter_folder", (filter & FOLDERFILE), "Filter folders", ""); +} + /* op->poll */ int WM_operator_winactive(bContext *C) { @@ -333,7 +517,7 @@ static void redo_cb(bContext *C, void *arg_op, void *arg2) wmOperator *lastop= arg_op; if(lastop) { - ED_undo_pop(C); + ED_undo_pop_op(C, lastop); WM_operator_repeat(C, lastop); } } @@ -521,6 +705,14 @@ static int wm_search_menu_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_CANCELLED; } +/* op->poll */ +int wm_search_menu_poll(bContext *C) +{ + if(CTX_wm_window(C)==NULL) return 0; + if(CTX_wm_area(C) && CTX_wm_area(C)->spacetype==SPACE_CONSOLE) return 0; // XXX - so we can use the shortcut in the console + return 1; +} + static void WM_OT_search_menu(wmOperatorType *ot) { ot->name= "Search Menu"; @@ -528,7 +720,7 @@ static void WM_OT_search_menu(wmOperatorType *ot) ot->invoke= wm_search_menu_invoke; ot->exec= wm_search_menu_exec; - ot->poll= WM_operator_winactive; + ot->poll= wm_search_menu_poll; } @@ -571,7 +763,7 @@ static void WM_OT_read_homefile(wmOperatorType *ot) static int recentfile_exec(bContext *C, wmOperator *op) { - int event= RNA_int_get(op->ptr, "nr"); + int event= RNA_enum_get(op->ptr, "file"); // XXX wm in context is not set correctly after WM_read_file -> crash // do it before for now, but is this correct with multiple windows? @@ -594,30 +786,54 @@ static int recentfile_exec(bContext *C, wmOperator *op) static int wm_recentfile_invoke(bContext *C, wmOperator *op, wmEvent *event) { - struct RecentFile *recent; uiPopupMenu *pup; uiLayout *layout; - int i, ofs= 0; pup= uiPupMenuBegin(C, "Open Recent", 0); layout= uiPupMenuLayout(pup); + uiItemsEnumO(layout, op->type->idname, "file"); + uiPupMenuEnd(C, pup); + + return OPERATOR_CANCELLED; +} + +static EnumPropertyItem *open_recentfile_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + EnumPropertyItem tmp = {0, "", 0, "", ""}; + EnumPropertyItem *item= NULL; + struct RecentFile *recent; + int totitem= 0, i, ofs= 0; if(G.sce[0]) { - uiItemIntO(layout, G.sce, 0, op->type->idname, "nr", 1); + tmp.value= 1; + tmp.identifier= G.sce; + tmp.name= G.sce; + RNA_enum_item_add(&item, &totitem, &tmp); ofs = 1; } - - for(recent = G.recent_files.first, i=0; (i<U.recent_files) && (recent); recent = recent->next, i++) - if(strcmp(recent->filename, G.sce)) - uiItemIntO(layout, recent->filename, 0, op->type->idname, "nr", i+ofs+1); - uiPupMenuEnd(C, pup); - - return OPERATOR_CANCELLED; + /* dynamically construct enum */ + for(recent = G.recent_files.first, i=0; (i<U.recent_files) && (recent); recent = recent->next, i++) { + if(strcmp(recent->filename, G.sce)) { + tmp.value= i+ofs+1; + tmp.identifier= recent->filename; + tmp.name= recent->filename; + RNA_enum_item_add(&item, &totitem, &tmp); + } + } + + RNA_enum_item_end(&item, &totitem); + *free= 1; + + return item; } static void WM_OT_open_recentfile(wmOperatorType *ot) { + PropertyRNA *prop; + static EnumPropertyItem file_items[]= { + {0, NULL, 0, NULL, NULL}}; + ot->name= "Open Recent File"; ot->idname= "WM_OT_open_recentfile"; @@ -625,7 +841,8 @@ static void WM_OT_open_recentfile(wmOperatorType *ot) ot->exec= recentfile_exec; ot->poll= WM_operator_winactive; - RNA_def_property(ot->srna, "nr", PROP_INT, PROP_UNSIGNED); + prop= RNA_def_enum(ot->srna, "file", file_items, 1, "File", ""); + RNA_def_enum_funcs(prop, open_recentfile_itemf); } /* ********* main file *********** */ @@ -645,7 +862,6 @@ static void untitled(char *name) static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) { - RNA_string_set(op->ptr, "filename", G.sce); WM_event_add_fileselect(C, op); @@ -675,15 +891,57 @@ static void WM_OT_open_mainfile(wmOperatorType *ot) ot->exec= wm_open_mainfile_exec; ot->poll= WM_operator_winactive; - ot->flag= 0; + WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE); +} + +static int wm_recover_last_session_exec(bContext *C, wmOperator *op) +{ + char scestr[FILE_MAX], filename[FILE_MAX]; + int save_over; + + /* back up some values */ + BLI_strncpy(scestr, G.sce, sizeof(scestr)); + save_over = G.save_over; + + // XXX wm in context is not set correctly after WM_read_file -> crash + // do it before for now, but is this correct with multiple windows? + WM_event_add_notifier(C, NC_WINDOW, NULL); + + /* load file */ + BLI_make_file_string("/", filename, btempdir, "quit.blend"); + WM_read_file(C, filename, op->reports); + + /* restore */ + G.save_over = save_over; + BLI_strncpy(G.sce, scestr, sizeof(G.sce)); + + return 0; +} + +static void WM_OT_recover_last_session(wmOperatorType *ot) +{ + ot->name= "Recover Last Session"; + ot->idname= "WM_OT_recover_last_session"; - RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); + ot->exec= wm_recover_last_session_exec; + ot->poll= WM_operator_winactive; +} +static void save_set_compress(wmOperator *op) +{ + if(!RNA_property_is_set(op->ptr, "compress")) { + if(G.save_over) /* keep flag for existing file */ + RNA_boolean_set(op->ptr, "compress", G.fileflags & G_FILE_COMPRESS); + else /* use userdef for new file */ + RNA_boolean_set(op->ptr, "compress", U.flag & USER_FILECOMPRESS); + } } static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) { char name[FILE_MAX]; + + save_set_compress(op); BLI_strncpy(name, G.sce, FILE_MAX); untitled(name); @@ -698,6 +956,10 @@ static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *even static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) { char filename[FILE_MAX]; + int compress; + + save_set_compress(op); + compress= RNA_boolean_get(op->ptr, "compress"); if(RNA_property_is_set(op->ptr, "filename")) RNA_string_get(op->ptr, "filename", filename); @@ -705,7 +967,8 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op) BLI_strncpy(filename, G.sce, FILE_MAX); untitled(filename); } - WM_write_file(C, filename, op->reports); + + WM_write_file(C, filename, compress, op->reports); WM_event_add_notifier(C, NC_WM|ND_FILESAVE, NULL); @@ -721,10 +984,8 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot) ot->exec= wm_save_as_mainfile_exec; ot->poll= WM_operator_winactive; - ot->flag= 0; - - RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); - + WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE); + RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file."); } /* *************** Save file directly ******** */ @@ -732,6 +993,8 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot) static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event) { char name[FILE_MAX]; + + save_set_compress(op); BLI_strncpy(name, G.sce, FILE_MAX); untitled(name); @@ -750,10 +1013,8 @@ static void WM_OT_save_mainfile(wmOperatorType *ot) ot->exec= wm_save_as_mainfile_exec; ot->poll= WM_operator_winactive; - ot->flag= 0; - - RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH); - + WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE); + RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file."); } @@ -836,7 +1097,7 @@ void WM_paint_cursor_end(wmWindowManager *wm, void *handle) It stores 4 values (xmin, xmax, ymin, ymax) and event it ended with (event_type) */ -static int border_apply(bContext *C, wmOperator *op, int event_type) +static int border_apply(bContext *C, wmOperator *op, int event_type, int event_orig) { wmGesture *gesture= op->customdata; rcti *rect= gesture->customdata; @@ -854,9 +1115,14 @@ static int border_apply(bContext *C, wmOperator *op, int event_type) RNA_int_set(op->ptr, "ymin", rect->ymin); RNA_int_set(op->ptr, "xmax", rect->xmax); RNA_int_set(op->ptr, "ymax", rect->ymax); - if( RNA_struct_find_property(op->ptr, "event_type") ) - RNA_int_set(op->ptr, "event_type", event_type); + /* XXX weak; border should be configured for this without reading event types */ + if( RNA_struct_find_property(op->ptr, "event_type") ) { + if(ELEM4(event_orig, EVT_TWEAK_L, EVT_TWEAK_R, EVT_TWEAK_A, EVT_TWEAK_S)) + event_type= LEFTMOUSE; + + RNA_int_set(op->ptr, "event_type", event_type); + } op->type->exec(C, op); return 1; @@ -877,7 +1143,10 @@ static void wm_gesture_end(bContext *C, wmOperator *op) int WM_border_select_invoke(bContext *C, wmOperator *op, wmEvent *event) { - op->customdata= WM_gesture_new(C, event, WM_GESTURE_CROSS_RECT); + if(WM_key_event_is_tweak(event->type)) + op->customdata= WM_gesture_new(C, event, WM_GESTURE_RECT); + else + op->customdata= WM_gesture_new(C, event, WM_GESTURE_CROSS_RECT); /* add modal handler */ WM_event_add_modal_handler(C, &CTX_wm_window(C)->handlers, op); @@ -914,14 +1183,14 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event) case LEFTMOUSE: case MIDDLEMOUSE: case RIGHTMOUSE: - if(event->val==1) { + if(event->val==KM_PRESS) { if(gesture->type==WM_GESTURE_CROSS_RECT && gesture->mode==0) { gesture->mode= 1; wm_gesture_tag_redraw(C); } } else { - if(border_apply(C, op, event->type)) { + if(border_apply(C, op, event->type, gesture->event_type)) { wm_gesture_end(C, op); return OPERATOR_FINISHED; } @@ -1577,6 +1846,12 @@ static void WM_OT_ten_timer(wmOperatorType *ot) /* called on initialize WM_exit() */ void wm_operatortype_free(void) { + wmOperatorType *ot; + + for(ot= global_ops.first; ot; ot= ot->next) + if(ot->macro.first) + wm_operatortype_free_macro(ot); + BLI_freelistN(&global_ops); } @@ -1590,6 +1865,7 @@ void wm_operatortype_init(void) WM_operatortype_append(WM_OT_exit_blender); WM_operatortype_append(WM_OT_open_recentfile); WM_operatortype_append(WM_OT_open_mainfile); + WM_operatortype_append(WM_OT_recover_last_session); WM_operatortype_append(WM_OT_jobs_timer); WM_operatortype_append(WM_OT_save_as_mainfile); WM_operatortype_append(WM_OT_save_mainfile); @@ -1620,7 +1896,7 @@ void wm_window_keymap(wmWindowManager *wm) /* debug/testing */ WM_keymap_verify_item(keymap, "WM_OT_ten_timer", TKEY, KM_PRESS, KM_ALT|KM_CTRL, 0); WM_keymap_verify_item(keymap, "WM_OT_debug_menu", DKEY, KM_PRESS, KM_ALT|KM_CTRL, 0); - WM_keymap_verify_item(keymap, "WM_OT_search_menu", FKEY, KM_PRESS, KM_ALT|KM_CTRL, 0); + WM_keymap_verify_item(keymap, "WM_OT_search_menu", SPACEKEY, KM_PRESS, KM_CTRL, 0); } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 2d320458543..4d80836dd05 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -70,7 +70,7 @@ static int prefsizx= 0, prefsizy= 0, prefstax= 0, prefstay= 0; /* ******** win open & close ************ */ - +/* XXX this one should correctly check for apple top header... */ static void wm_get_screensize(int *width_r, int *height_r) { unsigned int uiwidth; @@ -81,6 +81,44 @@ static void wm_get_screensize(int *width_r, int *height_r) *height_r= uiheight; } +/* keeps offset and size within monitor bounds */ +/* XXX solve dual screen... */ +static void wm_window_check_position(rcti *rect) +{ + int width, height, d; + + wm_get_screensize(&width, &height); + +#ifdef __APPLE__ + height -= 42; +#endif + + if(rect->xmin < 0) { + d= rect->xmin; + rect->xmax -= d; + rect->xmin -= d; + } + if(rect->ymin < 0) { + d= rect->ymin; + rect->ymax -= d; + rect->ymin -= d; + } + if(rect->xmax > width) { + d= rect->xmax - width; + rect->xmax -= d; + rect->xmin -= d; + } + if(rect->ymax > height) { + d= rect->ymax - height; + rect->ymax -= d; + rect->ymin -= d; + } + + if(rect->xmin < 0) rect->xmin= 0; + if(rect->ymin < 0) rect->ymin= 0; +} + + static void wm_ghostwindow_destroy(wmWindow *win) { if(win->ghostwin) { @@ -93,7 +131,7 @@ static void wm_ghostwindow_destroy(wmWindow *win) ED_screen_exit should have been called */ void wm_window_free(bContext *C, wmWindow *win) { - wmTimer *wt; + wmTimer *wt, *wtnext; /* update context */ if(C) { @@ -107,14 +145,20 @@ void wm_window_free(bContext *C, wmWindow *win) CTX_wm_window_set(C, NULL); WM_event_remove_handlers(C, &win->handlers); + + /* end running jobs, a job end also removes its timer */ + for(wt= win->timers.first; wt; wt= wtnext) { + wtnext= wt->next; + if(wt->event_type==TIMERJOBS) + wm_jobs_timer_ended(wm, wt); + } } if(win->eventstate) MEM_freeN(win->eventstate); - for(wt= win->timers.first; wt; wt= wt->next) - if(wt->customdata) - MEM_freeN(wt->customdata); - BLI_freelistN(&win->timers); + /* timer removing, need to call this api function */ + while((wt= win->timers.first)) + WM_event_remove_window_timer(win, wt); wm_event_free_all(win); wm_subwindows_free(win); @@ -174,7 +218,7 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig) } /* this is event from ghost, or exit-blender op */ -static void wm_window_close(bContext *C, wmWindow *win) +void wm_window_close(bContext *C, wmWindow *win) { wmWindowManager *wm= CTX_wm_manager(C); BLI_remlink(&wm->windows, win); @@ -183,35 +227,50 @@ static void wm_window_close(bContext *C, wmWindow *win) ED_screen_exit(C, win, win->screen); wm_window_free(C, win); - if(wm->windows.first==NULL) + /* check remaining windows */ + if(wm->windows.first) { + for(win= wm->windows.first; win; win= win->next) + if(win->screen->full!=SCREENTEMP) + break; + /* in this case we close all */ + if(win==NULL) + WM_exit(C); + } + else WM_exit(C); } void wm_window_title(wmWindowManager *wm, wmWindow *win) { - /* this is set to 1 if you don't have .B.blend open */ - if(G.save_over) { - char *str= MEM_mallocN(strlen(G.sce) + 16, "title"); + /* handle the 'temp' window */ + if(win->screen && win->screen->full==SCREENTEMP) { + GHOST_SetTitle(win->ghostwin, "Blender"); + } + else { - if(wm->file_saved) - sprintf(str, "Blender [%s]", G.sce); + /* this is set to 1 if you don't have .B.blend open */ + if(G.save_over) { + char *str= MEM_mallocN(strlen(G.sce) + 16, "title"); + + if(wm->file_saved) + sprintf(str, "Blender [%s]", G.sce); + else + sprintf(str, "Blender* [%s]", G.sce); + + GHOST_SetTitle(win->ghostwin, str); + + MEM_freeN(str); + } else - sprintf(str, "Blender* [%s]", G.sce); - - GHOST_SetTitle(win->ghostwin, str); - - MEM_freeN(str); - } - else - GHOST_SetTitle(win->ghostwin, "Blender"); + GHOST_SetTitle(win->ghostwin, "Blender"); #ifdef __APPLE__ - if(wm->file_saved) - GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateUnModified); - else - GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateModified); + if(wm->file_saved) + GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateUnModified); + else + GHOST_SetWindowState(win->ghostwin, GHOST_kWindowStateModified); #endif - + } } /* belongs to below */ @@ -334,6 +393,71 @@ wmWindow *WM_window_open(bContext *C, rcti *rect) return win; } +/* uses screen->full tag to define what to do, currently it limits + to only one "temp" window for render out, preferences, filewindow, etc */ +/* type is #define in WM_api.h */ + +void WM_window_open_temp(bContext *C, rcti *position, int type) +{ + wmWindow *win; + ScrArea *sa; + + /* changes rect to fit within desktop */ + wm_window_check_position(position); + + /* test if we have a temp screen already */ + for(win= CTX_wm_manager(C)->windows.first; win; win= win->next) + if(win->screen->full == SCREENTEMP) + break; + + /* add new window? */ + if(win==NULL) { + win= wm_window_new(C); + + win->posx= position->xmin; + win->posy= position->ymin; + } + + win->sizex= position->xmax - position->xmin; + win->sizey= position->ymax - position->ymin; + + if(win->ghostwin) { + wm_window_set_size(win, win->sizex, win->sizey) ; + wm_window_raise(win); + } + + /* add new screen? */ + if(win->screen==NULL) + win->screen= ED_screen_add(win, CTX_data_scene(C), "temp"); + win->screen->full = SCREENTEMP; + + /* make window active, and validate/resize */ + CTX_wm_window_set(C, win); + wm_check(C); + + /* ensure it shows the right spacetype editor */ + sa= win->screen->areabase.first; + CTX_wm_area_set(C, sa); + + if(type==WM_WINDOW_RENDER) { + ED_area_newspace(C, sa, SPACE_IMAGE); + } + else { + ED_area_newspace(C, sa, SPACE_INFO); + } + + ED_screen_set(C, win->screen); + + if(sa->spacetype==SPACE_IMAGE) + GHOST_SetTitle(win->ghostwin, "Blender Render"); + else if(ELEM(sa->spacetype, SPACE_OUTLINER, SPACE_INFO)) + GHOST_SetTitle(win->ghostwin, "Blender User Preferences"); + else if(sa->spacetype==SPACE_FILE) + GHOST_SetTitle(win->ghostwin, "Blender File View"); + else + GHOST_SetTitle(win->ghostwin, "Blender"); +} + /* ****************** Operators ****************** */ @@ -632,6 +756,14 @@ void wm_ghost_init(bContext *C) } } +void wm_ghost_exit(void) +{ + if(g_system) + GHOST_DisposeSystem(g_system); + + g_system= NULL; +} + /* **************** timer ********************** */ /* to (de)activate running timers temporary */ @@ -664,10 +796,12 @@ void WM_event_remove_window_timer(wmWindow *win, wmTimer *timer) { wmTimer *wt; + /* extra security check */ for(wt= win->timers.first; wt; wt= wt->next) if(wt==timer) break; if(wt) { + BLI_remlink(&win->timers, wt); if(wt->customdata) MEM_freeN(wt->customdata); diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h index 36219cf3743..a7529157072 100644 --- a/source/blender/windowmanager/wm.h +++ b/source/blender/windowmanager/wm.h @@ -66,7 +66,7 @@ void wm_gesture_tag_redraw(bContext *C); /* wm_jobs.h */ void WM_OT_jobs_timer(struct wmOperatorType *ot); - +void wm_jobs_timer_ended(wmWindowManager *wm, wmTimer *wt); #endif /* WM_H */ diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h index 6f64cdbde32..3da621bda85 100644 --- a/source/blender/windowmanager/wm_event_types.h +++ b/source/blender/windowmanager/wm_event_types.h @@ -193,6 +193,10 @@ /* only used for KM_TEXTINPUT, so assume that we want all user-inputtable ascii codes included */ #define ISKEYBOARD(event) (event >=' ' && event <=255) +/* test whether event type is acceptable as hotkey, excluding modifiers */ +#define ISHOTKEY(event) (event >=' ' && event <=320 && !(event>=LEFTCTRLKEY && event<=ESCKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY)) + + /* **************** BLENDER GESTURE EVENTS ********************* */ #define EVT_ACTIONZONE_AREA 0x5000 diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h index 45fa9bf6cf7..f159f7f098d 100644 --- a/source/blender/windowmanager/wm_window.h +++ b/source/blender/windowmanager/wm_window.h @@ -33,9 +33,11 @@ struct bScreen; /* *************** internal api ************** */ void wm_ghost_init (bContext *C); +void wm_ghost_exit(void); wmWindow *wm_window_new (bContext *C); void wm_window_free (bContext *C, wmWindow *win); +void wm_window_close (bContext *C, wmWindow *win); void wm_window_title (wmWindowManager *wm, wmWindow *win); void wm_window_add_ghostwindows (wmWindowManager *wm); diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 35cb3e92b21..064681b37ea 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -128,8 +128,11 @@ IF(APPLE) COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/Resources/ COMMAND cp -R ${CMAKE_SOURCE_DIR}/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ COMMAND cp ${CMAKE_SOURCE_DIR}/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/Resources/ - COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ - COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/ui ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ + COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ + COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/ui ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ + COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/io ${TARGETDIR}/blender.app/Contents/MacOS/.blender/ + COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/.blender/python/ + COMMAND unzip -q ${LIBDIR}/release/python.zip -d ${TARGETDIR}/blender.app/Contents/MacOS/.blender/python/ COMMAND find ${TARGETDIR}/blender.app -name CVS -prune -exec rm -rf {} "\;" COMMAND find ${TARGETDIR}/blender.app -name CVS.sandboxinfo -prune -exec rm -rf {} "\;" COMMAND find ${TARGETDIR}/blender.app -name .DS_Store -prune -exec rm -rf {} "\;" @@ -253,6 +256,7 @@ IF(UNIX) bf_converter bf_dummy bf_bullet + bf_smoke bf_common bf_ketsji bf_logic diff --git a/source/creator/creator.c b/source/creator/creator.c index 8e0152b5e63..9034833563b 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -211,7 +211,7 @@ static void print_help(void) printf (" -nojoystick\tDisable joystick support\n"); printf (" -noglsl\tDisable GLSL shading\n"); printf (" -h\t\tPrint this help text\n"); - printf (" -y\t\tDisable automatic python script execution (scriptlinks, pydrivers, pyconstraints, pynodes)\n"); + printf (" -y\t\tDisable automatic python script execution (pydrivers, pyconstraints, pynodes)\n"); printf (" -P <filename>\tRun the given Python script (filename or Blender Text)\n"); #ifdef WIN32 printf (" -R\t\tRegister .blend extension\n"); @@ -313,6 +313,7 @@ int main(int argc, char **argv) BLI_where_am_i(bprogname, argv[0]); RNA_init(); + RE_engines_init(); /* Hack - force inclusion of the plugin api functions, * see blenpluginapi:pluginapi.c @@ -626,14 +627,8 @@ int main(int argc, char **argv) Render *re = RE_NewRender(scene->id.name); frame = MIN2(MAXFRAME, MAX2(1, frame)); -#ifndef DISABLE_PYTHON - if (G.f & G_DOSCRIPTLINKS) - BPY_do_all_scripts(SCRIPT_RENDER, 0); -#endif + RE_BlenderAnim(re, scene, frame, frame, scene->frame_step); -#ifndef DISABLE_PYTHON - BPY_do_all_scripts(SCRIPT_POSTRENDER, 0); -#endif } } else { printf("\nError: no blend loaded. cannot use '-f'.\n"); @@ -643,15 +638,7 @@ int main(int argc, char **argv) if (CTX_data_scene(C)) { Scene *scene= CTX_data_scene(C); Render *re= RE_NewRender(scene->id.name); -#ifndef DISABLE_PYTHON - if (G.f & G_DOSCRIPTLINKS) - BPY_do_all_scripts(SCRIPT_RENDER, 1); -#endif RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->frame_step); -#ifndef DISABLE_PYTHON - if (G.f & G_DOSCRIPTLINKS) - BPY_do_all_scripts(SCRIPT_POSTRENDER, 1); -#endif } else { printf("\nError: no blend loaded. cannot use '-a'.\n"); } diff --git a/source/darwin/Makefile b/source/darwin/Makefile index 35ecc6de8f1..35842b43eae 100644 --- a/source/darwin/Makefile +++ b/source/darwin/Makefile @@ -51,8 +51,11 @@ ifeq ($(APPLICATION), blender) @cp -R $(NANBLENDERHOME)/release/scripts $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/ @echo "---> copying ui scripts" @cp -R $(NANBLENDERHOME)/release/ui $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/ + @echo "---> copying python modules" + @mkdir $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/python + @unzip -q $(LCGDIR)/release/python.zip -d $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/python/ endif - @echo "---> removing SNV directories and Mac hidden files from distribution" + @echo "---> removing SVN directories and Mac hidden files from distribution" @find $(DIR)/bin/$(APPLICATION).app -name CVS -prune -exec rm -rf {} \; @find $(DIR)/bin/$(APPLICATION).app -name .DS_Store -exec rm -f {} \; @find $(DIR)/bin/$(APPLICATION).app -name .svn -prune -exec rm -rf {} \; diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp index 03dd5d07eb0..086c259c4bb 100644 --- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp +++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp @@ -118,11 +118,10 @@ static BlendFileData *load_game_data(char *filename) return bfd; } -extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_framing) +extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int always_use_expand_framing) { /* context values */ struct wmWindow *win= CTX_wm_window(C); - struct ARegion *ar= CTX_wm_region(C); struct Scene *scene= CTX_data_scene(C); struct Main* maggie1= CTX_data_main(C); @@ -405,10 +404,8 @@ extern "C" void StartKetsjiShell(struct bContext *C, int always_use_expand_frami { // convert and add scene sceneconverter->ConvertScene( - startscenename, startscene, dictionaryobject, - keyboarddevice, rendertools, canvas); ketsjiengine->AddScene(startscene); @@ -718,10 +715,8 @@ extern "C" void StartKetsjiShellSimulation(struct wmWindow *win, { // convert and add scene sceneconverter->ConvertScene( - startscenename, startscene, dictionaryobject, - keyboarddevice, rendertools, canvas); ketsjiengine->AddScene(startscene); @@ -787,6 +782,16 @@ extern "C" void StartKetsjiShellSimulation(struct wmWindow *win, delete mousedevice; mousedevice = NULL; } + if (rasterizer) + { + delete rasterizer; + rasterizer = NULL; + } + if (rendertools) + { + delete rendertools; + rendertools = NULL; + } SND_DeviceManager::Unsubscribe(); } while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME); diff --git a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h index 7da4b9efb68..32391e63264 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h @@ -36,6 +36,7 @@ #include <map> #include "wm_event_types.h" +#include "WM_types.h" #include "SCA_IInputDevice.h" diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp index 877a0d39acf..58af94854e6 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp @@ -104,7 +104,7 @@ bool KX_BlenderKeyboardDevice::ConvertBlenderEvent(unsigned short incode,short v { int previousTable = 1-m_currentTable; - if (val > 0) + if (val == KM_PRESS) { if (kxevent == KX_ESCKEY && val != 0 && !m_hookesc) result = true; @@ -138,7 +138,7 @@ bool KX_BlenderKeyboardDevice::ConvertBlenderEvent(unsigned short incode,short v } } - } else + } else if (val == KM_RELEASE) { // blender eventval == 0 switch (m_eventStatusTables[previousTable][kxevent].m_status) diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp index ffff7185fe4..8ed36e860b4 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp @@ -261,6 +261,12 @@ void KX_BlenderRenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmat // couldn't find something to cast the shadow on... glMultMatrixd(oglmatrix); } + else + { // we found the "ground", but the cast matrix doesn't take + // scaling in consideration, so we must apply the object scale + MT_Vector3 size = gameobj->GetSGNode()->GetLocalScale(); + glScalef(size[0], size[1], size[2]); + } } else { @@ -384,5 +390,4 @@ void KX_BlenderRenderTools::Update2DFilter(vector<STR_String>& propNames, void* void KX_BlenderRenderTools::Render2DFilters(RAS_ICanvas* canvas) { m_filtermanager.RenderFilters(canvas); -} - +}
\ No newline at end of file diff --git a/source/gameengine/BlenderRoutines/Makefile b/source/gameengine/BlenderRoutines/Makefile index ffa99a0c1b2..35f498aba92 100644 --- a/source/gameengine/BlenderRoutines/Makefile +++ b/source/gameengine/BlenderRoutines/Makefile @@ -38,7 +38,6 @@ CCFLAGS += $(LEVEL_1_CPP_WARNINGS) CPPFLAGS += -I$(NAN_GLEW)/include CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_MOTO)/include -CPPFLAGS += -I$(NAN_FUZZICS)/include CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include CPPFLAGS += -I$(NAN_GLEW)/include CPPFLAGS += -I$(OPENGL_HEADERS) diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp index bed99a4f502..30055a717e3 100644 --- a/source/gameengine/Converter/BL_ActionActuator.cpp +++ b/source/gameengine/Converter/BL_ActionActuator.cpp @@ -805,6 +805,10 @@ PyObject* BL_ActionActuator::PyGetChannel(PyObject* value) { bPoseChannel *pchan; + if(m_userpose==NULL && m_pose==NULL) { + BL_ArmatureObject *obj = (BL_ArmatureObject*)GetParent(); + obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ + } // get_pose_channel accounts for NULL pose, run on both incase one exists but // the channel doesnt @@ -950,14 +954,18 @@ KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel, obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ if (!m_userpose) { - obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ + if(!m_pose) + obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ game_copy_pose(&m_userpose, m_pose); } - pchan= verify_pose_channel(m_userpose, string); // adds the channel if its not there. + // pchan= verify_pose_channel(m_userpose, string); // adds the channel if its not there. + pchan= get_pose_channel(m_userpose, string); // adds the channel if its not there. - VECCOPY (pchan->loc, matrix[3]); - Mat4ToSize(matrix, pchan->size); - Mat4ToQuat(matrix, pchan->quat); + if(pchan) { + VECCOPY (pchan->loc, matrix[3]); + Mat4ToSize(matrix, pchan->size); + Mat4ToQuat(matrix, pchan->quat); + } } else { MT_Vector3 loc; @@ -969,15 +977,24 @@ KX_PYMETHODDEF_DOC(BL_ActionActuator, setChannel, // same as above if (!m_userpose) { - obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ + if(!m_pose) + obj->GetPose(&m_pose); /* Get the underlying pose from the armature */ game_copy_pose(&m_userpose, m_pose); } - pchan= verify_pose_channel(m_userpose, string); + // pchan= verify_pose_channel(m_userpose, string); + pchan= get_pose_channel(m_userpose, string); // adds the channel if its not there. // for some reason loc.setValue(pchan->loc) fails - pchan->loc[0]= loc[0]; pchan->loc[1]= loc[1]; pchan->loc[2]= loc[2]; - pchan->size[0]= size[0]; pchan->size[1]= size[1]; pchan->size[2]= size[2]; - pchan->quat[0]= quat[3]; pchan->quat[1]= quat[0]; pchan->quat[2]= quat[1]; pchan->quat[3]= quat[2]; /* notice xyzw -> wxyz is intentional */ + if(pchan) { + pchan->loc[0]= loc[0]; pchan->loc[1]= loc[1]; pchan->loc[2]= loc[2]; + pchan->size[0]= size[0]; pchan->size[1]= size[1]; pchan->size[2]= size[2]; + pchan->quat[0]= quat[3]; pchan->quat[1]= quat[0]; pchan->quat[2]= quat[1]; pchan->quat[3]= quat[2]; /* notice xyzw -> wxyz is intentional */ + } + } + + if(pchan==NULL) { + PyErr_SetString(PyExc_ValueError, "Channel could not be found, use the 'channelNames' attribute to get a list of valid channels"); + return NULL; } pchan->flag |= POSE_ROT|POSE_LOC|POSE_SIZE; @@ -1051,6 +1068,7 @@ PyAttributeDef BL_ActionActuator::Attributes[] = { KX_PYATTRIBUTE_FLOAT_RW("frameEnd", 0, MAXFRAMEF, BL_ActionActuator, m_endframe), KX_PYATTRIBUTE_FLOAT_RW("blendIn", 0, MAXFRAMEF, BL_ActionActuator, m_blendin), KX_PYATTRIBUTE_RW_FUNCTION("action", BL_ActionActuator, pyattr_get_action, pyattr_set_action), + KX_PYATTRIBUTE_RO_FUNCTION("channelNames", BL_ActionActuator, pyattr_get_channel_names), KX_PYATTRIBUTE_SHORT_RW("priority", 0, 100, false, BL_ActionActuator, m_priority), KX_PYATTRIBUTE_FLOAT_RW_CHECK("frame", 0, MAXFRAMEF, BL_ActionActuator, m_localtime, CheckFrame), KX_PYATTRIBUTE_STRING_RW("propName", 0, 31, false, BL_ActionActuator, m_propname), @@ -1094,3 +1112,23 @@ int BL_ActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF return PY_SET_ATTR_SUCCESS; } + +PyObject* BL_ActionActuator::pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + BL_ActionActuator* self= static_cast<BL_ActionActuator*>(self_v); + PyObject *ret= PyList_New(0); + PyObject *item; + + bPose *pose= ((BL_ArmatureObject*)self->GetParent())->GetOrigPose(); + + if(pose) { + bPoseChannel *pchan; + for(pchan= (bPoseChannel *)pose->chanbase.first; pchan; pchan= (bPoseChannel *)pchan->next) { + item= PyUnicode_FromString(pchan->name); + PyList_Append(ret, item); + Py_DECREF(item); + } + } + + return ret; +} diff --git a/source/gameengine/Converter/BL_ActionActuator.h b/source/gameengine/Converter/BL_ActionActuator.h index e328ce126ca..6003e23e315 100644 --- a/source/gameengine/Converter/BL_ActionActuator.h +++ b/source/gameengine/Converter/BL_ActionActuator.h @@ -114,7 +114,7 @@ public: static PyObject* pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); - + static PyObject* pyattr_get_channel_names(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); /* attribute check */ static int CheckFrame(void *self, const PyAttributeDef*) { diff --git a/source/gameengine/Converter/BL_ArmatureObject.h b/source/gameengine/Converter/BL_ArmatureObject.h index e1e176840a6..684d89d492b 100644 --- a/source/gameengine/Converter/BL_ArmatureObject.h +++ b/source/gameengine/Converter/BL_ArmatureObject.h @@ -60,6 +60,7 @@ public: void GetMRDPose(struct bPose **pose); void GetPose(struct bPose **pose); void SetPose (struct bPose *pose); + struct bPose *GetOrigPose() {return m_pose;} // never edit this, only for accessing names void ApplyPose(); void RestorePose(); diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 4be6abfe61a..c49e229a76a 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -323,9 +323,7 @@ bool ConvertMaterial( MTFace* tface, const char *tfaceName, MFace* mface, - MCol* mmcol, - int lightlayer, - Object* blenderobj, + MCol* mmcol, MTF_localLayer *layers, bool glslmat) { @@ -559,7 +557,7 @@ bool ConvertMaterial( material->ref = mat->ref; material->amb = mat->amb; - material->ras_mode |= (mat->mode & MA_WIRE)? WIRE: 0; + material->ras_mode |= (mat->material_type == MA_TYPE_WIRE)? WIRE: 0; } else { int valid = 0; @@ -721,12 +719,12 @@ bool ConvertMaterial( return true; } - -RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* rendertools, KX_Scene* scene, KX_BlenderSceneConverter *converter) +/* blenderobj can be NULL, make sure its checked for */ +RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, KX_Scene* scene, KX_BlenderSceneConverter *converter) { RAS_MeshObject *meshobj; bool skinMesh = false; - int lightlayer = blenderobj->lay; + int lightlayer = blenderobj ? blenderobj->lay:(1<<20)-1; // all layers if no object. if ((meshobj = converter->FindGameMesh(mesh/*, ob->lay*/)) != NULL) return meshobj; @@ -749,13 +747,13 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* } // Determine if we need to make a skinned mesh - if (mesh->dvert || mesh->key || ((blenderobj->gameflag & OB_SOFT_BODY) != 0) || BL_ModifierDeformer::HasCompatibleDeformer(blenderobj)) + if (blenderobj && (mesh->dvert || mesh->key || ((blenderobj->gameflag & OB_SOFT_BODY) != 0) || BL_ModifierDeformer::HasCompatibleDeformer(blenderobj))) { - meshobj = new BL_SkinMeshObject(mesh, lightlayer); + meshobj = new BL_SkinMeshObject(mesh); skinMesh = true; } else - meshobj = new RAS_MeshObject(mesh, lightlayer); + meshobj = new RAS_MeshObject(mesh); // Extract avaiable layers MTF_localLayer *layers = new MTF_localLayer[MAX_MTFACE]; @@ -844,9 +842,8 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* tan3 = tangent[f*4 + 3]; } - /* get material */ - ma = give_current_material(blenderobj, mface->mat_nr+1); - + ma = give_current_material(blenderobj, mface->mat_nr+1); + { bool visible = true; bool twoside = false; @@ -860,7 +857,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* if (!bl_mat) bl_mat = new BL_Material(); ConvertMaterial(bl_mat, ma, tface, tfaceName, mface, mcol, - lightlayer, blenderobj, layers, converter->GetGLSLMaterials()); + layers, converter->GetGLSLMaterials()); visible = ((bl_mat->ras_mode & POLY_VIS)!=0); collider = ((bl_mat->ras_mode & COLLIDER)!=0); @@ -883,7 +880,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* if (kx_blmat == NULL) kx_blmat = new KX_BlenderMaterial(); - kx_blmat->Initialize(scene, bl_mat, skinMesh, lightlayer); + kx_blmat->Initialize(scene, bl_mat, skinMesh); polymat = static_cast<RAS_IPolyMaterial*>(kx_blmat); } else { @@ -1039,7 +1036,10 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* layer.face++; } } - meshobj->m_sharedvertex_map.clear(); + // keep meshobj->m_sharedvertex_map for reinstance phys mesh. + // 2.49a and before it did: meshobj->m_sharedvertex_map.clear(); + // but this didnt save much ram. - Campbell + meshobj->EndConversion(); // pre calculate texture generation for(list<RAS_MeshMaterial>::iterator mit = meshobj->GetFirstMaterial(); @@ -1064,8 +1064,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* -static PHY_MaterialProps *CreateMaterialFromBlenderObject(struct Object* blenderobject, - KX_Scene *kxscene) +static PHY_MaterialProps *CreateMaterialFromBlenderObject(struct Object* blenderobject) { PHY_MaterialProps *materialProps = new PHY_MaterialProps; @@ -1098,8 +1097,7 @@ static PHY_MaterialProps *CreateMaterialFromBlenderObject(struct Object* blender return materialProps; } -static PHY_ShapeProps *CreateShapePropsFromBlenderObject(struct Object* blenderobject, - KX_Scene *kxscene) +static PHY_ShapeProps *CreateShapePropsFromBlenderObject(struct Object* blenderobject) { PHY_ShapeProps *shapeProps = new PHY_ShapeProps; @@ -1394,12 +1392,11 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj, PHY_ShapeProps* shapeprops = - CreateShapePropsFromBlenderObject(blenderobject, - kxscene); + CreateShapePropsFromBlenderObject(blenderobject); PHY_MaterialProps* smmaterial = - CreateMaterialFromBlenderObject(blenderobject, kxscene); + CreateMaterialFromBlenderObject(blenderobject); KX_ObjectProperties objprop; objprop.m_lockXaxis = (blenderobject->gameflag2 & OB_LOCK_RIGID_BODY_X_AXIS) !=0; @@ -1683,8 +1680,7 @@ static KX_GameObject *gameobject_from_blenderobject( Object *ob, KX_Scene *kxscene, RAS_IRenderTools *rendertools, - KX_BlenderSceneConverter *converter, - Scene *blenderscene) + KX_BlenderSceneConverter *converter) { KX_GameObject *gameobj = NULL; @@ -1718,7 +1714,7 @@ static KX_GameObject *gameobject_from_blenderobject( Mesh* mesh = static_cast<Mesh*>(ob->data); float center[3], extents[3]; float radius = my_boundbox_mesh((Mesh*) ob->data, center, extents); - RAS_MeshObject* meshobj = BL_ConvertMesh(mesh,ob,rendertools,kxscene,converter); + RAS_MeshObject* meshobj = BL_ConvertMesh(mesh,ob,kxscene,converter); // needed for python scripting kxscene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj); @@ -1744,7 +1740,7 @@ static KX_GameObject *gameobject_from_blenderobject( if (bHasModifier) { BL_ModifierDeformer *dcont = new BL_ModifierDeformer((BL_DeformableGameObject *)gameobj, - blenderscene, ob, (BL_SkinMeshObject *)meshobj); + kxscene->GetBlenderScene(), ob, (BL_SkinMeshObject *)meshobj); ((BL_DeformableGameObject*)gameobj)->SetDeformer(dcont); if (bHasShapeKey && bHasArmature) dcont->LoadShapeDrivers(ob->parent); @@ -1783,7 +1779,7 @@ static KX_GameObject *gameobject_from_blenderobject( kxscene, KX_Scene::m_callbacks, ob, - blenderscene // handle + kxscene->GetBlenderScene() // handle ); /* Get the current pose from the armature object and apply it as the rest pose */ break; @@ -1798,7 +1794,6 @@ static KX_GameObject *gameobject_from_blenderobject( } if (gameobj) { - gameobj->SetPhysicsEnvironment(kxscene->GetPhysicsEnvironment()); gameobj->SetLayer(ob->lay); gameobj->SetBlenderObject(ob); /* set the visibility state based on the objects render option in the outliner */ @@ -1897,12 +1892,10 @@ KX_GameObject* getGameOb(STR_String busc,CListValue* sumolist){ // convert blender objects into ketsji gameobjects void BL_ConvertBlenderObjects(struct Main* maggie, - const STR_String& scenename, KX_Scene* kxscene, KX_KetsjiEngine* ketsjiEngine, e_PhysicsEngine physics_engine, PyObject* pythondictionary, - SCA_IInputDevice* keydev, RAS_IRenderTools* rendertools, RAS_ICanvas* canvas, KX_BlenderSceneConverter* converter, @@ -1910,7 +1903,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, ) { - Scene *blenderscene = converter->GetBlenderSceneForName(scenename); + Scene *blenderscene = kxscene->GetBlenderScene(); // for SETLOOPER Scene *sce; Base *base; @@ -2002,8 +1995,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, base->object, kxscene, rendertools, - converter, - blenderscene); + converter); bool isInActiveLayer = (blenderobject->lay & activeLayerBitInfo) !=0; bool addobj=true; @@ -2192,8 +2184,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, blenderobject, kxscene, rendertools, - converter, - blenderscene); + converter); // this code is copied from above except that // object from groups are never in active layer @@ -2673,7 +2664,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, struct Object* blenderobj = converter->FindBlenderObject(gameobj); int layerMask = (groupobj.find(blenderobj) == groupobj.end()) ? activeLayerBitInfo : 0; bool isInActiveLayer = (blenderobj->lay & layerMask)!=0; - BL_ConvertSensors(blenderobj,gameobj,logicmgr,kxscene,ketsjiEngine,keydev,layerMask,isInActiveLayer,canvas,converter); + BL_ConvertSensors(blenderobj,gameobj,logicmgr,kxscene,ketsjiEngine,layerMask,isInActiveLayer,canvas,converter); // set the init state to all objects gameobj->SetInitState((blenderobj->init_state)?blenderobj->init_state:blenderobj->state); } @@ -2711,4 +2702,3 @@ void BL_ConvertBlenderObjects(struct Main* maggie, RAS_BucketManager *bucketmanager = kxscene->GetBucketManager(); bucketmanager->OptimizeBuckets(distance); } - diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.h b/source/gameengine/Converter/BL_BlenderDataConversion.h index 48f08fb357b..b8f9d1ec4e6 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.h +++ b/source/gameengine/Converter/BL_BlenderDataConversion.h @@ -34,15 +34,13 @@ #include "KX_Python.h" #include "KX_PhysicsEngineEnums.h" -class RAS_MeshObject* BL_ConvertMesh(struct Mesh* mesh,struct Object* lightobj,class RAS_IRenderTools* rendertools,class KX_Scene* scene, class KX_BlenderSceneConverter *converter); +class RAS_MeshObject* BL_ConvertMesh(struct Mesh* mesh,struct Object* lightobj,class KX_Scene* scene, class KX_BlenderSceneConverter *converter); void BL_ConvertBlenderObjects(struct Main* maggie, - const STR_String& scenename, class KX_Scene* kxscene, class KX_KetsjiEngine* ketsjiEngine, e_PhysicsEngine physics_engine, PyObject* pythondictionary, - class SCA_IInputDevice* keydev, class RAS_IRenderTools* rendertools, class RAS_ICanvas* canvas, class KX_BlenderSceneConverter* sceneconverter, diff --git a/source/gameengine/Converter/BL_MeshDeformer.h b/source/gameengine/Converter/BL_MeshDeformer.h index 99ae5f9dea0..289826e45e7 100644 --- a/source/gameengine/Converter/BL_MeshDeformer.h +++ b/source/gameengine/Converter/BL_MeshDeformer.h @@ -68,6 +68,8 @@ public: virtual RAS_Deformer* GetReplica(){return NULL;}; virtual void ProcessReplica(); struct Mesh* GetMesh() { return m_bmesh; }; + virtual class RAS_MeshObject* GetRasMesh() { return (RAS_MeshObject*)m_pMeshObject; }; + virtual float (* GetTransVerts(int *tot))[3] { *tot= m_tvtot; return m_transverts; } // virtual void InitDeform(double time){}; protected: diff --git a/source/gameengine/Converter/BL_SkinMeshObject.cpp b/source/gameengine/Converter/BL_SkinMeshObject.cpp index 0a18296f261..4eb01df410b 100644 --- a/source/gameengine/Converter/BL_SkinMeshObject.cpp +++ b/source/gameengine/Converter/BL_SkinMeshObject.cpp @@ -46,8 +46,8 @@ #include "BL_SkinMeshObject.h" #include "BL_DeformableGameObject.h" -BL_SkinMeshObject::BL_SkinMeshObject(Mesh* mesh, int lightlayer) - : RAS_MeshObject (mesh, lightlayer) +BL_SkinMeshObject::BL_SkinMeshObject(Mesh* mesh) + : RAS_MeshObject (mesh) { m_bDeformed = true; diff --git a/source/gameengine/Converter/BL_SkinMeshObject.h b/source/gameengine/Converter/BL_SkinMeshObject.h index 8544a2b958c..e2d0e37664d 100644 --- a/source/gameengine/Converter/BL_SkinMeshObject.h +++ b/source/gameengine/Converter/BL_SkinMeshObject.h @@ -46,7 +46,7 @@ protected: vector<int> m_cacheWeightIndex; public: - BL_SkinMeshObject(Mesh* mesh, int lightlayer); + BL_SkinMeshObject(Mesh* mesh); ~BL_SkinMeshObject(); void UpdateBuckets(void* clientobj, double* oglmatrix, diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 9e0a710f44f..4df9df75d3d 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -242,15 +242,13 @@ struct BlenderDebugDraw : public btIDebugDraw #endif -void KX_BlenderSceneConverter::ConvertScene(const STR_String& scenename, - class KX_Scene* destinationscene, +void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene, PyObject* dictobj, - class SCA_IInputDevice* keyinputdev, class RAS_IRenderTools* rendertools, class RAS_ICanvas* canvas) { //find out which physics engine - Scene *blenderscene = GetBlenderSceneForName(scenename); + Scene *blenderscene = destinationscene->GetBlenderScene(); e_PhysicsEngine physics_engine = UseBullet; bool useDbvtCulling = false; @@ -331,12 +329,10 @@ void KX_BlenderSceneConverter::ConvertScene(const STR_String& scenename, } BL_ConvertBlenderObjects(m_maggie, - scenename, destinationscene, m_ketsjiEngine, physics_engine, dictobj, - keyinputdev, rendertools, canvas, this, diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.h b/source/gameengine/Converter/KX_BlenderSceneConverter.h index b65f49c2b59..50ce8d61336 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.h +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.h @@ -92,10 +92,8 @@ public: * dictobj: python dictionary (for pythoncontrollers) */ virtual void ConvertScene( - const STR_String& scenename, class KX_Scene* destinationscene, PyObject* dictobj, - class SCA_IInputDevice* keyinputdev, class RAS_IRenderTools* rendertools, class RAS_ICanvas* canvas ); @@ -150,6 +148,9 @@ public: virtual bool GetGLSLMaterials(); struct Scene* GetBlenderSceneForName(const STR_String& name); + + struct Main* GetMain() { return m_maggie; }; + }; #endif //__KX_BLENDERSCENECONVERTER_H diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index ea812a71fdd..c18e4fce8a5 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -629,7 +629,6 @@ void BL_ConvertActuators(char* maggiename, tmpmesh = BL_ConvertMesh( editobact->me, blenderobject, - rendertools, scene, converter ); @@ -638,7 +637,10 @@ void BL_ConvertActuators(char* maggiename, = new KX_SCA_ReplaceMeshActuator( gameobj, tmpmesh, - scene + scene, + (editobact->flag & ACT_EDOB_REPLACE_MESH_NOGFX)==0, + (editobact->flag & ACT_EDOB_REPLACE_MESH_PHYS)!=0 + ); baseact = tmpreplaceact; diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp index 0b395cfd402..eb77e087de5 100644 --- a/source/gameengine/Converter/KX_ConvertSensors.cpp +++ b/source/gameengine/Converter/KX_ConvertSensors.cpp @@ -28,6 +28,7 @@ * Conversion of Blender data blocks to KX sensor system */ + #ifdef HAVE_CONFIG_H #include <config.h> #endif @@ -94,7 +95,6 @@ void BL_ConvertSensors(struct Object* blenderobject, SCA_LogicManager* logicmgr, KX_Scene* kxscene, KX_KetsjiEngine* kxengine, - SCA_IInputDevice* keydev, int activeLayerBitInfo, bool isInActiveLayer, RAS_ICanvas* canvas, @@ -444,9 +444,8 @@ void BL_ConvertSensors(struct Object* blenderobject, blendernearsensor->dist, blendernearsensor->resetdist, bFindMaterial, - nearpropertyname,kxscene, - physCtrl - ); + nearpropertyname, + physCtrl); } break; @@ -648,8 +647,7 @@ void BL_ConvertSensors(struct Object* blenderobject, smallmargin, largemargin, bFindMaterial, - radarpropertyname, - kxscene); + radarpropertyname); } diff --git a/source/gameengine/Converter/KX_ConvertSensors.h b/source/gameengine/Converter/KX_ConvertSensors.h index 9162a866768..630323f30b4 100644 --- a/source/gameengine/Converter/KX_ConvertSensors.h +++ b/source/gameengine/Converter/KX_ConvertSensors.h @@ -34,7 +34,6 @@ void BL_ConvertSensors(struct Object* blenderobject, class SCA_LogicManager* logicmgr, class KX_Scene* kxscene, class KX_KetsjiEngine* kxengine, - class SCA_IInputDevice* keydev, int activeLayerBitInfo, bool isInActiveLayer, class RAS_ICanvas* canvas, diff --git a/source/gameengine/Converter/Makefile b/source/gameengine/Converter/Makefile index ed95aa968c7..8a41207d73c 100644 --- a/source/gameengine/Converter/Makefile +++ b/source/gameengine/Converter/Makefile @@ -39,7 +39,7 @@ CPPFLAGS += -I$(OPENGL_HEADERS) CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include +CPPFLAGS += -I$(NAN_MOTO)/include CPPFLAGS += -I$(NAN_BULLET2)/include CPPFLAGS += -I../../blender diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp index d8c81f56f66..2759b68b62e 100644 --- a/source/gameengine/Expressions/Value.cpp +++ b/source/gameengine/Expressions/Value.cpp @@ -543,13 +543,6 @@ CValue* CValue::FindIdentifier(const STR_String& identifiername) #ifndef NO_EXP_PYTHON_EMBEDDING - -static PyMethodDef CValueMethods[] = -{ - //{ "new", CValue::PyMake , METH_VARARGS}, - { NULL,NULL} // Sentinel -}; - PyAttributeDef CValue::Attributes[] = { KX_PYATTRIBUTE_RO_FUNCTION("name", CValue, pyattr_get_name), { NULL } //Sentinel diff --git a/source/gameengine/GameLogic/SCA_IScene.h b/source/gameengine/GameLogic/SCA_IScene.h index b641efc6ee1..79d922a998e 100644 --- a/source/gameengine/GameLogic/SCA_IScene.h +++ b/source/gameengine/GameLogic/SCA_IScene.h @@ -55,7 +55,7 @@ public: //virtual void DelayedReleaseObject(class CValue* gameobj)=0; virtual void ReplaceMesh(class CValue* gameobj, - void* meshobj)=0; + void* meshobj, bool use_gfx, bool use_phys)=0; std::vector<SCA_DebugProp*>& GetDebugProperties(); void AddDebugProperty(class CValue* debugprop, const STR_String &name); diff --git a/source/gameengine/GamePlayer/common/CMakeLists.txt b/source/gameengine/GamePlayer/common/CMakeLists.txt index ce1cd217f60..1b31f2ff0bb 100644 --- a/source/gameengine/GamePlayer/common/CMakeLists.txt +++ b/source/gameengine/GamePlayer/common/CMakeLists.txt @@ -70,7 +70,6 @@ SET(INC ../../../../source/blender/gpu ../../../../extern/glew/include ${PYTHON_INC} - ${SOLID_INC} ${PNG_INC} ${ZLIB_INC} ) diff --git a/source/gameengine/GamePlayer/common/Makefile b/source/gameengine/GamePlayer/common/Makefile index 4a952856739..218227c55e9 100644 --- a/source/gameengine/GamePlayer/common/Makefile +++ b/source/gameengine/GamePlayer/common/Makefile @@ -47,7 +47,6 @@ CPPFLAGS += -I../../../blender/gpu CPPFLAGS += -I../../../kernel/gen_system CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include -CPPFLAGS += -I$(NAN_FUZZICS)/include CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_MOTO)/include CPPFLAGS += -I$(NAN_PNG)/include diff --git a/source/gameengine/GamePlayer/common/unix/Makefile b/source/gameengine/GamePlayer/common/unix/Makefile index 08c52ddc904..e024ebd65f9 100644 --- a/source/gameengine/GamePlayer/common/unix/Makefile +++ b/source/gameengine/GamePlayer/common/unix/Makefile @@ -56,7 +56,6 @@ CPPFLAGS += -I../../../../gameengine/Rasterizer CPPFLAGS += -I../../../../gameengine/Rasterizer/RAS_OpenGLRasterizer CPPFLAGS += -I../../../../gameengine/SceneGraph -CPPFLAGS += -I$(NAN_FUZZICS)/include CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include CPPFLAGS += -I$(NAN_MOTO)/include diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp index a3805bd4317..4c824a8df40 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp @@ -708,10 +708,8 @@ bool GPG_Application::startEngine(void) loadGamePythonConfig(m_pyGlobalDictString, m_pyGlobalDictString_Length); m_sceneconverter->ConvertScene( - startscenename, startscene, dictionaryobject, - m_keyboard, m_rendertools, m_canvas); m_ketsjiengine->AddScene(startscene); diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp index 7cb287d02b2..de820ddaaae 100644 --- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp +++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp @@ -146,7 +146,7 @@ PyAttributeDef KX_NetworkMessageActuator::Attributes[] = { KX_PYATTRIBUTE_STRING_RW("propName", 0, 100, false, KX_NetworkMessageActuator, m_toPropName), KX_PYATTRIBUTE_STRING_RW("subject", 0, 100, false, KX_NetworkMessageActuator, m_subject), KX_PYATTRIBUTE_BOOL_RW("usePropBody", KX_NetworkMessageActuator, m_bPropBody), - KX_PYATTRIBUTE_STRING_RW("body", 0, 100, false, KX_NetworkMessageActuator, m_body), + KX_PYATTRIBUTE_STRING_RW("body", 0, 16384, false, KX_NetworkMessageActuator, m_body), { NULL } //Sentinel }; diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp index 314becc702d..d93175ff35a 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp @@ -59,8 +59,7 @@ KX_BlenderMaterial::KX_BlenderMaterial() void KX_BlenderMaterial::Initialize( KX_Scene *scene, BL_Material *data, - bool skin, - int lightlayer) + bool skin) { RAS_IPolyMaterial::Initialize( data->texname[0], @@ -72,8 +71,7 @@ void KX_BlenderMaterial::Initialize( data->mode, data->transp, ((data->ras_mode &ALPHA)!=0), - ((data->ras_mode &ZSORT)!=0), - lightlayer + ((data->ras_mode &ZSORT)!=0) ); mMaterial = data; mShader = 0; @@ -776,6 +774,7 @@ void KX_BlenderMaterial::UpdateIPO( mMaterial->hard = (float)(hard); mMaterial->emit = (float)(emit); mMaterial->spec_f = (float)(spec); + mMaterial->ref = (float)(ref); } diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.h b/source/gameengine/Ketsji/KX_BlenderMaterial.h index 1f5edc1d7d1..605ca207949 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.h +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.h @@ -27,8 +27,7 @@ public: void Initialize( class KX_Scene* scene, BL_Material* mat, - bool skin, - int lightlayer + bool skin ); virtual ~KX_BlenderMaterial(); diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp index 748b0667061..db1595db36f 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp @@ -402,6 +402,8 @@ void KX_BulletPhysicsController::RestoreDynamics() btRigidBody *body = GetRigidBody(); if (body && m_suspended) { + // before make sure any position change that was done in this logic frame are accounted for + SetTransform(); GetPhysicsEnvironment()->updateCcdPhysicsController(this, m_savedMass, m_savedCollisionFlags, diff --git a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp index d09eae647c8..0d69da83081 100644 --- a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp +++ b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp @@ -36,6 +36,7 @@ #include "MT_Matrix3x3.h" #include "KX_GameObject.h" #include "KX_RayCast.h" +#include "KX_PythonInit.h" // KX_GetActiveScene #ifdef HAVE_CONFIG_H #include <config.h> @@ -327,7 +328,7 @@ bool KX_ConstraintActuator::Update(double curtime, bool frame) } { MT_Point3 topoint = position + (m_maximumBound) * direction; - PHY_IPhysicsEnvironment* pe = obj->GetPhysicsEnvironment(); + PHY_IPhysicsEnvironment* pe = KX_GetActiveScene()->GetPhysicsEnvironment(); KX_IPhysicsController *spc = obj->GetPhysicsController(); if (!pe) { @@ -440,7 +441,7 @@ bool KX_ConstraintActuator::Update(double curtime, bool frame) } normal.normalize(); { - PHY_IPhysicsEnvironment* pe = obj->GetPhysicsEnvironment(); + PHY_IPhysicsEnvironment* pe = KX_GetActiveScene()->GetPhysicsEnvironment(); KX_IPhysicsController *spc = obj->GetPhysicsController(); if (!pe) { diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h index 9d3b9cdaf74..147bd238009 100644 --- a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h +++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h @@ -164,7 +164,7 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj, struct KX_ObjectProperties* objprop); void KX_ClearBulletSharedShapes(); -//bool KX_ReInstanceShapeFromMesh(RAS_MeshObject* meshobj); +bool KX_ReInstanceBulletShapeFromMesh(KX_GameObject *gameobj, KX_GameObject *from_gameobj, RAS_MeshObject* from_meshobj); #endif #endif //KX_CONVERTPHYSICSOBJECTS diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp index 64b5760de28..04e82d21cf4 100644 --- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp +++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp @@ -628,5 +628,44 @@ void KX_ClearBulletSharedShapes() { } -#endif +/* Refresh the physics object from either an object or a mesh. + * gameobj must be valid + * from_gameobj and from_meshobj can be NULL + * + * when setting the mesh, the following vars get priority + * 1) from_meshobj - creates the phys mesh from RAS_MeshObject + * 2) from_gameobj - creates the phys mesh from the DerivedMesh where possible, else the RAS_MeshObject + * 3) gameobj - update the phys mesh from DerivedMesh or RAS_MeshObject + * + * Most of the logic behind this is in shapeInfo->UpdateMesh(...) + */ +bool KX_ReInstanceBulletShapeFromMesh(KX_GameObject *gameobj, KX_GameObject *from_gameobj, RAS_MeshObject* from_meshobj) +{ + KX_BulletPhysicsController *spc= static_cast<KX_BulletPhysicsController*>((gameobj->GetPhysicsController())); + CcdShapeConstructionInfo *shapeInfo; + + /* if this is the child of a compound shape this can happen + * dont support compound shapes for now */ + if(spc==NULL) + return false; + + shapeInfo = spc->GetShapeInfo(); + + if(shapeInfo->m_shapeType != PHY_SHAPE_MESH || spc->GetSoftBody()) + return false; + + spc->DeleteControllerShape(); + + if(from_gameobj==NULL && from_meshobj==NULL) + from_gameobj= gameobj; + + /* updates the arrays used for making the new bullet mesh */ + shapeInfo->UpdateMesh(from_gameobj, from_meshobj); + /* create the new bullet mesh */ + btCollisionShape* bm= shapeInfo->CreateBulletShape(spc->getConstructionInfo().m_margin); + + spc->ReplaceControllerShape(bm); + return true; +} +#endif diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index bf80eec36d9..fa3a336466c 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -66,6 +66,7 @@ typedef unsigned long uint_ptr; #include "KX_PythonInit.h" #include "KX_PyMath.h" #include "KX_PythonSeq.h" +#include "KX_ConvertPhysicsObject.h" #include "SCA_IActuator.h" #include "SCA_ISensor.h" #include "SCA_IController.h" @@ -100,7 +101,6 @@ KX_GameObject::KX_GameObject( m_bOccluder(false), m_pPhysicsController1(NULL), m_pGraphicController(NULL), - m_pPhysicsEnvironment(NULL), m_xray(false), m_pHitObject(NULL), m_isDeformable(false), @@ -1387,8 +1387,9 @@ PyMethodDef KX_GameObject::Methods[] = { {"getChildrenRecursive", (PyCFunction)KX_GameObject::sPyGetChildrenRecursive,METH_NOARGS}, {"getPhysicsId", (PyCFunction)KX_GameObject::sPyGetPhysicsId,METH_NOARGS}, {"getPropertyNames", (PyCFunction)KX_GameObject::sPyGetPropertyNames,METH_NOARGS}, - {"replaceMesh",(PyCFunction) KX_GameObject::sPyReplaceMesh, METH_O}, + {"replaceMesh",(PyCFunction) KX_GameObject::sPyReplaceMesh, METH_VARARGS}, {"endObject",(PyCFunction) KX_GameObject::sPyEndObject, METH_NOARGS}, + {"reinstancePhysicsMesh", (PyCFunction)KX_GameObject::sPyReinstancePhysicsMesh,METH_VARARGS}, KX_PYMETHODTABLE(KX_GameObject, rayCastTo), KX_PYMETHODTABLE(KX_GameObject, rayCast), @@ -1464,15 +1465,21 @@ bool KX_GameObject::ConvertPythonVectorArgs(PyObject* args, } */ -PyObject* KX_GameObject::PyReplaceMesh(PyObject* value) +PyObject* KX_GameObject::PyReplaceMesh(PyObject* args) { KX_Scene *scene = KX_GetActiveScene(); - RAS_MeshObject* new_mesh; + + PyObject *value; + int use_gfx= 1, use_phys= 0; + RAS_MeshObject *new_mesh; + + if (!PyArg_ParseTuple(args,"O|ii:replaceMesh", &value, &use_gfx, &use_phys)) + return NULL; if (!ConvertPythonToMesh(value, &new_mesh, false, "gameOb.replaceMesh(value): KX_GameObject")) return NULL; - scene->ReplaceMesh(this, new_mesh); + scene->ReplaceMesh(this, new_mesh, (bool)use_gfx, (bool)use_phys); Py_RETURN_NONE; } @@ -1486,6 +1493,28 @@ PyObject* KX_GameObject::PyEndObject() } +PyObject* KX_GameObject::PyReinstancePhysicsMesh(PyObject* args) +{ + KX_GameObject *gameobj= NULL; + RAS_MeshObject *mesh= NULL; + + PyObject *gameobj_py= NULL; + PyObject *mesh_py= NULL; + + if ( !PyArg_ParseTuple(args,"|OO:reinstancePhysicsMesh",&gameobj_py, &mesh_py) || + (gameobj_py && !ConvertPythonToGameObject(gameobj_py, &gameobj, true, "gameOb.reinstancePhysicsMesh(obj, mesh): KX_GameObject")) || + (mesh_py && !ConvertPythonToMesh(mesh_py, &mesh, true, "gameOb.reinstancePhysicsMesh(obj, mesh): KX_GameObject")) + ) { + return NULL; + } + + /* gameobj and mesh can be NULL */ + if(KX_ReInstanceBulletShapeFromMesh(this, gameobj, mesh)) + Py_RETURN_TRUE; + + Py_RETURN_FALSE; +} + PyObject* KX_GameObject::PyGetPosition() { @@ -2663,8 +2692,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, rayCastTo, toDir.normalize(); toPoint = fromPoint + (dist) * toDir; } - - PHY_IPhysicsEnvironment* pe = GetPhysicsEnvironment(); + PHY_IPhysicsEnvironment* pe = KX_GetActiveScene()->GetPhysicsEnvironment(); KX_IPhysicsController *spc = GetPhysicsController(); KX_GameObject *parent = GetParent(); if (!spc && parent) @@ -2791,7 +2819,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, rayCast, return none_tuple_3(); } - PHY_IPhysicsEnvironment* pe = GetPhysicsEnvironment(); + PHY_IPhysicsEnvironment* pe = KX_GetActiveScene()->GetPhysicsEnvironment(); KX_IPhysicsController *spc = GetPhysicsController(); KX_GameObject *parent = GetParent(); if (!spc && parent) diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index 947cc9959ff..ba7451fdeef 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -98,8 +98,6 @@ protected: KX_IPhysicsController* m_pPhysicsController1; PHY_IGraphicController* m_pGraphicController; - // used for ray casting - PHY_IPhysicsEnvironment* m_pPhysicsEnvironment; STR_String m_testPropName; bool m_xray; KX_GameObject* m_pHitObject; @@ -337,20 +335,6 @@ public: bool ang_vel_local ); - - /** - * @return a pointer to the physics environment in use during the game, for rayCasting - */ - PHY_IPhysicsEnvironment* GetPhysicsEnvironment() - { - return m_pPhysicsEnvironment; - } - - void SetPhysicsEnvironment(PHY_IPhysicsEnvironment* physicsEnvironment) - { - m_pPhysicsEnvironment = physicsEnvironment; - } - /** * @return a pointer to the physics controller owned by this class. */ @@ -849,13 +833,14 @@ public: KX_PYMETHOD_VARARGS(KX_GameObject,GetMesh); KX_PYMETHOD_NOARGS(KX_GameObject,GetPhysicsId); KX_PYMETHOD_NOARGS(KX_GameObject,GetPropertyNames); - KX_PYMETHOD_O(KX_GameObject,ReplaceMesh); + KX_PYMETHOD_VARARGS(KX_GameObject,ReplaceMesh); KX_PYMETHOD_NOARGS(KX_GameObject,EndObject); KX_PYMETHOD_DOC(KX_GameObject,rayCastTo); KX_PYMETHOD_DOC(KX_GameObject,rayCast); KX_PYMETHOD_DOC_O(KX_GameObject,getDistanceTo); KX_PYMETHOD_DOC_O(KX_GameObject,getVectTo); KX_PYMETHOD_DOC_VARARGS(KX_GameObject, sendMessage); + KX_PYMETHOD_VARARGS(KX_GameObject, ReinstancePhysicsMesh); /* Dict access */ KX_PYMETHOD_VARARGS(KX_GameObject,get); diff --git a/source/gameengine/Ketsji/KX_ISceneConverter.h b/source/gameengine/Ketsji/KX_ISceneConverter.h index 3709fa8c784..45b3276e98c 100644 --- a/source/gameengine/Ketsji/KX_ISceneConverter.h +++ b/source/gameengine/Ketsji/KX_ISceneConverter.h @@ -47,10 +47,9 @@ public: destinationscene: pass an empty scene, everything goes into this dictobj: python dictionary (for pythoncontrollers) */ - virtual void ConvertScene(const STR_String& scenename, + virtual void ConvertScene( class KX_Scene* destinationscene, PyObject* dictobj, - class SCA_IInputDevice* keyinputdev, class RAS_IRenderTools* rendertools, class RAS_ICanvas* canvas)=0; diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index cc0f50d9e7a..da72fe2fa50 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -1599,10 +1599,8 @@ KX_Scene* KX_KetsjiEngine::CreateScene(const STR_String& scenename) scenename, scene); - m_sceneconverter->ConvertScene(scenename, - tmpscene, + m_sceneconverter->ConvertScene(tmpscene, m_pythondictionary, - m_keyboarddevice, m_rendertools, m_canvas); diff --git a/source/gameengine/Ketsji/KX_MeshProxy.cpp b/source/gameengine/Ketsji/KX_MeshProxy.cpp index 96e8f61e4c8..ea9bc3e0fbc 100644 --- a/source/gameengine/Ketsji/KX_MeshProxy.cpp +++ b/source/gameengine/Ketsji/KX_MeshProxy.cpp @@ -84,7 +84,6 @@ PyMethodDef KX_MeshProxy::Methods[] = { {"getVertexArrayLength", (PyCFunction)KX_MeshProxy::sPyGetVertexArrayLength,METH_VARARGS}, {"getVertex", (PyCFunction)KX_MeshProxy::sPyGetVertex,METH_VARARGS}, {"getPolygon", (PyCFunction)KX_MeshProxy::sPyGetPolygon,METH_VARARGS}, -KX_PYMETHODTABLE(KX_MeshProxy, reinstancePhysicsMesh), //{"getIndexArrayLength", (PyCFunction)KX_MeshProxy::sPyGetIndexArrayLength,METH_VARARGS}, {NULL,NULL} //Sentinel @@ -243,17 +242,6 @@ PyObject* KX_MeshProxy::PyGetPolygon(PyObject* args, PyObject* kwds) return polyob; } -KX_PYMETHODDEF_DOC(KX_MeshProxy, reinstancePhysicsMesh, -"Reinstance the physics mesh.") -{ -#if 0 - //this needs to be reviewed, it is dependend on Sumo/Solid. Who is using this ? - if(KX_ReInstanceShapeFromMesh(m_meshobj)) - Py_RETURN_TRUE; -#endif - Py_RETURN_FALSE; -} - PyObject* KX_MeshProxy::pyattr_get_materials(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) { KX_MeshProxy* self= static_cast<KX_MeshProxy*>(self_v); @@ -328,7 +316,7 @@ bool ConvertPythonToMesh(PyObject * value, RAS_MeshObject **object, bool py_none KX_MeshProxy *kx_mesh = static_cast<KX_MeshProxy*>BGE_PROXY_REF(value); /* sets the error */ - if (*object==NULL) { + if (kx_mesh==NULL) { PyErr_Format(PyExc_SystemError, "%s, " BGE_PROXY_ERROR_MSG, error_prefix); return false; } diff --git a/source/gameengine/Ketsji/KX_MeshProxy.h b/source/gameengine/Ketsji/KX_MeshProxy.h index 4b6543677ad..55684aa5ee9 100644 --- a/source/gameengine/Ketsji/KX_MeshProxy.h +++ b/source/gameengine/Ketsji/KX_MeshProxy.h @@ -66,7 +66,6 @@ public: KX_PYMETHOD(KX_MeshProxy,GetVertexArrayLength); KX_PYMETHOD(KX_MeshProxy,GetVertex); KX_PYMETHOD(KX_MeshProxy,GetPolygon); - KX_PYMETHOD_DOC(KX_MeshProxy, reinstancePhysicsMesh); static PyObject* pyattr_get_materials(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef); static PyObject * pyattr_get_numMaterials(void * self, const KX_PYATTRIBUTE_DEF * attrdef); diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp index 1a211a64b35..6871aeebc76 100644 --- a/source/gameengine/Ketsji/KX_NearSensor.cpp +++ b/source/gameengine/Ketsji/KX_NearSensor.cpp @@ -47,14 +47,12 @@ KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr, float resetmargin, bool bFindMaterial, const STR_String& touchedpropname, - class KX_Scene* scene, PHY_IPhysicsController* ctrl) :KX_TouchSensor(eventmgr, gameobj, bFindMaterial, false, - touchedpropname - /*, scene */), + touchedpropname), m_Margin(margin), m_ResetMargin(resetmargin) diff --git a/source/gameengine/Ketsji/KX_NearSensor.h b/source/gameengine/Ketsji/KX_NearSensor.h index f3c1d74805c..03d6f830579 100644 --- a/source/gameengine/Ketsji/KX_NearSensor.h +++ b/source/gameengine/Ketsji/KX_NearSensor.h @@ -44,7 +44,7 @@ class KX_NearSensor : public KX_TouchSensor protected: float m_Margin; float m_ResetMargin; - KX_Scene* m_scene; + KX_ClientObjectInfo* m_client_info; public: KX_NearSensor(class SCA_EventManager* eventmgr, @@ -53,7 +53,6 @@ public: float resetmargin, bool bFindMaterial, const STR_String& touchedpropname, - class KX_Scene* scene, PHY_IPhysicsController* ctrl); /* public: diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp index 9bc84127572..a48d3f15bce 100644 --- a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp +++ b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp @@ -88,8 +88,7 @@ void KX_PolygonMaterial::Initialize( mode, transp, alpha, - zsort, - lightlayer); + zsort); m_tface = tface; m_mcol = mcol; m_material = ma; diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index ac49b49c130..c4110760228 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -2140,3 +2140,6 @@ void resetGamePythonPath() { gp_GamePythonPathOrig[0] = '\0'; } + + + diff --git a/source/gameengine/Ketsji/KX_RadarSensor.cpp b/source/gameengine/Ketsji/KX_RadarSensor.cpp index e39d3756b71..8ac94a324f2 100644 --- a/source/gameengine/Ketsji/KX_RadarSensor.cpp +++ b/source/gameengine/Ketsji/KX_RadarSensor.cpp @@ -48,8 +48,7 @@ KX_RadarSensor::KX_RadarSensor(SCA_EventManager* eventmgr, double margin, double resetmargin, bool bFindMaterial, - const STR_String& touchedpropname, - class KX_Scene* kxscene) + const STR_String& touchedpropname) : KX_NearSensor( eventmgr, @@ -59,7 +58,6 @@ KX_RadarSensor::KX_RadarSensor(SCA_EventManager* eventmgr, resetmargin, bFindMaterial, touchedpropname, - kxscene, physCtrl), m_coneradius(coneradius), diff --git a/source/gameengine/Ketsji/KX_RadarSensor.h b/source/gameengine/Ketsji/KX_RadarSensor.h index 344be0e399f..9f38d75abc4 100644 --- a/source/gameengine/Ketsji/KX_RadarSensor.h +++ b/source/gameengine/Ketsji/KX_RadarSensor.h @@ -69,8 +69,7 @@ public: double margin, double resetmargin, bool bFindMaterial, - const STR_String& touchedpropname, - class KX_Scene* kxscene); + const STR_String& touchedpropname); KX_RadarSensor(); virtual ~KX_RadarSensor(); virtual void SynchronizeTransform(); diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp index 2884bb76565..a19b18bf0e0 100644 --- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp +++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp @@ -88,6 +88,8 @@ PyMethodDef KX_SCA_ReplaceMeshActuator::Methods[] = { PyAttributeDef KX_SCA_ReplaceMeshActuator::Attributes[] = { KX_PYATTRIBUTE_RW_FUNCTION("mesh", KX_SCA_ReplaceMeshActuator, pyattr_get_mesh, pyattr_set_mesh), + KX_PYATTRIBUTE_BOOL_RW ("useDisplayMesh", KX_SCA_ReplaceMeshActuator, m_use_gfx), + KX_PYATTRIBUTE_BOOL_RW ("usePhysicsMesh", KX_SCA_ReplaceMeshActuator, m_use_phys), { NULL } //Sentinel }; @@ -156,11 +158,15 @@ KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, instantReplaceMesh, KX_SCA_ReplaceMeshActuator::KX_SCA_ReplaceMeshActuator(SCA_IObject *gameobj, class RAS_MeshObject *mesh, - SCA_IScene* scene) : + SCA_IScene* scene, + bool use_gfx, + bool use_phys) : SCA_IActuator(gameobj), m_mesh(mesh), - m_scene(scene) + m_scene(scene), + m_use_gfx(use_gfx), + m_use_phys(use_phys) { } /* End of constructor */ @@ -182,7 +188,8 @@ bool KX_SCA_ReplaceMeshActuator::Update() if (bNegativeEvent) return false; // do nothing on negative events - if (m_mesh) m_scene->ReplaceMesh(GetParent(),m_mesh); + if (m_mesh || m_use_phys) /* NULL mesh is ok if were updating physics */ + m_scene->ReplaceMesh(GetParent(),m_mesh, m_use_gfx, m_use_phys); return false; } @@ -204,7 +211,7 @@ CValue* KX_SCA_ReplaceMeshActuator::GetReplica() void KX_SCA_ReplaceMeshActuator::InstantReplaceMesh() { - if (m_mesh) m_scene->ReplaceMesh(GetParent(),m_mesh); + if (m_mesh) m_scene->ReplaceMesh(GetParent(),m_mesh, m_use_gfx, m_use_phys); } /* eof */ diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h index 6a68bd88cc5..ae2c0d2d6ce 100644 --- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h +++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h @@ -50,12 +50,17 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator // mesh reference (mesh to replace) RAS_MeshObject* m_mesh; SCA_IScene* m_scene; + bool m_use_phys; + bool m_use_gfx; public: KX_SCA_ReplaceMeshActuator( SCA_IObject* gameobj, RAS_MeshObject *mesh, - SCA_IScene* scene); + SCA_IScene* scene, + bool use_gfx, + bool use_phys + ); ~KX_SCA_ReplaceMeshActuator( ); @@ -69,7 +74,6 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator void InstantReplaceMesh(); - /* python api */ static PyObject* pyattr_get_mesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_mesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 51f5276e075..63d23f5af31 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1017,17 +1017,18 @@ int KX_Scene::NewRemoveObject(class CValue* gameobj) -void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj) +void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool use_phys) { KX_GameObject* gameobj = static_cast<KX_GameObject*>(obj); RAS_MeshObject* mesh = static_cast<RAS_MeshObject*>(meshobj); - if(!gameobj || !mesh) - { - std::cout << "warning: invalid object, mesh will not be replaced" << std::endl; + if(!gameobj) { + std::cout << "KX_Scene::ReplaceMesh Warning: invalid object, doing nothing" << std::endl; return; } + if(use_gfx && mesh != NULL) + { gameobj->RemoveMeshes(); gameobj->AddMesh(mesh); @@ -1156,6 +1157,11 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj) } gameobj->AddMeshUser(); + } + + if(use_phys) { /* update the new assigned mesh with the physics mesh */ + KX_ReInstanceBulletShapeFromMesh(gameobj, NULL, use_gfx?NULL:mesh); + } } KX_Camera* KX_Scene::FindCamera(KX_Camera* cam) @@ -1573,11 +1579,6 @@ void KX_Scene::SetGravity(const MT_Vector3& gravity) GetPhysicsEnvironment()->setGravity(gravity[0],gravity[1],gravity[2]); } -void KX_Scene::SetNodeTree(SG_Tree* root) -{ - m_objecttree = root; -} - void KX_Scene::SetSceneConverter(class KX_BlenderSceneConverter* sceneConverter) { m_sceneConverter = sceneConverter; diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index 2792f1f5fe4..a2e328fb5d5 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -119,10 +119,6 @@ protected: // the Qlist is for objects that needs to be rescheduled // for updates after udpate is over (slow parent, bone parent) - /** - * The tree of objects in the scene. - */ - SG_Tree* m_objecttree; /** * The set of cameras for this scene @@ -323,7 +319,7 @@ public: int NewRemoveObject(CValue* gameobj); void ReplaceMesh(CValue* gameobj, - void* meshobj); + void* meshob, bool use_gfx, bool use_phys); /** * @section Logic stuff * Initiate an update of the logic system. diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp index 673f42283dd..39381182944 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.cpp +++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp @@ -104,7 +104,8 @@ bool KX_SoundActuator::Update(double curtime, bool frame) // do nothing on negative events, otherwise sounds are played twice! bool bNegativeEvent = IsNegativeEvent(); - + bool bPositiveEvent = m_posevent; + RemoveAllEvents(); if (!m_soundObject) @@ -153,8 +154,17 @@ bool KX_SoundActuator::Update(double curtime, bool frame) // remember that we tried to stop the actuator m_isplaying = false; } - else - { + +#if 1 + // Warning: when de-activating the actuator, after a single negative event this runs again with... + // m_posevent==false && m_posevent==false, in this case IsNegativeEvent() returns false + // and assumes this is a positive event. + // check that we actually have a positive event so as not to play sounds when being disabled. + else if(bPositiveEvent) { // <- added since 2.49 +#else + else { // <- works in most cases except a loop-end sound will never stop unless + // the negative pulse is done continuesly +#endif if (!m_isplaying) { switch (m_type) diff --git a/source/gameengine/Ketsji/Makefile b/source/gameengine/Ketsji/Makefile index 8e91eb6ff9a..1c315350895 100644 --- a/source/gameengine/Ketsji/Makefile +++ b/source/gameengine/Ketsji/Makefile @@ -44,8 +44,7 @@ CPPFLAGS += -I../../blender/python CPPFLAGS += -I../../blender/python/generic CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include -CPPFLAGS += -I$(NAN_SOLID)/include +CPPFLAGS += -I$(NAN_MOTO)/include CPPFLAGS += -I$(NAN_BULLET2)/include CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer CPPFLAGS += -I../Rasterizer -I../GameLogic -I../SceneGraph diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 3c41a856660..20e830c9dc3 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -22,6 +22,8 @@ subject to the following restrictions: #include "PHY_IMotionState.h" #include "CcdPhysicsEnvironment.h" #include "RAS_MeshObject.h" +#include "KX_GameObject.h" + #include "BulletSoftBody/btSoftBody.h" #include "BulletSoftBody//btSoftBodyInternals.h" #include "BulletSoftBody/btSoftBodyHelpers.h" @@ -529,7 +531,7 @@ void CcdPhysicsController::CreateRigidbody() } -static void DeleteBulletShape(btCollisionShape* shape) +static void DeleteBulletShape(btCollisionShape* shape, bool free) { if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) { @@ -539,21 +541,13 @@ static void DeleteBulletShape(btCollisionShape* shape) if (meshInterface) delete meshInterface; } - delete shape; + if(free) { + delete shape; + } } -CcdPhysicsController::~CcdPhysicsController() +bool CcdPhysicsController::DeleteControllerShape( ) { - //will be reference counted, due to sharing - if (m_cci.m_physicsEnv) - m_cci.m_physicsEnv->removeCcdPhysicsController(this); - - if (m_MotionState) - delete m_MotionState; - if (m_bulletMotionState) - delete m_bulletMotionState; - delete m_object; - if (m_collisionShape) { // collision shape is always unique to the controller, can delete it here @@ -565,11 +559,64 @@ CcdPhysicsController::~CcdPhysicsController() for (int i=numChild-1 ; i >= 0; i--) { btCollisionShape* childShape = compoundShape->getChildShape(i); - DeleteBulletShape(childShape); + DeleteBulletShape(childShape, true); } } - DeleteBulletShape(m_collisionShape); + DeleteBulletShape(m_collisionShape, true); + + return true; } + + return false; +} + +bool CcdPhysicsController::ReplaceControllerShape(btCollisionShape *newShape) +{ + + /* Note, deleting the previous collision shape must be done alredy */ + /* if (m_collisionShape) DeleteControllerShape(); */ + + m_object->setCollisionShape(newShape); + m_collisionShape= newShape; + m_cci.m_collisionShape= newShape; + + + /* Copied from CcdPhysicsEnvironment::addCcdPhysicsController() */ + + /* without this, an object can rest on the old physics mesh + * and not move to account for the physics mesh, even with 'nosleep' */ + btSoftRigidDynamicsWorld* dw= GetPhysicsEnvironment()->getDynamicsWorld(); + btCollisionObjectArray &obarr= dw->getCollisionObjectArray(); + btCollisionObject *ob; + btBroadphaseProxy* proxy; + + for(int i= 0; i < obarr.size(); i++) { + ob= obarr[i]; + if (ob->getCollisionShape() == newShape); { + proxy = obarr[i]->getBroadphaseHandle(); + + if(proxy) + dw->getPairCache()->cleanProxyFromPairs(proxy,dw->getDispatcher()); + } + } + + return true; +} + +CcdPhysicsController::~CcdPhysicsController() +{ + //will be reference counted, due to sharing + if (m_cci.m_physicsEnv) + m_cci.m_physicsEnv->removeCcdPhysicsController(this); + + if (m_MotionState) + delete m_MotionState; + if (m_bulletMotionState) + delete m_bulletMotionState; + delete m_object; + + DeleteControllerShape(); + if (m_shapeInfo) { m_shapeInfo->Release(); @@ -1264,7 +1311,7 @@ PHY_IPhysicsController* CcdPhysicsController::GetReplica() if (m_shapeInfo) { // This situation does not normally happen - cinfo.m_collisionShape = m_shapeInfo->CreateBulletShape(0.01); + cinfo.m_collisionShape = m_shapeInfo->CreateBulletShape(m_cci.m_margin); } else if (m_collisionShape) { @@ -1621,6 +1668,311 @@ bool CcdShapeConstructionInfo::SetMesh(RAS_MeshObject* meshobj, DerivedMesh* dm, return true; } +#include <cstdio> + +/* Updates the arrays used by CreateBulletShape(), + * take care that recalcLocalAabb() runs after CreateBulletShape is called. + * */ +bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RAS_MeshObject* meshobj) +{ + int numpolys; + int numverts; + + unsigned int tot_bt_tris= 0; + unsigned int tot_bt_verts= 0; + + int i, j; + int v_orig; + + /* Use for looping over verts in a face as a try or 2 tris */ + const int quad_verts[7]= {0,1,2, 0,2,3, -1}; + const int tri_verts[4]= {0,1,2, -1}; + const int *fv_pt; + + if(gameobj==NULL && meshobj==NULL) + return false; + + if(m_shapeType != PHY_SHAPE_MESH) + return false; + + RAS_Deformer *deformer= gameobj ? gameobj->GetDeformer():NULL; + + /* get the mesh from the object if not defined */ + if(meshobj==NULL) { + + /* modifier mesh */ + if(deformer && deformer->GetFinalMesh()) + meshobj= deformer->GetRasMesh(); + + /* game object first mesh */ + if(meshobj==NULL) { + if(gameobj->GetMeshCount() > 0) { + meshobj= gameobj->GetMesh(0); + } + } + } + + if(deformer && deformer->GetFinalMesh() && deformer->GetRasMesh() == meshobj) + { /* + * Derived Mesh Update + * + * */ + + DerivedMesh* dm= gameobj->GetDeformer()->GetFinalMesh(); + + MVert *mvert = dm->getVertArray(dm); + MFace *mface = dm->getFaceArray(dm); + numpolys = dm->getNumFaces(dm); + numverts = dm->getNumVerts(dm); + int* index = (int*)dm->getFaceDataArray(dm, CD_ORIGINDEX); + + MFace *mf; + MVert *mv; + + int flen; + + if(CustomData_has_layer(&dm->faceData, CD_MTFACE)) + { + MTFace *tface = (MTFace *)dm->getFaceDataArray(dm, CD_MTFACE); + MTFace *tf; + + vector<bool> vert_tag_array(numverts, false); + vector<int> vert_remap_array(numverts, 0); + + for(mf= mface, tf= tface, i=0; i < numpolys; mf++, tf++, i++) { + if(tf->mode & TF_DYNAMIC) + { + if(mf->v4) { + tot_bt_tris+= 2; + flen= 4; + } else { + tot_bt_tris++; + flen= 3; + } + + for(j=0; j<flen; j++) + { + v_orig = (*(&mf->v1 + j)); + + if(vert_tag_array[v_orig]==false) + { + vert_tag_array[v_orig]= true; + vert_remap_array[v_orig]= tot_bt_verts; + tot_bt_verts++; + } + } + } + } + + m_vertexArray.resize(tot_bt_verts*3); + btScalar *bt= &m_vertexArray[0]; + + m_triFaceArray.resize(tot_bt_tris*3); + int *tri_pt= &m_triFaceArray[0]; + + m_polygonIndexArray.resize(tot_bt_tris); + int *poly_index_pt= &m_polygonIndexArray[0]; + + + for(mf= mface, tf= tface, i=0; i < numpolys; mf++, tf++, i++) + { + if(tf->mode & TF_DYNAMIC) + { + if(mf->v4) { + fv_pt= quad_verts; + *poly_index_pt++ = *poly_index_pt++ = index[i]; + flen= 4; + } else { + fv_pt= tri_verts; + *poly_index_pt++ = index[i]; + flen= 3; + } + + for(; *fv_pt > -1; fv_pt++) + { + v_orig = (*(&mf->v1 + (*fv_pt))); + + if(vert_tag_array[v_orig]) + { + mv= mvert + v_orig; + *bt++ = mv->co[0]; + *bt++ = mv->co[1]; + *bt++ = mv->co[2]; + + vert_tag_array[v_orig]= false; + } + *tri_pt++ = vert_remap_array[v_orig]; + } + } + } + } + else { + /* no need for a vertex mapping. simple/fast */ + + tot_bt_verts= numverts; + + for(mf= mface, i=0; i < numpolys; mf++, i++) { + tot_bt_tris += (mf->v4 ? 2:1); + } + + m_vertexArray.resize(tot_bt_verts*3); + btScalar *bt= &m_vertexArray[0]; + + m_triFaceArray.resize(tot_bt_tris*3); + int *tri_pt= &m_triFaceArray[0]; + + m_polygonIndexArray.resize(tot_bt_tris); + int *poly_index_pt= &m_polygonIndexArray[0]; + + for(mv= mvert, i=0; i < numverts; mv++, i++) { + *bt++ = mv->co[0]; *bt++ = mv->co[1]; *bt++ = mv->co[2]; + } + + for(mf= mface, i=0; i < numpolys; mf++, i++) { + unsigned int *fv = &mf->v1; + + if(mf->v4) { + fv_pt= quad_verts; + *poly_index_pt++ = *poly_index_pt++ = index[i]; + } + else { + fv_pt= tri_verts; + *poly_index_pt++ = index[i]; + } + + for(; *fv_pt > -1; fv_pt++) + *tri_pt++ = (*(&mf->v1 + (*fv_pt))); + } + } + } + else { /* + * RAS Mesh Update + * + * */ + + /* Note!, gameobj can be NULL here */ + + /* transverts are only used for deformed RAS_Meshes, the RAS_TexVert data + * is too hard to get at, see below for details */ + float (*transverts)[3]= NULL; + int transverts_tot= 0; /* with deformed meshes - should always be greater then the max orginal index, or we get crashes */ + + if(deformer) { + /* map locations from the deformed array + * + * Could call deformer->Update(); but rely on redraw updating. + * */ + transverts= deformer->GetTransVerts(&transverts_tot); + } + + // Tag verts we're using + numpolys= meshobj->NumPolygons(); + numverts= meshobj->m_sharedvertex_map.size(); + const float *xyz; + + + vector<bool> vert_tag_array(numverts, false); + vector<int> vert_remap_array(numverts, 0); + + for(int p=0; p<numpolys; p++) + { + RAS_Polygon* poly= meshobj->GetPolygon(p); + if (poly->IsCollider()) + { + for(i=0; i < poly->VertexCount(); i++) + { + v_orig= poly->GetVertex(i)->getOrigIndex(); + if(vert_tag_array[v_orig]==false) + { + vert_tag_array[v_orig]= true; + vert_remap_array[v_orig]= tot_bt_verts; + tot_bt_verts++; + } + } + tot_bt_tris += (poly->VertexCount()==4 ? 2:1); + } + } + + m_vertexArray.resize(tot_bt_verts*3); + btScalar *bt= &m_vertexArray[0]; + + m_triFaceArray.resize(tot_bt_tris*3); + int *tri_pt= &m_triFaceArray[0]; + + /* cant be used for anything useful in this case, since we dont rely on the original mesh + * will just be an array like pythons range(tot_bt_tris) */ + m_polygonIndexArray.resize(tot_bt_tris); + + + for(int p=0; p<numpolys; p++) + { + RAS_Polygon* poly= meshobj->GetPolygon(p); + + if (poly->IsCollider()) + { + /* quad or tri loop */ + fv_pt= (poly->VertexCount()==3 ? tri_verts:quad_verts); + + for(; *fv_pt > -1; fv_pt++) + { + v_orig= poly->GetVertex(*fv_pt)->getOrigIndex(); + + if(vert_tag_array[v_orig]) + { + if(transverts) { + /* deformed mesh, using RAS_TexVert locations would be too troublesome + * because they are use the gameob as a hash in the material slot */ + *bt++ = transverts[v_orig][0]; + *bt++ = transverts[v_orig][1]; + *bt++ = transverts[v_orig][2]; + } + else { + /* static mesh python may have modified */ + xyz= meshobj->GetVertexLocation( v_orig ); + *bt++ = xyz[0]; + *bt++ = xyz[1]; + *bt++ = xyz[2]; + } + + vert_tag_array[v_orig]= false; + } + + *tri_pt++ = vert_remap_array[v_orig]; + } + } + + m_polygonIndexArray[p]= p; /* dumb counting */ + } + } + +#if 0 + /* needs #include <cstdio> */ + printf("# vert count %d\n", m_vertexArray.size()); + for(int i=0; i<m_vertexArray.size(); i+=3) { + printf("v %.6f %.6f %.6f\n", m_vertexArray[i], m_vertexArray[i+1], m_vertexArray[i+2]); + } + + printf("# face count %d\n", m_triFaceArray.size()); + for(int i=0; i<m_triFaceArray.size(); i+=3) { + printf("f %d %d %d\n", m_triFaceArray[i]+1, m_triFaceArray[i+1]+1, m_triFaceArray[i+2]+1); + } +#endif + + /* force recreation of the m_unscaledShape. + * If this has multiple users we cant delete */ + if(m_unscaledShape) { + // dont free now so it can re-allocate under the same location and not break pointers. + // DeleteBulletShape(m_unscaledShape); + m_forceReInstance= true; + } + + m_meshObject= meshobj; + + return true; +} + + + bool CcdShapeConstructionInfo::SetProxy(CcdShapeConstructionInfo* shapeInfo) { if (shapeInfo == NULL) @@ -1696,7 +2048,7 @@ btCollisionShape* CcdShapeConstructionInfo::CreateBulletShape(btScalar margin) } else { - if (!m_unscaledShape) + if (!m_unscaledShape || m_forceReInstance) { btTriangleIndexVertexArray* indexVertexArrays = 0; @@ -1731,7 +2083,18 @@ btCollisionShape* CcdShapeConstructionInfo::CreateBulletShape(btScalar margin) } // this shape will be shared and not deleted until shapeInfo is deleted - m_unscaledShape = new btBvhTriangleMeshShape( indexVertexArrays, true ); + + // for UpdateMesh, reuse the last memory location so instancing wont crash. + if(m_unscaledShape) { + DeleteBulletShape(m_unscaledShape, false); + m_unscaledShape->~btBvhTriangleMeshShape(); + + m_unscaledShape = new(m_unscaledShape) btBvhTriangleMeshShape( indexVertexArrays, true ); + } else { + m_unscaledShape = new btBvhTriangleMeshShape( indexVertexArrays, true ); + } + + m_forceReInstance= false; m_unscaledShape->recalcLocalAabb(); } collisionShape = new btScaledBvhTriangleMeshShape(m_unscaledShape, btVector3(1.0f,1.0f,1.0f)); @@ -1776,7 +2139,7 @@ CcdShapeConstructionInfo::~CcdShapeConstructionInfo() m_shapeArray.clear(); if (m_unscaledShape) { - DeleteBulletShape(m_unscaledShape); + DeleteBulletShape(m_unscaledShape, true); } m_vertexArray.clear(); if (m_shapeType == PHY_SHAPE_MESH && m_meshObject != NULL) diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h index d73759bac76..8eb2e616ecf 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h @@ -146,6 +146,9 @@ public: return m_meshObject; } + bool UpdateMesh(class KX_GameObject* gameobj, class RAS_MeshObject* mesh); + + bool SetProxy(CcdShapeConstructionInfo* shapeInfo); CcdShapeConstructionInfo* GetProxy(void) { @@ -185,6 +188,7 @@ protected: // the actual shape is of type btScaledBvhTriangleMeshShape std::vector<CcdShapeConstructionInfo*> m_shapeArray; // for compound shapes bool m_useGimpact; //use gimpact for concave dynamic/moving collision detection + bool m_forceReInstance; //use gimpact for concave dynamic/moving collision detection float m_weldingThreshold1; //welding closeby vertices together can improve softbody stability etc. CcdShapeConstructionInfo* m_shapeProxy; // only used for PHY_SHAPE_PROXY, pointer to actual shape info }; @@ -381,6 +385,9 @@ protected: CcdPhysicsController (const CcdConstructionInfo& ci); + bool DeleteControllerShape(); + bool ReplaceControllerShape(btCollisionShape *newShape); + virtual ~CcdPhysicsController(); CcdConstructionInfo& getConstructionInfo() diff --git a/source/gameengine/Physics/Dummy/Makefile b/source/gameengine/Physics/Dummy/Makefile index c016a0bebcb..0e36266ae09 100644 --- a/source/gameengine/Physics/Dummy/Makefile +++ b/source/gameengine/Physics/Dummy/Makefile @@ -39,7 +39,7 @@ CPPFLAGS += -I$(OPENGL_HEADERS) CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include +CPPFLAGS += -I$(NAN_MOTO)/include CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include CPPFLAGS += -I../../Physics/common CPPFLAGS += -I../../Physics/Dummy diff --git a/source/gameengine/Physics/common/Makefile b/source/gameengine/Physics/common/Makefile index f2dd0134b71..f21df7ef1ed 100644 --- a/source/gameengine/Physics/common/Makefile +++ b/source/gameengine/Physics/common/Makefile @@ -40,7 +40,7 @@ CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include +CPPFLAGS += -I$(NAN_MOTO)/include CPPFLAGS += -I../../blender # these two needed because of blenkernel CPPFLAGS += -I../../blender/makesdna diff --git a/source/gameengine/PyDoc/API_intro.py b/source/gameengine/PyDoc/API_intro.py index 578b56eb2b0..0a687088627 100644 --- a/source/gameengine/PyDoc/API_intro.py +++ b/source/gameengine/PyDoc/API_intro.py @@ -24,7 +24,7 @@ The Blender Game Engine Python API Reference Additional Modules: ------------------- - These modules have no GameEngine spesific functionality but are useful in many cases. + These modules have no GameEngine specific functionality but are useful in many cases. - L{Mathutils} - L{Geometry} diff --git a/source/gameengine/PyDoc/GameTypes.py b/source/gameengine/PyDoc/GameTypes.py index 63dd1a7fabf..b1d1ce71173 100644 --- a/source/gameengine/PyDoc/GameTypes.py +++ b/source/gameengine/PyDoc/GameTypes.py @@ -310,6 +310,8 @@ class BL_ActionActuator(SCA_IActuator): @ivar action: The name of the action to set as the current action. @type action: string + @ivar channelNames: A list of channel names that may be used with L{setChannel} and L{getChannel} + @type channelNames: list of strings @ivar frameStart: Specifies the starting frame of the animation. @type frameStart: float @ivar frameEnd: Specifies the ending frame of the animation. @@ -340,7 +342,8 @@ class BL_ActionActuator(SCA_IActuator): """ Alternative to the 2 arguments, 4 arguments (channel, matrix, loc, size, quat) are also supported. - @param channel: A string specifying the name of the bone channel, created if missing. + @note: These values are relative to the bones rest position, currently the api has no way to get this info (which is annoying), but can be worked around by using bones with a rest pose that has no translation. + @param channel: A string specifying the name of the bone channel, error raised if not in L{channelNames}. @type channel: string @param matrix: A 4x4 matrix specifying the overriding transformation as an offset from the bone's rest position. @@ -349,7 +352,7 @@ class BL_ActionActuator(SCA_IActuator): def getChannel(channel): """ - @param channel: A string specifying the name of the bone channel. error raised if missing. + @param channel: A string specifying the name of the bone channel. error raised if not in L{channelNames}. @type channel: string @rtype: tuple @return: (loc, size, quat) @@ -1639,10 +1642,14 @@ class KX_GameObject(SCA_IObject): Delete this object, can be used inpace of the EndObject Actuator. The actual removal of the object from the scene is delayed. """ - def replaceMesh(mesh): + def replaceMesh(mesh, useDisplayMesh=True, usePhysicsMesh=False): """ Replace the mesh of this object with a new mesh. This works the same was as the actuator. @type mesh: L{KX_MeshProxy} or mesh name + @type useDisplayMesh: bool + @param useDisplayMesh: when enabled the display mesh will be replaced (optional argument). + @type usePhysicsMesh: bool + @param usePhysicsMesh: when enabled the physics mesh will be replaced (optional argument). """ def getVisible(): """ @@ -2075,6 +2082,26 @@ class KX_GameObject(SCA_IObject): @param to: The name of the object to send the message to (optional) @type to: string """ + def reinstancePhysicsMesh(gameObject, meshObject): + """ + Updates the physics system with the changed mesh. + + If no arguments are given the physics mesh will be re-created from the first mesh assigned to the game object. + + @param gameObject: optional argument, set the physics shape from this gameObjets mesh. + @type gameObject: string, L{KX_GameObject} or None + @param meshObject: optional argument, set the physics shape from this mesh. + @type meshObject: string, L{KX_MeshProxy} or None + + @note: if this object has instances the other instances will be updated too. + @note: the gameObject argument has an advantage that it can convert from a mesh with modifiers applied (such as subsurf). + @warning: only triangle mesh type objects are supported currently (not convex hull) + @warning: if the object is a part of a combound object it will fail (parent or child) + @warning: rebuilding the physics mesh can be slow, running many times per second will give a performance hit. + @rtype: boolean + @return: True if reinstance succeeded, False if it failed. + """ + def get(key, default=None): """ Return the value matching key, or the default value if its not found. @@ -2384,18 +2411,6 @@ class KX_MeshProxy(SCA_IObject): @rtype: L{KX_PolyProxy} @return: a polygon object. """ - def reinstancePhysicsMesh(): - """ - Updates the physics system with the changed mesh. - - A mesh must have only one material with collision flags, - and have all collision primitives in one vertex array (ie. < 65535 verts) and - be either a polytope or polyheder mesh. If you don't get a warning in the - console when the collision type is polytope, the mesh is suitable for reinstance. - @bug: This currently does not work. - @rtype: boolean - @return: True if reinstance succeeded, False if it failed. - """ class SCA_MouseSensor(SCA_ISensor): """ @@ -3780,6 +3795,11 @@ class KX_SCA_ReplaceMeshActuator(SCA_IActuator): @ivar mesh: L{KX_MeshProxy} or the name of the mesh that will replace the current one Set to None to disable actuator @type mesh: L{KX_MeshProxy} or None if no mesh is set + + @ivar useDisplayMesh: when true the displayed mesh is replaced. + @type useDisplayMesh: boolean + @ivar usePhysicsMesh: when true the physics mesh is replaced. + @type usePhysicsMesh: boolean """ def setMesh(name): """ diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.cpp b/source/gameengine/Rasterizer/RAS_BucketManager.cpp index 200b1c6c89f..8b3c4990a7a 100644 --- a/source/gameengine/Rasterizer/RAS_BucketManager.cpp +++ b/source/gameengine/Rasterizer/RAS_BucketManager.cpp @@ -126,10 +126,7 @@ void RAS_BucketManager::OrderBuckets(const MT_Transform& cameratrans, BucketList RAS_MaterialBucket* bucket = *bit; RAS_MeshSlot* ms; // remove the mesh slot form the list, it culls them automatically for next frame - for(ms = bucket->GetNextActiveMeshSlot(); - ms!= NULL; - ms = bucket->GetNextActiveMeshSlot()) - { + while((ms = bucket->GetNextActiveMeshSlot())) { slots[i++].set(ms, bucket, pnorm); } } @@ -179,9 +176,7 @@ void RAS_BucketManager::RenderSolidBuckets( RAS_MaterialBucket* bucket = *bit; RAS_MeshSlot* ms; // remove the mesh slot form the list, it culls them automatically for next frame - for(ms = bucket->GetNextActiveMeshSlot(); - ms!= NULL; - ms = bucket->GetNextActiveMeshSlot()) + while((ms = bucket->GetNextActiveMeshSlot())) { rendertools->SetClientObject(rasty, ms->m_clientObj); while (bucket->ActivateMaterial(cameratrans, rasty, rendertools)) diff --git a/source/gameengine/Rasterizer/RAS_Deformer.h b/source/gameengine/Rasterizer/RAS_Deformer.h index fe9b1540af8..75c0dcd1eeb 100644 --- a/source/gameengine/Rasterizer/RAS_Deformer.h +++ b/source/gameengine/Rasterizer/RAS_Deformer.h @@ -38,6 +38,7 @@ #include "GEN_Map.h" struct DerivedMesh; +class RAS_MeshObject; class RAS_Deformer { @@ -71,6 +72,12 @@ public: { return NULL; } + virtual class RAS_MeshObject* GetRasMesh() + { + /* m_pMesh does not seem to be being used?? */ + return NULL; + } + virtual float (* GetTransVerts(int *tot))[3] { *tot= 0; return NULL; } protected: class RAS_MeshObject *m_pMesh; diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp index 6af00d63c2d..cb5c5a12397 100644 --- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp +++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp @@ -46,8 +46,7 @@ void RAS_IPolyMaterial::Initialize( int mode, int transp, bool alpha, - bool zsort, - int lightlayer) + bool zsort) { m_texturename = texname; m_materialname = matname; @@ -59,7 +58,6 @@ void RAS_IPolyMaterial::Initialize( m_transp = transp; m_alpha = alpha; m_zsort = zsort; - //m_lightlayer = lightlayer; m_polymatid = m_newpolymatid++; m_flag = 0; m_multimode = 0; @@ -80,7 +78,6 @@ RAS_IPolyMaterial::RAS_IPolyMaterial() m_transp(0), m_alpha(false), m_zsort(false), - //m_lightlayer(0), m_polymatid(0), m_flag(0), m_multimode(0) @@ -100,8 +97,7 @@ RAS_IPolyMaterial::RAS_IPolyMaterial(const STR_String& texname, int mode, int transp, bool alpha, - bool zsort, - int lightlayer) + bool zsort) : m_texturename(texname), m_materialname(matname), m_materialindex(materialindex), @@ -112,7 +108,6 @@ RAS_IPolyMaterial::RAS_IPolyMaterial(const STR_String& texname, m_transp(transp), m_alpha(alpha), m_zsort(zsort), - //m_lightlayer(lightlayer), m_polymatid(m_newpolymatid++), m_flag(0), m_multimode(0) @@ -172,11 +167,6 @@ bool RAS_IPolyMaterial::Less(const RAS_IPolyMaterial& rhs) const return m_polymatid < rhs.m_polymatid; } -//int RAS_IPolyMaterial::GetLightLayer() const -//{ -// return m_lightlayer; -//} - bool RAS_IPolyMaterial::IsAlpha() const { return m_alpha || m_zsort; diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h index e19db35ccb5..a01196ef307 100644 --- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h +++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h @@ -73,7 +73,6 @@ protected: int m_transp; bool m_alpha; bool m_zsort; - //int m_lightlayer; int m_materialindex; unsigned int m_polymatid; @@ -110,8 +109,7 @@ public: int mode, int transp, bool alpha, - bool zsort, - int lightlayer); + bool zsort); void Initialize(const STR_String& texname, const STR_String& matname, int materialindex, @@ -121,8 +119,7 @@ public: int mode, int transp, bool alpha, - bool zsort, - int lightlayer); + bool zsort); virtual ~RAS_IPolyMaterial() {}; /** diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.cpp b/source/gameengine/Rasterizer/RAS_MeshObject.cpp index 1dfcb0c512d..0995d5acdd5 100644 --- a/source/gameengine/Rasterizer/RAS_MeshObject.cpp +++ b/source/gameengine/Rasterizer/RAS_MeshObject.cpp @@ -90,9 +90,8 @@ struct RAS_MeshObject::fronttoback STR_String RAS_MeshObject::s_emptyname = ""; -RAS_MeshObject::RAS_MeshObject(Mesh* mesh, int lightlayer) - : //m_lightlayer(lightlayer), - m_bModified(true), +RAS_MeshObject::RAS_MeshObject(Mesh* mesh) + : m_bModified(true), m_bMeshModified(true), m_mesh(mesh), m_bDeformed(false) @@ -382,6 +381,13 @@ RAS_TexVert* RAS_MeshObject::GetVertex(unsigned int matid, return NULL; } +const float* RAS_MeshObject::GetVertexLocation(unsigned int orig_index) +{ + vector<SharedVertex>& sharedmap = m_sharedvertex_map[orig_index]; + vector<SharedVertex>::iterator it= sharedmap.begin(); + return it->m_darray->m_vertex[it->m_offset].getXYZ(); +} + void RAS_MeshObject::AddMeshUser(void *clientobj, SG_QList *head, RAS_Deformer* deformer) { list<RAS_MeshMaterial>::iterator it; diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.h b/source/gameengine/Rasterizer/RAS_MeshObject.h index e763d6e7c7f..f34546a8ff7 100644 --- a/source/gameengine/Rasterizer/RAS_MeshObject.h +++ b/source/gameengine/Rasterizer/RAS_MeshObject.h @@ -55,7 +55,6 @@ class RAS_MeshObject { private: unsigned int m_debugcolor; - //int m_lightlayer; bool m_bModified; bool m_bMeshModified; @@ -77,7 +76,7 @@ protected: public: // for now, meshes need to be in a certain layer (to avoid sorting on lights in realtime) - RAS_MeshObject(Mesh* mesh, int lightlayer); + RAS_MeshObject(Mesh* mesh); virtual ~RAS_MeshObject(); @@ -126,6 +125,7 @@ public: /* vertex and polygon acces */ int NumVertices(RAS_IPolyMaterial* mat); RAS_TexVert* GetVertex(unsigned int matid, unsigned int index); + const float* GetVertexLocation(unsigned int orig_index); int NumPolygons(); RAS_Polygon* GetPolygon(int num) const; @@ -141,6 +141,13 @@ public: bool culled); void RemoveFromBuckets(void *clientobj); + void EndConversion() { +#if 0 + m_sharedvertex_map.clear(); // SharedVertex + vector<vector<SharedVertex> > shared_null(0); + shared_null.swap( m_sharedvertex_map ); /* really free the memory */ +#endif + } /* colors */ void DebugColor(unsigned int abgr); diff --git a/source/nan_compile.mk b/source/nan_compile.mk index bc264fe5c1d..4a4e472fa66 100644 --- a/source/nan_compile.mk +++ b/source/nan_compile.mk @@ -39,8 +39,6 @@ CPPFLAGS ?= $(NAN_CPPFLAGS) # Uncomment next lines to enable integrated game engine ifneq ($(NAN_NO_KETSJI), true) CFLAGS += -DGAMEBLENDER=1 - CFLAGS += -DUSE_SUMO_SOLID - CCFLAGS += -DUSE_SUMO_SOLID ifeq ($(NAN_USE_BULLET), true) CFLAGS += -DUSE_BULLET -DWITH_BULLET CCFLAGS += -DUSE_BULLET -DWITH_BULLET diff --git a/source/nan_definitions.mk b/source/nan_definitions.mk index fc0f3a7aa19..96405116363 100644 --- a/source/nan_definitions.mk +++ b/source/nan_definitions.mk @@ -81,18 +81,9 @@ ifndef CONFIG_GUESS endif export NAN_MOTO ?= $(LCGDIR)/moto -ifeq ($(FREE_WINDOWS), true) - export NAN_SOLID ?= $(LCGDIR)/gcc/solid - export NAN_QHULL ?= $(LCGDIR)/gcc/qhull -else - export NAN_SOLID ?= $(LCGDIR)/solid - export NAN_QHULL ?= $(LCGDIR)/qhull -endif export BF_PROFILE ?= false export NAN_USE_BULLET ?= true export NAN_BULLET2 ?= $(LCGDIR)/bullet2 - export NAN_FUZZICS ?= $(SRCHOME)/gameengine/Physics/Sumo/Fuzzics - export NAN_BLENKEY ?= $(LCGDIR)/blenkey export NAN_DECIMATION ?= $(LCGDIR)/decimation export NAN_GUARDEDALLOC ?= $(LCGDIR)/guardedalloc export NAN_IKSOLVER ?= $(LCGDIR)/iksolver @@ -107,6 +98,7 @@ endif export NAN_TEST_VERBOSITY ?= 1 export NAN_OPENNL ?= $(LCGDIR)/opennl export NAN_ELBEEM ?= $(LCGDIR)/elbeem + export NAN_SMOKE ?= $(LCGDIR)/smoke export NAN_SUPERLU ?= $(LCGDIR)/superlu export NAN_GLEW ?= $(LCGDIR)/glew ifeq ($(FREE_WINDOWS), true) @@ -135,25 +127,30 @@ endif export ID = $(shell whoami) export HOST = $(shell hostname -s) - export PY_FRAMEWORK ?= 1 + export NAN_PYTHON_VERSION = 3.1 - ifdef PY_FRAMEWORK - export NAN_PYTHON ?= /System/Library/Frameworks/Python.framework/Versions/2.3 - export NAN_PYTHON_VERSION ?= 2.3 - export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) - export NAN_PYTHON_LIB ?= -framework Python + ifeq ($(NAN_PYTHON_VERSION),3.1) + export PY_FRAMEWORK ?= 0 + export NAN_PYTHON ?= $(LCGDIR)/python + export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/libpython$(NAN_PYTHON_VERSION).a else - export NAN_PYTHON ?= /sw - export NAN_PYTHON_VERSION ?= 2.3 - export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) - export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a + export PY_FRAMEWORK ?= 1 + ifdef PY_FRAMEWORK + export NAN_PYTHON ?= /System/Library/Frameworks/Python.framework/Versions/2.5 + export NAN_PYTHON_VERSION ?= 2.5 + export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) + export NAN_PYTHON_LIB ?= -framework Python + else + export NAN_PYTHON ?= /sw + export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) + export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a + endif endif export NAN_OPENAL ?= $(LCGDIR)/openal export NAN_JPEG ?= $(LCGDIR)/jpeg export NAN_PNG ?= $(LCGDIR)/png export NAN_TIFF ?= $(LCGDIR)/tiff - export NAN_ODE ?= $(LCGDIR)/ode export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay export NAN_MESA ?= /usr/src/Mesa-3.1 export NAN_ZLIB ?= $(LCGDIR)/zlib @@ -170,20 +167,14 @@ endif export NAN_OPENEXR ?= $(LCGDIR)/openexr export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR - ifeq ($(CPU),powerpc) - export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a - else - export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a - endif - - # export NAN_NO_KETSJI=true + export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a + + export NAN_NO_KETSJI=false ifeq ($(CPU), i386) export NAN_NO_OPENAL=true endif - # Uncomment the following line to use Mozilla inplace of netscape - # CPPFLAGS +=-DMOZ_NOT_NET # Location of MOZILLA/Netscape header files... export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/ @@ -208,14 +199,13 @@ endif export FREEDESKTOP ?= true export NAN_PYTHON ?= /usr/local - export NAN_PYTHON_VERSION ?= 2.5 + export NAN_PYTHON_VERSION ?= 3.1 export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a export NAN_OPENAL ?= /usr/local export NAN_JPEG ?= /usr/local export NAN_PNG ?= /usr/local export NAN_TIFF ?= /usr/local - export NAN_ODE ?= $(LCGDIR)/ode export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay export NAN_MESA ?= /usr/src/Mesa-3.1 export NAN_ZLIB ?= /usr @@ -226,8 +216,6 @@ endif export NAN_SDLLIBS ?= $(shell sdl-config --libs) export NAN_SDLCFLAGS ?= $(shell sdl-config --cflags) - # Uncomment the following line to use Mozilla inplace of netscape - # CPPFLAGS +=-DMOZ_NOT_NET # Location of MOZILLA/Netscape header files... export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/ @@ -248,7 +236,7 @@ endif export HOST = $(shell /usr/bsd/hostname -s) #export NAN_NO_KETSJI=true export NAN_JUST_BLENDERDYNAMIC=true - export NAN_PYTHON_VERSION ?= 2.5 + export NAN_PYTHON_VERSION ?= 3.1 ifeq ($(IRIX_USE_GCC), true) export NAN_PYTHON ?= $(LCGDIR)/python_gcc else @@ -260,7 +248,6 @@ endif export NAN_JPEG ?= $(LCGDIR)/jpeg export NAN_PNG ?= $(LCGDIR)/png export NAN_TIFF ?= $(LCGDIR)/tiff - export NAN_ODE ?= $(LCGDIR)/ode export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay export NAN_MESA ?= /usr/src/Mesa-3.1 export NAN_ZLIB ?= $(LCGDIR)/zlib @@ -284,8 +271,6 @@ endif export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a - # Uncomment the following line to use Mozilla inplace of netscape - # CPPFLAGS +=-DMOZ_NOT_NET # Location of MOZILLA/Netscape header files... export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/ @@ -307,14 +292,13 @@ endif export FREEDESKTOP ?= true export NAN_PYTHON ?= /usr - export NAN_PYTHON_VERSION ?= 2.6 + export NAN_PYTHON_VERSION ?= 3.1 export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a export NAN_OPENAL ?= /usr export NAN_JPEG ?= /usr export NAN_PNG ?= /usr export NAN_TIFF ?= /usr - export NAN_ODE ?= $(LCGDIR)/ode export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay export NAN_MESA ?= /usr export NAN_ZLIB ?= /usr @@ -338,7 +322,7 @@ endif endif # Uncomment the following line to use Mozilla inplace of netscape - export CPPFLAGS += -DMOZ_NOT_NET + # Location of MOZILLA/Netscape header files... export NAN_MOZILLA_INC ?= /usr/include/mozilla export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/ @@ -367,14 +351,13 @@ endif export FREEDESKTOP ?= true export NAN_PYTHON ?= $(LCGDIR)/python - export NAN_PYTHON_VERSION ?= 2.3 + export NAN_PYTHON_VERSION ?= 3.1 export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a export NAN_OPENAL ?= $(LCGDIR)/openal export NAN_JPEG ?= $(LCGDIR)/jpeg export NAN_PNG ?= $(LCGDIR)/png export NAN_TIFF ?= $(LCGDIR)/tiff - export NAN_ODE ?= $(LCGDIR)/ode export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay export NAN_MESA ?= /usr/src/Mesa-3.1 export NAN_ZLIB ?= $(LCGDIR)/zlib @@ -385,8 +368,6 @@ endif export NAN_SDLLIBS ?= $(shell sdl-config --libs) export NAN_SDLCFLAGS ?= $(shell sdl-config --cflags) - # Uncomment the following line to use Mozilla inplace of netscape - # CPPFLAGS +=-DMOZ_NOT_NET # Location of MOZILLA/Netscape header files... export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/ @@ -406,14 +387,13 @@ endif export ID = $(shell /usr/ucb/whoami) export HOST = $(shell hostname) export NAN_PYTHON ?= $(LCGDIR)/python - export NAN_PYTHON_VERSION ?= 2.5 + export NAN_PYTHON_VERSION ?= 3.1 export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a export NAN_OPENAL ?= $(LCGDIR)/openal export NAN_JPEG ?= $(LCGDIR)/jpeg export NAN_PNG ?= $(LCGDIR)/png export NAN_TIFF ?= /usr - export NAN_ODE ?= $(LCGDIR)/ode export NAN_TERRAPLAY ?= export NAN_MESA ?= /usr/X11 export NAN_ZLIB ?= $(LCGDIR)/zlib @@ -430,8 +410,6 @@ endif export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR export NAN_OPENEXR_LIBS ?= $(NAN_OPENEXR)/lib/libIlmImf.a $(NAN_OPENEXR)/lib/libHalf.a $(NAN_OPENEXR)/lib/libIex.a $(NAN_OPENEXR)/lib/libIlmThread.a -lrt - # Uncomment the following line to use Mozilla inplace of netscape - # CPPFLAGS +=-DMOZ_NOT_NET # Location of MOZILLA/Netscape header files... export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/ @@ -451,7 +429,7 @@ endif export ID = $(LOGNAME) export NAN_PYTHON ?= $(LCGDIR)/python export NAN_ICONV ?= $(LCGDIR)/iconv - export NAN_PYTHON_VERSION ?= 2.5 + export NAN_PYTHON_VERSION ?= 3.1 export NAN_OPENAL ?= $(LCGDIR)/openal export NAN_JPEG ?= $(LCGDIR)/jpeg export NAN_PNG ?= $(LCGDIR)/png @@ -466,7 +444,6 @@ endif export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/lib25_vs2005/libpython25.a export NAN_FREETYPE ?= $(LCGDIR)/gcc/freetype - export NAN_ODE ?= $(LCGDIR)/gcc/ode export NAN_SDL ?= $(LCGDIR)/gcc/sdl export NAN_OPENEXR ?= $(LCGDIR)/gcc/openexr export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR @@ -477,7 +454,6 @@ endif export NAN_PYTHON_BINARY ?= python export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python23.lib export NAN_FREETYPE ?= $(LCGDIR)/freetype - export NAN_ODE ?= $(LCGDIR)/ode export NAN_SDL ?= $(LCGDIR)/sdl export NAN_OPENEXR ?= $(LCGDIR)/openexr export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/IlmImf -I$(NAN_OPENEXR)/include/Imath -I$(NAN_OPENEXR)/include/Iex @@ -486,8 +462,7 @@ endif export NAN_SDLCFLAGS ?= -I$(NAN_SDL)/include export NAN_WINTAB ?= $(LCGDIR)/wintab - # Uncomment the following line to use Mozilla inplace of netscape - # CPPFLAGS +=-DMOZ_NOT_NET + # Location of MOZILLA/Netscape header files... export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/ @@ -507,7 +482,7 @@ endif else # Platform not listed above export NAN_PYTHON ?= $(LCGDIR)/python - export NAN_PYTHON_VERSION ?= 2.3 + export NAN_PYTHON_VERSION ?= 3.1 export NAN_PYTHON_BINARY ?= python export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a @@ -516,7 +491,6 @@ endif export NAN_PNG ?= $(LCGDIR)/png export NAN_TIFF ?= $(LCGDIR)/tiff export NAN_SDL ?= $(LCGDIR)/sdl - export NAN_ODE ?= $(LCGDIR)/ode export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay export NAN_MESA ?= /usr/src/Mesa-3.1 export NAN_ZLIB ?= $(LCGDIR)/zlib @@ -527,8 +501,6 @@ endif export NAN_SDLLIBS ?= $(shell sdl-config --libs) export NAN_SDLCFLAGS ?= $(shell sdl-config --cflags) - # Uncomment the following line to use Mozilla inplace of netscape - # CPPFLAGS +=-DMOZ_NOT_NET # Location of MOZILLA/Netscape header files... export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/ diff --git a/source/nan_link.mk b/source/nan_link.mk index 63c9a578498..4e32366956a 100644 --- a/source/nan_link.mk +++ b/source/nan_link.mk @@ -97,7 +97,6 @@ ifeq ($(OS),linux) COMMENT = "MESA 3.1" LLIBS = -L$(NAN_MESA)/lib -L/usr/X11R6/lib -lXmu -lXext -lX11 -lXi LLIBS += -lutil -lc -lm -ldl -lpthread -# LLIBS += -L$(NAN_ODE)/lib -lode LOPTS = -export-dynamic DADD = -lGL -lGLU SADD = $(NAN_MESA)/lib/libGL.a $(NAN_MESA)/lib/libGLU.a diff --git a/tools/Blender.py b/tools/Blender.py index a32086912f0..d45a9749a7d 100644 --- a/tools/Blender.py +++ b/tools/Blender.py @@ -161,11 +161,11 @@ def setup_syslibs(lenv): syslibs += Split(lenv['BF_FREETYPE_LIB']) if lenv['WITH_BF_PYTHON'] and not lenv['WITH_BF_STATICPYTHON']: - #if not lenv['BF_NO_PYDEBUG'] and lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc'): - # print "using debug py" - # syslibs.append(lenv['BF_PYTHON_LIB']+'_d') - #else: - #print "not using debug py" + if not lenv['BF_NO_PYDEBUG'] and lenv['BF_DEBUG'] and lenv['OURPLATFORM'] in ('win32-vc'): + print "using debug py" + syslibs.append(lenv['BF_PYTHON_LIB']+'_d') + else: + print "not using debug py" syslibs.append(lenv['BF_PYTHON_LIB']) if lenv['WITH_BF_INTERNATIONAL']: syslibs += Split(lenv['BF_GETTEXT_LIB']) @@ -326,6 +326,7 @@ def AppIt(target=None, source=None, env=None): a = '%s' % (target[0]) builddir, b = os.path.split(a) + libdir = env['LCGDIR'][1:] bldroot = env.Dir('.').abspath binary = env['BINARYKIND'] @@ -358,10 +359,16 @@ def AppIt(target=None, source=None, env=None): commands.getoutput(cmd) cmd = 'cp %s/bin/.blender/.Blanguages %s/%s.app/Contents/Resources/'%(bldroot,builddir,binary) commands.getoutput(cmd) + cmd = 'mkdir %s/%s.app/Contents/MacOS/.blender/python/'%(builddir,binary) + commands.getoutput(cmd) + cmd = 'unzip -q %s/release/python.zip -d %s/%s.app/Contents/MacOS/.blender/python/'%(libdir,builddir,binary) + commands.getoutput(cmd) cmd = 'cp -R %s/release/scripts %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary) commands.getoutput(cmd) cmd = 'cp -R %s/release/ui %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary) commands.getoutput(cmd) + cmd = 'cp -R %s/release/io %s/%s.app/Contents/MacOS/.blender/'%(bldroot,builddir,binary) + commands.getoutput(cmd) cmd = 'chmod +x %s/%s.app/Contents/MacOS/%s'%(builddir,binary, binary) commands.getoutput(cmd) cmd = 'find %s/%s.app -name .svn -prune -exec rm -rf {} \;'%(builddir, binary) |